From 41bb5f107deec70de87ae1f5fc9c12088a0e92ef Mon Sep 17 00:00:00 2001 From: hermes Date: Thu, 15 Oct 2026 04:33:51 +0000 Subject: [PATCH 1/5] docs(web): design for the idx website Landing page, docs sitemap, agent features, generated references, and Cloudflare Pages hosting at idx.rasyidanaf.com. For review before build. Co-Authored-By: Claude Opus 5.5 --- web/DESIGN.md | 196 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 196 insertions(+) create mode 100644 web/DESIGN.md diff --git a/web/DESIGN.md b/web/DESIGN.md new file mode 100644 index 0000000..72b1444 --- /dev/null +++ b/web/DESIGN.md @@ -0,0 +1,196 @@ +# idx-cli website: design + +**Status:** Draft 2026-10-15, for review before any build work. +**Branch:** `feat/web`. **URL:** `https://idx.rasyidanaf.com`. + +## Goals + +1. Explain in one screen what idx does: Indonesian stock data and KSEI + ownership, from a terminal or an AI agent. +2. Get someone from zero to a working `idx` or `idx-mcp` in under a minute, + whatever their install path (npm, curl, Cargo, Nix) or agent. +3. Be readable by agents: every page as Markdown, plus `llms.txt`. +4. Stay correct as the CLI changes. Reference pages are generated from the + tested sources, not written by hand. + +Non-goals: a blog, a hosted API, live market data on the site, user accounts. + +## Audiences + +| Who | Arrives wanting | Lands on | +| --- | --- | --- | +| Developer / trader | "what is this, how do I install it" | landing, then Install | +| Agent user | "how do I add this to Claude Code / Codex / ..." | MCP setup | +| The agent itself | the output contract and the tool list | `llms.txt`, `/agents` | +| Contributor | architecture, tests | GitHub (`docs/`), not the site | + +## Sitemap + +```text +/ landing +/start/install npm, curl, Cargo, Nix; helper tools; Windows note +/start/quickstart first stocks and ownership commands +/start/config config file, env vars, precedence +/cli/stocks guide: quote, history, analysis, screen, compare +/cli/ownership guide: sync, ticker, entity, search, changes, graph, + self-serve import +/cli/output table/json/jsonl, errors, exit codes, piping +/cli/reference generated: every command and flag +/mcp what idx-mcp serves, envelope, limits +/mcp/setup one tab per client (see below) +/mcp/tools generated: the 11 tools (plus opt-in ownership_sync) +/agents using idx from an agent: contract, recipes, skill file +/about data sources, freshness, disclaimer, license +/llms.txt, /llms-full.txt generated +``` + +Maintainer docs (`docs/ARCHITECTURE.md`, publishing, smoke tests) stay in the +repo and are linked, not copied. + +## Landing page + +```text +┌──────────────────────────────────────────────────────────────────────┐ +│ idx Docs MCP Agents GitHub ★ [search] │ +├──────────────────────────────────────────────────────────────────────┤ +│ │ +│ Indonesian stocks and ownership, ┌── terminal ───────────┐ │ +│ in your terminal and your agent. │ $ idx stocks quote │ │ +│ │ BBCA BBRI BMRI │ │ +│ Quotes, fundamentals, technicals and │ SYMBOL PRICE CHG% │ │ +│ KSEI shareholder data for IDX, as │ BBCA ... │ │ +│ tables or JSON. Ships an MCP server. │ │ │ +│ │ $ idx ownership │ │ +│ [npm] [curl] [cargo] [nix] │ ticker BBCA │ │ +│ ┌──────────────────────────────┐ [copy] │ HOLDER % │ │ +│ │ npm install -g idx-cli │ │ ... │ │ +│ └──────────────────────────────┘ └───────────────────────┘ │ +│ [Get started] [Add to your agent] │ +├──────────────────────────────────────────────────────────────────────┤ +│ Stocks Ownership Agents │ +│ quotes, history, who holds >1% of every JSON when piped, │ +│ fundamentals, IDX stock, monthly exit codes, MCP │ +│ technicals, screen changes, offline queries server with 11 tools │ +├──────────────────────────────────────────────────────────────────────┤ +│ Add idx to your agent │ +│ [Claude Code] [Codex] [Cursor] [opencode] [pi] [Hermes] [other] │ +│ ┌──────────────────────────────────────────────────────┐ [copy] │ +│ │ claude mcp add idx -- npx -y idx-mcp │ │ +│ └──────────────────────────────────────────────────────┘ │ +│ "Who are BBCA's largest holders, and what changed last month?" │ +│ → get_shareholders, get_ownership_changes │ +├──────────────────────────────────────────────────────────────────────┤ +│ Ownership spotlight: one real ticker's holder table and a monthly │ +│ change, with the snapshot date shown. │ +├──────────────────────────────────────────────────────────────────────┤ +│ Built for pipes │ +│ idx stocks screen --filter high-dividend | jq -r '.[].symbol' \ │ +│ | idx stocks compare - │ +├──────────────────────────────────────────────────────────────────────┤ +│ MIT · GitHub · npm · crates.io · Not affiliated with IDX or KSEI │ +└──────────────────────────────────────────────────────────────────────┘ +``` + +On mobile the terminal moves below the hero text and the feature columns +stack. + +## Visual direction + +- **Mood:** a quiet terminal tool. Dark by default with a light theme, + monospace for anything that's a command or output, generous whitespace, + no stock-photo charts. +- **Colour:** neutral greys plus one accent. Proposal: the red of the + Indonesian flag (`#CE1126`) for links and the primary button, with green + and red only for price moves, matching the CLI's table colours. +- **Type:** system UI font for text, a monospace stack + (`JetBrains Mono`, falling back to `ui-monospace`) for code. No web font + is required for the first version. +- **Terminal panels:** static HTML rendered from real `idx` output, not + images or GIFs, so they are copyable, searchable and readable by agents. + Each panel shows the capture date. +- **Logo:** a wordmark, `idx` in monospace with a block cursor. No IDX or + KSEI marks; the footer and `/about` say the project is unaffiliated. + +## Content sources and drift + +| Page | Source | How | +| --- | --- | --- | +| `/cli/reference` | `idx --help` per command | a script runs the built binary and writes Markdown | +| `/mcp/tools` | `crates/idx-mcp/tests/golden/tools.json` | rendered at build time from the golden | +| Terminal panels | real `idx` runs | `web/scripts/capture.sh` saves output with a date; refreshed by hand | +| Install, guides | hand-written | reviewed when the README changes | + +The README shrinks to a pitch, one install line per channel, and a link to the +site. The site becomes the one place for user docs. + +## Agent features + +- `/llms.txt` (index) and `/llms-full.txt` (all docs in one file), from the + `starlight-llms-txt` plugin. +- Every page also served as `.md`, and a "Copy as Markdown" button. +- `/agents` covers the contract an agent relies on: JSON when piped, one + error object on stderr, exit codes `2`-`5`, symbols from stdin, the MCP + envelope and its limits. +- A downloadable skill file (`SKILL.md`) that teaches an agent to use the + `idx` CLI directly, for harnesses where an MCP server isn't wanted. + +## MCP setup tabs + +Each tab gives one copyable command or config block, plus where the file +lives: + +- **Claude Code:** `claude mcp add idx -- npx -y idx-mcp`. +- **Codex:** `~/.codex/config.toml`, `[mcp_servers.idx]`. +- **Cursor / VS Code:** `mcp.json`. +- **opencode:** `opencode.json`, `mcp.idx` with `type: "local"`. +- **pi:** `mcp.json`. +- **Hermes:** `config.yaml`, `mcp_servers.idx`. +- **Other:** the `idx-mcp` command over stdio. + +These configs are the ones `tests/agents/agent-smoke.sh` already runs, so the +site can link that script as proof they work. + +## Stack + +- **Astro + Starlight**, in `web/`, using bun (as the personal site does). + Starlight brings search (Pagefind), sidebar, dark/light theme, i18n and + MDX. The landing page is a custom Starlight `splash` page with components. +- **No client framework.** Tabs and copy buttons use Starlight's built-ins; + the result is static HTML with almost no JavaScript. +- **Nix:** a `devShells.web` with bun, kept out of `nix flake check` so the + Rust gate stays fast. The site has its own CI check (build plus link check). + +## Hosting and deploy + +- **Cloudflare Pages**, a new project `idx-cli-web`, connected to this + repository through the GitHub integration (the personal site already uses + it): + - root dir `web`, build `bun install && bun run build`, output `dist`; + - production branch `main`; previews for PRs; + - build watch paths `web/**`, so Rust-only changes don't redeploy. +- **Domain:** add `idx.rasyidanaf.com` as a Pages custom domain. Cloudflare + then creates the `idx` CNAME, which takes precedence over the zone's + wildcard `*.rasyidanaf.com` record. +- **Generated references:** the CLI reference needs a built `idx`. Pages + builds can't run Cargo cheaply, so the generated Markdown is committed, and + a check in `nix flake check` fails when it is out of date (the same pattern + as the goldens). + +## Phases + +1. **Scaffold:** Starlight in `web/`, theme and wordmark, deploy to a + `*.pages.dev` preview. +2. **Landing + install + quickstart.** +3. **Guides:** stocks, ownership, output, config. +4. **MCP and agents:** setup tabs, generated tool reference, `/agents`, + `llms.txt`, skill file. +5. **Generated CLI reference** and its drift check. +6. **Go live:** custom domain, README trimmed, links from npm and crates.io + metadata (`homepage`). + +## Open questions + +1. Indonesian translation: English only at launch, or both from the start? +2. Accent colour: flag red, or something more neutral? +3. Terminal panels: real current data (dated), or stable sample data? +4. Analytics: none, or Cloudflare Web Analytics (cookieless)? From e2310618202f60535c74aad516f7f8881770411a Mon Sep 17 00:00:00 2001 From: hermes Date: Thu, 15 Oct 2026 04:43:52 +0000 Subject: [PATCH 2/5] docs(web): agent-led install prompt and agents/install.md Co-Authored-By: Claude Opus 5.5 --- web/DESIGN.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/web/DESIGN.md b/web/DESIGN.md index 72b1444..8d17664 100644 --- a/web/DESIGN.md +++ b/web/DESIGN.md @@ -40,6 +40,7 @@ Non-goals: a blog, a hosted API, live market data on the site, user accounts. /mcp/setup one tab per client (see below) /mcp/tools generated: the 11 tools (plus opt-in ownership_sync) /agents using idx from an agent: contract, recipes, skill file +/agents/install.md instructions an agent follows to install and register idx /about data sources, freshness, disclaimer, license /llms.txt, /llms-full.txt generated ``` @@ -125,6 +126,23 @@ site. The site becomes the one place for user docs. ## Agent features +- **Agent-led install.** The landing install tabs end with "Ask your agent", + and the MCP setup page opens with the same box: a one-line prompt to paste + into any coding agent: + + > Install idx-cli and its MCP server for me by following + > https://idx.rasyidanaf.com/agents/install.md, then show me that it works. + + The prompt stays short and stable; the instructions live in + `/agents/install.md`, served as plain Markdown. That file tells the agent + to: detect OS and architecture; pick npm, the install script or Cargo + (no sudo); confirm with `idx --version`; work out which harness it is + running in and register `idx-mcp` with that harness's config from the + setup tabs; ask before editing global config; run `idx ownership sync`; + and finish with a test call (`get_shareholders BBCA`) reported back to the + user. `tests/agents/agent-smoke.sh` gains a case that runs this prompt + against each agent in a throwaway home, so the instructions stay working. + - `/llms.txt` (index) and `/llms-full.txt` (all docs in one file), from the `starlight-llms-txt` plugin. - Every page also served as `.md`, and a "Copy as Markdown" button. From e6805474f596c3a9b29691b70dd2a88ca5e8e42e Mon Sep 17 00:00:00 2001 From: hermes Date: Thu, 15 Oct 2026 05:12:45 +0000 Subject: [PATCH 3/5] feat(web): idx website and user docs (Astro Starlight) Landing page plus docs for install, quickstart, config, the stocks and ownership CLI, output and exit codes, the MCP server and per-agent setup, agent usage, and an agent-led install page (agents/install.md) that a coding agent follows from a one-line prompt. - Every docs page is also served as Markdown at .md; llms.txt and llms-full.txt come from starlight-llms-txt; a SKILL.md for skill-based harnesses is under /skills/idx/. - The CLI reference and MCP tools pages are generated from idx --help and the tools golden; a new web-generated flake check fails when they drift. - nix develop .#web provides bun; Cloudflare Pages builds web/ on pushes. - Package homepage metadata points at https://idx.rasyidanaf.com. - .cloudflare/ (the cf CLI's account cache) is git-ignored. Co-Authored-By: Claude Opus 5.5 --- .gitignore | 3 + AGENTS.md | 8 + Cargo.toml | 2 +- README.md | 3 + flake.nix | 18 + npm/idx-mcp/package.json | 2 +- package.json | 2 +- web/.gitignore | 21 + web/DESIGN.md | 4 +- web/astro.config.mjs | 65 ++ web/bun.lock | 804 ++++++++++++++++ web/package.json | 20 + web/public/favicon.svg | 1 + web/public/skills/idx/SKILL.md | 37 + web/scripts/gen-cli-reference.sh | 58 ++ web/scripts/gen-mcp-tools.sh | 49 + web/src/assets/wordmark-dark.svg | 1 + web/src/assets/wordmark-light.svg | 1 + web/src/components/PageTitle.astro | 34 + web/src/content.config.ts | 7 + web/src/content/docs/about.md | 33 + web/src/content/docs/agents/index.md | 60 ++ web/src/content/docs/agents/install.md | 95 ++ web/src/content/docs/cli/output.md | 53 ++ web/src/content/docs/cli/ownership.md | 57 ++ web/src/content/docs/cli/reference.md | 1103 ++++++++++++++++++++++ web/src/content/docs/cli/stocks.md | 67 ++ web/src/content/docs/mcp/index.md | 56 ++ web/src/content/docs/mcp/setup.mdx | 142 +++ web/src/content/docs/mcp/tools.md | 115 +++ web/src/content/docs/start/config.md | 75 ++ web/src/content/docs/start/install.mdx | 98 ++ web/src/content/docs/start/quickstart.md | 50 + web/src/pages/[...slug].md.ts | 15 + web/src/pages/index.astro | 427 +++++++++ web/src/styles/theme.css | 42 + web/tsconfig.json | 5 + 37 files changed, 3629 insertions(+), 4 deletions(-) create mode 100644 web/.gitignore create mode 100644 web/astro.config.mjs create mode 100644 web/bun.lock create mode 100644 web/package.json create mode 100644 web/public/favicon.svg create mode 100644 web/public/skills/idx/SKILL.md create mode 100755 web/scripts/gen-cli-reference.sh create mode 100755 web/scripts/gen-mcp-tools.sh create mode 100644 web/src/assets/wordmark-dark.svg create mode 100644 web/src/assets/wordmark-light.svg create mode 100644 web/src/components/PageTitle.astro create mode 100644 web/src/content.config.ts create mode 100644 web/src/content/docs/about.md create mode 100644 web/src/content/docs/agents/index.md create mode 100644 web/src/content/docs/agents/install.md create mode 100644 web/src/content/docs/cli/output.md create mode 100644 web/src/content/docs/cli/ownership.md create mode 100644 web/src/content/docs/cli/reference.md create mode 100644 web/src/content/docs/cli/stocks.md create mode 100644 web/src/content/docs/mcp/index.md create mode 100644 web/src/content/docs/mcp/setup.mdx create mode 100644 web/src/content/docs/mcp/tools.md create mode 100644 web/src/content/docs/start/config.md create mode 100644 web/src/content/docs/start/install.mdx create mode 100644 web/src/content/docs/start/quickstart.md create mode 100644 web/src/pages/[...slug].md.ts create mode 100644 web/src/pages/index.astro create mode 100644 web/src/styles/theme.css create mode 100644 web/tsconfig.json diff --git a/.gitignore b/.gitignore index 834cbcc..2cc5a6b 100644 --- a/.gitignore +++ b/.gitignore @@ -21,3 +21,6 @@ research/ /target out.txt + +# Cloudflare CLI account cache +.cloudflare/ diff --git a/AGENTS.md b/AGENTS.md index 5b6a9fe..6eb9efa 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -23,6 +23,7 @@ crates/idx-cli/ binary `idx` crates/idx-mcp/ binary `idx-mcp`: stdio MCP tools (server.rs), inputs (params.rs) └── tests/mcp.rs JSON-RPC over stdio against the mock provider tests/agents/ opt-in agent smoke test: real coding agents against idx-mcp +web/ website + user docs (Astro Starlight, bun); deployed by Cloudflare Pages scripts/ smoke, installer, and ownership snapshot publisher ``` @@ -54,4 +55,11 @@ nix flake check -L # canonical gate (fmt, clippy, tests, p nix develop --command cargo test # focused loop scripts/live-smoke.sh --compare # live drift check, A/B against an older build tests/agents/agent-smoke.sh # after changing idx-mcp tools: real agents, opt-in +nix develop .#web --command sh -c 'cd web && bun install && bun run build' # website ``` + +## Website +User-facing docs live in `web/src/content/docs/`; `docs/` is for maintainers. +When CLI help or idx-mcp tools change, regenerate the reference pages +(`web/scripts/gen-cli-reference.sh ` and `web/scripts/gen-mcp-tools.sh +crates/idx-mcp/tests/golden/tools.json`); `nix flake check` fails until you do. diff --git a/Cargo.toml b/Cargo.toml index 7de7e56..30b7c40 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,7 +8,7 @@ edition = "2024" rust-version = "1.89" license = "MIT" repository = "https://github.com/0xrsydn/idx-cli" -homepage = "https://github.com/0xrsydn/idx-cli" +homepage = "https://idx.rasyidanaf.com" [workspace.dependencies] idx-core = { path = "crates/idx-core", version = "=0.3.1" } diff --git a/README.md b/README.md index cea4d9f..1313308 100644 --- a/README.md +++ b/README.md @@ -184,6 +184,9 @@ tool (it downloads several MB). ## Documentation +User docs, MCP setup per agent, and agent-readable `llms.txt`: +**https://idx.rasyidanaf.com**. Maintainer docs: + - [docs/INSTALL.md](docs/INSTALL.md): install script options - [docs/NPM_DISTRIBUTION.md](docs/NPM_DISTRIBUTION.md): npm package and release flow - [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md): providers, ownership ingest, and discovery diff --git a/flake.nix b/flake.nix index e6e6a4e..1093e91 100644 --- a/flake.nix +++ b/flake.nix @@ -272,6 +272,18 @@ jq -se 'map(select(.id == 2))[0].result.tools | length == 11' out.jsonl touch "$out" ''; + # The website's generated pages match the CLI help and the MCP + # tools golden; regenerate with web/scripts/gen-*.sh. + web-generated = pkgs.runCommand "idx-web-generated" + { nativeBuildInputs = with pkgs; [ bash coreutils diffutils gawk gnused jq ]; } + '' + export HOME="$TMPDIR" XDG_CACHE_HOME="$TMPDIR/cache" XDG_CONFIG_HOME="$TMPDIR/config" + bash ${./web/scripts/gen-cli-reference.sh} ${idxPackage}/bin/idx > reference.md + diff -u ${./web/src/content/docs/cli/reference.md} reference.md + bash ${./web/scripts/gen-mcp-tools.sh} ${./crates/idx-mcp/tests/golden/tools.json} > tools.md + diff -u ${./web/src/content/docs/mcp/tools.md} tools.md + touch "$out" + ''; install-script-sh = installerCheck "sh"; install-script-dash = installerCheck "dash"; shellcheck = pkgs.runCommand "idx-shellcheck" { @@ -281,6 +293,7 @@ shellcheck ${installerSrc}/scripts/install-sh-test.sh shellcheck ${./scripts/live-smoke.sh} shellcheck ${./tests/agents/agent-smoke.sh} + shellcheck ${./web/scripts/gen-cli-reference.sh} ${./web/scripts/gen-mcp-tools.sh} touch "$out" ''; publisher-test = pkgs.runCommand "idx-publisher-test" { @@ -314,6 +327,11 @@ ''; }); + # `nix develop .#web`: bun for the website in web/. + devShells.web = pkgs.mkShell { + packages = with pkgs; [ bun nodejs_22 jq ]; + }; + devShells.default = pkgs.mkShell { inputsFrom = [ idxPackage ]; packages = with pkgs; [ diff --git a/npm/idx-mcp/package.json b/npm/idx-mcp/package.json index ec6a789..f9a49d0 100644 --- a/npm/idx-mcp/package.json +++ b/npm/idx-mcp/package.json @@ -8,7 +8,7 @@ "url": "git+https://github.com/0xrsydn/idx-cli.git", "directory": "npm/idx-mcp" }, - "homepage": "https://github.com/0xrsydn/idx-cli", + "homepage": "https://idx.rasyidanaf.com/mcp/", "keywords": [ "idx", "stocks", diff --git a/package.json b/package.json index 0cf55fc..4752a30 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "type": "git", "url": "git+https://github.com/0xrsydn/idx-cli.git" }, - "homepage": "https://github.com/0xrsydn/idx-cli", + "homepage": "https://idx.rasyidanaf.com", "keywords": [ "idx", "stocks", diff --git a/web/.gitignore b/web/.gitignore new file mode 100644 index 0000000..6240da8 --- /dev/null +++ b/web/.gitignore @@ -0,0 +1,21 @@ +# build output +dist/ +# generated types +.astro/ + +# dependencies +node_modules/ + +# logs +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* + + +# environment variables +.env +.env.production + +# macOS-specific files +.DS_Store diff --git a/web/DESIGN.md b/web/DESIGN.md index 8d17664..80b5126 100644 --- a/web/DESIGN.md +++ b/web/DESIGN.md @@ -1,6 +1,8 @@ # idx-cli website: design -**Status:** Draft 2026-10-15, for review before any build work. +**Status:** Built 2026-10-15 (phases 1-5). The landing page is a standalone +Astro page (`src/pages/index.astro`); the docs are Starlight. The agent-smoke +case for the install prompt is still to do. **Branch:** `feat/web`. **URL:** `https://idx.rasyidanaf.com`. ## Goals diff --git a/web/astro.config.mjs b/web/astro.config.mjs new file mode 100644 index 0000000..b7ba1cd --- /dev/null +++ b/web/astro.config.mjs @@ -0,0 +1,65 @@ +// @ts-check +import { defineConfig } from 'astro/config'; +import starlight from '@astrojs/starlight'; +import starlightLlmsTxt from 'starlight-llms-txt'; + +export default defineConfig({ + site: 'https://idx.rasyidanaf.com', + integrations: [ + starlight({ + title: 'idx', + description: + 'Indonesian stock market (IDX) data and KSEI shareholder ownership, from the terminal or an AI agent through MCP.', + logo: { light: './src/assets/wordmark-light.svg', dark: './src/assets/wordmark-dark.svg', alt: 'idx', replacesTitle: true }, + favicon: '/favicon.svg', + social: [{ icon: 'github', label: 'GitHub', href: 'https://github.com/0xrsydn/idx-cli' }], + editLink: { baseUrl: 'https://github.com/0xrsydn/idx-cli/edit/main/web/' }, + customCss: [ + '@fontsource/ibm-plex-sans/400.css', + '@fontsource/ibm-plex-sans/600.css', + '@fontsource/jetbrains-mono/400.css', + './src/styles/theme.css', + ], + components: { + PageTitle: './src/components/PageTitle.astro', + }, + sidebar: [ + { + label: 'Start', + items: ['start/install', 'start/quickstart', 'start/config'], + }, + { + label: 'CLI', + items: ['cli/stocks', 'cli/ownership', 'cli/output', 'cli/reference'], + }, + { + label: 'MCP server', + items: [ + { label: 'Overview', slug: 'mcp' }, + 'mcp/setup', + 'mcp/tools', + ], + }, + { + label: 'For agents', + items: [ + { label: 'Using idx from an agent', slug: 'agents' }, + 'agents/install', + { label: 'llms.txt', link: '/llms.txt' }, + ], + }, + 'about', + ], + plugins: [ + starlightLlmsTxt({ + projectName: 'idx-cli', + details: [ + '- `idx` is a CLI; `idx-mcp` is an MCP server over the same library. Both read the same config, cache and ownership database.', + '- Output is JSON whenever stdout is not a terminal. Errors are one JSON object on stderr; exit codes: 2 invalid input, 3 not found, 4 upstream unavailable, 5 unsupported, 1 other.', + '- Every page is also available as Markdown by appending `.md` to its path, for example `/agents/install.md`.', + ].join('\n'), + }), + ], + }), + ], +}); diff --git a/web/bun.lock b/web/bun.lock new file mode 100644 index 0000000..6f77d92 --- /dev/null +++ b/web/bun.lock @@ -0,0 +1,804 @@ +{ + "lockfileVersion": 1, + "configVersion": 1, + "workspaces": { + "": { + "name": "web", + "dependencies": { + "@astrojs/starlight": "^0.42.6", + "@fontsource/ibm-plex-sans": "^5.3.0", + "@fontsource/jetbrains-mono": "^5.3.0", + "astro": "^7.2.10", + "sharp": "^0.35.3", + "starlight-llms-txt": "^0.12.0", + }, + }, + }, + "packages": { + "@astrojs/compiler-binding": ["@astrojs/compiler-binding@0.5.2", "", { "optionalDependencies": { "@astrojs/compiler-binding-android-arm64": "0.5.2", "@astrojs/compiler-binding-darwin-arm64": "0.5.2", "@astrojs/compiler-binding-darwin-x64": "0.5.2", "@astrojs/compiler-binding-linux-arm64-gnu": "0.5.2", "@astrojs/compiler-binding-linux-arm64-musl": "0.5.2", "@astrojs/compiler-binding-linux-x64-gnu": "0.5.2", "@astrojs/compiler-binding-linux-x64-musl": "0.5.2", "@astrojs/compiler-binding-wasm32-wasi": "0.5.2", "@astrojs/compiler-binding-win32-arm64-msvc": "0.5.2", "@astrojs/compiler-binding-win32-x64-msvc": "0.5.2" } }, "sha512-lEn76+0JcMQ5RDXU0wSMWJg2ZppiZvSULpghC29cfv4o9bhvWFDbQjsCtvjjXN9iVLFQ7fL3wTR2L2UU13mP8g=="], + + "@astrojs/compiler-binding-android-arm64": ["@astrojs/compiler-binding-android-arm64@0.5.2", "", { "os": "android", "cpu": "arm64" }, "sha512-kckIxon6Rm/Bxzh9mGPYpRRqUbToUQoHptCmpMmE+Yt0Xumq8CqrKUidyYhrBsrHVO7bxuRzzWUUqvpf+iYceQ=="], + + "@astrojs/compiler-binding-darwin-arm64": ["@astrojs/compiler-binding-darwin-arm64@0.5.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-1ZG5Ar3dD8HtodX9XH1mRmE0qBXZlvjYXSFfpgFwocqfWnvhFuqtGUNseL8wgfImiRMztIjpQqlogQFQQtgiag=="], + + "@astrojs/compiler-binding-darwin-x64": ["@astrojs/compiler-binding-darwin-x64@0.5.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-+kl35S7hiHJ2cb7eujwEsPFYYuSgE11uEE2Z20lAJ+undpgulMcW+weQqFPOSSZccEKHOiLIY+kQHkb4e4092w=="], + + "@astrojs/compiler-binding-linux-arm64-gnu": ["@astrojs/compiler-binding-linux-arm64-gnu@0.5.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-BqlR0EHNQLPLwgL9+xogjsAc7zGf0cHho2CPdhv0P1yqbVMwGVaGAqrANP6VYAXCqSC43AF4Czcxc2n+oqdesg=="], + + "@astrojs/compiler-binding-linux-arm64-musl": ["@astrojs/compiler-binding-linux-arm64-musl@0.5.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-GRGyby3AZWw5d6JQzidyxPyvGgHWsSusrpgKyFVpDTKctABF7L3Pd5V1cRJbV36/rcu+Eh292/wL7pF7MkmGkQ=="], + + "@astrojs/compiler-binding-linux-x64-gnu": ["@astrojs/compiler-binding-linux-x64-gnu@0.5.2", "", { "os": "linux", "cpu": "x64" }, "sha512-9XAqGTMQAtIslMsjK3xdyY6OI9d59OZqcLBB6pvD/DcoR0daYswfrKx2azdDERDY4AqAnWPC7odVM1BmxYv3Vw=="], + + "@astrojs/compiler-binding-linux-x64-musl": ["@astrojs/compiler-binding-linux-x64-musl@0.5.2", "", { "os": "linux", "cpu": "x64" }, "sha512-jOViewGeTh9bSfS8vK72ECxoy2yvmA+Pd/ZcEvBI5c7+7IcfHwZ5qA4L9fRYuOhSrAifvQ2dV4vm1XAtloaWBw=="], + + "@astrojs/compiler-binding-wasm32-wasi": ["@astrojs/compiler-binding-wasm32-wasi@0.5.2", "", { "dependencies": { "@emnapi/core": "1.11.3", "@emnapi/runtime": "1.11.3", "@napi-rs/wasm-runtime": "^1.2.5" }, "cpu": "none" }, "sha512-Z7p64doar1uvR5C9Xs6j1CV9lGlPVQX7OQ2aAtZ/xKC5aGS6GB13nyc2UfQXTQLvZrvVwsyaflTQy6ziY5Bekw=="], + + "@astrojs/compiler-binding-win32-arm64-msvc": ["@astrojs/compiler-binding-win32-arm64-msvc@0.5.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-Tr13bh+ahTWsjXjzctK7pFpWV+dUU4FtBfETlR7gO+ueex0F+RDch7eRr0YfKysaRhk9tWm14lsCJ5uWyFPNHQ=="], + + "@astrojs/compiler-binding-win32-x64-msvc": ["@astrojs/compiler-binding-win32-x64-msvc@0.5.2", "", { "os": "win32", "cpu": "x64" }, "sha512-SfKkI+jOQYLh6wojPvVPV0lFfQnxisweN9B+qCzRvZp7DHAuGif8Y0WcC5PUgN4jb8VKy57LggQDtggR46Du1g=="], + + "@astrojs/compiler-rs": ["@astrojs/compiler-rs@0.5.2", "", { "dependencies": { "@astrojs/compiler-binding": "0.5.2" } }, "sha512-IvwYLB8t1M86rKO4oPdBi9GP4gzXcgrVlNgocjwos1jeeUuEIV8d9Crn1PvYD/5IKteWOxpIHomf7e8iYlkE+Q=="], + + "@astrojs/internal-helpers": ["@astrojs/internal-helpers@0.12.0", "", { "dependencies": { "@types/hast": "^3.0.4", "@types/mdast": "^4.0.4", "picomatch": "^4.0.4", "retext-smartypants": "^6.2.0", "shiki": "^4.0.2", "smol-toml": "^1.8.0", "unified": "^11.0.5", "yaml": "^2.9.1" } }, "sha512-pKPuwCDtO0L7zgmt1JGd9X4Aes1+0SX3IEBSqBNPHsScYdPMlfmed3Y7DTbXyF7E+8ylnb563o/0OzGQPOFehw=="], + + "@astrojs/markdown-satteri": ["@astrojs/markdown-satteri@0.4.3", "", { "dependencies": { "@astrojs/internal-helpers": "0.12.0", "@astrojs/prism": "4.0.2", "github-slugger": "^2.0.0", "satteri": "^0.10.3" } }, "sha512-PFbEHPnwUlLvpXd7RXrrKM+j12akF4bG+DSuNuoN+3eiwjOwp4HaPi+QQdbkBV7QEYXmzyKca50OJsmGxhNIUA=="], + + "@astrojs/mdx": ["@astrojs/mdx@8.0.3", "", { "dependencies": { "@astrojs/internal-helpers": "0.12.0", "@astrojs/markdown-satteri": "0.4.3", "es-module-lexer": "^3.0.2" }, "peerDependencies": { "@astrojs/markdown-remark": "^7.3.0", "astro": "^7.2.10" }, "optionalPeers": ["@astrojs/markdown-remark"] }, "sha512-SmwnVrGZSohDG0B9LXiAPbR6fe9TOumli9Vw/9zo815xGTeB1T3Fqt6HEClmBsVwIKFg/ccos4TgjZAedvg7zA=="], + + "@astrojs/prism": ["@astrojs/prism@4.0.2", "", { "dependencies": { "prismjs": "^1.30.0" } }, "sha512-KTivpmnz6lDsC6o9H4+DNm2SrE/GHzw8cNAvEJwAvUT+eoaEnn/4NtbDNfRRaxaJHdp15gf+tfHAWiXR4wB3BA=="], + + "@astrojs/sitemap": ["@astrojs/sitemap@3.7.4", "", { "dependencies": { "sitemap": "^9.0.0", "zod": "^4.3.6" } }, "sha512-LbKNC24bdUWcQf/pThB6qLlSqHojxGjZDURIzFocY8rlWnAn2t74nnhnK6S5x0NHriHoAduLEpVjRykmeGiVvA=="], + + "@astrojs/starlight": ["@astrojs/starlight@0.42.6", "", { "dependencies": { "@astrojs/markdown-satteri": "^0.4.0", "@astrojs/mdx": "^8.0.0", "@astrojs/sitemap": "^3.7.3", "@pagefind/default-ui": "^1.3.0", "@types/hast": "^3.0.5", "@types/js-yaml": "^4.0.9", "@types/mdast": "^4.0.4", "astro-expressive-code": "^0.44.0", "bcp-47": "^2.1.0", "hast-util-format": "^1.1.0", "hast-util-select": "^6.0.4", "hast-util-to-html": "^9.0.5", "hast-util-to-string": "^3.0.1", "hastscript": "^9.0.1", "i18next": "^26.0.7", "js-yaml": "^4.1.1", "klona": "^2.0.6", "magic-string": "^1.2.3", "mdast-util-directive": "^3.1.0", "mdast-util-to-markdown": "^2.1.2", "mdast-util-to-string": "^4.0.0", "pagefind": "^1.5.2", "remark-directive": "^4.0.0", "satteri": "^0.10.3", "ultrahtml": "^1.6.0", "unified": "^11.0.5", "unist-util-visit": "^5.1.0", "vfile": "^6.0.3" }, "peerDependencies": { "@astrojs/markdown-remark": "^7.3.0", "astro": "^7.2.10" }, "optionalPeers": ["@astrojs/markdown-remark"] }, "sha512-Cfs7GdgzgNRCauDxQVsFUVL1thrGHK/rQdbv/SURv/xhGBXx+j5ypOHW9ENPraQxbIzUC8KAnJV7L9mvEVRuyQ=="], + + "@astrojs/telemetry": ["@astrojs/telemetry@3.3.3", "", { "dependencies": { "ci-info": "^4.4.0", "dset": "^3.1.4", "is-docker": "^4.0.0", "package-manager-detector": "^1.6.0" } }, "sha512-C1TLn5sPJr0x4vk56piHWKbnqlEB8BKyte5Y45V02U+D7BGO5eMqZDH5aPjnkXQWJggvmsTXxH03QMZ9NgWLzQ=="], + + "@babel/helper-string-parser": ["@babel/helper-string-parser@7.29.7", "", {}, "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw=="], + + "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.29.7", "", {}, "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg=="], + + "@babel/parser": ["@babel/parser@7.29.9", "", { "dependencies": { "@babel/types": "^7.29.8" }, "bin": "./bin/babel-parser.js" }, "sha512-CjXrNHTnvqBVqHgdBysY3vk2T8tpJHb5/RMeHJBTyVa9xgugCB0CJTx/3oO8RV2QRQP391RWpB7D6hLjm8V9uA=="], + + "@babel/types": ["@babel/types@7.29.8", "", { "dependencies": { "@babel/helper-string-parser": "^7.29.7", "@babel/helper-validator-identifier": "^7.29.7" } }, "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg=="], + + "@bruits/satteri-darwin-arm64": ["@bruits/satteri-darwin-arm64@0.10.5", "", { "os": "darwin", "cpu": "arm64" }, "sha512-27KTVl4TJkVahMy/ohyA7qd4938G5UNneFUz/PsScYfpIhj0IVAS23mpcJXdPF44sa6nva198lmV/cKIb2YPyA=="], + + "@bruits/satteri-darwin-x64": ["@bruits/satteri-darwin-x64@0.10.5", "", { "os": "darwin", "cpu": "x64" }, "sha512-IjnLe3nKspq6qaeqGgjT7MT8VrTV74yWRlaag7ZdNsI8TDAYZ0iPxMCo+9KQZHUk5EyVB+reBI/PFWL5KuFw9Q=="], + + "@bruits/satteri-linux-arm64-gnu": ["@bruits/satteri-linux-arm64-gnu@0.10.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-glkYXZCJywjP13v67eAyAMSJdF+ncvEbYvgi/wOtffL9tQ27lr/zsyzUfgs+ovjJ9d8JNQKiXeiArJcX8PJL9w=="], + + "@bruits/satteri-linux-arm64-musl": ["@bruits/satteri-linux-arm64-musl@0.10.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-yWdgG1g17Nh2QyGVlFUxGRa3FEFwiMcpZEyMNWkbM3deC94cmVc+/i9OuyFpdKuWo3GkgoCtYVOoxk1uCnCZIA=="], + + "@bruits/satteri-linux-x64-gnu": ["@bruits/satteri-linux-x64-gnu@0.10.5", "", { "os": "linux", "cpu": "x64" }, "sha512-FVaLoPT1fBgGl0J+AYebyyXJYBachGl8Oyyrf1lye4RTqCB4S0Gwkj1uM9RJyThUOvx5VUmAT1CnNh1SFHA+kw=="], + + "@bruits/satteri-linux-x64-musl": ["@bruits/satteri-linux-x64-musl@0.10.5", "", { "os": "linux", "cpu": "x64" }, "sha512-EHpVAx2bqW3GINHTKkljtxVfQmVDGWIuwOYOP5YghTj+0PkBa2o8oKPRtQ9Kbsr1Fye8jtUcDjhwj2jMNugZKg=="], + + "@bruits/satteri-wasm32-wasi": ["@bruits/satteri-wasm32-wasi@0.10.5", "", { "dependencies": { "@emnapi/core": "1.11.1", "@emnapi/runtime": "1.11.1", "@napi-rs/wasm-runtime": "^1.2.3" }, "cpu": "none" }, "sha512-ypz8c/Zmipxp4IoeDa228Gstv6TLzVmNs3yC6wKCoNSOjx1iwpgzu87Y3hTkXFdwChVGU85qeUDuOIarGUZQLw=="], + + "@bruits/satteri-win32-arm64-msvc": ["@bruits/satteri-win32-arm64-msvc@0.10.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-siTV88nb0LRqNpkL2gXboqCwVdq95sLtzMHS1/3eONV2gLbB3NAK46wmSMvCO/yquBvI2lvaFIfd8P12ecsxBw=="], + + "@bruits/satteri-win32-x64-msvc": ["@bruits/satteri-win32-x64-msvc@0.10.5", "", { "os": "win32", "cpu": "x64" }, "sha512-C3IfPvfvMXmlzBxaMPKFS1XiuV9pu2mC7YqkPk7PSvTgPZ8gbdASIpHpztDLvTTQjqZ0z1Ol8tK5X+V6XXC0wQ=="], + + "@capsizecss/unpack": ["@capsizecss/unpack@4.0.1", "", { "dependencies": { "fontkitten": "^1.0.3" } }, "sha512-CuNiSqg7+e1cO/GjffyMOm5Tt2jUF9CWHHnvQ/UkqvtkGfHdgwEC0wpmq7fkN3gxwpRnrAN0WzO3vREKmNolMQ=="], + + "@clack/core": ["@clack/core@1.5.1", "", { "dependencies": { "fast-wrap-ansi": "^0.2.0", "sisteransi": "^1.0.5" } }, "sha512-iHTrHA8MtVuLl2TfZySmcKv1qO2PoyC9Z7pfSDozEuV5vtY3/wcOPKJXlqJ5Oq2Cx5DDGQGAMVx6HZfRRoVEbQ=="], + + "@clack/prompts": ["@clack/prompts@1.8.1", "", { "dependencies": { "@clack/core": "1.5.1", "fast-string-width": "^3.0.2", "fast-wrap-ansi": "^0.2.0", "sisteransi": "^1.0.5" } }, "sha512-dlT1m5e/0yUL0kRNcQn7yGLVThkgbB0Ga/1AmfDDC/8ik6AIiSf2QLQO2zPYvefsHP0aFgxO93cVLCCfDp7kzQ=="], + + "@ctrl/tinycolor": ["@ctrl/tinycolor@4.2.1", "", {}, "sha512-Vh5uy9Y1JBMId6J1f68TMXnZrTCvNdo9Fu2k0d1YnJngR+sM5kWTKl441c/3TFs+cG0NWOjRWgQ/iaWhbYx+7A=="], + + "@emnapi/core": ["@emnapi/core@1.11.1", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.2", "tslib": "^2.4.0" } }, "sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ=="], + + "@emnapi/runtime": ["@emnapi/runtime@1.11.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw=="], + + "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.2", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA=="], + + "@expressive-code/core": ["@expressive-code/core@0.44.2", "", { "dependencies": { "@ctrl/tinycolor": "^4.0.4", "hast-util-select": "^6.0.2", "hast-util-to-html": "^9.0.1", "hast-util-to-text": "^4.0.1", "hastscript": "^9.0.0", "postcss": "^8.4.38", "postcss-nested": "^6.0.1", "unist-util-visit": "^5.0.0", "unist-util-visit-parents": "^6.0.1" } }, "sha512-Yw5KonQCD1HoOO2P89y4wifqS9qrJcGVY0LkVMUsVZjhi++bhz4WwQ37inenKFNOEVo50P7cjoVsCdaVnUbq8w=="], + + "@expressive-code/plugin-frames": ["@expressive-code/plugin-frames@0.44.2", "", { "dependencies": { "@expressive-code/core": "^0.44.2" } }, "sha512-gVLm6TQMNIRWIaM7o+mCtxkGNjLZY5/2faSTLoXeo9wv/Pkj/0QAtZyXPVPrRsPARqiipATNFmfvQFLJudxPHQ=="], + + "@expressive-code/plugin-shiki": ["@expressive-code/plugin-shiki@0.44.2", "", { "dependencies": { "@expressive-code/core": "^0.44.2", "shiki": "^4.0.2" } }, "sha512-ebWIvCDzXvjyD8rH6T6DfytYJw1GoArLR4nusIAE4VxXrCQf3d+owytiv010KU/dUg+SRLZskDn0N+HaFXeuSg=="], + + "@expressive-code/plugin-text-markers": ["@expressive-code/plugin-text-markers@0.44.2", "", { "dependencies": { "@expressive-code/core": "^0.44.2" } }, "sha512-SNI7EgUSiADqbqUzzMbj1ZeC/r2pa5eg3KyFOGAd3a7EsIA4qzjXQLp+ODWQtHVDKFCdGs4J3ovSJUqvKIK96g=="], + + "@fontsource/ibm-plex-sans": ["@fontsource/ibm-plex-sans@5.3.0", "", {}, "sha512-CbE4CbbEEZJX860XyUiRpsksXIQR8Rp2XDva2VO53NJox9tVNtusrysd2x5YkUEY3ErQ66W1IiiQL8/wihhw5w=="], + + "@fontsource/jetbrains-mono": ["@fontsource/jetbrains-mono@5.3.0", "", {}, "sha512-fqDfB5I9f1p1TV486aUgB9t8zP84P0O1FtQR5Ol9vjwPy+S+EIGlVYm1cvj2W5shcZMTg2nZFdVMoH5wFu8a1A=="], + + "@img/colour": ["@img/colour@1.1.0", "", {}, "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ=="], + + "@img/sharp-darwin-arm64": ["@img/sharp-darwin-arm64@0.35.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-arm64": "1.3.4" }, "os": "darwin", "cpu": "arm64" }, "sha512-QRUlFQ0WxvdWyqqG/WtI3iupfD5rBzmCHXSdPsY91sAtVtTo7Q4cb6zOccZ3gqEqkr0f1As1ehLqmEpDsRf+lg=="], + + "@img/sharp-darwin-x64": ["@img/sharp-darwin-x64@0.35.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-x64": "1.3.4" }, "os": "darwin", "cpu": "x64" }, "sha512-+BR255RhDlpygUpOc/Jdt1nT6DQ3XG/ERo5wbcdOf5Q320dKtPCKPLR1LJs9VGXRaMa8l1uUa0tkCNOXiAxZUw=="], + + "@img/sharp-freebsd-wasm32": ["@img/sharp-freebsd-wasm32@0.35.5", "", { "dependencies": { "@img/sharp-wasm32": "0.35.5" }, "os": "freebsd" }, "sha512-Y/z91nEZ4uIBX5X3nfTovjU9lHNKFYbL2lpHCLVNmXQK03VIZvXBBt0KxbPGp2SdGSF+2mQU4e+hQaWOt86iAw=="], + + "@img/sharp-libvips-darwin-arm64": ["@img/sharp-libvips-darwin-arm64@1.3.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-5R89nBYiRdUlSWJxPhO+GVtaXzXSxKnRu/xqMn3KTA3L9EB9Oy/P+Nn2f2vlhPuUdy/Zusb2DarbyTpGCfEDuw=="], + + "@img/sharp-libvips-darwin-x64": ["@img/sharp-libvips-darwin-x64@1.3.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-iR2OKH80yi0U+dUplyh3/xdpFvps6YkCwsXenIJxqxR1v9o+xtKTGbS9H7cps+2Vxjc8B1j96p75NmTGjIhtpQ=="], + + "@img/sharp-libvips-linux-arm": ["@img/sharp-libvips-linux-arm@1.3.4", "", { "os": "linux", "cpu": "arm" }, "sha512-LmRtTsOHuvM2+wlO2Db37dx5MiZhB0FvSunciw48YjdOkZz9KAiRbm8ujeMOA1INqmei5NapFxYEK1D1ZSidmw=="], + + "@img/sharp-libvips-linux-arm64": ["@img/sharp-libvips-linux-arm64@1.3.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-Y3dgX/6lE2QhQb+Gxy0WZxfg9MEm/JBjamZpS2IklP7xIQoKN4hzAm7KcMVGtaVDt3neE9OKBC7vAfonA/Lr1A=="], + + "@img/sharp-libvips-linux-ppc64": ["@img/sharp-libvips-linux-ppc64@1.3.4", "", { "os": "linux", "cpu": "ppc64" }, "sha512-Le6boB8Tai0Nis+gIxIpKx68UDVVIqdR8Tin5Yf1z2LJJQLDJvCDRqRu+jC2qCoD+eIomonmOwB4smBRxfVpYQ=="], + + "@img/sharp-libvips-linux-riscv64": ["@img/sharp-libvips-linux-riscv64@1.3.4", "", { "os": "linux", "cpu": "none" }, "sha512-aHkkIEHPRdQEegJN20MLmGtxYD9R2wQr3Cwpddnu5+YKMt6Uzax7S9h5gpZTo8wyrGuZSlfQ63OevL5mTyOC7Q=="], + + "@img/sharp-libvips-linux-s390x": ["@img/sharp-libvips-linux-s390x@1.3.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-ra/mB6MikESDUO7Yg+Mi95bFBb9GsObURuhnOv3OqknjGe9sZrG8tCe9q0xSIGrtLgvgw0gKnFWcK4blSgQOuQ=="], + + "@img/sharp-libvips-linux-x64": ["@img/sharp-libvips-linux-x64@1.3.4", "", { "os": "linux", "cpu": "x64" }, "sha512-GJ//SSXbnwSDes02umB3nDJLFcQzw8a18V8fyhqr6tV515tOEMdImjjxj1AoafMRz56F3PHgftnj1QEKSU1zkw=="], + + "@img/sharp-libvips-linuxmusl-arm64": ["@img/sharp-libvips-linuxmusl-arm64@1.3.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-hvulFwtjUcagsis6BBxHwGFwWoNZjgYmULGVrZcyfNbjA8hKILbRxGg15/7w5HDyXHXUos/j6baAWqnCyQ2DWA=="], + + "@img/sharp-libvips-linuxmusl-x64": ["@img/sharp-libvips-linuxmusl-x64@1.3.4", "", { "os": "linux", "cpu": "x64" }, "sha512-6zXKeE/p39I1AmA3cJG35eyBGNqNddLnUXjhwBnsGjFPWqf5VKkDBEqaEkPDoTEtkxwi2vv8Tcr2mDyP4So7Fg=="], + + "@img/sharp-linux-arm": ["@img/sharp-linux-arm@0.35.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm": "1.3.4" }, "os": "linux", "cpu": "arm" }, "sha512-LEaXK2WdXVK5ykcw0buWyPMsmLLL2vpHLD6yrNSW+JGEL3BZPA4tpKN6iaMc4AxTTAoaX/sU1rOL51lcIz48ZQ=="], + + "@img/sharp-linux-arm64": ["@img/sharp-linux-arm64@0.35.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm64": "1.3.4" }, "os": "linux", "cpu": "arm64" }, "sha512-LYVx5JTsOM2CBzmxreh+nl64/3H6Xb09iSLknqH47z2T2DFFxDeFLP5y4dJwe6H7uGQlHPyEEtIqyo3DYsRwdQ=="], + + "@img/sharp-linux-ppc64": ["@img/sharp-linux-ppc64@0.35.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-ppc64": "1.3.4" }, "os": "linux", "cpu": "ppc64" }, "sha512-QVxAAq8evVRI9ia2vqgwrmWucn5Dfv+JdWzj75pD8omHLPSP7f8p20O8jxzjCcuCEQEOtYOZUmX1hkiZ0kdevA=="], + + "@img/sharp-linux-riscv64": ["@img/sharp-linux-riscv64@0.35.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-riscv64": "1.3.4" }, "os": "linux", "cpu": "none" }, "sha512-LtdreXguaavKODPIfzJ4kffx7UNt1omwtK0rch4EBbbSTXPnxWmYSayXdLJw0fJzQ97kHt1gL/yh4tvU+nCyRQ=="], + + "@img/sharp-linux-s390x": ["@img/sharp-linux-s390x@0.35.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-s390x": "1.3.4" }, "os": "linux", "cpu": "s390x" }, "sha512-UZasTOFiYzotTsGOCu42BfUzP6Tu6Do/947iRm1RsLKvlllxwGcn4RN27LibGWceix4Y+Pmw3jsnTcCQIgWjqA=="], + + "@img/sharp-linux-x64": ["@img/sharp-linux-x64@0.35.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-x64": "1.3.4" }, "os": "linux", "cpu": "x64" }, "sha512-SxFtLTeJInhAA9Q836kux2vZNeOBQEx658qvbboZScr0wIARym3IcGmW7KpVD5sbVg0Ojy+udFQdayYIZyoNog=="], + + "@img/sharp-linuxmusl-arm64": ["@img/sharp-linuxmusl-arm64@0.35.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-arm64": "1.3.4" }, "os": "linux", "cpu": "arm64" }, "sha512-9HbMclmI1zlNkFRs3z9/eBtDjfD0sGlrX1z6b1qwmiFY5ElDLh4BC0LPBdVp7z1DXFiKlIcznf+ZlsuZzLxQqg=="], + + "@img/sharp-linuxmusl-x64": ["@img/sharp-linuxmusl-x64@0.35.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-x64": "1.3.4" }, "os": "linux", "cpu": "x64" }, "sha512-4KOphqB035HrVdqLZfCgMzzERrQkkzOwRhl4OAkRO1YCldbaFjySXMaK534Mo0V+LndnlJk+sbUyLeU0ULyD1A=="], + + "@img/sharp-wasm32": ["@img/sharp-wasm32@0.35.5", "", { "dependencies": { "@emnapi/runtime": "^1.11.3" } }, "sha512-Ptsga1su4tQx+LLF1ECS9U6nz5kmrXKo6XVbtR48Ke3ZRxxgaWBu7IDtEe1quo8hiupwm6WFqxVlXaSf7IINGQ=="], + + "@img/sharp-webcontainers-wasm32": ["@img/sharp-webcontainers-wasm32@0.35.5", "", { "dependencies": { "@img/sharp-wasm32": "0.35.5" }, "cpu": "none" }, "sha512-hfhF/FmoQyTUkA0bIKFOtw536BQSeBMe6BF6QyWlrPxT754+TFLaZ7sKKTfvvM0yJgKgaYTwnFCIZ/GuDw5SUA=="], + + "@img/sharp-win32-arm64": ["@img/sharp-win32-arm64@0.35.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-X4t7g+7ZA5DKblCBEXGjUqqemj4vczING/5viFwAL8h4N3qYeyjwdCvRLHi4EdOUI+2Z7UFlp1VM+p/AuEtm6Q=="], + + "@img/sharp-win32-ia32": ["@img/sharp-win32-ia32@0.35.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-5Zm82LoBc43nhwNybZlG7Y1KO//Zhsn306fQl29ZOuStHLGTo3BWL83q3cznX0poxSAMuYL1On/BHBxkBeKr6A=="], + + "@img/sharp-win32-x64": ["@img/sharp-win32-x64@0.35.5", "", { "os": "win32", "cpu": "x64" }, "sha512-x76eH0vEiHlcMQu8Y8IenntaACtddpT6W0wmXtWrnKcnKI7ME5DdgqhAD6SEWOEl1v2zDvkZDhFA9KnURwpfqg=="], + + "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.6.0", "", {}, "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw=="], + + "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.2.5", "", { "dependencies": { "@tybys/wasm-util": "^0.10.3" }, "peerDependencies": { "@emnapi/core": "^1.7.1 || ^2.0.0-alpha.4", "@emnapi/runtime": "^1.7.1 || ^2.0.0-alpha.4" } }, "sha512-HshSvXzmBxNzqejd3k/KemgQ3hdREUYFRRrgxOZ+gPljDIsO2SDZrVZMd4Z/HsxudQbE62OVyVFE8z9BCurfjA=="], + + "@oslojs/encoding": ["@oslojs/encoding@1.1.0", "", {}, "sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ=="], + + "@oxc-project/types": ["@oxc-project/types@0.154.0", "", {}, "sha512-KYOUGQFlLWR+s4QMV2Q9ko38TZm7EdO87Qm7rvZLqk/webse/cDjtyxKhg/47l0byCbs/k46LT8qc4PKjAikzA=="], + + "@pagefind/darwin-arm64": ["@pagefind/darwin-arm64@1.5.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-MXpI+7HsAdPkvJ0gk9xj9g541BCqBZOBbdwj9g6lB5LCj6kSV6nqDSjzcAJwvOsfu0fjwvC8hQU+ecfhp+MpiQ=="], + + "@pagefind/darwin-x64": ["@pagefind/darwin-x64@1.5.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-IojxFWMEJe0RQ7PQ3KXQsPIImNsbpPYpoZ+QUDrL8fAl/O27IX+LVLs74/UzEZy5uA2LD8Nz1AiwKr72vrkZQw=="], + + "@pagefind/default-ui": ["@pagefind/default-ui@1.5.2", "", {}, "sha512-pm1LMnQg8N2B3n2TnjKlhaFihpz6zTiA4HiGQ6/slKO/+8K9CAU5kcjdSSPgpuk1PMuuN4hxLipUIifnrkl3Sg=="], + + "@pagefind/freebsd-x64": ["@pagefind/freebsd-x64@1.5.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-7EVzo9+0w+2cbe671BtMj10UlNo83I+HrLVLfRxO731svHRJKUfJ/mo05gU14pe9PCfpKNQT8FS3Xc/oDN6pOA=="], + + "@pagefind/linux-arm64": ["@pagefind/linux-arm64@1.5.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-Ovt9+K35sqzn8H3ZMXGwls4TD/wMJuvRtShHIsmUQREmaxjrDEX7gHckRCrwYJ4XE1H1p6HkLz3wukrAnsfXQw=="], + + "@pagefind/linux-x64": ["@pagefind/linux-x64@1.5.2", "", { "os": "linux", "cpu": "x64" }, "sha512-V+tFqHKXhQKq/WqPBD67AFy7scn1/aZID00ws4fSDd+1daSi5UHR9VVlRrOUYKxn3VuFQYRD7lYXdZK1WED1YA=="], + + "@pagefind/windows-arm64": ["@pagefind/windows-arm64@1.5.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-hN9Nh90fNW61nNRCW9ZyQrAj/mD0eRvmJ8NlTUzkbuW8kIzGJUi3cxjFkEcMZ5h/8FsKWD/VcouZl4yo1F7B6g=="], + + "@pagefind/windows-x64": ["@pagefind/windows-x64@1.5.2", "", { "os": "win32", "cpu": "x64" }, "sha512-Fa2Iyw7kaDRzGMfNYNUXNW2zbL5FQVDgSOcbDHdzBrDEdpqOqg8TcZ68F22ol6NJ9IGzvUdmeyZypLW5dyhqsg=="], + + "@rolldown/binding-android-arm-eabi": ["@rolldown/binding-android-arm-eabi@1.2.14", "", { "os": "android", "cpu": "arm" }, "sha512-aWR+XKH9+rW7m5fWq/5360J3mHycrx/o6xZM2DQFdJnTMdyP7/WzxPjhtLbVWdKo2y612/4U1bWqb3HQhiF7vg=="], + + "@rolldown/binding-android-arm64": ["@rolldown/binding-android-arm64@1.2.14", "", { "os": "android", "cpu": "arm64" }, "sha512-QiVxHofl6A8lQU7WAtOUY4QMVZXohxwz7WJJoeh8NBEUyKfIkMRKhYyq8az/1RypNiIXzNTtiS6KwHz0erxYRQ=="], + + "@rolldown/binding-darwin-arm64": ["@rolldown/binding-darwin-arm64@1.2.14", "", { "os": "darwin", "cpu": "arm64" }, "sha512-lTQOzHuBIooh3jIr5XINQkjPGEuGy+Dsy0meXDr6Sjty0b99kYgGh4uBC/8mJX1T0kC8d6S0aPP1Y+bHkh6aBw=="], + + "@rolldown/binding-darwin-x64": ["@rolldown/binding-darwin-x64@1.2.14", "", { "os": "darwin", "cpu": "x64" }, "sha512-hyMKEGatjmBYCs/Q4sbIcL/GqpFEqsX3wc+HYVQ/85A4rxc1o7rPm4DUI4GV4k/h0ITddwFSGpqQunI14GXjTA=="], + + "@rolldown/binding-freebsd-x64": ["@rolldown/binding-freebsd-x64@1.2.14", "", { "os": "freebsd", "cpu": "x64" }, "sha512-u371GbXoVXrEgP20PwzoGNOdAOqAMhzo19JzzY+V4YmmnC+DTOoqdbMu+O+54emM59Mik/UdrtWgcuEDKWRPKA=="], + + "@rolldown/binding-linux-arm-gnueabihf": ["@rolldown/binding-linux-arm-gnueabihf@1.2.14", "", { "os": "linux", "cpu": "arm" }, "sha512-BqwKsdZQf6EqVWr8fv2MrDYzAvOZ7+NYFSJESRGs87fkseEhs0TU9TXgRJTkZoRRkxTizyEg1LKUXfU3/78uqg=="], + + "@rolldown/binding-linux-arm64-gnu": ["@rolldown/binding-linux-arm64-gnu@1.2.14", "", { "os": "linux", "cpu": "arm64" }, "sha512-SD9kY8M009x/7s57Z1dgUVlP5+uYBgKQK0Tkr1WIWngrtUJmRCW1RJFMY7QDla2khXhmg2i5Io7MUjcmZNZ/KQ=="], + + "@rolldown/binding-linux-arm64-musl": ["@rolldown/binding-linux-arm64-musl@1.2.14", "", { "os": "linux", "cpu": "arm64" }, "sha512-BJ2CL19M6uuWesMgnqJzgxoI+N+eV7b0A9O9vLV42y+gitC41fNa8KElau1tHVzuLWX5GzEuxMPhAO0tQXQMkg=="], + + "@rolldown/binding-linux-ppc64-gnu": ["@rolldown/binding-linux-ppc64-gnu@1.2.14", "", { "os": "linux", "cpu": "ppc64" }, "sha512-4+Kl8daPV8NDHaD7mfCcc1pRM+Qg7ab8DyMm5FG5WoZgv4h2i3KFN1CybYBNbQqmuYm7ftJLvmMI1eHYJ22S/Q=="], + + "@rolldown/binding-linux-s390x-gnu": ["@rolldown/binding-linux-s390x-gnu@1.2.14", "", { "os": "linux", "cpu": "s390x" }, "sha512-V/h8ePq1fKDrmtFMz6xcCN3DKvuvMRrwwD1q0PkBeeo4DpK64biaKvqWGVxqCeYKqeRk7gE7/iKPxLCn08O97A=="], + + "@rolldown/binding-linux-x64-gnu": ["@rolldown/binding-linux-x64-gnu@1.2.14", "", { "os": "linux", "cpu": "x64" }, "sha512-WxalXzgrLVpKC93xfpaJ3gCXUWzeCr+FRCbDVD2mUAy4L6Vo3lNVz0epUEUpxPWJkLNYUwM4OSIikv36OJ9mLg=="], + + "@rolldown/binding-linux-x64-musl": ["@rolldown/binding-linux-x64-musl@1.2.14", "", { "os": "linux", "cpu": "x64" }, "sha512-3G3tnAmTpdk9jO3GQtyHXqeFD2SlecfTws/Y3M2mmj9nMBwwuLT4kur8sZKeu7ENUHSpVO3cIsm5A52LEWWwlg=="], + + "@rolldown/binding-openharmony-arm64": ["@rolldown/binding-openharmony-arm64@1.2.14", "", { "os": "none", "cpu": "arm64" }, "sha512-qyr5XiNGxm2ytx17vvtcJ9nXn6v1gENETi503bJx3OGwZ1tSonj7BosxbMa/xeAfSl5iS9X6KjEWYXLu6v1L7Q=="], + + "@rolldown/binding-win32-arm64-msvc": ["@rolldown/binding-win32-arm64-msvc@1.2.14", "", { "os": "win32", "cpu": "arm64" }, "sha512-oA4o5o0S2yB199YyYXDzKUv1Z56Rc+mgOjwm7Z/vJ9Z8igiDPYvoOuDyo6g7AK/ZaF09nPhDKVnGBcYHO11GXA=="], + + "@rolldown/binding-win32-x64-msvc": ["@rolldown/binding-win32-x64-msvc@1.2.14", "", { "os": "win32", "cpu": "x64" }, "sha512-9mE94bf2GZUaR/fUSXCMpBoWkctu421Mi0ORpm4zqfbkjKep7RxzPFa5etcGs5h+2KApoWBOA/hAJa/7saGgEQ=="], + + "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.1", "", {}, "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw=="], + + "@shikijs/core": ["@shikijs/core@4.5.0", "", { "dependencies": { "@shikijs/primitive": "4.5.0", "@shikijs/types": "4.5.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.5", "hast-util-to-html": "^9.0.5" } }, "sha512-6CIgwq+bt2JZ3OSjb/nBkkwEf/CfpHcbam+Mg5Pllco7HAGRQ2/EFhZrrJtbyNTgKwknfVS+llsXGygiDGwJWw=="], + + "@shikijs/engine-javascript": ["@shikijs/engine-javascript@4.5.0", "", { "dependencies": { "@shikijs/types": "4.5.0", "@shikijs/vscode-textmate": "^10.0.2", "oniguruma-to-es": "^4.3.6" } }, "sha512-Ed6UdEj84LyYkwnxM5CvSMWAD+id9ExTYri0/+x41U9zrgNifPSS9lZm0JqBP0VfYI8yr8tY5nbNq9+p9R0kFA=="], + + "@shikijs/engine-oniguruma": ["@shikijs/engine-oniguruma@4.5.0", "", { "dependencies": { "@shikijs/types": "4.5.0", "@shikijs/vscode-textmate": "^10.0.2" } }, "sha512-dKVmbJecVdB9recl8a/CU4jdpNXyjJQrIcesIkpS70s5HS02ohpnCSpMUbotPnEUzbAcLQ+S4hwZYbkBBiTcJw=="], + + "@shikijs/langs": ["@shikijs/langs@4.5.0", "", { "dependencies": { "@shikijs/types": "4.5.0" } }, "sha512-wwBTqwduXSz0X4v9Qa2EWeFaYJEw1clCncWjoRNQRbVDu3SPRTRWucnouYapKj3b8Q+sk/41Vbc4B5c8nuYzLA=="], + + "@shikijs/primitive": ["@shikijs/primitive@4.5.0", "", { "dependencies": { "@shikijs/types": "4.5.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.5" } }, "sha512-UM7ShlA8oz0OWxLLO8BmO9Ip6fVqdkt8yF0EH7nOCqHfrx1eEAzF0ZUVK7L+I8NEgeu1PEWSRlxaiPPeCb4iDg=="], + + "@shikijs/themes": ["@shikijs/themes@4.5.0", "", { "dependencies": { "@shikijs/types": "4.5.0" } }, "sha512-zGb87H3UBbpuI4yoh5UguB1XbU+2BDU3kflM7UfZ+Cy2hWo9lBtqjSVK20gmLY6ukYl040hAypGXMgud9vul8Q=="], + + "@shikijs/types": ["@shikijs/types@4.5.0", "", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.5" } }, "sha512-drtPrtD8N0DENyD2cyt6Ajy+IWsiCLgMxODwLTpvH1UsN6a9jf90tNTPjqwHvA+0Lzu9e0txk8DjfqH1p9UJRw=="], + + "@shikijs/vscode-textmate": ["@shikijs/vscode-textmate@10.0.2", "", {}, "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg=="], + + "@tybys/wasm-util": ["@tybys/wasm-util@0.10.4", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-W3c4gRigFS0T/Ma4qIYF3GDAc5AQdHb1yL5znJT1Zv1YaD9Kitx656wBjvr19qbiosmZT8lWDM5BEMynUqX65A=="], + + "@types/braces": ["@types/braces@3.0.5", "", {}, "sha512-SQFof9H+LXeWNz8wDe7oN5zu7ket0qwMu5vZubW4GCJ8Kkeh6nBWUz87+KTz/G3Kqsrp0j/W253XJb3KMEeg3w=="], + + "@types/debug": ["@types/debug@4.1.13", "", { "dependencies": { "@types/ms": "*" } }, "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw=="], + + "@types/estree": ["@types/estree@1.0.9", "", {}, "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg=="], + + "@types/estree-jsx": ["@types/estree-jsx@1.0.5", "", { "dependencies": { "@types/estree": "*" } }, "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg=="], + + "@types/hast": ["@types/hast@3.0.5", "", { "dependencies": { "@types/unist": "*" } }, "sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g=="], + + "@types/js-yaml": ["@types/js-yaml@4.0.9", "", {}, "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg=="], + + "@types/mdast": ["@types/mdast@4.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA=="], + + "@types/micromatch": ["@types/micromatch@4.0.10", "", { "dependencies": { "@types/braces": "*" } }, "sha512-5jOhFDElqr4DKTrTEbnW8DZ4Hz5LRUEmyrGpCMrD/NphYv3nUnaF08xmSLx1rGGnyEs/kFnhiw6dCgcDqMr5PQ=="], + + "@types/ms": ["@types/ms@2.1.0", "", {}, "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA=="], + + "@types/nlcst": ["@types/nlcst@2.0.3", "", { "dependencies": { "@types/unist": "*" } }, "sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA=="], + + "@types/node": ["@types/node@24.19.2", "", { "dependencies": { "undici-types": ">=7.24.0 <7.24.7" } }, "sha512-93d49wCWJkCyN87MxLpNN6KXPCwFw7bVUg79mGUV1OS40JGWwVCr8n61DXCSqz7CV6/VfPkb7xec7uP2M+QHWQ=="], + + "@types/sax": ["@types/sax@1.2.7", "", { "dependencies": { "@types/node": "*" } }, "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A=="], + + "@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="], + + "@ungap/structured-clone": ["@ungap/structured-clone@1.4.0", "", {}, "sha512-1mEZtMKPM09vDmQt5y7YvmN2+DFTP7Tg0EWXdic8/C6VRnpb33e4ghisCIE3WZjsE2N8mf+QV1Zqh7ZFYLWInQ=="], + + "am-i-vibing": ["am-i-vibing@0.5.0", "", { "dependencies": { "process-ancestry": "^0.1.0" }, "bin": { "am-i-vibing": "dist/cli.mjs" } }, "sha512-KLcsDhqf1XRrJmJr+9I/C0EX2K+sGrAGZFgkmd84c8TJO9zJBu+/kFInjazu1KfJWFhWDKdRWkpBzEs7s35DVA=="], + + "anymatch": ["anymatch@3.1.3", "", { "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw=="], + + "arg": ["arg@5.0.2", "", {}, "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg=="], + + "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], + + "aria-query": ["aria-query@5.3.2", "", {}, "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw=="], + + "astro": ["astro@7.3.8", "", { "dependencies": { "@astrojs/compiler-rs": "^0.5.1", "@astrojs/internal-helpers": "0.12.0", "@astrojs/markdown-satteri": "0.4.3", "@astrojs/telemetry": "3.3.3", "@capsizecss/unpack": "^4.0.1", "@clack/prompts": "^1.8.1", "@oslojs/encoding": "^1.1.0", "am-i-vibing": "^0.5.0", "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": "^2.0.1", "devalue": "^5.9.4", "diff": "^9.0.0", "dset": "^3.1.4", "es-module-lexer": "^3.0.2", "find-proc": "0.2.0", "flattie": "^1.1.1", "fontace": "~0.4.1", "get-tsconfig": "5.0.0-beta.6", "github-slugger": "^2.0.0", "html-escaper": "3.0.3", "http-cache-semantics": "^4.2.0", "jsonc-parser": "^3.3.1", "magic-string": "^1.4.2", "magicast": "^0.5.5", "mrmime": "^2.0.1", "neotraverse": "^1.0.1", "obug": "^3.0.0", "p-limit": "^7.3.3", "p-queue": "^9.3.3", "package-manager-detector": "^1.8.0", "piccolore": "^0.1.3", "picomatch": "^4.0.7", "rolldown": "^1.2.11", "shiki": "^4.4.3", "smol-toml": "^1.9.0", "svgo": "^4.1.0", "tinyclip": "^1.0.3", "tinyexec": "^1.3.1", "tinyglobby": "^0.2.17", "ultrahtml": "^1.7.0", "unifont": "~0.7.5", "unstorage": "^1.17.5", "verkit": "^0.5.0", "vite": "^8.3.1", "vitefu": "^1.1.3", "xxhash-wasm": "^1.1.0", "yargs-parser": "^22.0.0", "zod": "^4.6.5" }, "optionalDependencies": { "sharp": "^0.35.4" }, "peerDependencies": { "@astrojs/markdown-remark": "^7.3.0" }, "optionalPeers": ["@astrojs/markdown-remark"], "bin": { "astro": "./bin/astro.mjs" } }, "sha512-LHzDHSaV+YzZiR3EFndDYTLLeNeuMtP1qX1FLcCNUUHOCqTTIWPczy2UV3zpA5VqvJe5cWZolqM9Z8JFqR2i9w=="], + + "astro-expressive-code": ["astro-expressive-code@0.44.2", "", { "dependencies": { "rehype-expressive-code": "^0.44.2", "url-extras": "^0.1.0" }, "peerDependencies": { "astro": "^4.0.0-beta || ^5.0.0-beta || ^3.3.0 || ^6.0.0-beta || ^7.0.0" } }, "sha512-avop7nZcRwC7quvIxVguhwEZ9Tp6IoTzKUCLwP30Fb7+er+pWQgcysP01dcuzRIJo81kLGg30q/YAI2Yb1Sdzg=="], + + "axobject-query": ["axobject-query@4.1.0", "", {}, "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ=="], + + "bail": ["bail@2.0.2", "", {}, "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw=="], + + "bcp-47": ["bcp-47@2.1.1", "", { "dependencies": { "is-alphabetical": "^2.0.0", "is-alphanumerical": "^2.0.0", "is-decimal": "^2.0.0" } }, "sha512-KLw+H/gd2p4zly1X7Yh/qziuyae5/w/QFnvTng9eZL5fvszL7Whl3MBoWF8yxL7ksUjBfOD+OxkytiqbBpG+Fw=="], + + "bcp-47-match": ["bcp-47-match@2.0.3", "", {}, "sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ=="], + + "boolbase": ["boolbase@1.0.0", "", {}, "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="], + + "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], + + "ccount": ["ccount@2.0.1", "", {}, "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg=="], + + "character-entities": ["character-entities@2.0.2", "", {}, "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ=="], + + "character-entities-html4": ["character-entities-html4@2.1.0", "", {}, "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA=="], + + "character-entities-legacy": ["character-entities-legacy@3.0.0", "", {}, "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ=="], + + "character-reference-invalid": ["character-reference-invalid@2.0.1", "", {}, "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw=="], + + "chokidar": ["chokidar@5.0.0", "", { "dependencies": { "readdirp": "^5.0.0" } }, "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw=="], + + "ci-info": ["ci-info@4.4.0", "", {}, "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg=="], + + "clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="], + + "comma-separated-tokens": ["comma-separated-tokens@2.0.3", "", {}, "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg=="], + + "commander": ["commander@11.1.0", "", {}, "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ=="], + + "common-ancestor-path": ["common-ancestor-path@2.0.0", "", {}, "sha512-dnN3ibLeoRf2HNC+OlCiNc5d2zxbLJXOtiZUudNFSXZrNSydxcCsSpRzXwfu7BBWCIfHPw+xTayeBvJCP/D8Ng=="], + + "cookie": ["cookie@2.0.1", "", {}, "sha512-yuToqVvRrj6pfDXREyQAAv8SkAEk/8GS3jQRTiUMm66TVtBYmqQeoEjL2Lmq8Rpo6271vH76InTChTitEAm65w=="], + + "cookie-es": ["cookie-es@1.2.3", "", {}, "sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw=="], + + "crossws": ["crossws@0.3.5", "", { "dependencies": { "uncrypto": "^0.1.3" } }, "sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA=="], + + "css-select": ["css-select@6.0.0", "", { "dependencies": { "boolbase": "^1.0.0", "css-what": "^7.0.0", "domhandler": "^5.0.3", "domutils": "^3.2.2", "nth-check": "^2.1.1" } }, "sha512-rZZVSLle8v0+EY8QAkDWrKhpgt6SA5OtHsgBnsj6ZaLb5dmDVOWUDtQitd9ydxxvEjhewNudS6eTVU7uOyzvXw=="], + + "css-selector-parser": ["css-selector-parser@3.3.0", "", {}, "sha512-Y2asgMGFqJKF4fq4xHDSlFYIkeVfRsm69lQC1q9kbEsH5XtnINTMrweLkjYMeaUgiXBy/uvKeO/a1JHTNnmB2g=="], + + "css-tree": ["css-tree@3.2.1", "", { "dependencies": { "mdn-data": "2.27.1", "source-map-js": "^1.2.1" } }, "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA=="], + + "css-what": ["css-what@7.0.0", "", {}, "sha512-wD5oz5xibMOPHzy13CyGmogB3phdvcDaB5t0W/Nr5Z2O/agcB8YwOz6e2Lsp10pNDzBoDO9nVa3RGs/2BttpHQ=="], + + "cssesc": ["cssesc@3.0.0", "", { "bin": { "cssesc": "bin/cssesc" } }, "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="], + + "csso": ["csso@5.0.5", "", { "dependencies": { "css-tree": "~2.2.0" } }, "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ=="], + + "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], + + "decode-named-character-reference": ["decode-named-character-reference@1.3.0", "", { "dependencies": { "character-entities": "^2.0.0" } }, "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q=="], + + "defu": ["defu@6.1.7", "", {}, "sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ=="], + + "dequal": ["dequal@2.0.3", "", {}, "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="], + + "destr": ["destr@2.0.5", "", {}, "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA=="], + + "detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="], + + "devalue": ["devalue@5.9.4", "", {}, "sha512-sPAT4pztbu6586/hrhOnMKS17IJrvg12mXiSPSS3W5qDeN2RGgvZ0diZCm31dBbnevfVmujNO3IM2wrS4Y2Rhg=="], + + "devlop": ["devlop@1.1.0", "", { "dependencies": { "dequal": "^2.0.0" } }, "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA=="], + + "diff": ["diff@9.0.0", "", {}, "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw=="], + + "direction": ["direction@2.0.1", "", { "bin": { "direction": "cli.js" } }, "sha512-9S6m9Sukh1cZNknO1CWAr2QAWsbKLafQiyM5gZ7VgXHeuaoUwffKN4q6NC4A/Mf9iiPlOXQEKW/Mv/mh9/3YFA=="], + + "dom-serializer": ["dom-serializer@2.0.0", "", { "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.2", "entities": "^4.2.0" } }, "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg=="], + + "domelementtype": ["domelementtype@2.3.0", "", {}, "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw=="], + + "domhandler": ["domhandler@5.0.3", "", { "dependencies": { "domelementtype": "^2.3.0" } }, "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w=="], + + "domutils": ["domutils@3.2.2", "", { "dependencies": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", "domhandler": "^5.0.3" } }, "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw=="], + + "dset": ["dset@3.1.4", "", {}, "sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA=="], + + "entities": ["entities@6.0.1", "", {}, "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g=="], + + "es-module-lexer": ["es-module-lexer@3.0.4", "", {}, "sha512-BldNY5mwkVu+cQ5Ymn3e6hB9Sx8XHx4ZevWbiUyZbfKxJxYO27Hf0wfzkxIaD5CAJMaGl3YspKELj0ff/7nCMA=="], + + "escape-string-regexp": ["escape-string-regexp@5.0.0", "", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="], + + "eventemitter3": ["eventemitter3@5.0.4", "", {}, "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw=="], + + "expressive-code": ["expressive-code@0.44.2", "", { "dependencies": { "@expressive-code/core": "^0.44.2", "@expressive-code/plugin-frames": "^0.44.2", "@expressive-code/plugin-shiki": "^0.44.2", "@expressive-code/plugin-text-markers": "^0.44.2" } }, "sha512-MLNghkvhyFgVW4oCD5DxBuYnnTXIf0PygzGmfT6OZeOOYWh/D4sH1j931biElkA5RG/J9wY/iuSMGAPF5vzHOg=="], + + "extend": ["extend@3.0.2", "", {}, "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="], + + "fast-string-truncated-width": ["fast-string-truncated-width@3.0.3", "", {}, "sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g=="], + + "fast-string-width": ["fast-string-width@3.0.2", "", { "dependencies": { "fast-string-truncated-width": "^3.0.2" } }, "sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg=="], + + "fast-wrap-ansi": ["fast-wrap-ansi@0.2.2", "", { "dependencies": { "fast-string-width": "^3.0.2" } }, "sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q=="], + + "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="], + + "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], + + "find-proc": ["find-proc@0.2.0", "", {}, "sha512-a6h2nTrgB3g5Wrn4au9Ux4kMk7IJtyF6oA8uGn+mk3weLZssUtc1cp6meHIzzuW2o1srrBAxzkmXLbqjRkgB6w=="], + + "flattie": ["flattie@1.1.1", "", {}, "sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ=="], + + "fontace": ["fontace@0.4.1", "", { "dependencies": { "fontkitten": "^1.0.2" } }, "sha512-lDMvbAzSnHmbYMTEld5qdtvNH2/pWpICOqpean9IgC7vUbUJc3k+k5Dokp85CegamqQpFbXf0rAVkbzpyTA8aw=="], + + "fontkitten": ["fontkitten@1.0.3", "", { "dependencies": { "tiny-inflate": "^1.0.3" } }, "sha512-Wp1zXWPVUPBmfoa3Cqc9ctaKuzKAV6uLstRqlR56kSjplf5uAce+qeyYym7F+PHbGTk+tCEdkCW6RD7DX/gBZw=="], + + "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], + + "get-tsconfig": ["get-tsconfig@5.0.0-beta.6", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-X6fBC0pmImC70gvX2zm56go9hx0MyoGVdG0tUCkg/D+Xnh5TJsOZ7iDbOdI3PvmtrDxnu1YdDufpK2QJX1Meqw=="], + + "github-slugger": ["github-slugger@2.0.0", "", {}, "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw=="], + + "h3": ["h3@1.15.11", "", { "dependencies": { "cookie-es": "^1.2.3", "crossws": "^0.3.5", "defu": "^6.1.6", "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" } }, "sha512-L3THSe2MPeBwgIZVSH5zLdBBU90TOxarvhK9d04IDY2AmVS8j2Jz2LIWtwsGOU3lu2I5jCN7FNvVfY2+XyF+mg=="], + + "hast-util-embedded": ["hast-util-embedded@3.0.0", "", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-is-element": "^3.0.0" } }, "sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA=="], + + "hast-util-format": ["hast-util-format@1.1.0", "", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-embedded": "^3.0.0", "hast-util-minify-whitespace": "^1.0.0", "hast-util-phrasing": "^3.0.0", "hast-util-whitespace": "^3.0.0", "html-whitespace-sensitive-tag-names": "^3.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-yY1UDz6bC9rDvCWHpx12aIBGRG7krurX0p0Fm6pT547LwDIZZiNr8a+IHDogorAdreULSEzP82Nlv5SZkHZcjA=="], + + "hast-util-from-html": ["hast-util-from-html@2.0.3", "", { "dependencies": { "@types/hast": "^3.0.0", "devlop": "^1.1.0", "hast-util-from-parse5": "^8.0.0", "parse5": "^7.0.0", "vfile": "^6.0.0", "vfile-message": "^4.0.0" } }, "sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw=="], + + "hast-util-from-parse5": ["hast-util-from-parse5@8.0.3", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "devlop": "^1.0.0", "hastscript": "^9.0.0", "property-information": "^7.0.0", "vfile": "^6.0.0", "vfile-location": "^5.0.0", "web-namespaces": "^2.0.0" } }, "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg=="], + + "hast-util-has-property": ["hast-util-has-property@3.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA=="], + + "hast-util-is-body-ok-link": ["hast-util-is-body-ok-link@3.0.1", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-0qpnzOBLztXHbHQenVB8uNuxTnm/QBFUOmdOSsEn7GnBtyY07+ENTWVFBAnXd/zEgd9/SUG3lRY7hSIBWRgGpQ=="], + + "hast-util-is-element": ["hast-util-is-element@3.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g=="], + + "hast-util-minify-whitespace": ["hast-util-minify-whitespace@1.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-embedded": "^3.0.0", "hast-util-is-element": "^3.0.0", "hast-util-whitespace": "^3.0.0", "unist-util-is": "^6.0.0" } }, "sha512-L96fPOVpnclQE0xzdWb/D12VT5FabA7SnZOUMtL1DbXmYiHJMXZvFkIZfiMmTCNJHUeO2K9UYNXoVyfz+QHuOw=="], + + "hast-util-parse-selector": ["hast-util-parse-selector@4.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A=="], + + "hast-util-phrasing": ["hast-util-phrasing@3.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-embedded": "^3.0.0", "hast-util-has-property": "^3.0.0", "hast-util-is-body-ok-link": "^3.0.0", "hast-util-is-element": "^3.0.0" } }, "sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ=="], + + "hast-util-select": ["hast-util-select@6.0.4", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "bcp-47-match": "^2.0.0", "comma-separated-tokens": "^2.0.0", "css-selector-parser": "^3.0.0", "devlop": "^1.0.0", "direction": "^2.0.0", "hast-util-has-property": "^3.0.0", "hast-util-to-string": "^3.0.0", "hast-util-whitespace": "^3.0.0", "nth-check": "^2.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "unist-util-visit": "^5.0.0", "zwitch": "^2.0.0" } }, "sha512-RqGS1ZgI0MwxLaKLDxjprynNzINEkRHY2i8ln4DDjgv9ZhcYVIHN9rlpiYsqtFwrgpYU361SyWDQcGNIBVu3lw=="], + + "hast-util-to-html": ["hast-util-to-html@9.0.5", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "ccount": "^2.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-whitespace": "^3.0.0", "html-void-elements": "^3.0.0", "mdast-util-to-hast": "^13.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "stringify-entities": "^4.0.0", "zwitch": "^2.0.4" } }, "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw=="], + + "hast-util-to-mdast": ["hast-util-to-mdast@10.1.2", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "@ungap/structured-clone": "^1.0.0", "hast-util-phrasing": "^3.0.0", "hast-util-to-html": "^9.0.0", "hast-util-to-text": "^4.0.0", "hast-util-whitespace": "^3.0.0", "mdast-util-phrasing": "^4.0.0", "mdast-util-to-hast": "^13.0.0", "mdast-util-to-string": "^4.0.0", "rehype-minify-whitespace": "^6.0.0", "trim-trailing-lines": "^2.0.0", "unist-util-position": "^5.0.0", "unist-util-visit": "^5.0.0" } }, "sha512-FiCRI7NmOvM4y+f5w32jPRzcxDIz+PUqDwEqn1A+1q2cdp3B8Gx7aVrXORdOKjMNDQsD1ogOr896+0jJHW1EFQ=="], + + "hast-util-to-string": ["hast-util-to-string@3.0.1", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A=="], + + "hast-util-to-text": ["hast-util-to-text@4.0.2", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "hast-util-is-element": "^3.0.0", "unist-util-find-after": "^5.0.0" } }, "sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A=="], + + "hast-util-whitespace": ["hast-util-whitespace@3.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw=="], + + "hastscript": ["hastscript@9.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-parse-selector": "^4.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0" } }, "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w=="], + + "html-escaper": ["html-escaper@3.0.3", "", {}, "sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ=="], + + "html-void-elements": ["html-void-elements@3.0.0", "", {}, "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg=="], + + "html-whitespace-sensitive-tag-names": ["html-whitespace-sensitive-tag-names@3.0.1", "", {}, "sha512-q+310vW8zmymYHALr1da4HyXUQ0zgiIwIicEfotYPWGN0OJVEN/58IJ3A4GBYcEq3LGAZqKb+ugvP0GNB9CEAA=="], + + "http-cache-semantics": ["http-cache-semantics@4.3.0", "", {}, "sha512-M5t5LlJpS1UHMjvwRQVdFHvPISGeLAxNcrWuJkeGh0KxsqCHZ1O3NXZU/8x7cD0BDcGW8kapxMKTvwlqrNkHkA=="], + + "i18next": ["i18next@26.4.5", "", { "peerDependencies": { "typescript": "^5 || ^6 || ^7" }, "optionalPeers": ["typescript"] }, "sha512-CY9xqbWNQ+eLGDhFX3eNl1kDO1amJixszVKjC4Nd0tvfxUFLKqarN0VUHRt+2b88U7bkNIhnL84dRKQ5mFI+fg=="], + + "iron-webcrypto": ["iron-webcrypto@1.2.1", "", {}, "sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg=="], + + "is-alphabetical": ["is-alphabetical@2.0.1", "", {}, "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ=="], + + "is-alphanumerical": ["is-alphanumerical@2.0.1", "", { "dependencies": { "is-alphabetical": "^2.0.0", "is-decimal": "^2.0.0" } }, "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw=="], + + "is-decimal": ["is-decimal@2.0.1", "", {}, "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A=="], + + "is-docker": ["is-docker@4.0.0", "", { "bin": { "is-docker": "cli.js" } }, "sha512-LHE+wROyG/Y/0ZnbktRCoTix2c1RhgWaZraMZ8o1Q7zCh0VSrICJQO5oqIIISrcSBtrXv0o233w1IYwsWCjTzA=="], + + "is-hexadecimal": ["is-hexadecimal@2.0.1", "", {}, "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg=="], + + "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], + + "is-plain-obj": ["is-plain-obj@4.1.0", "", {}, "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg=="], + + "js-yaml": ["js-yaml@4.3.2", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA=="], + + "jsonc-parser": ["jsonc-parser@3.3.1", "", {}, "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ=="], + + "klona": ["klona@2.0.6", "", {}, "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA=="], + + "lightningcss": ["lightningcss@1.33.0", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-android-arm64": "1.33.0", "lightningcss-darwin-arm64": "1.33.0", "lightningcss-darwin-x64": "1.33.0", "lightningcss-freebsd-x64": "1.33.0", "lightningcss-linux-arm-gnueabihf": "1.33.0", "lightningcss-linux-arm64-gnu": "1.33.0", "lightningcss-linux-arm64-musl": "1.33.0", "lightningcss-linux-x64-gnu": "1.33.0", "lightningcss-linux-x64-musl": "1.33.0", "lightningcss-win32-arm64-msvc": "1.33.0", "lightningcss-win32-x64-msvc": "1.33.0" } }, "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA=="], + + "lightningcss-android-arm64": ["lightningcss-android-arm64@1.33.0", "", { "os": "android", "cpu": "arm64" }, "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg=="], + + "lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.33.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg=="], + + "lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.33.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ=="], + + "lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.33.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg=="], + + "lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.33.0", "", { "os": "linux", "cpu": "arm" }, "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ=="], + + "lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.33.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg=="], + + "lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.33.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ=="], + + "lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.33.0", "", { "os": "linux", "cpu": "x64" }, "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg=="], + + "lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.33.0", "", { "os": "linux", "cpu": "x64" }, "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw=="], + + "lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.33.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA=="], + + "lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.33.0", "", { "os": "win32", "cpu": "x64" }, "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA=="], + + "longest-streak": ["longest-streak@3.1.0", "", {}, "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="], + + "lru-cache": ["lru-cache@11.5.3", "", {}, "sha512-U4N8FgzmWxc8k1VH8Kr6lQg18U7Fjvby6wXHVRX/ZZ7IwWbRMgrRbP0Wrb5q5NVinryp4SQampHKdvtecItxUg=="], + + "magic-string": ["magic-string@1.4.3", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.6.0" } }, "sha512-z12OxmaPGE0F4xlpGdjuAUckipLpQlTAuAmyGhNoD7ODpYUzvDfvtxUbjM/jwznyP178oju/KDdyi220wNJ0RQ=="], + + "magicast": ["magicast@0.5.5", "", { "dependencies": { "@babel/parser": "^7.29.7", "@babel/types": "^7.29.7", "source-map-js": "^1.2.1" } }, "sha512-UicdXN8zQ3JHlxVq+28afMXPr1z7WNY6+7EJnzTdQWkTAlMLF5fNCCKxJHBQwGaNGR11581EiQmQzx73+MvszA=="], + + "markdown-table": ["markdown-table@3.0.4", "", {}, "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw=="], + + "mdast-util-directive": ["mdast-util-directive@3.1.1", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "ccount": "^2.0.0", "devlop": "^1.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0", "micromark-util-character": "^2.0.0", "parse-entities": "^4.0.0", "stringify-entities": "^4.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-Gqpa3MHorXYEZ0VfbroyvBlVKUfz371V6mIERqOYMcb0W1D3LwmFq1ZW4O2TDrbn+4ZmGLwMWeFRJgYZ+bc5fQ=="], + + "mdast-util-find-and-replace": ["mdast-util-find-and-replace@3.0.3", "", { "dependencies": { "@types/mdast": "^4.0.0", "escape-string-regexp": "^5.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-xPgpDNl0/OXHsI7TlaIs22lWnH3KlpvZdXG1ET/m/YT2Hhdkx8lJV4kLphE6l9simyM4KPDFBwas08BgEob6Jw=="], + + "mdast-util-from-markdown": ["mdast-util-from-markdown@2.1.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "mdast-util-to-string": "^4.0.0", "micromark": "^4.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-decode-string": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-KRLgmPaP2H1ul2bpoJkOS+9pAcDAAj9Nu1mqLnh8NLeJG5tlvj42TH80PIGBpROWlRXLk0lDrWNuZCFy/tsB4A=="], + + "mdast-util-gfm": ["mdast-util-gfm@3.1.0", "", { "dependencies": { "mdast-util-from-markdown": "^2.0.0", "mdast-util-gfm-autolink-literal": "^2.0.0", "mdast-util-gfm-footnote": "^2.0.0", "mdast-util-gfm-strikethrough": "^2.0.0", "mdast-util-gfm-table": "^2.0.0", "mdast-util-gfm-task-list-item": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ=="], + + "mdast-util-gfm-autolink-literal": ["mdast-util-gfm-autolink-literal@2.0.1", "", { "dependencies": { "@types/mdast": "^4.0.0", "ccount": "^2.0.0", "devlop": "^1.0.0", "mdast-util-find-and-replace": "^3.0.0", "micromark-util-character": "^2.0.0" } }, "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ=="], + + "mdast-util-gfm-footnote": ["mdast-util-gfm-footnote@2.1.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.1.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0" } }, "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ=="], + + "mdast-util-gfm-strikethrough": ["mdast-util-gfm-strikethrough@2.0.1", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-OuJHqvr455pwu2OaOrir7dbzqs4jlWKOtlu9L6GjcIjjQwNyw02VntQsr/Ek6/A13vgnXfUhBekWRUP1OkNivw=="], + + "mdast-util-gfm-table": ["mdast-util-gfm-table@2.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "markdown-table": "^3.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg=="], + + "mdast-util-gfm-task-list-item": ["mdast-util-gfm-task-list-item@2.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ=="], + + "mdast-util-phrasing": ["mdast-util-phrasing@4.1.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "unist-util-is": "^6.0.0" } }, "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w=="], + + "mdast-util-to-hast": ["mdast-util-to-hast@13.2.1", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "@ungap/structured-clone": "^1.0.0", "devlop": "^1.0.0", "micromark-util-sanitize-uri": "^2.0.0", "trim-lines": "^3.0.0", "unist-util-position": "^5.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0" } }, "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA=="], + + "mdast-util-to-markdown": ["mdast-util-to-markdown@2.2.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "longest-streak": "^3.0.0", "mdast-util-phrasing": "^4.0.0", "mdast-util-to-string": "^4.0.0", "micromark-util-character": "^2.0.0", "micromark-util-classify-character": "^2.0.0", "micromark-util-decode-string": "^2.0.0", "micromark-util-html-tag-name": "^2.0.0", "unist-util-visit": "^5.0.0", "zwitch": "^2.0.0" } }, "sha512-2Jn/ADrHFFyyniBMi0bncTbJqU78K3/TEYvzvwrWWzD9MYPUa/Gm4r3nOeKFQg/PDM5BsbDYdc8ackW4NTY6NA=="], + + "mdast-util-to-string": ["mdast-util-to-string@4.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0" } }, "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg=="], + + "mdn-data": ["mdn-data@2.27.1", "", {}, "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ=="], + + "micromark": ["micromark@4.0.3", "", { "dependencies": { "@types/debug": "^4.0.0", "debug": "^4.0.0", "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "micromark-core-commonmark": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-combine-extensions": "^2.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-edit-map": "^1.0.0", "micromark-util-encode": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-resolve-all": "^2.0.0", "micromark-util-sanitize-uri": "^2.0.0", "micromark-util-subtokenize": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-oGYfQzHSG5dOMovQcJ3fyTmZlWAWpi0XA0sJwJs+i6OT88o1+Jtw/8z0CmdowSLxGhhFK89rQ/oXph/wN02PNw=="], + + "micromark-core-commonmark": ["micromark-core-commonmark@2.0.4", "", { "dependencies": { "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "micromark-factory-destination": "^2.0.0", "micromark-factory-label": "^2.0.0", "micromark-factory-space": "^2.1.0", "micromark-factory-title": "^2.0.0", "micromark-factory-whitespace": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-classify-character": "^2.0.0", "micromark-util-edit-map": "^1.0.0", "micromark-util-html-tag-name": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-resolve-all": "^2.0.0", "micromark-util-subtokenize": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.3" } }, "sha512-wxEeE8v8XVvOrxn1TZj74qYhAtTQsSqufHVS3uNVyT1MupXxhyaHk8/9xDNPh9BmL77QNDgWTkZ3RsYHB2ry7w=="], + + "micromark-extension-directive": ["micromark-extension-directive@4.0.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", "micromark-factory-whitespace": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "parse-entities": "^4.0.0" } }, "sha512-/C2nqVmXXmiseSSuCdItCMho7ybwwop6RrrRPk0KbOHW21JKoCldC+8rFOaundDoRBUWBnJJcxeA/Kvi34WQXg=="], + + "micromark-extension-gfm": ["micromark-extension-gfm@3.0.0", "", { "dependencies": { "micromark-extension-gfm-autolink-literal": "^2.0.0", "micromark-extension-gfm-footnote": "^2.0.0", "micromark-extension-gfm-strikethrough": "^2.0.0", "micromark-extension-gfm-table": "^2.0.0", "micromark-extension-gfm-tagfilter": "^2.0.0", "micromark-extension-gfm-task-list-item": "^2.0.0", "micromark-util-combine-extensions": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w=="], + + "micromark-extension-gfm-autolink-literal": ["micromark-extension-gfm-autolink-literal@2.1.0", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-sanitize-uri": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw=="], + + "micromark-extension-gfm-footnote": ["micromark-extension-gfm-footnote@2.1.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-core-commonmark": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-sanitize-uri": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw=="], + + "micromark-extension-gfm-strikethrough": ["micromark-extension-gfm-strikethrough@2.1.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-classify-character": "^2.0.0", "micromark-util-resolve-all": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw=="], + + "micromark-extension-gfm-table": ["micromark-extension-gfm-table@2.1.2", "", { "dependencies": { "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-pRzm4kDTu0MjlmBkxmS9yYhw60nncfcEwu9NNdPFSQEFXS95ZKyIIyTSHu/o3ReBUrLKYEq+7YaXCRn/bPB4MA=="], + + "micromark-extension-gfm-tagfilter": ["micromark-extension-gfm-tagfilter@2.0.0", "", { "dependencies": { "micromark-util-types": "^2.0.0" } }, "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg=="], + + "micromark-extension-gfm-task-list-item": ["micromark-extension-gfm-task-list-item@2.1.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw=="], + + "micromark-factory-destination": ["micromark-factory-destination@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA=="], + + "micromark-factory-label": ["micromark-factory-label@2.0.1", "", { "dependencies": { "devlop": "^1.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg=="], + + "micromark-factory-space": ["micromark-factory-space@2.1.0", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-fS8hnLIjnjvdQIj39Geug8wWsR0HrYZ43KShKxNfwT7t2LOHo/LbWZEzEaSOjwtjdCsjoE6syHhonEzW0zv0+Q=="], + + "micromark-factory-title": ["micromark-factory-title@2.0.1", "", { "dependencies": { "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw=="], + + "micromark-factory-whitespace": ["micromark-factory-whitespace@2.0.1", "", { "dependencies": { "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ=="], + + "micromark-util-character": ["micromark-util-character@2.1.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q=="], + + "micromark-util-chunked": ["micromark-util-chunked@2.0.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA=="], + + "micromark-util-classify-character": ["micromark-util-classify-character@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q=="], + + "micromark-util-combine-extensions": ["micromark-util-combine-extensions@2.0.1", "", { "dependencies": { "micromark-util-chunked": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg=="], + + "micromark-util-decode-numeric-character-reference": ["micromark-util-decode-numeric-character-reference@2.0.2", "", { "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw=="], + + "micromark-util-decode-string": ["micromark-util-decode-string@2.0.1", "", { "dependencies": { "decode-named-character-reference": "^1.0.0", "micromark-util-character": "^2.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-symbol": "^2.0.0" } }, "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ=="], + + "micromark-util-edit-map": ["micromark-util-edit-map@1.0.0", "", { "dependencies": { "micromark-util-types": "^2.0.0" } }, "sha512-Pa2ljlsEL6sVwFaYeyrOLSYbQt73JvGbPOYFq+9AElXiSnfI5Q4465RRZ1sHv7lDjDOnGRDDaqPXqClqWK/q1Q=="], + + "micromark-util-encode": ["micromark-util-encode@2.0.1", "", {}, "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw=="], + + "micromark-util-html-tag-name": ["micromark-util-html-tag-name@2.0.1", "", {}, "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA=="], + + "micromark-util-normalize-identifier": ["micromark-util-normalize-identifier@2.0.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q=="], + + "micromark-util-resolve-all": ["micromark-util-resolve-all@2.0.1", "", { "dependencies": { "micromark-util-types": "^2.0.0" } }, "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg=="], + + "micromark-util-sanitize-uri": ["micromark-util-sanitize-uri@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-encode": "^2.0.0", "micromark-util-symbol": "^2.0.0" } }, "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ=="], + + "micromark-util-subtokenize": ["micromark-util-subtokenize@2.1.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA=="], + + "micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="], + + "micromark-util-types": ["micromark-util-types@2.0.3", "", {}, "sha512-oxB2Ik03hI0gv+VNn9tnh1t1YEe9MDPptViAEgfdf3YQHsn0pzGTgCdlSCJXcwhqm8phaEuM7zeEu3QQzVBrPg=="], + + "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], + + "mrmime": ["mrmime@2.0.1", "", {}, "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ=="], + + "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + + "nanoid": ["nanoid@3.3.20", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-uKdg2G3GNCKQn9byYOpxbGqrT2fGO5KRt5J/8b3pok8rT6qxGWF6hxMyJiEYtAf+FVyYuD9hRaDqX5uPFYJ4ZQ=="], + + "neotraverse": ["neotraverse@1.0.1", "", {}, "sha512-WmmLty1YWwJl9yZi77v2dVIV6X2kuYV8YYBI/G3LWGKdGHmHUvL1z7FW0iDvEvGAwNEoc5x1tOOOyDnf5jJw/w=="], + + "nlcst-to-string": ["nlcst-to-string@4.0.0", "", { "dependencies": { "@types/nlcst": "^2.0.0" } }, "sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA=="], + + "node-fetch-native": ["node-fetch-native@1.6.7", "", {}, "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q=="], + + "node-mock-http": ["node-mock-http@1.0.5", "", {}, "sha512-KQyt/wLjG3TAc7DOUhpqWzgd4ERxR80JOlTK5VE5R1S12IaPVN5qkj4klBce9HPG1Njuup4Sb5bljaT34lIyjw=="], + + "normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="], + + "nth-check": ["nth-check@2.1.1", "", { "dependencies": { "boolbase": "^1.0.0" } }, "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w=="], + + "obug": ["obug@3.0.0", "", {}, "sha512-5vvB5+W7ePv+p3uqxi+RcW1XAzLW0/hxt3/4X4Lc4qHudzOhmBiBwOY6DRob4WnanAEGvNcLjF+KNOufrUoEQw=="], + + "ofetch": ["ofetch@1.5.1", "", { "dependencies": { "destr": "^2.0.5", "node-fetch-native": "^1.6.7", "ufo": "^1.6.1" } }, "sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA=="], + + "ohash": ["ohash@2.0.12", "", {}, "sha512-65S/5gk9YSsaRjcyf7Nfa6h/d3E8/1gslpXfI4W7Dxn/oap8IKRuNT5VXkLQ1YFKIEg4apRY4Pj6aiwFzrDdmw=="], + + "oniguruma-parser": ["oniguruma-parser@0.12.2", "", {}, "sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw=="], + + "oniguruma-to-es": ["oniguruma-to-es@4.3.6", "", { "dependencies": { "oniguruma-parser": "^0.12.2", "regex": "^6.1.0", "regex-recursion": "^6.0.2" } }, "sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA=="], + + "p-limit": ["p-limit@7.3.3", "", { "dependencies": { "yocto-queue": "^1.2.1" } }, "sha512-SKgVvDU5TNIxQ4r30U75BNLC6a+6GOEjngrk/ysM5+Zu3oJuk1SC5ApzIzY/7PjCEjoVPMWJ0zho/4QUiEB7TQ=="], + + "p-queue": ["p-queue@9.3.5", "", { "dependencies": { "eventemitter3": "^5.0.4", "p-timeout": "^7.0.0" } }, "sha512-Lki/zhXFVmDhesBUn/yHRLW9Bte7mE7xoFHzTR8sIomV7a2z+LxYAPkGvdfidNiu4fKSfjtawixxSHcZci5QcQ=="], + + "p-timeout": ["p-timeout@7.0.2", "", {}, "sha512-prbX4Z3YszrFNgH+MW5Zoeq3baXrMtP/MQnFeET90UB/GtGcGDQ5Usg9OCy6ETjTTntOw1SL2z9fMPUppN3Guw=="], + + "package-manager-detector": ["package-manager-detector@1.9.0", "", {}, "sha512-zAMfbta9nPA8AKkA4WdmNAT8R8s6Dk0/xwPsqNnRidMFcLo1YkLuPDTgs2f64XdzS8vbLNnoJ+uUIkgbz7oRHA=="], + + "pagefind": ["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" }, "bin": { "pagefind": "lib/runner/bin.cjs" } }, "sha512-XTUaK0hXMCu2jszWE584JGQT7y284TmMV9l/HX3rnG5uo3rHI/uHU56XTyyyPFjeWEBxECbAi0CaFDJOONtG0Q=="], + + "parse-entities": ["parse-entities@4.0.2", "", { "dependencies": { "@types/unist": "^2.0.0", "character-entities-legacy": "^3.0.0", "character-reference-invalid": "^2.0.0", "decode-named-character-reference": "^1.0.0", "is-alphanumerical": "^2.0.0", "is-decimal": "^2.0.0", "is-hexadecimal": "^2.0.0" } }, "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw=="], + + "parse5": ["parse5@7.3.0", "", { "dependencies": { "entities": "^6.0.0" } }, "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw=="], + + "piccolore": ["piccolore@0.1.3", "", {}, "sha512-o8bTeDWjE086iwKrROaDf31K0qC/BENdm15/uH9usSC/uZjJOKb2YGiVHfLY4GhwsERiPI1jmwI2XrA7ACOxVw=="], + + "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], + + "picomatch": ["picomatch@4.0.7", "", {}, "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA=="], + + "postcss": ["postcss@8.5.30", "", { "dependencies": { "nanoid": "^3.3.20", "picocolors": "^1.1.1", "source-map-js": "^1.2.2" } }, "sha512-zkd+e9S1AQHhmaBKye9zlFHWjOwVgqXl1q3ECYy8561K7qxR2cREf/STLskulBFd78k6AOFeA+ff1TtEzk9bAA=="], + + "postcss-nested": ["postcss-nested@6.2.0", "", { "dependencies": { "postcss-selector-parser": "^6.1.1" }, "peerDependencies": { "postcss": "^8.2.14" } }, "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ=="], + + "postcss-selector-parser": ["postcss-selector-parser@6.1.4", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-bIoJLOmjCO1S9XdY/DcnR5hJxvrDir1PbGChrzXG3vw0/FOliy/fA3dmdhQ441kah4gKv+TwckGzex6wNS5cnQ=="], + + "prismjs": ["prismjs@1.30.0", "", {}, "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw=="], + + "process-ancestry": ["process-ancestry@0.1.0", "", {}, "sha512-tGqJW/UnclpYASFcM6Xh8D8l/BMtaQ9+CSG0vlJSJTcdMM4lDRv4c6H0Pdcsfted+bVczdYSfk2fdukg2gQkZg=="], + + "property-information": ["property-information@7.2.0", "", {}, "sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg=="], + + "radix3": ["radix3@1.1.2", "", {}, "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA=="], + + "readdirp": ["readdirp@5.1.1", "", {}, "sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA=="], + + "regex": ["regex@6.1.0", "", { "dependencies": { "regex-utilities": "^2.3.0" } }, "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg=="], + + "regex-recursion": ["regex-recursion@6.0.2", "", { "dependencies": { "regex-utilities": "^2.3.0" } }, "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg=="], + + "regex-utilities": ["regex-utilities@2.3.0", "", {}, "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng=="], + + "rehype-expressive-code": ["rehype-expressive-code@0.44.2", "", { "dependencies": { "expressive-code": "^0.44.2" } }, "sha512-jvjQpsfWKBquDrEl5YQA3CJybRRIuDOYsui1BJTs5oKDUK8pPkJSSxY8FjxNlIFIdtgrTjC1zuahuY4Cc1j9SQ=="], + + "rehype-minify-whitespace": ["rehype-minify-whitespace@6.0.2", "", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-minify-whitespace": "^1.0.0" } }, "sha512-Zk0pyQ06A3Lyxhe9vGtOtzz3Z0+qZ5+7icZ/PL/2x1SHPbKao5oB/g/rlc6BCTajqBb33JcOe71Ye1oFsuYbnw=="], + + "rehype-parse": ["rehype-parse@9.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-from-html": "^2.0.0", "unified": "^11.0.0" } }, "sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag=="], + + "rehype-remark": ["rehype-remark@10.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "hast-util-to-mdast": "^10.0.0", "unified": "^11.0.0", "vfile": "^6.0.0" } }, "sha512-EmDndlb5NVwXGfUa4c9GPK+lXeItTilLhE6ADSaQuHr4JUlKw9MidzGzx4HpqZrNCt6vnHmEifXQiiA+CEnjYQ=="], + + "remark-directive": ["remark-directive@4.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-directive": "^3.0.0", "micromark-extension-directive": "^4.0.0", "unified": "^11.0.0" } }, "sha512-7sxn4RfF1o3izevPV1DheyGDD6X4c9hrGpfdUpm7uC++dqrnJxIZVkk7CoKqcLm0VUMAuOol7Mno3m6g8cfMuA=="], + + "remark-gfm": ["remark-gfm@4.0.1", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-gfm": "^3.0.0", "micromark-extension-gfm": "^3.0.0", "remark-parse": "^11.0.0", "remark-stringify": "^11.0.0", "unified": "^11.0.0" } }, "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg=="], + + "remark-parse": ["remark-parse@11.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-from-markdown": "^2.0.0", "micromark-util-types": "^2.0.0", "unified": "^11.0.0" } }, "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA=="], + + "remark-stringify": ["remark-stringify@11.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-to-markdown": "^2.0.0", "unified": "^11.0.0" } }, "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw=="], + + "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], + + "retext-smartypants": ["retext-smartypants@6.2.0", "", { "dependencies": { "@types/nlcst": "^2.0.0", "nlcst-to-string": "^4.0.0", "unist-util-visit": "^5.0.0" } }, "sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ=="], + + "rolldown": ["rolldown@1.2.14", "", { "dependencies": { "@oxc-project/types": "=0.154.0", "@rolldown/pluginutils": "^1.0.0" }, "optionalDependencies": { "@rolldown/binding-android-arm-eabi": "1.2.14", "@rolldown/binding-android-arm64": "1.2.14", "@rolldown/binding-darwin-arm64": "1.2.14", "@rolldown/binding-darwin-x64": "1.2.14", "@rolldown/binding-freebsd-x64": "1.2.14", "@rolldown/binding-linux-arm-gnueabihf": "1.2.14", "@rolldown/binding-linux-arm64-gnu": "1.2.14", "@rolldown/binding-linux-arm64-musl": "1.2.14", "@rolldown/binding-linux-ppc64-gnu": "1.2.14", "@rolldown/binding-linux-s390x-gnu": "1.2.14", "@rolldown/binding-linux-x64-gnu": "1.2.14", "@rolldown/binding-linux-x64-musl": "1.2.14", "@rolldown/binding-openharmony-arm64": "1.2.14", "@rolldown/binding-win32-arm64-msvc": "1.2.14", "@rolldown/binding-win32-x64-msvc": "1.2.14" }, "bin": { "rolldown": "./bin/cli.mjs" } }, "sha512-eTBTTqMR6uHKLgcUqpJP8ntzDI6V4LYA8negAMBEI7gkgVvOdrx6VsvS2Ym+83KhOPdLCHWJu0w7UQFJZhHKNw=="], + + "satteri": ["satteri@0.10.5", "", { "dependencies": { "@types/estree-jsx": "^1.0.5", "@types/hast": "^3.0.5", "@types/mdast": "^4.0.4", "@types/unist": "^3.0.3" }, "optionalDependencies": { "@bruits/satteri-darwin-arm64": "0.10.5", "@bruits/satteri-darwin-x64": "0.10.5", "@bruits/satteri-linux-arm64-gnu": "0.10.5", "@bruits/satteri-linux-arm64-musl": "0.10.5", "@bruits/satteri-linux-x64-gnu": "0.10.5", "@bruits/satteri-linux-x64-musl": "0.10.5", "@bruits/satteri-wasm32-wasi": "0.10.5", "@bruits/satteri-win32-arm64-msvc": "0.10.5", "@bruits/satteri-win32-x64-msvc": "0.10.5" } }, "sha512-Ao1LKpAEa9Wdg0otgbVKViZHEq9ebdXe4DMrp3s9vQAU0HNIuHnFEuMuOcm0ZIXyV0Yzxj91NvhLpvXZJO/5ZQ=="], + + "sax": ["sax@1.6.1", "", {}, "sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q=="], + + "semver": ["semver@7.8.5", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA=="], + + "sharp": ["sharp@0.35.5", "", { "dependencies": { "@img/colour": "^1.1.0", "detect-libc": "^2.1.2", "semver": "^7.8.5" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "0.35.5", "@img/sharp-darwin-x64": "0.35.5", "@img/sharp-freebsd-wasm32": "0.35.5", "@img/sharp-libvips-darwin-arm64": "1.3.4", "@img/sharp-libvips-darwin-x64": "1.3.4", "@img/sharp-libvips-linux-arm": "1.3.4", "@img/sharp-libvips-linux-arm64": "1.3.4", "@img/sharp-libvips-linux-ppc64": "1.3.4", "@img/sharp-libvips-linux-riscv64": "1.3.4", "@img/sharp-libvips-linux-s390x": "1.3.4", "@img/sharp-libvips-linux-x64": "1.3.4", "@img/sharp-libvips-linuxmusl-arm64": "1.3.4", "@img/sharp-libvips-linuxmusl-x64": "1.3.4", "@img/sharp-linux-arm": "0.35.5", "@img/sharp-linux-arm64": "0.35.5", "@img/sharp-linux-ppc64": "0.35.5", "@img/sharp-linux-riscv64": "0.35.5", "@img/sharp-linux-s390x": "0.35.5", "@img/sharp-linux-x64": "0.35.5", "@img/sharp-linuxmusl-arm64": "0.35.5", "@img/sharp-linuxmusl-x64": "0.35.5", "@img/sharp-webcontainers-wasm32": "0.35.5", "@img/sharp-win32-arm64": "0.35.5", "@img/sharp-win32-ia32": "0.35.5", "@img/sharp-win32-x64": "0.35.5" } }, "sha512-Ywn4OnzGukp7CDMrp08RQ50YKmuwG47brZgIVPTvBaaAfQlRlygrRqSrxdCiL9M+LlzLBiJ68IR1QqvzHyjC7g=="], + + "shiki": ["shiki@4.5.0", "", { "dependencies": { "@shikijs/core": "4.5.0", "@shikijs/engine-javascript": "4.5.0", "@shikijs/engine-oniguruma": "4.5.0", "@shikijs/langs": "4.5.0", "@shikijs/themes": "4.5.0", "@shikijs/types": "4.5.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.5" } }, "sha512-OcRW72ngQvc+MSVWBRIovC/BTW589iUE/Vxav7VeM4RcY9MUjqB+IR6ILG1k9nuW6LiG/nct9uma4/MBtnZbmQ=="], + + "sisteransi": ["sisteransi@1.0.5", "", {}, "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg=="], + + "sitemap": ["sitemap@9.0.1", "", { "dependencies": { "@types/node": "^24.9.2", "@types/sax": "^1.2.1", "arg": "^5.0.0", "sax": "^1.4.1" }, "bin": { "sitemap": "dist/esm/cli.js" } }, "sha512-S6hzjGJSG3d6if0YoF5kTyeRJvia6FSTBroE5fQ0bu1QNxyJqhhinfUsXi9fH3MgtXODWvwo2BDyQSnhPQ88uQ=="], + + "smol-toml": ["smol-toml@1.9.1", "", {}, "sha512-j7WyPdf0CJoutMzMoPLF/bVXHtKZIT9Rb4eGeEbWw8X2t5oirjPgpL+OpaENZrILYaXqYwnVH+qgUwVbl+pUJQ=="], + + "source-map-js": ["source-map-js@1.2.2", "", {}, "sha512-KGj/8Y43x35aZVDtt+J4mK1hoLGHULMYfSkODJNQjNDC3oW1PqPoxMwo0pLUsWM/UEGzON/NxeHywEfNXNP3Vw=="], + + "space-separated-tokens": ["space-separated-tokens@2.0.2", "", {}, "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q=="], + + "starlight-llms-txt": ["starlight-llms-txt@0.12.0", "", { "dependencies": { "@astrojs/mdx": "^8.0.1", "@types/hast": "^3.0.5", "@types/micromatch": "^4.0.10", "github-slugger": "^2.0.0", "hast-util-select": "^6.0.4", "micromatch": "^4.0.8", "rehype-parse": "^9.0.1", "rehype-remark": "^10.0.1", "remark-gfm": "^4.0.1", "remark-stringify": "^11.0.0", "unified": "^11.0.5", "unist-util-remove": "^4.0.0" }, "peerDependencies": { "@astrojs/starlight": ">=0.41.0", "astro": "^7.0.0" } }, "sha512-ya4c0ZoiPUXuHDzd3AYCKh78Y3II3EToSE9Yp6uVN0c2UUKoNpqTjijhW86W/4toZzSUhWSnxeYs7QBcXNIPGg=="], + + "stringify-entities": ["stringify-entities@4.0.4", "", { "dependencies": { "character-entities-html4": "^2.0.0", "character-entities-legacy": "^3.0.0" } }, "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg=="], + + "svgo": ["svgo@4.1.0", "", { "dependencies": { "commander": "^11.1.0", "css-select": "^6.0.0", "css-tree": "^3.0.1", "css-what": "^7.0.0", "csso": "^5.0.5", "picocolors": "^1.1.1", "sax": "1.6.1" }, "bin": { "svgo": "bin/svgo.js" } }, "sha512-bkxnTg1kSU0guhIBmibA6UUhrQmPVA1XsQLN+ylCd+UWzbnLkySOcXpyk1mrl05f+pcaCx2eHb+sp6BgMZWX+Q=="], + + "tiny-inflate": ["tiny-inflate@1.0.3", "", {}, "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw=="], + + "tinyclip": ["tinyclip@1.0.3", "", {}, "sha512-nTv2raKFMzGG6JJp0lpNDsRPdfFE6UHlu2rVEjXo8vkx1ZS3LW2CVXqIaLu8xZlu+6tbFs9V58Qc/Jmk/Ii7wA=="], + + "tinyexec": ["tinyexec@1.3.1", "", {}, "sha512-GCvB3aoys96IuDFBMcTB46JOR6mdMtAToqwiW8JlWhsoh1mhHi/xn9ss/Dg7N555GiJyEt2qzoG/NHCwM6h1EA=="], + + "tinyglobby": ["tinyglobby@0.2.17", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.4" } }, "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g=="], + + "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], + + "trim-lines": ["trim-lines@3.0.1", "", {}, "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg=="], + + "trim-trailing-lines": ["trim-trailing-lines@2.1.0", "", {}, "sha512-5UR5Biq4VlVOtzqkm2AZlgvSlDJtME46uV0br0gENbwN4l5+mMKT4b9gJKqWtuL2zAIqajGJGuvbCbcAJUZqBg=="], + + "trough": ["trough@2.2.0", "", {}, "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw=="], + + "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "ufo": ["ufo@1.6.4", "", {}, "sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA=="], + + "ultrahtml": ["ultrahtml@1.7.0", "", {}, "sha512-2xRd0VHoAQE4M+vF/DvFFB7pUV0ZxTW1TLi7lHQWnF/Sb5TPeEUV/l+hxcNnGO00ZXGnR0voCMmYRKQf+rvJ2g=="], + + "uncrypto": ["uncrypto@0.1.3", "", {}, "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q=="], + + "undici": ["undici@8.12.1", "", {}, "sha512-usz3OVQBeh1LxNn0DzU0voLXMgn5CU/WUdpBsY6Ti5afNao+vTkmn4H/NxoXolc10cOqe2+YIG0Hspq2rsl64w=="], + + "undici-types": ["undici-types@7.24.6", "", {}, "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg=="], + + "unified": ["unified@11.0.5", "", { "dependencies": { "@types/unist": "^3.0.0", "bail": "^2.0.0", "devlop": "^1.0.0", "extend": "^3.0.0", "is-plain-obj": "^4.0.0", "trough": "^2.0.0", "vfile": "^6.0.0" } }, "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA=="], + + "unifont": ["unifont@0.7.5", "", { "dependencies": { "css-tree": "^3.1.0", "ohash": "^2.0.11", "undici": "^8.0.0" } }, "sha512-ULe/Cs+ZIsq+dcFofNkhqielCrUJnb5mr+Yc4EBM2VlL+6OZR6+cjtI2mT1bJvRBrVncqHAbLURxmPLcCXzWMg=="], + + "unist-util-find-after": ["unist-util-find-after@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" } }, "sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ=="], + + "unist-util-is": ["unist-util-is@6.0.1", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g=="], + + "unist-util-position": ["unist-util-position@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA=="], + + "unist-util-remove": ["unist-util-remove@4.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-b4gokeGId57UVRX/eVKej5gXqGlc9+trkORhFJpu9raqZkZhU0zm8Doi05+HaiBsMEIJowL+2WtQ5ItjsngPXg=="], + + "unist-util-stringify-position": ["unist-util-stringify-position@4.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ=="], + + "unist-util-visit": ["unist-util-visit@5.1.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg=="], + + "unist-util-visit-parents": ["unist-util-visit-parents@6.0.2", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" } }, "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ=="], + + "unstorage": ["unstorage@1.17.6", "", { "dependencies": { "anymatch": "^3.1.3", "chokidar": "^5.0.0", "destr": "^2.0.5", "h3": "^1.15.11", "lru-cache": "^11.5.3", "node-fetch-native": "^1.6.7", "ofetch": "^1.5.1", "ufo": "^1.6.4" }, "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 || ^11.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" }, "optionalPeers": ["@azure/app-configuration", "@azure/cosmos", "@azure/data-tables", "@azure/identity", "@azure/keyvault-secrets", "@azure/storage-blob", "@capacitor/preferences", "@deno/kv", "@netlify/blobs", "@planetscale/database", "@upstash/redis", "@vercel/blob", "@vercel/functions", "@vercel/kv", "aws4fetch", "db0", "idb-keyval", "ioredis", "uploadthing"] }, "sha512-gjKtcmn/KwZuJZO9o2sc0esAQnhmTw0LviDHwevTXbJMYs0dRTp8ZEEWXHU0vTpzbN3cA0yxlTeyXssMp3zDqw=="], + + "url-extras": ["url-extras@0.1.0", "", {}, "sha512-8tzwTeXFPuX/5PHuCDQE5Dd9Ts4rwoq2t9aIT+HS4iAVpmj5l4Ao7Q+BuuFjvWRqrLswBhQDk8O96ZicgCqQqw=="], + + "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], + + "verkit": ["verkit@0.5.0", "", {}, "sha512-u4J1hr6Y+C/hit34GwL3eIcUf3wngT8TlYUjK7tk0jxydKLAq3sYvifjdTDA6U3KCKRcQCQDGf/srjxfZF3l7g=="], + + "vfile": ["vfile@6.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "vfile-message": "^4.0.0" } }, "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q=="], + + "vfile-location": ["vfile-location@5.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "vfile": "^6.0.0" } }, "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg=="], + + "vfile-message": ["vfile-message@4.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw=="], + + "vite": ["vite@8.3.4", "", { "dependencies": { "lightningcss": "^1.33.0", "picomatch": "^4.0.7", "postcss": "^8.5.29", "rolldown": "~1.2.12", "tinyglobby": "^0.2.17" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "@vitejs/devtools": "^0.7.1", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.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" }, "optionalPeers": ["@types/node", "@vitejs/devtools", "esbuild", "jiti", "less", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-IftLE8phJhdNRIGNEV4JCCvfNScoZQVfcXaN8TQropWGJtOHcu+iAB9pHcuGvmEb/kddw0LBe/jS8ztdC6xdiQ=="], + + "vitefu": ["vitefu@1.1.3", "", { "peerDependencies": { "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" }, "optionalPeers": ["vite"] }, "sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg=="], + + "web-namespaces": ["web-namespaces@2.0.1", "", {}, "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ=="], + + "xxhash-wasm": ["xxhash-wasm@1.1.0", "", {}, "sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA=="], + + "yaml": ["yaml@2.9.1", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-3NxN8+78OdzbT7C/WjGsyfPAtJaN3FNDsWxv7Y7mcDsT/oOmgW8BpyQQFFBnvZE3j9Y2Sdz1ULFLezL7Eb2yFw=="], + + "yargs-parser": ["yargs-parser@22.0.0", "", {}, "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw=="], + + "yocto-queue": ["yocto-queue@1.2.2", "", {}, "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ=="], + + "zod": ["zod@4.6.7", "", {}, "sha512-g8W2D2kU6a8untc053fX1uVBKzM7yqAxW/3zwk83+6RyF2+SKOuV+c0wBDhUwzV1PaGapmZH+rmcUzPf+3CGwg=="], + + "zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="], + + "@astrojs/compiler-binding-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.11.3", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.3", "tslib": "^2.4.0" } }, "sha512-zLpS5asjEb7lq8jYLq37N6XKaE41DIexlY1rF/z4/tIl3wo13Sqm28fRyfIsKZD+NZ8mM5RoKkpW/rBcuoSZSg=="], + + "@astrojs/compiler-binding-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.11.3", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA=="], + + "@img/sharp-wasm32/@emnapi/runtime": ["@emnapi/runtime@1.11.3", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA=="], + + "anymatch/picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="], + + "csso/css-tree": ["css-tree@2.2.1", "", { "dependencies": { "mdn-data": "2.0.28", "source-map-js": "^1.0.1" } }, "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA=="], + + "dom-serializer/entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="], + + "micromatch/picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="], + + "parse-entities/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="], + + "@astrojs/compiler-binding-wasm32-wasi/@emnapi/core/@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.3", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-ELEBe8PsLvvJ6QMr0zLt8ffvOHW/dc1m3CEzNMg7aJUv3bMaoDtw2TXyDAwkYBuroxxuHEwhRTLJSe5sya547g=="], + + "csso/css-tree/mdn-data": ["mdn-data@2.0.28", "", {}, "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g=="], + } +} diff --git a/web/package.json b/web/package.json new file mode 100644 index 0000000..b2180c1 --- /dev/null +++ b/web/package.json @@ -0,0 +1,20 @@ +{ + "name": "web", + "type": "module", + "version": "0.0.1", + "scripts": { + "dev": "astro dev", + "start": "astro dev", + "build": "astro build", + "preview": "astro preview", + "astro": "astro" + }, + "dependencies": { + "@astrojs/starlight": "^0.42.6", + "@fontsource/ibm-plex-sans": "^5.3.0", + "@fontsource/jetbrains-mono": "^5.3.0", + "astro": "^7.2.10", + "sharp": "^0.35.3", + "starlight-llms-txt": "^0.12.0" + } +} diff --git a/web/public/favicon.svg b/web/public/favicon.svg new file mode 100644 index 0000000..9ad9002 --- /dev/null +++ b/web/public/favicon.svg @@ -0,0 +1 @@ +i diff --git a/web/public/skills/idx/SKILL.md b/web/public/skills/idx/SKILL.md new file mode 100644 index 0000000..83578f7 --- /dev/null +++ b/web/public/skills/idx/SKILL.md @@ -0,0 +1,37 @@ +--- +name: idx +description: Indonesian stock market (IDX) quotes, fundamentals, technicals, screening, and KSEI shareholder ownership through the `idx` CLI. Use for questions about IDX-listed stocks (tickers like BBCA, BBRI, TLKM), who owns them, or ownership changes. +--- + +# idx + +`idx` is installed as a CLI. Docs: https://idx.rasyidanaf.com (any page as Markdown: add `.md`). + +## Rules + +- Capture output: it is JSON whenever stdout is not a terminal. Parse it; don't scrape tables. +- On failure stdout is empty and stderr is `{"error":true,"code":"...","message":"..."}`. + Exit `2` fix the input, `3` not found or no cached data, `4` provider unavailable (retry later), `5` unsupported. +- Tickers are IDX codes (`BBCA`); `.JK` is optional. `stocks quote` and `stocks compare` take several. +- Ownership data is local. If an ownership command says the database is empty, run `idx ownership sync` once. +- Ownership percentages are basis points: `5494` = 54.94%. + +## Commands + +```bash +idx stocks quote BBCA BBRI # price, change, volume, 52-week range +idx stocks history BBCA --period 1y # OHLCV; --interval 1d|1wk|1mo +idx stocks technical BBCA # trend, RSI, MACD, moving averages +idx stocks fundamental BBCA # growth, valuation, risk ratings +idx stocks compare BBCA BBRI BMRI +idx stocks profile BBCA # also: financials, earnings, sentiment, insights, news +idx stocks screen --filter high-dividend # top-performers, worst-performers, low-pe, 52w-high, 52w-low, high-volume, large-cap + +idx ownership ticker BBCA # holders above 1%, concentration, free float +idx ownership entity "ANTHONI SALIM" # one investor's holdings +idx ownership search salim # find investor names +idx ownership releases # available months, newest first +idx ownership changes --from 2026-08-31 --to 2026-09-30 +``` + +Run `idx --help` for every flag. diff --git a/web/scripts/gen-cli-reference.sh b/web/scripts/gen-cli-reference.sh new file mode 100755 index 0000000..e298b72 --- /dev/null +++ b/web/scripts/gen-cli-reference.sh @@ -0,0 +1,58 @@ +#!/usr/bin/env bash +# Writes the CLI reference page from `idx --help` output, walking every +# subcommand. `nix flake check` runs it against the packaged binary and fails +# when the committed page is out of date. +# +# web/scripts/gen-cli-reference.sh > web/src/content/docs/cli/reference.md +set -euo pipefail + +idx=${1:?usage: gen-cli-reference.sh } + +subcommands() { + "$idx" "$@" --help | awk ' + /^Commands:/ { in_cmds = 1; next } + in_cmds && /^[^ ]/ { exit } + in_cmds && /^ [a-z]/ { if ($1 != "help") print $1 } + ' +} + +section() { + local depth=$1 + shift + local hashes + hashes=$(printf '#%.0s' $(seq 1 "$depth")) + # shellcheck disable=SC2016 # backticks are Markdown, not command substitution + printf '%s `idx %s`\n\n```text\n' "$hashes" "$*" + "$idx" "$@" --help + printf '```\n\n' + local sub + for sub in $(subcommands "$@"); do + section $((depth + 1)) "$@" "$sub" + done +} + +main() { +cat <<'EOF' +--- +title: Command reference +description: Every idx command and flag, generated from idx --help. +--- + + + +This page is generated from `idx --help`, so it always matches the released +CLI. For explanations and examples, see the [stocks](/cli/stocks/) and +[ownership](/cli/ownership/) guides. + +## `idx` + +```text +EOF +"$idx" --help +printf '```\n\n' +for group in $(subcommands); do + section 2 "$group" +done +} + +main | sed -e 's/[[:space:]]*$//' -e '${/^$/d}' diff --git a/web/scripts/gen-mcp-tools.sh b/web/scripts/gen-mcp-tools.sh new file mode 100755 index 0000000..fefb17f --- /dev/null +++ b/web/scripts/gen-mcp-tools.sh @@ -0,0 +1,49 @@ +#!/usr/bin/env bash +# Writes the MCP tools page from idx-mcp's tools golden +# (crates/idx-mcp/tests/golden/tools.json). `nix flake check` fails when the +# committed page is out of date. +# +# web/scripts/gen-mcp-tools.sh crates/idx-mcp/tests/golden/tools.json > web/src/content/docs/mcp/tools.md +set -euo pipefail + +tools=${1:?usage: gen-mcp-tools.sh } + +cat <<'EOF' +--- +title: Tools +description: Every idx-mcp tool and its inputs, generated from the server's tool list. +--- + + + +idx-mcp serves these tools. `ownership_sync` is listed only when the server +starts with `--allow-sync`. Results that come from a live provider are wrapped +as `{data, source, fetched_at, stale}`; failures return `{error, code, +message}` with `isError` set. + +EOF + +jq -r ' + def typ($defs): + if .["$ref"] then ($defs[.["$ref"] | sub("^#/\\$defs/"; "")] | .enum | map("`" + . + "`") | join(" / ")) + elif .enum then (.enum | map("`" + tostring + "`") | join(" / ")) + elif (.type | type) == "array" then + (.type | map(select(. != "null")) | join(" | ")) + + (if .items then " of " + (.items | typ($defs)) else "" end) + elif .type == "array" and .items then "array of " + (.items | typ($defs)) + else (.type // "any") end; + [.[] + | .inputSchema as $s + | ($s["$defs"] // {}) as $defs + | ($s.required // []) as $req + | "## `\(.name)`\n\n\(.description)\n\n" + + (if ($s.properties // {}) == {} then "No inputs.\n" + else + "| Input | Type | Required | Description |\n| --- | --- | --- | --- |\n" + + ([$s.properties | to_entries[] + | .key as $k + | "| `\($k)` | \(.value | typ($defs)) | \(if ($req | index($k)) then "yes" else "no" end) | \((.value.description // "") | gsub("\\|"; "\\|") | gsub("\n"; " ")) |"] + | join("\n")) + "\n" + end)] + | join("\n") +' "$tools" | sed '${/^$/d}' diff --git a/web/src/assets/wordmark-dark.svg b/web/src/assets/wordmark-dark.svg new file mode 100644 index 0000000..debd32f --- /dev/null +++ b/web/src/assets/wordmark-dark.svg @@ -0,0 +1 @@ +idx diff --git a/web/src/assets/wordmark-light.svg b/web/src/assets/wordmark-light.svg new file mode 100644 index 0000000..f6e21e3 --- /dev/null +++ b/web/src/assets/wordmark-light.svg @@ -0,0 +1 @@ +idx diff --git a/web/src/components/PageTitle.astro b/web/src/components/PageTitle.astro new file mode 100644 index 0000000..c4abd05 --- /dev/null +++ b/web/src/components/PageTitle.astro @@ -0,0 +1,34 @@ +--- +import Default from '@astrojs/starlight/components/PageTitle.astro'; + +const { id } = Astro.locals.starlightRoute.entry; +const markdownPath = `/${id === 'index' ? 'index' : id}.md`; +--- + +
+ + Markdown +
+ + diff --git a/web/src/content.config.ts b/web/src/content.config.ts new file mode 100644 index 0000000..d9ee8c9 --- /dev/null +++ b/web/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/web/src/content/docs/about.md b/web/src/content/docs/about.md new file mode 100644 index 0000000..e568ee3 --- /dev/null +++ b/web/src/content/docs/about.md @@ -0,0 +1,33 @@ +--- +title: About the data +description: Where idx's data comes from, how fresh it is, and the project's terms. +--- + +## Sources + +| Data | Source | Freshness | +| --- | --- | --- | +| Quotes, company data, screening | MSN Money (default) or Yahoo Finance | live, cached for 5 minutes (quotes) or 1 hour (fundamentals) | +| Price history | Yahoo Finance (default) or MSN | live | +| Ownership | the KSEI register of holders above 1% ("Pemegang Saham di Atas 1%"), published monthly by IDX | the maintained snapshot is checked daily and rebuilt when IDX publishes a new month | + +Quotes from these providers can be delayed. The ownership register lists +only holders above 1%; everything below is reported as free float. + +## The ownership snapshot + +`idx ownership sync` downloads a SQLite snapshot built from IDX's published +reports and attached to the +[GitHub release `ownership-snapshot-current`](https://github.com/0xrsydn/idx-cli/releases/tag/ownership-snapshot-current), +with a manifest and SHA-256 checksum. You can build the same database +yourself from IDX's files with `idx ownership import`. + +## Terms + +idx is open source under the MIT license: +[github.com/0xrsydn/idx-cli](https://github.com/0xrsydn/idx-cli). + +It is not affiliated with, endorsed by, or connected to PT Bursa Efek +Indonesia (IDX), PT Kustodian Sentral Efek Indonesia (KSEI), Microsoft or +Yahoo. Data is provided as is, without warranty. Nothing here is investment +advice. diff --git a/web/src/content/docs/agents/index.md b/web/src/content/docs/agents/index.md new file mode 100644 index 0000000..6e4a460 --- /dev/null +++ b/web/src/content/docs/agents/index.md @@ -0,0 +1,60 @@ +--- +title: Using idx from an agent +description: How an AI agent should call idx, through MCP or the CLI. +--- + +An agent can reach idx two ways: + +- **MCP** ([setup](/mcp/setup/)): typed tools with input schemas, the best + fit for chat-style agents. +- **The CLI**: for agents that run shell commands. No setup beyond + installing `idx`; output is JSON automatically when captured. + +## Using the CLI + +What an agent needs to know: + +- Output is JSON whenever stdout is not a terminal, so capture it and parse + it; no flag is needed. Use `-o jsonl` for long lists. +- On failure stdout is empty and stderr holds one JSON object, + `{"error": true, "code": "...", "message": "..."}`. +- Exit codes say what to do next: `2` fix the input, `3` not found (or no + cached data offline), `4` provider unavailable, retry later, `5` + unsupported, `1` other. +- Tickers are IDX codes (`BBCA`); `.JK` is optional. Several tickers can be + passed at once to `stocks quote` and `stocks compare`. +- Ownership queries need `idx ownership sync` once; after that they run + offline. `idx -o json ownership releases` shows which months exist. + +## Recipes + +```bash +# price and day change for several stocks +idx stocks quote BBCA BBRI BMRI | jq '.[] | {symbol, price, change_pct}' + +# largest holders and concentration +idx ownership ticker BBCA | jq '{holders: [.holders[] | {name, pct: (.percentage_bps / 100)}], concentration}' + +# what one investor holds +idx ownership entity "ANTHONI SALIM" + +# holder changes between the two latest months +idx -o json ownership releases | jq -r '.[0:2][].as_of_date' +idx ownership changes --from 2026-08-31 --to 2026-09-30 +``` + +Percentages in ownership output are basis points (`5494` = 54.94%). + +## Skill file + +For harnesses that load skills (Claude Code, pi, opencode, and others), +[`SKILL.md`](/skills/idx/SKILL.md) packages these rules so the agent uses the +CLI correctly without MCP. Save it as `idx/SKILL.md` in your harness's skills +directory, for example `~/.claude/skills/idx/SKILL.md`. + +## Machine-readable docs + +- [`/llms.txt`](/llms.txt): an index of these docs for language models. +- [`/llms-full.txt`](/llms-full.txt): every page in one file. +- Any page as Markdown: add `.md` to its path, for example + [`/agents/install.md`](/agents/install.md). diff --git a/web/src/content/docs/agents/install.md b/web/src/content/docs/agents/install.md new file mode 100644 index 0000000..2024269 --- /dev/null +++ b/web/src/content/docs/agents/install.md @@ -0,0 +1,95 @@ +--- +title: Agent-led install +description: Instructions for a coding agent to install idx and register idx-mcp with itself. +--- + +This page is written for a coding agent. A user sent you here to install +**idx** (a CLI for Indonesian stock market and KSEI ownership data) and +register its MCP server, **idx-mcp**, with the agent harness you are running +in. Follow the steps in order and report back at the end. + +Ground rules: + +- Never use `sudo`. Install into the user's home directory. +- Before you edit a config file outside the current project (anything under + `~`), show the user the exact change and ask for confirmation. +- If a step fails, stop and tell the user what failed and the error, rather + than trying unrelated workarounds. + +## 1. Check the platform + +Run `uname -sm`. Supported: Linux x86_64/aarch64 and macOS x86_64/arm64. On +Windows, stop and tell the user to use WSL. + +## 2. Install idx + +Use the first option that applies: + +1. **Node.js is available** (`node --version` succeeds): nothing to install + for the MCP server, which runs through `npx -y idx-mcp`. Install the CLI + with `npm install --global idx-cli`; if that fails with a permissions + error, skip it and use `npx -y idx-cli` in place of `idx` below. +2. **Otherwise**: run the install script, which verifies checksums and + installs to `~/.local/bin`: + + ```bash + curl -fsSL https://raw.githubusercontent.com/0xrsydn/idx-cli/main/install.sh | sh + ``` + + It installs only `idx`. For the MCP server without Node.js, use + `cargo install idx-mcp` if `cargo` exists; otherwise tell the user that + idx-mcp needs Node.js, Cargo or Nix, and continue with the CLI only. + +Confirm with `idx version` (or `npx -y idx-cli version`). + +## 3. Register idx-mcp with yourself + +Work out which harness you are, then apply its setup. Use `npx` and +`["-y", "idx-mcp"]` as command and arguments, or `idx-mcp` with no arguments +if you installed the binary. + +| Harness | How | +| --- | --- | +| Claude Code | run `claude mcp add idx -- npx -y idx-mcp` | +| Codex | add to `~/.codex/config.toml`: `[mcp_servers.idx]` with `command = "npx"`, `args = ["-y", "idx-mcp"]` | +| Cursor | add to `~/.cursor/mcp.json` under `mcpServers`: `"idx": {"command": "npx", "args": ["-y", "idx-mcp"]}` | +| opencode | add to `~/.config/opencode/opencode.json` under `mcp`: `"idx": {"type": "local", "command": ["npx", "-y", "idx-mcp"], "enabled": true}` | +| pi | add to `~/.pi/agent/mcp.json` under `mcpServers`: `"idx": {"command": "npx", "args": ["-y", "idx-mcp"], "exposure": "direct"}` | +| Hermes | add to `~/.hermes/config.yaml` under `mcp_servers`: `idx` with `command: npx`, `args: ["-y", "idx-mcp"]`, `enabled: true` | +| anything else | find how your harness registers a stdio MCP server, and ask the user if unsure | + +Merge into existing files; never overwrite other servers or settings. Full +examples: [MCP setup](/mcp/setup/). + +## 4. Download ownership data + +```bash +idx ownership sync +``` + +This downloads a few MB into `~/.local/share/idx/ownership.db`. It is safe to +rerun. + +## 5. Verify + +Run: + +```bash +idx -o json ownership ticker BBCA +``` + +It should list holders, the first being DWIMURIA INVESTAMA ANDALAN. Most +harnesses load MCP servers at startup, so the `idx` tools usually appear only +after a restart. If yours already shows them, call `get_shareholders` with +`{"ticker": "BBCA"}` as well. + +## 6. Report to the user + +Tell the user, briefly: + +- what you installed and how (npm, install script or Cargo), and the version; +- which config file you changed for idx-mcp, or why you didn't; +- the result of the verification (largest BBCA holder and its percentage); +- whether they need to restart the agent to use the idx tools; +- a next thing to try, such as asking "Who are BBCA's largest holders, and + what changed last month?" diff --git a/web/src/content/docs/cli/output.md b/web/src/content/docs/cli/output.md new file mode 100644 index 0000000..ed72dba --- /dev/null +++ b/web/src/content/docs/cli/output.md @@ -0,0 +1,53 @@ +--- +title: Output and exit codes +description: Tables, JSON, errors and exit codes; the contract scripts and agents rely on. +--- + +## Formats + +| `-o` | Prints | +| --- | --- | +| `auto` (default) | a table when stdout is a terminal, compact JSON otherwise | +| `table` | a table | +| `json` | one JSON document | +| `jsonl` | one JSON value per line (one per array item) | + +Set the default with `IDX_OUTPUT` or `general.output`. Colour is off whenever +stdout is not a terminal, and with `--no-color`. + +## The contract + +- stdout carries only data; warnings, progress and errors go to stderr. +- On failure stdout is empty. +- In JSON modes an error is one JSON object on stderr: + + ```json + {"error":true,"code":"INVALIDINPUT","message":"invalid input: invalid ticker symbol '../x'"} + ``` + +## Exit codes + +| Exit | Meaning | What to do | +| --- | --- | --- | +| `0` | success | | +| `2` | invalid input or config | fix the command | +| `3` | not found, no data, or no cached data offline | check the ticker or name; go online | +| `4` | upstream unavailable | retry later | +| `5` | unsupported | use another command or provider | +| `1` | anything else | read the message | + +## Pipes + +```bash +# names and prices +idx stocks quote BBCA BBRI | jq -r '.[] | "\(.symbol) \(.price)"' + +# the last five daily closes +idx -o jsonl stocks history BBCA --period 1y | tail -5 + +# symbols from stdin +idx stocks screen --filter high-dividend | jq -r '.[].symbol' | idx stocks compare - +``` + +`stocks quote` and `stocks compare` read symbols from stdin when given `-`, +separated by whitespace or commas. diff --git a/web/src/content/docs/cli/ownership.md b/web/src/content/docs/cli/ownership.md new file mode 100644 index 0000000..07b1037 --- /dev/null +++ b/web/src/content/docs/cli/ownership.md @@ -0,0 +1,57 @@ +--- +title: Ownership +description: KSEI shareholder data, synced once and queried offline. +--- + +The ownership commands work on the monthly KSEI register of holders above 1% +("Pemegang Saham di Atas 1%") that IDX publishes for every listed company. +idx keeps it in a local SQLite database, so queries are instant and work +offline. + +## Get the data + +```bash +idx ownership sync +``` + +This downloads a maintained snapshot (a few MB, currently the latest three +months) and installs it. Run it again any time: it does nothing when you are +already current, and it never replaces a database holding more history than +the snapshot. `idx ownership releases` lists the months you have. + +## Queries + +```bash +idx ownership ticker BBCA # holders of one stock, with concentration +idx ownership entity "ANTHONI SALIM" # every holding of one investor +idx ownership search salim # find investor names +idx ownership changes --from 2026-08-31 --to 2026-09-30 +idx ownership concentration --top 20 # most concentrated stocks (by HHI) +idx ownership cross-holders --min-tickers 3 +idx ownership graph BBCA --depth 2 # ownership network; --format dot for Graphviz +``` + +`changes` lists holders that are new, exited, increased or decreased between +two releases. `ticker` also reports concentration: the top holder's share, +the top three, the Herfindahl index (HHI) and the free float (shares held by +holders below 1%). + +## Import reports yourself + +The snapshot covers most needs. To load a month it lacks, or older history, +import IDX's reports directly: + +```bash +idx ownership discover # find the latest report URLs on IDX +idx ownership import --url # needs curl-impersonate +idx ownership import --file report.xlsx # or a local XLSX, PDF, ZIP or TXT +``` + +Since June 2026 IDX publishes the register as XLSX; earlier months were PDF +announcements, which need `mutool`. See [helper tools](/start/install/#helper-tools). + +## Entity names + +The register spells some investors differently from month to month. +`idx ownership resolve` lists unresolved names and lets you map an alias to +an entity or merge two entities. diff --git a/web/src/content/docs/cli/reference.md b/web/src/content/docs/cli/reference.md new file mode 100644 index 0000000..2236c01 --- /dev/null +++ b/web/src/content/docs/cli/reference.md @@ -0,0 +1,1103 @@ +--- +title: Command reference +description: Every idx command and flag, generated from idx --help. +--- + + + +This page is generated from `idx --help`, so it always matches the released +CLI. For explanations and examples, see the [stocks](/cli/stocks/) and +[ownership](/cli/ownership/) guides. + +## `idx` + +```text +idx-cli is a Rust command-line tool for Indonesian stock market (IDX) analysis. +It supports quote lookup, historical data, local caching, and output formats for both humans and AI agents. + +Usage: idx [OPTIONS] + +Commands: + stocks Stock data and analysis + config Manage configuration + cache Manage local cache + ownership Ownership intelligence (bootstrap with `ownership sync`) + completions Generate shell completions + version Show idx-cli version + help Print this message or the help of the given subcommand(s) + +Options: + -o, --output + Output format [default: auto = table on a terminal, json when piped] + + [possible values: auto, table, json, jsonl] + + --no-color + Disable colored output + + -q, --quiet + Suppress non-essential output + + -v, --verbose... + Increase verbosity (-v, -vv) + + --offline + Run without network requests + + --no-cache + Bypass local cache + + -h, --help + Print help (see a summary with '-h') +``` + +## `idx stocks` + +```text +Stock data and analysis + +Usage: idx stocks [OPTIONS] + +Commands: + quote Get real-time stock quotes + history Get historical OHLC data + technical Run technical analysis on a stock + growth Run growth analysis on a stock + valuation Run valuation analysis on a stock + risk Run risk analysis on a stock + fundamental Run full fundamental analysis on a stock + profile Get company profile + financials Get financial statements + earnings Get earnings report + sentiment Get crowd sentiment + insights Get AI insights + news Get stock news + screen MSN screener + compare Compare fundamentals across stocks + help Print this message or the help of the given subcommand(s) + +Options: + -o, --output Output format [default: auto = table on a terminal, json when piped] [possible values: auto, table, json, jsonl] + --no-color Disable colored output + -q, --quiet Suppress non-essential output + -v, --verbose... Increase verbosity (-v, -vv) + --offline Run without network requests + --no-cache Bypass local cache + -h, --help Print help +``` + +### `idx stocks quote` + +```text +Get real-time stock quotes + +Usage: idx stocks quote [OPTIONS] ... + +Arguments: + ... One or more symbols, comma-separated or space-separated; `-` reads them from stdin + +Options: + -o, --output Output format [default: auto = table on a terminal, json when piped] [possible values: auto, table, json, jsonl] + --no-color Disable colored output + -q, --quiet Suppress non-essential output + -v, --verbose... Increase verbosity (-v, -vv) + --offline Run without network requests + --no-cache Bypass local cache + -h, --help Print help + +Examples: + idx stocks quote BBCA + idx stocks quote BBCA,BBRI,BMRI + idx -o json stocks quote BBCA + echo BBCA BBRI | idx stocks quote - +``` + +### `idx stocks history` + +```text +Get historical OHLC data + +Usage: idx stocks history [OPTIONS] + +Arguments: + Single ticker symbol (e.g. BBCA) + +Options: + -o, --output + Output format [default: auto = table on a terminal, json when piped] [possible values: auto, table, json, jsonl] + --period + [default: 3mo] [possible values: 1d, 5d, 1mo, 3mo, 6mo, 1y, 2y, 5y] + --interval + [default: 1d] [possible values: 1d, 1wk, 1mo] + --no-color + Disable colored output + --history-provider + [possible values: auto, yahoo, msn] + -q, --quiet + Suppress non-essential output + -v, --verbose... + Increase verbosity (-v, -vv) + --offline + Run without network requests + --no-cache + Bypass local cache + -h, --help + Print help + +Examples: + idx stocks history BBCA --period 3mo + idx stocks history BBCA --period 1y --interval 1wk +``` + +### `idx stocks technical` + +```text +Run technical analysis on a stock + +Usage: idx stocks technical [OPTIONS] + +Arguments: + Single ticker symbol (e.g. BBCA) + +Options: + --history-provider + [possible values: auto, yahoo, msn] + -o, --output + Output format [default: auto = table on a terminal, json when piped] [possible values: auto, table, json, jsonl] + --no-color + Disable colored output + -q, --quiet + Suppress non-essential output + -v, --verbose... + Increase verbosity (-v, -vv) + --offline + Run without network requests + --no-cache + Bypass local cache + -h, --help + Print help + +Examples: + idx stocks technical BBCA + idx -o json stocks technical BBCA +``` + +### `idx stocks growth` + +```text +Run growth analysis on a stock + +Usage: idx stocks growth [OPTIONS] + +Arguments: + Single ticker symbol (e.g. BBCA) + +Options: + -o, --output Output format [default: auto = table on a terminal, json when piped] [possible values: auto, table, json, jsonl] + --no-color Disable colored output + -q, --quiet Suppress non-essential output + -v, --verbose... Increase verbosity (-v, -vv) + --offline Run without network requests + --no-cache Bypass local cache + -h, --help Print help + +Examples: + idx stocks growth BBCA + idx -o json stocks growth BBCA +``` + +### `idx stocks valuation` + +```text +Run valuation analysis on a stock + +Usage: idx stocks valuation [OPTIONS] + +Arguments: + Single ticker symbol (e.g. BBCA) + +Options: + -o, --output Output format [default: auto = table on a terminal, json when piped] [possible values: auto, table, json, jsonl] + --no-color Disable colored output + -q, --quiet Suppress non-essential output + -v, --verbose... Increase verbosity (-v, -vv) + --offline Run without network requests + --no-cache Bypass local cache + -h, --help Print help + +Examples: + idx stocks valuation BBCA + idx -o json stocks valuation BBCA +``` + +### `idx stocks risk` + +```text +Run risk analysis on a stock + +Usage: idx stocks risk [OPTIONS] + +Arguments: + Single ticker symbol (e.g. BBCA) + +Options: + -o, --output Output format [default: auto = table on a terminal, json when piped] [possible values: auto, table, json, jsonl] + --no-color Disable colored output + -q, --quiet Suppress non-essential output + -v, --verbose... Increase verbosity (-v, -vv) + --offline Run without network requests + --no-cache Bypass local cache + -h, --help Print help + +Examples: + idx stocks risk BBCA + idx -o json stocks risk BBCA +``` + +### `idx stocks fundamental` + +```text +Run full fundamental analysis on a stock + +Usage: idx stocks fundamental [OPTIONS] + +Arguments: + Single ticker symbol (e.g. BBCA) + +Options: + -o, --output Output format [default: auto = table on a terminal, json when piped] [possible values: auto, table, json, jsonl] + --no-color Disable colored output + -q, --quiet Suppress non-essential output + -v, --verbose... Increase verbosity (-v, -vv) + --offline Run without network requests + --no-cache Bypass local cache + -h, --help Print help + +Examples: + idx stocks fundamental BBCA + idx -o json stocks fundamental BBCA +``` + +### `idx stocks profile` + +```text +Get company profile + +Usage: idx stocks profile [OPTIONS] + +Arguments: + + +Options: + -o, --output Output format [default: auto = table on a terminal, json when piped] [possible values: auto, table, json, jsonl] + --no-color Disable colored output + -q, --quiet Suppress non-essential output + -v, --verbose... Increase verbosity (-v, -vv) + --offline Run without network requests + --no-cache Bypass local cache + -h, --help Print help +``` + +### `idx stocks financials` + +```text +Get financial statements + +Usage: idx stocks financials [OPTIONS] + +Arguments: + + +Options: + -o, --output Output format [default: auto = table on a terminal, json when piped] [possible values: auto, table, json, jsonl] + --statement ... Limit output to one or more statements [possible values: income, balance, cashflow] + --no-color Disable colored output + -q, --quiet Suppress non-essential output + -v, --verbose... Increase verbosity (-v, -vv) + --offline Run without network requests + --no-cache Bypass local cache + -h, --help Print help + +Examples: + idx stocks financials BBCA + idx stocks financials BBCA --statement income + idx stocks financials BBCA --statement income,balance +``` + +### `idx stocks earnings` + +```text +Get earnings report + +Usage: idx stocks earnings [OPTIONS] + +Arguments: + + +Options: + --forecast Only include forward earnings rows + -o, --output Output format [default: auto = table on a terminal, json when piped] [possible values: auto, table, json, jsonl] + --history Only include historical earnings rows + --no-color Disable colored output + --annual Only include annual periods + -q, --quiet Suppress non-essential output + --quarterly Only include quarterly periods + -v, --verbose... Increase verbosity (-v, -vv) + --offline Run without network requests + --no-cache Bypass local cache + -h, --help Print help + +Examples: + idx stocks earnings BBCA + idx stocks earnings BBCA --history --quarterly + idx -o json stocks earnings BBCA --forecast --annual +``` + +### `idx stocks sentiment` + +```text +Get crowd sentiment + +Usage: idx stocks sentiment [OPTIONS] + +Arguments: + + +Options: + -o, --output Output format [default: auto = table on a terminal, json when piped] [possible values: auto, table, json, jsonl] + --no-color Disable colored output + -q, --quiet Suppress non-essential output + -v, --verbose... Increase verbosity (-v, -vv) + --offline Run without network requests + --no-cache Bypass local cache + -h, --help Print help +``` + +### `idx stocks insights` + +```text +Get AI insights + +Usage: idx stocks insights [OPTIONS] + +Arguments: + + +Options: + -o, --output Output format [default: auto = table on a terminal, json when piped] [possible values: auto, table, json, jsonl] + --no-color Disable colored output + -q, --quiet Suppress non-essential output + -v, --verbose... Increase verbosity (-v, -vv) + --offline Run without network requests + --no-cache Bypass local cache + -h, --help Print help +``` + +### `idx stocks news` + +```text +Get stock news + +Usage: idx stocks news [OPTIONS] + +Arguments: + + +Options: + --limit [default: 10] + -o, --output Output format [default: auto = table on a terminal, json when piped] [possible values: auto, table, json, jsonl] + --no-color Disable colored output + -q, --quiet Suppress non-essential output + -v, --verbose... Increase verbosity (-v, -vv) + --offline Run without network requests + --no-cache Bypass local cache + -h, --help Print help +``` + +### `idx stocks screen` + +```text +MSN screener + +Usage: idx stocks screen [OPTIONS] + +Options: + --filter [default: top-performers] + -o, --output Output format [default: auto = table on a terminal, json when piped] [possible values: auto, table, json, jsonl] + --no-color Disable colored output + --region [default: id] + --limit [default: 50] + -q, --quiet Suppress non-essential output + -v, --verbose... Increase verbosity (-v, -vv) + --offline Run without network requests + --no-cache Bypass local cache + -h, --help Print help +``` + +### `idx stocks compare` + +```text +Compare fundamentals across stocks + +Usage: idx stocks compare [OPTIONS] ... + +Arguments: + ... One or more symbols, comma-separated or space-separated; `-` reads them from stdin + +Options: + -o, --output Output format [default: auto = table on a terminal, json when piped] [possible values: auto, table, json, jsonl] + --no-color Disable colored output + -q, --quiet Suppress non-essential output + -v, --verbose... Increase verbosity (-v, -vv) + --offline Run without network requests + --no-cache Bypass local cache + -h, --help Print help + +Examples: + idx stocks compare BBCA BBRI BMRI + idx stocks compare BBCA,BBRI,BMRI + idx -o json stocks compare BBCA,BBRI + idx stocks screen --filter low-pe | jq -r '.[].symbol' | idx stocks compare - +``` + +## `idx config` + +```text +Manage configuration + +Usage: idx config [OPTIONS] + +Commands: + init Create default configuration file + get Get a configuration value by key + set Set a configuration value by key + path Print configuration file path + help Print this message or the help of the given subcommand(s) + +Options: + -o, --output Output format [default: auto = table on a terminal, json when piped] [possible values: auto, table, json, jsonl] + --no-color Disable colored output + -q, --quiet Suppress non-essential output + -v, --verbose... Increase verbosity (-v, -vv) + --offline Run without network requests + --no-cache Bypass local cache + -h, --help Print help +``` + +### `idx config init` + +```text +Create default configuration file + +Usage: idx config init [OPTIONS] + +Options: + -o, --output Output format [default: auto = table on a terminal, json when piped] [possible values: auto, table, json, jsonl] + --no-color Disable colored output + -q, --quiet Suppress non-essential output + -v, --verbose... Increase verbosity (-v, -vv) + --offline Run without network requests + --no-cache Bypass local cache + -h, --help Print help +``` + +### `idx config get` + +```text +Get a configuration value by key + +Usage: idx config get [OPTIONS] + +Arguments: + + +Options: + -o, --output Output format [default: auto = table on a terminal, json when piped] [possible values: auto, table, json, jsonl] + --no-color Disable colored output + -q, --quiet Suppress non-essential output + -v, --verbose... Increase verbosity (-v, -vv) + --offline Run without network requests + --no-cache Bypass local cache + -h, --help Print help +``` + +### `idx config set` + +```text +Set a configuration value by key + +Usage: idx config set [OPTIONS] + +Arguments: + + + +Options: + -o, --output Output format [default: auto = table on a terminal, json when piped] [possible values: auto, table, json, jsonl] + --no-color Disable colored output + -q, --quiet Suppress non-essential output + -v, --verbose... Increase verbosity (-v, -vv) + --offline Run without network requests + --no-cache Bypass local cache + -h, --help Print help +``` + +### `idx config path` + +```text +Print configuration file path + +Usage: idx config path [OPTIONS] + +Options: + -o, --output Output format [default: auto = table on a terminal, json when piped] [possible values: auto, table, json, jsonl] + --no-color Disable colored output + -q, --quiet Suppress non-essential output + -v, --verbose... Increase verbosity (-v, -vv) + --offline Run without network requests + --no-cache Bypass local cache + -h, --help Print help +``` + +## `idx cache` + +```text +Manage local cache + +Usage: idx cache [OPTIONS] + +Commands: + info Show cache usage information + clear Clear all cached files + help Print this message or the help of the given subcommand(s) + +Options: + -o, --output Output format [default: auto = table on a terminal, json when piped] [possible values: auto, table, json, jsonl] + --no-color Disable colored output + -q, --quiet Suppress non-essential output + -v, --verbose... Increase verbosity (-v, -vv) + --offline Run without network requests + --no-cache Bypass local cache + -h, --help Print help +``` + +### `idx cache info` + +```text +Show cache usage information + +Usage: idx cache info [OPTIONS] + +Options: + -o, --output Output format [default: auto = table on a terminal, json when piped] [possible values: auto, table, json, jsonl] + --no-color Disable colored output + -q, --quiet Suppress non-essential output + -v, --verbose... Increase verbosity (-v, -vv) + --offline Run without network requests + --no-cache Bypass local cache + -h, --help Print help +``` + +### `idx cache clear` + +```text +Clear all cached files + +Usage: idx cache clear [OPTIONS] + +Options: + -o, --output Output format [default: auto = table on a terminal, json when piped] [possible values: auto, table, json, jsonl] + --no-color Disable colored output + -q, --quiet Suppress non-essential output + -v, --verbose... Increase verbosity (-v, -vv) + --offline Run without network requests + --no-cache Bypass local cache + -h, --help Print help +``` + +## `idx ownership` + +```text +Ownership intelligence (KSEI + Bing). + +Preferred bootstrap path: + 1. Run `idx ownership sync` to install or refresh a maintained SQLite snapshot. + 2. If no snapshot manifest is available, run `idx ownership discover` and then `idx ownership import --url `. + 3. Local `.xlsx`, `.pdf`, `.zip`, and `.txt` imports remain available for manual or fallback workflows. + +Usage: idx ownership [OPTIONS] + +Commands: + discover Discover the latest IDX-hosted ownership report URLs + import Import ownership data directly from source files + sync Install or refresh a maintained ownership SQLite snapshot + ticker Show all holders for a ticker (KSEI + Bing combined) + entity Show all holdings for an entity across tickers + search Search entities by name + cross-holders Rank entities by cross-ownership breadth + concentration Rank tickers by ownership concentration + flow Show Bing institutional flow for a ticker + changes Diff two KSEI releases + graph Ownership network graph + resolve Manual entity resolution workflow + releases List imported KSEI releases + help Print this message or the help of the given subcommand(s) + +Options: + -o, --output + Output format [default: auto = table on a terminal, json when piped] + + [possible values: auto, table, json, jsonl] + + --no-color + Disable colored output + + -q, --quiet + Suppress non-essential output + + -v, --verbose... + Increase verbosity (-v, -vv) + + --offline + Run without network requests + + --no-cache + Bypass local cache + + -h, --help + Print help (see a summary with '-h') + +Examples: + idx ownership sync + idx ownership sync --manifest /path/to/ownership-snapshot-manifest.json + idx ownership discover --limit 1 + idx ownership import --url + idx ownership releases +``` + +### `idx ownership discover` + +```text +Discover the latest IDX-hosted ownership report URLs + +Usage: idx ownership discover [OPTIONS] + +Options: + --family Report family to discover: above1 (default), all, above5, or investor-type [default: above1] + -o, --output Output format [default: auto = table on a terminal, json when piped] [possible values: auto, table, json, jsonl] + --limit Maximum number of discovered report URLs to print [default: 6] + --no-color Disable colored output + -q, --quiet Suppress non-essential output + -v, --verbose... Increase verbosity (-v, -vv) + --offline Run without network requests + --no-cache Bypass local cache + -h, --help Print help + +Examples: + idx ownership discover --limit 1 + idx ownership discover --family all --limit 6 + +Use this when no snapshot manifest is available and you need a direct XLSX or PDF URL for `idx ownership import --url`. +``` + +### `idx ownership import` + +```text +Import ownership data directly from source files. + +Prefer `idx ownership sync` for normal bootstrap/update flows. Use `import` when you need a direct PDF import from IDX discovery output, a local PDF, or a local KSEI archive fallback file. + +Usage: idx ownership import [OPTIONS] + +Options: + -o, --output + Output format [default: auto = table on a terminal, json when piped] + + [possible values: auto, table, json, jsonl] + + --url + Direct URL to a remote above-1% XLSX or PDF, typically from `ownership discover` + + --file + Path to a local ownership file: above-1% XLSX or PDF (primary), ZIP/TXT archive (fallback) + + --no-color + Disable colored output + + --fetch-bing + Fetch Bing institutional data for these symbols + + -q, --quiet + Suppress non-essential output + + --force + Re-import even if the release SHA-256 has already been seen + + -v, --verbose... + Increase verbosity (-v, -vv) + + --offline + Run without network requests + + --no-cache + Bypass local cache + + -h, --help + Print help (see a summary with '-h') + +Examples: + idx ownership import --url + idx ownership import --file /path/to/peng-2026-08-00017-satu-persen.xlsx + idx ownership import --file /path/to/ksei.pdf + idx ownership import --file /path/to/BalanceposEfek20260227.zip +``` + +### `idx ownership sync` + +```text +Install or refresh a maintained ownership SQLite snapshot. + +This is the normal bootstrap/update path for ownership data. + +Manifest lookup order: + 1. `--manifest` + 2. `IDX_OWNERSHIP_SNAPSHOT_MANIFEST` + 3. `ownership.snapshot_manifest` in config + +Usage: idx ownership sync [OPTIONS] + +Options: + --manifest + Snapshot manifest location (URL or local path). If omitted, idx falls back through env/config and then the published default URL + + -o, --output + Output format [default: auto = table on a terminal, json when piped] + + [possible values: auto, table, json, jsonl] + + --force + Replace the local DB even when it is already current or newer than the snapshot + + --no-color + Disable colored output + + -q, --quiet + Suppress non-essential output + + -v, --verbose... + Increase verbosity (-v, -vv) + + --offline + Run without network requests + + --no-cache + Bypass local cache + + -h, --help + Print help (see a summary with '-h') + +Examples: + idx ownership sync + idx ownership sync --manifest /path/to/ownership-snapshot-manifest.json + IDX_OWNERSHIP_SNAPSHOT_MANIFEST=https://example.com/latest.json idx ownership sync + +If none of the above are set, `ownership sync` falls back to the built-in published manifest URL. +``` + +### `idx ownership ticker` + +```text +Show all holders for a ticker (KSEI + Bing combined) + +Usage: idx ownership ticker [OPTIONS] + +Arguments: + + +Options: + -o, --output Output format [default: auto = table on a terminal, json when piped] [possible values: auto, table, json, jsonl] + --source [default: all] + --no-color Disable colored output + -q, --quiet Suppress non-essential output + -v, --verbose... Increase verbosity (-v, -vv) + --offline Run without network requests + --no-cache Bypass local cache + -h, --help Print help +``` + +### `idx ownership entity` + +```text +Show all holdings for an entity across tickers + +Usage: idx ownership entity [OPTIONS] + +Arguments: + + +Options: + -o, --output Output format [default: auto = table on a terminal, json when piped] [possible values: auto, table, json, jsonl] + --no-color Disable colored output + -q, --quiet Suppress non-essential output + -v, --verbose... Increase verbosity (-v, -vv) + --offline Run without network requests + --no-cache Bypass local cache + -h, --help Print help +``` + +### `idx ownership search` + +```text +Search entities by name + +Usage: idx ownership search [OPTIONS] + +Arguments: + + +Options: + --limit [default: 20] + -o, --output Output format [default: auto = table on a terminal, json when piped] [possible values: auto, table, json, jsonl] + --no-color Disable colored output + -q, --quiet Suppress non-essential output + -v, --verbose... Increase verbosity (-v, -vv) + --offline Run without network requests + --no-cache Bypass local cache + -h, --help Print help +``` + +### `idx ownership cross-holders` + +```text +Rank entities by cross-ownership breadth + +Usage: idx ownership cross-holders [OPTIONS] + +Options: + -o, --output Output format [default: auto = table on a terminal, json when piped] [possible values: auto, table, json, jsonl] + --top [default: 20] + --min-tickers [default: 2] + --no-color Disable colored output + -q, --quiet Suppress non-essential output + -v, --verbose... Increase verbosity (-v, -vv) + --offline Run without network requests + --no-cache Bypass local cache + -h, --help Print help +``` + +### `idx ownership concentration` + +```text +Rank tickers by ownership concentration + +Usage: idx ownership concentration [OPTIONS] + +Options: + --by [default: hhi] + -o, --output Output format [default: auto = table on a terminal, json when piped] [possible values: auto, table, json, jsonl] + --no-color Disable colored output + --top [default: 20] + -q, --quiet Suppress non-essential output + -v, --verbose... Increase verbosity (-v, -vv) + --offline Run without network requests + --no-cache Bypass local cache + -h, --help Print help +``` + +### `idx ownership flow` + +```text +Show Bing institutional flow for a ticker + +Usage: idx ownership flow [OPTIONS] + +Arguments: + + +Options: + -o, --output Output format [default: auto = table on a terminal, json when piped] [possible values: auto, table, json, jsonl] + --no-color Disable colored output + -q, --quiet Suppress non-essential output + -v, --verbose... Increase verbosity (-v, -vv) + --offline Run without network requests + --no-cache Bypass local cache + -h, --help Print help +``` + +### `idx ownership changes` + +```text +Diff two KSEI releases + +Usage: idx ownership changes [OPTIONS] --from --to + +Options: + --from + -o, --output Output format [default: auto = table on a terminal, json when piped] [possible values: auto, table, json, jsonl] + --no-color Disable colored output + --to + -q, --quiet Suppress non-essential output + -v, --verbose... Increase verbosity (-v, -vv) + --offline Run without network requests + --no-cache Bypass local cache + -h, --help Print help +``` + +### `idx ownership graph` + +```text +Ownership network graph + +Usage: idx ownership graph [OPTIONS] + +Arguments: + Ticker code or entity name to start from + +Options: + --depth Traversal depth (default 2) [default: 2] + -o, --output Output format [default: auto = table on a terminal, json when piped] [possible values: auto, table, json, jsonl] + --format Output format: table or dot (Graphviz) [default: table] + --no-color Disable colored output + -q, --quiet Suppress non-essential output + -v, --verbose... Increase verbosity (-v, -vv) + --offline Run without network requests + --no-cache Bypass local cache + -h, --help Print help +``` + +### `idx ownership resolve` + +```text +Manual entity resolution workflow + +Usage: idx ownership resolve [OPTIONS] + +Commands: + unresolved List unresolved or low-confidence entity aliases + map Manually map a raw investor name to a canonical entity name + merge Merge two entities (keep first, merge second into it) + help Print this message or the help of the given subcommand(s) + +Options: + -o, --output Output format [default: auto = table on a terminal, json when piped] [possible values: auto, table, json, jsonl] + --no-color Disable colored output + -q, --quiet Suppress non-essential output + -v, --verbose... Increase verbosity (-v, -vv) + --offline Run without network requests + --no-cache Bypass local cache + -h, --help Print help +``` + +#### `idx ownership resolve unresolved` + +```text +List unresolved or low-confidence entity aliases + +Usage: idx ownership resolve unresolved [OPTIONS] + +Options: + --limit [default: 50] + -o, --output Output format [default: auto = table on a terminal, json when piped] [possible values: auto, table, json, jsonl] + --no-color Disable colored output + -q, --quiet Suppress non-essential output + -v, --verbose... Increase verbosity (-v, -vv) + --offline Run without network requests + --no-cache Bypass local cache + -h, --help Print help +``` + +#### `idx ownership resolve map` + +```text +Manually map a raw investor name to a canonical entity name + +Usage: idx ownership resolve map [OPTIONS] + +Arguments: + The raw name as it appears in the data + The canonical entity name to map to + +Options: + -o, --output Output format [default: auto = table on a terminal, json when piped] [possible values: auto, table, json, jsonl] + --no-color Disable colored output + -q, --quiet Suppress non-essential output + -v, --verbose... Increase verbosity (-v, -vv) + --offline Run without network requests + --no-cache Bypass local cache + -h, --help Print help +``` + +#### `idx ownership resolve merge` + +```text +Merge two entities (keep first, merge second into it) + +Usage: idx ownership resolve merge [OPTIONS] + +Arguments: + Entity ID to keep + Entity ID to merge and delete + +Options: + -o, --output Output format [default: auto = table on a terminal, json when piped] [possible values: auto, table, json, jsonl] + --no-color Disable colored output + -q, --quiet Suppress non-essential output + -v, --verbose... Increase verbosity (-v, -vv) + --offline Run without network requests + --no-cache Bypass local cache + -h, --help Print help +``` + +### `idx ownership releases` + +```text +List imported KSEI releases + +Usage: idx ownership releases [OPTIONS] + +Options: + -o, --output Output format [default: auto = table on a terminal, json when piped] [possible values: auto, table, json, jsonl] + --no-color Disable colored output + -q, --quiet Suppress non-essential output + -v, --verbose... Increase verbosity (-v, -vv) + --offline Run without network requests + --no-cache Bypass local cache + -h, --help Print help +``` + +## `idx completions` + +```text +Generate shell completions + +Usage: idx completions [OPTIONS] + +Arguments: + [possible values: bash, zsh, fish] + +Options: + -o, --output Output format [default: auto = table on a terminal, json when piped] [possible values: auto, table, json, jsonl] + --no-color Disable colored output + -q, --quiet Suppress non-essential output + -v, --verbose... Increase verbosity (-v, -vv) + --offline Run without network requests + --no-cache Bypass local cache + -h, --help Print help +``` + +## `idx version` + +```text +Show idx-cli version + +Usage: idx version [OPTIONS] + +Options: + -o, --output Output format [default: auto = table on a terminal, json when piped] [possible values: auto, table, json, jsonl] + --no-color Disable colored output + -q, --quiet Suppress non-essential output + -v, --verbose... Increase verbosity (-v, -vv) + --offline Run without network requests + --no-cache Bypass local cache + -h, --help Print help +``` diff --git a/web/src/content/docs/cli/stocks.md b/web/src/content/docs/cli/stocks.md new file mode 100644 index 0000000..88c2b8c --- /dev/null +++ b/web/src/content/docs/cli/stocks.md @@ -0,0 +1,67 @@ +--- +title: Stocks +description: Quotes, history, company data, analysis and screening. +--- + +All `stocks` commands take IDX tickers (`BBCA`, or `BBCA.JK`). Every flag is +listed in the [command reference](/cli/reference/). + +## Quotes and history + +```bash +idx stocks quote BBCA BBRI,BMRI +idx stocks history BBCA --period 1y --interval 1wk +``` + +`quote` takes several tickers, separated by spaces or commas, or `-` to read +them from stdin. `history` takes `--period` (`1d` to `5y`) and `--interval` +(`1d`, `1wk`, `1mo`). + +## Company data + +| Command | What it shows | +| --- | --- | +| `profile` | sector, industry, description, contacts and officers | +| `financials` | income, balance sheet and cash flow statements (`--statement income,balance`) | +| `earnings` | reported and estimated earnings | +| `sentiment` | crowd sentiment | +| `insights` | AI insights from the provider | +| `news` | recent news | + +## Analysis + +| Command | What it computes | +| --- | --- | +| `technical` | trend, RSI, MACD, moving averages and signals | +| `growth` | revenue and earnings growth rating | +| `valuation` | P/E, P/B, ROE, net margin and EV/EBITDA, with a rating | +| `risk` | debt to equity, current ratio and ROA, with a rating | +| `fundamental` | growth, valuation and risk in one report | +| `compare` | `fundamental` for several tickers side by side | + +```bash +idx stocks fundamental BBRI +idx stocks compare BBCA BBRI BMRI +``` + +## Screening + +```bash +idx stocks screen --filter high-dividend --limit 20 +``` + +Filters: `top-performers` (default), `worst-performers`, `high-dividend`, +`low-pe`, `52w-high`, `52w-low`, `high-volume`, `large-cap`. + +Screen results pipe straight into `compare`: + +```bash +idx stocks screen --filter high-dividend | jq -r '.[].symbol' | idx stocks compare - +``` + +## Providers + +MSN is the default for quotes, company data and screening; Yahoo serves +price history. Switch with `IDX_PROVIDER=msn|yahoo` and +`IDX_HISTORY_PROVIDER=auto|yahoo|msn`, or the matching +[config keys](/start/config/). diff --git a/web/src/content/docs/mcp/index.md b/web/src/content/docs/mcp/index.md new file mode 100644 index 0000000..4ce67e2 --- /dev/null +++ b/web/src/content/docs/mcp/index.md @@ -0,0 +1,56 @@ +--- +title: MCP server +description: idx-mcp serves idx's stock and ownership data to AI agents over MCP. +--- + +`idx-mcp` is a [Model Context Protocol](https://modelcontextprotocol.io) +server over stdio. It gives an agent the same data as the `idx` CLI, as +[11 tools](/mcp/tools/): quotes, price history, screening, company data, +analysis, comparison, and the KSEI ownership queries. + +It shares idx's [config, cache and ownership database](/start/config/#files-idx-keeps), +so `idx ownership sync` in a terminal also feeds the server. + +[Set it up in your agent →](/mcp/setup/) + +## Results + +Tools that fetch live data return: + +```json +{ + "data": { "...": "the same shape as idx -o json" }, + "source": "msn", + "fetched_at": "2026-10-15T03:20:11Z", + "stale": false +} +``` + +`source` is the provider (`msn` or `yahoo`). Results are cached on disk; +`stale` is true when an expired cache entry was served because a fresh fetch +failed. Ownership tools return their data directly, from the local +database. + +Errors come back as a tool result with `isError` set and the CLI's error +body, so the agent can decide whether to retry: + +```json +{"error": true, "code": "PROVIDERUNAVAILABLE", "message": "..."} +``` + +## Limits + +| Input | Limit | +| --- | --- | +| tickers per call (`get_quotes`, `compare_stocks`) | 20, duplicates removed | +| `screen_stocks` `limit` | 200 | +| `search_investors` `limit` | 100 | +| `get_ownership_changes` `limit` | 2000 (default 200) | +| concurrent tool calls | 4 | + +## Ownership data + +Ownership tools need a populated database. Either run `idx ownership sync` +once, or start the server with `--allow-sync`, which adds an +`ownership_sync` tool so the agent can download the snapshot itself (several +MB). diff --git a/web/src/content/docs/mcp/setup.mdx b/web/src/content/docs/mcp/setup.mdx new file mode 100644 index 0000000..fbe0c85 --- /dev/null +++ b/web/src/content/docs/mcp/setup.mdx @@ -0,0 +1,142 @@ +--- +title: Set up idx-mcp +description: Add idx-mcp to Claude Code, Codex, Cursor, opencode, pi, Hermes or any MCP client. +sidebar: + label: Setup +--- + +import { Tabs, TabItem } from '@astrojs/starlight/components'; + +:::tip[Quickest: let your agent do it] +Paste this into your coding agent. It follows +[agents/install.md](/agents/install/): installs idx, registers idx-mcp with +itself, syncs ownership data and runs a test call. It asks before changing +global config. + +```text wrap +Install idx-cli and its MCP server for me by following https://idx.rasyidanaf.com/agents/install.md, then show me that it works. +``` +::: + +Or set it up yourself: + +## 1. Get the server + +Nothing to install if your client can run `npx`: the configs below use +`npx -y idx-mcp`. Otherwise install the binary once and use `idx-mcp` as the +command: + +```bash +cargo install idx-mcp # Rust 1.89+ +nix profile install github:0xrsydn/idx-cli#idx-mcp +``` + +## 2. Add it to your client + + + + +```bash +claude mcp add idx -- npx -y idx-mcp +``` + + + + +`~/.codex/config.toml`: + +```toml +[mcp_servers.idx] +command = "npx" +args = ["-y", "idx-mcp"] +``` + + + + +`~/.cursor/mcp.json` (or `.cursor/mcp.json` in a project): + +```json +{ + "mcpServers": { + "idx": { "command": "npx", "args": ["-y", "idx-mcp"] } + } +} +``` + + + + +`opencode.json` in a project, or `~/.config/opencode/opencode.json`: + +```json +{ + "$schema": "https://opencode.ai/config.json", + "mcp": { + "idx": { "type": "local", "command": ["npx", "-y", "idx-mcp"], "enabled": true } + } +} +``` + + + + +`~/.pi/agent/mcp.json`: + +```json +{ + "mcpServers": { + "idx": { "command": "npx", "args": ["-y", "idx-mcp"], "exposure": "direct" } + } +} +``` + +`"exposure": "direct"` gives the agent each tool by name. + + + + +`~/.hermes/config.yaml`: + +```yaml +mcp_servers: + idx: + command: npx + args: ["-y", "idx-mcp"] + enabled: true +``` + + + + +Any MCP client that runs stdio servers: command `npx`, arguments +`-y idx-mcp` (or the command `idx-mcp` if installed). Add `--allow-sync` to +the arguments to expose `ownership_sync`. + + + + +These are the setups that `tests/agents/agent-smoke.sh` drives with real +agents. + +## 3. Get ownership data + +Ownership tools read a local database. Fill it once: + +```bash +npx -y idx-cli ownership sync # or: idx ownership sync +``` + +Or start the server with `--allow-sync` so the agent can call +`ownership_sync` itself. + +## 4. Check it works + +Ask your agent: + +> What is BBCA's free float, and who is its largest holder? + +It should call `get_shareholders` and answer with the free float and +DWIMURIA INVESTAMA ANDALAN, the largest holder. + +See [all tools](/mcp/tools/). diff --git a/web/src/content/docs/mcp/tools.md b/web/src/content/docs/mcp/tools.md new file mode 100644 index 0000000..6d85ce7 --- /dev/null +++ b/web/src/content/docs/mcp/tools.md @@ -0,0 +1,115 @@ +--- +title: Tools +description: Every idx-mcp tool and its inputs, generated from the server's tool list. +--- + + + +idx-mcp serves these tools. `ownership_sync` is listed only when the server +starts with `--allow-sync`. Results that come from a live provider are wrapped +as `{data, source, fetched_at, stale}`; failures return `{error, code, +message}` with `isError` set. + +## `analyze_stock` + +Analyze one IDX ticker: technical signals (trend, RSI, MACD, moving averages) and fundamental growth, valuation, and risk ratings. Analyses that fail are listed under `errors`; the call fails only if every analysis fails. + +| Input | Type | Required | Description | +| --- | --- | --- | --- | +| `kinds` | array of `technical` / `growth` / `valuation` / `risk` | no | Analyses to run (default: all). | +| `symbol` | string | yes | IDX ticker, e.g. "BBCA". | + +## `compare_stocks` + +Compare fundamental reports (growth, valuation, risk) across IDX tickers. Tickers that fail are listed under `failures`. + +| Input | Type | Required | Description | +| --- | --- | --- | --- | +| `symbols` | array of string | yes | IDX tickers, e.g. ["BBCA", "BBRI"]; the `.JK` suffix is optional. At most 20. | + +## `get_company` + +Company data for one IDX ticker: profile, financial statements, earnings, analyst sentiment, insights, and news. Sections that fail are listed under `errors`; the call fails only if every section fails. + +| Input | Type | Required | Description | +| --- | --- | --- | --- | +| `sections` | array of `profile` / `financials` / `earnings` / `sentiment` / `insights` / `news` | no | Sections to fetch (default: all). | +| `symbol` | string | yes | IDX ticker, e.g. "BBCA". | + +## `get_investor_holdings` + +Every IDX holding (above 1%) of one investor, matched by name. + +| Input | Type | Required | Description | +| --- | --- | --- | --- | +| `entity` | string | yes | Investor name or part of it, e.g. "DWIMURIA"; the closest match is used. | + +## `get_ownership_changes` + +Holder changes (new, exit, increase, decrease) between two KSEI release dates, optionally for one ticker. + +| Input | Type | Required | Description | +| --- | --- | --- | --- | +| `from` | string | yes | Earlier release date, YYYY-MM-DD (see ownership_status). | +| `limit` | integer | no | Maximum rows returned (default 200, at most 2000); `total` reports the full count. | +| `ticker` | string | no | Only this ticker's changes. | +| `to` | string | yes | Later release date, YYYY-MM-DD. | + +## `get_price_history` + +OHLCV price history for one IDX ticker. + +| Input | Type | Required | Description | +| --- | --- | --- | --- | +| `interval` | `1d` / `1wk` / `1mo` | no | Candle size (default "1d"). | +| `period` | `1d` / `5d` / `1mo` / `3mo` / `6mo` / `1y` / `2y` / `5y` | no | Lookback window (default "3mo"). | +| `symbol` | string | yes | IDX ticker, e.g. "BBCA". | + +## `get_quotes` + +Latest quotes (price, change, volume, 52-week range, market cap) for one or more IDX tickers. + +| Input | Type | Required | Description | +| --- | --- | --- | --- | +| `symbols` | array of string | yes | IDX tickers, e.g. ["BBCA", "BBRI"]; the `.JK` suffix is optional. At most 20. | + +## `get_shareholders` + +Shareholders above 1% of an IDX ticker from the latest KSEI release, with concentration metrics (top1, top3, HHI, free float). + +| Input | Type | Required | Description | +| --- | --- | --- | --- | +| `ticker` | string | yes | IDX ticker, e.g. "BBCA". | + +## `ownership_status` + +Ownership database status: whether it has data, and the imported KSEI release dates. + +No inputs. + +## `ownership_sync` + +Download or refresh the KSEI ownership snapshot (several MB) into the local database. + +| Input | Type | Required | Description | +| --- | --- | --- | --- | +| `force` | boolean | no | Re-download even when the local snapshot is current. | + +## `screen_stocks` + +Run a stock screen (top/worst performers, high dividend, low P/E, 52-week highs/lows, high volume, large cap). + +| Input | Type | Required | Description | +| --- | --- | --- | --- | +| `filter` | `top-performers` / `worst-performers` / `high-dividend` / `low-pe` / `52w-high` / `52w-low` / `high-volume` / `large-cap` | no | Screen to run (default "top-performers"). | +| `limit` | integer | no | Maximum results (default 50, at most 200). | +| `region` | `id` / `us` / `sg` / `hk` / `jp` | no | Market region (default "id"). | + +## `search_investors` + +Search investor names in the KSEI ownership database. + +| Input | Type | Required | Description | +| --- | --- | --- | --- | +| `limit` | integer | no | Maximum results (default 20, at most 100). | +| `query` | string | yes | Full-text query over investor names. | diff --git a/web/src/content/docs/start/config.md b/web/src/content/docs/start/config.md new file mode 100644 index 0000000..2595074 --- /dev/null +++ b/web/src/content/docs/start/config.md @@ -0,0 +1,75 @@ +--- +title: Configuration +description: Config file, environment variables and their precedence. +--- + +idx works without configuration. To change defaults, use the config file, +environment variables or flags. When they disagree, the first one wins: + +1. command-line flags +2. environment variables +3. the config file +4. built-in defaults + +## Config file + +`~/.config/idx/config.toml` (or `$XDG_CONFIG_HOME/idx/config.toml`): + +```bash +idx config init # write the defaults below +idx config set general.output json +idx config get cache.quote_ttl +idx config path +``` + +```toml +[general] +provider = "msn" # msn | yahoo +history_provider = "auto" # auto | yahoo | msn +exchange = "JK" +output = "auto" # auto | table | json | jsonl +color = true + +[cache] +quote_ttl = 300 # seconds +fundamental_ttl = 3600 + +[ownership] +# db_path = "/path/to/ownership.db" +# snapshot_manifest = "https://..." +``` + +## Environment variables + +| Variable | Overrides | +| --- | --- | +| `IDX_PROVIDER` | `general.provider` | +| `IDX_HISTORY_PROVIDER` | `general.history_provider` | +| `IDX_EXCHANGE` | `general.exchange` | +| `IDX_OUTPUT` | `general.output` | +| `IDX_NO_COLOR` | `general.color` (`1` or `true` disables colour) | +| `IDX_CACHE_QUOTE_TTL` | `cache.quote_ttl` | +| `IDX_CACHE_FUNDAMENTAL_TTL` | `cache.fundamental_ttl` | +| `IDX_OWNERSHIP_SNAPSHOT_MANIFEST` | `ownership.snapshot_manifest` | +| `IDX_CURL_IMPERSONATE_BIN` | path to a `curl_chrome*` binary | + +## Files idx keeps + +| What | Where | +| --- | --- | +| Config | `~/.config/idx/config.toml` | +| Cache | `~/.cache/idx/` (`idx cache info`, `idx cache clear`) | +| Ownership database | `~/.local/share/idx/ownership.db` | + +The MCP server reads the same config, cache and database. + +## Offline and caching + +Quotes are cached for `quote_ttl` seconds and fundamentals for +`fundamental_ttl`. `--offline` makes no network requests and serves cached +data, even when stale; `--no-cache` always fetches. + +:::note +A config created by `idx config init` before v0.3 pins `output = "table"`. +Run `idx config set general.output auto` to get JSON when piped. +::: diff --git a/web/src/content/docs/start/install.mdx b/web/src/content/docs/start/install.mdx new file mode 100644 index 0000000..6c3dfa4 --- /dev/null +++ b/web/src/content/docs/start/install.mdx @@ -0,0 +1,98 @@ +--- +title: Install +description: Install idx with npm, the install script, Cargo or Nix. +--- + +import { Tabs, TabItem } from '@astrojs/starlight/components'; + +Prebuilt binaries cover Linux x64/arm64 (static) and macOS arm64/x64. On +Windows, use WSL. + +:::tip[Let your agent do it] +Paste this into Claude Code, Codex, Cursor or another coding agent: + +```text wrap +Install idx-cli and its MCP server for me by following https://idx.rasyidanaf.com/agents/install.md, then show me that it works. +``` +::: + + + + +```bash +npm install --global idx-cli +npx idx-cli --help # or run without installing +``` + +The package downloads the checksum-verified release binary during +`postinstall`. pnpm 10+ and bun skip install scripts by default; allow them +with `pnpm add --global --allow-build=idx-cli idx-cli` or +`bun add --global --trust idx-cli`. + + + + +```bash +curl -fsSL https://raw.githubusercontent.com/0xrsydn/idx-cli/main/install.sh | sh +``` + +Downloads the binary for your platform from GitHub Releases, verifies it +against the release `SHA256SUMS`, and installs it into `~/.local/bin` without +sudo. Pin a version or change the directory: + +```bash +curl -fsSL https://raw.githubusercontent.com/0xrsydn/idx-cli/main/install.sh | sh -s -- --version v0.3.1 --dir ~/bin +``` + + + + +```bash +cargo install idx-cli +``` + +Builds from source. Requires Rust 1.89 or newer. + + + + +```bash +nix profile install github:0xrsydn/idx-cli +nix run github:0xrsydn/idx-cli -- version # or run without installing +``` + +The Nix package bundles the helper tools below. + + + + +Check it works: + +```bash +idx version +``` + +## Helper tools + +Everyday use needs nothing else: stock data with the default MSN provider, +price history, `ownership sync` and every local ownership query. A few +commands call external tools: + +| Tool | Needed for | +| --- | --- | +| `curl_chrome*` from [curl-impersonate](https://github.com/lexiforest/curl-impersonate), or `IDX_CURL_IMPERSONATE_BIN` | `ownership discover` and `ownership import --url` (IDX sits behind Cloudflare), and Yahoo fundamentals with `IDX_PROVIDER=yahoo` | +| `mutool` from MuPDF | importing legacy PDF ownership reports | + +## The MCP server + +`idx-mcp` installs the same ways (`npx -y idx-mcp`, `cargo install idx-mcp`, +or `nix profile install github:0xrsydn/idx-cli#idx-mcp`). See +[MCP setup](/mcp/setup/). + +## Shell completions + +```bash +idx completions bash > ~/.local/share/bash-completion/completions/idx +idx completions zsh > "${fpath[1]}/_idx" +idx completions fish > ~/.config/fish/completions/idx.fish +``` diff --git a/web/src/content/docs/start/quickstart.md b/web/src/content/docs/start/quickstart.md new file mode 100644 index 0000000..9314e4f --- /dev/null +++ b/web/src/content/docs/start/quickstart.md @@ -0,0 +1,50 @@ +--- +title: Quickstart +description: First stock and ownership commands. +--- + +## Stocks + +Tickers are IDX codes; the `.JK` suffix is optional. + +```bash +idx stocks quote BBCA # one quote +idx stocks quote BBCA BBRI BMRI # several (spaces or commas) +idx stocks history BBCA --period 1y # daily OHLCV +idx stocks technical BBCA # trend, RSI, MACD, moving averages +idx stocks fundamental BBCA # growth, valuation and risk together +idx stocks compare BBCA BBRI BMRI # fundamentals side by side +idx stocks screen --filter high-dividend +``` + +## Ownership + +Ownership data comes from the monthly KSEI register of holders above 1%. +Download the maintained snapshot once; after that every query runs offline. + +```bash +idx ownership sync # a few MB, safe to rerun +idx ownership ticker BBCA # who holds BBCA +idx ownership entity "ANTHONI SALIM" # everything one investor holds +idx ownership search salim # find investor names +idx ownership releases # which months you have +idx ownership changes --from 2026-08-31 --to 2026-09-30 +``` + +## JSON + +In a terminal idx prints tables. When its output is piped or captured it +prints JSON, so scripts and agents need no flag: + +```bash +idx stocks quote BBCA BBRI | jq -r '.[] | "\(.symbol) \(.price)"' +idx -o json stocks quote BBCA # force JSON in a terminal +``` + +See [Output and exit codes](/cli/output/) for the full contract. + +## Next + +- [Stocks guide](/cli/stocks/) and [ownership guide](/cli/ownership/) +- [Configuration](/start/config/) +- [Use idx from an AI agent](/mcp/setup/) diff --git a/web/src/pages/[...slug].md.ts b/web/src/pages/[...slug].md.ts new file mode 100644 index 0000000..cdcfe20 --- /dev/null +++ b/web/src/pages/[...slug].md.ts @@ -0,0 +1,15 @@ +// Serves every docs page as raw Markdown at `.md`, so agents can read +// the docs without HTML (for example /agents/install.md). +import type { APIRoute, GetStaticPaths } from 'astro'; +import { getCollection } from 'astro:content'; + +export const getStaticPaths: GetStaticPaths = async () => { + const docs = await getCollection('docs'); + return docs.map((entry) => ({ params: { slug: entry.id }, props: { entry } })); +}; + +export const GET: APIRoute = ({ props }) => { + const { entry } = props; + const body = `# ${entry.data.title}\n\n${entry.body ?? ''}`.replace(/\n*/g, '').replace(/^import .*\n+/gm, ''); + return new Response(body, { headers: { 'Content-Type': 'text/markdown; charset=utf-8' } }); +}; diff --git a/web/src/pages/index.astro b/web/src/pages/index.astro new file mode 100644 index 0000000..1497228 --- /dev/null +++ b/web/src/pages/index.astro @@ -0,0 +1,427 @@ +--- +import '@fontsource/ibm-plex-sans/400.css'; +import '@fontsource/ibm-plex-sans/600.css'; +import '@fontsource/ibm-plex-sans/700.css'; +import '@fontsource/jetbrains-mono/400.css'; +import '@fontsource/jetbrains-mono/700.css'; + +const agentPrompt = + 'Install idx-cli and its MCP server for me by following https://idx.rasyidanaf.com/agents/install.md, then show me that it works.'; + +const installs = [ + { id: 'npm', label: 'npm', cmd: 'npm install -g idx-cli', note: 'Downloads the checksum-verified release binary. Or run once with npx idx-cli.' }, + { id: 'curl', label: 'curl', cmd: 'curl -fsSL https://raw.githubusercontent.com/0xrsydn/idx-cli/main/install.sh | sh', note: 'Linux and macOS. Installs to ~/.local/bin without sudo.' }, + { id: 'cargo', label: 'cargo', cmd: 'cargo install idx-cli', note: 'Builds from source. Requires Rust 1.89+.' }, + { id: 'nix', label: 'nix', cmd: 'nix profile install github:0xrsydn/idx-cli', note: 'Bundles curl-impersonate and MuPDF for the ownership importers.' }, + { id: 'agent', label: 'Ask your agent', cmd: agentPrompt, prompt: true, note: 'Paste into Claude Code, Codex, Cursor or any coding agent. It installs idx, registers idx-mcp with itself, and asks before changing global config.' }, +]; + +const agents = [ + { id: 'claude', label: 'Claude Code', file: 'terminal', code: 'claude mcp add idx -- npx -y idx-mcp' }, + { id: 'codex', label: 'Codex', file: '~/.codex/config.toml', code: '[mcp_servers.idx]\ncommand = "npx"\nargs = ["-y", "idx-mcp"]' }, + { id: 'cursor', label: 'Cursor', file: '~/.cursor/mcp.json', code: '{\n "mcpServers": {\n "idx": { "command": "npx", "args": ["-y", "idx-mcp"] }\n }\n}' }, + { id: 'opencode', label: 'opencode', file: 'opencode.json', code: '{\n "mcp": {\n "idx": { "type": "local", "command": ["npx", "-y", "idx-mcp"] }\n }\n}' }, + { id: 'pi', label: 'pi', file: '~/.pi/agent/mcp.json', code: '{\n "mcpServers": {\n "idx": { "command": "npx", "args": ["-y", "idx-mcp"], "exposure": "direct" }\n }\n}' }, + { id: 'hermes', label: 'Hermes', file: '~/.hermes/config.yaml', code: 'mcp_servers:\n idx:\n command: npx\n args: ["-y", "idx-mcp"]\n enabled: true' }, + { id: 'other', label: 'Other', file: 'any MCP client (stdio)', code: 'command: npx\nargs: -y idx-mcp\n# add --allow-sync to expose ownership_sync' }, +]; + +// Captured from `idx ownership ticker BBCA` on the 2026-09-30 snapshot. +const holders = [ + { name: 'DWIMURIA INVESTAMA ANDALAN', type: 'Corporate', shares: '67,729,950,000', pct: 54.94 }, + { name: 'ANTHONI SALIM', type: 'Individual', shares: '1,416,306,835', pct: 1.15 }, + { name: 'TRICIPTA MANDHALA GUMILANG', type: 'Corporate', shares: '1,313,250,000', pct: 1.07 }, + { name: 'CATURGUWIRATNA SUMAPALA', type: 'Corporate', shares: '1,261,750,000', pct: 1.02 }, +]; + +const copyIcon = + ''; +--- + + + + + + + idx: Indonesian stocks and ownership, in your terminal and your agent + + + + + + + + + + +
+ +
+ +
+
+
+
v0.3.1 · Rust · MIT
+

Indonesian stocks and ownership, in your terminal and your agent.

+

Quotes, fundamentals, technicals and KSEI shareholder data for every IDX stock. Tables for you, JSON for scripts, and an MCP server for AI agents.

+ +
+
+ {installs.map((t, i) => ( + + ))} +
+ {installs.map((t, i) => ( + + ))} +
+ + +
+ +
+
real data · 15 Oct 2026
+
$ idx stocks quote BBCA BBRI BMRI TLKM
+SYMBOL    PRICE   CHG%    VOLUME
+BBCA.JK   6,125   +2.94%  136,303,100
+BBRI.JK   3,090   +0.32%  109,152,100
+BMRI.JK   3,960   -0.75%  106,870,300
+TLKM.JK   2,250   +0.45%   87,159,900
+
+$ idx stocks quote BBCA | jq -c '.[0] | {symbol, price, change_pct}'
+{"symbol":"BBCA.JK","price":6125,"change_pct":2.9412}
+
+$ idx ownership ticker BBCA
+Ownership: BBCA  KSEI=2026-09-30
+  1  DWIMURIA INVESTAMA ANDALAN  54.94%
+  2  ANTHONI SALIM                1.15%
+  3  TRICIPTA MANDHALA GUMILANG   1.07%
+Concentration: top1=54.94%  free_float=41.82%
+
+
+ +
+
+
+ +

Stocks

+

Quotes, OHLC history, financial statements and a screener. Technical, growth, valuation and risk analysis, and side-by-side compare.

+ idx stocks fundamental BBRI +
+
+ +

Ownership

+

Who holds more than 1% of every listed company, from the monthly KSEI register. Month-over-month changes, entity search, cross-holdings. Sync once, query offline.

+ idx ownership entity "ANTHONI SALIM" +
+
+ +

Agents

+

JSON whenever output is piped, errors as one JSON object, meaningful exit codes. Plus idx-mcp: 11 tools for any MCP client.

+ npx -y idx-mcp +
+
+
+ +
+
+

Add idx to your agent

+

idx-mcp serves the same data over stdio. Each setup below is the one our agent smoke test runs against real agents.

+
+
Ask it
+
"Who are BBCA's largest holders, and what changed last month?"
+
get_shareholdersget_ownership_changes
+
+
+
Or let your agent set it up
+
+ {agentPrompt} +
+
+ See all 11 tools → +
+ +
+
+ {agents.map((a, i) => ( + + ))} +
+ {agents.map((a, i) => ( + + ))} +

Ownership tools need data: run idx ownership sync once, or start the server with --allow-sync. Full setup guide

+
+
+ +
+
+
+

Who owns BBCA?

+ KSEI register, holders above 1% · as of 30 Sep 2026 +
+
+ + + + {holders.map((h, i) => ( + + + + + + + + ))} + +
#InvestorTypeSharesStake
{i + 1}{h.name}{h.type}{h.shares}
{h.pct.toFixed(2)}%
+
+
+
Top holder54.94%
+
Top 357.16%
+
Free float (below 1%)41.82%
+
HHI3,021
+
+

Rendered from idx ownership ticker BBCA. The snapshot is rebuilt when IDX publishes a new month.

+
+
+ +
+
+

Built for pipes

+

stdout carries only data. Errors go to stderr as one JSON object, with exit codes an agent can act on.

+
+
2
invalid input or config
+
3
not found, or no cached data offline
+
4
upstream unavailable, retry later
+
5
unsupported
+
+
+
+
# screen, then compare the hits
+idx stocks screen --filter high-dividend \
+  | jq -r '.[].symbol' \
+  | idx stocks compare -
+
+# a year of daily closes, one JSON object per line
+idx -o jsonl stocks history BBCA --period 1y | tail -5
+
+# bad input fails fast, as JSON on stderr
+idx stocks quote ../x
+{"error":true,"code":"INVALIDINPUT","message":"invalid input: invalid ticker symbol '../x'"}
+exit 2
+
+
+
+ + + + + + + + diff --git a/web/src/styles/theme.css b/web/src/styles/theme.css new file mode 100644 index 0000000..94dfab6 --- /dev/null +++ b/web/src/styles/theme.css @@ -0,0 +1,42 @@ +/* idx theme: neutral greys, one red accent (Indonesian flag red), Plex + JetBrains Mono. */ +:root { + --sl-font: 'IBM Plex Sans', system-ui, sans-serif; + --sl-font-mono: 'JetBrains Mono', ui-monospace, monospace; + --sl-color-accent-low: #2a0a0e; + --sl-color-accent: #ce1126; + --sl-color-accent-high: #ff8a8d; + /* Starlight's "tip" aside uses purple; keep it on the accent. */ + --sl-color-purple-low: #2a1216; + --sl-color-purple: #ff6b6f; + --sl-color-purple-high: #ffd6d7; + --sl-color-white: #ffffff; + --sl-color-gray-1: #e8eaed; + --sl-color-gray-2: #c3c8cf; + --sl-color-gray-3: #9aa1ab; + --sl-color-gray-4: #5f6670; + --sl-color-gray-5: #2c3036; + --sl-color-gray-6: #16181c; + --sl-color-black: #0d0e10; +} + +:root[data-theme='light'] { + --sl-color-accent-low: #fde3e4; + --sl-color-accent: #b30f21; + --sl-color-accent-high: #6e0a15; + --sl-color-purple-low: #fde3e4; + --sl-color-purple: #b30f21; + --sl-color-purple-high: #6e0a15; + --sl-color-white: #0d0e10; + --sl-color-gray-1: #16181c; + --sl-color-gray-2: #2c3036; + --sl-color-gray-3: #4b525c; + --sl-color-gray-4: #7c838d; + --sl-color-gray-5: #c9ced5; + --sl-color-gray-6: #eef0f2; + --sl-color-gray-7: #f7f8f9; + --sl-color-black: #ffffff; +} + +.sl-markdown-content code:not(:where(.not-content *)) { + font-size: 0.875em; +} diff --git a/web/tsconfig.json b/web/tsconfig.json new file mode 100644 index 0000000..8bf91d3 --- /dev/null +++ b/web/tsconfig.json @@ -0,0 +1,5 @@ +{ + "extends": "astro/tsconfigs/strict", + "include": [".astro/types.d.ts", "**/*"], + "exclude": ["dist"] +} From 3623c5095354744d412246f5b4f9a44f6fec8e6d Mon Sep 17 00:00:00 2001 From: hermes Date: Thu, 15 Oct 2026 05:29:02 +0000 Subject: [PATCH 4/5] fix(web): address PR review (clean .md output, one MCP config source) - .md output rewrites MDX-only syntax (Tabs, TabItem, asides, the MCP client component) into plain Markdown. - MCP client setups live in one data file used by the landing page, the setup page and agents/install; the smoke-test claim names the five agents agent-smoke.sh actually drives (not Cursor). - The landing page reads the version from Cargo.toml; the hand-copied BBCA data stays dated, and the design doc no longer promises capture.sh. - MCP overview counts 11 tools plus the opt-in ownership_sync. Co-Authored-By: Claude Opus 5.5 --- web/DESIGN.md | 4 +- web/src/components/McpClientTabs.astro | 15 ++++ .../docs/agents/{install.md => install.mdx} | 22 ++--- web/src/content/docs/mcp/index.md | 2 +- web/src/content/docs/mcp/setup.mdx | 89 +------------------ web/src/data/mcp-clients.ts | 32 +++++++ web/src/pages/[...slug].md.ts | 30 ++++++- web/src/pages/index.astro | 24 +++-- 8 files changed, 99 insertions(+), 119 deletions(-) create mode 100644 web/src/components/McpClientTabs.astro rename web/src/content/docs/agents/{install.md => install.mdx} (71%) create mode 100644 web/src/data/mcp-clients.ts diff --git a/web/DESIGN.md b/web/DESIGN.md index 80b5126..dc0f343 100644 --- a/web/DESIGN.md +++ b/web/DESIGN.md @@ -120,7 +120,7 @@ stack. | --- | --- | --- | | `/cli/reference` | `idx --help` per command | a script runs the built binary and writes Markdown | | `/mcp/tools` | `crates/idx-mcp/tests/golden/tools.json` | rendered at build time from the golden | -| Terminal panels | real `idx` runs | `web/scripts/capture.sh` saves output with a date; refreshed by hand | +| Terminal panels, BBCA table | real `idx` runs | copied by hand and labelled with their date; refresh after a new month | | Install, guides | hand-written | reviewed when the README changes | The README shrinks to a pitch, one install line per channel, and a link to the @@ -167,7 +167,7 @@ lives: - **Hermes:** `config.yaml`, `mcp_servers.idx`. - **Other:** the `idx-mcp` command over stdio. -These configs are the ones `tests/agents/agent-smoke.sh` already runs, so the +The Claude Code, Codex, opencode, pi and Hermes configs are the ones `tests/agents/agent-smoke.sh` already runs, so the site can link that script as proof they work. ## Stack diff --git a/web/src/components/McpClientTabs.astro b/web/src/components/McpClientTabs.astro new file mode 100644 index 0000000..208a70e --- /dev/null +++ b/web/src/components/McpClientTabs.astro @@ -0,0 +1,15 @@ +--- +import { Code, TabItem, Tabs } from '@astrojs/starlight/components'; +import { mcpClients } from '../data/mcp-clients'; +--- + + + { + mcpClients.map((c) => ( + +

{/[~/]/.test(c.file) ? {c.file} : c.file}

+ +
+ )) + } +
diff --git a/web/src/content/docs/agents/install.md b/web/src/content/docs/agents/install.mdx similarity index 71% rename from web/src/content/docs/agents/install.md rename to web/src/content/docs/agents/install.mdx index 2024269..83e40a1 100644 --- a/web/src/content/docs/agents/install.md +++ b/web/src/content/docs/agents/install.mdx @@ -3,6 +3,8 @@ title: Agent-led install description: Instructions for a coding agent to install idx and register idx-mcp with itself. --- +import McpClientTabs from '../../../components/McpClientTabs.astro'; + This page is written for a coding agent. A user sent you here to install **idx** (a CLI for Indonesian stock market and KSEI ownership data) and register its MCP server, **idx-mcp**, with the agent harness you are running @@ -44,22 +46,14 @@ Confirm with `idx version` (or `npx -y idx-cli version`). ## 3. Register idx-mcp with yourself -Work out which harness you are, then apply its setup. Use `npx` and -`["-y", "idx-mcp"]` as command and arguments, or `idx-mcp` with no arguments -if you installed the binary. +Work out which harness you are, then apply its setup below. If you installed +the `idx-mcp` binary instead of using Node.js, use the command `idx-mcp` with +no arguments in place of `npx -y idx-mcp`. For any other harness, find how it +registers a stdio MCP server, and ask the user if unsure. -| Harness | How | -| --- | --- | -| Claude Code | run `claude mcp add idx -- npx -y idx-mcp` | -| Codex | add to `~/.codex/config.toml`: `[mcp_servers.idx]` with `command = "npx"`, `args = ["-y", "idx-mcp"]` | -| Cursor | add to `~/.cursor/mcp.json` under `mcpServers`: `"idx": {"command": "npx", "args": ["-y", "idx-mcp"]}` | -| opencode | add to `~/.config/opencode/opencode.json` under `mcp`: `"idx": {"type": "local", "command": ["npx", "-y", "idx-mcp"], "enabled": true}` | -| pi | add to `~/.pi/agent/mcp.json` under `mcpServers`: `"idx": {"command": "npx", "args": ["-y", "idx-mcp"], "exposure": "direct"}` | -| Hermes | add to `~/.hermes/config.yaml` under `mcp_servers`: `idx` with `command: npx`, `args: ["-y", "idx-mcp"]`, `enabled: true` | -| anything else | find how your harness registers a stdio MCP server, and ask the user if unsure | + -Merge into existing files; never overwrite other servers or settings. Full -examples: [MCP setup](/mcp/setup/). +Merge into existing files; never overwrite other servers or settings. ## 4. Download ownership data diff --git a/web/src/content/docs/mcp/index.md b/web/src/content/docs/mcp/index.md index 4ce67e2..d34a6e7 100644 --- a/web/src/content/docs/mcp/index.md +++ b/web/src/content/docs/mcp/index.md @@ -5,7 +5,7 @@ description: idx-mcp serves idx's stock and ownership data to AI agents over MCP `idx-mcp` is a [Model Context Protocol](https://modelcontextprotocol.io) server over stdio. It gives an agent the same data as the `idx` CLI, as -[11 tools](/mcp/tools/): quotes, price history, screening, company data, +[11 tools](/mcp/tools/) (plus an opt-in `ownership_sync`): quotes, price history, screening, company data, analysis, comparison, and the KSEI ownership queries. It shares idx's [config, cache and ownership database](/start/config/#files-idx-keeps), diff --git a/web/src/content/docs/mcp/setup.mdx b/web/src/content/docs/mcp/setup.mdx index fbe0c85..a21fb63 100644 --- a/web/src/content/docs/mcp/setup.mdx +++ b/web/src/content/docs/mcp/setup.mdx @@ -5,7 +5,7 @@ sidebar: label: Setup --- -import { Tabs, TabItem } from '@astrojs/starlight/components'; +import McpClientTabs from '../../../components/McpClientTabs.astro'; :::tip[Quickest: let your agent do it] Paste this into your coding agent. It follows @@ -33,91 +33,10 @@ nix profile install github:0xrsydn/idx-cli#idx-mcp ## 2. Add it to your client - - + -```bash -claude mcp add idx -- npx -y idx-mcp -``` - - - - -`~/.codex/config.toml`: - -```toml -[mcp_servers.idx] -command = "npx" -args = ["-y", "idx-mcp"] -``` - - - - -`~/.cursor/mcp.json` (or `.cursor/mcp.json` in a project): - -```json -{ - "mcpServers": { - "idx": { "command": "npx", "args": ["-y", "idx-mcp"] } - } -} -``` - - - - -`opencode.json` in a project, or `~/.config/opencode/opencode.json`: - -```json -{ - "$schema": "https://opencode.ai/config.json", - "mcp": { - "idx": { "type": "local", "command": ["npx", "-y", "idx-mcp"], "enabled": true } - } -} -``` - - - - -`~/.pi/agent/mcp.json`: - -```json -{ - "mcpServers": { - "idx": { "command": "npx", "args": ["-y", "idx-mcp"], "exposure": "direct" } - } -} -``` - -`"exposure": "direct"` gives the agent each tool by name. - - - - -`~/.hermes/config.yaml`: - -```yaml -mcp_servers: - idx: - command: npx - args: ["-y", "idx-mcp"] - enabled: true -``` - - - - -Any MCP client that runs stdio servers: command `npx`, arguments -`-y idx-mcp` (or the command `idx-mcp` if installed). Add `--allow-sync` to -the arguments to expose `ownership_sync`. - - - - -These are the setups that `tests/agents/agent-smoke.sh` drives with real -agents. +The Claude Code, Codex, opencode, pi and Hermes setups are the ones +`tests/agents/agent-smoke.sh` drives with the real agents. ## 3. Get ownership data diff --git a/web/src/data/mcp-clients.ts b/web/src/data/mcp-clients.ts new file mode 100644 index 0000000..a76038b --- /dev/null +++ b/web/src/data/mcp-clients.ts @@ -0,0 +1,32 @@ +// The one list of MCP client setups, used by the landing page, the MCP setup +// page and agents/install.md (and their .md output). + +export interface McpClient { + id: string; + label: string; + /** Where the config goes, shown above the snippet. */ + file: string; + lang: string; + code: string; + /** Driven by tests/agents/agent-smoke.sh against the real agent. */ + smokeTested: boolean; +} + +export const mcpClients: McpClient[] = [ + { id: 'claude', label: 'Claude Code', file: 'Run in a terminal', lang: 'bash', smokeTested: true, code: 'claude mcp add idx -- npx -y idx-mcp' }, + { id: 'codex', label: 'Codex', file: '~/.codex/config.toml', lang: 'toml', smokeTested: true, code: '[mcp_servers.idx]\ncommand = "npx"\nargs = ["-y", "idx-mcp"]' }, + { id: 'cursor', label: 'Cursor', file: '~/.cursor/mcp.json (or .cursor/mcp.json in a project)', lang: 'json', smokeTested: false, code: '{\n "mcpServers": {\n "idx": { "command": "npx", "args": ["-y", "idx-mcp"] }\n }\n}' }, + { id: 'opencode', label: 'opencode', file: '~/.config/opencode/opencode.json (or opencode.json in a project)', lang: 'json', smokeTested: true, code: '{\n "$schema": "https://opencode.ai/config.json",\n "mcp": {\n "idx": { "type": "local", "command": ["npx", "-y", "idx-mcp"], "enabled": true }\n }\n}' }, + { id: 'pi', label: 'pi', file: '~/.pi/agent/mcp.json', lang: 'json', smokeTested: true, code: '{\n "mcpServers": {\n "idx": { "command": "npx", "args": ["-y", "idx-mcp"], "exposure": "direct" }\n }\n}' }, + { id: 'hermes', label: 'Hermes', file: '~/.hermes/config.yaml', lang: 'yaml', smokeTested: true, code: 'mcp_servers:\n idx:\n command: npx\n args: ["-y", "idx-mcp"]\n enabled: true' }, + { id: 'other', label: 'Other', file: 'Any MCP client that runs stdio servers', lang: 'text', smokeTested: false, code: 'command: npx\nargs: -y idx-mcp\n# or the command idx-mcp, if installed\n# add --allow-sync to expose ownership_sync' }, +]; + +export const smokeTestedLabels = mcpClients.filter((c) => c.smokeTested).map((c) => c.label); + +/** The setups as Markdown, for the .md output of pages that render . */ +export function mcpClientsMarkdown(): string { + return mcpClients + .map((c) => `### ${c.label}\n\n${c.file}:\n\n\`\`\`${c.lang}\n${c.code}\n\`\`\``) + .join('\n\n'); +} diff --git a/web/src/pages/[...slug].md.ts b/web/src/pages/[...slug].md.ts index cdcfe20..aa92eef 100644 --- a/web/src/pages/[...slug].md.ts +++ b/web/src/pages/[...slug].md.ts @@ -1,15 +1,37 @@ -// Serves every docs page as raw Markdown at `.md`, so agents can read -// the docs without HTML (for example /agents/install.md). +// Serves every docs page as plain Markdown at `.md`, so agents can read +// the docs without HTML (for example /agents/install.md). MDX-only syntax is +// rewritten into Markdown. import type { APIRoute, GetStaticPaths } from 'astro'; import { getCollection } from 'astro:content'; +import { mcpClientsMarkdown } from '../data/mcp-clients'; export const getStaticPaths: GetStaticPaths = async () => { const docs = await getCollection('docs'); return docs.map((entry) => ({ params: { slug: entry.id }, props: { entry } })); }; +function toPlainMarkdown(title: string, body: string): string { + const text = body + .replace(/\n*/g, '') + .replace(/^import .*\n+/gm, '') + .replace(/^$/gm, () => mcpClientsMarkdown()) + // : each becomes a bold label. + .replace(/^<\/?Tabs[^>]*>\n*/gm, '') + .replace(/^$/gm, '**$1**') + .replace(/^<\/TabItem>\n*/gm, '') + // Asides (:::tip[Title] ... :::) become blockquote-free sections. + .replace(/^:::\w+\[([^\]]+)\]$/gm, '**$1**\n') + .replace(/^:::\w+$/gm, '') + .replace(/^:::$/gm, '') + .replace(/^```(\w+) wrap$/gm, '```$1') + .replace(/\n{3,}/g, '\n\n') + .trim(); + return `# ${title}\n\n${text}\n`; +} + export const GET: APIRoute = ({ props }) => { const { entry } = props; - const body = `# ${entry.data.title}\n\n${entry.body ?? ''}`.replace(/\n*/g, '').replace(/^import .*\n+/gm, ''); - return new Response(body, { headers: { 'Content-Type': 'text/markdown; charset=utf-8' } }); + return new Response(toPlainMarkdown(entry.data.title, entry.body ?? ''), { + headers: { 'Content-Type': 'text/markdown; charset=utf-8' }, + }); }; diff --git a/web/src/pages/index.astro b/web/src/pages/index.astro index 1497228..b1acdb0 100644 --- a/web/src/pages/index.astro +++ b/web/src/pages/index.astro @@ -4,6 +4,11 @@ import '@fontsource/ibm-plex-sans/600.css'; import '@fontsource/ibm-plex-sans/700.css'; import '@fontsource/jetbrains-mono/400.css'; import '@fontsource/jetbrains-mono/700.css'; +import { readFileSync } from 'node:fs'; +import { mcpClients, smokeTestedLabels } from '../data/mcp-clients'; + +// The released version, from the workspace Cargo.toml (builds run in web/). +const version = readFileSync('../Cargo.toml', 'utf8').match(/^version = "([^"]+)"/m)?.[1] ?? ''; const agentPrompt = 'Install idx-cli and its MCP server for me by following https://idx.rasyidanaf.com/agents/install.md, then show me that it works.'; @@ -16,17 +21,10 @@ const installs = [ { id: 'agent', label: 'Ask your agent', cmd: agentPrompt, prompt: true, note: 'Paste into Claude Code, Codex, Cursor or any coding agent. It installs idx, registers idx-mcp with itself, and asks before changing global config.' }, ]; -const agents = [ - { id: 'claude', label: 'Claude Code', file: 'terminal', code: 'claude mcp add idx -- npx -y idx-mcp' }, - { id: 'codex', label: 'Codex', file: '~/.codex/config.toml', code: '[mcp_servers.idx]\ncommand = "npx"\nargs = ["-y", "idx-mcp"]' }, - { id: 'cursor', label: 'Cursor', file: '~/.cursor/mcp.json', code: '{\n "mcpServers": {\n "idx": { "command": "npx", "args": ["-y", "idx-mcp"] }\n }\n}' }, - { id: 'opencode', label: 'opencode', file: 'opencode.json', code: '{\n "mcp": {\n "idx": { "type": "local", "command": ["npx", "-y", "idx-mcp"] }\n }\n}' }, - { id: 'pi', label: 'pi', file: '~/.pi/agent/mcp.json', code: '{\n "mcpServers": {\n "idx": { "command": "npx", "args": ["-y", "idx-mcp"], "exposure": "direct" }\n }\n}' }, - { id: 'hermes', label: 'Hermes', file: '~/.hermes/config.yaml', code: 'mcp_servers:\n idx:\n command: npx\n args: ["-y", "idx-mcp"]\n enabled: true' }, - { id: 'other', label: 'Other', file: 'any MCP client (stdio)', code: 'command: npx\nargs: -y idx-mcp\n# add --allow-sync to expose ownership_sync' }, -]; +const agents = mcpClients; -// Captured from `idx ownership ticker BBCA` on the 2026-09-30 snapshot. +// Captured by hand from `idx ownership ticker BBCA` on the 2026-09-30 snapshot; +// the section shows that date. Refresh it (and the terminal panel) after a new month. const holders = [ { name: 'DWIMURIA INVESTAMA ANDALAN', type: 'Corporate', shares: '67,729,950,000', pct: 54.94 }, { name: 'ANTHONI SALIM', type: 'Individual', shares: '1,416,306,835', pct: 1.15 }, @@ -69,7 +67,7 @@ const copyIcon =
-
v0.3.1 · Rust · MIT
+
v{version} · Rust · MIT

Indonesian stocks and ownership, in your terminal and your agent.

Quotes, fundamentals, technicals and KSEI shareholder data for every IDX stock. Tables for you, JSON for scripts, and an MCP server for AI agents.

@@ -143,7 +141,7 @@ TLKM.JK 2,250 +0.45% 87,159,900

Add idx to your agent

-

idx-mcp serves the same data over stdio. Each setup below is the one our agent smoke test runs against real agents.

+

idx-mcp serves the same data over stdio. Our agent smoke test runs the {new Intl.ListFormat("en", { type: "conjunction" }).format(smokeTestedLabels)} setups against the real agents.

Ask it
"Who are BBCA's largest holders, and what changed last month?"
@@ -156,7 +154,7 @@ TLKM.JK 2,250 +0.45% 87,159,900
- See all 11 tools → + See all tools →
From ddc902d568b46d6f19eca3030694f6c6447a0cc4 Mon Sep 17 00:00:00 2001 From: hermes Date: Thu, 15 Oct 2026 05:34:37 +0000 Subject: [PATCH 5/5] fix(web): read the version via a ?raw import, independent of cwd Co-Authored-By: Claude Opus 5.5 --- web/src/pages/index.astro | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/web/src/pages/index.astro b/web/src/pages/index.astro index b1acdb0..abb3b5c 100644 --- a/web/src/pages/index.astro +++ b/web/src/pages/index.astro @@ -4,11 +4,12 @@ import '@fontsource/ibm-plex-sans/600.css'; import '@fontsource/ibm-plex-sans/700.css'; import '@fontsource/jetbrains-mono/400.css'; import '@fontsource/jetbrains-mono/700.css'; -import { readFileSync } from 'node:fs'; +import cargoToml from '../../../Cargo.toml?raw'; import { mcpClients, smokeTestedLabels } from '../data/mcp-clients'; -// The released version, from the workspace Cargo.toml (builds run in web/). -const version = readFileSync('../Cargo.toml', 'utf8').match(/^version = "([^"]+)"/m)?.[1] ?? ''; +// The released version, from the workspace Cargo.toml (resolved at bundle time, +// relative to this file, so the build's working directory doesn't matter). +const version = cargoToml.match(/^\[workspace\.package\][\s\S]*?^version = "([^"]+)"/m)?.[1] ?? ''; const agentPrompt = 'Install idx-cli and its MCP server for me by following https://idx.rasyidanaf.com/agents/install.md, then show me that it works.';