From 4ad77f38864d03bd5c7c8c8bd66b5fe705b9ae28 Mon Sep 17 00:00:00 2001 From: Laith Al-Saadoon <9553966+theagenticguy@users.noreply.github.com> Date: Mon, 27 Apr 2026 10:40:46 -0700 Subject: [PATCH] docs(site): add Astro Starlight docs site + GitHub Pages deploy MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds `packages/docs/` as a private workspace package (Astro 6 + @astrojs/starlight 0.38) with 34 authored pages covering user guide, MCP tool reference, contributing guide, and architecture notes. Deployment is wired to GitHub Pages via `.github/workflows/pages.yml` and the deployed site is https://theagenticguy.github.io/opencodehub/. Changes: - `packages/docs/` — Astro Starlight scaffold + 34 content pages - `.github/workflows/pages.yml` — build + deploy-pages, mise-action, correct Pages permissions, concurrency group `pages` - `mise.toml` — `docs:dev`, `docs:build`, `docs:preview` tasks - `biome.json` — exclude `.astro`/`.mdx`/content tree - `.gitignore` — `packages/docs/.astro/` - `README.md` — Docs badge + Documentation section - `pnpm-lock.yaml` — astro + starlight + transitive deps - `.erpaval/` — session packets + 2 durable lessons --- .erpaval/INDEX.md | 2 + .../starlight-in-pnpm-monorepo.md | 154 + .../docs-site-ground-truth-yaml.md | 71 + .github/workflows/pages.yml | 40 + .gitignore | 3 + README.md | 13 + biome.json | 5 +- mise.toml | 21 + packages/docs/README.md | 46 + packages/docs/astro.config.mjs | 60 + packages/docs/package.json | 24 + packages/docs/public/.nojekyll | 0 packages/docs/public/favicon.svg | 6 + packages/docs/src/assets/logo.svg | 8 + packages/docs/src/content.config.ts | 7 + .../src/content/docs/architecture/adrs.md | 125 + .../content/docs/architecture/determinism.md | 125 + .../content/docs/architecture/monorepo-map.md | 78 + .../src/content/docs/architecture/overview.md | 126 + .../content/docs/architecture/supply-chain.md | 141 + .../adding-a-language-provider.md | 169 + .../docs/contributing/commit-conventions.md | 128 + .../src/content/docs/contributing/dev-loop.md | 141 + .../content/docs/contributing/ip-hygiene.md | 155 + .../src/content/docs/contributing/overview.md | 102 + .../docs/contributing/release-process.md | 128 + .../src/content/docs/contributing/testing.md | 150 + .../src/content/docs/guides/ci-integration.md | 86 + .../content/docs/guides/cross-repo-groups.md | 74 + .../content/docs/guides/indexing-a-repo.md | 101 + .../content/docs/guides/troubleshooting.md | 88 + .../docs/guides/using-with-claude-code.md | 76 + .../content/docs/guides/using-with-codex.md | 51 + .../content/docs/guides/using-with-cursor.md | 63 + .../docs/guides/using-with-opencode.md | 57 + .../docs/guides/using-with-windsurf.md | 57 + packages/docs/src/content/docs/index.mdx | 92 + .../docs/src/content/docs/mcp/overview.md | 76 + packages/docs/src/content/docs/mcp/prompts.md | 20 + .../docs/src/content/docs/mcp/resources.md | 24 + packages/docs/src/content/docs/mcp/tools.md | 88 + .../docs/src/content/docs/reference/cli.md | 367 ++ .../content/docs/reference/configuration.md | 60 + .../src/content/docs/reference/error-codes.md | 50 + .../src/content/docs/reference/languages.md | 72 + .../content/docs/start-here/first-query.md | 97 + .../src/content/docs/start-here/install.md | 85 + .../content/docs/start-here/quick-start.md | 84 + .../docs/start-here/what-is-opencodehub.md | 62 + packages/docs/src/styles/custom.css | 11 + packages/docs/tsconfig.json | 5 + pnpm-lock.yaml | 3624 ++++++++++++++++- 52 files changed, 7489 insertions(+), 9 deletions(-) create mode 100644 .erpaval/solutions/architecture-patterns/starlight-in-pnpm-monorepo.md create mode 100644 .erpaval/solutions/conventions/docs-site-ground-truth-yaml.md create mode 100644 .github/workflows/pages.yml create mode 100644 packages/docs/README.md create mode 100644 packages/docs/astro.config.mjs create mode 100644 packages/docs/package.json create mode 100644 packages/docs/public/.nojekyll create mode 100644 packages/docs/public/favicon.svg create mode 100644 packages/docs/src/assets/logo.svg create mode 100644 packages/docs/src/content.config.ts create mode 100644 packages/docs/src/content/docs/architecture/adrs.md create mode 100644 packages/docs/src/content/docs/architecture/determinism.md create mode 100644 packages/docs/src/content/docs/architecture/monorepo-map.md create mode 100644 packages/docs/src/content/docs/architecture/overview.md create mode 100644 packages/docs/src/content/docs/architecture/supply-chain.md create mode 100644 packages/docs/src/content/docs/contributing/adding-a-language-provider.md create mode 100644 packages/docs/src/content/docs/contributing/commit-conventions.md create mode 100644 packages/docs/src/content/docs/contributing/dev-loop.md create mode 100644 packages/docs/src/content/docs/contributing/ip-hygiene.md create mode 100644 packages/docs/src/content/docs/contributing/overview.md create mode 100644 packages/docs/src/content/docs/contributing/release-process.md create mode 100644 packages/docs/src/content/docs/contributing/testing.md create mode 100644 packages/docs/src/content/docs/guides/ci-integration.md create mode 100644 packages/docs/src/content/docs/guides/cross-repo-groups.md create mode 100644 packages/docs/src/content/docs/guides/indexing-a-repo.md create mode 100644 packages/docs/src/content/docs/guides/troubleshooting.md create mode 100644 packages/docs/src/content/docs/guides/using-with-claude-code.md create mode 100644 packages/docs/src/content/docs/guides/using-with-codex.md create mode 100644 packages/docs/src/content/docs/guides/using-with-cursor.md create mode 100644 packages/docs/src/content/docs/guides/using-with-opencode.md create mode 100644 packages/docs/src/content/docs/guides/using-with-windsurf.md create mode 100644 packages/docs/src/content/docs/index.mdx create mode 100644 packages/docs/src/content/docs/mcp/overview.md create mode 100644 packages/docs/src/content/docs/mcp/prompts.md create mode 100644 packages/docs/src/content/docs/mcp/resources.md create mode 100644 packages/docs/src/content/docs/mcp/tools.md create mode 100644 packages/docs/src/content/docs/reference/cli.md create mode 100644 packages/docs/src/content/docs/reference/configuration.md create mode 100644 packages/docs/src/content/docs/reference/error-codes.md create mode 100644 packages/docs/src/content/docs/reference/languages.md create mode 100644 packages/docs/src/content/docs/start-here/first-query.md create mode 100644 packages/docs/src/content/docs/start-here/install.md create mode 100644 packages/docs/src/content/docs/start-here/quick-start.md create mode 100644 packages/docs/src/content/docs/start-here/what-is-opencodehub.md create mode 100644 packages/docs/src/styles/custom.css create mode 100644 packages/docs/tsconfig.json diff --git a/.erpaval/INDEX.md b/.erpaval/INDEX.md index b09ae944..6be59228 100644 --- a/.erpaval/INDEX.md +++ b/.erpaval/INDEX.md @@ -7,7 +7,9 @@ development sessions. Solutions are reusable; specs are per-feature. - [SCIP replaces LSP for code-graph oracle edges](solutions/architecture-patterns/scip-replaces-lsp.md) — one-shot indexers beat stateful LSP clients for compiler-grade graph edges. - [Repomix --compress is output-side only](solutions/architecture-patterns/repomix-is-output-side.md) — don't substitute it for a tree-sitter chunker; use it for repo snapshots. +- [Starlight in a pnpm monorepo — minimal scaffold + GH Pages](solutions/architecture-patterns/starlight-in-pnpm-monorepo.md) — 9 files + 1 workflow give you a buildable docs site; gotchas captured. - [Hand-roll a minimal protobuf reader for fixed schemas](solutions/conventions/scip-protobuf-hand-rolled-reader.md) — ~130 LOC beats pulling in buf+codegen when the schema is small and stable. +- [Seed docs-authoring subagents with a single ground-truth YAML](solutions/conventions/docs-site-ground-truth-yaml.md) — parallel writers agree when you tell them where truth lives. ## Specs diff --git a/.erpaval/solutions/architecture-patterns/starlight-in-pnpm-monorepo.md b/.erpaval/solutions/architecture-patterns/starlight-in-pnpm-monorepo.md new file mode 100644 index 00000000..149ed17e --- /dev/null +++ b/.erpaval/solutions/architecture-patterns/starlight-in-pnpm-monorepo.md @@ -0,0 +1,154 @@ +--- +title: Starlight in a pnpm monorepo — minimal scaffold + GH Pages +tags: [astro, starlight, docs, pnpm, github-pages, monorepo] +first_applied: 2026-04-27 +repos: [open-code-hub] +--- + +## The pattern + +Add a Starlight docs site to a pnpm workspace as `packages/docs/` +without running the interactive `pnpm create astro` scaffolder. Nine +files give you a buildable site; one GitHub Actions workflow deploys +it to Pages. Total setup is ~5 minutes of file authoring plus one +`pnpm install` that adds astro + @astrojs/starlight to the root +lockfile. + +## Required files + +``` +packages/docs/ +├── package.json # private, name @/docs, engines.node ">=22.12.0" +├── astro.config.mjs # defineConfig + starlight integration with site+base +├── tsconfig.json # extends "astro/tsconfigs/strict" +├── public/ +│ ├── favicon.svg +│ └── .nojekyll # empty — tells GH Pages "don't run Jekyll" +└── src/ + ├── content.config.ts # defineCollection for 'docs' with docsLoader+docsSchema + ├── assets/logo.svg + ├── styles/custom.css # optional; referenced via customCss in astro.config + └── content/docs/ + ├── index.mdx # landing page — template: splash + hero + └── /*.md # rest of content +``` + +## What you need in `astro.config.mjs` + +```js +import { defineConfig } from "astro/config"; +import starlight from "@astrojs/starlight"; + +export default defineConfig({ + site: "https://.github.io", + base: "/", // leading slash, NO trailing slash + integrations: [ + starlight({ + title: "...", + social: [{ icon: "github", label: "GitHub", href: "https://..." }], + editLink: { baseUrl: "https://github.com///edit/main/packages/docs/" }, + sidebar: [{ label: "...", autogenerate: { directory: "..." } }], + }), + ], +}); +``` + +Critical: `site` has NO trailing slash, `base` starts with `/` and +has NO trailing slash. Pagefind, sitemaps, and canonical URLs all +derive from these. + +## What you need in `src/content.config.ts` + +Starlight 0.32+ uses `src/content.config.ts` — NOT the older +`src/content/config.ts` path that lots of tutorials still show. + +```ts +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() }), +}; +``` + +Without `docsLoader()` + `docsSchema()`, pages fail to build. + +## GitHub Pages workflow + +Two-job: build (upload pages artifact) then deploy (actions/deploy-pages). +Match the rest of your CI — if everything else uses `jdx/mise-action`, +don't switch to `withastro/action` just for this job. + +```yaml +name: Pages +on: + push: + branches: [main] + paths: + - 'packages/docs/**' + - '.github/workflows/pages.yml' + workflow_dispatch: +permissions: + contents: read + pages: write + id-token: write +concurrency: + group: pages + cancel-in-progress: false # NOT true — canceling a mid-deploy leaves Pages in a weird state +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v6 + - uses: jdx/mise-action@v4 + - run: pnpm install --frozen-lockfile --ignore-scripts + - run: pnpm -F /docs build + - uses: actions/upload-pages-artifact@v4 + with: { path: packages/docs/dist } + deploy: + needs: build + runs-on: ubuntu-latest + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + steps: + - id: deployment + uses: actions/deploy-pages@v5 +``` + +`--ignore-scripts` on install is safe here (docs don't need +tree-sitter native builds or other postinstall hooks). + +## Gotchas + +- **Node 22.12.0 minimum** for Astro 6. If your root `package.json` + says `"node": ">=22.0.0"`, tighten `packages/docs/package.json` + locally with its own `engines` block — don't force the whole repo + up just for docs. +- **Biome does not parse `.astro` or `.mdx`.** Add to `biome.json` + ignore list. Biome 2.2+ no longer wants a trailing `/**` on + folder ignores — write `!packages/docs/src/content/docs`, not + `!packages/docs/src/content/docs/**`. +- **Mark the docs package `private: true`.** This excludes it from + the production license allowlist audit, which is useful because + astro deps sometimes pull `caniuse-lite` (CC-BY-4.0) transitively. +- **`.nojekyll` is required** in `public/`. Without it, GitHub Pages + strips `_astro/` and `_pagefind/` directories (underscore-prefixed + paths are Jekyll-hidden by default). +- **Internal links need the base prefix.** Write + `[text](//section/page/)` — plain `/section/page/` + will 404 on Pages. Starlight's sidebar and `` handle + base automatically; only hand-written markdown links need care. +- **Enable Pages in repo settings once** (Settings → Pages → Build and + deployment → Source: GitHub Actions) before the first push. The + workflow silently succeeds-then-404s if Pages isn't enabled. + +## When this pattern is wrong + +- You need multi-version docs or i18n out of the box. Starlight + supports both but the scaffold above is single-version English. +- You need an Algolia DocSearch index. Starlight ships Pagefind by + default — good enough for most sites, no Algolia account needed. +- You need server-side rendering. Starlight is a static site; add + `@astrojs/node` or similar only if you actually need SSR. diff --git a/.erpaval/solutions/conventions/docs-site-ground-truth-yaml.md b/.erpaval/solutions/conventions/docs-site-ground-truth-yaml.md new file mode 100644 index 00000000..b1dcd327 --- /dev/null +++ b/.erpaval/solutions/conventions/docs-site-ground-truth-yaml.md @@ -0,0 +1,71 @@ +--- +title: Seed docs-authoring subagents with a single ground-truth YAML +tags: [erpaval, docs, subagents, explore, grounding] +first_applied: 2026-04-27 +repos: [open-code-hub] +--- + +## The pattern + +When parallelizing doc-authoring across multiple subagents, write +ONE ground-truth YAML from the Explore phase and make every agent +read it first. The YAML is authoritative; the repo's own README / +CONTRIBUTING may be stale. Tell the agents that explicitly. + +## Why it works + +Subagents start with empty context. Absent a pointer, they will +search the codebase and often surface stale prose. In this repo, +three separate numbers exist for "MCP tool count" (README=27, +server.ts=28, smoke-mcp.sh=19), and three separate license +allowlists (mise.toml, ci.yml, acceptance.sh). Every agent that +uses the README as ground truth will write "27 tools". Every agent +that reads explore.yaml (which captured the server.ts live count) +will write "28 tools" consistently. + +## Recipe + +1. **Explore phase** writes `explore.yaml` with a `top_gotchas` + section at the top that calls out source-of-truth conflicts + before any other content. +2. **Each Act subagent prompt** opens with: + > Ground truth: `.erpaval/sessions//explore.yaml`. + > If the repo's README disagrees, explore.yaml wins. +3. **Non-negotiable facts section** in the subagent prompt repeats + the 4-6 things that MUST be right (canonical CLI name, counts, + versions, banned strings). Agents skim long prompts; repeated + facts survive skimming. +4. **Banned-strings list** goes in every Act prompt. The repo's + `scripts/check-banned-strings.sh` will reject the whole PR if + any agent leaks a banned literal. Cheap insurance. + +## Example frontmatter for a writing subagent + +```text +## Non-negotiable facts + +- CLI binary: `codehub` (NOT opencodehub). +- MCP tool count: 28 (README says 27 — stale. server.ts is authoritative). +- License allowlist: Apache-2.0;MIT;BSD-2-Clause;... +- Node 22, pnpm 10.33.2. + +## Banned strings (hard CI fail) + +Never write: . +``` + +Three multi-agent runs in this session all produced consistent +"28 tools" prose without a single correction round. Without the +YAML+prompt-frontmatter pattern, the first two got it wrong on +their first attempt in prior sessions. + +## When this pattern is wrong + +- The task is small enough for one agent. Don't parallelize + three-page docs. +- The repo has NO stale artifacts. Then subagents reading the + README directly is fine. +- The ground truth is rapidly changing during the session (e.g. + you're editing server.ts and documenting it in the same turn). + Regenerate explore.yaml between rounds or tell agents to re-read + the source. diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml new file mode 100644 index 00000000..27574eac --- /dev/null +++ b/.github/workflows/pages.yml @@ -0,0 +1,40 @@ +name: Pages + +on: + push: + branches: [main] + paths: + - "packages/docs/**" + - ".github/workflows/pages.yml" + workflow_dispatch: + +permissions: + contents: read + pages: write + id-token: write + +concurrency: + group: pages + cancel-in-progress: false + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v6 + - uses: jdx/mise-action@v4 + - run: pnpm install --frozen-lockfile --ignore-scripts + - run: pnpm -F @opencodehub/docs build + - uses: actions/upload-pages-artifact@v4 + with: + path: packages/docs/dist + + deploy: + needs: build + runs-on: ubuntu-latest + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + steps: + - id: deployment + uses: actions/deploy-pages@v5 diff --git a/.gitignore b/.gitignore index 4b0ab1bd..33507abc 100644 --- a/.gitignore +++ b/.gitignore @@ -35,3 +35,6 @@ examples/fixtures/**/.codehub/ .claude/settings.local.json .claude/worktrees/ .handoff/ + +# Astro build cache +packages/docs/.astro/ diff --git a/README.md b/README.md index 4c9d7310..b8e61b09 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ # OpenCodeHub [![CI](https://github.com/theagenticguy/opencodehub/actions/workflows/ci.yml/badge.svg)](https://github.com/theagenticguy/opencodehub/actions/workflows/ci.yml) +[![Docs](https://img.shields.io/badge/Docs-Starlight-6ee7b7)](https://theagenticguy.github.io/opencodehub/) [![CodeQL](https://github.com/theagenticguy/opencodehub/actions/workflows/codeql.yml/badge.svg)](https://github.com/theagenticguy/opencodehub/actions/workflows/codeql.yml) [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/theagenticguy/opencodehub/badge)](https://securityscorecards.dev/viewer/?uri=github.com/theagenticguy/opencodehub) [![License: Apache 2.0](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](./LICENSE) @@ -135,6 +136,18 @@ commit log and summarised in each release's generated CHANGELOG. - **CI gates**: license allowlist, banned-strings grep, OSV vulnerability scan, CodeQL SAST, OpenSSF Scorecard - **Zero open CVEs** on the lockfile at release time +## Documentation + +Full user guide, MCP tool reference, and contributor documentation +are published at **https://theagenticguy.github.io/opencodehub/**. + +Prefer to read locally: + +```bash +mise run docs:dev +# http://localhost:4321/opencodehub +``` + ## Contributing See [`CONTRIBUTING.md`](./CONTRIBUTING.md). Issues and discussions welcome; diff --git a/biome.json b/biome.json index 82fed94e..577d43a7 100644 --- a/biome.json +++ b/biome.json @@ -6,7 +6,10 @@ "packages/**/src/**", "packages/**/test/**", "scripts/**/*.{js,mjs,ts}", - "!packages/**/corpus/repos" + "!packages/**/corpus/repos", + "!packages/docs/src/**/*.astro", + "!packages/docs/src/**/*.mdx", + "!packages/docs/src/content/docs" ], "ignoreUnknown": true }, diff --git a/mise.toml b/mise.toml index e15b6b82..05013a55 100644 --- a/mise.toml +++ b/mise.toml @@ -217,3 +217,24 @@ run = "node packages/cli/dist/index.js status" description = "Start the codehub MCP server (stdio)" depends = ["build:cli"] run = "node packages/cli/dist/index.js mcp" + +# --------------------------------------------------------------------------- +# Docs site (Astro + Starlight) +# --------------------------------------------------------------------------- + +[tasks."docs:dev"] +description = "Run the Starlight docs site in dev mode (http://localhost:4321/opencodehub)" +depends = ["install"] +run = "pnpm -F @opencodehub/docs dev" + +[tasks."docs:build"] +description = "Build the Starlight docs site (writes to packages/docs/dist)" +depends = ["install"] +run = "pnpm -F @opencodehub/docs build" +sources = ["packages/docs/src/**", "packages/docs/astro.config.mjs", "packages/docs/package.json"] +outputs = ["packages/docs/dist/**"] + +[tasks."docs:preview"] +description = "Preview the built docs locally" +depends = ["docs:build"] +run = "pnpm -F @opencodehub/docs preview" diff --git a/packages/docs/README.md b/packages/docs/README.md new file mode 100644 index 00000000..e060de94 --- /dev/null +++ b/packages/docs/README.md @@ -0,0 +1,46 @@ +# @opencodehub/docs + +Astro + Starlight documentation site for OpenCodeHub. Deployed to +GitHub Pages at https://theagenticguy.github.io/opencodehub/. + +## Local development + +```bash +pnpm install +pnpm -F @opencodehub/docs dev # http://localhost:4321/opencodehub +pnpm -F @opencodehub/docs build # writes to packages/docs/dist +pnpm -F @opencodehub/docs preview # serves dist/ locally +``` + +Prefer the mise tasks from the repo root: + +```bash +mise run docs:dev +mise run docs:build +mise run docs:preview +``` + +## Authoring + +Pages live under `src/content/docs/`. Starlight picks up any +`.md` or `.mdx` file automatically; the sidebar auto-generates +per top-level directory. + +Frontmatter fields we use: + +```yaml +--- +title: Page title +description: One-sentence SEO/summary +sidebar: + order: 1 # lower first; ties break alphabetically + label: Short # optional override +--- +``` + +## Deploy + +`.github/workflows/pages.yml` runs on pushes to `main` that touch +`packages/docs/**` or the workflow itself. It builds with +`withastro/action@v6` pinned to Node 22 and deploys with +`actions/deploy-pages@v5`. diff --git a/packages/docs/astro.config.mjs b/packages/docs/astro.config.mjs new file mode 100644 index 00000000..c09a77b6 --- /dev/null +++ b/packages/docs/astro.config.mjs @@ -0,0 +1,60 @@ +import { defineConfig } from "astro/config"; +import starlight from "@astrojs/starlight"; + +// https://astro.build/config +export default defineConfig({ + site: "https://theagenticguy.github.io", + base: "/opencodehub", + integrations: [ + starlight({ + title: "OpenCodeHub", + description: + "Apache-2.0 code intelligence graph + MCP server for AI coding agents.", + logo: { + src: "./src/assets/logo.svg", + replacesTitle: false, + }, + favicon: "/favicon.svg", + social: [ + { + icon: "github", + label: "GitHub", + href: "https://github.com/theagenticguy/opencodehub", + }, + ], + editLink: { + baseUrl: + "https://github.com/theagenticguy/opencodehub/edit/main/packages/docs/", + }, + lastUpdated: true, + credits: true, + sidebar: [ + { + label: "Start Here", + autogenerate: { directory: "start-here" }, + }, + { + label: "User Guide", + autogenerate: { directory: "guides" }, + }, + { + label: "MCP Server", + autogenerate: { directory: "mcp" }, + }, + { + label: "Reference", + autogenerate: { directory: "reference" }, + }, + { + label: "Contributing", + autogenerate: { directory: "contributing" }, + }, + { + label: "Architecture", + autogenerate: { directory: "architecture" }, + }, + ], + customCss: ["./src/styles/custom.css"], + }), + ], +}); diff --git a/packages/docs/package.json b/packages/docs/package.json new file mode 100644 index 00000000..b680365c --- /dev/null +++ b/packages/docs/package.json @@ -0,0 +1,24 @@ +{ + "name": "@opencodehub/docs", + "version": "0.0.0", + "private": true, + "description": "OpenCodeHub documentation site (Astro + Starlight)", + "license": "Apache-2.0", + "type": "module", + "engines": { + "node": ">=22.12.0" + }, + "scripts": { + "dev": "astro dev", + "start": "astro dev", + "build": "astro build", + "preview": "astro preview", + "check": "astro check", + "clean": "rm -rf dist .astro" + }, + "dependencies": { + "@astrojs/starlight": "^0.38.4", + "astro": "^6.1.9", + "sharp": "^0.34.1" + } +} diff --git a/packages/docs/public/.nojekyll b/packages/docs/public/.nojekyll new file mode 100644 index 00000000..e69de29b diff --git a/packages/docs/public/favicon.svg b/packages/docs/public/favicon.svg new file mode 100644 index 00000000..6561943e --- /dev/null +++ b/packages/docs/public/favicon.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/packages/docs/src/assets/logo.svg b/packages/docs/src/assets/logo.svg new file mode 100644 index 00000000..3ad310ad --- /dev/null +++ b/packages/docs/src/assets/logo.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/packages/docs/src/content.config.ts b/packages/docs/src/content.config.ts new file mode 100644 index 00000000..7fbcf2c3 --- /dev/null +++ b/packages/docs/src/content.config.ts @@ -0,0 +1,7 @@ +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/packages/docs/src/content/docs/architecture/adrs.md b/packages/docs/src/content/docs/architecture/adrs.md new file mode 100644 index 00000000..b50ce304 --- /dev/null +++ b/packages/docs/src/content/docs/architecture/adrs.md @@ -0,0 +1,125 @@ +--- +title: Architecture decision records +description: Index of OpenCodeHub ADRs — every accepted and superseded decision. +sidebar: + order: 30 +--- + +Every load-bearing architectural choice in OpenCodeHub is recorded as +an ADR under `docs/adr/` in the repo. This page is the index. Click +through to the source ADR for the full context, candidates +considered, and consequences. + +## Accepted + +### ADR 0001 — Storage backend selection + +**Status:** Accepted (2026-04-18; supersedes prior SQLite recommendation). + +**Decision:** DuckDB via `@duckdb/node-api`, with the `hnsw_acorn` +community extension for filter-aware vector search, the official `fts` +extension for BM25, and recursive CTEs with `USING KEY` for +memory-efficient graph traversal. All three choices are MIT. + +SQLite + `sqlite-vec` was considered and rejected because FTS5 has no +filtered-HNSW story and `sqlite-vec` HNSW was still early when this +ADR was written. LanceDB was considered and kept as a future alternate +adapter behind the `IGraphStore` interface. + +[Read ADR 0001](https://github.com/theagenticguy/opencodehub/blob/main/docs/adr/0001-storage-backend.md) + +### ADR 0002 — Rust core spike deferred to v2.1+ + +**Status:** Accepted (2026-04-20). + +**Decision:** v2.0 ships pure TypeScript. A Rust NAPI-RS native core +is deferred to v2.1+ because the measured p95 single-file incremental +edit on the 100-file fixture (~195-250 ms) is well under the 1 s hard +gate, and the extrapolated cold full analyze on a 100k-LOC fixture +(~3-5 s) is well under the 30 s trigger from the PRD. + +Reopens if cold analyze on a user-reported 500k+ LOC repo exceeds 4 +minutes, p95 incremental edit on 10k+ files exceeds 30 s, or a +`--cpu-prof` run shows a single function burning >40% of wall clock. + +[Read ADR 0002](https://github.com/theagenticguy/opencodehub/blob/main/docs/adr/0002-rust-core-deferred.md) + +### ADR 0004 — Hierarchical embeddings with filter-aware HNSW + +**Status:** Accepted (shipped as P03 in v1.1). + +**Decision:** One `embeddings` table with a `granularity` discriminator +column (`symbol | file | community`) and a single HNSW index. +Filter-aware traversal via `hnsw_acorn` keeps the one index serving +every tier — the ACORN-1 algorithm pushes the granularity predicate +into the graph walk. + +ColBERT / token-level embeddings were rejected (10–30× storage, +bespoke index). RAPTOR tree-traversal was rejected — collapsed-tree + +filter-aware HNSW matches the recall at lower latency. + +[Read ADR 0004](https://github.com/theagenticguy/opencodehub/blob/main/docs/adr/0004-hierarchical-embeddings.md) + +### ADR 0005 — SCIP replaces LSP; repomix is output-side only + +**Status:** Accepted (2026-04-26). + +**Decision:** The four per-language LSP phases and `@opencodehub/lsp-oracle` +are deleted and replaced with a single `scip-index` phase backed by +`@opencodehub/scip-ingest`. Oracle-edge provenance switches from +per-LSP to `scip:@`. The old LSP-specific reason +suffix `+lsp-unconfirmed` is renamed to `+scip-unconfirmed` (the old +constant is aliased for one release). + +This cuts ~10.6k LOC of LSP client and per-language phases, removes +the pyright / typescript-language-server binary dependency from npm +install, and reshapes indexing from stateful per-symbol JSON-RPC to +one-shot protobuf ingestion. + +[Read ADR 0005](https://github.com/theagenticguy/opencodehub/blob/main/docs/adr/0005-scip-replaces-lsp.md) + +### ADR 0006 — SCIP indexer CI pins + +**Status:** Accepted (2026-04-27). + +**Decision:** Pin table for the per-language SCIP indexers the gym +installs: + +| Language | Indexer | Version | Install channel | +|------------|-----------------|------------------|-----------------------------------------| +| TypeScript | scip-typescript | 0.4.0 | `npm install -g @sourcegraph/scip-typescript` | +| Python | scip-python | 0.6.6 | `npm install -g @sourcegraph/scip-python` | +| Go | scip-go | v0.2.3 | `go install github.com/scip-code/scip-go/cmd/scip-go` | +| Rust | rust-analyzer | stable component | `rustup component add rust-analyzer` | +| Java | scip-java | 0.12.3 | `coursier install scip-java` | + +Versions are mirrored in `.github/workflows/gym.yml` and +`packages/gym/baselines/performance.json` so the regression harness +has a single source of truth. The ADR also explains why `scip-go` +resolves to the `scip-code` fork rather than upstream `sourcegraph`. + +[Read ADR 0006](https://github.com/theagenticguy/opencodehub/blob/main/docs/adr/0006-scip-indexer-pins.md) + +## Superseded + +### ADR 0003 — CI toolchain pins (gopls ↔ Go, pnpm build-script allowlist) + +**Status:** Superseded by ADR 0006 (2026-04-27). + +The gopls pin matrix is historical — OpenCodeHub no longer runs +long-running language servers; code-graph oracle edges come from SCIP +indexers. See ADR 0005 for the migration and ADR 0006 for the current +pin table. The pnpm lifecycle-script guidance remains in force and is +reiterated in ADR 0006. + +[Read ADR 0003](https://github.com/theagenticguy/opencodehub/blob/main/docs/adr/0003-ci-toolchain-pins.md) + +## Adding an ADR + +New architectural decisions go under `docs/adr/NNNN-slug.md` using the +next numeric prefix. Keep the headings: Status, Date, Context, +Decision, Consequences, plus any ADR-specific sections. + +If a new decision supersedes an older one, update the superseded +ADR's status line with a forward link and add a reverse link from the +new ADR's context section. diff --git a/packages/docs/src/content/docs/architecture/determinism.md b/packages/docs/src/content/docs/architecture/determinism.md new file mode 100644 index 00000000..08578f79 --- /dev/null +++ b/packages/docs/src/content/docs/architecture/determinism.md @@ -0,0 +1,125 @@ +--- +title: Determinism contract +description: Identical inputs produce byte-identical graph hash. Why it matters and how we test it. +sidebar: + order: 40 +--- + +OpenCodeHub makes one load-bearing promise to agents and humans alike: +**identical inputs produce a byte-identical graph hash**. If you +analyze the same commit twice on the same machine — or on a different +machine with the same toolchain — you get the same `graphHash`. That +is the determinism contract. + +## Why it matters + +Three concrete reasons: + +- **Reproducibility.** An agent that reports a blast radius at + `graphHash=abc123` and a human reviewer who re-runs `codehub + analyze` should see the same graph. If the hash diverges, the + agent's claim is not auditable. +- **Cache-safety.** `codehub status` and CI runners assume that two + analyze runs at the same commit have the same output. Without + determinism, incremental caches would drift silently and staleness + detection would get unreliable. +- **Regression testing.** Every `feat` or `refactor` that touches the + ingestion pipeline has to demonstrate it did not move the hash + unintentionally. Determinism makes that assertion possible in one + line of CI. + +## What "inputs" means + +An input is: + +- Source tree contents at the current commit. +- Toolchain versions (Node 22.x, pnpm 10.33.2, tree-sitter grammars + pinned in `packages/ingestion/package.json`, SCIP indexer versions + pinned in `.github/workflows/gym.yml` per ADR 0006). +- OpenCodeHub version (the monorepo version pinned in + `release-please`). +- Any user-supplied configuration (AGENTS.md overrides, `.codehub/` + config). + +Anything outside that list — wall-clock time, process ID, file-system +inode ordering — must not influence the hash. The ingestion phases +are pure: inputs in, relations out, no ambient state. + +## How we test it + +Acceptance gate 6 is the regression test. It: + +1. Copies a fixture repo into two temp directories. +2. `git init` + commit each (identical tree → identical commit hash). +3. Runs `codehub analyze --force --skip-agents-md` against each, + capturing the printed `graphHash`. +4. Asserts the two hashes are byte-identical. + +If the hashes diverge, the gate fails and the acceptance run exits +non-zero. See `scripts/acceptance.sh` gate 6 for the exact script. + +Two adjacent gates reinforce the contract: + +- **Gate 10 — embeddings determinism.** Runs the same double-analyze + with `--embeddings`. Skipped if model weights are not present + locally. Advisory-only today because embeddings do not yet propagate + into the headline `graphHash`; the gate prints the hashes so a + reviewer can spot drift manually. +- **Gym replay (`mise run gym:replay`).** Bit-exact re-invocation of + the pinned SCIP indexer against the frozen manifest. Catches drift + introduced by an indexer bump before it lands in `main`. + +Full analyze and incremental re-analyze at the same commit must +produce identical hashes (this is asserted explicitly in the +determinism CI gate, not just on a clean tree). That is the "full vs +incremental byte-identical" invariant called out in ADR 0002. + +## The `--offline` contract + +`codehub analyze --offline` is a separate but related guarantee: +**zero sockets opened** during the run. The flag sets +`OCH_WASM_ONLY=1` (which also forces the WASM-only tree-sitter +runtime path) and disables every non-filesystem I/O path in the +pipeline. + +"Zero sockets" is the literal, measurable claim. It is testable by +running under `strace -e connect` or the equivalent on macOS +(`dtruss`); a socket attempt is a bug. + +Why it matters: OpenCodeHub is local-first. Your code never leaves +your machine by default. The `--offline` flag makes that an enforceable +contract for users who need to prove it. + +## Sources of non-determinism we actively guard against + +Ingestion phases are reviewed for the usual suspects: + +- **Set / map iteration order.** All emitted records are sorted by a + stable key before being persisted. Providers that emit + `extractPropertyAccesses` must return records sorted by + `(enclosingSymbolId, propertyName, startLine)` — see the + `LanguageProvider` interface docstring. +- **`Date.now()`, `crypto.randomUUID()`, any `Math.random()`.** + Banned in ingestion code. The graph-hash computation uses content + hashes, never timestamps. +- **File-system walk order.** `readdir` results are sorted by byte + value before dispatch. +- **Parallel worker output ordering.** Worker pools emit into + per-worker buffers that are concatenated in deterministic file order + at join time. + +A fresh contributor reviewing a PR that adds a new phase should ask: +"If I ran this twice on the same commit, would I get the same +bytes?" If the answer is not obviously yes, the phase is wrong. + +## Related + +- [ADR 0001 — Storage backend](https://github.com/theagenticguy/opencodehub/blob/main/docs/adr/0001-storage-backend.md) — + "Deterministic writes given identical INSERT order" is a listed + positive of DuckDB vs. engines with random header UUIDs. +- [ADR 0002 — Rust core deferred](https://github.com/theagenticguy/opencodehub/blob/main/docs/adr/0002-rust-core-deferred.md) — + calls out the "full vs incremental `graphHash` byte-identical" + determinism CI gate explicitly. +- [Contributing overview — Tenets](/opencodehub/contributing/overview/#tenets) — + "Determinism is non-negotiable" is the first tenet in `CONTRIBUTING.md`. +- `scripts/acceptance.sh` gate 6 — the runtime regression test. diff --git a/packages/docs/src/content/docs/architecture/monorepo-map.md b/packages/docs/src/content/docs/architecture/monorepo-map.md new file mode 100644 index 00000000..8372c1f4 --- /dev/null +++ b/packages/docs/src/content/docs/architecture/monorepo-map.md @@ -0,0 +1,78 @@ +--- +title: Monorepo map +description: Every OpenCodeHub workspace package, its folder, purpose, versioning, and key exports. +sidebar: + order: 20 +--- + +OpenCodeHub is a pnpm workspace under `packages/*`. Thirteen TypeScript +packages plus one Python harness. Ten of the TypeScript packages are +versioned independently by release-please; three are internal +harnesses that ride along with the monorepo version. The Python eval +lives outside the pnpm package graph entirely. + +## All packages + +| Package | Folder | Versioned? | Purpose | Key surface | +|-----------------------------|------------------------|------------|-----------------------------------------------------------|------------------------------------------------| +| `@opencodehub/analysis` | `packages/analysis` | yes | `impact`, `rename`, `detect_changes`, staleness logic | `computeImpact()`, `computeRename()` | +| `@opencodehub/cli` | `packages/cli` | yes | User-facing CLI | `codehub` bin | +| `@opencodehub/core-types` | `packages/core-types` | yes | Shared graph schema, `LanguageId`, determinism primitives | `LanguageId`, `SCIP_PROVENANCE_PREFIXES` | +| `@opencodehub/embedder` | `packages/embedder` | yes | Deterministic ONNX embedder (gte-modernbert-base) | `embed()`, `embedInt8()` | +| `@opencodehub/ingestion` | `packages/ingestion` | yes | 12-phase analyze pipeline, tree-sitter, language providers | `LanguageProvider` registry, pipeline phases | +| `@opencodehub/mcp` | `packages/mcp` | yes | stdio MCP server, tools, resources, prompts | `buildServer()` | +| `@opencodehub/sarif` | `packages/sarif` | yes | SARIF 2.1.0 Zod schemas, merge + enrich | `SarifLogSchema`, `mergeSarif()` | +| `@opencodehub/scanners` | `packages/scanners` | yes | Priority-1 scanner wrappers (semgrep, osv, etc.) | Subprocess runners | +| `@opencodehub/search` | `packages/search` | yes | Hybrid BM25 + RRF search | `hybridSearch()` | +| `@opencodehub/storage` | `packages/storage` | yes | DuckDB graph store (`@duckdb/node-api` + `hnsw_acorn` + `fts`) | `IGraphStore` | +| `@opencodehub/gym` | `packages/gym` | no | SCIP-indexer differential gym + regression gates | `codehub-gym` bin | +| `@opencodehub/scip-ingest` | `packages/scip-ingest` | no | `.scip` protobuf reader + per-language indexer runners | `readScipFile()`, per-language runners | +| `@opencodehub/summarizer` | `packages/summarizer` | no | Structured code-symbol summarizer (Bedrock Converse + Zod) | `summarizeSymbol()` | +| `opencodehub-eval` | `packages/eval` | no (Python) | Parity + regression eval harness (49 cases) | `pytest` suite driven by MCP stdio | + +## Versioning + +Ten packages get their own tag and changelog via `release-please`. They +are the public surface — anyone who takes a `peerDependency` on +OpenCodeHub gets versioned guarantees on these. + +The four unversioned packages are harnesses or internal-only +dependencies with no external consumer at v1.0. They move in lockstep +with the monorepo but do not publish independent tags. See +[Release process](/opencodehub/contributing/release-process/) for the +full table. + +## The CLI is the only bin + +The only packaged executable is `codehub` under `@opencodehub/cli`. +`@opencodehub/gym` exposes a `codehub-gym` bin for internal harness +use; it is not distributed separately. + +Every other package is a library imported by `cli`, `mcp`, or the +ingestion pipeline. + +## Dependency direction + +Think of it as two layers: + +- **Leaf libraries.** `core-types`, `sarif`, `embedder`, `storage`, + `search`, `summarizer`, `scip-ingest`. +- **Orchestrators.** `ingestion`, `analysis`, `scanners`, `mcp`, + `gym`, `cli`. + +Orchestrators import leaves; leaves do not import orchestrators. The +TypeScript project-references graph enforces this via +`tsc --noEmit`. + +## Python eval lives outside the graph + +`packages/eval` is a uv-managed Python project (Python 3.12, pytest, +anyio, mcp). It sits in the monorepo for colocation but is not in the +pnpm workspace. Run it with `mise run test:eval`; see +[Testing](/opencodehub/contributing/testing/#python-eval-harness). + +## Related files + +- `pnpm-workspace.yaml` — `packages/*` glob. +- `.release-please-config.json` — which packages are versioned. +- `packages/*/package.json` — per-package `name` and `description`. diff --git a/packages/docs/src/content/docs/architecture/overview.md b/packages/docs/src/content/docs/architecture/overview.md new file mode 100644 index 00000000..f868f112 --- /dev/null +++ b/packages/docs/src/content/docs/architecture/overview.md @@ -0,0 +1,126 @@ +--- +title: Architecture overview +description: The top-down pipeline — parse, resolve, augment, index, cluster, serve. +sidebar: + order: 10 +--- + +OpenCodeHub turns a source tree into a typed graph that agents can +query over MCP. The pipeline has six phases, and each phase has one +job. + +## The pipeline + +### 1. Input — source tree to parse captures + +The CLI walks the repo, dispatches each file to its language's +tree-sitter grammar via `@opencodehub/ingestion`, and emits a unified +`ParseCapture` stream. Fifteen languages are registered today: +TypeScript, TSX, JavaScript, Python, Go, Rust, Java, C#, C, C++, Ruby, +Kotlin, Swift, PHP, Dart. The registry is compile-time exhaustive via +a `satisfies Record` clause — omitting a +language becomes a build-time error. + +### 2. Resolve — captures to typed relations + +Each language provider emits definitions, calls, imports, heritage, +and optional property-access records. A per-language resolver — C3 +linearization for Python, first-wins for TypeScript/JavaScript/Rust, +single-inheritance for Java/C#/Kotlin, no-op for Go — turns call +captures into typed `CALLS`, `EXTENDS`, `IMPLEMENTS`, `FETCHES`, and +`ACCESSES` relations. + +Import semantics drive how the resolver chases cross-module names: +`named` (most languages), `namespace` (Python), or `package-wildcard` +(Go). See +[Adding a language provider](/opencodehub/contributing/adding-a-language-provider/) +for the full taxonomy. + +### 3. Augment — SCIP indexers upgrade heuristic edges + +Five languages (TypeScript, Python, Go, Rust, Java) have a SCIP +indexer pinned in `.github/workflows/gym.yml`. For those, the +`scip-index` phase runs the indexer once per repo, reads the resulting +`.scip` protobuf via `@opencodehub/scip-ingest`, and reconciles +heuristic edges against compiler-grade references. The +`confidence-demote` phase re-ranks any heuristic edge that SCIP +contradicts so downstream phases see a single, coherent graph. + +Provenance is explicit: oracle-derived edges carry a +`scip:@` prefix and are visible to consumers. + +### 4. Index — BM25 + HNSW in DuckDB + +`@opencodehub/storage` persists the graph into an embedded DuckDB +database with three extensions: + +- **`fts`** — BM25 scoring over symbol names, docstrings, and file + paths. +- **`hnsw_acorn`** — HNSW index with predicate-aware traversal, so + `WHERE language='python'` and `WHERE granularity='community'` + actually return results rather than collapsing to zero on selective + filters. Includes RaBitQ quantization for 21-30× memory reduction. +- **Recursive CTEs with `USING KEY`** — memory-efficient multi-hop + graph traversal, used by `impact`, `context`, and `detect_changes`. + +Embeddings are optional. When enabled, one `embeddings` table stores +vectors at three granularities — symbol, file, community — keyed by a +`granularity` discriminator so one HNSW index serves every tier. + +### 5. Cluster — communities and processes + +Community detection groups related symbols into architectural units; +execution-flow detection walks call chains to produce "processes" that +represent end-to-end scenarios (request handler → service → data +access). Both are precomputed at index time so MCP tools can return +them without per-call compute. + +### 6. Serve — MCP server over stdio + +`@opencodehub/mcp` exposes the graph through an stdio MCP server +(`codehub mcp`). Every tool returns a structured envelope with +`next_steps: string[]` and, when the index lags HEAD, a +`_meta["codehub/staleness"]` block so agents can decide whether to +re-analyze before acting. + +The server is a local subprocess. There is no daemon, no socket, no +remote state. + +## Why this shape + +OpenCodeHub's primary user is an AI coding agent that needs callers, +callees, processes, and blast radius in one tool call — and needs the +answer to be reproducible across runs. The six-phase shape is the +cheapest configuration that hits all three: + +- **Local + offline.** DuckDB is embedded. Indexing reads the + filesystem, nothing else. `codehub analyze --offline` opens zero + sockets. +- **Deterministic.** Phases are pure: same inputs → same outputs, + byte-identical `graphHash`. See [Determinism](/opencodehub/architecture/determinism/). +- **Apache-2.0, every transitive dep on the permissive allowlist.** + DuckDB is MIT, `hnsw_acorn` is MIT, tree-sitter is MIT. No BSL, no + AGPL, no source-available engines in the core. See + [Supply chain](/opencodehub/architecture/supply-chain/). + +## Reference ADRs + +| ADR | Topic | +|-----|-----------------------------------------------------------------------------| +| 0001 | Storage backend selection — why DuckDB + `hnsw_acorn` + `fts` | +| 0002 | Rust core deferred to v2.1+ — why v2.0 stays pure TypeScript | +| 0004 | Hierarchical embeddings — one table, three granularities, filter-aware HNSW | +| 0005 | SCIP replaces LSP — compiler-grade edges without long-running language servers | +| 0006 | SCIP indexer CI pins — current version table per language | + +See [ADRs](/opencodehub/architecture/adrs/) for the full list and +decisions. + +## Related pages + +- [Monorepo map](/opencodehub/architecture/monorepo-map/) — every + workspace package and what it owns. +- [Determinism](/opencodehub/architecture/determinism/) — the + reproducibility contract and how it is tested. +- [Supply chain](/opencodehub/architecture/supply-chain/) — SBOM, + license allowlist, vulnerability posture. diff --git a/packages/docs/src/content/docs/architecture/supply-chain.md b/packages/docs/src/content/docs/architecture/supply-chain.md new file mode 100644 index 00000000..c4f390a2 --- /dev/null +++ b/packages/docs/src/content/docs/architecture/supply-chain.md @@ -0,0 +1,141 @@ +--- +title: Supply chain posture +description: SBOM, license allowlist, vulnerability gates, and how we handle non-permissive scanners. +sidebar: + order: 50 +--- + +OpenCodeHub ships under Apache-2.0 with a hard rule: every transitive +runtime dependency must sit on a permissive-license allowlist. This +page documents what we ship, the CI gates that prove it, and the +narrow set of tools we invoke as subprocesses rather than link +against. + +## What we ship + +Every release produces, in the `main` tree and the GitHub Release +artifacts: + +- **`SBOM.cdx.json`** — a CycloneDX v1.5 Software Bill of Materials + covering the full runtime dependency graph. Regenerated on every + release by `.github/workflows/sbom.yml`. +- **`THIRD_PARTY_LICENSES.md`** — a human-readable inventory of every + third-party package with its license text. +- **`NOTICE`** — the Apache-2.0 NOTICE file naming every attribution + we carry. +- **`CHANGELOG.md`** — generated by `release-please` from Conventional + Commits since the last release. + +All four files are tracked in the repo. Consumers can audit them +without cloning the history. + +## License allowlist + +Every production dependency must be on this list: + +``` +Apache-2.0 +MIT +BSD-2-Clause +BSD-3-Clause +ISC +CC0-1.0 +BlueOak-1.0.0 +0BSD +``` + +The check is enforced by +[`license-checker-rseidelsohn`](https://www.npmjs.com/package/license-checker-rseidelsohn) +on every PR and as part of `mise run check:full`. See +[IP hygiene / License allowlist](/opencodehub/contributing/ip-hygiene/#license-allowlist) +for the exact command and the note on the one known acceptance-script +inconsistency. + +BSL, BUSL, PolyForm, Commons Clause, GPL, and AGPL are rejected +upfront. Source-available engines (e.g. LanceDB's former license, +Elastic) were considered and rejected in ADR 0001 specifically +because preserving Apache-2.0 distribution rights is load-bearing. + +## Vulnerability gates + +| Gate | Tool | Trigger | +|---------------------|------------------------------------------------|---------------------------------------| +| OSV scan | `osv-scanner scan source --lockfile pnpm-lock.yaml` | Every CI run + `mise run check:full` | +| CodeQL | `.github/workflows/codeql.yml` | Every push + weekly schedule | +| OpenSSF Scorecard | `.github/workflows/scorecard.yml` | Weekly + push to `main` | +| SARIF schema | `mise run sarif:validate` + acceptance gate 13 | Every scanner run | + +Release gate policy: zero open CVEs on the lockfile at release time. +If a bump is blocked (upstream has not shipped a fix, or the fix +requires a breaking change), the PR must document the CVE, the reason, +and a due date before release-please cuts the version. + +All scanner outputs are uploaded as SARIF to the GitHub Security tab, +so the org-wide view is one dashboard. + +## Non-permissive scanners + +Some scanners that end users may want to run through `codehub scan` +— hadolint (GPL-3.0), tflint (MPL-2.0 / BUSL depending on vendor +build) — are not on the permissive allowlist. We still expose them. +The trick is **how**: we invoke them as subprocesses, we never +`import` them, never link them in, and never redistribute the +binaries. + +Concretely: + +- `packages/scanners/src/` is a thin shell-out layer. Each scanner + runner spawns the binary, captures stdout as SARIF, and emits + findings into the graph. +- The scanner binaries are a **user-provided runtime dependency**. + Users install them separately (via `brew`, `apt`, `choco`, the + vendor-published Docker image, etc.). OpenCodeHub does not ship + them, bundle them, or require them at install time. +- Scanner license obligations flow to the user running the scanner, + not to OpenCodeHub. + +This is the same pattern GitHub CodeQL uses with third-party SARIF +producers, and it is the reason OBJECTIVES.md can commit to an +Apache-2.0-end-to-end posture without crippling the scan surface. + +## SCIP indexers + +The SCIP indexers the gym uses (scip-typescript, scip-python, +scip-go, rust-analyzer, scip-java) follow the same subprocess-only +rule. They are installed via their language's native package +manager (`npm install -g`, `go install`, `rustup component add`, +`coursier install`) and invoked via subprocess. ADR 0006 pins the +versions and documents the install channel per language. + +## Lockfile policy + +- `pnpm-lock.yaml` is committed. +- Every install uses `--frozen-lockfile`. +- Dependency bumps are Conventional Commits under `build(deps): ...` + (or `chore(deps): ...` for devDependencies). +- Dependabot or manual bumps go through the same osv + license gates + as any other PR. + +## Verifying a release + +To verify a downloaded release: + +1. Pull the SBOM: `SBOM.cdx.json` at the release tag. +2. Confirm every component license is on the allowlist above. +3. Cross-check against `THIRD_PARTY_LICENSES.md` for any omissions. +4. Run `osv-scanner` against the tag's lockfile locally. + +The SBOM is deterministic — two regenerations at the same commit +produce the same bytes. That is an extension of the determinism +contract to the supply-chain layer. + +## Related + +- [IP hygiene](/opencodehub/contributing/ip-hygiene/) — the rules a + contributor has to follow to keep this posture. +- [ADR 0001 — Storage backend](https://github.com/theagenticguy/opencodehub/blob/main/docs/adr/0001-storage-backend.md) — + why every storage-layer dependency is MIT. +- [ADR 0006 — SCIP indexer CI pins](https://github.com/theagenticguy/opencodehub/blob/main/docs/adr/0006-scip-indexer-pins.md) — + current SCIP indexer version + install channel table. +- `SBOM.cdx.json`, `THIRD_PARTY_LICENSES.md`, `NOTICE`, `LICENSE` at + the repo root. diff --git a/packages/docs/src/content/docs/contributing/adding-a-language-provider.md b/packages/docs/src/content/docs/contributing/adding-a-language-provider.md new file mode 100644 index 00000000..d0405eba --- /dev/null +++ b/packages/docs/src/content/docs/contributing/adding-a-language-provider.md @@ -0,0 +1,169 @@ +--- +title: Adding a language provider +description: Four steps to wire a new language into the OpenCodeHub ingestion pipeline. +sidebar: + order: 60 +--- + +OpenCodeHub ships 15 tree-sitter language providers today: TypeScript, +TSX, JavaScript, Python, Go, Rust, Java, C#, C, C++, Ruby, Kotlin, +Swift, PHP, and Dart. Five of them (TypeScript, Python, Go, Rust, Java) +are further upgraded with SCIP indexers for compiler-grade cross-module +edges. + +Adding a new language is four steps. The registry is compile-time +exhaustive, so the TypeScript build fails if you forget step three. + +## Step 1 — Pin the tree-sitter grammar + +Add the grammar as a pinned dependency in `packages/ingestion/package.json`. +Use a concrete semver; do not use `^` or `latest`. Grammars change AST +shapes between versions and a float range will silently break +extraction. + +```json title="packages/ingestion/package.json" +{ + "dependencies": { + "tree-sitter-": "1.2.3" + } +} +``` + +Then `pnpm install` and verify the grammar loads by running the parse +bootstrap tests locally. + +## Step 2 — Implement the provider + +Create `packages/ingestion/src/providers/.ts` exporting a +`LanguageProvider` object. The interface lives at +`packages/ingestion/src/providers/types.ts`. Required fields and +methods: + +| Member | Purpose | +|-----------------------|-------------------------------------------------------------------------| +| `id` | The `LanguageId` string (must already exist in `@opencodehub/core-types`) | +| `extensions` | File extensions this provider claims | +| `importSemantics` | `named` / `namespace` / `package-wildcard` (see below) | +| `mroStrategy` | `c3` / `first-wins` / `single-inheritance` / `none` (see below) | +| `typeConfig` | `{ structural, nominal, generics }` booleans | +| `heritageEdge` | `"EXTENDS"` / `"IMPLEMENTS"` / `null` | +| `extractDefinitions` | Emit one record per defined symbol | +| `extractCalls` | Emit one record per call site | +| `extractImports` | Parse `import` / `use` / `require` statements | +| `extractHeritage` | Emit inheritance / trait-impl / interface-implements edges | +| `isExported` | Predicate: is this definition publicly exported? | + +Optional hooks improve coverage: + +| Member | Purpose | +|---------------------------|-------------------------------------------------------------------| +| `detectOutboundHttp` | Detect `fetch("/api")`, `requests.get(url)`, `axios.post(url, ...)` | +| `extractPropertyAccesses` | Emit `ACCESSES` edges for `receiver.property` reads/writes | +| `preprocessImportPath` | Strip `.js` suffix for TS, resolve `__init__.py`, etc. | +| `inferImplicitReceiver` | Name for `this` / `self` inside a method body | +| `complexityDefinitionKinds` / `halsteadOperatorKinds` | Enable cyclomatic + Halstead metrics | + +### Picking `importSemantics` + +- **`named`** — the statement names specific symbols: + `import { foo } from "bar"` (TypeScript, JavaScript), `import foo.Bar` + (Java), `use std::io::Read` (Rust), `using System.IO` (C#). Use this + for most typed languages. +- **`namespace`** — the statement imports a whole module under a name: + `import os` / `from os import path` (Python). The resolver walks + `.` chains at call sites. +- **`package-wildcard`** — the statement pulls a whole package symbol + set into scope: `import "fmt"` (Go). Every exported symbol of `fmt` + becomes directly callable. + +Today's breakdown: `package-wildcard` is used by Go; `namespace` is +used by Python; everything else (12 languages) uses `named`. + +### Picking `mroStrategy` + +- **`c3`** — full C3 linearization. Raises on ambiguity. Used by + Python (matches CPython's MRO semantics). +- **`first-wins`** — left-to-right source order. Used by TypeScript, + TSX, JavaScript, and Rust. Fast, predictable, matches how these + languages' compilers actually resolve. +- **`single-inheritance`** — one `extends` chain plus a set of + interfaces. Used by Java, C#, Kotlin. The chain walk is cheap; the + implements set is checked at resolution time. +- **`none`** — no traditional inheritance. Used by Go (composition via + embedded fields, no `extends`). The method-resolution walker is + skipped entirely. + +If your language is new, pick the strategy that matches its compiler's +actual semantics. Do not invent a fifth option — the four above cover +every mainstream type system. + +## Step 3 — Register in the provider registry + +Open `packages/ingestion/src/providers/registry.ts` and add your +provider to the `providers` object. + +```ts title="packages/ingestion/src/providers/registry.ts" +const providers = { + typescript: typescriptProvider, + // ... + zig: zigProvider, // new +} satisfies Record; +``` + +The `satisfies Record` clause is the +compile-time check. If you add `zig` to the `LanguageId` union in +`@opencodehub/core-types` but forget to register a provider, the +TypeScript build fails with a missing-key error. That is intentional — +the type error is how the registry stays exhaustive. + +## Step 4 — Add fixture tests + +Under `packages/ingestion/test/fixtures//` add source files that +exercise every extractor the provider implements. Use the +`parseFixture` helper from +`packages/ingestion/src/providers/test-helpers.ts`: + +```ts title="packages/ingestion/test/providers/.test.ts" +import { parseFixture } from "../../src/providers/test-helpers.js"; +import { Provider } from "../../src/providers/.js"; + +const result = await parseFixture(pool, "", "sample.", src); +const defs = Provider.extractDefinitions({ + filePath: "sample.", + captures: result.captures, + sourceText: src, +}); +// assert on defs... +``` + +Cover at minimum: a top-level function, a class with one method, an +import statement, a call to an imported symbol, and an exported vs. +non-exported symbol. If your language has generics / traits / +interfaces, add a fixture per heritage shape. + +The `parseFixture` helper returns a pool-borrowed `ParseCapture` array +that matches exactly what the ingestion pipeline passes in at runtime, +so the assertions you write here mirror production behaviour. + +## CI expectations + +Once the four steps are in place: + +- `mise run lint` — Biome check passes. +- `mise run typecheck` — registry exhaustiveness passes. +- `mise run test` — your fixture tests pass under `pnpm -r test`. +- `mise run banned-strings` — you did not accidentally copy names from + another project. + +If your language has an available SCIP indexer, a follow-up PR can add +it to `packages/scip-ingest/src/runners/` and `.github/workflows/gym.yml` +to upgrade heuristic edges to compiler-grade. That is not required for +shipping the heuristic provider. + +## Related files + +- `packages/ingestion/src/providers/types.ts` — the `LanguageProvider` + interface. +- `packages/ingestion/src/providers/registry.ts` — the exhaustive map. +- `packages/ingestion/src/providers/test-helpers.ts` — `parseFixture`. +- `@opencodehub/core-types` — the `LanguageId` union. diff --git a/packages/docs/src/content/docs/contributing/commit-conventions.md b/packages/docs/src/content/docs/contributing/commit-conventions.md new file mode 100644 index 00000000..8bce3134 --- /dev/null +++ b/packages/docs/src/content/docs/contributing/commit-conventions.md @@ -0,0 +1,128 @@ +--- +title: Commit conventions +description: Conventional Commits grammar, scopes, and breaking-change rules for OpenCodeHub. +sidebar: + order: 30 +--- + +OpenCodeHub follows [Conventional Commits](https://www.conventionalcommits.org/). +The commit log on `main` is the input to `release-please` — malformed +messages break version bumps, changelog generation, and release notes. So +we enforce the grammar three times: `lefthook` at `commit-msg`, the +`commitlint` GitHub Action on every PR, and `release-please` itself. + +## Grammar + +``` +(): + +[optional body] + +[optional footer(s)] +``` + +- Lowercase type. +- Scope is a single workspace package name or a meta-scope. +- Subject is imperative, ≤ 72 chars, no trailing period. +- Body wraps at 100 cols. Explain *why*, not *what* — the diff tells you + *what*. +- Footers are standard (`BREAKING CHANGE:`, `Refs: #123`, `Signed-off-by: ...`). + +If you are unsure of the type or scope: + +```bash title="Interactive Conventional Commit prompt" +pnpm run commit +``` + +That wraps Commitizen and walks you through type, scope, subject, body, +and breaking-change flags. + +## Types + +| Type | Use for | In changelog? | +|------------|------------------------------------------------------------------------|----------------------| +| `feat` | New user-facing capability (CLI flag, MCP tool, indexer, etc.) | Yes — "Features" | +| `fix` | Bug fix | Yes — "Bug Fixes" | +| `perf` | Performance improvement with no behaviour change | Yes — "Performance" | +| `revert` | Revert an earlier commit | Yes — "Reverts" | +| `docs` | Documentation-only change (this site, READMEs, ADRs, comments) | Yes — "Documentation"| +| `refactor` | Internal reshuffle, no behaviour change | Yes — "Refactoring" | +| `test` | Adding or fixing tests | Hidden | +| `build` | Build system, dependency bumps, package metadata | Hidden | +| `ci` | CI workflow change | Hidden | +| `chore` | Housekeeping that fits nowhere else | Hidden | +| `style` | Formatting only — Biome runs on pre-commit, so this is rare | Hidden | +| `release` | Release-please-authored commits only (do not use by hand) | — | + +"Hidden" means the commit is still enforced and still shows up in the +git log — it just does not appear in `CHANGELOG.md`. See +`.release-please-config.json` for the source of truth on which sections +are visible. + +## Scopes + +Workspace-package scopes map 1:1 to `packages//`: + +| Scope | Package | +|---------------|-------------------------------------| +| `analysis` | `@opencodehub/analysis` | +| `cli` | `@opencodehub/cli` (bin: `codehub`) | +| `core-types` | `@opencodehub/core-types` | +| `embedder` | `@opencodehub/embedder` | +| `gym` | `@opencodehub/gym` | +| `ingestion` | `@opencodehub/ingestion` | +| `mcp` | `@opencodehub/mcp` | +| `sarif` | `@opencodehub/sarif` | +| `scanners` | `@opencodehub/scanners` | +| `scip-ingest` | `@opencodehub/scip-ingest` | +| `search` | `@opencodehub/search` | +| `storage` | `@opencodehub/storage` | +| `summarizer` | `@opencodehub/summarizer` | + +Meta-scopes cover cross-cutting changes: + +| Meta-scope | Use for | +|------------|-----------------------------------------------------------| +| `deps` | Dependency bumps not tied to one package | +| `ci` | `.github/workflows/*.yml` changes | +| `docs` | `packages/docs/**` or top-level Markdown | +| `repo` | Root-level repo files (`.gitignore`, `mise.toml`, etc.) | +| `release` | Release-please-authored PRs only | + +## Breaking changes on 0.x + +OpenCodeHub is pre-1.0. The breaking-change rule is version-dependent: + +- **On 0.x:** `feat!` and a `BREAKING CHANGE:` footer both bump the + **minor** version (0.4.2 → 0.5.0). +- **After 1.0.0:** the same signals bump the **major** version. + +The `!` form is the short one: + +``` +feat(mcp)!: drop the `cypher` tool; use `sql` instead +``` + +The footer form is equivalent and plays nicer with long explanations: + +``` +feat(mcp): switch to SCIP-backed references + +BREAKING CHANGE: the `lsp-unconfirmed` reason suffix is now +`scip-unconfirmed`. Consumers that pattern-match on the old suffix +must update. +``` + +Use either form, not both. + +## Enforcement + +| Layer | Tool | Trigger | +|--------------------|----------------------------------------|------------------------| +| Local, pre-commit | `lefthook` + `commitlint --edit` | `commit-msg` hook | +| PR | `.github/workflows/commitlint.yml` | Every PR commit | +| Release | `release-please` action on push-to-main | New commit on `main` | + +If commitlint rejects your message locally, re-run `git commit` with a +fixed message — do not `--no-verify`. The tenet applies: every failure +is a blocker. diff --git a/packages/docs/src/content/docs/contributing/dev-loop.md b/packages/docs/src/content/docs/contributing/dev-loop.md new file mode 100644 index 00000000..7d0b6572 --- /dev/null +++ b/packages/docs/src/content/docs/contributing/dev-loop.md @@ -0,0 +1,141 @@ +--- +title: Dev loop +description: Tools, install commands, and the mise task catalogue for local development. +sidebar: + order: 20 +--- + +The local dev loop is three commands once your toolchain is in place. This +page covers the toolchain pins, the full `mise` task catalogue, and when +to reach for the long-running `check:full` and `acceptance` targets. + +## Toolchain pins + +| Tool | Version | How it gets installed | +|--------|--------------|-------------------------------------------| +| Node | 22 (>=22.0.0) | `mise.toml` — matches root `engines.node` | +| pnpm | 10.33.2 | `mise.toml` + `packageManager` field | +| Python | 3.12 | `mise.toml` — only needed for `packages/eval` | +| uv | latest | `mise.toml` — Python package manager | + +The Python venv for the eval harness is auto-created by `mise` via this +stanza in `mise.toml`: + +```toml title="mise.toml" +[env] +_.python.venv = { path = "packages/eval/.venv", create = true } +``` + +You do not need `pyenv`, `nvm`, `direnv`, or a hand-rolled venv. `mise` +activates tools and environment variables when you `cd` into the repo. + +## Three-command dev loop + +```bash title="Daily loop" +mise install # once per machine or after mise.toml changes +pnpm install --frozen-lockfile # once per pnpm-lock.yaml change +mise run check # every time you want to know if your branch is green +``` + +`mise run check` runs lint, typecheck, test, and the banned-strings sweep +in a single chain and stops on the first failure. The equivalent +`pnpm run check` is wired to the same task. + +## Individual checks + +Run one gate at a time when you want a faster loop: + +```bash +mise run lint # Biome check across packages/**/src, packages/**/test, scripts +mise run typecheck # tsc --noEmit across every workspace package +mise run test # pnpm -r test (each package's `test` script) +mise run banned-strings # scripts/check-banned-strings.sh +``` + +## Heavier gates + +```bash +mise run check:full # check + licenses + osv +mise run acceptance # 15 Definition-of-Done gates (soft: 7, 10, 11) +mise run smoke:mcp # boot MCP server over stdio, assert tools/list +mise run test:eval # Python eval harness (pytest under uv) +mise run gym # SCIP-indexer differential gym vs. frozen baseline +``` + +`check:full` adds the license allowlist (`license-checker-rseidelsohn`) and +the `osv-scanner` vulnerability scan against `pnpm-lock.yaml`. CI runs both +on every PR. + +`acceptance` is the full v1.0 Definition-of-Done. Some gates are soft — +they log but do not block — because they depend on optional binaries +(semgrep, embedder weights) or measure timings on the local machine. + +## Full task catalogue + +Every task in `mise.toml`: + +| Task | Purpose | +|--------------------------|-------------------------------------------------------------------------| +| `install` | `pnpm install --frozen-lockfile` | +| `install:update` | `pnpm install` — allows the lockfile to update | +| `install:eval` | `uv sync` inside `packages/eval` | +| `bootstrap` | `install` + `install:eval` | +| `build` | `pnpm -r build` across every package | +| `build:cli` | Build only `@opencodehub/cli` | +| `build:clean` | Clean + full rebuild | +| `clean` | `pnpm -r clean` | +| `clean:all` | Clean + delete `node_modules` everywhere | +| `cli:link` | `pnpm link --global` — expose `codehub` system-wide for dev | +| `cli:unlink` | Reverse of `cli:link` | +| `cli:pack` | Produce a distributable tarball of the CLI | +| `cli:install-global` | Install the packed tarball globally with pnpm | +| `cli:uninstall-global` | Remove the globally installed `codehub` | +| `test` | `pnpm -r test` | +| `test:eval` | Python eval harness (`uv run pytest`) | +| `lint` | `biome check .` | +| `lint:fix` | `biome check --write .` | +| `format` | `biome format --write .` | +| `typecheck` | `pnpm -r exec tsc --noEmit` | +| `banned-strings` | `scripts/check-banned-strings.sh` | +| `licenses` | License allowlist check (prod deps, private packages excluded) | +| `osv` | `osv-scanner scan source --lockfile pnpm-lock.yaml` | +| `sarif:validate` | Validate emitted SARIF against the Zod schema | +| `check` | `lint` + `typecheck` + `test` + `banned-strings` | +| `check:full` | `check` + `licenses` + `osv` | +| `acceptance` | 15 v1.0 DoD gates (`scripts/acceptance.sh`) | +| `smoke:mcp` | Boot the MCP server over stdio and assert `tools/list` | +| `commit` | Commitizen-guided Conventional Commit prompt | +| `envinfo` | Print tool versions for bug reports | +| `gym` | SCIP-indexer differential gym run | +| `gym:baseline` | Lock a new baseline manifest | +| `gym:replay` | Bit-exact replay of a frozen manifest | +| `gym:refresh-expected` | Refresh corpus `expected:` lists from the current manifest | +| `analyze` | `codehub analyze` against the current repo | +| `status` | `codehub status` | +| `mcp` | Start the stdio MCP server | + +## Lefthook hooks + +`lefthook install` (run once after `pnpm install`) wires three hooks: + +| Hook | Runs | +|-------------|---------------------------------------------------------| +| `pre-commit` | Biome autofix on staged `.ts/.tsx/.js/.jsx/.json/.jsonc` + banned-strings sweep | +| `commit-msg` | `commitlint --edit` on the draft message | +| `pre-push` | `tsc --noEmit` across packages + `pnpm -r test` | + +The pre-push hook is the last safety net before CI picks up your branch. +If it fails on a supposedly-unrelated test, see [Tenets](/opencodehub/contributing/overview/#tenets): +we fix it, we do not skip it. + +## When to run `acceptance` + +Before opening a PR that touches any of: + +- The analyze pipeline (`packages/ingestion`, `packages/analysis`). +- Storage (`packages/storage`). +- The MCP server (`packages/mcp`). +- The graph-hash contract (anything that could affect determinism). +- `scripts/check-banned-strings.sh` or the CI workflows. + +Otherwise `mise run check` is enough locally; CI will run the full matrix. diff --git a/packages/docs/src/content/docs/contributing/ip-hygiene.md b/packages/docs/src/content/docs/contributing/ip-hygiene.md new file mode 100644 index 00000000..12769fb0 --- /dev/null +++ b/packages/docs/src/content/docs/contributing/ip-hygiene.md @@ -0,0 +1,155 @@ +--- +title: IP hygiene +description: The clean-room rule, the license allowlist, banned-strings sweep, and supply-chain gates. +sidebar: + order: 50 +--- + +OpenCodeHub is a clean-room implementation distributed under Apache-2.0. +That promise has to hold end to end — in the source we write, in the +dependencies we pull, and in the binaries we ship. This page documents +the rules and the CI gates that enforce them. + +## The clean-room rule + +Do not copy code, comments, or test data from any source licensed under +PolyForm, BSL, Commons Clause, GPL, or AGPL. If a prior-art project +solves a problem we also want to solve, you may read its docs and +papers, but you may not look at its source while writing ours. When in +doubt, ask. + +The rule is boring. Our enforcement is not: every file on `main` goes +through a banned-strings sweep that rejects identifiers lifted verbatim +from projects we deliberately do not copy from. If one of those names +appears in your diff, CI turns red. + +## License allowlist + +Every production (transitive) dependency must be on this list: + +``` +Apache-2.0 +MIT +BSD-2-Clause +BSD-3-Clause +ISC +CC0-1.0 +BlueOak-1.0.0 +0BSD +``` + +The check runs via +[`license-checker-rseidelsohn`](https://www.npmjs.com/package/license-checker-rseidelsohn): + +```bash title="mise.toml — licenses task" +pnpm exec license-checker-rseidelsohn \ + --onlyAllow 'Apache-2.0;MIT;BSD-2-Clause;BSD-3-Clause;ISC;CC0-1.0;BlueOak-1.0.0;0BSD' \ + --excludePrivatePackages \ + --production +``` + +`--excludePrivatePackages` skips our own workspace packages; `--production` +skips `devDependencies` (which may legitimately include non-redistributable +tooling like scanners invoked as subprocesses — see below). + +Run it locally with `mise run licenses`, or let `mise run check:full` run +it as part of the extended gate. + +:::note[Known inconsistency] +`scripts/acceptance.sh` gate 5 currently uses a shorter allowlist that +omits `BlueOak-1.0.0` and `0BSD`. The authoritative list — the one we +enforce before publishing — is the `mise.toml` / CI version above. We +plan to reconcile the acceptance script to match. If you find a +BlueOak- or 0BSD-licensed transitive dep and acceptance fails but +`mise run licenses` passes, that is why. +::: + +## Banned-strings sweep + +`scripts/check-banned-strings.sh` is a `git grep` sweep over every +tracked file (and every untracked, non-ignored file) for identifiers we +have agreed never to use. It runs on `pre-commit` via lefthook, on +every CI job, and as acceptance gate 4. + +The banned literals are the names of prior-art projects and internal +planning artifacts we scrubbed before going public. The exact list +lives in `scripts/check-banned-strings.sh` — read it there, do not +memorize it here. If you need to reference one of these names in +documentation (this rarely happens), add the file to the pathspec +allowlist at the bottom of that script. + +The sweep also rejects planning-code regex patterns that belong to an +older internal planning model we do not ship. The patterns themselves +live in `scripts/check-banned-strings.sh` — reference the script if +you need to know what is being rejected. + +## Vulnerability scanning + +Every CI run and `mise run check:full` pass runs +[osv-scanner](https://github.com/google/osv-scanner) against +`pnpm-lock.yaml`: + +```bash +osv-scanner scan source --lockfile pnpm-lock.yaml . +``` + +Results are uploaded as SARIF to the GitHub Security tab. Release gate +policy: zero open CVEs on the lockfile at release time. + +## CodeQL + +`.github/workflows/codeql.yml` runs GitHub's CodeQL on the TypeScript +surface. Findings surface in the Security tab and block release PRs at +`high` severity. + +## OpenSSF Scorecard + +`.github/workflows/scorecard.yml` runs the +[OpenSSF Scorecard](https://scorecard.dev/) weekly and on every push to +`main`. It checks branch-protection posture, signed releases, pinned +dependencies, CI test runs, and a dozen other supply-chain signals. The +score is visible on the repo homepage via the badge. + +## Software Bill of Materials + +`SBOM.cdx.json` at the repo root is a CycloneDX v1.5 SBOM covering the +full runtime dependency graph. It is regenerated on every release by +`.github/workflows/sbom.yml` and attached to the GitHub Release. + +The human-readable companion is `THIRD_PARTY_LICENSES.md`, also at the +repo root, which enumerates every third-party package with its license +text. + +## Scanners that are not permissively licensed + +Some tools we expose via `codehub scan` and `codehub ingest-sarif` +(hadolint GPL-3.0, tflint MPL-2.0/BUSL) are not on the allowlist. We +resolve this by invoking them as subprocesses only — we never `import` +them, never statically link them, and never redistribute them. The +scanners are a user-provided runtime dependency, not a OpenCodeHub +dependency. See `packages/scanners/src/` for the thin wrapper that +shells out. + +This is the same pattern GitHub CodeQL uses with third-party SARIF +producers, and the same that OBJECTIVES.md commits to explicitly. + +## If a gate fails + +Every failure is a blocker: + +- Banned literal found → rename the identifier or remove the borrowed + text. Do not add it to the allowlist unless you have a genuine + documentation reason. +- License allowlist violation → pick a different dep, wait for the dep + to relicense, or open an ADR explaining why this one is required. +- CVE on lockfile → bump the dep, patch-pin to a fixed version, or open + an advisory waiver in the PR description. Waivers must cite the CVE, + the reason the bump is not yet possible, and a due date. + +## Related files + +- `scripts/check-banned-strings.sh` — the sweep. +- `mise.toml` — `licenses` and `osv` tasks. +- `.github/workflows/{ci,codeql,scorecard,sbom}.yml` — CI gates. +- `SBOM.cdx.json`, `THIRD_PARTY_LICENSES.md`, `NOTICE`, `LICENSE` — what + ships in every release. diff --git a/packages/docs/src/content/docs/contributing/overview.md b/packages/docs/src/content/docs/contributing/overview.md new file mode 100644 index 00000000..122e47e7 --- /dev/null +++ b/packages/docs/src/content/docs/contributing/overview.md @@ -0,0 +1,102 @@ +--- +title: Contributing overview +description: Start here before you open a pull request against OpenCodeHub. +sidebar: + order: 10 +--- + +Welcome. OpenCodeHub is an Apache-2.0 code-intelligence graph plus MCP server +for AI coding agents. The project lives on a permissive, OSS-only stack and +makes a hard promise about determinism and offline-first behaviour — so the +contribution bar is specific, not generic. + +This page is the table of contents for contributors. Read it first, then work +through the page that matches what you want to do. + +## What we ship, and what we will not + +The primary product is the `codehub` CLI plus the stdio MCP server that +agents call over JSON-RPC. The scope is captured in +[OBJECTIVES.md](https://github.com/theagenticguy/opencodehub/blob/main/OBJECTIVES.md): + +- Graph-aware context (callers, callees, processes, blast radius) in one + MCP tool call. +- Apache-2.0 end to end, with every transitive runtime dep on the + permissive allowlist. +- Local, offline-capable, deterministic index. +- Fifteen tree-sitter languages, with SCIP indexers upgrading five of + them (TypeScript, Python, Go, Rust, Java) to compiler-grade edges. + +Explicit non-goals: + +- No hosted service. DuckDB is embedded and the MCP server is a stdio + process. +- No Rust port before we can measure it is needed (see + [ADR 0002](/opencodehub/architecture/adrs/)). + +Contributions that pull the project toward either non-goal will be sent +back — kindly, but sent back. + +## Who benefits from a contribution + +Three audiences benefit from most changes: + +1. **Agents.** Anything that makes tool responses richer, more structured, + or less ambiguous (typed errors, `next_steps`, `_meta` envelopes) helps + automated agent loops. +2. **Contributors.** Anything that shortens the dev loop, fixes flaky + tests, or documents a sharp edge helps the next person too. +3. **End users running the CLI.** Speed, offline robustness, and better + defaults show up here. + +If a change does not pay off for at least one of these three, it probably +does not belong. + +## Where to start + +If you are looking for an easy first ticket: + +- **Add or fix a language-provider fixture.** Every provider under + `packages/ingestion/src/providers/` is backed by fixtures in + `packages/ingestion/test/fixtures//`. More fixtures means more + extraction bugs caught. See + [Adding a language provider](/opencodehub/contributing/adding-a-language-provider/). +- **Doc improvements.** This site lives in `packages/docs/`. Fix a + typo, tighten a rationale, add a diagram, link a missing ADR. +- **MCP tool polish.** Every tool lives under + `packages/mcp/src/tools/.ts`. `next_steps`, error envelopes, and + response shapes all evolve in small PRs. + +## Read before you write code + +- [Dev loop](/opencodehub/contributing/dev-loop/) — `mise install`, + `pnpm install --frozen-lockfile`, `mise run check`, the full task + catalogue. +- [Commit conventions](/opencodehub/contributing/commit-conventions/) — + Conventional Commits are required; commitlint runs locally and in CI. +- [Release process](/opencodehub/contributing/release-process/) — how + release-please turns your commits into a version bump. +- [IP hygiene](/opencodehub/contributing/ip-hygiene/) — the clean-room + rule, the license allowlist, the banned-strings sweep. +- [Adding a language provider](/opencodehub/contributing/adding-a-language-provider/) — + four steps, compile-time enforced. +- [Testing](/opencodehub/contributing/testing/) — Node test runner, the + Python eval harness, the MCP smoke test, the acceptance gates. + +The canonical short form of these rules lives in +[CONTRIBUTING.md](https://github.com/theagenticguy/opencodehub/blob/main/CONTRIBUTING.md). +These pages expand the rationale. + +## Tenets + +These three are non-negotiable. They are reproduced verbatim from +`CONTRIBUTING.md`: + +- **Determinism is non-negotiable** — identical inputs must yield identical + graph-hash. +- **Offline-first** — `codehub analyze --offline` must open zero sockets. +- **Clean-room IP hygiene** — when in doubt, ask. + +The deeper rationale lives in +[Architecture / Determinism](/opencodehub/architecture/determinism/) and +[IP hygiene](/opencodehub/contributing/ip-hygiene/). diff --git a/packages/docs/src/content/docs/contributing/release-process.md b/packages/docs/src/content/docs/contributing/release-process.md new file mode 100644 index 00000000..1c5e209c --- /dev/null +++ b/packages/docs/src/content/docs/contributing/release-process.md @@ -0,0 +1,128 @@ +--- +title: Release process +description: How release-please turns your Conventional Commits into a versioned release and CHANGELOG.md. +sidebar: + order: 40 +--- + +OpenCodeHub releases are automated by +[release-please](https://github.com/googleapis/release-please). You do not +tag, you do not edit `CHANGELOG.md`, you do not hand-write release notes. +You write Conventional Commits on feature branches, merge them into `main`, +and a bot opens the release PR for you. + +This page explains how that works, where the configuration lives, and what +you need to know when your change lands in a release. + +## The pipeline + +1. You merge a PR into `main`. Each commit on `main` is a Conventional + Commit (see [Commit conventions](/opencodehub/contributing/commit-conventions/)). +2. `.github/workflows/release-please.yml` runs on every push to `main` and + calls `googleapis/release-please-action@v4`. +3. The action reads every commit since the last release tag and decides on + a version bump using the `changelog-sections` map in + `.release-please-config.json`. +4. It opens (or updates) a single release PR titled + "chore(root): release N.N.N". The PR body is the generated changelog. +5. When a maintainer merges that PR, the action cuts git tags, generates + `CHANGELOG.md` entries, and creates a GitHub Release. + +Because the repo uses `separate-pull-requests: false`, the whole monorepo +moves in a single release PR covering all versioned packages. The +`node-workspace` plugin (with `updatePeerDependencies: true`) keeps +cross-package versions and peer ranges consistent. + +## Versioned vs. unversioned packages + +`.release-please-config.json` declares 10 versioned packages. They each +get their own `package-name` and their own tag. + +| Package | Tag prefix | +|----------------------------|--------------------------------| +| `@opencodehub/analysis` | `@opencodehub/analysis-vN.N.N` | +| `@opencodehub/cli` | `@opencodehub/cli-vN.N.N` | +| `@opencodehub/core-types` | `@opencodehub/core-types-vN.N.N` | +| `@opencodehub/embedder` | `@opencodehub/embedder-vN.N.N` | +| `@opencodehub/ingestion` | `@opencodehub/ingestion-vN.N.N` | +| `@opencodehub/mcp` | `@opencodehub/mcp-vN.N.N` | +| `@opencodehub/sarif` | `@opencodehub/sarif-vN.N.N` | +| `@opencodehub/scanners` | `@opencodehub/scanners-vN.N.N` | +| `@opencodehub/search` | `@opencodehub/search-vN.N.N` | +| `@opencodehub/storage` | `@opencodehub/storage-vN.N.N` | + +Plus the root component `opencodehub` tagged as `root-vN.N.N`. + +Four packages are intentionally unversioned: `@opencodehub/gym`, +`@opencodehub/scip-ingest`, `@opencodehub/summarizer`, and the Python +`packages/eval` harness. They ride along with the monorepo version but do +not publish tags of their own. The gym and eval are harness code, not +product. `scip-ingest` and `summarizer` are internal dependencies with no +external consumer at v1.0 — they will start versioning once a public +contract exists. + +## Changelog sections + +`.release-please-config.json` controls which Conventional Commit types +show up in `CHANGELOG.md`: + +| Type | Section | Visible? | +|------------|-----------------|----------| +| `feat` | Features | Yes | +| `fix` | Bug Fixes | Yes | +| `perf` | Performance | Yes | +| `revert` | Reverts | Yes | +| `docs` | Documentation | Yes | +| `refactor` | Refactoring | Yes | +| `test` | Tests | Hidden | +| `build` | Build System | Hidden | +| `ci` | CI | Hidden | +| `chore` | Chores | Hidden | +| `style` | Style | Hidden | + +Hidden sections still land in git history and still trigger a patch bump +— they just do not appear in the release notes. + +## Tags + +`include-v-in-tag: true` means every tag is `vN.N.N`, not `N.N.N`. Tag +format: `-v` (e.g. `@opencodehub/cli-v0.4.2`) plus +a root tag `root-v0.4.2`. + +## Breaking changes on 0.x + +While OpenCodeHub sits on `0.x.y`, a `feat!` or `BREAKING CHANGE:` +footer bumps the **minor** version, not the major. That is intentional: +the 0.x prefix signals "not yet stable" and we want the freedom to break +things without forcing a 1.0 → 2.0 stampede. + +After the first 1.0.0 release, the same signals bump the major version. +See the breaking-change section in +[Commit conventions](/opencodehub/contributing/commit-conventions/#breaking-changes-on-0x). + +## What you do when your PR lands + +Nothing. release-please watches `main`. When you merge, the release PR +updates automatically. If your PR is a `fix` on top of a pending release +PR, the PR title and body refresh to include your fix. If yours is the +first commit since the last release, a new release PR is opened. + +If you are the maintainer about to cut a release: + +1. Check CI on the release PR is green. +2. Verify the changelog reads correctly — if a `feat!` is missing from + "Features" or a `BREAKING CHANGE:` footer was not picked up, fix the + offending commit via a follow-up commit with the right prefix rather + than editing release-please's output. +3. Merge the release PR. Tags, `CHANGELOG.md`, and the GitHub Release + are produced in one push. + +## Related files + +- `.release-please-config.json` — the config described above. +- `.release-please-manifest.json` — release-please's state file. Do not + hand-edit. +- `.github/workflows/release-please.yml` — the workflow that runs the + action. +- [Commit conventions](/opencodehub/contributing/commit-conventions/) — + what your commits need to look like to drive all of the above. diff --git a/packages/docs/src/content/docs/contributing/testing.md b/packages/docs/src/content/docs/contributing/testing.md new file mode 100644 index 00000000..bfbee88c --- /dev/null +++ b/packages/docs/src/content/docs/contributing/testing.md @@ -0,0 +1,150 @@ +--- +title: Testing +description: Test harnesses — Node test runner, Python eval, MCP smoke, acceptance gates, SCIP gym. +sidebar: + order: 70 +--- + +OpenCodeHub has four test surfaces. Each runs at a different cadence +and covers a different level of the stack. This page is the map. + +## Node tests — per-package + +Every TypeScript package has its own `test` script that runs the +[Node.js test runner](https://nodejs.org/api/test.html) against compiled +output: + +```bash +pnpm -r test +``` + +Conventions: + +- Test files live alongside source as `*.test.ts`. +- `tsc` compiles them into `dist/**/*.test.js`. +- Each package's `test` script is `node --test './dist/**/*.test.js'` + (or close — check `packages//package.json` for the exact form). +- No Jest, no Vitest. The stdlib test runner keeps the dev dependency + surface small and Apache-2.0 clean. + +`mise run test` runs the full matrix after a `build`. The `pre-push` +lefthook hook runs the same command, so you usually catch failures +before CI does. + +### When to add a Node test + +Any time you touch code under `packages/*/src/`. Fixtures live in +`packages//test/fixtures/`. The `parseFixture` helper in +`packages/ingestion` (see +[Adding a language provider](/opencodehub/contributing/adding-a-language-provider/)) +is the standard tool for ingestion-side assertions. + +## Python eval harness + +The parity and regression eval lives in `packages/eval/`. It is a +pytest suite that drives the MCP server end-to-end against fixture +repos and asserts on the tool responses. + +```bash +mise run test:eval # uv sync + uv run pytest in packages/eval/ +``` + +`mise.toml` wires a per-project venv via +`_.python.venv = { path = "packages/eval/.venv", create = true }`, so +the first run creates the venv; subsequent runs reuse it. + +There are 49 parametrized cases. The release gate (acceptance gate 9) +requires ≥ 40 / 49 to pass. This is the floor that prevents +undetected regressions in MCP tool behaviour between releases. + +### When to add an eval case + +Any time you change the shape of an MCP tool response, the resolver, +or a ranking behaviour. Fixtures live under +`packages/eval/src/opencodehub_eval/fixtures/`. Test definitions live +under `packages/eval/src/opencodehub_eval/tests/`. + +## MCP smoke test + +`scripts/smoke-mcp.sh` boots the stdio MCP server, sends +`initialize` + `tools/list`, and asserts that the advertised tool +count matches `EXPECTED_TOOLS`. Run it directly or via: + +```bash +mise run smoke:mcp +``` + +:::caution[Known drift] +`scripts/smoke-mcp.sh` defaults `EXPECTED_TOOLS=19`. +`packages/mcp/src/server.ts` currently registers **28** tools, and the +top-level README cites **27**. The smoke test is therefore wrong on any +build that has not overridden `EXPECTED_TOOLS`. The fix is a one-line +update to the default; until it lands, use `EXPECTED_TOOLS=28 mise run +smoke:mcp` locally, or expect the acceptance gate 8 output to reflect +the stale count. +::: + +## Acceptance gates — v1.0 Definition of Done + +`scripts/acceptance.sh` runs all 15 Definition-of-Done gates. Mandatory +gates fail the run; soft gates (gates 7, 10, 11) log timings or skip +when a dependency binary is missing and do not change the exit code. + +```bash +mise run acceptance +``` + +| Gate | What it checks | Soft? | +|------|-----------------------------------------------------------------------------|-------| +| 1 | `pnpm install --frozen-lockfile` | no | +| 2 | `pnpm -r build` | no | +| 3 | `pnpm -r test` | no | +| 4 | banned-strings sweep | no | +| 5 | license allowlist | no | +| 6 | determinism — double-run `graphHash` identical | no | +| 7 | incremental reindex timings (5-run p95, logged only) | soft | +| 8 | MCP stdio boot + `tools/list` | no | +| 9 | Python eval harness — ≥ 40 / 49 cases pass | no | +| 10 | embeddings determinism (skipped if model weights absent) | soft | +| 11 | 100-file fixture incremental timing (5-run p95, logged only) | soft | +| 12 | scanner smoke — `codehub scan --scanners semgrep` emits SARIF | no | +| 13 | SARIF Zod-schema validation | no | +| 14 | license-audit smoke via the MCP tool | no | +| 15 | verdict smoke on a 2-commit fixture | no | + +Run acceptance before opening a PR that touches the analyze pipeline, +storage, the MCP server, or anything else called out in +[Dev loop / When to run acceptance](/opencodehub/contributing/dev-loop/#when-to-run-acceptance). + +## Gym — SCIP indexer differential tests + +The gym drives each per-language SCIP indexer against a frozen baseline +manifest and asserts that precision, recall, and F1 have not regressed +per language. It is the regression gate for compiler-grade edge +upgrades. + +```bash +mise run gym # run against the frozen baseline +mise run gym:baseline # lock a new baseline manifest (careful) +mise run gym:replay # bit-exact replay of a frozen manifest +``` + +Baselines live at `packages/gym/baselines/`. The differential tests run +in CI via `.github/workflows/gym.yml` on every PR that touches +`packages/scip-ingest`, `packages/ingestion`, or the frozen corpus. + +## Tenets apply to failing tests too + +Every failure — a lint warning, a flaky eval, a soft acceptance gate +that turned hard because a binary became available — is a blocker until +it is fixed or explicitly waived. See the +[tenets block](/opencodehub/contributing/overview/#tenets). + +## Related files + +- `scripts/acceptance.sh` — the 15-gate runner. +- `scripts/smoke-mcp.sh` — MCP boot smoke. +- `packages/eval/src/opencodehub_eval/tests/` — Python parametrized + eval cases. +- `packages/gym/baselines/` — frozen gym baselines. +- `.github/workflows/{ci,gym}.yml` — CI workflows. diff --git a/packages/docs/src/content/docs/guides/ci-integration.md b/packages/docs/src/content/docs/guides/ci-integration.md new file mode 100644 index 00000000..dc50fe63 --- /dev/null +++ b/packages/docs/src/content/docs/guides/ci-integration.md @@ -0,0 +1,86 @@ +--- +title: CI integration +description: Emit CI workflows, compute PR verdicts, and gate PRs on detected changes. +sidebar: + order: 80 +--- + +OpenCodeHub is built for CI from day one. Every command that matters in +a pipeline emits structured exit codes, supports `--json`, and runs +offline against the committed index. + +## Scaffold a pipeline + +```bash title="emit opinionated CI workflows" +codehub ci-init +``` + +`ci-init` detects whether the repo is on GitHub or GitLab and writes +the corresponding workflow file. Pass `--platform github`, +`--platform gitlab`, or `--platform both` to override. Use +`--main-branch release` to change the base branch, and `--force` to +overwrite an existing workflow. + +The emitted workflow runs `codehub analyze`, `codehub detect-changes +--scope compare --compare-ref origin/main --strict`, `codehub scan`, +and `codehub verdict` in that order. + +## Verdict: a 5-tier PR gate + +```bash title="compute a PR verdict" +codehub verdict --base main --head HEAD +``` + +`verdict` returns one of five tiers with a deterministic exit code: + +| Tier | Exit code | Meaning | +|---|---|---| +| `auto_merge` | 0 | Low-risk, no reviewer required by the graph. | +| `single_review` | 1 | One reviewer sufficient. | +| `dual_review` | 1 | Two reviewers recommended. | +| `expert_review` | 2 | Domain owner review required. | +| `block` | 3 | Do not merge — critical blast radius or policy fail. | + +Use the exit code directly in a CI step, or pass `--json` for the full +envelope with reasoning and contributing signals. + +## Detect changes on a PR + +```bash title="map the diff to graph symbols and processes" +codehub detect-changes --scope compare --compare-ref origin/main --strict +``` + +`detect-changes` returns the list of symbols, processes, and files +touched by the diff, each tagged with a risk tier. Exit codes: + +- `0` — OK (no HIGH/CRITICAL; MEDIUM allowed unless `--strict`). +- `1` — HIGH/CRITICAL found, or MEDIUM found with `--strict`. +- `2` — the command itself crashed. + +## Exit-code reference + +| Command | Exit 0 | Exit 1 | Exit 2 | Exit 3 | +|---|---|---|---|---| +| `analyze` | success | caught error | — | — | +| `detect-changes` | OK | risk found | caught error | — | +| `verdict` | `auto_merge` | `single_review` / `dual_review` | `expert_review` | `block` | +| `scan` | clean | findings at severity | scanner crashed | — | + +## Ingesting external SARIF + +If you already run another SAST tool, ingest its SARIF output into the +graph so the same `list_findings` MCP tool surfaces both sets: + +```bash title="ingest an external SARIF file" +codehub ingest-sarif path/to/report.sarif +``` + +The findings become `Finding` nodes with `FOUND_IN` edges to the +symbol and file they reference. + +## Next + +- [CLI reference](/opencodehub/reference/cli/) — every command, every + flag. +- [Error codes](/opencodehub/reference/error-codes/) — the fixed set of + MCP error codes your CI tooling may encounter. diff --git a/packages/docs/src/content/docs/guides/cross-repo-groups.md b/packages/docs/src/content/docs/guides/cross-repo-groups.md new file mode 100644 index 00000000..782f137e --- /dev/null +++ b/packages/docs/src/content/docs/guides/cross-repo-groups.md @@ -0,0 +1,74 @@ +--- +title: Cross-repo groups +description: Query and analyse a fleet of microservices as one group with codehub group. +sidebar: + order: 70 +--- + +A platform team with 40 microservices does not want to run 40 separate +`codehub query` commands to find "the users endpoint". Groups let you +bundle several indexed repos and hit them with one cross-repo search, +one contract scan, or one status probe. + +## Create a group + +```bash title="bundle three repos into a group named fleet" +codehub group create fleet repoA repoB repoC +``` + +The repo arguments must already be indexed (registered in +`~/.codehub/registry.json`). Use `codehub list` to see what is +registered, or `codehub analyze` inside each repo to register it. + +Add `--description "core platform services"` to annotate the group. + +## Sync the group + +```bash title="rebuild the cross-repo contract registry" +codehub group sync fleet +``` + +`group sync` walks every repo in the group, rebuilds the contract +registry (HTTP routes, MCP tools, shared types), and populates the +cross-link table so route-change blast-radius is visible across +repos. + +## Query across every repo + +```bash title="fused BM25 + RRF search" +codehub group query fleet "users endpoint" +``` + +Cross-repo search runs BM25 (and embedding search, when each repo has +embeddings) against every member and fuses the ranked lists with +reciprocal-rank fusion (RRF). The result is a single ranked list of +hits annotated with their source repo. + +Pass `--limit 20` (the default) or `--json` for a script-friendly +envelope. + +## Contracts and cross-links + +```bash title="list HTTP contracts and cross-repo call edges" +codehub group contracts fleet +``` + +`group contracts` surfaces every HTTP route defined in the group, the +handler that serves it, and every known consumer (caller) across the +other repos in the group. Combined with `api_impact` over MCP, this is +how platform teams see the blast radius of a route change before +shipping it. + +## Other group commands + +| Command | Purpose | +|---|---| +| `codehub group list` | List every group on this machine. | +| `codehub group status ` | Show staleness and last sync time for a group. | +| `codehub group delete ` | Drop the group (repos stay indexed). | + +## MCP equivalents + +Every `group` CLI command has an MCP tool with the same name prefix: +`group_list`, `group_query`, `group_status`, `group_contracts`, +`group_sync`. See [MCP tools](/opencodehub/mcp/tools/). diff --git a/packages/docs/src/content/docs/guides/indexing-a-repo.md b/packages/docs/src/content/docs/guides/indexing-a-repo.md new file mode 100644 index 00000000..0706f64d --- /dev/null +++ b/packages/docs/src/content/docs/guides/indexing-a-repo.md @@ -0,0 +1,101 @@ +--- +title: Indexing a repo +description: Run codehub analyze, add embeddings, go offline, and manage .codehub state. +sidebar: + order: 10 +--- + +`codehub analyze` is the full indexing pipeline: parse with tree-sitter +(and SCIP for the five languages that have indexers), resolve imports +and inheritance, detect processes and clusters, build BM25 and HNSW +indexes, and write everything to `.codehub/` under the repo root. + +## Basic indexing + +```bash title="index the current repo" +codehub analyze +``` + +Re-run after significant changes. A no-op short-circuit skips work if +the index already matches `HEAD`; pass `--force` to rebuild. + +## Add semantic vectors + +```bash title="full index with embeddings" +codehub analyze --embeddings +``` + +`--embeddings` computes symbol and optional file/community vectors and +writes them to the HNSW index. After this, `codehub query` fuses BM25 +and vector results via reciprocal-rank fusion (RRF). + +Memory-constrained machines can use `--embeddings-int8` for quantised +vectors, `--embeddings-workers auto` to tune the worker pool, or +`--embeddings-batch-size 32` (default) to tune batch throughput. + +## Zero-network indexing + +```bash title="offline mode — no sockets" +codehub analyze --offline +``` + +`--offline` disables every code path that would open a socket. Combine +with cached embedder weights (see `codehub setup --embeddings +--model-dir `) to index fully air-gapped. + +## Staleness and status + +```bash title="check index freshness" +codehub status +``` + +`status` compares the index against the working tree and reports +staleness. MCP responses also carry an envelope field +`_meta["codehub/staleness"]` whenever the index lags `HEAD`, so agents +can detect drift without polling. + +## Resetting the index + +```bash title="delete the .codehub/ directory" +codehub clean +``` + +`codehub clean --all` deletes every index registered on the machine and +wipes `~/.codehub/registry.json`. + +## Granularity + +```bash title="index at symbol, file, and community level" +codehub analyze --granularity symbol,file,community +``` + +The pipeline produces hierarchical embeddings so a single query can +surface a symbol, the file that contains it, and the community the +symbol participates in. The default granularity is `symbol`. + +## What lives in `.codehub/` + +| Path | Purpose | +|---|---| +| `graph.duckdb` | The DuckDB database with symbols, edges, processes, and embeddings. | +| `meta.json` | Index metadata (graph hash, node counts, CLI version, toolchain pins). | +| `scan.sarif` | SARIF scan output when `codehub scan` has run. | +| `sbom.cdx.json` | CycloneDX SBOM when `codehub analyze --sbom` has run. | +| `coverage/` | Coverage bridge artefacts when `--coverage` has run. | + +## Other useful flags + +- `--sbom` — emit a CycloneDX SBOM alongside the index. +- `--coverage` — bridge coverage data into the graph. +- `--summaries` / `--no-summaries` — LLM-generated symbol summaries + (default on; capped by `--max-summaries`, default auto = 10% of + callables, hard cap 500). +- `--skills` — generate Claude Code skills from the graph. +- `--wasm-only` — force the WASM fallback for every tree-sitter + grammar (sets `OCH_WASM_ONLY=1`). +- `--strict-detectors` — fail the build if a detector (DET-O-001) + regresses. +- `--verbose` — noisier logs. + +See [CLI reference: analyze](/opencodehub/reference/cli/#analyze) for +the complete flag list. diff --git a/packages/docs/src/content/docs/guides/troubleshooting.md b/packages/docs/src/content/docs/guides/troubleshooting.md new file mode 100644 index 00000000..a7ae3834 --- /dev/null +++ b/packages/docs/src/content/docs/guides/troubleshooting.md @@ -0,0 +1,88 @@ +--- +title: Troubleshooting +description: Fix native build failures, stale indexes, ambiguous-repo errors, and Windows quirks. +sidebar: + order: 90 +--- + +## Native build failures (tree-sitter or DuckDB) + +Symptoms: `pnpm install` fails while building `tree-sitter`, +`@duckdb/node-api`, or any other native addon. Error mentions +`node-gyp`, `python`, a C/C++ compiler, or `Visual Studio Build Tools`. + +Fix: + +```bash title="probe the native toolchain" +codehub doctor +``` + +`doctor` checks Node version, the platform's C/C++ toolchain, and +whether each native module can load. Follow the remediation hints it +prints. As a fallback, run any indexing command with `--wasm-only` +(which sets `OCH_WASM_ONLY=1`) to skip native tree-sitter bindings: + +```bash title="force WASM tree-sitter" +codehub analyze --wasm-only +``` + +## Stale index + +Symptoms: MCP responses carry `_meta["codehub/staleness"]`, or +`codehub query` returns symbols that no longer exist. + +Fix: + +```bash title="check then rebuild" +codehub status +codehub analyze --force +``` + +`status` reports how far behind `HEAD` the index is. `analyze --force` +rebuilds from scratch regardless of the no-op short-circuit. Run +`codehub analyze` after every significant pull to stay aligned. + +## `AMBIGUOUS_REPO` error from MCP tools + +Symptoms: an MCP tool returns an error envelope with +`error.code: "AMBIGUOUS_REPO"`. + +Cause: you have more than one repo indexed in +`~/.codehub/registry.json`, and the tool call did not include a `repo` +argument. + +Fix: pass a `repo` argument to every per-repo tool call. The value is +the repo name from `codehub list`. If you are driving the server from +an agent, tell the agent to include `repo` every time. + +## Windows quirks + +Native tree-sitter and DuckDB builds on Windows require the Microsoft +C++ Build Tools plus a matching Python for `node-gyp`. In practice the +fastest fix is to run everything under WSL2 — WSL2 ships with a +working toolchain out of the box and avoids path separator issues. + +If you must stay on native Windows: + +1. Install Visual Studio Build Tools with the "Desktop development + with C++" workload. +2. Install Python from the Microsoft Store (Python 3.12). +3. `npm config set msvs_version 2022` and `npm config set python + python3.12`. +4. Re-run `pnpm install --frozen-lockfile`. +5. If anything still fails, fall back to `codehub analyze --wasm-only`. + +## The index is missing a language I expected + +Check [supported languages](/opencodehub/reference/languages/). If the +language is listed but returns no symbols, the grammar may have +failed to load natively; retry with `--wasm-only`. If the language is +not listed, it is not yet registered — see +[adding a language provider](/opencodehub/contributing/adding-a-language-provider/). + +## More help + +- `codehub doctor --verbose` dumps every probe the doctor runs. +- File an issue at + [github.com/theagenticguy/opencodehub](https://github.com/theagenticguy/opencodehub/issues) + with the `doctor` output attached. diff --git a/packages/docs/src/content/docs/guides/using-with-claude-code.md b/packages/docs/src/content/docs/guides/using-with-claude-code.md new file mode 100644 index 00000000..2d08e240 --- /dev/null +++ b/packages/docs/src/content/docs/guides/using-with-claude-code.md @@ -0,0 +1,76 @@ +--- +title: Using with Claude Code +description: Wire the codehub MCP server into Claude Code via the plugin or an MCP-only config. +sidebar: + order: 20 +--- + +There are two ways to connect OpenCodeHub to Claude Code. The **plugin** path +adds a PreToolUse hook that auto-augments rename-class edits with `impact` and +`detect_changes`. The **MCP-only** path wires the server without the hook. + +## Plugin (preferred) + +```bash title="install the Claude Code plugin" +codehub setup --plugin +``` + +`--plugin` installs the OpenCodeHub plugin into Claude Code. The plugin +registers a PreToolUse hook that runs before any edit that looks like a +rename or a cross-file refactor. The hook calls `impact` and +`detect_changes`, then feeds the results back to Claude Code as inline +context so the agent can adjust its plan before writing a diff. + +The plugin bundles the MCP server wiring too, so you do not need to +also run `setup --editors claude-code`. + +## MCP-only + +If you prefer the raw MCP connection without the hook: + +```bash title="write .mcp.json for the current project" +codehub setup --editors claude-code +``` + +The writer targets `/.mcp.json` (Claude Code's project scope). +The resulting entry looks like: + +```json title=".mcp.json" +{ + "mcpServers": { + "codehub": { + "command": "node", + "args": ["/abs/path/to/opencodehub/packages/cli/dist/index.js", "mcp"], + "env": {} + } + } +} +``` + +The server runs over stdio. Claude Code spawns it on demand, sends +JSON-RPC over stdin/stdout, and keeps it alive for the session. + +## Multi-editor setup + +`--editors` accepts any comma-separated subset of +`claude-code,cursor,codex,windsurf,opencode`. The default is all five. + +```bash title="wire Claude Code and Cursor together" +codehub setup --editors claude-code,cursor +``` + +## Reverting + +```bash title="remove the codehub entry the last setup wrote" +codehub setup --editors claude-code --undo +``` + +`--undo` removes only the `codehub` entry; any other `mcpServers` +entries in `.mcp.json` are preserved. + +## Next + +- [MCP tools](/opencodehub/mcp/tools/) — the full catalogue of 28 tools + Claude Code will see. +- [MCP overview](/opencodehub/mcp/overview/) — server name, transport, + envelope conventions. diff --git a/packages/docs/src/content/docs/guides/using-with-codex.md b/packages/docs/src/content/docs/guides/using-with-codex.md new file mode 100644 index 00000000..76aebe63 --- /dev/null +++ b/packages/docs/src/content/docs/guides/using-with-codex.md @@ -0,0 +1,51 @@ +--- +title: Using with Codex +description: Wire the codehub MCP server into OpenAI Codex via codehub setup. +sidebar: + order: 40 +--- + +Codex reads its MCP config from `~/.codex/config.toml`. It is the only +one of the five supported editors that uses TOML instead of JSON. +`codehub setup` writes the correct TOML block for you. + +## Wire the MCP server + +```bash title="write ~/.codex/config.toml" +codehub setup --editors codex +``` + +The writer merges a `[mcp_servers.codehub]` table into the existing +TOML without touching other tables. The resulting block looks like: + +```toml title="~/.codex/config.toml" +[mcp_servers.codehub] +command = "node" +args = ["/abs/path/to/opencodehub/packages/cli/dist/index.js", "mcp"] +``` + +Restart Codex after the first write so it picks up the new server. +Codex spawns the server over stdio and keeps it alive for the session. + +## Multi-editor setup + +`--editors` accepts any comma-separated subset of +`claude-code,cursor,codex,windsurf,opencode`. The default is all five. + +```bash title="wire Codex alongside Claude Code" +codehub setup --editors codex,claude-code +``` + +## Reverting + +```bash title="remove only the codehub entry" +codehub setup --editors codex --undo +``` + +`--undo` removes only the `[mcp_servers.codehub]` table. Other Codex +MCP servers are left alone. + +## Next + +- [MCP tools](/opencodehub/mcp/tools/) — the catalogue of 28 tools + Codex will see. diff --git a/packages/docs/src/content/docs/guides/using-with-cursor.md b/packages/docs/src/content/docs/guides/using-with-cursor.md new file mode 100644 index 00000000..82e91706 --- /dev/null +++ b/packages/docs/src/content/docs/guides/using-with-cursor.md @@ -0,0 +1,63 @@ +--- +title: Using with Cursor +description: Wire the codehub MCP server into Cursor via codehub setup. +sidebar: + order: 30 +--- + +Cursor reads MCP servers from `~/.cursor/mcp.json` (global scope, shared +across all Cursor projects). `codehub setup` writes the entry for you. + +## Wire the MCP server + +```bash title="write ~/.cursor/mcp.json" +codehub setup --editors cursor +``` + +The writer merges a `codehub` entry into the existing `mcpServers` +object without touching any other servers you may already have wired. +The entry has the same shape as Claude Code's: + +```json title="~/.cursor/mcp.json" +{ + "mcpServers": { + "codehub": { + "command": "node", + "args": ["/abs/path/to/opencodehub/packages/cli/dist/index.js", "mcp"], + "env": {} + } + } +} +``` + +Restart Cursor (or reload the window) after the first write so it picks +up the new server. Cursor spawns the server over stdio and keeps it +alive for the session. + +## Using the tools + +Open Cursor's chat, select a model that supports tool use, and ask +questions like "What is the blast radius of `validateUser`?" or "Find +me everything related to the auth token refresh flow." Cursor will +call the codehub MCP tools directly and return structured results. + +See [MCP tools](/opencodehub/mcp/tools/) for the full catalogue of 28 +tools. + +## Multi-editor setup + +`--editors` accepts any comma-separated subset of +`claude-code,cursor,codex,windsurf,opencode`. The default is all five. + +```bash title="wire Cursor alongside Claude Code" +codehub setup --editors cursor,claude-code +``` + +## Reverting + +```bash title="remove only the codehub entry" +codehub setup --editors cursor --undo +``` + +`--undo` removes only the `codehub` entry from `~/.cursor/mcp.json`. +Other MCP servers are left alone. diff --git a/packages/docs/src/content/docs/guides/using-with-opencode.md b/packages/docs/src/content/docs/guides/using-with-opencode.md new file mode 100644 index 00000000..207d012d --- /dev/null +++ b/packages/docs/src/content/docs/guides/using-with-opencode.md @@ -0,0 +1,57 @@ +--- +title: Using with OpenCode +description: Wire the codehub MCP server into OpenCode via codehub setup. +sidebar: + order: 60 +--- + +OpenCode reads MCP servers from `/opencode.json`. The OpenCode +schema nests servers under a top-level `mcp` key with a `type: "local"` +discriminator. `codehub setup` writes the correct shape for you. + +## Wire the MCP server + +```bash title="write opencode.json in the current project" +codehub setup --editors opencode +``` + +The writer merges a `codehub` entry into the existing `mcp` object. The +entry looks like: + +```json title="opencode.json" +{ + "mcp": { + "codehub": { + "type": "local", + "command": ["node", "/abs/path/to/opencodehub/packages/cli/dist/index.js", "mcp"], + "enabled": true + } + } +} +``` + +Reload OpenCode after the first write. The server runs over stdio for +the session. + +## Multi-editor setup + +`--editors` accepts any comma-separated subset of +`claude-code,cursor,codex,windsurf,opencode`. The default is all five. + +```bash title="wire OpenCode alongside Claude Code" +codehub setup --editors opencode,claude-code +``` + +## Reverting + +```bash title="remove only the codehub entry" +codehub setup --editors opencode --undo +``` + +`--undo` removes only the `codehub` entry from `opencode.json`. Other +MCP servers configured there are left alone. + +## Next + +- [MCP tools](/opencodehub/mcp/tools/) — the catalogue of 28 tools + OpenCode will see. diff --git a/packages/docs/src/content/docs/guides/using-with-windsurf.md b/packages/docs/src/content/docs/guides/using-with-windsurf.md new file mode 100644 index 00000000..4286d213 --- /dev/null +++ b/packages/docs/src/content/docs/guides/using-with-windsurf.md @@ -0,0 +1,57 @@ +--- +title: Using with Windsurf +description: Wire the codehub MCP server into Windsurf via codehub setup. +sidebar: + order: 50 +--- + +Windsurf reads MCP servers from `~/.codeium/windsurf/mcp_config.json`. +`codehub setup` writes the entry for you. + +## Wire the MCP server + +```bash title="write Windsurf's MCP config" +codehub setup --editors windsurf +``` + +The writer merges a `codehub` entry into the existing `mcpServers` +object without touching other servers. The entry uses the same shape +as Claude Code and Cursor: + +```json title="~/.codeium/windsurf/mcp_config.json" +{ + "mcpServers": { + "codehub": { + "command": "node", + "args": ["/abs/path/to/opencodehub/packages/cli/dist/index.js", "mcp"], + "env": {} + } + } +} +``` + +Reload Windsurf after the first write so it picks up the new server. +The server runs over stdio for the lifetime of the session. + +## Multi-editor setup + +`--editors` accepts any comma-separated subset of +`claude-code,cursor,codex,windsurf,opencode`. The default is all five. + +```bash title="wire Windsurf alongside Cursor" +codehub setup --editors windsurf,cursor +``` + +## Reverting + +```bash title="remove only the codehub entry" +codehub setup --editors windsurf --undo +``` + +`--undo` removes only the `codehub` entry. Other Windsurf MCP servers +are left alone. + +## Next + +- [MCP tools](/opencodehub/mcp/tools/) — the catalogue of 28 tools + Windsurf will see. diff --git a/packages/docs/src/content/docs/index.mdx b/packages/docs/src/content/docs/index.mdx new file mode 100644 index 00000000..0fa98d65 --- /dev/null +++ b/packages/docs/src/content/docs/index.mdx @@ -0,0 +1,92 @@ +--- +title: OpenCodeHub +description: Apache-2.0 code intelligence graph + MCP server for AI coding agents. +template: splash +hero: + tagline: Code intelligence for AI coding agents, under Apache-2.0, on an all-OSS stack. + image: + file: ../../assets/logo.svg + actions: + - text: Quick start + link: /opencodehub/start-here/quick-start/ + icon: right-arrow + variant: primary + - text: View on GitHub + link: https://github.com/theagenticguy/opencodehub + icon: external + variant: minimal +--- + +import { Card, CardGrid, LinkCard } from "@astrojs/starlight/components"; + +## Why OpenCodeHub + + + + Agents get callers, callees, processes, and blast radius in one + MCP tool call — no grep round-trips, no lossy embeddings alone. + + + `codehub analyze --offline` opens zero sockets. Your code never + leaves your machine. DuckDB + `hnsw_acorn` is the entire storage + stack — no daemon, no SaaS. + + + Every runtime dep sits on a permissive allowlist (Apache-2.0 / + MIT / BSD / ISC / CC0 / BlueOak / 0BSD). Fork, embed, and ship. + + + Identical inputs produce a byte-identical graph hash. + Reproducible. Auditable. Cacheable in CI. + + + +## Start here + + + + + + + + +## For contributors + + + + + + + diff --git a/packages/docs/src/content/docs/mcp/overview.md b/packages/docs/src/content/docs/mcp/overview.md new file mode 100644 index 00000000..267734a9 --- /dev/null +++ b/packages/docs/src/content/docs/mcp/overview.md @@ -0,0 +1,76 @@ +--- +title: MCP overview +description: Server name, transport, capabilities, and ambient conventions for the OpenCodeHub MCP server. +sidebar: + order: 10 +--- + +OpenCodeHub ships an MCP server that any Model-Context-Protocol client +can connect to over stdio. + +## Connection + +- **Server name:** `opencodehub` +- **Transport:** stdio (JSON-RPC over stdin/stdout) +- **Launch command:** `codehub mcp` +- **Capabilities:** `tools`, `resources`, `prompts` +- **Tool count:** 28 (registered in `packages/mcp/src/server.ts`) + +Clients spawn the `codehub mcp` process and exchange JSON-RPC frames +over its stdio pipes. Signals map to clean exits: `SIGINT` → 130, +`SIGTERM` → 143, stdin close → 0. + +## Client setup + +Every supported editor has a one-command setup path: + +- [Claude Code](/opencodehub/guides/using-with-claude-code/) +- [Cursor](/opencodehub/guides/using-with-cursor/) +- [Codex](/opencodehub/guides/using-with-codex/) +- [Windsurf](/opencodehub/guides/using-with-windsurf/) +- [OpenCode](/opencodehub/guides/using-with-opencode/) + +All five use `codehub setup --editors ` and write into the +editor's native MCP config location. + +## Ambient conventions + +The server follows two conventions every client should know. + +### Optional `repo` argument + +Per-repo tools accept an optional `repo` string. Resolution rules: + +- **Exactly one repo in the registry:** `repo` is optional; the server + infers it. +- **Two or more repos and `repo` omitted:** the tool returns + `AMBIGUOUS_REPO` in the error envelope with a list of registered + repos in `hint`. +- **`repo` provided:** the server uses it directly. + +### Response envelope + +Every successful tool result carries two ambient fields alongside the +tool-specific payload: + +- **`next_steps: string[]`** — one-line agent-targeted hints ("call + `context` on the top result" / "stage edits then call + `detect_changes`"). Helper: `packages/mcp/src/next-step-hints.ts`. +- **`_meta["codehub/staleness"]`** — populated only when the index + lags `HEAD`. Carries the staleness envelope so the agent can decide + whether to trust the result or ask the user to re-run `codehub + analyze`. Constant: `STALENESS_META_KEY = "codehub/staleness"`. + +Error responses instead carry `isError: true`, +`structuredContent.error`, and no payload. See +[error codes](/opencodehub/reference/error-codes/). + +## What the server exposes + +- **28 tools** — search, navigation, change analysis, findings, + verdict, routes, cross-repo groups, and metadata. See + [tools](/opencodehub/mcp/tools/). +- **7 resources** — structured views over repos, clusters, and + processes. See [resources](/opencodehub/mcp/resources/). +- **5 prompts** — pre-baked agent playbooks. See + [prompts](/opencodehub/mcp/prompts/). diff --git a/packages/docs/src/content/docs/mcp/prompts.md b/packages/docs/src/content/docs/mcp/prompts.md new file mode 100644 index 00000000..e018dbd0 --- /dev/null +++ b/packages/docs/src/content/docs/mcp/prompts.md @@ -0,0 +1,20 @@ +--- +title: MCP prompts +description: The five pre-baked prompts the opencodehub server ships. +sidebar: + order: 40 +--- + +The `opencodehub` MCP server registers five prompts. Each one is a +pre-baked playbook the agent can invoke to drive a multi-step task +with the right tool-call sequence and the right framing. + +| Prompt | Purpose | +|---|---| +| `detect-impact` | Walk a staged or compared diff through `detect_changes` → `impact` → `verdict`, then summarise risk. | +| `review-pr` | Structured PR review: findings, risk, route and contract diffs, and a recommended verdict tier. | +| `explore-area` | Onboard the agent to an unfamiliar part of the repo via `query` and `context`, grouped by process. | +| `audit-dependencies` | Inventory dependencies with `dependencies` and `license_audit`, flag license outliers, list high-risk packages. | +| `generate-map` | Emit a Markdown map of the repo (modules, routes, MCP tools) using `route_map`, `tool_map`, and clusters. | + +Implementations live under `packages/mcp/src/prompts/`. diff --git a/packages/docs/src/content/docs/mcp/resources.md b/packages/docs/src/content/docs/mcp/resources.md new file mode 100644 index 00000000..e4722c7a --- /dev/null +++ b/packages/docs/src/content/docs/mcp/resources.md @@ -0,0 +1,24 @@ +--- +title: MCP resources +description: The seven MCP resources the opencodehub server publishes. +sidebar: + order: 30 +--- + +The `opencodehub` MCP server publishes seven resources alongside its +tools. Clients that honour MCP resources (Claude Code, Cursor) can +read them directly; clients that do not can usually reach the same +data via the corresponding tool. + +| URI | Purpose | +|---|---| +| `codehub://repos` | All repos registered on this machine. | +| `codehub://repo-context` | High-level profile for one repo: language mix, entry points, top processes. | +| `codehub://repo-schema` | The graph schema (node kinds, edge kinds) for one repo. | +| `codehub://repo-clusters` | All clusters (communities) detected for one repo. | +| `codehub://repo-cluster` | One cluster with its members and connecting edges. | +| `codehub://repo-processes` | All execution-flow processes detected for one repo. | +| `codehub://repo-process` | One process with its ordered steps, files, and participating symbols. | + +Each resource returns JSON. Implementations live under +`packages/mcp/src/resources/`. diff --git a/packages/docs/src/content/docs/mcp/tools.md b/packages/docs/src/content/docs/mcp/tools.md new file mode 100644 index 00000000..bb5e191f --- /dev/null +++ b/packages/docs/src/content/docs/mcp/tools.md @@ -0,0 +1,88 @@ +--- +title: MCP tools +description: All 28 MCP tools the opencodehub server registers, grouped by functional cluster. +sidebar: + order: 20 +--- + +The `opencodehub` MCP server registers **28 tools**, imported and +invoked from `packages/mcp/src/server.ts`. Two stale counts exist in +the repo and should be ignored: + +- `README.md` claims 27 tools — drift from before the last addition. +- `scripts/smoke-mcp.sh` expects 19 tools in its default + `EXPECTED_TOOLS` env var — a stale smoke baseline. + +The canonical number is **28**, taken live from `buildServer()` at +startup. + +Every per-repo tool accepts an optional `repo` argument; see +[MCP overview](/opencodehub/mcp/overview/) for the resolution rules. + +## Search and navigation + +| Tool | Purpose | Primary inputs | +|---|---|---| +| `list_repos` | List indexed repos on this machine. | — | +| `query` | Hybrid BM25 + vector code-graph search, grouped by process. | `text`, `repo?`, `limit?` | +| `context` | 360-degree view of one symbol: callers, callees, processes. | `symbol`, `repo?` | +| `impact` | Change-impact blast radius with risk tier. | `symbol`, `depth?`, `direction?`, `repo?` | +| `pack_codebase` | Pack a repo into an LLM-ready snapshot (repomix). | `path?`, `style?` | +| `sql` | Read-only SQL against the graph store; 5 s timeout. | `query`, `repo?` | + +## Change analysis + +| Tool | Purpose | Primary inputs | +|---|---|---| +| `detect_changes` | Map a git diff to indexed symbols and processes. | `scope?`, `compareRef?`, `repo?`, `strict?` | +| `rename` | Coordinated multi-file symbol rename with confidence-tagged edits. | `from`, `to`, `repo?`, `dryRun?` | +| `list_dead_code` | List dead and unreachable-export symbols. | `repo?` | +| `remove_dead_code` | Remove dead symbols from disk. | `repo?`, `targets` | + +## Findings and verdict + +| Tool | Purpose | Primary inputs | +|---|---|---| +| `scan` | Run Priority-1 scanners and ingest findings. | `scanners?`, `severity?`, `repo?` | +| `list_findings` | List SARIF findings for a repo. | `repo?`, `severity?` | +| `list_findings_delta` | Diff SARIF findings against a baseline. | `baseline`, `repo?` | +| `verdict` | 5-tier PR verdict. | `base?`, `head?`, `repo?` | +| `risk_trends` | Per-community risk trend plus 30-day projection. | `repo?` | + +## Routes and contracts + +| Tool | Purpose | Primary inputs | +|---|---|---| +| `route_map` | Map HTTP routes to handlers and consumers. | `repo?` | +| `api_impact` | Route change blast radius. | `route`, `repo?` | +| `shape_check` | Route response-shape mismatch check. | `route`, `repo?` | +| `tool_map` | Map MCP tool definitions defined in the repo. | `repo?` | + +## Cross-repo groups + +| Tool | Purpose | Primary inputs | +|---|---|---| +| `group_list` | List cross-repo groups on this machine. | — | +| `group_query` | Cross-repo BM25 + RRF search. | `group`, `text`, `limit?` | +| `group_status` | Staleness and last-sync report for a group. | `group` | +| `group_contracts` | Cross-repo HTTP contracts plus cross-links. | `group` | +| `group_sync` | Rebuild the cross-repo contract registry. | `group` | + +## Metadata + +| Tool | Purpose | Primary inputs | +|---|---|---| +| `project_profile` | Summary profile for the repo (language mix, entry points, owners). | `repo?` | +| `dependencies` | List external dependencies. | `repo?` | +| `license_audit` | Audit dependency licenses against the allowlist. | `repo?` | +| `owners` | List owners for a node. | `node`, `repo?` | + +## See also + +- [MCP overview](/opencodehub/mcp/overview/) — server name, transport, + envelope conventions. +- [Error codes](/opencodehub/reference/error-codes/) — the fixed error + envelope under `structuredContent.error`. +- [Resources](/opencodehub/mcp/resources/) — structured views + alongside the tools. +- [Prompts](/opencodehub/mcp/prompts/) — pre-baked agent playbooks. diff --git a/packages/docs/src/content/docs/reference/cli.md b/packages/docs/src/content/docs/reference/cli.md new file mode 100644 index 00000000..9a102bfe --- /dev/null +++ b/packages/docs/src/content/docs/reference/cli.md @@ -0,0 +1,367 @@ +--- +title: CLI reference +description: Every codehub command, flag, and exit code. +sidebar: + order: 10 +--- + +Binary: `codehub`. Source entry: `packages/cli/src/index.ts`. Published +entry: `packages/cli/dist/index.js`. Default error contract: an +unhandled throw writes `codehub: ` to stderr and sets +`process.exitCode = 1`. + +## `analyze` + +Index a repository. Runs the full pipeline: parse, resolve, cluster, +build BM25 + HNSW indexes, and write `.codehub/`. + +```bash title="usage" +codehub analyze [path] +``` + +| Flag | Default | Purpose | +|---|---|---| +| `--force` | off | Rebuild even if the no-op short-circuit fires. | +| `--embeddings` | off | Compute semantic vectors. | +| `--embeddings-int8` | off | Quantise vectors to int8. | +| `--granularity ` | `symbol` | Any subset of `symbol,file,community`. | +| `--embeddings-workers ` | auto | Size of the embedding worker pool. | +| `--embeddings-batch-size ` | 32 | Batch size per worker. | +| `--offline` | off | Zero sockets. | +| `--verbose` | off | Noisier logs. | +| `--skip-agents-md` | off | Skip AGENTS.md ingestion. | +| `--sbom` | off | Emit `sbom.cdx.json` alongside the index. | +| `--coverage` | off | Bridge coverage data into the graph. | +| `--summaries` / `--no-summaries` | on | LLM-generated symbol summaries. | +| `--max-summaries ` | auto (10% of callables, cap 500) | Summary budget. | +| `--summary-model ` | — | Override the summary model. | +| `--skills` | off | Emit Claude Code skills. | +| `--wasm-only` | off | Force WASM tree-sitter; sets `OCH_WASM_ONLY=1`. | +| `--strict-detectors` | off | Fail the build if DET-O-001 regresses. | + +Exit codes: `0` success, `1` caught error. + +## `index` + +Register an existing `.codehub/` into `~/.codehub/registry.json` without +re-analysing. + +```bash title="usage" +codehub index [paths...] +``` + +| Flag | Default | Purpose | +|---|---|---| +| `--force` | off | Overwrite an existing registry entry. | +| `--allow-non-git` | off | Permit registering a repo with no `.git`. | + +## `setup` + +Wire MCP config into supported editors, install the Claude Code +plugin, or download embedder weights. + +```bash title="usage" +codehub setup +``` + +| Flag | Default | Purpose | +|---|---|---| +| `--editors ` | all | `claude-code,cursor,codex,windsurf,opencode`. | +| `--force` | off | Overwrite existing entries. | +| `--undo` | off | Remove only the `codehub` entry each writer added. | +| `--embeddings` | off | Download the embedder model weights. | +| `--int8` | off | Download int8-quantised weights. | +| `--model-dir ` | — | Custom weights directory. | +| `--plugin` | off | Install the Claude Code plugin. | + +## `mcp` + +Launch the stdio MCP server. + +```bash title="usage" +codehub mcp +``` + +Signal handling: `SIGINT` → 130, `SIGTERM` → 143, stdin close → 0. + +## `list` + +List repos indexed on this machine. + +```bash title="usage" +codehub list +``` + +## `status` + +Report index metadata and staleness for one repo. + +```bash title="usage" +codehub status [path] +``` + +## `clean` + +Delete the index at `[path]`. + +```bash title="usage" +codehub clean [path] +``` + +| Flag | Default | Purpose | +|---|---|---| +| `--all` | off | Delete every registered index. | + +## `pack` + +Emit a single-file, LLM-ready, AST-compressed snapshot of the repo +(powered by repomix). + +```bash title="usage" +codehub pack [path] +``` + +| Flag | Default | Purpose | +|---|---|---| +| `--style ` | `xml` | Output format. | +| `--no-compress` | off | Disable AST compression. | +| `--remove-comments` | off | Strip comments. | +| `--out ` | — | Output file. | + +## `query` + +Hybrid BM25 + embedding search. + +```bash title="usage" +codehub query +``` + +| Flag | Default | Purpose | +|---|---|---| +| `--limit ` | 10 | Max results. | +| `--repo ` | current | Target repo (required when >1 indexed and no cwd match). | +| `--json` | off | Structured envelope. | +| `--content` | off | Include source content per result. | +| `--context ` | — | Extra context string for re-ranking. | +| `--goal ` | — | Goal string for re-ranking. | +| `--max-symbols ` | 50 | Cap on candidate symbols. | +| `--bm25-only` | off | Skip vector search. | +| `--rerank-top-k ` | 50 | Candidates fed into the re-ranker. | +| `--zoom` | off | Zoom into processes. | +| `--fanout ` | — | Fan-out per process. | +| `--granularity ` | symbol | Result granularity. | + +## `context` + +Callers, callees, and processes for one symbol. + +```bash title="usage" +codehub context +``` + +| Flag | Default | Purpose | +|---|---|---| +| `--repo ` | current | Target repo. | +| `--json` | off | Structured envelope. | + +## `impact` + +Blast-radius for one symbol. + +```bash title="usage" +codehub impact +``` + +| Flag | Default | Purpose | +|---|---|---| +| `--depth ` | 3 | BFS depth. | +| `--direction ` | both | Traversal direction. | +| `--repo ` | current | Target repo. | +| `--json` | off | Structured envelope. | +| `--target-uid ` | — | Disambiguate by graph UID. | +| `--file-path ` | — | Disambiguate by file. | +| `--kind ` | — | Disambiguate by kind. | + +## `detect-changes` + +Map a diff to symbols and processes. + +```bash title="usage" +codehub detect-changes +``` + +| Flag | Default | Purpose | +|---|---|---| +| `--scope ` | `all` | Diff scope. | +| `--compare-ref ` | — | Ref for `--scope compare`. | +| `--repo ` | current | Target repo. | +| `--json` | off | Structured envelope. | +| `--strict` | off | Exit 1 on MEDIUM as well. | + +Exit codes: `0` OK, `1` HIGH/CRITICAL (or MEDIUM+ `--strict`), `2` caught error. + +## `verdict` + +5-tier PR verdict. + +```bash title="usage" +codehub verdict +``` + +| Flag | Default | Purpose | +|---|---|---| +| `--base ` | `main` | Base ref. | +| `--head ` | `HEAD` | Head ref. | +| `--repo ` | current | Target repo. | +| `--json` | off | Structured envelope. | + +Exit codes: `auto_merge=0`, `single_review=1`, `dual_review=1`, +`expert_review=2`, `block=3`. + +## `group` + +Cross-repo group management. + +```bash title="usage" +codehub group create [--description ] +codehub group list +codehub group delete +codehub group status +codehub group query [--limit ] [--json] +codehub group sync [--json] +``` + +`--limit` defaults to 20 for `group query`. + +## `ingest-sarif` + +Ingest a SARIF 2.1.0 file into the graph as `Finding` nodes plus +`FOUND_IN` edges. + +```bash title="usage" +codehub ingest-sarif +``` + +| Flag | Default | Purpose | +|---|---|---| +| `--repo ` | current | Target repo. | + +## `scan` + +Run Priority-1 scanners and ingest findings. + +```bash title="usage" +codehub scan [path] +``` + +| Flag | Default | Purpose | +|---|---|---| +| `--scanners ` | all | Scanner IDs. | +| `--with ` | — | Additional scanners. | +| `--output ` | `/.codehub/scan.sarif` | SARIF output path. | +| `--severity ` | `HIGH,CRITICAL` | Gate severity. | +| `--repo ` | current | Target repo. | +| `--concurrency ` | — | Scanner concurrency. | +| `--timeout ` | — | Per-scanner timeout. | + +Exit codes: `0` clean, `1` findings at severity, `2` scanner crashed. + +## `doctor` + +Probe the environment. + +```bash title="usage" +codehub doctor +``` + +| Flag | Default | Purpose | +|---|---|---| +| `--skip-native` | off | Skip native-module probes. | +| `--repoRoot ` | cwd | Repo root to probe. | + +## `bench` + +Run the acceptance-gate bench suite and emit a dashboard. + +```bash title="usage" +codehub bench +``` + +| Flag | Default | Purpose | +|---|---|---| +| `--acceptance ` | — | Acceptance manifest. | +| `--silent` | off | Suppress console output. | + +## `wiki` + +Emit a Markdown wiki for the repo. + +```bash title="usage" +codehub wiki +``` + +| Flag | Default | Purpose | +|---|---|---| +| `--output ` | required | Destination directory. | +| `--repo ` | current | Target repo. | +| `--json` | off | Structured envelope. | +| `--offline` | off | Incompatible with `--llm`. | +| `--llm` | off | Enrich with LLM prose. | +| `--max-llm-calls ` | 0 (dry-run) | Budget. | +| `--llm-model ` | — | Override LLM model. | + +## `ci-init` + +Emit opinionated CI workflows. + +```bash title="usage" +codehub ci-init +``` + +| Flag | Default | Purpose | +|---|---|---| +| `--platform ` | auto-detect | Target CI. | +| `--main-branch ` | `main` | Base branch. | +| `--repo ` | cwd | Repo root. | +| `--force` | off | Overwrite. | + +## `augment` + +Fast BM25 enrichment for editor PreToolUse hooks. Writes to stderr so +the hook can pipe it to the agent. + +```bash title="usage" +codehub augment +``` + +| Flag | Default | Purpose | +|---|---|---| +| `--limit ` | 5 | Max hits. | + +## `eval-server` + +Launch the persistent loopback HTTP daemon that wraps MCP handlers +(used by SWE-bench loops). + +```bash title="usage" +codehub eval-server +``` + +| Flag | Default | Purpose | +|---|---|---| +| `--port ` | 4848 | Listen port. | +| `--idle-timeout ` | 900 | Idle timeout. | + +## `sql` + +Read-only SQL against the graph store. + +```bash title="usage" +codehub sql +``` + +| Flag | Default | Purpose | +|---|---|---| +| `--repo ` | current | Target repo. | +| `--timeout ` | 5000 | Statement timeout. | +| `--json` | off | Structured envelope. | diff --git a/packages/docs/src/content/docs/reference/configuration.md b/packages/docs/src/content/docs/reference/configuration.md new file mode 100644 index 00000000..24abfdfb --- /dev/null +++ b/packages/docs/src/content/docs/reference/configuration.md @@ -0,0 +1,60 @@ +--- +title: Configuration +description: Environment variables, on-disk layout, registry, and editor setup targets. +sidebar: + order: 20 +--- + +## Environment variables + +| Name | Purpose | +|---|---| +| `OCH_WASM_ONLY` | Force the WASM fallback for every tree-sitter grammar. Set to `1` by `codehub analyze --wasm-only`. | +| `CODEHUB_HOME` | Override `~/.codehub/` (where the registry and embedder weights live). | +| `CODEHUB_EMBEDDING_URL` | Endpoint URL for an external embedding service. | +| `CODEHUB_EMBEDDING_MODEL` | Model ID to request from the embedding service. | +| `CODEHUB_EMBEDDING_DIMS` | Integer dimensionality of the embedding model. | +| `CODEHUB_EMBEDDING_API_KEY` | API key for the embedding service (sent as `Authorization: Bearer ...`). | +| `NO_COLOR` | Standard convention; disables colored console output. | + +## On-disk layout: `.codehub/` + +`codehub analyze` writes everything under `/.codehub/`: + +| Path | Purpose | +|---|---| +| `graph.duckdb` | Primary DuckDB database: symbols, edges, processes, embeddings. | +| `meta.json` | Index metadata: graph hash, node counts, CLI version, toolchain pins. | +| `scan.sarif` | SARIF output from `codehub scan`. | +| `sbom.cdx.json` | CycloneDX SBOM when `codehub analyze --sbom` has run. | +| `coverage/` | Coverage bridge artefacts when `--coverage` has run. | + +Safe to delete and rebuild at any time via `codehub clean` + +`codehub analyze`. + +## Registry: `~/.codehub/registry.json` + +The registry maps each registered repo to its index path. It is +consulted by: + +- Every per-repo MCP tool that accepts an optional `repo` argument. +- `codehub list`, `codehub status`, `codehub clean --all`. +- `codehub group create` when resolving repo names. + +`CODEHUB_HOME` relocates the parent directory. + +## `codehub setup` targets + +Each editor writer has a fixed target path and merges a `codehub` +entry non-destructively: + +| Editor | Path | Format | +|---|---|---| +| `claude-code` | `/.mcp.json` | JSON | +| `cursor` | `~/.cursor/mcp.json` | JSON | +| `codex` | `~/.codex/config.toml` | TOML | +| `windsurf` | `~/.codeium/windsurf/mcp_config.json` | JSON | +| `opencode` | `/opencode.json` | JSON | + +`--undo` removes only the `codehub` entry each writer added; other +entries are preserved. diff --git a/packages/docs/src/content/docs/reference/error-codes.md b/packages/docs/src/content/docs/reference/error-codes.md new file mode 100644 index 00000000..72438797 --- /dev/null +++ b/packages/docs/src/content/docs/reference/error-codes.md @@ -0,0 +1,50 @@ +--- +title: Error codes +description: The fixed set of MCP error codes returned under structuredContent.error. +sidebar: + order: 30 +--- + +Every MCP tool that fails gracefully (i.e. the tool ran but the +operation could not complete) returns a uniform envelope under +`structuredContent.error` with `isError: true`. Protocol-level +failures (unknown tool name, malformed JSON-RPC) raise the SDK's +`McpError` instead and are not enumerated here. + +The canonical list lives at +[`packages/mcp/src/error-envelope.ts`](https://github.com/theagenticguy/opencodehub/blob/main/packages/mcp/src/error-envelope.ts). + +## Codes + +| Code | When it fires | Typical remediation | +|---|---|---| +| `STALENESS` | The index lags `HEAD` far enough to mistrust results. | `codehub analyze` (or `--force`). | +| `INVALID_INPUT` | A tool argument failed schema validation. | Correct the call; check required fields. | +| `NOT_FOUND` | The target symbol, repo, or group does not exist. | Confirm the name; run `codehub list` for repos. | +| `DB_ERROR` | DuckDB returned an error during the query. | Check `codehub doctor`; inspect `.codehub/graph.duckdb`. | +| `SCHEMA_MISMATCH` | The index was produced by a different CLI version with an incompatible schema. | `codehub analyze --force` to rebuild. | +| `RATE_LIMITED` | A downstream service (embedder, summariser) rate-limited the request. | Retry with backoff; reduce concurrency. | +| `INTERNAL` | Catch-all for unhandled exceptions reaching the tool boundary. | File an issue with the error `message`. | +| `NO_INDEX` | The repo has no `.codehub/` directory. | `codehub analyze `. | +| `AMBIGUOUS_REPO` | More than one repo is indexed and no `repo` argument was supplied. | Pass `repo` to the tool call. | + +## Envelope shape + +```json title="error envelope" +{ + "isError": true, + "content": [ + { "type": "text", "text": "Error (AMBIGUOUS_REPO): ...\nHint: ..." } + ], + "structuredContent": { + "error": { + "code": "AMBIGUOUS_REPO", + "message": "Multiple repos registered; specify `repo`.", + "hint": "One of: acme-api, acme-web" + } + } +} +``` + +Clients should key on `structuredContent.error.code` to decide whether +to retry, disambiguate, or abort. diff --git a/packages/docs/src/content/docs/reference/languages.md b/packages/docs/src/content/docs/reference/languages.md new file mode 100644 index 00000000..3290503f --- /dev/null +++ b/packages/docs/src/content/docs/reference/languages.md @@ -0,0 +1,72 @@ +--- +title: Supported languages +description: The 15 registered languages, which have SCIP indexers, and the WASM fallback. +sidebar: + order: 40 +--- + +Languages are registered at compile time in a `satisfies Record` table. Omitting a registered language raises a +build-time TypeScript error, so the table and this page cannot drift. + +## Registered languages (15) + +| Language | tree-sitter parse | SCIP indexer | +|---|---|---| +| TypeScript | yes | yes | +| TSX | yes | yes (via TypeScript) | +| JavaScript | yes | yes (via TypeScript) | +| Python | yes | yes | +| Go | yes | yes | +| Rust | yes | yes | +| Java | yes | yes | +| C# | yes | — | +| C | yes | — | +| C++ | yes | — | +| Ruby | yes | — | +| Kotlin | yes | — | +| Swift | yes | — | +| PHP | yes | — | +| Dart | yes | — | + +The five languages with a SCIP indexer get precise cross-file reference +resolution (ADR 0005). The other ten rely on tree-sitter's +symbol-level resolution, which is good enough for blast-radius within +a single module and degrades gracefully across module boundaries. + +## Native bindings and the WASM fallback + +Every grammar is loaded via native tree-sitter bindings by default. +Native bindings are faster but require a working C/C++ toolchain +(`node-gyp` + MSVC on Windows, `clang` + headers on macOS, `gcc` + +headers on Linux). They are compiled on install from source pins in +`packages/ingestion/package.json`. + +If native bindings fail to load — common on some minimal Linux +containers and on Windows without the Build Tools — run with +`--wasm-only` or export `OCH_WASM_ONLY=1`: + +```bash title="force WASM for every grammar" +codehub analyze --wasm-only +``` + +WASM is slightly slower but has no native dependency. The web surface +of OpenCodeHub always runs in WASM-only mode. + +## Adding a language + +Four steps, all committed together: + +1. Pin the tree-sitter grammar in `packages/ingestion/package.json`. +2. Implement `LanguageProvider` in + `packages/ingestion/src/providers/.ts`. +3. Add the entry to the registry in + `packages/ingestion/src/providers/registry.ts` — TypeScript fails + the build if the key is missing. +4. Add fixture tests under + `packages/ingestion/test/fixtures//`, using the + `parseFixture` helper from `test-helpers.ts`. + +See +[adding a language provider](/opencodehub/contributing/adding-a-language-provider/) +for the full walkthrough. diff --git a/packages/docs/src/content/docs/start-here/first-query.md b/packages/docs/src/content/docs/start-here/first-query.md new file mode 100644 index 00000000..f3b9714a --- /dev/null +++ b/packages/docs/src/content/docs/start-here/first-query.md @@ -0,0 +1,97 @@ +--- +title: Your first query +description: Walk through query, context, and impact against a local index. +sidebar: + order: 40 +--- + +All three commands below run locally against the index at `.codehub/`. +None of them open sockets once the index is built (add `--offline` to +`analyze` to also prove zero network during indexing). + +## Hybrid search: `query` + +`codehub query` fuses BM25 lexical search with HNSW vector search (when +embeddings are present) to find symbols related to a natural-language +concept. + +```bash title="find symbols related to an auth flow" +node packages/cli/dist/index.js query "auth token refresh" +``` + +Expected shape (abridged): + +``` +process: auth.refresh_token — 7 steps, 4 files + 1. refreshToken (src/auth/handler.ts:42) + 2. validateRefreshToken (src/auth/validate.ts:18) + 3. ... + +process: oauth.rotate_session — 5 steps, 3 files + 1. rotateSession (src/oauth/rotate.ts:12) + 2. ... +``` + +Results are grouped by **process** (an execution flow the indexer +detected during clustering), not a flat symbol list. Use `--limit`, +`--bm25-only`, or `--granularity file` to change the shape. + +## 360-degree context: `context` + +`codehub context ` returns callers, callees, and the processes +the symbol participates in. + +```bash title="context for a single symbol" +node packages/cli/dist/index.js context PaymentProcessor +``` + +Expected shape: + +``` +PaymentProcessor (Class, src/payments/processor.ts:24) + callers: + - checkout.charge (src/checkout/charge.ts:88) + - subscriptions.renew (src/subscriptions/renew.ts:56) + callees: + - validateCard, stripeClient.createCharge, auditLog.write + processes: + - payments.checkout (12 steps) + - payments.renewal (8 steps) + ACCESSES edges: + - ProcessorConfig (read), AuditLog (write) +``` + +Pass `--json` to get the structured envelope that the MCP `context` +tool returns. + +## Blast radius: `impact` + +`codehub impact ` reports how many symbols, files, and +processes depend on the target, plus a **risk tier** (`LOW` / `MEDIUM` +/ `HIGH` / `CRITICAL`). + +```bash title="depth-2 blast radius" +node packages/cli/dist/index.js impact validateUser --depth 2 +``` + +Expected shape: + +``` +impact(target = validateUser, depth = 2) + direct callers: 14 + transitive callers (depth 2): 37 + affected processes: 3 + risk tier: HIGH + confidence: 0.82 +``` + +`--direction up` restricts to dependents (who calls me), `--direction +down` restricts to dependencies (who do I call), and `--direction both` +(the default) returns both in one response. + +## Next + +- [MCP tools overview](/opencodehub/mcp/overview/) for the full server + capabilities. +- [Using with Claude Code](/opencodehub/guides/using-with-claude-code/) + to let the agent run these tools for you. diff --git a/packages/docs/src/content/docs/start-here/install.md b/packages/docs/src/content/docs/start-here/install.md new file mode 100644 index 00000000..5eaa9973 --- /dev/null +++ b/packages/docs/src/content/docs/start-here/install.md @@ -0,0 +1,85 @@ +--- +title: Install +description: Install the codehub CLI and MCP server on macOS, Linux, or Windows. +sidebar: + order: 20 +--- + +## Requirements + +- **OS:** macOS, Linux, or Windows (Windows users should prefer WSL; native + Windows works if you have the MSVC build tools and `node-gyp` dependencies + for tree-sitter and DuckDB). +- **Node.js:** `>=22.0.0` (Node 22 LTS is the pin in the repo). +- **pnpm:** `>=10.0.0` (the workspace lockfile is generated with 10.33.2). +- **Python 3.12:** only required if you plan to run the evaluation harness + under `packages/eval`. Not required for the CLI or MCP server. +- **mise:** recommended. It pins Node, pnpm, and Python from the committed + `mise.toml` in one command. + +## Install paths + +### Recommended: mise-managed toolchain + +```bash title="clone, pin tools, install, build" +git clone https://github.com/theagenticguy/opencodehub +cd opencodehub +mise install +pnpm install --frozen-lockfile +pnpm -r build +``` + +`mise install` activates the Node 22, pnpm 10.33.2, and Python 3.12 pins +from `mise.toml`. `pnpm install --frozen-lockfile` installs exactly the +lockfile-pinned dependencies. `pnpm -r build` compiles every TypeScript +package so the CLI entrypoint at `packages/cli/dist/index.js` is +runnable. + +### Without mise: manual toolchain + +If you already manage Node and pnpm another way: + +1. Install Node `>=22.0.0` (`nvm install 22`, `fnm install 22`, or from + [nodejs.org](https://nodejs.org)). +2. Install pnpm `>=10.0.0` (`corepack enable pnpm`, or `npm install -g + pnpm@10`). +3. Clone and build: + + ```bash + git clone https://github.com/theagenticguy/opencodehub + cd opencodehub + pnpm install --frozen-lockfile + pnpm -r build + ``` + +### From npm + +Global npm distribution of `codehub` is not yet published. For now, run +the CLI from a cloned checkout using `node packages/cli/dist/index.js`. +A published `@opencodehub/cli` package is planned. + +## Verify the install + +After `pnpm -r build` finishes, the CLI entrypoint at +`packages/cli/dist/index.js` should print its help text: + +```bash title="verify the CLI is runnable" +node packages/cli/dist/index.js --help +``` + +Then probe your environment: + +```bash title="probe the dev environment" +node packages/cli/dist/index.js doctor +``` + +`codehub doctor` checks your Node version, pnpm version, native module +bindings for tree-sitter and DuckDB, and writable paths in `~/.codehub/` +and `.codehub/`. It exits non-zero if anything looks off. + +## Next + +- [Quick start](/opencodehub/start-here/quick-start/) — index this + repository and run your first MCP call in 5 steps. +- [Your first query](/opencodehub/start-here/first-query/) — walk + through `query`, `context`, and `impact`. diff --git a/packages/docs/src/content/docs/start-here/quick-start.md b/packages/docs/src/content/docs/start-here/quick-start.md new file mode 100644 index 00000000..412fb3e4 --- /dev/null +++ b/packages/docs/src/content/docs/start-here/quick-start.md @@ -0,0 +1,84 @@ +--- +title: Quick start +description: Five steps from clone to an agent calling impact over MCP. +sidebar: + order: 30 +--- + +Five steps from zero to an agent asking the graph for blast radius. + +## 1. Clone + +```bash title="clone the repo" +git clone https://github.com/theagenticguy/opencodehub +cd opencodehub +``` + +## 2. Install toolchain and build + +```bash title="install toolchain, deps, and build" +mise install +pnpm install --frozen-lockfile +pnpm -r build +``` + +See [Install](/opencodehub/start-here/install/) for the non-mise path. + +## 3. Wire the MCP server into your editor + +```bash title="wire Claude Code's .mcp.json to the codehub MCP server" +node packages/cli/dist/index.js setup --editors claude-code +``` + +`setup` writes an `mcpServers.codehub` entry into `/.mcp.json` +for Claude Code. Pass a comma-separated list to `--editors` for +multiple editors at once (`claude-code,cursor,codex,windsurf,opencode`). +The default is all supported editors. + +## 4. Analyze the current repo + +```bash title="run the full indexing pipeline" +node packages/cli/dist/index.js analyze +``` + +`analyze` writes the graph to `.codehub/` under the repo root and +registers the repo in `~/.codehub/registry.json`. Add `--embeddings` to +compute semantic vectors for hybrid search, or `--offline` to guarantee +zero network sockets. + +## 5. Ask the agent + +Point your agent at the MCP server (Claude Code picks up `.mcp.json` +automatically on the next session). Then ask: + +> "Run `impact` on `validateUser` and tell me the blast radius." + +The MCP `impact` tool returns a structured response shaped like: + +```json title="impact response shape" +{ + "target": "validateUser", + "direct_callers": 14, + "affected_processes": 3, + "risk": "HIGH", + "next_steps": [ + "call context(validateUser) for caller sites", + "call detect_changes after staging edits" + ] +} +``` + +You can also invoke the same analysis directly from the CLI: + +```bash title="CLI equivalent" +node packages/cli/dist/index.js impact validateUser --depth 2 +``` + +## Where to next + +- [Your first query](/opencodehub/start-here/first-query/) walks through + `query`, `context`, and `impact` with sample output. +- [MCP tools](/opencodehub/mcp/tools/) lists all 28 tools the server + exposes. +- [Using with Claude Code](/opencodehub/guides/using-with-claude-code/) + covers the plugin path (PreToolUse hooks) and the MCP-only path. diff --git a/packages/docs/src/content/docs/start-here/what-is-opencodehub.md b/packages/docs/src/content/docs/start-here/what-is-opencodehub.md new file mode 100644 index 00000000..e9259894 --- /dev/null +++ b/packages/docs/src/content/docs/start-here/what-is-opencodehub.md @@ -0,0 +1,62 @@ +--- +title: What is OpenCodeHub? +description: Graph-first code intelligence for AI coding agents, exposed over the Model Context Protocol. +sidebar: + order: 10 +--- + +AI coding agents have a structural blind spot. They can read a file, but +they can't see the graph the file lives in. That blind spot produces +three failure modes every agent-driven workflow eventually hits: + +- **Missed dependencies.** The agent renames a function and leaves 14 + callers untouched, because `grep` found 3. +- **Broken call chains.** The agent changes a return shape, a handler + two hops downstream crashes at runtime, and neither the agent nor its + tests flag it. The relationship was never in context. +- **Blind edits.** The agent rewrites a critical-path function without + knowing it sits on the hot path of 8 production flows, because nothing + computed that ahead of time. + +Grep is textual. Language servers are per-file. Embeddings are lossy. +None of them answer the questions an agent needs answered *before* it +writes a diff: what breaks if I change this, what depends on this, and +where does this data flow. + +## The graph-first approach + +OpenCodeHub parses your repository with tree-sitter (and SCIP indexers +for TypeScript, Python, Go, Rust, and Java), resolves imports and +inheritance, and materialises a **typed symbol graph**. That graph is +stored in an embedded DuckDB database with BM25 lexical search and +filter-aware HNSW vector search side by side. A local MCP server +exposes the graph to any agent that speaks Model Context Protocol. + +```mermaid +flowchart LR + A[Source tree] -->|tree-sitter parse| B[Symbol graph] + B -->|resolve imports and MRO| C[Typed relations] + C -->|BM25 plus HNSW index| D[Hybrid graph store] + C -->|detect communities and flows| E[Processes and clusters] + D --> F[MCP server] + E --> F + F -->|28 tools| G[AI coding agent] +``` + +Clustering, execution-flow tracing, and blast-radius analysis all happen +once at index time. Agents get complete relational context in one tool +call, not ten round-trips. + +## When to reach for OpenCodeHub + +- **Non-trivial refactors.** Rename a function, change a return shape, + or move a module and let the agent see every caller before it edits. +- **Cross-file changes.** Any diff that touches more than one file and + crosses a module boundary. +- **Blast-radius questions.** "What processes depend on `validateUser`? + What is the risk tier of this change?" +- **Onboarding to a new repo.** Ask the graph for the top clusters, + HTTP routes, or authentication flow before the first edit. + +Next, [install the CLI](/opencodehub/start-here/install/) and run your +[first query](/opencodehub/start-here/first-query/). diff --git a/packages/docs/src/styles/custom.css b/packages/docs/src/styles/custom.css new file mode 100644 index 00000000..f621b278 --- /dev/null +++ b/packages/docs/src/styles/custom.css @@ -0,0 +1,11 @@ +/* OpenCodeHub Starlight overrides — kept minimal so defaults carry. */ + +:root { + --sl-font: system-ui, -apple-system, "Segoe UI", Roboto, sans-serif; + --sl-font-mono: "JetBrains Mono", ui-monospace, SFMono-Regular, Menlo, monospace; +} + +/* Tighten code block line-height for denser tool tables. */ +.expressive-code pre { + line-height: 1.5; +} diff --git a/packages/docs/tsconfig.json b/packages/docs/tsconfig.json new file mode 100644 index 00000000..8bf91d3b --- /dev/null +++ b/packages/docs/tsconfig.json @@ -0,0 +1,5 @@ +{ + "extends": "astro/tsconfigs/strict", + "include": [".astro/types.d.ts", "**/*"], + "exclude": ["dist"] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e34c79fe..b2d34150 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -156,6 +156,18 @@ importers: specifier: 6.0.3 version: 6.0.3 + packages/docs: + dependencies: + '@astrojs/starlight': + specifier: ^0.38.4 + version: 0.38.4(astro@6.1.9(@types/node@24.12.2)(jiti@2.4.1)(rollup@4.60.2)(tsx@4.21.0)(typescript@6.0.3)(yaml@2.8.3)) + astro: + specifier: ^6.1.9 + version: 6.1.9(@types/node@24.12.2)(jiti@2.4.1)(rollup@4.60.2)(tsx@4.21.0)(typescript@6.0.3)(yaml@2.8.3) + sharp: + specifier: ^0.34.1 + version: 0.34.1 + packages/embedder: dependencies: '@huggingface/tokenizers': @@ -485,6 +497,37 @@ packages: '@arcanis/slice-ansi@1.1.1': resolution: {integrity: sha512-xguP2WR2Dv0gQ7Ykbdb7BNCnPnIPB94uTi0Z2NvkRBEnhbwjOQ7QyQKJXrVQg4qDpiD9hA5l5cCwy/z2OXgc3w==} + '@astrojs/compiler@3.0.1': + resolution: {integrity: sha512-z97oYbdebO5aoWzuJ/8q5hLK232+17KcLZ7cJ8BCWk6+qNzVxn/gftC0KzMBUTD8WAaBkPpNSQK6PXLnNrZ0CA==} + + '@astrojs/internal-helpers@0.9.0': + resolution: {integrity: sha512-GdYkzR26re8izmyYlBqf4z2s7zNngmWLFuxw0UKiPNqHraZGS6GKWIwSHgS22RDlu2ePFJ8bzmpBcUszut/SDg==} + + '@astrojs/markdown-remark@7.1.1': + resolution: {integrity: sha512-C6e9BnLGlbdv6bV8MYGeHpHxsUHrCrB4OuRLqi5LI7oiBVcBcqfUN06zpwFQdHgV48QCCrMmLpyqBr7VqC+swA==} + + '@astrojs/mdx@5.0.4': + resolution: {integrity: sha512-tSbuuYueNODiFAFaME7pjHY5lOLoxBYJi1cKd6scw9+a4ZO7C7UGdafEoVAQvOV2eO8a6RaHSAJYGVPL1w8BPA==} + engines: {node: '>=22.12.0'} + peerDependencies: + astro: ^6.0.0 + + '@astrojs/prism@4.0.1': + resolution: {integrity: sha512-nksZQVjlferuWzhPsBpQ1JE5XuKAf1id1/9Hj4a9KG4+ofrlzxUUwX4YGQF/SuDiuiGKEnzopGOt38F3AnVWsQ==} + engines: {node: '>=22.12.0'} + + '@astrojs/sitemap@3.7.2': + resolution: {integrity: sha512-PqkzkcZTb5ICiyIR8VoKbIAP/laNRXi5tw616N1Ckk+40oNB8Can1AzVV56lrbC5GKSZFCyJYUVYqVivMisvpA==} + + '@astrojs/starlight@0.38.4': + resolution: {integrity: sha512-TGFIr2aVC+gcZCPQzJOO4ZnA/yL3jRnsUDcKlVdEhxhxaOQnWr9lZ9MRScg9zU6uh3HVeZAmmjkLCdTlHdcaZA==} + peerDependencies: + astro: ^6.0.0 + + '@astrojs/telemetry@3.3.1': + resolution: {integrity: sha512-7fcIxXS9J4ls5tr8b3ww9rbAIz2+HrhNJYZdkAhhB4za/I5IZ/60g+Bs8q7zwG0tOIZfNB4JWhVJ1Qkl/OrNCw==} + engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0} + '@aws-crypto/crc32@5.2.0': resolution: {integrity: sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==} engines: {node: '>=16.0.0'} @@ -634,10 +677,27 @@ packages: resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.28.5': resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} engines: {node: '>=6.9.0'} + '@babel/parser@7.29.2': + resolution: {integrity: sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/runtime@7.29.2': + resolution: {integrity: sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.29.0': + resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} + engines: {node: '>=6.9.0'} + '@biomejs/biome@2.4.12': resolution: {integrity: sha512-Rro7adQl3NLq/zJCIL98eElXKI8eEiBtoeu5TbXF/U3qbjuSc7Jb5rjUbeHHcquDWeSf3HnGP7XI5qGrlRk/pA==} engines: {node: '>=14.21.3'} @@ -698,6 +758,16 @@ packages: '@bufbuild/protobuf@2.11.0': resolution: {integrity: sha512-sBXGT13cpmPR5BMgHE6UEEfEaShh5Ror6rfN3yEK5si7QVrtZg8LEPQb0VVhiLRUslD2yLnXtnRzG035J/mZXQ==} + '@capsizecss/unpack@4.0.0': + resolution: {integrity: sha512-VERIM64vtTP1C4mxQ5thVT9fK0apjPFobqybMtA1UdUujWka24ERHbRHFGmpbbhp73MhV+KSsHQH9C6uOTdEQA==} + engines: {node: '>=18'} + + '@clack/core@1.2.0': + resolution: {integrity: sha512-qfxof/3T3t9DPU/Rj3OmcFyZInceqj/NVtO9rwIuJqCUgh32gwPjpFQQp/ben07qKlhpwq7GzfWpST4qdJ5Drg==} + + '@clack/prompts@1.2.0': + resolution: {integrity: sha512-4jmztR9fMqPMjz6H/UZXj0zEmE43ha1euENwkckKKel4XpSfokExPo5AiVStdHSAlHekz4d0CA/r45Ok1E4D3w==} + '@colors/colors@1.5.0': resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} engines: {node: '>=0.1.90'} @@ -803,6 +873,10 @@ packages: conventional-commits-parser: optional: true + '@ctrl/tinycolor@4.2.0': + resolution: {integrity: sha512-kzyuwOAQnXJNLS9PSyrk0CWk35nWJW/zl/6KvnTBMFK65gm7U1/Z5BqjxeapjZCIhQcM/DsrEmcbRwDyXyXK4A==} + engines: {node: '>=14'} + '@cyclonedx/cyclonedx-library@10.0.0': resolution: {integrity: sha512-xDXf2eqzeFHdjamj6oBV3duRSfrlmsJ5+2z9tXp7q5qxJP5Awmjf4ABSutS4qkVHHj7JzKFL/EM0V0Nihc7zPg==} engines: {node: '>=20.18.0'} @@ -866,6 +940,9 @@ packages: '@duckdb/node-bindings@1.5.2-r.1': resolution: {integrity: sha512-bUg3bLVj70YVku6fKyQJS8ASORl7kM7YFVFznsEB9pWbtazPj+ME2x2FUk0WiTzjJdutjzSSGXF066mB4bGGZA==} + '@emnapi/runtime@1.10.0': + resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} + '@esbuild/aix-ppc64@0.27.7': resolution: {integrity: sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==} engines: {node: '>=18'} @@ -1022,6 +1099,18 @@ packages: cpu: [x64] os: [win32] + '@expressive-code/core@0.41.7': + resolution: {integrity: sha512-ck92uZYZ9Wba2zxkiZLsZGi9N54pMSAVdrI9uW3Oo9AtLglD5RmrdTwbYPCT2S/jC36JGB2i+pnQtBm/Ib2+dg==} + + '@expressive-code/plugin-frames@0.41.7': + resolution: {integrity: sha512-diKtxjQw/979cTglRFaMCY/sR6hWF0kSMg8jsKLXaZBSfGS0I/Hoe7Qds3vVEgeoW+GHHQzMcwvgx/MOIXhrTA==} + + '@expressive-code/plugin-shiki@0.41.7': + resolution: {integrity: sha512-DL605bLrUOgqTdZ0Ot5MlTaWzppRkzzqzeGEu7ODnHF39IkEBbFdsC7pbl3LbUQ1DFtnfx6rD54k/cdofbW6KQ==} + + '@expressive-code/plugin-text-markers@0.41.7': + resolution: {integrity: sha512-Ewpwuc5t6eFdZmWlFyeuy3e1PTQC0jFvw2Q+2bpcWXbOZhPLsT7+h8lsSIJxb5mS7wZko7cKyQ2RLYDyK6Fpmw==} + '@graphty/algorithms@1.7.1': resolution: {integrity: sha512-D9oH+xUHVUTKZDE4voxQ/QAa3LBcMfktvOhnVr8DueOYuFb2dx6s5wZIgvWhg1iD8+mAuJyfczgnAqvcvOznPg==} engines: {node: '>=18.19.0'} @@ -1041,6 +1130,129 @@ packages: '@iarna/toml@2.2.5': resolution: {integrity: sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==} + '@img/sharp-darwin-arm64@0.34.1': + resolution: {integrity: sha512-pn44xgBtgpEbZsu+lWf2KNb6OAf70X68k+yk69Ic2Xz11zHR/w24/U49XT7AeRwJ0Px+mhALhU5LPci1Aymk7A==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [darwin] + + '@img/sharp-darwin-x64@0.34.1': + resolution: {integrity: sha512-VfuYgG2r8BpYiOUN+BfYeFo69nP/MIwAtSJ7/Zpxc5QF3KS22z8Pvg3FkrSFJBPNQ7mmcUcYQFBmEQp7eu1F8Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-darwin-arm64@1.1.0': + resolution: {integrity: sha512-HZ/JUmPwrJSoM4DIQPv/BfNh9yrOA8tlBbqbLz4JZ5uew2+o22Ik+tHQJcih7QJuSa0zo5coHTfD5J8inqj9DA==} + cpu: [arm64] + os: [darwin] + + '@img/sharp-libvips-darwin-x64@1.1.0': + resolution: {integrity: sha512-Xzc2ToEmHN+hfvsl9wja0RlnXEgpKNmftriQp6XzY/RaSfwD9th+MSh0WQKzUreLKKINb3afirxW7A0fz2YWuQ==} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-linux-arm64@1.1.0': + resolution: {integrity: sha512-IVfGJa7gjChDET1dK9SekxFFdflarnUB8PwW8aGwEoF3oAsSDuNUTYS+SKDOyOJxQyDC1aPFMuRYLoDInyV9Ew==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-arm@1.1.0': + resolution: {integrity: sha512-s8BAd0lwUIvYCJyRdFqvsj+BJIpDBSxs6ivrOPm/R7piTs5UIwY5OjXrP2bqXC9/moGsyRa37eYWYCOGVXxVrA==} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-ppc64@1.1.0': + resolution: {integrity: sha512-tiXxFZFbhnkWE2LA8oQj7KYR+bWBkiV2nilRldT7bqoEZ4HiDOcePr9wVDAZPi/Id5fT1oY9iGnDq20cwUz8lQ==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-s390x@1.1.0': + resolution: {integrity: sha512-xukSwvhguw7COyzvmjydRb3x/09+21HykyapcZchiCUkTThEQEOMtBj9UhkaBRLuBrgLFzQ2wbxdeCCJW/jgJA==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-x64@1.1.0': + resolution: {integrity: sha512-yRj2+reB8iMg9W5sULM3S74jVS7zqSzHG3Ol/twnAAkAhnGQnpjj6e4ayUz7V+FpKypwgs82xbRdYtchTTUB+Q==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linuxmusl-arm64@1.1.0': + resolution: {integrity: sha512-jYZdG+whg0MDK+q2COKbYidaqW/WTz0cc1E+tMAusiDygrM4ypmSCjOJPmFTvHHJ8j/6cAGyeDWZOsK06tP33w==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@img/sharp-libvips-linuxmusl-x64@1.1.0': + resolution: {integrity: sha512-wK7SBdwrAiycjXdkPnGCPLjYb9lD4l6Ze2gSdAGVZrEL05AOUJESWU2lhlC+Ffn5/G+VKuSm6zzbQSzFX/P65A==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@img/sharp-linux-arm64@0.34.1': + resolution: {integrity: sha512-kX2c+vbvaXC6vly1RDf/IWNXxrlxLNpBVWkdpRq5Ka7OOKj6nr66etKy2IENf6FtOgklkg9ZdGpEu9kwdlcwOQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-arm@0.34.1': + resolution: {integrity: sha512-anKiszvACti2sGy9CirTlNyk7BjjZPiML1jt2ZkTdcvpLU1YH6CXwRAZCA2UmRXnhiIftXQ7+Oh62Ji25W72jA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-s390x@0.34.1': + resolution: {integrity: sha512-7s0KX2tI9mZI2buRipKIw2X1ufdTeaRgwmRabt5bi9chYfhur+/C1OXg3TKg/eag1W+6CCWLVmSauV1owmRPxA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-x64@0.34.1': + resolution: {integrity: sha512-wExv7SH9nmoBW3Wr2gvQopX1k8q2g5V5Iag8Zk6AVENsjwd+3adjwxtp3Dcu2QhOXr8W9NusBU6XcQUohBZ5MA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@img/sharp-linuxmusl-arm64@0.34.1': + resolution: {integrity: sha512-DfvyxzHxw4WGdPiTF0SOHnm11Xv4aQexvqhRDAoD00MzHekAj9a/jADXeXYCDFH/DzYruwHbXU7uz+H+nWmSOQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@img/sharp-linuxmusl-x64@0.34.1': + resolution: {integrity: sha512-pax/kTR407vNb9qaSIiWVnQplPcGU8LRIJpDT5o8PdAx5aAA7AS3X9PS8Isw1/WfqgQorPotjrZL3Pqh6C5EBg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@img/sharp-wasm32@0.34.1': + resolution: {integrity: sha512-YDybQnYrLQfEpzGOQe7OKcyLUCML4YOXl428gOOzBgN6Gw0rv8dpsJ7PqTHxBnXnwXr8S1mYFSLSa727tpz0xg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [wasm32] + + '@img/sharp-win32-ia32@0.34.1': + resolution: {integrity: sha512-WKf/NAZITnonBf3U1LfdjoMgNO5JYRSlhovhRhMxXVdvWYveM4kM3L8m35onYIdh75cOMCo1BexgVQcCDzyoWw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ia32] + os: [win32] + + '@img/sharp-win32-x64@0.34.1': + resolution: {integrity: sha512-hw1iIAHpNE8q3uMIRCgGOeDoz9KtFNarFLQclLxr/LK1VBkj8nby18RjFvr6aP7USRYAjTZW6yisnBWMX571Tw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [win32] + '@inquirer/ansi@1.0.2': resolution: {integrity: sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==} engines: {node: '>=18'} @@ -1196,12 +1408,18 @@ packages: resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} engines: {node: '>=18.0.0'} + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + '@kwsites/file-exists@1.1.1': resolution: {integrity: sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==} '@kwsites/promise-deferred@1.1.1': resolution: {integrity: sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==} + '@mdx-js/mdx@3.1.1': + resolution: {integrity: sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==} + '@modelcontextprotocol/sdk@1.29.0': resolution: {integrity: sha512-zo37mZA9hJWpULgkRpowewez1y6ML5GsXJPY8FI0tBBCd77HEvza4jDqRKOXgHNn867PVGCyTdzqpz0izu5ZjQ==} engines: {node: '>=18'} @@ -1344,6 +1562,47 @@ packages: resolution: {integrity: sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + '@oslojs/encoding@1.1.0': + resolution: {integrity: sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==} + + '@pagefind/darwin-arm64@1.5.2': + resolution: {integrity: sha512-MXpI+7HsAdPkvJ0gk9xj9g541BCqBZOBbdwj9g6lB5LCj6kSV6nqDSjzcAJwvOsfu0fjwvC8hQU+ecfhp+MpiQ==} + cpu: [arm64] + os: [darwin] + + '@pagefind/darwin-x64@1.5.2': + resolution: {integrity: sha512-IojxFWMEJe0RQ7PQ3KXQsPIImNsbpPYpoZ+QUDrL8fAl/O27IX+LVLs74/UzEZy5uA2LD8Nz1AiwKr72vrkZQw==} + cpu: [x64] + os: [darwin] + + '@pagefind/default-ui@1.5.2': + resolution: {integrity: sha512-pm1LMnQg8N2B3n2TnjKlhaFihpz6zTiA4HiGQ6/slKO/+8K9CAU5kcjdSSPgpuk1PMuuN4hxLipUIifnrkl3Sg==} + + '@pagefind/freebsd-x64@1.5.2': + resolution: {integrity: sha512-7EVzo9+0w+2cbe671BtMj10UlNo83I+HrLVLfRxO731svHRJKUfJ/mo05gU14pe9PCfpKNQT8FS3Xc/oDN6pOA==} + cpu: [x64] + os: [freebsd] + + '@pagefind/linux-arm64@1.5.2': + resolution: {integrity: sha512-Ovt9+K35sqzn8H3ZMXGwls4TD/wMJuvRtShHIsmUQREmaxjrDEX7gHckRCrwYJ4XE1H1p6HkLz3wukrAnsfXQw==} + cpu: [arm64] + os: [linux] + + '@pagefind/linux-x64@1.5.2': + resolution: {integrity: sha512-V+tFqHKXhQKq/WqPBD67AFy7scn1/aZID00ws4fSDd+1daSi5UHR9VVlRrOUYKxn3VuFQYRD7lYXdZK1WED1YA==} + cpu: [x64] + os: [linux] + + '@pagefind/windows-arm64@1.5.2': + resolution: {integrity: sha512-hN9Nh90fNW61nNRCW9ZyQrAj/mD0eRvmJ8NlTUzkbuW8kIzGJUi3cxjFkEcMZ5h/8FsKWD/VcouZl4yo1F7B6g==} + cpu: [arm64] + os: [win32] + + '@pagefind/windows-x64@1.5.2': + resolution: {integrity: sha512-Fa2Iyw7kaDRzGMfNYNUXNW2zbL5FQVDgSOcbDHdzBrDEdpqOqg8TcZ68F22ol6NJ9IGzvUdmeyZypLW5dyhqsg==} + cpu: [x64] + os: [win32] + '@pinojs/redact@0.4.0': resolution: {integrity: sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==} @@ -1359,9 +1618,205 @@ packages: resolution: {integrity: sha512-3MYHYm8epnciApn6w5Fzx6sepawmsNU7l6lvIq+ER22/DPSrr83YMhU/EQWnf4lORn2YyiXFj0FJSyJzEtIGmw==} engines: {node: '>=14.6'} + '@rollup/pluginutils@5.3.0': + resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/rollup-android-arm-eabi@4.60.2': + resolution: {integrity: sha512-dnlp69efPPg6Uaw2dVqzWRfAWRnYVb1XJ8CyyhIbZeaq4CA5/mLeZ1IEt9QqQxmbdvagjLIm2ZL8BxXv5lH4Yw==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.60.2': + resolution: {integrity: sha512-OqZTwDRDchGRHHm/hwLOL7uVPB9aUvI0am/eQuWMNyFHf5PSEQmyEeYYheA0EPPKUO/l0uigCp+iaTjoLjVoHg==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.60.2': + resolution: {integrity: sha512-UwRE7CGpvSVEQS8gUMBe1uADWjNnVgP3Iusyda1nSRwNDCsRjnGc7w6El6WLQsXmZTbLZx9cecegumcitNfpmA==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.60.2': + resolution: {integrity: sha512-gjEtURKLCC5VXm1I+2i1u9OhxFsKAQJKTVB8WvDAHF+oZlq0GTVFOlTlO1q3AlCTE/DF32c16ESvfgqR7343/g==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.60.2': + resolution: {integrity: sha512-Bcl6CYDeAgE70cqZaMojOi/eK63h5Me97ZqAQoh77VPjMysA/4ORQBRGo3rRy45x4MzVlU9uZxs8Uwy7ZaKnBw==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.60.2': + resolution: {integrity: sha512-LU+TPda3mAE2QB0/Hp5VyeKJivpC6+tlOXd1VMoXV/YFMvk/MNk5iXeBfB4MQGRWyOYVJ01625vjkr0Az98OJQ==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.60.2': + resolution: {integrity: sha512-2QxQrM+KQ7DAW4o22j+XZ6RKdxjLD7BOWTP0Bv0tmjdyhXSsr2Ul1oJDQqh9Zf5qOwTuTc7Ek83mOFaKnodPjg==} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm-musleabihf@4.60.2': + resolution: {integrity: sha512-TbziEu2DVsTEOPif2mKWkMeDMLoYjx95oESa9fkQQK7r/Orta0gnkcDpzwufEcAO2BLBsD7mZkXGFqEdMRRwfw==} + cpu: [arm] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-arm64-gnu@4.60.2': + resolution: {integrity: sha512-bO/rVDiDUuM2YfuCUwZ1t1cP+/yqjqz+Xf2VtkdppefuOFS2OSeAfgafaHNkFn0t02hEyXngZkxtGqXcXwO8Rg==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm64-musl@4.60.2': + resolution: {integrity: sha512-hr26p7e93Rl0Za+JwW7EAnwAvKkehh12BU1Llm9Ykiibg4uIr2rbpxG9WCf56GuvidlTG9KiiQT/TXT1yAWxTA==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-loong64-gnu@4.60.2': + resolution: {integrity: sha512-pOjB/uSIyDt+ow3k/RcLvUAOGpysT2phDn7TTUB3n75SlIgZzM6NKAqlErPhoFU+npgY3/n+2HYIQVbF70P9/A==} + cpu: [loong64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-loong64-musl@4.60.2': + resolution: {integrity: sha512-2/w+q8jszv9Ww1c+6uJT3OwqhdmGP2/4T17cu8WuwyUuuaCDDJ2ojdyYwZzCxx0GcsZBhzi3HmH+J5pZNXnd+Q==} + cpu: [loong64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-ppc64-gnu@4.60.2': + resolution: {integrity: sha512-11+aL5vKheYgczxtPVVRhdptAM2H7fcDR5Gw4/bTcteuZBlH4oP9f5s9zYO9aGZvoGeBpqXI/9TZZihZ609wKw==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-ppc64-musl@4.60.2': + resolution: {integrity: sha512-i16fokAGK46IVZuV8LIIwMdtqhin9hfYkCh8pf8iC3QU3LpwL+1FSFGej+O7l3E/AoknL6Dclh2oTdnRMpTzFQ==} + cpu: [ppc64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-riscv64-gnu@4.60.2': + resolution: {integrity: sha512-49FkKS6RGQoriDSK/6E2GkAsAuU5kETFCh7pG4yD/ylj9rKhTmO3elsnmBvRD4PgJPds5W2PkhC82aVwmUcJ7A==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-riscv64-musl@4.60.2': + resolution: {integrity: sha512-mjYNkHPfGpUR00DuM1ZZIgs64Hpf4bWcz9Z41+4Q+pgDx73UwWdAYyf6EG/lRFldmdHHzgrYyge5akFUW0D3mQ==} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-s390x-gnu@4.60.2': + resolution: {integrity: sha512-ALyvJz965BQk8E9Al/JDKKDLH2kfKFLTGMlgkAbbYtZuJt9LU8DW3ZoDMCtQpXAltZxwBHevXz5u+gf0yA0YoA==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-gnu@4.60.2': + resolution: {integrity: sha512-UQjrkIdWrKI626Du8lCQ6MJp/6V1LAo2bOK9OTu4mSn8GGXIkPXk/Vsp4bLHCd9Z9Iz2OTEaokUE90VweJgIYQ==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-musl@4.60.2': + resolution: {integrity: sha512-bTsRGj6VlSdn/XD4CGyzMnzaBs9bsRxy79eTqTCBsA8TMIEky7qg48aPkvJvFe1HyzQ5oMZdg7AnVlWQSKLTnw==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rollup/rollup-openbsd-x64@4.60.2': + resolution: {integrity: sha512-6d4Z3534xitaA1FcMWP7mQPq5zGwBmGbhphh2DwaA1aNIXUu3KTOfwrWpbwI4/Gr0uANo7NTtaykFyO2hPuFLg==} + cpu: [x64] + os: [openbsd] + + '@rollup/rollup-openharmony-arm64@4.60.2': + resolution: {integrity: sha512-NetAg5iO2uN7eB8zE5qrZ3CSil+7IJt4WDFLcC75Ymywq1VZVD6qJ6EvNLjZ3rEm6gB7XW5JdT60c6MN35Z85Q==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.60.2': + resolution: {integrity: sha512-NCYhOotpgWZ5kdxCZsv6Iudx0wX8980Q/oW4pNFNihpBKsDbEA1zpkfxJGC0yugsUuyDZ7gL37dbzwhR0VI7pQ==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.60.2': + resolution: {integrity: sha512-RXsaOqXxfoUBQoOgvmmijVxJnW2IGB0eoMO7F8FAjaj0UTywUO/luSqimWBJn04WNgUkeNhh7fs7pESXajWmkg==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.60.2': + resolution: {integrity: sha512-qdAzEULD+/hzObedtmV6iBpdL5TIbKVztGiK7O3/KYSf+HIzU257+MX1EXJcyIiDbMAqmbwaufcYPvyRryeZtA==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.60.2': + resolution: {integrity: sha512-Nd/SgG27WoA9e+/TdK74KnHz852TLa94ovOYySo/yMPuTmpckK/jIF2jSwS3g7ELSKXK13/cVdmg1Z/DaCWKxA==} + cpu: [x64] + os: [win32] + '@sec-ant/readable-stream@0.4.1': resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} + '@shikijs/core@3.23.0': + resolution: {integrity: sha512-NSWQz0riNb67xthdm5br6lAkvpDJRTgB36fxlo37ZzM2yq0PQFFzbd8psqC2XMPgCzo1fW6cVi18+ArJ44wqgA==} + + '@shikijs/core@4.0.2': + resolution: {integrity: sha512-hxT0YF4ExEqB8G/qFdtJvpmHXBYJ2lWW7qTHDarVkIudPFE6iCIrqdgWxGn5s+ppkGXI0aEGlibI0PAyzP3zlw==} + engines: {node: '>=20'} + + '@shikijs/engine-javascript@3.23.0': + resolution: {integrity: sha512-aHt9eiGFobmWR5uqJUViySI1bHMqrAgamWE1TYSUoftkAeCCAiGawPMwM+VCadylQtF4V3VNOZ5LmfItH5f3yA==} + + '@shikijs/engine-javascript@4.0.2': + resolution: {integrity: sha512-7PW0Nm49DcoUIQEXlJhNNBHyoGMjalRETTCcjMqEaMoJRLljy1Bi/EGV3/qLBgLKQejdspiiYuHGQW6dX94Nag==} + engines: {node: '>=20'} + + '@shikijs/engine-oniguruma@3.23.0': + resolution: {integrity: sha512-1nWINwKXxKKLqPibT5f4pAFLej9oZzQTsby8942OTlsJzOBZ0MWKiwzMsd+jhzu8YPCHAswGnnN1YtQfirL35g==} + + '@shikijs/engine-oniguruma@4.0.2': + resolution: {integrity: sha512-UpCB9Y2sUKlS9z8juFSKz7ZtysmeXCgnRF0dlhXBkmQnek7lAToPte8DkxmEYGNTMii72zU/lyXiCB6StuZeJg==} + engines: {node: '>=20'} + + '@shikijs/langs@3.23.0': + resolution: {integrity: sha512-2Ep4W3Re5aB1/62RSYQInK9mM3HsLeB91cHqznAJMuylqjzNVAVCMnNWRHFtcNHXsoNRayP9z1qj4Sq3nMqYXg==} + + '@shikijs/langs@4.0.2': + resolution: {integrity: sha512-KaXby5dvoeuZzN0rYQiPMjFoUrz4hgwIE+D6Du9owcHcl6/g16/yT5BQxSW5cGt2MZBz6Hl0YuRqf12omRfUUg==} + engines: {node: '>=20'} + + '@shikijs/primitive@4.0.2': + resolution: {integrity: sha512-M6UMPrSa3fN5ayeJwFVl9qWofl273wtK1VG8ySDZ1mQBfhCpdd8nEx7nPZ/tk7k+TYcpqBZzj/AnwxT9lO+HJw==} + engines: {node: '>=20'} + + '@shikijs/themes@3.23.0': + resolution: {integrity: sha512-5qySYa1ZgAT18HR/ypENL9cUSGOeI2x+4IvYJu4JgVJdizn6kG4ia5Q1jDEOi7gTbN4RbuYtmHh0W3eccOrjMA==} + + '@shikijs/themes@4.0.2': + resolution: {integrity: sha512-mjCafwt8lJJaVSsQvNVrJumbnnj1RI8jbUKrPKgE6E3OvQKxnuRoBaYC51H4IGHePsGN/QtALglWBU7DoKDFnA==} + engines: {node: '>=20'} + + '@shikijs/types@3.23.0': + resolution: {integrity: sha512-3JZ5HXOZfYjsYSk0yPwBrkupyYSLpAE26Qc0HLghhZNGTZg/SKxXIIgoxOpmmeQP0RRSDJTk1/vPfw9tbw+jSQ==} + + '@shikijs/types@4.0.2': + resolution: {integrity: sha512-qzbeRooUTPnLE+sHD/Z8DStmaDgnbbc/pMrU203950aRqjX/6AFHeDYT+j00y2lPdz0ywJKx7o/7qnqTivtlXg==} + engines: {node: '>=20'} + + '@shikijs/vscode-textmate@10.0.2': + resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} + '@simple-git/args-pathspec@1.0.3': resolution: {integrity: sha512-ngJMaHlsWDTfjyq9F3VIQ8b7NXbBLq5j9i5bJ6XLYtD6qlDXT7fdKY2KscWWUF8t18xx052Y/PUO1K1TRc9yKA==} @@ -1595,18 +2050,45 @@ packages: '@types/conventional-commits-parser@5.0.1': resolution: {integrity: sha512-7uz5EHdzz2TqoMfV7ee61Egf5y6NkcO4FB/1iCCQnbeiI1F3xzv3vK5dBCXUCLQgGYS+mUeigK1iKQzvED+QnQ==} + '@types/debug@4.1.13': + resolution: {integrity: sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==} + '@types/emscripten@1.41.5': resolution: {integrity: sha512-cMQm7pxu6BxtHyqJ7mQZ2kXWV5SLmugybFdHCBbJ5eHzOo6VhBckEgAT3//rP5FwPHNPeEiq4SmQ5ucBwsOo4Q==} + '@types/estree-jsx@1.0.5': + resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/hast@3.0.4': + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + '@types/http-cache-semantics@4.2.0': resolution: {integrity: sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==} + '@types/js-yaml@4.0.9': + resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==} + '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} '@types/keyv@3.1.4': resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + + '@types/mdx@2.0.13': + resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==} + + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + + '@types/nlcst@2.0.3': + resolution: {integrity: sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==} + '@types/node@24.12.2': resolution: {integrity: sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g==} @@ -1616,6 +2098,9 @@ packages: '@types/sarif@2.1.7': resolution: {integrity: sha512-kRz0VEkJqWLf1LLVN4pT1cg1Z9wAuvI6L97V3m2f5B76Tg8d413ddvLBPTEHAZJlnn4XSvu0FkZtViCQGVyrXQ==} + '@types/sax@1.2.7': + resolution: {integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==} + '@types/semver@7.7.1': resolution: {integrity: sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==} @@ -1625,12 +2110,21 @@ packages: '@types/treeify@1.0.3': resolution: {integrity: sha512-hx0o7zWEUU4R2Amn+pjCBQQt23Khy/Dk56gQU5xi5jtPL1h83ACJCeFaB2M/+WO1AntvWrSoVnnCAfI1AQH4Cg==} + '@types/unist@2.0.11': + resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} + + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + '@types/uuid@10.0.0': resolution: {integrity: sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==} '@types/write-file-atomic@4.0.3': resolution: {integrity: sha512-qdo+vZRchyJIHNeuI1nrpsLw+hnkgqP/8mlaN6Wle/NKhydHmUN9l4p3ZE8yP90AJNJW4uB8HQhedb4f1vNayQ==} + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + '@yarnpkg/core@4.6.0': resolution: {integrity: sha512-yzJwS9dHKLY8y81BYEC0CEB+6ajWhjHkzBRzV39y7ANIdDiGC7sC32RSHWYGi/pxhbjPKeOhksj+gITUHUjS7A==} engines: {node: '>=18.12.0'} @@ -1665,9 +2159,19 @@ packages: resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} engines: {node: '>= 0.6'} - adm-zip@0.5.16: - resolution: {integrity: sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ==} - engines: {node: '>=12.0'} + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.16.0: + resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} + engines: {node: '>=0.4.0'} + hasBin: true + + adm-zip@0.5.16: + resolution: {integrity: sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ==} + engines: {node: '>=12.0'} aggregate-error@3.1.0: resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} @@ -1728,9 +2232,20 @@ packages: resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} engines: {node: '>=12'} + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + aria-query@5.3.2: + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} + engines: {node: '>= 0.4'} + array-find-index@1.0.2: resolution: {integrity: sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==} engines: {node: '>=0.10.0'} @@ -1738,6 +2253,23 @@ packages: array-ify@1.0.0: resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} + array-iterate@2.0.1: + resolution: {integrity: sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==} + + astring@1.9.0: + resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==} + hasBin: true + + astro-expressive-code@0.41.7: + resolution: {integrity: sha512-hUpogGc6DdAd+I7pPXsctyYPRBJDK7Q7d06s4cyP0Vz3OcbziP3FNzN0jZci1BpCvLn9675DvS7B9ctKKX64JQ==} + peerDependencies: + astro: ^4.0.0-beta || ^5.0.0-beta || ^3.3.0 || ^6.0.0-beta + + astro@6.1.9: + resolution: {integrity: sha512-NsAHzMzpznB281g2aM5qnBt2QjfH6ttKiZ3hSZw52If8JJ+62kbnBKbyKhR2glQcJLl7Jfe4GSl0DihFZ36rRQ==} + engines: {node: '>=22.12.0', npm: '>=9.6.5', pnpm: '>=7.1.0'} + hasBin: true + async@3.2.6: resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} @@ -1749,6 +2281,13 @@ packages: resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} engines: {node: '>=8.0.0'} + axobject-query@4.1.0: + resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} + engines: {node: '>= 0.4'} + + bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -1759,6 +2298,12 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + bcp-47-match@2.0.3: + resolution: {integrity: sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==} + + bcp-47@2.1.0: + resolution: {integrity: sha512-9IIS3UPrvIa1Ej+lVDdDwO7zLehjqsaByECw0bu2RRGP73jALm6FYbzI5gWbgHLvNdkvfXB5YrSbocZdOS0c0w==} + bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} @@ -1766,6 +2311,9 @@ packages: resolution: {integrity: sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==} engines: {node: '>=18'} + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + boolean@3.2.0: resolution: {integrity: sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==} deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. @@ -1830,6 +2378,9 @@ packages: resolution: {integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==} engines: {node: '>=16'} + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} @@ -1846,12 +2397,28 @@ packages: resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + + character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + + character-reference-invalid@2.0.1: + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + chardet@0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} chardet@2.1.1: resolution: {integrity: sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==} + chokidar@5.0.0: + resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} + engines: {node: '>= 20.19.0'} + chownr@1.1.4: resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} @@ -1915,9 +2482,16 @@ packages: resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} engines: {node: '>=0.8'} + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + code-block-writer@13.0.3: resolution: {integrity: sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==} + collapse-white-space@2.1.0: + resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==} + color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} @@ -1931,12 +2505,26 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + color-string@1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + + color@4.2.3: + resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} + engines: {node: '>=12.5.0'} + colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + command-exists@1.2.9: resolution: {integrity: sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==} + commander@11.1.0: + resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} + engines: {node: '>=16'} + commander@14.0.3: resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} engines: {node: '>=20'} @@ -1949,6 +2537,10 @@ packages: engines: {node: '>= 12'} hasBin: true + common-ancestor-path@2.0.0: + resolution: {integrity: sha512-dnN3ibLeoRf2HNC+OlCiNc5d2zxbLJXOtiZUudNFSXZrNSydxcCsSpRzXwfu7BBWCIfHPw+xTayeBvJCP/D8Ng==} + engines: {node: '>= 18'} + compare-func@2.0.0: resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} @@ -1979,6 +2571,9 @@ packages: engines: {node: '>=18'} hasBin: true + cookie-es@1.2.3: + resolution: {integrity: sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw==} + cookie-signature@1.2.2: resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} engines: {node: '>=6.6.0'} @@ -1987,6 +2582,10 @@ packages: resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} engines: {node: '>= 0.6'} + cookie@1.1.1: + resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==} + engines: {node: '>=18'} + cors@2.8.6: resolution: {integrity: sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==} engines: {node: '>= 0.10'} @@ -2021,6 +2620,36 @@ packages: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} + crossws@0.3.5: + resolution: {integrity: sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==} + + css-select@5.2.2: + resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==} + + css-selector-parser@3.3.0: + resolution: {integrity: sha512-Y2asgMGFqJKF4fq4xHDSlFYIkeVfRsm69lQC1q9kbEsH5XtnINTMrweLkjYMeaUgiXBy/uvKeO/a1JHTNnmB2g==} + + css-tree@2.2.1: + resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + + css-tree@3.2.1: + resolution: {integrity: sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + + css-what@6.2.2: + resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==} + engines: {node: '>= 6'} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + csso@5.0.5: + resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + cz-conventional-changelog@3.3.0: resolution: {integrity: sha512-U466fIzU5U22eES5lTNiNbZ+d8dfcHcssH4o7QsdWaCcRs/feIPCxKYSWkYBNs5mny7MvEfwpTLWjvbm94hecw==} engines: {node: '>= 10'} @@ -2037,6 +2666,9 @@ packages: supports-color: optional: true + decode-named-character-reference@1.3.0: + resolution: {integrity: sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==} + decompress-response@6.0.0: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} engines: {node: '>=10'} @@ -2063,6 +2695,9 @@ packages: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} + defu@6.1.7: + resolution: {integrity: sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==} + depd@2.0.0: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} @@ -2071,6 +2706,13 @@ packages: resolution: {integrity: sha512-S0OhIK7sIyAsph8hVH/LMCTDL3jozKtlrPx3dMQrlE2nAlXTquTT+AcOufphDMTQqLkfn4acvfiem9I1IWZ4jQ==} engines: {node: '>=14.6'} + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + destr@2.0.5: + resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} + detect-file@1.0.0: resolution: {integrity: sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==} engines: {node: '>=0.10.0'} @@ -2086,13 +2728,43 @@ packages: detect-node@2.1.0: resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} + devalue@5.7.1: + resolution: {integrity: sha512-MUbZ586EgQqdRnC4yDrlod3BEdyvE4TapGYHMW2CiaW+KkkFmWEFqBUaLltEZCGi0iFXCEjRF0OjF0DV2QHjOA==} + + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + diff@5.2.2: resolution: {integrity: sha512-vtcDfH3TOjP8UekytvnHH1o1P4FcUdt4eQ1Y+Abap1tk/OB2MWQvcwS2ClCd1zuIhc3JKOx6p3kod8Vfys3E+A==} engines: {node: '>=0.3.1'} + diff@8.0.4: + resolution: {integrity: sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==} + engines: {node: '>=0.3.1'} + + direction@2.0.1: + resolution: {integrity: sha512-9S6m9Sukh1cZNknO1CWAr2QAWsbKLafQiyM5gZ7VgXHeuaoUwffKN4q6NC4A/Mf9iiPlOXQEKW/Mv/mh9/3YFA==} + hasBin: true + discontinuous-range@1.0.0: resolution: {integrity: sha512-c68LpLbO+7kP/b1Hr1qs8/BJ09F5khZGTxqxZuhzxpmwJKOgRFHJWIb9/KmqnqHhLdO55aOxFH/EGBvUQbL/RQ==} + dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + + dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + + domutils@3.2.2: + resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} + dot-prop@5.3.0: resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} engines: {node: '>=8'} @@ -2101,6 +2773,10 @@ packages: resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} engines: {node: '>=12'} + dset@3.1.4: + resolution: {integrity: sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==} + engines: {node: '>=4'} + dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} @@ -2131,6 +2807,14 @@ packages: end-of-stream@1.4.5: resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + entities@6.0.1: + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} + engines: {node: '>=0.12'} + env-paths@2.2.1: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} @@ -2155,6 +2839,9 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} + es-module-lexer@2.0.0: + resolution: {integrity: sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==} + es-object-atoms@1.1.1: resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} engines: {node: '>= 0.4'} @@ -2165,6 +2852,12 @@ packages: es6-error@4.1.1: resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} + esast-util-from-estree@2.0.0: + resolution: {integrity: sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==} + + esast-util-from-js@2.0.1: + resolution: {integrity: sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==} + esbuild@0.27.7: resolution: {integrity: sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==} engines: {node: '>=18'} @@ -2185,6 +2878,34 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + + estree-util-attach-comments@3.0.0: + resolution: {integrity: sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==} + + estree-util-build-jsx@3.0.1: + resolution: {integrity: sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==} + + estree-util-is-identifier-name@3.0.0: + resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} + + estree-util-scope@1.0.0: + resolution: {integrity: sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==} + + estree-util-to-js@2.0.0: + resolution: {integrity: sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==} + + estree-util-visit@2.0.0: + resolution: {integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + etag@1.8.1: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} @@ -2229,6 +2950,9 @@ packages: resolution: {integrity: sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==} engines: {node: '>= 18'} + expressive-code@0.41.7: + resolution: {integrity: sha512-2wZjC8OQ3TaVEMcBtYY4Va3lo6J+Ai9jf3d4dbhURMJcU4Pbqe6EcHe424MIZI0VHUA1bR6xdpoHYi3yxokWqA==} + extend-shallow@2.0.1: resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} engines: {node: '>=0.10.0'} @@ -2253,9 +2977,18 @@ packages: fast-safe-stringify@2.1.1: resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + fast-string-truncated-width@1.2.1: + resolution: {integrity: sha512-Q9acT/+Uu3GwGj+5w/zsGuQjh9O1TyywhIwAxHudtWrgF09nHOPrvTLhQevPbttcxjr/SNN7mJmfOw/B1bXgow==} + + fast-string-width@1.1.0: + resolution: {integrity: sha512-O3fwIVIH5gKB38QNbdg+3760ZmGz0SZMgvwJbA1b2TGXceKE6A2cOlfogh1iw8lr049zPyd7YADHy+B7U4W9bQ==} + fast-uri@3.1.0: resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} + fast-wrap-ansi@0.1.6: + resolution: {integrity: sha512-HlUwET7a5gqjURj70D5jl7aC3Zmy4weA1SHUfM0JFI0Ptq987NH2TwbBFLoERhfwk+E+eaq4EK3jXoT+R3yp3w==} + fast-xml-builder@1.1.5: resolution: {integrity: sha512-4TJn/8FKLeslLAH3dnohXqE3QSoxkhvaMzepOIZytwJXZO69Bfz0HBdDHzOTOon6G59Zrk6VQ2bEiv1t61rfkA==} @@ -2266,6 +2999,15 @@ packages: fastq@1.19.0: resolution: {integrity: sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==} + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + figures@3.2.0: resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} engines: {node: '>=8'} @@ -2292,6 +3034,17 @@ packages: resolution: {integrity: sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==} engines: {node: '>= 8'} + flattie@1.1.1: + resolution: {integrity: sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==} + engines: {node: '>=8'} + + fontace@0.4.1: + resolution: {integrity: sha512-lDMvbAzSnHmbYMTEld5qdtvNH2/pWpICOqpean9IgC7vUbUJc3k+k5Dokp85CegamqQpFbXf0rAVkbzpyTA8aw==} + + fontkitten@1.0.3: + resolution: {integrity: sha512-Wp1zXWPVUPBmfoa3Cqc9ctaKuzKAV6uLstRqlR56kSjplf5uAce+qeyYym7F+PHbGTk+tCEdkCW6RD7DX/gBZw==} + engines: {node: '>=20'} + foreground-child@3.3.1: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} @@ -2361,6 +3114,9 @@ packages: github-from-package@0.0.0: resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + github-slugger@2.0.0: + resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} + glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -2436,6 +3192,9 @@ packages: resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} engines: {node: '>=6.0'} + h3@1.15.11: + resolution: {integrity: sha512-L3THSe2MPeBwgIZVSH5zLdBBU90TOxarvhK9d04IDY2AmVS8j2Jz2LIWtwsGOU3lu2I5jCN7FNvVfY2+XyF+mg==} + handlebars@4.7.9: resolution: {integrity: sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ==} engines: {node: '>=0.4.7'} @@ -2460,6 +3219,66 @@ packages: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} + hast-util-embedded@3.0.0: + resolution: {integrity: sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA==} + + hast-util-format@1.1.0: + resolution: {integrity: sha512-yY1UDz6bC9rDvCWHpx12aIBGRG7krurX0p0Fm6pT547LwDIZZiNr8a+IHDogorAdreULSEzP82Nlv5SZkHZcjA==} + + hast-util-from-html@2.0.3: + resolution: {integrity: sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==} + + hast-util-from-parse5@8.0.3: + resolution: {integrity: sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==} + + hast-util-has-property@3.0.0: + resolution: {integrity: sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==} + + hast-util-is-body-ok-link@3.0.1: + resolution: {integrity: sha512-0qpnzOBLztXHbHQenVB8uNuxTnm/QBFUOmdOSsEn7GnBtyY07+ENTWVFBAnXd/zEgd9/SUG3lRY7hSIBWRgGpQ==} + + hast-util-is-element@3.0.0: + resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} + + hast-util-minify-whitespace@1.0.1: + resolution: {integrity: sha512-L96fPOVpnclQE0xzdWb/D12VT5FabA7SnZOUMtL1DbXmYiHJMXZvFkIZfiMmTCNJHUeO2K9UYNXoVyfz+QHuOw==} + + hast-util-parse-selector@4.0.0: + resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} + + hast-util-phrasing@3.0.1: + resolution: {integrity: sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ==} + + hast-util-raw@9.1.0: + resolution: {integrity: sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==} + + hast-util-select@6.0.4: + resolution: {integrity: sha512-RqGS1ZgI0MwxLaKLDxjprynNzINEkRHY2i8ln4DDjgv9ZhcYVIHN9rlpiYsqtFwrgpYU361SyWDQcGNIBVu3lw==} + + hast-util-to-estree@3.1.3: + resolution: {integrity: sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==} + + hast-util-to-html@9.0.5: + resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} + + hast-util-to-jsx-runtime@2.3.6: + resolution: {integrity: sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==} + + hast-util-to-parse5@8.0.1: + resolution: {integrity: sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==} + + hast-util-to-string@3.0.1: + resolution: {integrity: sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==} + + hast-util-to-text@4.0.2: + resolution: {integrity: sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==} + + hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + + hastscript@9.0.1: + resolution: {integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==} + help-me@5.0.0: resolution: {integrity: sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==} @@ -2479,6 +3298,15 @@ packages: resolution: {integrity: sha512-A91dYTeIB6NoXG+PxTQpCCDDnfHsW9kc06Lvpu1TEe9gnd6ZFeiBoRO9JvzEv6xK7EX97/dUE8g/vBMTqTS3CA==} engines: {node: '>=14'} + html-escaper@3.0.3: + resolution: {integrity: sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==} + + html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + + html-whitespace-sensitive-tag-names@3.0.1: + resolution: {integrity: sha512-q+310vW8zmymYHALr1da4HyXUQ0zgiIwIicEfotYPWGN0OJVEN/58IJ3A4GBYcEq3LGAZqKb+ugvP0GNB9CEAA==} + http-cache-semantics@4.2.0: resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} @@ -2494,6 +3322,9 @@ packages: resolution: {integrity: sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==} engines: {node: '>=18.18.0'} + i18next@23.16.8: + resolution: {integrity: sha512-06r/TitrM88Mg5FdUXAKL96dJMzgqLE5dv3ryBAra4KCwD9mJ4ndOTS95ZuymIGoE+2hzfdaMak2X11/es7ZWg==} + iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} @@ -2534,6 +3365,9 @@ packages: resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + inline-style-parser@0.2.7: + resolution: {integrity: sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==} + inquirer@8.2.5: resolution: {integrity: sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==} engines: {node: '>=12.0.0'} @@ -2546,13 +3380,38 @@ packages: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} + iron-webcrypto@1.2.1: + resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==} + + is-alphabetical@2.0.1: + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + + is-alphanumerical@2.0.1: + resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + is-arrayish@0.3.4: + resolution: {integrity: sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==} + is-core-module@2.16.1: resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} engines: {node: '>= 0.4'} + is-decimal@2.0.1: + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + + is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + + is-docker@4.0.0: + resolution: {integrity: sha512-LHE+wROyG/Y/0ZnbktRCoTix2c1RhgWaZraMZ8o1Q7zCh0VSrICJQO5oqIIISrcSBtrXv0o233w1IYwsWCjTzA==} + engines: {node: '>=20'} + hasBin: true + is-extendable@0.1.1: resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} engines: {node: '>=0.10.0'} @@ -2573,6 +3432,14 @@ packages: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} + is-hexadecimal@2.0.1: + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + + is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + is-interactive@1.0.0: resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} engines: {node: '>=8'} @@ -2619,6 +3486,10 @@ packages: resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} engines: {node: '>=0.10.0'} + is-wsl@3.1.1: + resolution: {integrity: sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==} + engines: {node: '>=16'} + isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} @@ -2679,6 +3550,10 @@ packages: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} + klona@2.0.6: + resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==} + engines: {node: '>= 8'} + lefthook-darwin-arm64@2.1.6: resolution: {integrity: sha512-hyB7eeiX78BS66f70byTJacDLC/xV1vgMv9n+idFUsrM7J3Udd/ag9Ag5NP3t0eN0EqQqAtrNnt35EH01lxnRQ==} cpu: [arm64] @@ -2847,6 +3722,9 @@ packages: resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} engines: {node: '>=18'} + longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + longest@2.0.1: resolution: {integrity: sha512-Ajzxb8CM6WAnFjgiloPsI3bF+WCxcvhdIG3KNA2KN962+tdBsHcuQ4k4qX/EcS/2CRkcc0iAkR956Nib6aXU/Q==} engines: {node: '>=0.10.0'} @@ -2866,10 +3744,23 @@ packages: resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} engines: {node: '>=12'} + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + magicast@0.5.2: + resolution: {integrity: sha512-E3ZJh4J3S9KfwdjZhe2afj6R9lGIN5Pher1pF39UGrXRqq/VDaGVIGN13BjHd2u8B61hArAGOnso7nBOouW3TQ==} + map-age-cleaner@0.1.3: resolution: {integrity: sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==} engines: {node: '>=6'} + markdown-extensions@2.0.0: + resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==} + engines: {node: '>=16'} + + markdown-table@3.0.4: + resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} + matcher@3.0.0: resolution: {integrity: sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==} engines: {node: '>=10'} @@ -2878,6 +3769,66 @@ packages: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} + mdast-util-definitions@6.0.0: + resolution: {integrity: sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==} + + mdast-util-directive@3.1.0: + resolution: {integrity: sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q==} + + mdast-util-find-and-replace@3.0.2: + resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==} + + mdast-util-from-markdown@2.0.3: + resolution: {integrity: sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==} + + mdast-util-gfm-autolink-literal@2.0.1: + resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==} + + mdast-util-gfm-footnote@2.1.0: + resolution: {integrity: sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==} + + mdast-util-gfm-strikethrough@2.0.0: + resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} + + mdast-util-gfm-table@2.0.0: + resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} + + mdast-util-gfm-task-list-item@2.0.0: + resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} + + mdast-util-gfm@3.1.0: + resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==} + + mdast-util-mdx-expression@2.0.1: + resolution: {integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==} + + mdast-util-mdx-jsx@3.2.0: + resolution: {integrity: sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==} + + mdast-util-mdx@3.0.0: + resolution: {integrity: sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==} + + mdast-util-mdxjs-esm@2.0.1: + resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} + + mdast-util-phrasing@4.1.0: + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + + mdast-util-to-hast@13.2.1: + resolution: {integrity: sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==} + + mdast-util-to-markdown@2.1.2: + resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} + + mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + + mdn-data@2.0.28: + resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} + + mdn-data@2.27.1: + resolution: {integrity: sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==} + media-typer@1.1.0: resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} engines: {node: '>= 0.8'} @@ -2901,6 +3852,114 @@ packages: merge@2.1.1: resolution: {integrity: sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w==} + micromark-core-commonmark@2.0.3: + resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} + + micromark-extension-directive@3.0.2: + resolution: {integrity: sha512-wjcXHgk+PPdmvR58Le9d7zQYWy+vKEU9Se44p2CrCDPiLr2FMyiT4Fyb5UFKFC66wGB3kPlgD7q3TnoqPS7SZA==} + + micromark-extension-gfm-autolink-literal@2.1.0: + resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} + + micromark-extension-gfm-footnote@2.1.0: + resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==} + + micromark-extension-gfm-strikethrough@2.1.0: + resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==} + + micromark-extension-gfm-table@2.1.1: + resolution: {integrity: sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==} + + micromark-extension-gfm-tagfilter@2.0.0: + resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} + + micromark-extension-gfm-task-list-item@2.1.0: + resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==} + + micromark-extension-gfm@3.0.0: + resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} + + micromark-extension-mdx-expression@3.0.1: + resolution: {integrity: sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==} + + micromark-extension-mdx-jsx@3.0.2: + resolution: {integrity: sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==} + + micromark-extension-mdx-md@2.0.0: + resolution: {integrity: sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==} + + micromark-extension-mdxjs-esm@3.0.0: + resolution: {integrity: sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==} + + micromark-extension-mdxjs@3.0.0: + resolution: {integrity: sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==} + + micromark-factory-destination@2.0.1: + resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} + + micromark-factory-label@2.0.1: + resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} + + micromark-factory-mdx-expression@2.0.3: + resolution: {integrity: sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==} + + micromark-factory-space@2.0.1: + resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} + + micromark-factory-title@2.0.1: + resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} + + micromark-factory-whitespace@2.0.1: + resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} + + micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + + micromark-util-chunked@2.0.1: + resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} + + micromark-util-classify-character@2.0.1: + resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} + + micromark-util-combine-extensions@2.0.1: + resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} + + micromark-util-decode-numeric-character-reference@2.0.2: + resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} + + micromark-util-decode-string@2.0.1: + resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} + + micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + + micromark-util-events-to-acorn@2.0.3: + resolution: {integrity: sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==} + + micromark-util-html-tag-name@2.0.1: + resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} + + micromark-util-normalize-identifier@2.0.1: + resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} + + micromark-util-resolve-all@2.0.1: + resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} + + micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} + + micromark-util-subtokenize@2.1.0: + resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} + + micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + + micromark-util-types@2.0.2: + resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} + + micromark@4.0.2: + resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} + micromatch@4.0.8: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} @@ -2975,6 +4034,10 @@ packages: moo@0.5.2: resolution: {integrity: sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==} + mrmime@2.0.1: + resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} + engines: {node: '>=10'} + ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -2988,6 +4051,11 @@ packages: nan@2.26.2: resolution: {integrity: sha512-0tTvBTYkt3tdGw22nrAy50x7gpbGCCFH3AFcyS5WiUu7Eu4vWlri1woE6qHBSfy11vksDqkiwjOnlR7WV8G1Hw==} + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + napi-build-utils@2.0.0: resolution: {integrity: sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==} @@ -3002,6 +4070,13 @@ packages: neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + neotraverse@0.6.18: + resolution: {integrity: sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==} + engines: {node: '>= 10'} + + nlcst-to-string@4.0.0: + resolution: {integrity: sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==} + node-abi@3.89.0: resolution: {integrity: sha512-6u9UwL0HlAl21+agMN3YAMXcKByMqwGx+pq+P76vii5f7hTPtKDp08/H9py6DY+cfDw7kQNTGEj/rly3IgbNQA==} engines: {node: '>=10'} @@ -3017,10 +4092,16 @@ packages: resolution: {integrity: sha512-9MdFxmkKaOYVTV+XVRG8ArDwwQ77XIgIPyKASB1k3JPq3M8fGQQQE3YpMOrKm6g//Ktx8ivZr8xo1Qmtqub+GA==} engines: {node: ^18 || ^20 || >= 21} + node-fetch-native@1.6.7: + resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==} + node-gyp-build@4.8.4: resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} hasBin: true + node-mock-http@1.0.4: + resolution: {integrity: sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ==} + nopt@7.2.1: resolution: {integrity: sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -3030,6 +4111,10 @@ packages: resolution: {integrity: sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + normalize-url@6.1.0: resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} engines: {node: '>=10'} @@ -3042,6 +4127,9 @@ packages: resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==} engines: {node: '>=18'} + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -3061,6 +4149,15 @@ packages: obliterator@2.0.5: resolution: {integrity: sha512-42CPE9AhahZRsMNslczq0ctAEtqk8Eka26QofnqC346BZdHDySk3LWka23LI7ULIw11NmltpiLagIq8gBozxTw==} + obug@2.1.1: + resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} + + ofetch@1.5.1: + resolution: {integrity: sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==} + + ohash@2.0.11: + resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} + on-exit-leak-free@2.1.2: resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} engines: {node: '>=14.0.0'} @@ -3080,6 +4177,12 @@ packages: resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} engines: {node: '>=18'} + oniguruma-parser@0.12.2: + resolution: {integrity: sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw==} + + oniguruma-to-es@4.3.6: + resolution: {integrity: sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==} + onnxruntime-common@1.24.3: resolution: {integrity: sha512-GeuPZO6U/LBJXvwdaqHbuUmoXiEdeCjWi/EG7Y1HNnDwJYuk6WUbNXpF6luSUY8yASul3cmUlLGrCCL1ZgVXqA==} @@ -3110,10 +4213,22 @@ packages: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} + p-limit@7.3.0: + resolution: {integrity: sha512-7cIXg/Z0M5WZRblrsOla88S4wAK+zOQQWeBYfV3qJuJXMr+LnbYjaadrFaS0JILfEDPVqHyKnZ1Z/1d6J9VVUw==} + engines: {node: '>=20'} + p-map@4.0.0: resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} engines: {node: '>=10'} + p-queue@9.1.2: + resolution: {integrity: sha512-ktsDOALzTYTWWF1PbkNVg2rOt+HaOaMWJMUnt7T3qf5tvZ1L8dBW3tObzprBcXNMKkwj+yFSLqHso0x+UFcJXw==} + engines: {node: '>=20'} + + p-timeout@7.0.1: + resolution: {integrity: sha512-AxTM2wDGORHGEkPCt8yqxOTMgpfbEHqF51f/5fJCmwFC3C/zNcGT63SymH2ttOAaiIws2zVg4+izQCjrakcwHg==} + engines: {node: '>=20'} + p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} @@ -3121,17 +4236,30 @@ packages: package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + package-manager-detector@1.6.0: + resolution: {integrity: sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==} + packageurl-js@2.0.1: resolution: {integrity: sha512-N5ixXjzTy4QDQH0Q9YFjqIWd6zH6936Djpl2m9QNFmDv5Fum8q8BjkpAcHNMzOFE0IwQrFhJWex3AN6kS0OSwg==} + pagefind@1.5.2: + resolution: {integrity: sha512-XTUaK0hXMCu2jszWE584JGQT7y284TmMV9l/HX3rnG5uo3rHI/uHU56XTyyyPFjeWEBxECbAi0CaFDJOONtG0Q==} + hasBin: true + parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} + parse-entities@4.0.2: + resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} + parse-json@5.2.0: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} + parse-latin@7.0.0: + resolution: {integrity: sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==} + parse-ms@4.0.0: resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} engines: {node: '>=18'} @@ -3140,6 +4268,9 @@ packages: resolution: {integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==} engines: {node: '>=0.10.0'} + parse5@7.3.0: + resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} + parseurl@1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} @@ -3174,6 +4305,9 @@ packages: path-to-regexp@8.4.2: resolution: {integrity: sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==} + piccolore@0.1.3: + resolution: {integrity: sha512-o8bTeDWjE086iwKrROaDf31K0qC/BENdm15/uH9usSC/uZjJOKb2YGiVHfLY4GhwsERiPI1jmwI2XrA7ACOxVw==} + picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -3181,6 +4315,10 @@ packages: resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} engines: {node: '>=8.6'} + picomatch@4.0.4: + resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} + engines: {node: '>=12'} + pino-abstract-transport@2.0.0: resolution: {integrity: sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==} @@ -3206,6 +4344,20 @@ packages: resolution: {integrity: sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==} engines: {node: '>=16.20.0'} + postcss-nested@6.2.0: + resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + + postcss-selector-parser@6.1.2: + resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} + engines: {node: '>=4'} + + postcss@8.5.10: + resolution: {integrity: sha512-pMMHxBOZKFU6HgAZ4eyGnwXF/EvPGGqUr0MnZ5+99485wwW41kW91A4LOGxSHhgugZmSChL5AlElNdwlNgcnLQ==} + engines: {node: ^10 || ^12 || >=14} + prebuild-install@7.1.3: resolution: {integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==} engines: {node: '>=10'} @@ -3216,9 +4368,16 @@ packages: resolution: {integrity: sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==} engines: {node: '>=18'} + prismjs@1.30.0: + resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} + engines: {node: '>=6'} + process-warning@5.0.0: resolution: {integrity: sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==} + property-information@7.1.0: + resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} + proxy-addr@2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} @@ -3248,6 +4407,9 @@ packages: resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} engines: {node: '>=10'} + radix3@1.1.2: + resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==} + railroad-diagrams@1.0.0: resolution: {integrity: sha512-cz93DjNeLY0idrCNOH6PviZGRN9GJhsdm9hpn1YCS879fj4W+x5IFJhhkRZcwVgMmFF7R82UA/7Oh+R8lLZg6A==} @@ -3280,12 +4442,82 @@ packages: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} + readdirp@5.0.0: + resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==} + engines: {node: '>= 20.19.0'} + real-require@0.2.0: resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} engines: {node: '>= 12.13.0'} - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + recma-build-jsx@1.0.0: + resolution: {integrity: sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==} + + recma-jsx@1.0.1: + resolution: {integrity: sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + recma-parse@1.0.0: + resolution: {integrity: sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==} + + recma-stringify@1.0.0: + resolution: {integrity: sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==} + + regex-recursion@6.0.2: + resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==} + + regex-utilities@2.3.0: + resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} + + regex@6.1.0: + resolution: {integrity: sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==} + + rehype-expressive-code@0.41.7: + resolution: {integrity: sha512-25f8ZMSF1d9CMscX7Cft0TSQIqdwjce2gDOvQ+d/w0FovsMwrSt3ODP4P3Z7wO1jsIJ4eYyaDRnIR/27bd/EMQ==} + + rehype-format@5.0.1: + resolution: {integrity: sha512-zvmVru9uB0josBVpr946OR8ui7nJEdzZobwLOOqHb/OOD88W0Vk2SqLwoVOj0fM6IPCCO6TaV9CvQvJMWwukFQ==} + + rehype-parse@9.0.1: + resolution: {integrity: sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==} + + rehype-raw@7.0.0: + resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} + + rehype-recma@1.0.0: + resolution: {integrity: sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==} + + rehype-stringify@10.0.1: + resolution: {integrity: sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==} + + rehype@13.0.2: + resolution: {integrity: sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A==} + + remark-directive@3.0.1: + resolution: {integrity: sha512-gwglrEQEZcZYgVyG1tQuA+h58EZfq5CSULw7J90AFuCTyib1thgHPoqQ+h9iFvU6R+vnZ5oNFQR5QKgGpk741A==} + + remark-gfm@4.0.1: + resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==} + + remark-mdx@3.1.1: + resolution: {integrity: sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg==} + + remark-parse@11.0.0: + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + + remark-rehype@11.1.2: + resolution: {integrity: sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==} + + remark-smartypants@3.0.2: + resolution: {integrity: sha512-ILTWeOriIluwEvPjv67v7Blgrcx+LZOkAUVtKI3putuhlZm84FnqDORNXPPm+HY3NdZOMhyDwZ1E+eZB/Df5dA==} + engines: {node: '>=16.0.0'} + + remark-stringify@11.0.0: + resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} require-from-string@2.0.2: @@ -3325,6 +4557,18 @@ packages: resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==} engines: {node: '>=0.12'} + retext-latin@4.0.0: + resolution: {integrity: sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA==} + + retext-smartypants@6.2.0: + resolution: {integrity: sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ==} + + retext-stringify@4.0.0: + resolution: {integrity: sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA==} + + retext@9.0.0: + resolution: {integrity: sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==} + reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} @@ -3339,6 +4583,11 @@ packages: resolution: {integrity: sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==} engines: {node: '>=8.0'} + rollup@4.60.2: + resolution: {integrity: sha512-J9qZyW++QK/09NyN/zeO0dG/1GdGfyp9lV8ajHnRVLfo/uFsbji5mHnDgn/qYdUHyCkM2N+8VyspgZclfAh0eQ==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + router@2.2.0: resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} engines: {node: '>= 18'} @@ -3363,6 +4612,10 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + sax@1.6.0: + resolution: {integrity: sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==} + engines: {node: '>=11.0.0'} + schemes@1.4.0: resolution: {integrity: sha512-ImFy9FbCsQlVgnE3TCWmLPCFnVzx0lHL/l+umHplDqAKd0dzFpnS6lFZIpagBlYhKwzVmlV36ec0Y1XTu8JBAQ==} @@ -3396,6 +4649,10 @@ packages: setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + sharp@0.34.1: + resolution: {integrity: sha512-1j0w61+eVxu7DawFJtnfYcvSv6qPFvfTaqzTQ2BLknVhHTwGS8sc63ZBF4rzkWMBVKybo4S5OBtDdZahh2A1xg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -3404,6 +4661,13 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} + shiki@3.23.0: + resolution: {integrity: sha512-55Dj73uq9ZXL5zyeRPzHQsK7Nbyt6Y10k5s7OjuFZGMhpp4r/rsLBH0o/0fstIzX1Lep9VxefWljK/SKCzygIA==} + + shiki@4.0.2: + resolution: {integrity: sha512-eAVKTMedR5ckPo4xne/PjYQYrU3qx78gtJZ+sHlXEg5IHhhoQhMfZVzetTYuaJS0L2Ef3AcCRzCHV8T0WI6nIQ==} + engines: {node: '>=20'} + side-channel-list@1.0.1: resolution: {integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==} engines: {node: '>= 0.4'} @@ -3436,6 +4700,17 @@ packages: simple-git@3.36.0: resolution: {integrity: sha512-cGQjLjK8bxJw4QuYT7gxHw3/IouVESbhahSsHrX97MzCL1gu2u7oy38W6L2ZIGECEfIBG4BabsWDPjBxJENv9Q==} + simple-swizzle@0.2.4: + resolution: {integrity: sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==} + + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + + sitemap@9.0.1: + resolution: {integrity: sha512-S6hzjGJSG3d6if0YoF5kTyeRJvia6FSTBroE5fQ0bu1QNxyJqhhinfUsXi9fH3MgtXODWvwo2BDyQSnhPQ88uQ==} + engines: {node: '>=20.19.5', npm: '>=10.8.2'} + hasBin: true + slice-ansi@7.1.2: resolution: {integrity: sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==} engines: {node: '>=18'} @@ -3447,6 +4722,10 @@ packages: slide@1.1.6: resolution: {integrity: sha512-NwrtjCg+lZoqhFU8fOwl4ay2ei8PaqCBOUV3/ektPY9trO1yQ1oXEfmHAhKArUVUr/hOHvy5f6AdP17dCM0zMw==} + smol-toml@1.6.1: + resolution: {integrity: sha512-dWUG8F5sIIARXih1DTaQAX4SsiTXhInKf1buxdY9DIg4ZYPZK5nGM1VRIYmEbDbsHt7USo99xSLFu5Q1IqTmsg==} + engines: {node: '>= 18'} + smtp-address-parser@1.1.0: resolution: {integrity: sha512-Gz11jbNU0plrReU9Sj7fmshSBxxJ9ShdD2q4ktHIHo/rpTH6lFyQoYHYKINPJtPe8aHFnsbtW46Ls0tCCBsIZg==} engines: {node: '>=0.10'} @@ -3462,10 +4741,21 @@ packages: sonic-boom@4.2.1: resolution: {integrity: sha512-w6AxtubXa2wTXAUsZMMWERrsIRAdrK0Sc+FUytWvYAhBJLyuI4llrMIC1DtlNSdI99EI86KZum2MMq3EAZlF9Q==} + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} + source-map@0.7.6: + resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} + engines: {node: '>= 12'} + + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + spdx-compare@1.0.0: resolution: {integrity: sha512-C1mDZOX0hnu0ep9dfmuoi03+eOdDoz2yvK79RxbcrVEG1NO1Ph35yW102DHWKN4pk80nwCgeMmSY5L25VE4D9A==} @@ -3502,6 +4792,9 @@ packages: resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==} engines: {node: '>=18'} + stream-replace-string@2.0.0: + resolution: {integrity: sha512-TlnjJ1C0QrmxRNrON00JvaFFlNh5TTG00APw23j74ET7gkQpTASi6/L2fuiav8pzK715HXtUeClpBTw2NPSn6w==} + string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -3521,6 +4814,9 @@ packages: string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -3556,6 +4852,12 @@ packages: strnum@2.2.3: resolution: {integrity: sha512-oKx6RUCuHfT3oyVjtnrmn19H1SiCqgJSg+54XqURKp5aCMbrXrhLjRN9TjuwMjiYstZ0MzDrHqkGZ5dFTKd+zg==} + style-to-js@1.1.21: + resolution: {integrity: sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==} + + style-to-object@1.0.14: + resolution: {integrity: sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==} + supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} @@ -3564,6 +4866,11 @@ packages: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} + svgo@4.0.1: + resolution: {integrity: sha512-XDpWUOPC6FEibaLzjfe0ucaV0YrOjYotGJO1WpF0Zd+n6ZGEQUsSugaoLq9QkEZtAfQIxT42UChcssDVPP3+/w==} + engines: {node: '>=16'} + hasBin: true + tar-fs@2.1.4: resolution: {integrity: sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==} @@ -3581,10 +4888,21 @@ packages: through@2.3.8: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + tiny-inflate@1.0.3: + resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==} + + tinyclip@0.1.12: + resolution: {integrity: sha512-Ae3OVUqifDw0wBriIBS7yVaW44Dp6eSHQcyq4Igc7eN2TJH/2YsicswaW+J/OuMvhpDPOKEgpAZCjkb4hpoyeA==} + engines: {node: ^16.14.0 || >= 17.3.0} + tinyexec@1.1.1: resolution: {integrity: sha512-VKS/ZaQhhkKFMANmAOhhXVoIfBXblQxGX1myCQ2faQrfmobMftXeJPcZGp0gS07ocvGJWDLZGyOZDadDBqYIJg==} engines: {node: '>=18'} + tinyglobby@0.2.16: + resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} + engines: {node: '>=12.0.0'} + tinylogic@2.0.0: resolution: {integrity: sha512-dljTkiLLITtsjqBvTA1MRZQK/sGP4kI3UJKc3yA9fMzYbMF2RhcN04SeROVqJBIYYOoJMM8u0WDnhFwMSFQotw==} @@ -3744,9 +5062,25 @@ packages: resolution: {integrity: sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A==} engines: {node: '>=0.6'} + trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + + trough@2.2.0: + resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + ts-morph@25.0.1: resolution: {integrity: sha512-QJEiTdnz1YjrB3JFhd626gX4rKHDLSjSVMvGGG4v7ONc3RBwa0Eei98G9AT9uNFDMtV54JyuXsFeC+OH0n6bXQ==} + tsconfck@3.1.6: + resolution: {integrity: sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==} + engines: {node: ^18 || >=20} + hasBin: true + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + tslib@1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} @@ -3788,11 +5122,20 @@ packages: engines: {node: '>=14.17'} hasBin: true + ufo@1.6.3: + resolution: {integrity: sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==} + uglify-js@3.19.3: resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} engines: {node: '>=0.8.0'} hasBin: true + ultrahtml@1.6.0: + resolution: {integrity: sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw==} + + uncrypto@0.1.3: + resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} + undici-types@7.16.0: resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} @@ -3800,6 +5143,42 @@ packages: resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} engines: {node: '>=18'} + unified@11.0.5: + resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} + + unifont@0.7.4: + resolution: {integrity: sha512-oHeis4/xl42HUIeHuNZRGEvxj5AaIKR+bHPNegRq5LV1gdc3jundpONbjglKpihmJf+dswygdMJn3eftGIMemg==} + + unist-util-find-after@5.0.0: + resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==} + + unist-util-is@6.0.1: + resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} + + unist-util-modify-children@4.0.0: + resolution: {integrity: sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw==} + + unist-util-position-from-estree@2.0.0: + resolution: {integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==} + + unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + + unist-util-remove-position@5.0.0: + resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + + unist-util-visit-children@3.0.0: + resolution: {integrity: sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA==} + + unist-util-visit-parents@6.0.2: + resolution: {integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==} + + unist-util-visit@5.1.0: + resolution: {integrity: sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==} + universalify@2.0.1: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} @@ -3808,6 +5187,68 @@ packages: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} + unstorage@1.17.5: + resolution: {integrity: sha512-0i3iqvRfx29hkNntHyQvJTpf5W9dQ9ZadSoRU8+xVlhVtT7jAX57fazYO9EHvcRCfBCyi5YRya7XCDOsbTgkPg==} + 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 + uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} @@ -3825,12 +5266,76 @@ packages: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} + vfile-location@5.0.3: + resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} + + vfile-message@4.0.3: + resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} + + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + + vite@7.3.2: + resolution: {integrity: sha512-Bby3NOsna2jsjfLVOHKes8sGwgl4TT0E6vvpYgnAYDIF/tie7MRaFthmKuHx1NSXjiTueXH3do80FMQgvEktRg==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + jiti: '>=1.21.0' + less: ^4.0.0 + lightningcss: ^1.21.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + 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 + + vitefu@1.1.3: + resolution: {integrity: sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg==} + peerDependencies: + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + vite: + optional: true + wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + web-namespaces@2.0.1: + resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + web-tree-sitter@0.26.8: resolution: {integrity: sha512-4sUwi7ZyOrIk5KLgYLkc2A/F0LFMQnBhfb+2Cdl7ik4ePJ6JD+fk4ofI2sA5eGawBKBaK4Vntt7Ww5KcEsay4A==} + which-pm-runs@1.1.0: + resolution: {integrity: sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==} + engines: {node: '>=4'} + which@1.3.1: resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} hasBin: true @@ -3878,6 +5383,9 @@ packages: resolution: {integrity: sha512-OTIk8iR8/aCRWBqvxrzxR0hgxWpnYBblY1S5hDWBQfk/VFmJwzmJgQFN3WsoUKHISv2eAwe+PpbUzyL1CKTLXg==} engines: {node: ^20.17.0 || >=22.9.0} + xxhash-wasm@1.1.0: + resolution: {integrity: sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==} + y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} @@ -3895,10 +5403,18 @@ packages: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} + yargs-parser@22.0.0: + resolution: {integrity: sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==} + engines: {node: ^20.19.0 || ^22.12.0 || >=23} + yargs@17.7.2: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} + yocto-queue@1.2.2: + resolution: {integrity: sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==} + engines: {node: '>=12.20'} + yoctocolors-cjs@2.1.3: resolution: {integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==} engines: {node: '>=18'} @@ -3918,6 +5434,9 @@ packages: zod@4.3.6: resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==} + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + snapshots: '@apidevtools/json-schema-ref-parser@14.0.1': @@ -3943,6 +5462,110 @@ snapshots: dependencies: grapheme-splitter: 1.0.4 + '@astrojs/compiler@3.0.1': {} + + '@astrojs/internal-helpers@0.9.0': + dependencies: + picomatch: 4.0.4 + + '@astrojs/markdown-remark@7.1.1': + dependencies: + '@astrojs/internal-helpers': 0.9.0 + '@astrojs/prism': 4.0.1 + github-slugger: 2.0.0 + hast-util-from-html: 2.0.3 + hast-util-to-text: 4.0.2 + 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 + retext-smartypants: 6.2.0 + shiki: 4.0.2 + smol-toml: 1.6.1 + unified: 11.0.5 + unist-util-remove-position: 5.0.0 + unist-util-visit: 5.1.0 + unist-util-visit-parents: 6.0.2 + vfile: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@astrojs/mdx@5.0.4(astro@6.1.9(@types/node@24.12.2)(jiti@2.4.1)(rollup@4.60.2)(tsx@4.21.0)(typescript@6.0.3)(yaml@2.8.3))': + dependencies: + '@astrojs/markdown-remark': 7.1.1 + '@mdx-js/mdx': 3.1.1 + acorn: 8.16.0 + astro: 6.1.9(@types/node@24.12.2)(jiti@2.4.1)(rollup@4.60.2)(tsx@4.21.0)(typescript@6.0.3)(yaml@2.8.3) + es-module-lexer: 2.0.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.1.0 + vfile: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@astrojs/prism@4.0.1': + dependencies: + prismjs: 1.30.0 + + '@astrojs/sitemap@3.7.2': + dependencies: + sitemap: 9.0.1 + stream-replace-string: 2.0.0 + zod: 4.3.6 + + '@astrojs/starlight@0.38.4(astro@6.1.9(@types/node@24.12.2)(jiti@2.4.1)(rollup@4.60.2)(tsx@4.21.0)(typescript@6.0.3)(yaml@2.8.3))': + dependencies: + '@astrojs/markdown-remark': 7.1.1 + '@astrojs/mdx': 5.0.4(astro@6.1.9(@types/node@24.12.2)(jiti@2.4.1)(rollup@4.60.2)(tsx@4.21.0)(typescript@6.0.3)(yaml@2.8.3)) + '@astrojs/sitemap': 3.7.2 + '@pagefind/default-ui': 1.5.2 + '@types/hast': 3.0.4 + '@types/js-yaml': 4.0.9 + '@types/mdast': 4.0.4 + astro: 6.1.9(@types/node@24.12.2)(jiti@2.4.1)(rollup@4.60.2)(tsx@4.21.0)(typescript@6.0.3)(yaml@2.8.3) + astro-expressive-code: 0.41.7(astro@6.1.9(@types/node@24.12.2)(jiti@2.4.1)(rollup@4.60.2)(tsx@4.21.0)(typescript@6.0.3)(yaml@2.8.3)) + bcp-47: 2.1.0 + hast-util-from-html: 2.0.3 + hast-util-select: 6.0.4 + hast-util-to-string: 3.0.1 + hastscript: 9.0.1 + i18next: 23.16.8 + js-yaml: 4.1.1 + klona: 2.0.6 + magic-string: 0.30.21 + mdast-util-directive: 3.1.0 + mdast-util-to-markdown: 2.1.2 + mdast-util-to-string: 4.0.0 + pagefind: 1.5.2 + rehype: 13.0.2 + rehype-format: 5.0.1 + remark-directive: 3.0.1 + ultrahtml: 1.6.0 + unified: 11.0.5 + unist-util-visit: 5.1.0 + vfile: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@astrojs/telemetry@3.3.1': + dependencies: + ci-info: 4.4.0 + dlv: 1.1.3 + dset: 3.1.4 + is-docker: 4.0.0 + is-wsl: 3.1.1 + which-pm-runs: 1.1.0 + '@aws-crypto/crc32@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 @@ -4357,8 +5980,21 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.1.1 + '@babel/helper-string-parser@7.27.1': {} + '@babel/helper-validator-identifier@7.28.5': {} + '@babel/parser@7.29.2': + dependencies: + '@babel/types': 7.29.0 + + '@babel/runtime@7.29.2': {} + + '@babel/types@7.29.0': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + '@biomejs/biome@2.4.12': optionalDependencies: '@biomejs/cli-darwin-arm64': 2.4.12 @@ -4396,6 +6032,22 @@ snapshots: '@bufbuild/protobuf@2.11.0': {} + '@capsizecss/unpack@4.0.0': + dependencies: + fontkitten: 1.0.3 + + '@clack/core@1.2.0': + dependencies: + fast-wrap-ansi: 0.1.6 + sisteransi: 1.0.5 + + '@clack/prompts@1.2.0': + dependencies: + '@clack/core': 1.2.0 + fast-string-width: 1.1.0 + fast-wrap-ansi: 0.1.6 + sisteransi: 1.0.5 + '@colors/colors@1.5.0': optional: true @@ -4563,6 +6215,8 @@ snapshots: optionalDependencies: conventional-commits-parser: 6.4.0 + '@ctrl/tinycolor@4.2.0': {} + '@cyclonedx/cyclonedx-library@10.0.0(ajv-formats-draft2019@1.6.1(ajv@8.18.0))(ajv-formats@3.0.1(ajv@8.18.0))(ajv@8.18.0)(packageurl-js@2.0.1)(spdx-expression-parse@3.0.1)': optionalDependencies: ajv: 8.18.0 @@ -4602,6 +6256,11 @@ snapshots: '@duckdb/node-bindings-win32-arm64': 1.5.2-r.1 '@duckdb/node-bindings-win32-x64': 1.5.2-r.1 + '@emnapi/runtime@1.10.0': + dependencies: + tslib: 2.8.1 + optional: true + '@esbuild/aix-ppc64@0.27.7': optional: true @@ -4680,6 +6339,31 @@ snapshots: '@esbuild/win32-x64@0.27.7': optional: true + '@expressive-code/core@0.41.7': + dependencies: + '@ctrl/tinycolor': 4.2.0 + hast-util-select: 6.0.4 + hast-util-to-html: 9.0.5 + hast-util-to-text: 4.0.2 + hastscript: 9.0.1 + postcss: 8.5.10 + postcss-nested: 6.2.0(postcss@8.5.10) + unist-util-visit: 5.1.0 + unist-util-visit-parents: 6.0.2 + + '@expressive-code/plugin-frames@0.41.7': + dependencies: + '@expressive-code/core': 0.41.7 + + '@expressive-code/plugin-shiki@0.41.7': + dependencies: + '@expressive-code/core': 0.41.7 + shiki: 3.23.0 + + '@expressive-code/plugin-text-markers@0.41.7': + dependencies: + '@expressive-code/core': 0.41.7 + '@graphty/algorithms@1.7.1(@types/node@24.12.2)(typescript@6.0.3)': dependencies: pupt: 1.4.1(@types/node@24.12.2)(typescript@6.0.3) @@ -4702,6 +6386,84 @@ snapshots: '@iarna/toml@2.2.5': {} + '@img/sharp-darwin-arm64@0.34.1': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.1.0 + optional: true + + '@img/sharp-darwin-x64@0.34.1': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.1.0 + optional: true + + '@img/sharp-libvips-darwin-arm64@1.1.0': + optional: true + + '@img/sharp-libvips-darwin-x64@1.1.0': + optional: true + + '@img/sharp-libvips-linux-arm64@1.1.0': + optional: true + + '@img/sharp-libvips-linux-arm@1.1.0': + optional: true + + '@img/sharp-libvips-linux-ppc64@1.1.0': + optional: true + + '@img/sharp-libvips-linux-s390x@1.1.0': + optional: true + + '@img/sharp-libvips-linux-x64@1.1.0': + optional: true + + '@img/sharp-libvips-linuxmusl-arm64@1.1.0': + optional: true + + '@img/sharp-libvips-linuxmusl-x64@1.1.0': + optional: true + + '@img/sharp-linux-arm64@0.34.1': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.1.0 + optional: true + + '@img/sharp-linux-arm@0.34.1': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.1.0 + optional: true + + '@img/sharp-linux-s390x@0.34.1': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.1.0 + optional: true + + '@img/sharp-linux-x64@0.34.1': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.1.0 + optional: true + + '@img/sharp-linuxmusl-arm64@0.34.1': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.1.0 + optional: true + + '@img/sharp-linuxmusl-x64@0.34.1': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.1.0 + optional: true + + '@img/sharp-wasm32@0.34.1': + dependencies: + '@emnapi/runtime': 1.10.0 + optional: true + + '@img/sharp-win32-ia32@0.34.1': + optional: true + + '@img/sharp-win32-x64@0.34.1': + optional: true + '@inquirer/ansi@1.0.2': {} '@inquirer/checkbox@4.3.2(@types/node@24.12.2)': @@ -4849,6 +6611,8 @@ snapshots: dependencies: minipass: 7.1.3 + '@jridgewell/sourcemap-codec@1.5.5': {} + '@kwsites/file-exists@1.1.1': dependencies: debug: 4.4.3 @@ -4857,6 +6621,36 @@ snapshots: '@kwsites/promise-deferred@1.1.1': {} + '@mdx-js/mdx@3.1.1': + dependencies: + '@types/estree': 1.0.8 + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdx': 2.0.13 + acorn: 8.16.0 + collapse-white-space: 2.1.0 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + estree-util-scope: 1.0.0 + estree-walker: 3.0.3 + hast-util-to-jsx-runtime: 2.3.6 + markdown-extensions: 2.0.0 + recma-build-jsx: 1.0.0 + recma-jsx: 1.0.1(acorn@8.16.0) + recma-stringify: 1.0.0 + rehype-recma: 1.0.0 + remark-mdx: 3.1.1 + remark-parse: 11.0.0 + remark-rehype: 11.1.2 + source-map: 0.7.6 + unified: 11.0.5 + unist-util-position-from-estree: 2.0.0 + unist-util-stringify-position: 4.0.0 + unist-util-visit: 5.1.0 + vfile: 6.0.3 + transitivePeerDependencies: + - supports-color + '@modelcontextprotocol/sdk@1.29.0(zod@4.3.6)': dependencies: '@hono/node-server': 1.19.14(hono@4.12.14) @@ -4969,6 +6763,31 @@ snapshots: dependencies: semver: 7.7.4 + '@oslojs/encoding@1.1.0': {} + + '@pagefind/darwin-arm64@1.5.2': + optional: true + + '@pagefind/darwin-x64@1.5.2': + optional: true + + '@pagefind/default-ui@1.5.2': {} + + '@pagefind/freebsd-x64@1.5.2': + optional: true + + '@pagefind/linux-arm64@1.5.2': + optional: true + + '@pagefind/linux-x64@1.5.2': + optional: true + + '@pagefind/windows-arm64@1.5.2': + optional: true + + '@pagefind/windows-x64@1.5.2': + optional: true + '@pinojs/redact@0.4.0': {} '@pkgjs/parseargs@0.11.0': @@ -4980,7 +6799,161 @@ snapshots: '@pnpm/types@8.9.0': {} - '@sec-ant/readable-stream@0.4.1': {} + '@rollup/pluginutils@5.3.0(rollup@4.60.2)': + dependencies: + '@types/estree': 1.0.8 + estree-walker: 2.0.2 + picomatch: 4.0.4 + optionalDependencies: + rollup: 4.60.2 + + '@rollup/rollup-android-arm-eabi@4.60.2': + optional: true + + '@rollup/rollup-android-arm64@4.60.2': + optional: true + + '@rollup/rollup-darwin-arm64@4.60.2': + optional: true + + '@rollup/rollup-darwin-x64@4.60.2': + optional: true + + '@rollup/rollup-freebsd-arm64@4.60.2': + optional: true + + '@rollup/rollup-freebsd-x64@4.60.2': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.60.2': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.60.2': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.60.2': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.60.2': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.60.2': + optional: true + + '@rollup/rollup-linux-loong64-musl@4.60.2': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.60.2': + optional: true + + '@rollup/rollup-linux-ppc64-musl@4.60.2': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.60.2': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.60.2': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.60.2': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.60.2': + optional: true + + '@rollup/rollup-linux-x64-musl@4.60.2': + optional: true + + '@rollup/rollup-openbsd-x64@4.60.2': + optional: true + + '@rollup/rollup-openharmony-arm64@4.60.2': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.60.2': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.60.2': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.60.2': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.60.2': + optional: true + + '@sec-ant/readable-stream@0.4.1': {} + + '@shikijs/core@3.23.0': + dependencies: + '@shikijs/types': 3.23.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.5 + + '@shikijs/core@4.0.2': + dependencies: + '@shikijs/primitive': 4.0.2 + '@shikijs/types': 4.0.2 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.5 + + '@shikijs/engine-javascript@3.23.0': + dependencies: + '@shikijs/types': 3.23.0 + '@shikijs/vscode-textmate': 10.0.2 + oniguruma-to-es: 4.3.6 + + '@shikijs/engine-javascript@4.0.2': + dependencies: + '@shikijs/types': 4.0.2 + '@shikijs/vscode-textmate': 10.0.2 + oniguruma-to-es: 4.3.6 + + '@shikijs/engine-oniguruma@3.23.0': + dependencies: + '@shikijs/types': 3.23.0 + '@shikijs/vscode-textmate': 10.0.2 + + '@shikijs/engine-oniguruma@4.0.2': + dependencies: + '@shikijs/types': 4.0.2 + '@shikijs/vscode-textmate': 10.0.2 + + '@shikijs/langs@3.23.0': + dependencies: + '@shikijs/types': 3.23.0 + + '@shikijs/langs@4.0.2': + dependencies: + '@shikijs/types': 4.0.2 + + '@shikijs/primitive@4.0.2': + dependencies: + '@shikijs/types': 4.0.2 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + + '@shikijs/themes@3.23.0': + dependencies: + '@shikijs/types': 3.23.0 + + '@shikijs/themes@4.0.2': + dependencies: + '@shikijs/types': 4.0.2 + + '@shikijs/types@3.23.0': + dependencies: + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + + '@shikijs/types@4.0.2': + dependencies: + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + + '@shikijs/vscode-textmate@10.0.2': {} '@simple-git/args-pathspec@1.0.3': {} @@ -5366,16 +7339,44 @@ snapshots: '@types/node': 24.12.2 optional: true + '@types/debug@4.1.13': + dependencies: + '@types/ms': 2.1.0 + '@types/emscripten@1.41.5': {} + '@types/estree-jsx@1.0.5': + dependencies: + '@types/estree': 1.0.8 + + '@types/estree@1.0.8': {} + + '@types/hast@3.0.4': + dependencies: + '@types/unist': 3.0.3 + '@types/http-cache-semantics@4.2.0': {} + '@types/js-yaml@4.0.9': {} + '@types/json-schema@7.0.15': {} '@types/keyv@3.1.4': dependencies: '@types/node': 24.12.2 + '@types/mdast@4.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/mdx@2.0.13': {} + + '@types/ms@2.1.0': {} + + '@types/nlcst@2.0.3': + dependencies: + '@types/unist': 3.0.3 + '@types/node@24.12.2': dependencies: undici-types: 7.16.0 @@ -5386,18 +7387,28 @@ snapshots: '@types/sarif@2.1.7': {} + '@types/sax@1.2.7': + dependencies: + '@types/node': 24.12.2 + '@types/semver@7.7.1': {} '@types/spdx-correct@3.1.3': {} '@types/treeify@1.0.3': {} + '@types/unist@2.0.11': {} + + '@types/unist@3.0.3': {} + '@types/uuid@10.0.0': {} '@types/write-file-atomic@4.0.3': dependencies: '@types/node': 24.12.2 + '@ungap/structured-clone@1.3.0': {} + '@yarnpkg/core@4.6.0(typanion@3.14.0)': dependencies: '@arcanis/slice-ansi': 1.1.1 @@ -5466,6 +7477,12 @@ snapshots: mime-types: 3.0.2 negotiator: 1.0.0 + acorn-jsx@5.3.2(acorn@8.16.0): + dependencies: + acorn: 8.16.0 + + acorn@8.16.0: {} + adm-zip@0.5.16: {} aggregate-error@3.1.0: @@ -5522,24 +7539,147 @@ snapshots: ansi-styles@6.2.3: {} + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.2 + + arg@5.0.2: {} + argparse@2.0.1: {} + aria-query@5.3.2: {} + array-find-index@1.0.2: {} array-ify@1.0.0: {} + array-iterate@2.0.1: {} + + astring@1.9.0: {} + + astro-expressive-code@0.41.7(astro@6.1.9(@types/node@24.12.2)(jiti@2.4.1)(rollup@4.60.2)(tsx@4.21.0)(typescript@6.0.3)(yaml@2.8.3)): + dependencies: + astro: 6.1.9(@types/node@24.12.2)(jiti@2.4.1)(rollup@4.60.2)(tsx@4.21.0)(typescript@6.0.3)(yaml@2.8.3) + rehype-expressive-code: 0.41.7 + + astro@6.1.9(@types/node@24.12.2)(jiti@2.4.1)(rollup@4.60.2)(tsx@4.21.0)(typescript@6.0.3)(yaml@2.8.3): + dependencies: + '@astrojs/compiler': 3.0.1 + '@astrojs/internal-helpers': 0.9.0 + '@astrojs/markdown-remark': 7.1.1 + '@astrojs/telemetry': 3.3.1 + '@capsizecss/unpack': 4.0.0 + '@clack/prompts': 1.2.0 + '@oslojs/encoding': 1.1.0 + '@rollup/pluginutils': 5.3.0(rollup@4.60.2) + aria-query: 5.3.2 + axobject-query: 4.1.0 + ci-info: 4.4.0 + clsx: 2.1.1 + common-ancestor-path: 2.0.0 + cookie: 1.1.1 + devalue: 5.7.1 + diff: 8.0.4 + dset: 3.1.4 + es-module-lexer: 2.0.0 + esbuild: 0.27.7 + flattie: 1.1.1 + fontace: 0.4.1 + github-slugger: 2.0.0 + html-escaper: 3.0.3 + http-cache-semantics: 4.2.0 + js-yaml: 4.1.1 + magic-string: 0.30.21 + magicast: 0.5.2 + mrmime: 2.0.1 + neotraverse: 0.6.18 + obug: 2.1.1 + p-limit: 7.3.0 + p-queue: 9.1.2 + package-manager-detector: 1.6.0 + piccolore: 0.1.3 + picomatch: 4.0.4 + rehype: 13.0.2 + semver: 7.7.4 + shiki: 4.0.2 + smol-toml: 1.6.1 + svgo: 4.0.1 + tinyclip: 0.1.12 + tinyexec: 1.1.1 + tinyglobby: 0.2.16 + tsconfck: 3.1.6(typescript@6.0.3) + ultrahtml: 1.6.0 + unifont: 0.7.4 + unist-util-visit: 5.1.0 + unstorage: 1.17.5 + vfile: 6.0.3 + vite: 7.3.2(@types/node@24.12.2)(jiti@2.4.1)(tsx@4.21.0)(yaml@2.8.3) + vitefu: 1.1.3(vite@7.3.2(@types/node@24.12.2)(jiti@2.4.1)(tsx@4.21.0)(yaml@2.8.3)) + xxhash-wasm: 1.1.0 + yargs-parser: 22.0.0 + zod: 4.3.6 + optionalDependencies: + sharp: 0.34.1 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@types/node' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - db0 + - idb-keyval + - ioredis + - jiti + - less + - lightningcss + - rollup + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - typescript + - uploadthing + - yaml + async@3.2.6: {} at-least-node@1.0.0: {} atomic-sleep@1.0.0: {} + axobject-query@4.1.0: {} + + bail@2.0.2: {} + balanced-match@1.0.2: {} balanced-match@4.0.4: {} base64-js@1.5.1: {} + bcp-47-match@2.0.3: {} + + bcp-47@2.1.0: + dependencies: + is-alphabetical: 2.0.1 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + bl@4.1.0: dependencies: buffer: 5.7.1 @@ -5560,6 +7700,8 @@ snapshots: transitivePeerDependencies: - supports-color + boolbase@1.0.0: {} + boolean@3.2.0: {} bowser@2.14.1: {} @@ -5627,6 +7769,8 @@ snapshots: camelcase@8.0.0: {} + ccount@2.0.1: {} + chalk@2.4.2: dependencies: ansi-styles: 3.2.1 @@ -5643,10 +7787,22 @@ snapshots: chalk@5.6.2: {} + character-entities-html4@2.1.0: {} + + character-entities-legacy@3.0.0: {} + + character-entities@2.0.2: {} + + character-reference-invalid@2.0.1: {} + chardet@0.7.0: {} chardet@2.1.1: {} + chokidar@5.0.0: + dependencies: + readdirp: 5.0.0 + chownr@1.1.4: {} chownr@3.0.0: {} @@ -5698,9 +7854,13 @@ snapshots: clone@1.0.4: {} + clsx@2.1.1: {} + code-block-writer@13.0.3: optional: true + collapse-white-space@2.1.0: {} + color-convert@1.9.3: dependencies: color-name: 1.1.3 @@ -5713,10 +7873,24 @@ snapshots: color-name@1.1.4: {} + color-string@1.9.1: + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.4 + + color@4.2.3: + dependencies: + color-convert: 2.0.1 + color-string: 1.9.1 + colorette@2.0.20: {} + comma-separated-tokens@2.0.3: {} + command-exists@1.2.9: {} + commander@11.1.0: {} + commander@14.0.3: {} commander@2.20.3: {} @@ -5741,6 +7915,8 @@ snapshots: - '@types/node' - typescript + common-ancestor-path@2.0.0: {} + compare-func@2.0.0: dependencies: array-ify: 1.0.0 @@ -5767,10 +7943,14 @@ snapshots: '@simple-libs/stream-utils': 1.2.0 meow: 13.2.0 + cookie-es@1.2.3: {} + cookie-signature@1.2.2: {} cookie@0.7.2: {} + cookie@1.1.1: {} + cors@2.8.6: dependencies: object-assign: 4.1.1 @@ -5816,6 +7996,38 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 + crossws@0.3.5: + dependencies: + uncrypto: 0.1.3 + + css-select@5.2.2: + dependencies: + boolbase: 1.0.0 + css-what: 6.2.2 + domhandler: 5.0.3 + domutils: 3.2.2 + nth-check: 2.1.1 + + css-selector-parser@3.3.0: {} + + css-tree@2.2.1: + dependencies: + mdn-data: 2.0.28 + source-map-js: 1.2.1 + + css-tree@3.2.1: + dependencies: + mdn-data: 2.27.1 + source-map-js: 1.2.1 + + css-what@6.2.2: {} + + cssesc@3.0.0: {} + + csso@5.0.5: + dependencies: + css-tree: 2.2.1 + cz-conventional-changelog@3.3.0(@types/node@24.12.2)(typescript@6.0.3): dependencies: chalk: 2.4.2 @@ -5836,6 +8048,10 @@ snapshots: dependencies: ms: 2.1.3 + decode-named-character-reference@1.3.0: + dependencies: + character-entities: 2.0.2 + decompress-response@6.0.0: dependencies: mimic-response: 3.1.0 @@ -5862,6 +8078,8 @@ snapshots: has-property-descriptors: 1.0.2 object-keys: 1.1.1 + defu@6.1.7: {} + depd@2.0.0: {} dependency-path@9.2.8: @@ -5871,6 +8089,10 @@ snapshots: encode-registry: 3.0.1 semver: 7.7.4 + dequal@2.0.3: {} + + destr@2.0.5: {} + detect-file@1.0.0: {} detect-indent@6.1.0: {} @@ -5879,16 +8101,48 @@ snapshots: detect-node@2.1.0: {} + devalue@5.7.1: {} + + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + diff@5.2.2: {} + diff@8.0.4: {} + + direction@2.0.1: {} + discontinuous-range@1.0.0: {} + dlv@1.1.3: {} + + dom-serializer@2.0.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + + domelementtype@2.3.0: {} + + domhandler@5.0.3: + dependencies: + domelementtype: 2.3.0 + + domutils@3.2.2: + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + dot-prop@5.3.0: dependencies: is-obj: 2.0.0 dotenv@16.6.1: {} + dset@3.1.4: {} + dunder-proto@1.0.1: dependencies: call-bind-apply-helpers: 1.0.2 @@ -5915,6 +8169,10 @@ snapshots: dependencies: once: 1.4.0 + entities@4.5.0: {} + + entities@6.0.1: {} + env-paths@2.2.1: {} envinfo@7.21.0: {} @@ -5929,6 +8187,8 @@ snapshots: es-errors@1.3.0: {} + es-module-lexer@2.0.0: {} + es-object-atoms@1.1.1: dependencies: es-errors: 1.3.0 @@ -5937,6 +8197,20 @@ snapshots: es6-error@4.1.1: {} + esast-util-from-estree@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + devlop: 1.1.0 + estree-util-visit: 2.0.0 + unist-util-position-from-estree: 2.0.0 + + esast-util-from-js@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + acorn: 8.16.0 + esast-util-from-estree: 2.0.0 + vfile-message: 4.0.3 + esbuild@0.27.7: optionalDependencies: '@esbuild/aix-ppc64': 0.27.7 @@ -5974,6 +8248,43 @@ snapshots: escape-string-regexp@4.0.0: {} + escape-string-regexp@5.0.0: {} + + estree-util-attach-comments@3.0.0: + dependencies: + '@types/estree': 1.0.8 + + estree-util-build-jsx@3.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + estree-walker: 3.0.3 + + estree-util-is-identifier-name@3.0.0: {} + + estree-util-scope@1.0.0: + dependencies: + '@types/estree': 1.0.8 + devlop: 1.1.0 + + estree-util-to-js@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + astring: 1.9.0 + source-map: 0.7.6 + + estree-util-visit@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/unist': 3.0.3 + + estree-walker@2.0.2: {} + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.8 + etag@1.8.1: {} event-loop-spinner@2.3.2: @@ -6049,6 +8360,13 @@ snapshots: transitivePeerDependencies: - supports-color + expressive-code@0.41.7: + 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 + extend-shallow@2.0.1: dependencies: is-extendable: 0.1.1 @@ -6075,8 +8393,18 @@ snapshots: fast-safe-stringify@2.1.1: {} + fast-string-truncated-width@1.2.1: {} + + fast-string-width@1.1.0: + dependencies: + fast-string-truncated-width: 1.2.1 + fast-uri@3.1.0: {} + fast-wrap-ansi@0.1.6: + dependencies: + fast-string-width: 1.1.0 + fast-xml-builder@1.1.5: dependencies: path-expression-matcher: 1.5.0 @@ -6092,6 +8420,10 @@ snapshots: dependencies: reusify: 1.0.4 + fdir@6.5.0(picomatch@4.0.4): + optionalDependencies: + picomatch: 4.0.4 + figures@3.2.0: dependencies: escape-string-regexp: 1.0.5 @@ -6129,6 +8461,16 @@ snapshots: micromatch: 4.0.8 resolve-dir: 1.0.1 + flattie@1.1.1: {} + + fontace@0.4.1: + dependencies: + fontkitten: 1.0.3 + + fontkitten@1.0.3: + dependencies: + tiny-inflate: 1.0.3 + foreground-child@3.3.1: dependencies: cross-spawn: 7.0.6 @@ -6205,6 +8547,8 @@ snapshots: github-from-package@0.0.0: {} + github-slugger@2.0.0: {} + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -6312,6 +8656,18 @@ snapshots: section-matter: 1.0.0 strip-bom-string: 1.0.0 + h3@1.15.11: + dependencies: + cookie-es: 1.2.3 + crossws: 0.3.5 + defu: 6.1.7 + 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 + handlebars@4.7.9: dependencies: minimist: 1.2.8 @@ -6335,6 +8691,195 @@ snapshots: dependencies: function-bind: 1.1.2 + hast-util-embedded@3.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-is-element: 3.0.0 + + hast-util-format@1.1.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-embedded: 3.0.0 + hast-util-minify-whitespace: 1.0.1 + hast-util-phrasing: 3.0.1 + hast-util-whitespace: 3.0.0 + html-whitespace-sensitive-tag-names: 3.0.1 + unist-util-visit-parents: 6.0.2 + + hast-util-from-html@2.0.3: + dependencies: + '@types/hast': 3.0.4 + devlop: 1.1.0 + hast-util-from-parse5: 8.0.3 + parse5: 7.3.0 + vfile: 6.0.3 + vfile-message: 4.0.3 + + hast-util-from-parse5@8.0.3: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + devlop: 1.1.0 + hastscript: 9.0.1 + property-information: 7.1.0 + vfile: 6.0.3 + vfile-location: 5.0.3 + web-namespaces: 2.0.1 + + hast-util-has-property@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-is-body-ok-link@3.0.1: + dependencies: + '@types/hast': 3.0.4 + + hast-util-is-element@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-minify-whitespace@1.0.1: + dependencies: + '@types/hast': 3.0.4 + hast-util-embedded: 3.0.0 + hast-util-is-element: 3.0.0 + hast-util-whitespace: 3.0.0 + unist-util-is: 6.0.1 + + hast-util-parse-selector@4.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-phrasing@3.0.1: + dependencies: + '@types/hast': 3.0.4 + hast-util-embedded: 3.0.0 + hast-util-has-property: 3.0.0 + hast-util-is-body-ok-link: 3.0.1 + hast-util-is-element: 3.0.0 + + hast-util-raw@9.1.0: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + '@ungap/structured-clone': 1.3.0 + hast-util-from-parse5: 8.0.3 + hast-util-to-parse5: 8.0.1 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.1 + parse5: 7.3.0 + unist-util-position: 5.0.0 + unist-util-visit: 5.1.0 + vfile: 6.0.3 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + + hast-util-select@6.0.4: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + bcp-47-match: 2.0.3 + comma-separated-tokens: 2.0.3 + css-selector-parser: 3.3.0 + devlop: 1.1.0 + direction: 2.0.1 + hast-util-has-property: 3.0.0 + hast-util-to-string: 3.0.1 + hast-util-whitespace: 3.0.0 + nth-check: 2.1.1 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + unist-util-visit: 5.1.0 + zwitch: 2.0.4 + + hast-util-to-estree@3.1.3: + dependencies: + '@types/estree': 1.0.8 + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + devlop: 1.1.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.1 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + style-to-js: 1.1.21 + unist-util-position: 5.0.0 + zwitch: 2.0.4 + transitivePeerDependencies: + - supports-color + + hast-util-to-html@9.0.5: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.1 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.4 + zwitch: 2.0.4 + + hast-util-to-jsx-runtime@2.3.6: + dependencies: + '@types/estree': 1.0.8 + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + hast-util-whitespace: 3.0.0 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + style-to-js: 1.1.21 + unist-util-position: 5.0.0 + vfile-message: 4.0.3 + transitivePeerDependencies: + - supports-color + + hast-util-to-parse5@8.0.1: + dependencies: + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + + hast-util-to-string@3.0.1: + dependencies: + '@types/hast': 3.0.4 + + hast-util-to-text@4.0.2: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + hast-util-is-element: 3.0.0 + unist-util-find-after: 5.0.0 + + hast-util-whitespace@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hastscript@9.0.1: + dependencies: + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + hast-util-parse-selector: 4.0.0 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + help-me@5.0.0: {} homedir-polyfill@1.0.3: @@ -6349,6 +8894,12 @@ snapshots: hpagent@1.2.0: {} + html-escaper@3.0.3: {} + + html-void-elements@3.0.0: {} + + html-whitespace-sensitive-tag-names@3.0.1: {} + http-cache-semantics@4.2.0: {} http-errors@2.0.1: @@ -6366,6 +8917,10 @@ snapshots: human-signals@8.0.1: {} + i18next@23.16.8: + dependencies: + '@babel/runtime': 7.29.2 + iconv-lite@0.4.24: dependencies: safer-buffer: 2.1.2 @@ -6402,6 +8957,8 @@ snapshots: ini@4.1.1: {} + inline-style-parser@0.2.7: {} + inquirer@8.2.5: dependencies: ansi-escapes: 4.3.2 @@ -6424,12 +8981,29 @@ snapshots: ipaddr.js@1.9.1: {} + iron-webcrypto@1.2.1: {} + + is-alphabetical@2.0.1: {} + + is-alphanumerical@2.0.1: + dependencies: + is-alphabetical: 2.0.1 + is-decimal: 2.0.1 + is-arrayish@0.2.1: {} + is-arrayish@0.3.4: {} + is-core-module@2.16.1: dependencies: hasown: 2.0.2 + is-decimal@2.0.1: {} + + is-docker@3.0.0: {} + + is-docker@4.0.0: {} + is-extendable@0.1.1: {} is-extglob@2.1.1: {} @@ -6444,9 +9018,15 @@ snapshots: dependencies: is-extglob: 2.1.1 - is-interactive@1.0.0: {} + is-hexadecimal@2.0.1: {} - is-interactive@2.0.0: {} + is-inside-container@1.0.0: + dependencies: + is-docker: 3.0.0 + + is-interactive@1.0.0: {} + + is-interactive@2.0.0: {} is-number@7.0.0: {} @@ -6468,6 +9048,10 @@ snapshots: is-windows@1.0.2: {} + is-wsl@3.1.1: + dependencies: + is-inside-container: 1.0.0 + isexe@2.0.0: {} jackspeak@3.4.3: @@ -6522,6 +9106,8 @@ snapshots: kind-of@6.0.3: {} + klona@2.0.6: {} + lefthook-darwin-arm64@2.1.6: optional: true @@ -6669,6 +9255,8 @@ snapshots: strip-ansi: 7.2.0 wrap-ansi: 9.0.2 + longest-streak@3.1.0: {} + longest@2.0.1: {} lowercase-keys@2.0.0: {} @@ -6679,16 +9267,217 @@ snapshots: lru-cache@7.18.3: {} + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + magicast@0.5.2: + dependencies: + '@babel/parser': 7.29.2 + '@babel/types': 7.29.0 + source-map-js: 1.2.1 + map-age-cleaner@0.1.3: dependencies: p-defer: 1.0.0 + markdown-extensions@2.0.0: {} + + markdown-table@3.0.4: {} + matcher@3.0.0: dependencies: escape-string-regexp: 4.0.0 math-intrinsics@1.1.0: {} + mdast-util-definitions@6.0.0: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + unist-util-visit: 5.1.0 + + mdast-util-directive@3.1.0: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + parse-entities: 4.0.2 + stringify-entities: 4.0.4 + unist-util-visit-parents: 6.0.2 + transitivePeerDependencies: + - supports-color + + mdast-util-find-and-replace@3.0.2: + dependencies: + '@types/mdast': 4.0.4 + escape-string-regexp: 5.0.0 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.0.2 + + mdast-util-from-markdown@2.0.3: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + decode-named-character-reference: 1.3.0 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.2 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-decode-string: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-autolink-literal@2.0.1: + dependencies: + '@types/mdast': 4.0.4 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-find-and-replace: 3.0.2 + micromark-util-character: 2.1.1 + + mdast-util-gfm-footnote@2.1.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + micromark-util-normalize-identifier: 2.0.1 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-strikethrough@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-table@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + markdown-table: 3.0.4 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-task-list-item@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm@3.1.0: + dependencies: + mdast-util-from-markdown: 2.0.3 + mdast-util-gfm-autolink-literal: 2.0.1 + mdast-util-gfm-footnote: 2.1.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.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-expression@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-jsx@3.2.0: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + parse-entities: 4.0.2 + stringify-entities: 4.0.4 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.3 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx@3.0.0: + dependencies: + mdast-util-from-markdown: 2.0.3 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-mdxjs-esm: 2.0.1 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdxjs-esm@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-phrasing@4.1.0: + dependencies: + '@types/mdast': 4.0.4 + unist-util-is: 6.0.1 + + mdast-util-to-hast@13.2.1: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.3.0 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.1 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.1.0 + vfile: 6.0.3 + + mdast-util-to-markdown@2.1.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + longest-streak: 3.1.0 + mdast-util-phrasing: 4.1.0 + mdast-util-to-string: 4.0.0 + micromark-util-classify-character: 2.0.1 + micromark-util-decode-string: 2.0.1 + unist-util-visit: 5.1.0 + zwitch: 2.0.4 + + mdast-util-to-string@4.0.0: + dependencies: + '@types/mdast': 4.0.4 + + mdn-data@2.0.28: {} + + mdn-data@2.27.1: {} + media-typer@1.1.0: {} mem@8.1.1: @@ -6704,6 +9493,280 @@ snapshots: merge@2.1.1: {} + micromark-core-commonmark@2.0.3: + dependencies: + decode-named-character-reference: 1.3.0 + devlop: 1.1.0 + micromark-factory-destination: 2.0.1 + micromark-factory-label: 2.0.1 + micromark-factory-space: 2.0.1 + micromark-factory-title: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-html-tag-name: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-directive@3.0.2: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + parse-entities: 4.0.2 + + micromark-extension-gfm-autolink-literal@2.1.0: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-footnote@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-strikethrough@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-table@2.1.1: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-tagfilter@2.0.0: + dependencies: + micromark-util-types: 2.0.2 + + micromark-extension-gfm-task-list-item@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm@3.0.0: + dependencies: + micromark-extension-gfm-autolink-literal: 2.1.0 + micromark-extension-gfm-footnote: 2.1.0 + micromark-extension-gfm-strikethrough: 2.1.0 + micromark-extension-gfm-table: 2.1.1 + micromark-extension-gfm-tagfilter: 2.0.0 + micromark-extension-gfm-task-list-item: 2.1.0 + micromark-util-combine-extensions: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-mdx-expression@3.0.1: + dependencies: + '@types/estree': 1.0.8 + devlop: 1.1.0 + micromark-factory-mdx-expression: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-mdx-jsx@3.0.2: + dependencies: + '@types/estree': 1.0.8 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + micromark-factory-mdx-expression: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + vfile-message: 4.0.3 + + micromark-extension-mdx-md@2.0.0: + dependencies: + micromark-util-types: 2.0.2 + + micromark-extension-mdxjs-esm@3.0.0: + dependencies: + '@types/estree': 1.0.8 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.3 + + micromark-extension-mdxjs@3.0.0: + dependencies: + acorn: 8.16.0 + acorn-jsx: 5.3.2(acorn@8.16.0) + micromark-extension-mdx-expression: 3.0.1 + micromark-extension-mdx-jsx: 3.0.2 + micromark-extension-mdx-md: 2.0.0 + micromark-extension-mdxjs-esm: 3.0.0 + micromark-util-combine-extensions: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-destination@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-label@2.0.1: + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-mdx-expression@2.0.3: + dependencies: + '@types/estree': 1.0.8 + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.3 + + micromark-factory-space@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-types: 2.0.2 + + micromark-factory-title@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-whitespace@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-character@2.1.1: + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-chunked@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-classify-character@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-combine-extensions@2.0.1: + dependencies: + micromark-util-chunked: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-decode-numeric-character-reference@2.0.2: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-decode-string@2.0.1: + dependencies: + decode-named-character-reference: 1.3.0 + micromark-util-character: 2.1.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-symbol: 2.0.1 + + micromark-util-encode@2.0.1: {} + + micromark-util-events-to-acorn@2.0.3: + dependencies: + '@types/estree': 1.0.8 + '@types/unist': 3.0.3 + devlop: 1.1.0 + estree-util-visit: 2.0.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + vfile-message: 4.0.3 + + micromark-util-html-tag-name@2.0.1: {} + + micromark-util-normalize-identifier@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-resolve-all@2.0.1: + dependencies: + micromark-util-types: 2.0.2 + + micromark-util-sanitize-uri@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 + + micromark-util-subtokenize@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-symbol@2.0.1: {} + + micromark-util-types@2.0.2: {} + + micromark@4.0.2: + dependencies: + '@types/debug': 4.1.13 + debug: 4.4.3 + decode-named-character-reference: 1.3.0 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-combine-extensions: 2.0.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-encode: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + transitivePeerDependencies: + - supports-color + micromatch@4.0.8: dependencies: braces: 3.0.3 @@ -6759,6 +9822,8 @@ snapshots: moo@0.5.2: {} + mrmime@2.0.1: {} + ms@2.1.3: {} mute-stream@0.0.8: {} @@ -6767,6 +9832,8 @@ snapshots: nan@2.26.2: {} + nanoid@3.3.11: {} + napi-build-utils@2.0.0: {} nearley@2.20.1: @@ -6780,6 +9847,12 @@ snapshots: neo-async@2.6.2: {} + neotraverse@0.6.18: {} + + nlcst-to-string@4.0.0: + dependencies: + '@types/nlcst': 2.0.3 + node-abi@3.89.0: dependencies: semver: 7.7.4 @@ -6790,8 +9863,12 @@ snapshots: node-addon-api@8.7.0: {} + node-fetch-native@1.6.7: {} + node-gyp-build@4.8.4: {} + node-mock-http@1.0.4: {} + nopt@7.2.1: dependencies: abbrev: 2.0.0 @@ -6803,6 +9880,8 @@ snapshots: semver: 7.7.4 validate-npm-package-license: 3.0.4 + normalize-path@3.0.0: {} + normalize-url@6.1.0: {} npm-normalize-package-bin@3.0.1: {} @@ -6812,6 +9891,10 @@ snapshots: path-key: 4.0.0 unicorn-magic: 0.3.0 + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + object-assign@4.1.1: {} object-hash@3.0.0: {} @@ -6822,6 +9905,16 @@ snapshots: obliterator@2.0.5: {} + obug@2.1.1: {} + + ofetch@1.5.1: + dependencies: + destr: 2.0.5 + node-fetch-native: 1.6.7 + ufo: 1.6.3 + + ohash@2.0.11: {} + on-exit-leak-free@2.1.2: {} on-finished@2.4.1: @@ -6840,6 +9933,14 @@ snapshots: dependencies: mimic-function: 5.0.1 + oniguruma-parser@0.12.2: {} + + oniguruma-to-es@4.3.6: + dependencies: + oniguruma-parser: 0.12.2 + regex: 6.1.0 + regex-recursion: 6.0.2 + onnxruntime-common@1.24.3: {} onnxruntime-node@1.24.3: @@ -6882,20 +9983,53 @@ snapshots: dependencies: p-try: 2.2.0 + p-limit@7.3.0: + dependencies: + yocto-queue: 1.2.2 + p-map@4.0.0: dependencies: aggregate-error: 3.1.0 + p-queue@9.1.2: + dependencies: + eventemitter3: 5.0.4 + p-timeout: 7.0.1 + + p-timeout@7.0.1: {} + p-try@2.2.0: {} package-json-from-dist@1.0.1: {} + package-manager-detector@1.6.0: {} + packageurl-js@2.0.1: {} + pagefind@1.5.2: + optionalDependencies: + '@pagefind/darwin-arm64': 1.5.2 + '@pagefind/darwin-x64': 1.5.2 + '@pagefind/freebsd-x64': 1.5.2 + '@pagefind/linux-arm64': 1.5.2 + '@pagefind/linux-x64': 1.5.2 + '@pagefind/windows-arm64': 1.5.2 + '@pagefind/windows-x64': 1.5.2 + parent-module@1.0.1: dependencies: callsites: 3.1.0 + parse-entities@4.0.2: + dependencies: + '@types/unist': 2.0.11 + character-entities-legacy: 3.0.0 + character-reference-invalid: 2.0.1 + decode-named-character-reference: 1.3.0 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + is-hexadecimal: 2.0.1 + parse-json@5.2.0: dependencies: '@babel/code-frame': 7.29.0 @@ -6903,10 +10037,23 @@ snapshots: json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 + parse-latin@7.0.0: + dependencies: + '@types/nlcst': 2.0.3 + '@types/unist': 3.0.3 + nlcst-to-string: 4.0.0 + unist-util-modify-children: 4.0.0 + unist-util-visit-children: 3.0.0 + vfile: 6.0.3 + parse-ms@4.0.0: {} parse-passwd@1.0.0: {} + parse5@7.3.0: + dependencies: + entities: 6.0.1 + parseurl@1.3.3: {} path-browserify@1.0.1: @@ -6932,10 +10079,14 @@ snapshots: path-to-regexp@8.4.2: {} + piccolore@0.1.3: {} + picocolors@1.1.1: {} picomatch@2.3.2: {} + picomatch@4.0.4: {} + pino-abstract-transport@2.0.0: dependencies: split2: 4.2.0 @@ -6982,6 +10133,22 @@ snapshots: pkce-challenge@5.0.1: {} + postcss-nested@6.2.0(postcss@8.5.10): + dependencies: + postcss: 8.5.10 + postcss-selector-parser: 6.1.2 + + postcss-selector-parser@6.1.2: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss@8.5.10: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + prebuild-install@7.1.3: dependencies: detect-libc: 2.1.2 @@ -7001,8 +10168,12 @@ snapshots: dependencies: parse-ms: 4.0.0 + prismjs@1.30.0: {} + process-warning@5.0.0: {} + property-information@7.1.0: {} + proxy-addr@2.0.7: dependencies: forwarded: 0.2.0 @@ -7058,6 +10229,8 @@ snapshots: quick-lru@5.1.1: {} + radix3@1.1.2: {} + railroad-diagrams@1.0.0: {} randexp@0.4.6: @@ -7106,8 +10279,148 @@ snapshots: string_decoder: 1.3.0 util-deprecate: 1.0.2 + readdirp@5.0.0: {} + real-require@0.2.0: {} + recma-build-jsx@1.0.0: + dependencies: + '@types/estree': 1.0.8 + estree-util-build-jsx: 3.0.1 + vfile: 6.0.3 + + recma-jsx@1.0.1(acorn@8.16.0): + dependencies: + acorn: 8.16.0 + acorn-jsx: 5.3.2(acorn@8.16.0) + estree-util-to-js: 2.0.0 + recma-parse: 1.0.0 + recma-stringify: 1.0.0 + unified: 11.0.5 + + recma-parse@1.0.0: + dependencies: + '@types/estree': 1.0.8 + esast-util-from-js: 2.0.1 + unified: 11.0.5 + vfile: 6.0.3 + + recma-stringify@1.0.0: + dependencies: + '@types/estree': 1.0.8 + estree-util-to-js: 2.0.0 + unified: 11.0.5 + vfile: 6.0.3 + + regex-recursion@6.0.2: + dependencies: + regex-utilities: 2.3.0 + + regex-utilities@2.3.0: {} + + regex@6.1.0: + dependencies: + regex-utilities: 2.3.0 + + rehype-expressive-code@0.41.7: + dependencies: + expressive-code: 0.41.7 + + rehype-format@5.0.1: + dependencies: + '@types/hast': 3.0.4 + hast-util-format: 1.1.0 + + rehype-parse@9.0.1: + dependencies: + '@types/hast': 3.0.4 + hast-util-from-html: 2.0.3 + unified: 11.0.5 + + rehype-raw@7.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-raw: 9.1.0 + vfile: 6.0.3 + + rehype-recma@1.0.0: + dependencies: + '@types/estree': 1.0.8 + '@types/hast': 3.0.4 + hast-util-to-estree: 3.1.3 + transitivePeerDependencies: + - supports-color + + rehype-stringify@10.0.1: + dependencies: + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.5 + unified: 11.0.5 + + rehype@13.0.2: + dependencies: + '@types/hast': 3.0.4 + rehype-parse: 9.0.1 + rehype-stringify: 10.0.1 + unified: 11.0.5 + + remark-directive@3.0.1: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-directive: 3.1.0 + micromark-extension-directive: 3.0.2 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-gfm@4.0.1: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-gfm: 3.1.0 + micromark-extension-gfm: 3.0.0 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-mdx@3.1.1: + dependencies: + mdast-util-mdx: 3.0.0 + micromark-extension-mdxjs: 3.0.0 + transitivePeerDependencies: + - supports-color + + remark-parse@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.3 + micromark-util-types: 2.0.2 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-rehype@11.1.2: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + mdast-util-to-hast: 13.2.1 + unified: 11.0.5 + vfile: 6.0.3 + + remark-smartypants@3.0.2: + dependencies: + retext: 9.0.0 + retext-smartypants: 6.2.0 + unified: 11.0.5 + unist-util-visit: 5.1.0 + + remark-stringify@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-to-markdown: 2.1.2 + unified: 11.0.5 + require-directory@2.1.1: {} require-from-string@2.0.2: {} @@ -7141,6 +10454,31 @@ snapshots: ret@0.1.15: {} + retext-latin@4.0.0: + dependencies: + '@types/nlcst': 2.0.3 + parse-latin: 7.0.0 + unified: 11.0.5 + + retext-smartypants@6.2.0: + dependencies: + '@types/nlcst': 2.0.3 + nlcst-to-string: 4.0.0 + unist-util-visit: 5.1.0 + + retext-stringify@4.0.0: + dependencies: + '@types/nlcst': 2.0.3 + nlcst-to-string: 4.0.0 + unified: 11.0.5 + + retext@9.0.0: + dependencies: + '@types/nlcst': 2.0.3 + retext-latin: 4.0.0 + retext-stringify: 4.0.0 + unified: 11.0.5 + reusify@1.0.4: {} rfc4648@1.5.4: {} @@ -7156,6 +10494,37 @@ snapshots: semver-compare: 1.0.0 sprintf-js: 1.1.3 + rollup@4.60.2: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.60.2 + '@rollup/rollup-android-arm64': 4.60.2 + '@rollup/rollup-darwin-arm64': 4.60.2 + '@rollup/rollup-darwin-x64': 4.60.2 + '@rollup/rollup-freebsd-arm64': 4.60.2 + '@rollup/rollup-freebsd-x64': 4.60.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.60.2 + '@rollup/rollup-linux-arm-musleabihf': 4.60.2 + '@rollup/rollup-linux-arm64-gnu': 4.60.2 + '@rollup/rollup-linux-arm64-musl': 4.60.2 + '@rollup/rollup-linux-loong64-gnu': 4.60.2 + '@rollup/rollup-linux-loong64-musl': 4.60.2 + '@rollup/rollup-linux-ppc64-gnu': 4.60.2 + '@rollup/rollup-linux-ppc64-musl': 4.60.2 + '@rollup/rollup-linux-riscv64-gnu': 4.60.2 + '@rollup/rollup-linux-riscv64-musl': 4.60.2 + '@rollup/rollup-linux-s390x-gnu': 4.60.2 + '@rollup/rollup-linux-x64-gnu': 4.60.2 + '@rollup/rollup-linux-x64-musl': 4.60.2 + '@rollup/rollup-openbsd-x64': 4.60.2 + '@rollup/rollup-openharmony-arm64': 4.60.2 + '@rollup/rollup-win32-arm64-msvc': 4.60.2 + '@rollup/rollup-win32-ia32-msvc': 4.60.2 + '@rollup/rollup-win32-x64-gnu': 4.60.2 + '@rollup/rollup-win32-x64-msvc': 4.60.2 + fsevents: 2.3.3 + router@2.2.0: dependencies: debug: 4.4.3 @@ -7182,6 +10551,8 @@ snapshots: safer-buffer@2.1.2: {} + sax@1.6.0: {} + schemes@1.4.0: dependencies: extend: 3.0.2 @@ -7228,12 +10599,61 @@ snapshots: setprototypeof@1.2.0: {} + sharp@0.34.1: + dependencies: + color: 4.2.3 + detect-libc: 2.1.2 + semver: 7.7.4 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.34.1 + '@img/sharp-darwin-x64': 0.34.1 + '@img/sharp-libvips-darwin-arm64': 1.1.0 + '@img/sharp-libvips-darwin-x64': 1.1.0 + '@img/sharp-libvips-linux-arm': 1.1.0 + '@img/sharp-libvips-linux-arm64': 1.1.0 + '@img/sharp-libvips-linux-ppc64': 1.1.0 + '@img/sharp-libvips-linux-s390x': 1.1.0 + '@img/sharp-libvips-linux-x64': 1.1.0 + '@img/sharp-libvips-linuxmusl-arm64': 1.1.0 + '@img/sharp-libvips-linuxmusl-x64': 1.1.0 + '@img/sharp-linux-arm': 0.34.1 + '@img/sharp-linux-arm64': 0.34.1 + '@img/sharp-linux-s390x': 0.34.1 + '@img/sharp-linux-x64': 0.34.1 + '@img/sharp-linuxmusl-arm64': 0.34.1 + '@img/sharp-linuxmusl-x64': 0.34.1 + '@img/sharp-wasm32': 0.34.1 + '@img/sharp-win32-ia32': 0.34.1 + '@img/sharp-win32-x64': 0.34.1 + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 shebang-regex@3.0.0: {} + shiki@3.23.0: + 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 + + shiki@4.0.2: + dependencies: + '@shikijs/core': 4.0.2 + '@shikijs/engine-javascript': 4.0.2 + '@shikijs/engine-oniguruma': 4.0.2 + '@shikijs/langs': 4.0.2 + '@shikijs/themes': 4.0.2 + '@shikijs/types': 4.0.2 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + side-channel-list@1.0.1: dependencies: es-errors: 1.3.0 @@ -7284,6 +10704,19 @@ snapshots: transitivePeerDependencies: - supports-color + simple-swizzle@0.2.4: + dependencies: + is-arrayish: 0.3.4 + + sisteransi@1.0.5: {} + + sitemap@9.0.1: + dependencies: + '@types/node': 24.12.2 + '@types/sax': 1.2.7 + arg: 5.0.2 + sax: 1.6.0 + slice-ansi@7.1.2: dependencies: ansi-styles: 6.2.3 @@ -7296,6 +10729,8 @@ snapshots: slide@1.1.6: {} + smol-toml@1.6.1: {} + smtp-address-parser@1.1.0: dependencies: nearley: 2.20.1 @@ -7337,8 +10772,14 @@ snapshots: dependencies: atomic-sleep: 1.0.0 + source-map-js@1.2.1: {} + source-map@0.6.1: {} + source-map@0.7.6: {} + + space-separated-tokens@2.0.2: {} + spdx-compare@1.0.0: dependencies: array-find-index: 1.0.2 @@ -7375,6 +10816,8 @@ snapshots: stdin-discarder@0.2.2: {} + stream-replace-string@2.0.0: {} + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -7402,6 +10845,11 @@ snapshots: dependencies: safe-buffer: 5.2.1 + stringify-entities@4.0.4: + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 @@ -7424,6 +10872,14 @@ snapshots: strnum@2.2.3: {} + style-to-js@1.1.21: + dependencies: + style-to-object: 1.0.14 + + style-to-object@1.0.14: + dependencies: + inline-style-parser: 0.2.7 + supports-color@5.5.0: dependencies: has-flag: 3.0.0 @@ -7432,6 +10888,16 @@ snapshots: dependencies: has-flag: 4.0.0 + svgo@4.0.1: + dependencies: + commander: 11.1.0 + css-select: 5.2.2 + css-tree: 3.2.1 + css-what: 6.2.2 + csso: 5.0.5 + picocolors: 1.1.1 + sax: 1.6.0 + tar-fs@2.1.4: dependencies: chownr: 1.1.4 @@ -7461,8 +10927,17 @@ snapshots: through@2.3.8: {} + tiny-inflate@1.0.3: {} + + tinyclip@0.1.12: {} + tinyexec@1.1.1: {} + tinyglobby@0.2.16: + dependencies: + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 + tinylogic@2.0.0: {} tmp@0.2.4: {} @@ -7595,12 +11070,20 @@ snapshots: treeify@1.1.0: {} + trim-lines@3.0.1: {} + + trough@2.2.0: {} + ts-morph@25.0.1: dependencies: '@ts-morph/common': 0.26.1 code-block-writer: 13.0.3 optional: true + tsconfck@3.1.6(typescript@6.0.3): + optionalDependencies: + typescript: 6.0.3 + tslib@1.14.1: {} tslib@2.8.1: {} @@ -7634,17 +11117,96 @@ snapshots: typescript@6.0.3: {} + ufo@1.6.3: {} + uglify-js@3.19.3: optional: true + ultrahtml@1.6.0: {} + + uncrypto@0.1.3: {} + undici-types@7.16.0: {} unicorn-magic@0.3.0: {} + unified@11.0.5: + dependencies: + '@types/unist': 3.0.3 + bail: 2.0.2 + devlop: 1.1.0 + extend: 3.0.2 + is-plain-obj: 4.1.0 + trough: 2.2.0 + vfile: 6.0.3 + + unifont@0.7.4: + dependencies: + css-tree: 3.2.1 + ofetch: 1.5.1 + ohash: 2.0.11 + + unist-util-find-after@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + + unist-util-is@6.0.1: + dependencies: + '@types/unist': 3.0.3 + + unist-util-modify-children@4.0.0: + dependencies: + '@types/unist': 3.0.3 + array-iterate: 2.0.1 + + unist-util-position-from-estree@2.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-remove-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-visit: 5.1.0 + + unist-util-stringify-position@4.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-children@3.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-parents@6.0.2: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + + unist-util-visit@5.1.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.0.2 + universalify@2.0.1: {} unpipe@1.0.0: {} + unstorage@1.17.5: + dependencies: + anymatch: 3.1.3 + chokidar: 5.0.0 + destr: 2.0.5 + h3: 1.15.11 + lru-cache: 11.3.5 + node-fetch-native: 1.6.7 + ofetch: 1.5.1 + ufo: 1.6.3 + uri-js@4.4.1: dependencies: punycode: 2.3.1 @@ -7660,12 +11222,50 @@ snapshots: vary@1.1.2: {} + vfile-location@5.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile: 6.0.3 + + vfile-message@4.0.3: + dependencies: + '@types/unist': 3.0.3 + unist-util-stringify-position: 4.0.0 + + vfile@6.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile-message: 4.0.3 + + vite@7.3.2(@types/node@24.12.2)(jiti@2.4.1)(tsx@4.21.0)(yaml@2.8.3): + dependencies: + esbuild: 0.27.7 + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 + postcss: 8.5.10 + rollup: 4.60.2 + tinyglobby: 0.2.16 + optionalDependencies: + '@types/node': 24.12.2 + fsevents: 2.3.3 + jiti: 2.4.1 + tsx: 4.21.0 + yaml: 2.8.3 + + vitefu@1.1.3(vite@7.3.2(@types/node@24.12.2)(jiti@2.4.1)(tsx@4.21.0)(yaml@2.8.3)): + optionalDependencies: + vite: 7.3.2(@types/node@24.12.2)(jiti@2.4.1)(tsx@4.21.0)(yaml@2.8.3) + wcwidth@1.0.1: dependencies: defaults: 1.0.4 + web-namespaces@2.0.1: {} + web-tree-sitter@0.26.8: {} + which-pm-runs@1.1.0: {} + which@1.3.1: dependencies: isexe: 2.0.0 @@ -7718,6 +11318,8 @@ snapshots: dependencies: signal-exit: 4.1.0 + xxhash-wasm@1.1.0: {} + y18n@5.0.8: {} yallist@5.0.0: {} @@ -7726,6 +11328,8 @@ snapshots: yargs-parser@21.1.1: {} + yargs-parser@22.0.0: {} + yargs@17.7.2: dependencies: cliui: 8.0.1 @@ -7736,6 +11340,8 @@ snapshots: y18n: 5.0.8 yargs-parser: 21.1.1 + yocto-queue@1.2.2: {} + yoctocolors-cjs@2.1.3: {} yoctocolors@2.1.2: {} @@ -7748,4 +11354,6 @@ snapshots: zod@4.3.6: {} + zwitch@2.0.4: {} + time: {}