diff --git a/.github/workflows/deploy-website.yml b/.github/workflows/deploy-website.yml index 23f607c4..176958a6 100644 --- a/.github/workflows/deploy-website.yml +++ b/.github/workflows/deploy-website.yml @@ -7,6 +7,7 @@ name: Deploy Website - main paths: - "docs/site/**" + - "docs/docusaurus/**" - ".github/workflows/deploy-website.yml" workflow_dispatch: diff --git a/.github/workflows/release-dev.yml b/.github/workflows/release-dev.yml index dbd29ad4..412cbbeb 100644 --- a/.github/workflows/release-dev.yml +++ b/.github/workflows/release-dev.yml @@ -31,6 +31,8 @@ jobs: - name: Run Trivy filesystem scan uses: aquasecurity/trivy-action@b6643a29fecd7f34b3597bc6acb0a98b03d33ff8 # 0.33.1 + env: + TRIVY_SKIP_VERSION_CHECK: "true" with: scan-type: "fs" scan-ref: "." @@ -38,7 +40,7 @@ jobs: severity: "CRITICAL,HIGH" exit-code: "1" ignore-unfixed: true - skip-dirs: ".venv,node_modules,console/node_modules,launcher,docs/site/api,console" + skip-dirs: ".venv,node_modules,console/node_modules,launcher,docs/site/api,console,docs/site/node_modules,docs/docusaurus/node_modules" trivyignores: ".trivyignore" format: "table" output: trivy-results.txt @@ -49,12 +51,9 @@ jobs: if [[ -s trivy-results.txt ]]; then { echo "### Security Scan Results" - echo "
Click to expand Trivy output" - echo "" echo '```' cat trivy-results.txt echo '```' - echo "
" } >> $GITHUB_STEP_SUMMARY else echo "### Security Scan: No issues found" >> $GITHUB_STEP_SUMMARY diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index c7550684..641bf226 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -81,6 +81,8 @@ jobs: - name: Run Trivy vulnerability and secret scanner uses: aquasecurity/trivy-action@b6643a29fecd7f34b3597bc6acb0a98b03d33ff8 # 0.33.1 + env: + TRIVY_SKIP_VERSION_CHECK: "true" with: scan-type: 'fs' scan-ref: '.' @@ -88,7 +90,7 @@ jobs: severity: 'CRITICAL,HIGH' exit-code: '1' ignore-unfixed: true - skip-dirs: '.venv,node_modules,console/node_modules,launcher,docs/site/api,console' + skip-dirs: '.venv,node_modules,console/node_modules,launcher,docs/site/api,console,docs/site/node_modules,docs/docusaurus/node_modules' trivyignores: '.trivyignore' format: 'table' output: trivy-results.txt @@ -99,12 +101,9 @@ jobs: if [[ -s trivy-results.txt ]]; then { echo "### Security Scan Results" - echo "
Click to expand Trivy output" - echo "" echo '```' cat trivy-results.txt echo '```' - echo "
" } >> $GITHUB_STEP_SUMMARY else echo "### Security Scan: No issues found" >> $GITHUB_STEP_SUMMARY diff --git a/.gitignore b/.gitignore index 0cc5b7c6..7114a123 100644 --- a/.gitignore +++ b/.gitignore @@ -223,7 +223,6 @@ __marimo__/ # Claude Code CLAUDE.md -.devcontainer .playwright-*/ .vercel .mcp.json diff --git a/README.md b/README.md index 13a23c89..26b767e3 100644 --- a/README.md +++ b/README.md @@ -48,8 +48,6 @@ This isn't a vibe coding tool, it's true agentic engineering, but without the ad **Claude Subscription:** Solo developers should choose [Max 5x](https://claude.com/pricing) for moderate usage or [Max 20x](https://claude.com/pricing) for heavy usage. Teams should use [Team Premium](https://claude.com/pricing) (6.25x usage per member, SSO, admin tools, billing management). Companies with stricter compliance or procurement requirements should use [Enterprise](https://claude.com/pricing) (API based pricing applies per usage). -**Terminal:** [cmux](https://www.cmux.dev/) is the best terminal for Pilot Shell on macOS — built on the Ghostty rendering engine with native split panes, workspace tabs, and Claude Code notification hooks. On Linux, [Ghostty](https://ghostty.org/download) is the recommended terminal. Both are free and open source. - ### Installation **Works with any existing project.** Pilot Shell doesn't scaffold or restructure your code — it installs globally and adapts to your conventions. @@ -58,26 +56,22 @@ This isn't a vibe coding tool, it's true agentic engineering, but without the ad curl -fsSL https://raw.githubusercontent.com/maxritter/pilot-shell/main/install.sh | bash ``` -**Choose your environment:** - -- **Local Installation** — Install directly on your system using Homebrew. Works on macOS, Linux, and Windows (WSL2). Run from any directory — all tools and rules install globally to `~/.pilot/` and `~/.claude/`. -- **Dev Container** — Pre-configured, isolated environment with all tools ready. Run from inside the project directory. No system conflicts and works on any OS. +Installs directly on your system using Homebrew — works on macOS, Linux, and Windows (WSL2). Run from any directory; all tools and rules install globally to `~/.pilot/` and `~/.claude/`. After installation, `cd` into any project and run `pilot` or `ccp` to start Pilot Shell.
What the installer does -8-step installer with progress tracking, rollback on failure, and idempotent re-runs: +7-step installer with progress tracking, rollback on failure, and idempotent re-runs: 1. **Prerequisites** — Checks Homebrew, Node.js, Python 3.12+, uv, git 2. **Dependencies** — Installs Probe, playwright-cli, language servers, property-based testing tools 3. **Shell integration** — Auto-configures bash, fish, and zsh with `pilot` alias 4. **Config & Claude files** — Sets up `.claude/` plugin, rules, commands, hooks, MCP servers 5. **VS Code extensions** — Installs recommended extensions for your stack -6. **Dev Container** — Auto-setup with all tools pre-configured -7. **Automated updater** — Checks for updates on launch with release notes and one-key upgrade -8. **Cross-platform** — macOS, Linux, Windows (WSL2) +6. **Automated updater** — Checks for updates on launch with release notes and one-key upgrade +7. **Cross-platform** — macOS, Linux, Windows (WSL2)
@@ -99,6 +93,13 @@ curl -fsSL https://raw.githubusercontent.com/maxritter/pilot-shell/main/uninstal +
+Dev Container + +Pilot Shell works inside Dev Containers. Copy the [`.devcontainer`](https://github.com/maxritter/pilot-shell/tree/main/.devcontainer) folder from this repository into your project, adapt it to your needs (base image, extensions, dependencies), and run the installer inside the container. The installer auto-detects the container environment and skips system-level dependencies like Homebrew. + +
+ --- ## How It Works @@ -155,23 +156,36 @@ Just chat — no plan, no approval gate. Quality hooks and TDD enforcement still ### Other Commands -| Command | What it does | -| ---------- | --------------------------------------------------------------------------------------------------------------------------------------------------- | +| Command | What it does | +| -------- | --------------------------------------------------------------------------------------------------------------------------------------------------- | | `/sync` | Explores your codebase, discovers conventions, builds a search index, updates project rules. Run once initially, then anytime your project changes. | | `/learn` | Captures non-obvious discoveries as reusable skills. Triggers automatically or on demand. | -| Teams | Share rules, skills, commands, and agents across your team via the Console dashboard (Team plan). | +| Share | Share skills, rules, commands, and agents across machines and teams — global sync, project mode, org hub. | + +### Customize & Share + +Create your own rules, commands, skills, and agents — all plain markdown files in `.claude/`. Then share them across machines, projects, and organizations via [Skillshare](https://github.com/runkids/skillshare). + +**Create assets in your project:** -### Extensibility +| Asset | Location | When it loads | +| ------------ | --------------------- | ------------------------------------ | +| **Rules** | `.claude/rules/` | Every session, or by file type | +| **Commands** | `.claude/commands/` | On demand via `/command-name` | +| **Skills** | `.claude/skills/` | Automatically when relevant | +| **Agents** | `.claude/agents/` | Spawned as sub-agents for specialized tasks | -Create your own rules, commands, and skills in `.claude/` — all plain markdown. Add MCP servers in `.mcp.json` and run `/sync` to generate docs. +`/sync` explores your codebase and generates project-specific rules. `/learn` captures debugging discoveries as reusable skills. Add MCP servers in `.mcp.json` and run `/sync` to generate documentation. For monorepos, organize rules in subdirectories by team with `paths` frontmatter to scope by file type. -| Type | Loaded | Best for | -| ------------------ | -------------------------------------------- | -------------------------------------- | -| **Rules** | Every session, or conditionally by file type | Guidelines Claude should always follow | -| **Commands** | On demand via `/command` | Specific workflows or multi-step tasks | -| **Skills** | On demand, created via `/learn` | Reusable knowledge from past sessions | +**Share all four asset types** — skills, rules, commands, and agents — across boundaries via [Skillshare](https://github.com/runkids/skillshare). Works with 50+ AI tools (Claude Code, Cursor, Codex, Windsurf, and more) so you have one source of truth for all your AI assets. -**Monorepo support:** Organize rules in nested subdirectories by product and team (e.g. `.claude/rules/my-product/team-x/`). Team-level rules must use `paths` frontmatter to scope to the right files. `/sync` auto-detects the structure, enforces path-scoping, and generates a `README.md` in your rules directory. +| Mode | Scope | How it works | +| ---- | ----- | ------------ | +| [**Project**](https://skillshare.runkids.cc/docs/how-to/sharing/project-setup) | Single repo, team-wide | Commit `.skillshare/skills/` to your repo — team members get assets on `git clone` | +| [**Global**](https://skillshare.runkids.cc/docs/how-to/sharing/cross-machine-sync) | Personal, all projects | Sync skills, rules, commands, and agents — push/pull across your machines via git | +| [**Organization**](https://skillshare.runkids.cc/docs/how-to/sharing/organization-sharing) | All projects, org-wide | Tracked repos distribute curated assets — hub index enables search | + +Manage sharing via the `skillshare` CLI and view all shared assets on the Console Share page. ### Pilot Shell Console @@ -182,31 +196,15 @@ A local web dashboard with 7 views and real-time notifications when Claude needs
All views -| View | What it shows | -| ------------------------ | ------------------------------------------------------------------------------------------ | -| **Dashboard** | Workspace status, active sessions, spec progress, git info, recent activity | -| **Specifications** | All spec plans with task progress, phase tracking, and iteration history | +| View | What it shows | +| ------------------ | ---------------------------------------------------------------------------------------- | +| **Dashboard** | Workspace status, active sessions, spec progress, git info, recent activity | +| **Specifications** | All spec plans with task progress, phase tracking, and iteration history | | **Memories** | Browsable observations — decisions, discoveries, bugfixes — with type filters and search | -| **Sessions** | Active and past sessions with observation counts and duration | -| **Usage** | Daily token costs, model routing breakdown, and usage trends | -| **Teams** | Shared team assets with push, install, and management (Team plan) | -| **Settings** | Model selection per command/sub-agent, extended context toggle | - -
- -### Team Asset Sharing - -Share rules, skills, commands, and agents across your team from a central, private Git repository: - -Teams Dashboard — shared asset management - -
-What Teams includes - -- **Shared asset management** — Push and install rules, skills, commands, and agents from the Console UI -- **Project-scoped** — Assets are tied to repositories, so each project gets exactly what it needs -- **Automatic versioning** — See installed vs. latest versions at a glance -- **Guided onboarding** — New team members get a step-by-step screen to setup +| **Sessions** | Active and past sessions with observation counts and duration | +| **Usage** | Daily token costs, model routing breakdown, and usage trends | +| **Share** | Skill sharing — view assets, source/sync status, CLI reference (read-only dashboard) | +| **Settings** | Model selection per command/sub-agent, extended context toggle |
@@ -229,44 +227,44 @@ Hooks fire automatically across the entire lifecycle — formatting, linting, ty #### SessionStart (on startup, clear, or compact) -| Hook | Type | What it does | -| --------------------------- | -------- | ---------------------------------------------------------------------- | -| Memory loader | Blocking | Loads persistent context from Pilot Shell Console memory | +| Hook | Type | What it does | +| ------------------------- | -------- | ---------------------------------------------------------------------- | +| Memory loader | Blocking | Loads persistent context from Pilot Shell Console memory | | `post_compact_restore.py` | Blocking | After auto-compaction: re-injects active plan, task state, and context | -| Session tracker | Async | Initializes user message tracking for the session | +| Session tracker | Async | Initializes user message tracking for the session | #### PreToolUse (before search, web, or task tools) -| Hook | Type | What it does | -| -------------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------- | +| Hook | Type | What it does | +| ------------------ | -------- | -------------------------------------------------------------------------------------------------------------------------------------------- | | `tool_redirect.py` | Blocking | Blocks WebSearch/WebFetch (MCP alternatives exist), EnterPlanMode/ExitPlanMode (/spec conflict). Hints Probe CLI for semantic Grep patterns. | #### PostToolUse (after every Write / Edit / MultiEdit) -| Hook | Type | What it does | -| ---------------------- | ------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `file_checker.py` | Blocking | Dispatches to language-specific checkers: Python (ruff + basedpyright), TypeScript (Prettier + ESLint + tsc), Go (gofmt + golangci-lint). Auto-fixes formatting. | -| `tdd_enforcer.py` | Non-blocking | Checks if implementation files were modified without failing tests first. Shows reminder to write tests. Excludes test files, docs, config, TSX, and infrastructure. | -| `context_monitor.py` | Non-blocking | Monitors context usage. Warns at ~80% (informational) and ~90%+ (caution). Prompts `/learn` at key thresholds. | -| Memory observer | Async | Captures development observations to persistent memory. | +| Hook | Type | What it does | +| ----------------------- | ------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `file_checker.py` | Blocking | Dispatches to language-specific checkers: Python (ruff + basedpyright), TypeScript (Prettier + ESLint + tsc), Go (gofmt + golangci-lint). Auto-fixes formatting. | +| `file_checker.py` (TDD) | Non-blocking | Checks if implementation files were modified without failing tests first. Shows reminder to write tests. Excludes test files, docs, config, TSX, and infrastructure. | +| `context_monitor.py` | Non-blocking | Monitors context usage. Warns at ~80% (informational) and ~90%+ (caution). Prompts `/learn` at key thresholds. | +| Memory observer | Async | Captures development observations to persistent memory. | #### PreCompact (before auto-compaction) -| Hook | Type | What it does | -| ------------------ | -------- | -------------------------------------------------------------------------------------------------------------- | +| Hook | Type | What it does | +| ---------------- | -------- | -------------------------------------------------------------------------------------------------------------- | | `pre_compact.py` | Blocking | Captures Pilot Shell state (active plan, task list, key context) to persistent memory before compaction fires. | #### Stop (when Claude tries to finish) -| Hook | Type | What it does | -| ---------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------- | +| Hook | Type | What it does | +| -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------- | | `spec_stop_guard.py` | Blocking | If an active spec exists with PENDING or COMPLETE status,**blocks stopping**. Forces verification to complete before the session can end. | -| Session summarizer | Async | Saves session observations to persistent memory for future sessions. | +| Session summarizer | Async | Saves session observations to persistent memory for future sessions. | #### SessionEnd (when the session closes) -| Hook | Type | What it does | -| ------------------ | -------- | -------------------------------------------------------------------------------------------------------------- | +| Hook | Type | What it does | +| ---------------- | -------- | -------------------------------------------------------------------------------------------------------------- | | `session_end.py` | Blocking | Stops the worker daemon when no other Pilot Shell sessions are active. Sends real-time dashboard notification. | @@ -289,12 +287,12 @@ Opus for planning — where reasoning quality matters most. Sonnet for implement
Phase-by-phase breakdown -| Phase | Default | Why | -| --------------------------- | ------- | -------------------------------------------------------------------------------------------------------------------------------------------------- | +| Phase | Default | Why | +| --------------------- | ------- | -------------------------------------------------------------------------------------------------------------------------------------------------- | | **Planning** | Opus | Exploring your codebase, designing architecture, and writing the spec requires deep reasoning. A good plan is the foundation of everything. | -| **Plan Verification** | Sonnet | The plan-reviewer sub-agent validates completeness and challenges assumptions on every feature spec. | +| **Plan Verification** | Sonnet | The plan-reviewer sub-agent validates completeness and challenges assumptions on every feature spec. *(disabled by default)* | | **Implementation** | Sonnet | With a solid plan, writing code is straightforward. Sonnet is fast, cost-effective, and produces high-quality code when guided by a clear spec. | -| **Code Verification** | Sonnet | The unified spec-reviewer agent handles deep code review (compliance + quality + goal). The orchestrator runs mechanical checks and applies fixes. | +| **Code Verification** | Sonnet | The unified spec-reviewer agent handles deep code review (compliance + quality + goal). The orchestrator runs mechanical checks and applies fixes. *(disabled by default)* | Choose between Sonnet 4.6 and Opus 4.6 for the main session, each command, and sub-agents. A global "Extended Context (1M)" toggle enables the 1M token context window across all models simultaneously. **Note:** 1M context models require a Max (20x) or Enterprise subscription — not available to all users. @@ -334,19 +332,19 @@ Production-tested best practices loaded into every session. Core rules cover wor
Collaboration -- `team-sharing.md` — Teams asset sharing via sx +- `skill-sharing.md` — Skillshare CLI reference and sharing modes
Coding Standards (activated by file type) -| Standard | Activates On | Coverage | -| ---------- | ------------------------------------------------------- | ------------------------------------------------------- | -| Python | `*.py` | uv, pytest, ruff, basedpyright, type hints | -| TypeScript | `*.ts`, `*.tsx`, `*.js`, `*.jsx` | npm/pnpm, Jest, ESLint, Prettier, React patterns | -| Go | `*.go` | Modules, testing, formatting, error handling | -| Frontend | `*.tsx`, `*.jsx`, `*.html`, `*.vue`, `*.css` | Components, CSS, accessibility, responsive design | +| Standard | Activates On | Coverage | +| ---------- | ------------------------------------------------- | ------------------------------------------------------- | +| Python | `*.py` | uv, pytest, ruff, basedpyright, type hints | +| TypeScript | `*.ts`, `*.tsx`, `*.js`, `*.jsx` | npm/pnpm, Jest, ESLint, Prettier, React patterns | +| Go | `*.go` | Modules, testing, formatting, error handling | +| Frontend | `*.tsx`, `*.jsx`, `*.html`, `*.vue`, `*.css` | Components, CSS, accessibility, responsive design | | Backend | `**/models/**`, `**/routes/**`, `**/api/**`, etc. | API design, data models, query optimization, migrations |
@@ -358,11 +356,11 @@ MCP servers provide external context in every session — library docs, persiste
All servers -| Server | Purpose | -| -------------------- | ----------------------------------------------------------------- | +| Server | Purpose | +| -------------- | ---------------------------------------------------------------- | | **lib-docs** | Library documentation lookup — get API docs for any dependency | | **mem-search** | Persistent memory search — recall context from past sessions | -| **web-search** | Web search via DuckDuckGo, Bing, and Exa | +| **web-search** | Web search via DuckDuckGo, Bing, and Exa | | **grep-mcp** | GitHub code search — find real-world usage patterns across repos | | **web-fetch** | Web page fetching — read documentation, APIs, references | @@ -379,10 +377,10 @@ The `pilot` binary (`~/.pilot/bin/pilot`) manages sessions, worktrees, licensing
Session & Context -| Command | Purpose | -| --------------------------------------- | -------------------------------------------------------------------------- | +| Command | Purpose | +| ------------------------------------- | -------------------------------------------------------------------------- | | `pilot` | Start Claude with Pilot Shell enhancements, auto-update, and license check | -| `pilot run [args...]` | Same as above, with optional flags (e.g., `--skip-update-check`) | +| `pilot run [args...]` | Same as above, with optional flags (e.g., `--skip-update-check`) | | `pilot check-context --json` | Get current context usage percentage | | `pilot register-plan ` | Associate a plan file with the current session | | `pilot sessions [--json]` | Show count of active Pilot Shell sessions | @@ -392,8 +390,8 @@ The `pilot` binary (`~/.pilot/bin/pilot`) manages sessions, worktrees, licensing
Worktree Isolation -| Command | Purpose | -| ---------------------------------------- | ----------------------------------------------------- | +| Command | Purpose | +| -------------------------------------- | ----------------------------------------------------- | | `pilot worktree create --json ` | Create isolated git worktree for safe experimentation | | `pilot worktree detect --json ` | Check if a worktree already exists | | `pilot worktree diff --json ` | List changed files in the worktree | @@ -406,8 +404,8 @@ The `pilot` binary (`~/.pilot/bin/pilot`) manages sessions, worktrees, licensing
License & Auth -| Command | Purpose | -| -------------------------------- | -------------------------------------- | +| Command | Purpose | +| ------------------------------ | -------------------------------------- | | `pilot activate ` | Activate a license key on this machine | | `pilot deactivate` | Deactivate license on this machine | | `pilot status [--json]` | Show current license status | @@ -435,14 +433,15 @@ The `pilot` binary (`~/.pilot/bin/pilot`) manages sessions, worktrees, licensing Pilot Shell is source-available under a commercial license. See the [LICENSE](LICENSE) file for full terms. -| Tier | Seats | Includes | -| :------------- | :---- | :-------------------------------------------------------------------------------- | +| Tier | Seats | Includes | +| :------- | :---- | :--------------------------------------------------------------------------------- | | **Solo** | 1 | All features, continuous updates, community support via [GitHub Issues][gh-issues] | -| **Team** | Multi | Solo + team asset sharing, seat management, priority support | +| **Team** | Multi | Solo + team license management, seat management, priority support, team onboarding | -All plans work across multiple personal machines and Dev Containers — one subscription, all your devices. +All plans work across multiple personal machines — one subscription, all your devices. [gh-issues]: https://github.com/maxritter/pilot-shell/issues + Details and licensing at [pilot-shell.com](https://pilot-shell.com). --- @@ -464,8 +463,8 @@ Let's figure out if Pilot Shell is the right fit for your team and get everyone Pilot Shell makes external calls **only for licensing**. Here is the complete list: -| When | Where | What is sent | -| --------------------------------- | ------------------- | -------------------------------- | +| When | Where | What is sent | +| --------------------------------- | ----------------- | -------------------------------- | | License validation (once per 24h) | `api.polar.sh` | License key, organization ID | | License activation (once) | `api.polar.sh` | License key, machine fingerprint | | Trial start (once) | `pilot-shell.com` | Hashed hardware fingerprint | @@ -526,21 +525,54 @@ Yes. Pilot Shell installs once globally and works across all your projects — y
Do I need to run the installer from inside a project directory? -**For local mode: no.** You can run the installer from any directory — your home folder, a parent folder containing multiple repos, anywhere. Everything installs globally to `~/.pilot/` and `~/.claude/`. The only file written to the current directory is `.nvmrc` (a Node.js version hint). +No. You can run the installer from any directory — your home folder, a parent folder containing multiple repos, anywhere. Everything installs globally to `~/.pilot/` and `~/.claude/`. The only file written to the current directory is `.nvmrc` (a Node.js version hint). -**For Dev Container mode: yes.** The installer creates a `.devcontainer/` folder in the current directory, so run it from inside the project you want to containerize. +
+ +
+Should I still use Claude Code's built-in plan mode (Shift+Tab)? + +No — use `/spec` instead. Claude Code's built-in plan mode (Shift+Tab → "plan") is unstructured: plans live only in the conversation, have no consistent format, aren't saved as files, and disappear when the session ends. There's no verification, no TDD enforcement, and no way to resume or review a plan later. + +`/spec` is a drop-in replacement that fixes all of this. Plans are written as structured markdown files in `docs/plans/` with a consistent format — scope, tasks, definition of done, and approval status. They persist across sessions, can be edited before approval, and drive a complete workflow: plan → implement with TDD → verify with code review. The plan file becomes the single source of truth for the entire task. + +**Use `/spec` for all planned work.** Use Quick Mode (regular chat) for small tasks and exploration. There's no reason to use Claude Code's built-in plan mode when Pilot Shell is installed.
-Can I add my own rules, commands, and skills? +Why does Pilot Shell use bypass permissions mode? + +Pilot Shell sets Claude Code to `bypassPermissions` mode by default so the `/spec` workflow can run autonomously — planning, implementing, and verifying without pausing for permission prompts at every tool call. This is what enables the end-to-end spec-driven development experience. + +**In Quick Mode (regular chat), you have full control.** Press `Shift+Tab` at any time to cycle through Claude Code's permission modes: -Yes. Create your own in your project's `.claude/` folder — rules, commands, and skills are all plain markdown files. Your project-level assets are loaded alongside Pilot Shell's built-in defaults and take precedence when they overlap. `/sync` auto-discovers your codebase patterns and generates project-specific rules for you. `/learn` extracts reusable knowledge from sessions into custom skills. Hooks can be extended for additional languages. Use the Teams dashboard in the Console to share your custom assets across your team. +| Mode | Behavior | +| ---------------- | ----------------------------------------------------- | +| **Plan** | Claude proposes changes, you approve before execution | +| **Accept Edits** | File edits auto-approved, other actions still prompt | +| **Normal** | Fine-grained permission prompts for each tool call | + +You can also set a persistent default in `~/.claude/settings.json` by changing the `defaultMode` field to `acceptEdits`, `default`, `plan`, or `dontAsk`. Pilot Shell preserves your choice across updates — the installer merges permissions additively and never overwrites user customizations. + +
+ +
+Can I add my own rules, commands, skills, and agents? + +Yes. Create your own in your project's `.claude/` folder — rules, commands, skills, and agents are all plain markdown files. Your project-level assets load alongside Pilot Shell's built-in defaults and take precedence when they overlap. `/sync` auto-discovers your codebase patterns and generates project-specific rules. `/learn` extracts reusable knowledge from sessions into custom skills. Manage sharing via the `skillshare` CLI and view all shared assets on the Console Share page. For monorepos, organize rules in nested subdirectories by product and team (e.g. `.claude/rules/my-product/team-x/`). Team-level rules must use `paths` frontmatter so they only load when working on relevant files. `/sync` validates this structure, enforces path-scoping, and generates a `README.md` to document the organization.
+
+Can I use Pilot Shell inside a Dev Container? + +Yes. Copy the `.devcontainer` folder from this repository into your project, adapt it to your needs (base image, extensions, dependencies), and install Pilot Shell inside the container. Everything works the same — hooks, rules, MCP servers, persistent memory, and the Console dashboard all run inside the container. This is a great option for teams that want a consistent, reproducible development environment. + +
+ --- ## Changelog diff --git a/console/src/services/server/ErrorHandler.ts b/console/src/services/server/ErrorHandler.ts index 841e3179..e1544e9f 100644 Binary files a/console/src/services/server/ErrorHandler.ts and b/console/src/services/server/ErrorHandler.ts differ diff --git a/console/src/services/server/Server.ts b/console/src/services/server/Server.ts index 64388372..a6279aec 100644 Binary files a/console/src/services/server/Server.ts and b/console/src/services/server/Server.ts differ diff --git a/console/src/services/server/middleware/auth.ts b/console/src/services/server/middleware/auth.ts index 44cea9b6..ef7ea6ec 100644 Binary files a/console/src/services/server/middleware/auth.ts and b/console/src/services/server/middleware/auth.ts differ diff --git a/console/src/services/worker-service.ts b/console/src/services/worker-service.ts index 2a24f1fb..54408966 100644 Binary files a/console/src/services/worker-service.ts and b/console/src/services/worker-service.ts differ diff --git a/console/src/services/worker/http/BaseRouteHandler.ts b/console/src/services/worker/http/BaseRouteHandler.ts index f098c777..842dcf7e 100644 Binary files a/console/src/services/worker/http/BaseRouteHandler.ts and b/console/src/services/worker/http/BaseRouteHandler.ts differ diff --git a/console/src/services/worker/http/routes/AuthRoutes.ts b/console/src/services/worker/http/routes/AuthRoutes.ts index 66c70b1b..d751107b 100644 Binary files a/console/src/services/worker/http/routes/AuthRoutes.ts and b/console/src/services/worker/http/routes/AuthRoutes.ts differ diff --git a/console/src/services/worker/http/routes/BackupRoutes.ts b/console/src/services/worker/http/routes/BackupRoutes.ts index 64dc66b5..ca1b893d 100644 Binary files a/console/src/services/worker/http/routes/BackupRoutes.ts and b/console/src/services/worker/http/routes/BackupRoutes.ts differ diff --git a/console/src/services/worker/http/routes/SettingsRoutes.ts b/console/src/services/worker/http/routes/SettingsRoutes.ts index e9b8b87f..89e5b417 100644 Binary files a/console/src/services/worker/http/routes/SettingsRoutes.ts and b/console/src/services/worker/http/routes/SettingsRoutes.ts differ diff --git a/console/src/services/worker/http/routes/ShareRoutes.ts b/console/src/services/worker/http/routes/ShareRoutes.ts new file mode 100644 index 00000000..ab8041a1 Binary files /dev/null and b/console/src/services/worker/http/routes/ShareRoutes.ts differ diff --git a/console/src/services/worker/http/routes/ShareTypes.ts b/console/src/services/worker/http/routes/ShareTypes.ts new file mode 100644 index 00000000..999834f4 Binary files /dev/null and b/console/src/services/worker/http/routes/ShareTypes.ts differ diff --git a/console/src/services/worker/http/routes/TeamsRoutes.ts b/console/src/services/worker/http/routes/TeamsRoutes.ts deleted file mode 100644 index 92bad0b6..00000000 Binary files a/console/src/services/worker/http/routes/TeamsRoutes.ts and /dev/null differ diff --git a/console/src/services/worker/http/routes/TeamsTypes.ts b/console/src/services/worker/http/routes/TeamsTypes.ts deleted file mode 100644 index c7d52c0b..00000000 Binary files a/console/src/services/worker/http/routes/TeamsTypes.ts and /dev/null differ diff --git a/console/src/services/worker/http/routes/utils/gitInfo.ts b/console/src/services/worker/http/routes/utils/gitInfo.ts index 7263b7f9..2db57937 100644 Binary files a/console/src/services/worker/http/routes/utils/gitInfo.ts and b/console/src/services/worker/http/routes/utils/gitInfo.ts differ diff --git a/console/src/ui/viewer/App.tsx b/console/src/ui/viewer/App.tsx index a59aa6a6..693d96c0 100644 Binary files a/console/src/ui/viewer/App.tsx and b/console/src/ui/viewer/App.tsx differ diff --git a/console/src/ui/viewer/components/CommandPalette.tsx b/console/src/ui/viewer/components/CommandPalette.tsx index 97d40c7d..1ca7e12d 100644 Binary files a/console/src/ui/viewer/components/CommandPalette.tsx and b/console/src/ui/viewer/components/CommandPalette.tsx differ diff --git a/console/src/ui/viewer/components/LogsModal.tsx b/console/src/ui/viewer/components/LogsModal.tsx index 334d9555..14d66122 100644 Binary files a/console/src/ui/viewer/components/LogsModal.tsx and b/console/src/ui/viewer/components/LogsModal.tsx differ diff --git a/console/src/ui/viewer/components/TerminalPreview.tsx b/console/src/ui/viewer/components/TerminalPreview.tsx index cfd8f104..b63491a2 100644 Binary files a/console/src/ui/viewer/components/TerminalPreview.tsx and b/console/src/ui/viewer/components/TerminalPreview.tsx differ diff --git a/console/src/ui/viewer/constants/shortcuts.ts b/console/src/ui/viewer/constants/shortcuts.ts index 1b7d94e4..f9475dc9 100644 Binary files a/console/src/ui/viewer/constants/shortcuts.ts and b/console/src/ui/viewer/constants/shortcuts.ts differ diff --git a/console/src/ui/viewer/constants/timing.ts b/console/src/ui/viewer/constants/timing.ts index 23947f1a..afcaeb1b 100644 Binary files a/console/src/ui/viewer/constants/timing.ts and b/console/src/ui/viewer/constants/timing.ts differ diff --git a/console/src/ui/viewer/hooks/useSettings.ts b/console/src/ui/viewer/hooks/useSettings.ts index 3508262e..205e8535 100644 Binary files a/console/src/ui/viewer/hooks/useSettings.ts and b/console/src/ui/viewer/hooks/useSettings.ts differ diff --git a/console/src/ui/viewer/hooks/useShare.ts b/console/src/ui/viewer/hooks/useShare.ts new file mode 100644 index 00000000..c31e39ad Binary files /dev/null and b/console/src/ui/viewer/hooks/useShare.ts differ diff --git a/console/src/ui/viewer/hooks/useStats.ts b/console/src/ui/viewer/hooks/useStats.ts index 90e43210..9d116579 100644 Binary files a/console/src/ui/viewer/hooks/useStats.ts and b/console/src/ui/viewer/hooks/useStats.ts differ diff --git a/console/src/ui/viewer/hooks/useTeams.ts b/console/src/ui/viewer/hooks/useTeams.ts deleted file mode 100644 index e06c3af0..00000000 Binary files a/console/src/ui/viewer/hooks/useTeams.ts and /dev/null differ diff --git a/console/src/ui/viewer/layouts/DashboardLayout.tsx b/console/src/ui/viewer/layouts/DashboardLayout.tsx index eb49a65e..9b8b73d7 100644 Binary files a/console/src/ui/viewer/layouts/DashboardLayout.tsx and b/console/src/ui/viewer/layouts/DashboardLayout.tsx differ diff --git a/console/src/ui/viewer/layouts/Sidebar/SidebarFooter.tsx b/console/src/ui/viewer/layouts/Sidebar/SidebarFooter.tsx index 13da6510..5dcc188c 100644 Binary files a/console/src/ui/viewer/layouts/Sidebar/SidebarFooter.tsx and b/console/src/ui/viewer/layouts/Sidebar/SidebarFooter.tsx differ diff --git a/console/src/ui/viewer/layouts/Sidebar/SidebarNav.tsx b/console/src/ui/viewer/layouts/Sidebar/SidebarNav.tsx index 0ad14658..cfab5019 100644 Binary files a/console/src/ui/viewer/layouts/Sidebar/SidebarNav.tsx and b/console/src/ui/viewer/layouts/Sidebar/SidebarNav.tsx differ diff --git a/console/src/ui/viewer/layouts/Sidebar/index.tsx b/console/src/ui/viewer/layouts/Sidebar/index.tsx index 084ee55d..49c88a4e 100644 Binary files a/console/src/ui/viewer/layouts/Sidebar/index.tsx and b/console/src/ui/viewer/layouts/Sidebar/index.tsx differ diff --git a/console/src/ui/viewer/layouts/Topbar/index.tsx b/console/src/ui/viewer/layouts/Topbar/index.tsx index 62d367af..25db7748 100644 Binary files a/console/src/ui/viewer/layouts/Topbar/index.tsx and b/console/src/ui/viewer/layouts/Topbar/index.tsx differ diff --git a/console/src/ui/viewer/styles/main.css b/console/src/ui/viewer/styles/main.css index 67f83fa7..efc101c0 100644 Binary files a/console/src/ui/viewer/styles/main.css and b/console/src/ui/viewer/styles/main.css differ diff --git a/console/src/ui/viewer/views/Changes/index.tsx b/console/src/ui/viewer/views/Changes/index.tsx index 57611647..27939f8c 100644 Binary files a/console/src/ui/viewer/views/Changes/index.tsx and b/console/src/ui/viewer/views/Changes/index.tsx differ diff --git a/console/src/ui/viewer/views/Dashboard/GitStatus.tsx b/console/src/ui/viewer/views/Dashboard/GitStatus.tsx index 9b7fccca..fe1efcd1 100644 Binary files a/console/src/ui/viewer/views/Dashboard/GitStatus.tsx and b/console/src/ui/viewer/views/Dashboard/GitStatus.tsx differ diff --git a/console/src/ui/viewer/views/Dashboard/PlanStatus.tsx b/console/src/ui/viewer/views/Dashboard/PlanStatus.tsx index ef64d394..6a909101 100644 Binary files a/console/src/ui/viewer/views/Dashboard/PlanStatus.tsx and b/console/src/ui/viewer/views/Dashboard/PlanStatus.tsx differ diff --git a/console/src/ui/viewer/views/Dashboard/ShareStatus.tsx b/console/src/ui/viewer/views/Dashboard/ShareStatus.tsx new file mode 100644 index 00000000..daacb81e Binary files /dev/null and b/console/src/ui/viewer/views/Dashboard/ShareStatus.tsx differ diff --git a/console/src/ui/viewer/views/Dashboard/TeamsStatus.tsx b/console/src/ui/viewer/views/Dashboard/TeamsStatus.tsx deleted file mode 100644 index 2a60ebb2..00000000 Binary files a/console/src/ui/viewer/views/Dashboard/TeamsStatus.tsx and /dev/null differ diff --git a/console/src/ui/viewer/views/Dashboard/UsageSummary.tsx b/console/src/ui/viewer/views/Dashboard/UsageSummary.tsx index 1a82bcd6..bbfeaae6 100644 Binary files a/console/src/ui/viewer/views/Dashboard/UsageSummary.tsx and b/console/src/ui/viewer/views/Dashboard/UsageSummary.tsx differ diff --git a/console/src/ui/viewer/views/Dashboard/WorkerStatus.tsx b/console/src/ui/viewer/views/Dashboard/WorkerStatus.tsx index 0e8e1e44..44ee8f41 100644 Binary files a/console/src/ui/viewer/views/Dashboard/WorkerStatus.tsx and b/console/src/ui/viewer/views/Dashboard/WorkerStatus.tsx differ diff --git a/console/src/ui/viewer/views/Dashboard/charts/ProjectsChart.tsx b/console/src/ui/viewer/views/Dashboard/charts/ProjectsChart.tsx index 217c1d38..c1d2a1c7 100644 Binary files a/console/src/ui/viewer/views/Dashboard/charts/ProjectsChart.tsx and b/console/src/ui/viewer/views/Dashboard/charts/ProjectsChart.tsx differ diff --git a/console/src/ui/viewer/views/Dashboard/charts/TokensChart.tsx b/console/src/ui/viewer/views/Dashboard/charts/TokensChart.tsx index ce962687..21d77443 100644 Binary files a/console/src/ui/viewer/views/Dashboard/charts/TokensChart.tsx and b/console/src/ui/viewer/views/Dashboard/charts/TokensChart.tsx differ diff --git a/console/src/ui/viewer/views/Dashboard/index.tsx b/console/src/ui/viewer/views/Dashboard/index.tsx index ae478104..7f8c82d9 100644 Binary files a/console/src/ui/viewer/views/Dashboard/index.tsx and b/console/src/ui/viewer/views/Dashboard/index.tsx differ diff --git a/console/src/ui/viewer/views/Help/index.tsx b/console/src/ui/viewer/views/Help/index.tsx new file mode 100644 index 00000000..fe259d77 Binary files /dev/null and b/console/src/ui/viewer/views/Help/index.tsx differ diff --git a/console/src/ui/viewer/views/Memories/MemoryCard.tsx b/console/src/ui/viewer/views/Memories/MemoryCard.tsx index 1acd1b80..06fc2765 100644 Binary files a/console/src/ui/viewer/views/Memories/MemoryCard.tsx and b/console/src/ui/viewer/views/Memories/MemoryCard.tsx differ diff --git a/console/src/ui/viewer/views/Sessions/SessionTimeline.tsx b/console/src/ui/viewer/views/Sessions/SessionTimeline.tsx index d3a3ce78..22e1eba1 100644 Binary files a/console/src/ui/viewer/views/Sessions/SessionTimeline.tsx and b/console/src/ui/viewer/views/Sessions/SessionTimeline.tsx differ diff --git a/console/src/ui/viewer/views/Settings/index.tsx b/console/src/ui/viewer/views/Settings/index.tsx index f7fd7fc2..745f7baa 100644 Binary files a/console/src/ui/viewer/views/Settings/index.tsx and b/console/src/ui/viewer/views/Settings/index.tsx differ diff --git a/console/src/ui/viewer/views/Share/ShareAuditSection.tsx b/console/src/ui/viewer/views/Share/ShareAuditSection.tsx new file mode 100644 index 00000000..bc3a7f4e Binary files /dev/null and b/console/src/ui/viewer/views/Share/ShareAuditSection.tsx differ diff --git a/console/src/ui/viewer/views/Share/ShareHelpSections.tsx b/console/src/ui/viewer/views/Share/ShareHelpSections.tsx new file mode 100644 index 00000000..ed3e8748 Binary files /dev/null and b/console/src/ui/viewer/views/Share/ShareHelpSections.tsx differ diff --git a/console/src/ui/viewer/views/Share/ShareOnboarding.tsx b/console/src/ui/viewer/views/Share/ShareOnboarding.tsx new file mode 100644 index 00000000..b86b586d Binary files /dev/null and b/console/src/ui/viewer/views/Share/ShareOnboarding.tsx differ diff --git a/console/src/ui/viewer/views/Share/ShareSearchModal.tsx b/console/src/ui/viewer/views/Share/ShareSearchModal.tsx new file mode 100644 index 00000000..662b3df0 Binary files /dev/null and b/console/src/ui/viewer/views/Share/ShareSearchModal.tsx differ diff --git a/console/src/ui/viewer/views/Share/ShareSkillDetail.tsx b/console/src/ui/viewer/views/Share/ShareSkillDetail.tsx new file mode 100644 index 00000000..d797b26c Binary files /dev/null and b/console/src/ui/viewer/views/Share/ShareSkillDetail.tsx differ diff --git a/console/src/ui/viewer/views/Share/ShareSkillsGrid.tsx b/console/src/ui/viewer/views/Share/ShareSkillsGrid.tsx new file mode 100644 index 00000000..75224d64 Binary files /dev/null and b/console/src/ui/viewer/views/Share/ShareSkillsGrid.tsx differ diff --git a/console/src/ui/viewer/views/Share/index.tsx b/console/src/ui/viewer/views/Share/index.tsx new file mode 100644 index 00000000..7e3e9412 Binary files /dev/null and b/console/src/ui/viewer/views/Share/index.tsx differ diff --git a/console/src/ui/viewer/views/Spec/SpecSection.tsx b/console/src/ui/viewer/views/Spec/SpecSection.tsx index eede79d8..1601e22c 100644 Binary files a/console/src/ui/viewer/views/Spec/SpecSection.tsx and b/console/src/ui/viewer/views/Spec/SpecSection.tsx differ diff --git a/console/src/ui/viewer/views/Spec/index.tsx b/console/src/ui/viewer/views/Spec/index.tsx index 293a15cf..611d00c2 100644 Binary files a/console/src/ui/viewer/views/Spec/index.tsx and b/console/src/ui/viewer/views/Spec/index.tsx differ diff --git a/console/src/ui/viewer/views/Teams/TeamsAssetDetail.tsx b/console/src/ui/viewer/views/Teams/TeamsAssetDetail.tsx deleted file mode 100644 index 6cd86c05..00000000 Binary files a/console/src/ui/viewer/views/Teams/TeamsAssetDetail.tsx and /dev/null differ diff --git a/console/src/ui/viewer/views/Teams/TeamsAssetTable.tsx b/console/src/ui/viewer/views/Teams/TeamsAssetTable.tsx deleted file mode 100644 index b08b1815..00000000 Binary files a/console/src/ui/viewer/views/Teams/TeamsAssetTable.tsx and /dev/null differ diff --git a/console/src/ui/viewer/views/Teams/TeamsContentModal.tsx b/console/src/ui/viewer/views/Teams/TeamsContentModal.tsx deleted file mode 100644 index fbbcc209..00000000 Binary files a/console/src/ui/viewer/views/Teams/TeamsContentModal.tsx and /dev/null differ diff --git a/console/src/ui/viewer/views/Teams/TeamsHelpModal.tsx b/console/src/ui/viewer/views/Teams/TeamsHelpModal.tsx deleted file mode 100644 index 403075cf..00000000 Binary files a/console/src/ui/viewer/views/Teams/TeamsHelpModal.tsx and /dev/null differ diff --git a/console/src/ui/viewer/views/Teams/TeamsOnboarding.tsx b/console/src/ui/viewer/views/Teams/TeamsOnboarding.tsx deleted file mode 100644 index 8e449515..00000000 Binary files a/console/src/ui/viewer/views/Teams/TeamsOnboarding.tsx and /dev/null differ diff --git a/console/src/ui/viewer/views/Teams/TeamsPushPanel.tsx b/console/src/ui/viewer/views/Teams/TeamsPushPanel.tsx deleted file mode 100644 index ab985820..00000000 Binary files a/console/src/ui/viewer/views/Teams/TeamsPushPanel.tsx and /dev/null differ diff --git a/console/src/ui/viewer/views/Teams/TeamsSetupTab.tsx b/console/src/ui/viewer/views/Teams/TeamsSetupTab.tsx deleted file mode 100644 index fa7c0693..00000000 Binary files a/console/src/ui/viewer/views/Teams/TeamsSetupTab.tsx and /dev/null differ diff --git a/console/src/ui/viewer/views/Teams/TeamsSummaryCards.tsx b/console/src/ui/viewer/views/Teams/TeamsSummaryCards.tsx deleted file mode 100644 index b384a504..00000000 Binary files a/console/src/ui/viewer/views/Teams/TeamsSummaryCards.tsx and /dev/null differ diff --git a/console/src/ui/viewer/views/Teams/index.tsx b/console/src/ui/viewer/views/Teams/index.tsx deleted file mode 100644 index 655801e2..00000000 Binary files a/console/src/ui/viewer/views/Teams/index.tsx and /dev/null differ diff --git a/console/src/ui/viewer/views/index.ts b/console/src/ui/viewer/views/index.ts index 99eeeedb..4976ec7f 100644 Binary files a/console/src/ui/viewer/views/index.ts and b/console/src/ui/viewer/views/index.ts differ diff --git a/console/tests/hooks/use-teams.test.ts b/console/tests/hooks/use-teams.test.ts index 231bfdb6..bb03d643 100644 Binary files a/console/tests/hooks/use-teams.test.ts and b/console/tests/hooks/use-teams.test.ts differ diff --git a/console/tests/hooks/useSettings.test.ts b/console/tests/hooks/useSettings.test.ts index e2f42b3f..9f6c0cb4 100644 Binary files a/console/tests/hooks/useSettings.test.ts and b/console/tests/hooks/useSettings.test.ts differ diff --git a/console/tests/server/error-handler.test.ts b/console/tests/server/error-handler.test.ts index 2fb7b502..07ce6907 100644 Binary files a/console/tests/server/error-handler.test.ts and b/console/tests/server/error-handler.test.ts differ diff --git a/console/tests/settings-routes.test.ts b/console/tests/settings-routes.test.ts index 1948867f..81a5e114 100644 Binary files a/console/tests/settings-routes.test.ts and b/console/tests/settings-routes.test.ts differ diff --git a/console/tests/ui/ChangesView.test.ts b/console/tests/ui/ChangesView.test.ts index 0d5bae52..f38ba0c5 100644 Binary files a/console/tests/ui/ChangesView.test.ts and b/console/tests/ui/ChangesView.test.ts differ diff --git a/console/tests/ui/project-selector.test.ts b/console/tests/ui/project-selector.test.ts index b5ceddfb..4718a507 100644 Binary files a/console/tests/ui/project-selector.test.ts and b/console/tests/ui/project-selector.test.ts differ diff --git a/console/tests/ui/search-removal.test.ts b/console/tests/ui/search-removal.test.ts index 56d00419..b8682c1b 100644 Binary files a/console/tests/ui/search-removal.test.ts and b/console/tests/ui/search-removal.test.ts differ diff --git a/console/tests/ui/teams-install.test.ts b/console/tests/ui/teams-install.test.ts index 4bdb3b27..832b125d 100644 Binary files a/console/tests/ui/teams-install.test.ts and b/console/tests/ui/teams-install.test.ts differ diff --git a/console/tests/ui/teams-navigation.test.ts b/console/tests/ui/teams-navigation.test.ts index 0d362c2c..07f9814a 100644 Binary files a/console/tests/ui/teams-navigation.test.ts and b/console/tests/ui/teams-navigation.test.ts differ diff --git a/console/tests/ui/teams-view.test.ts b/console/tests/ui/teams-view.test.ts index 1f73e4d8..b01f7c23 100644 Binary files a/console/tests/ui/teams-view.test.ts and b/console/tests/ui/teams-view.test.ts differ diff --git a/console/tests/ui/views-index.test.ts b/console/tests/ui/views-index.test.ts index 324b7e98..f68119f7 100644 Binary files a/console/tests/ui/views-index.test.ts and b/console/tests/ui/views-index.test.ts differ diff --git a/console/tests/unit/services/worker/ShareRoutes.test.ts b/console/tests/unit/services/worker/ShareRoutes.test.ts new file mode 100644 index 00000000..9cd1dd37 Binary files /dev/null and b/console/tests/unit/services/worker/ShareRoutes.test.ts differ diff --git a/console/tests/worker/teams-routes.test.ts b/console/tests/worker/teams-routes.test.ts index 6dbef73e..038f0d0b 100644 Binary files a/console/tests/worker/teams-routes.test.ts and b/console/tests/worker/teams-routes.test.ts differ diff --git a/docs/docusaurus/.gitignore b/docs/docusaurus/.gitignore new file mode 100644 index 00000000..d6e43209 --- /dev/null +++ b/docs/docusaurus/.gitignore @@ -0,0 +1,5 @@ +node_modules/ +build/ +.docusaurus/ +.cache-loader/ +.playwright-cli/ diff --git a/docs/docusaurus/docs/features/context-preservation.md b/docs/docusaurus/docs/features/context-preservation.md new file mode 100644 index 00000000..d70f13eb --- /dev/null +++ b/docs/docusaurus/docs/features/context-preservation.md @@ -0,0 +1,38 @@ +--- +sidebar_position: 3 +title: Context Preservation +description: Seamless continuation across auto-compaction cycles +--- + +# Context Preservation + +Seamless continuation across auto-compaction cycles. + +Claude Code reserves ~16.5% of the context window as a compaction buffer, triggering auto-compaction at ~83.5% raw usage. Pilot hooks intercept this cycle to preserve state — you never lose progress mid-task. Multiple Pilot sessions can run in parallel on the same project without interference. + +## The Compaction Cycle + +``` +PreCompact → Compact → SessionStart(compact) +``` + +1. **PreCompact** — `pre_compact.py` captures active plan, task list, recent decisions, and key context to Pilot Shell Console memory. +2. **Compact** — Claude Code auto-compaction summarizes conversation history. Preserves recent tool calls and conversation flow. +3. **SessionStart(compact)** — `post_compact_restore.py` re-injects Pilot context: active plan path, task state, key decisions. Work resumes seamlessly. + +## Effective Context Display + +Pilot rescales the raw context usage to an **effective 0–100% range** so the status bar fills naturally to 100% right before compaction fires. A `▓` buffer indicator at the end of the bar shows the reserved zone. The context monitor warns at ~80% effective (informational) and ~90%+ effective (caution) — no confusing raw percentages. + +## What Gets Preserved + +- Active plan file path and current status (PENDING/COMPLETE/VERIFIED) +- Task list with completion state and in-progress task +- Key decisions made during the session +- Recently modified files and their context +- Error messages and debugging progress +- Memory observations from the Pilot Shell Console + +:::tip Never rush due to context warnings +Context limits are not an emergency — auto-compaction preserves everything and resumes seamlessly. Finish the current task with full quality. The only thing that matters is the output, not the context percentage. +::: diff --git a/docs/docusaurus/docs/features/hooks.md b/docs/docusaurus/docs/features/hooks.md new file mode 100644 index 00000000..ba0dd63c --- /dev/null +++ b/docs/docusaurus/docs/features/hooks.md @@ -0,0 +1,79 @@ +--- +sidebar_position: 2 +title: Hooks Pipeline +description: 15 hooks across 7 lifecycle events — fire automatically at every stage +--- + +# Hooks Pipeline + +15 hooks across 7 lifecycle events — fire automatically at every stage. + +Hooks are the enforcement layer. They run at each stage of Claude's work cycle — automatically, without prompting. Blocking hooks can reject an action or force a fix. Non-blocking hooks warn without interrupting. Async hooks run in the background. + +## SessionStart + +*On startup, clear, or after compaction* + +| Hook | Type | Description | +|------|------|-------------| +| Memory loader | Blocking | Loads persistent context from Console memory into the session | +| `post_compact_restore.py` | Blocking | Re-injects active plan, task state, and key context after compaction | +| Session tracker | Async | Initializes user message tracking for the session | + +## UserPromptSubmit + +*When the user sends a message* + +| Hook | Type | Description | +|------|------|-------------| +| Session initializer | Async | Registers the session with the Console worker daemon on first message | + +## PreToolUse + +*Before search, web, or task tools* + +| Hook | Type | Description | +|------|------|-------------| +| `tool_redirect.py` | Blocking | Redirects to MCP alternatives, blocks plan mode conflicts, hints Probe CLI for search | + +## PostToolUse + +*After every Write / Edit / MultiEdit* + +| Hook | Type | Description | +|------|------|-------------| +| `file_checker.py` | Blocking | Python (ruff + basedpyright), TypeScript (Prettier + ESLint + tsc), Go (gofmt + golangci-lint). Auto-fixes formatting. | +| `tdd_enforcer.py` | Non-blocking | Warns when implementation files are edited without a failing test first | +| `context_monitor.py` | Non-blocking | Tracks context usage 0–100%. Warns at ~80%, caution at ~90%+ | +| Memory observer | Async | Captures decisions, discoveries, and bugfixes to persistent memory | + +## PreCompact + +*Before auto-compaction fires* + +| Hook | Type | Description | +|------|------|-------------| +| `pre_compact.py` | Blocking | Snapshots active plan, task list, and key decisions to memory | + +## Stop + +*When Claude tries to finish* + +| Hook | Type | Description | +|------|------|-------------| +| `spec_stop_guard.py` | Blocking | Blocks stopping if an active spec hasn't completed verification | +| `spec_plan_validator.py` | Blocking | Verifies plan file was created with required sections | +| `spec_verify_validator.py` | Blocking | Verifies plan status was updated to VERIFIED | +| Session summarizer | Async | Saves session observations to memory for future sessions | + +## SessionEnd + +*When the session closes* + +| Hook | Type | Description | +|------|------|-------------| +| `session_end.py` | Blocking | Stops worker daemon if no other sessions active. Sends dashboard notification. | + +:::info Closed loop +When compaction fires, **PreCompact** captures your active plan, task list, and key decisions to persistent memory. **SessionStart** restores everything afterward — work continues exactly where it left off. No progress lost, no manual intervention. +::: diff --git a/docs/docusaurus/docs/features/model-routing.md b/docs/docusaurus/docs/features/model-routing.md new file mode 100644 index 00000000..b5facd3f --- /dev/null +++ b/docs/docusaurus/docs/features/model-routing.md @@ -0,0 +1,31 @@ +--- +sidebar_position: 5 +title: Model Routing +description: Opus where reasoning matters, Sonnet where speed and cost matter +--- + +# Model Routing + +Opus where reasoning matters, Sonnet where speed and cost matter. + +Pilot automatically routes each phase to the right model. Rather than always using the most powerful (and most expensive) model, it applies reasoning where reasoning has the highest impact — and uses fast, cost-effective execution where a clear spec makes quality predictable. + +## Routing Table + +| Phase | Model | Rationale | +|-------|-------|-----------| +| **Planning** | Opus | Exploring your codebase, designing architecture, and writing the spec requires deep reasoning. A good plan is the foundation — invest here. | +| **Plan Verification** | Sonnet | The plan-reviewer sub-agent validates completeness and challenges assumptions on every feature spec. | +| **Implementation** | Sonnet | With a solid plan, writing code is straightforward. Sonnet is fast, cost-effective, and produces high-quality code when guided by a clear spec and strong hooks. | +| **Code Verification** | Sonnet | The unified spec-reviewer agent handles deep code review (compliance + quality + goal). The orchestrator runs mechanical checks and applies fixes efficiently. | + +## The Insight + +- Implementation is the easy part when the plan is good and verification is thorough +- Pilot invests reasoning power (Opus) where it has the highest impact: planning +- Sonnet handles implementation and verification — guided by a solid plan and structured review agents +- The result: better output at lower cost than running Opus everywhere + +:::tip Fully configurable +Configure via the Pilot Shell Console Settings tab (`localhost:41777/#/settings`). Choose between Sonnet 4.6 and Opus 4.6 for the main session, each command, and each sub-agent independently. Enable the **Extended Context (1M)** toggle to switch all models to the 1M token context window simultaneously — useful for very large codebases. Requires Max 20x or Enterprise subscription. +::: diff --git a/docs/docusaurus/docs/features/rules.md b/docs/docusaurus/docs/features/rules.md new file mode 100644 index 00000000..b7c1729b --- /dev/null +++ b/docs/docusaurus/docs/features/rules.md @@ -0,0 +1,53 @@ +--- +sidebar_position: 4 +title: Rules & Standards +description: Production-tested best practices loaded into every session +--- + +# Rules & Standards + +Production-tested best practices loaded into every session. + +Rules are loaded automatically at session start. They're not suggestions — they're enforced standards. Coding standards load conditionally based on the file type being edited, keeping context lean. Your project-level rules in `.claude/rules/` are loaded alongside Pilot's built-ins and take precedence when they overlap. + +## Built-in Rule Categories + +### Core Workflow (3 rules) + +- `task-and-workflow.md` — Task management, /spec orchestration, deviation handling +- `testing.md` — TDD workflow, test strategy, coverage requirements (≥80%) +- `verification.md` — Execution verification, completion requirements + +### Development Practices (3 rules) + +- `development-practices.md` — Project policies, systematic debugging, git rules +- `context-management.md` — Auto-compaction and context preservation +- `pilot-memory.md` — Online learning triggers + +### Tools (3 rules) + +- `research-tools.md` — Search priority and tool selection guide +- `cli-tools.md` — Pilot CLI, Probe code search +- `playwright-cli.md` — Browser automation for E2E UI testing + +### Collaboration (1 rule) + +- `skill-sharing.md` — Skillshare CLI and three-tier sharing model + +## Coding Standards — Activated by File Type + +| Standard | Activates On | Coverage | +|----------|-------------|----------| +| Python | `*.py` | uv, pytest, ruff, basedpyright, type hints | +| TypeScript | `*.ts, *.tsx, *.js, *.jsx` | npm/pnpm, Jest, ESLint, Prettier, React patterns | +| Go | `*.go` | Modules, testing, formatting, error handling | +| Frontend | `*.tsx, *.jsx, *.html, *.vue, *.css` | Components, CSS, accessibility, responsive design | +| Backend | `**/models/**, **/routes/**, **/api/**` | API design, data models, query optimization, migrations | + +:::tip Custom rules +Create `.claude/rules/my-rule.md` in your project. Add `paths: ["*.py"]` frontmatter to activate only for specific file types. Run `/sync` to auto-discover patterns and generate project-specific rules for you. +::: + +:::info Monorepo support +Organize rules in nested subdirectories by product and team (e.g. `.claude/rules/my-product/team-x/`). Team-level rules must use `paths` frontmatter to scope to the right files. `/sync` generates a `README.md` in your rules directory to document the structure. +::: diff --git a/docs/docusaurus/docs/features/share.md b/docs/docusaurus/docs/features/share.md new file mode 100644 index 00000000..1e60b7db --- /dev/null +++ b/docs/docusaurus/docs/features/share.md @@ -0,0 +1,165 @@ +--- +sidebar_position: 1 +title: Customize & Share +description: Create your own rules, commands, and skills — then share them across machines, projects, and organizations +--- + +# Customize & Share + +Create your own rules, commands, and skills — then share them across machines, projects, and organizations. + +## Create Your Own Assets + +All assets are plain markdown files in your project's `.claude/` directory. Your project-level assets load alongside Pilot's built-in defaults and take precedence when they overlap. + +| Asset | Location | When it loads | Best for | +|-------|----------|---------------|----------| +| **Rules** | `.claude/rules/` | Every session, or conditionally by file type | Guidelines Claude should always follow | +| **Commands** | `.claude/commands/` | On demand via `/command-name` | Specific workflows or multi-step tasks | +| **Skills** | `.claude/skills/` | Automatically when relevant | Reusable knowledge from past sessions | +| **Agents** | `.claude/agents/` | Spawned as sub-agents for specialized tasks | Code review, security audits, domain experts | + +### How to create assets + +- **Rules** — Create `.claude/rules/my-rule.md`. Add `paths: ["*.py"]` frontmatter to activate only for specific file types. Rules without `paths` load every session. +- **Commands** — Create `.claude/commands/my-command.md`. Invoke with `/my-command` in any session. +- **Skills** — Create `.claude/skills/my-skill.md` with a `description` frontmatter. Claude loads skills automatically when their description matches the current task. + +### Auto-generation + +- `/sync` explores your codebase and generates project-specific rules based on your tech stack, conventions, and patterns. +- `/learn` captures non-obvious debugging discoveries, workarounds, and tool integrations as reusable skills. + +### Monorepo support + +Organize rules in nested subdirectories by product and team (e.g. `.claude/rules/my-product/team-x/`). Team-level rules must use `paths` frontmatter to scope to the right files. `/sync` validates the structure, enforces path-scoping, and generates a `README.md` to document the organization. + +### MCP servers + +Add custom MCP servers in `.mcp.json`, then run `/sync` to generate documentation so Claude knows how to use them. + +## Share Across Boundaries + +Share all four asset types across machines, projects, and organizations using [Skillshare](https://github.com/runkids/skillshare). Skillshare is installed automatically by the Pilot installer and works with **50+ AI coding tools** — Claude Code, Cursor, Codex, Windsurf, Copilot, and more. One central source of truth for all your AI assets. + +Use the `skillshare` CLI for operations and the Console Share page for browsing, editing, and managing assets. + +### Getting Started + +```bash +# Global mode — available in all projects +skillshare init --targets claude + +# Project mode — skills committed to this repo +skillshare init -p --targets claude + +# Cross-machine sync — add a git remote +skillshare init --remote git@github.com:you/my-skills.git +``` + +### Project Mode — team sharing via git + +Commit `.skillshare/skills/` to your repo. Team members get all assets on `git clone` — no extra setup. + +```bash +skillshare init -p --targets claude # Initialize project mode +skillshare install -p # Install a skill to the project +skillshare install -p # Install all from registry.yaml +skillshare sync -p # Sync to Claude's directory +skillshare status -p # Check project status +``` + +New team members onboard with: + +```bash +git clone && cd && skillshare install -p && skillshare sync -p +``` + +[Project Setup Guide →](https://skillshare.runkids.cc/docs/how-to/sharing/project-setup) + +### Global Mode — personal cross-machine sync + +Skills in `~/.config/skillshare/skills/` sync to `~/.claude/skills/` on every machine. Add a git remote to push/pull between devices. + +```bash +skillshare init --remote git@github.com:you/my-skills.git # First machine +skillshare push -m "Add skill" # Push changes +# On another machine: +skillshare init --remote git@github.com:you/my-skills.git # Auto-pulls +skillshare pull # Sync updates +``` + +```bash +skillshare status -g # Global status +skillshare list -g # List global skills +skillshare install -g # Install to global +skillshare sync -g --all # Sync skills + extras → Claude +skillshare collect -g # Import local-only skills to source +skillshare diff -g # Show pending changes +``` + +[Cross-Machine Sync Guide →](https://skillshare.runkids.cc/docs/how-to/sharing/cross-machine-sync) + +### Extras — rules, commands, agents + +Share non-skill assets across machines via extras (global only). Place files in `~/.config/skillshare/{rules,commands,agents}/` and sync with `skillshare sync -g --all`. + +| To share | Place file in | Syncs to | +|----------|---------------|----------| +| Rule | `~/.config/skillshare/rules/my-rule.md` | `~/.claude/rules/my-rule.md` | +| Command | `~/.config/skillshare/commands/my-cmd.md` | `~/.claude/commands/my-cmd.md` | +| Agent | `~/.config/skillshare/agents/my-agent.md` | `~/.claude/agents/my-agent.md` | + +Extras are included when you push/pull — they sync across machines automatically. The Pilot installer configures extras automatically. + +### Organization Mode — org-wide distribution + +Track shared repos to distribute curated assets across your organization. + +```bash +skillshare install github.com/org/skills --track # Install tracked repo +skillshare update --all && skillshare sync -g # Update all tracked repos +``` + +[Organization Sharing Guide →](https://skillshare.runkids.cc/docs/how-to/sharing/organization-sharing) + +### Console Share Page + +The Share page in the Pilot Console provides a full management interface: + +- **Source & Sync** — asset counts (skills, rules, commands, agents) for both project and global scopes +- **Team Remote** — connected git remotes with **Push** and **Pull** buttons for one-click sync +- **Assets Grid** — all assets with type and scope badges, filterable by scope (Project / Global / All) and type (Skill / Rule / Command / Agent), plus text search +- **Asset Detail** — click any asset to: + - **Preview** rendered markdown or view raw source + - **Edit** markdown in-place with a Save button + - **Rename** the asset file + - **Delete** with confirmation prompt + - View metadata (source, version, install date, repository URL) and file list + +### CLI Quick Reference + +| Command | Description | +|---------|-------------| +| `skillshare init --targets claude` | Initialize global mode | +| `skillshare init -p --targets claude` | Initialize project mode | +| `skillshare init --remote ` | Set up git remote | +| `skillshare status -g` / `-p` | Check status | +| `skillshare list -g` / `-p` | List skills | +| `skillshare install -g` / `-p` | Install a skill | +| `skillshare sync -g --all` | Sync skills + extras | +| `skillshare sync -p` | Sync project skills | +| `skillshare collect -g` | Import local-only skills | +| `skillshare update --all` | Update tracked repos | +| `skillshare push -m "msg"` | Push to remote | +| `skillshare pull` | Pull from remote | +| `skillshare diff -g` / `-p` | Show pending changes | +| `skillshare audit --json -g` | Security audit | + +### Documentation + +- [Quick Start](https://skillshare.runkids.cc/docs/learn/with-claude-code) — Get started with Skillshare +- [Commands Reference](https://skillshare.runkids.cc/docs/reference/commands) — All CLI commands +- [Cross-Machine Sync](https://skillshare.runkids.cc/docs/how-to/sharing/cross-machine-sync) — Sync via git push/pull +- [Project Setup](https://skillshare.runkids.cc/docs/how-to/sharing/project-setup) — Commit skills to your repo +- [Organization Sharing](https://skillshare.runkids.cc/docs/how-to/sharing/organization-sharing) — Tracked repos for teams diff --git a/docs/docusaurus/docs/getting-started/installation.md b/docs/docusaurus/docs/getting-started/installation.md new file mode 100644 index 00000000..efa24e46 --- /dev/null +++ b/docs/docusaurus/docs/getting-started/installation.md @@ -0,0 +1,80 @@ +--- +sidebar_position: 2 +title: Installation +description: One-command installation — works with any existing project +--- + +# Installation + +Works with any existing project — no scaffolding required. + +## One-Command Installation + +```bash +curl -fsSL https://raw.githubusercontent.com/maxritter/pilot-shell/main/install.sh | bash +``` + +Run from any directory — it installs globally to `~/.pilot/` and `~/.claude/`. After installation, `cd` into any project and run `pilot` or `ccp` to start. + +## What the Installer Does + +7 steps with progress tracking and rollback on failure: + +| Step | Title | Description | +|------|-------|-------------| +| 1 | Prerequisites | Checks Homebrew, Node.js, Python 3.12+, uv, git | +| 2 | Dependencies | Installs Probe (code search), playwright-cli, language servers | +| 3 | Shell integration | Auto-configures bash, fish, and zsh with the pilot alias | +| 4 | Config & Claude files | Sets up `.claude/` plugin — rules, commands, hooks, MCP servers | +| 5 | VS Code extensions | Installs recommended extensions for your language stack | +| 6 | Automated updater | Checks for updates on launch with release notes and one-key upgrade | +| 7 | Cross-platform | Works on macOS, Linux, Windows (WSL2) | + +## Permissions Mode + +Pilot Shell sets Claude Code to `bypassPermissions` mode by default. This enables the `/spec` workflow to run autonomously — planning, implementing, and verifying without pausing for permission prompts. + +**In Quick Mode (regular chat), you control the permission level.** Press `Shift+Tab` to cycle through modes: + +| Mode | Behavior | +|------|----------| +| **Plan** | Claude proposes changes, you approve before execution | +| **Accept Edits** | File edits auto-approved, other actions still prompt | +| **Normal** | Fine-grained permission prompts for each tool call | + +To set a persistent default, change `defaultMode` in `~/.claude/settings.json`: + +```json +{ + "permissions": { + "defaultMode": "acceptEdits" + } +} +``` + +The installer merges permissions additively — your customizations to `allow`, `deny`, `ask`, and `defaultMode` are preserved across updates. + +:::tip Use /spec instead of plan mode +Claude Code's built-in plan mode (`Shift+Tab` → "plan") is unstructured — plans aren't saved as files, have no consistent format, and disappear when the session ends. Use `/spec` as a drop-in replacement: plans are saved as structured markdown in `docs/plans/`, persist across sessions, and drive a complete workflow with TDD and verification. See the [spec workflow guide](/docs/workflows/spec). +::: + +## Dev Container + +Pilot Shell works inside Dev Containers. Copy the `.devcontainer` folder from the [Pilot Shell repository](https://github.com/maxritter/pilot-shell/tree/main/.devcontainer) into your project, adapt it to your needs (base image, extensions, dependencies), and run the installer inside the container. The installer auto-detects the container environment and skips system-level dependencies like Homebrew. + +## Install Specific Version + +```bash +export VERSION=6.9.3 +curl -fsSL https://raw.githubusercontent.com/maxritter/pilot-shell/main/install.sh | bash +``` + +See [releases](https://github.com/maxritter/pilot-shell/releases) for all available versions. Useful when a specific version is known stable. + +## Uninstall + +```bash +curl -fsSL https://raw.githubusercontent.com/maxritter/pilot-shell/main/uninstall.sh | bash +``` + +Removes binary, plugin files, managed commands/rules, settings, and shell aliases. Your project's custom `.claude/` files are preserved. diff --git a/docs/docusaurus/docs/getting-started/prerequisites.md b/docs/docusaurus/docs/getting-started/prerequisites.md new file mode 100644 index 00000000..ffb100f5 --- /dev/null +++ b/docs/docusaurus/docs/getting-started/prerequisites.md @@ -0,0 +1,38 @@ +--- +sidebar_position: 1 +title: Prerequisites +description: What you need before installing Pilot Shell +--- + +# Prerequisites + +What you need before installing Pilot Shell. + +## Claude Code (Auto-Installed) + +Pilot Shell installs **on top of Claude Code**. If Claude Code is not already installed, the Pilot Shell installer will install it automatically via the [native installer](https://docs.anthropic.com/en/docs/claude-code/setup). + +## Claude Subscription + +Pilot enhances Claude Code — it doesn't replace it. You need an active Claude subscription. Solo developers, teams, and enterprise organizations are all supported. + +| Plan | Audience | Notes | +|------|----------|-------| +| **Max 5x** | Solo — moderate usage | Good for part-time or focused coding sessions | +| **Max 20x** | Solo — heavy usage | Recommended for full-time AI-assisted development | +| **Team Premium** | Teams | 6.25x usage per member + SSO, admin tools, billing management | +| **Enterprise** | Companies | For organizations with compliance, procurement, or security requirements | + +## System Requirements + +Pilot installs once and works across all your projects. Each project can have its own `.claude/` rules and skills. + +| Platform | Notes | +|----------|-------| +| **macOS** | 10.15 Catalina or later, Apple Silicon and Intel | +| **Linux** | Debian, Ubuntu, RHEL-based distros, and most others | +| **Windows** | WSL2 required — native Windows not supported | + +:::tip Windows users +Install WSL2 first (`wsl --install -d Ubuntu`), then run the installer inside Ubuntu. +::: diff --git a/docs/docusaurus/docs/intro.md b/docs/docusaurus/docs/intro.md new file mode 100644 index 00000000..a403fbf5 --- /dev/null +++ b/docs/docusaurus/docs/intro.md @@ -0,0 +1,56 @@ +--- +slug: / +sidebar_position: 0 +title: Introduction +description: Complete technical reference for Pilot Shell +--- + +# Pilot Shell Documentation + +**Pilot Shell** is the professional development environment for Claude Code. It provides spec-driven development, endless context, persistent memory, quality hooks, online learning, and a modular rules system. + +## Quick Start + +```bash +# Install +curl -fsSL https://raw.githubusercontent.com/maxritter/pilot-shell/main/install.sh | bash + +# Start +cd your-project && pilot + +# Sync with your codebase +> /sync + +# Plan and build a feature +> /spec "Add user authentication with OAuth" +``` + +## What's Inside + +| Category | Highlights | +|----------|-----------| +| **[Getting Started](/docs/getting-started/prerequisites)** | Prerequisites, one-command installation | +| **[Workflows](/docs/workflows/sync)** | `/sync`, `/spec`, Quick Mode, `/learn` | +| **[Features](/docs/features/share)** | Customize & share, hooks pipeline, context preservation, rules, model routing | +| **[Tools](/docs/tools/mcp-servers)** | MCP servers, language servers, Console dashboard, CLI reference | +| **[Reference](/docs/reference/open-source)** | Open source compliance | + +## Key Commands + +| Command | Purpose | +|---------|---------| +| `pilot` or `ccp` | Start Claude with Pilot enhancements | +| `/sync` | Explore codebase and sync rules | +| `/spec "task"` | Plan → Implement → Verify with TDD | +| `/learn` | Extract knowledge into reusable skills | + +## Architecture + +Pilot enhances Claude Code with: + +- **15 hooks** across 7 lifecycle events for automatic quality enforcement +- **5 MCP servers** for library docs, memory, web search, code search, and page fetching +- **3 language servers** (Python, TypeScript, Go) for real-time diagnostics +- **Intelligent model routing** — Opus for planning, Sonnet for implementation +- **Persistent memory** via local SQLite — decisions and context survive across sessions +- **Pilot Console** — local web dashboard for monitoring, configuration, and skill sharing diff --git a/docs/docusaurus/docs/reference/open-source.md b/docs/docusaurus/docs/reference/open-source.md new file mode 100644 index 00000000..77d7f8c5 --- /dev/null +++ b/docs/docusaurus/docs/reference/open-source.md @@ -0,0 +1,81 @@ +--- +sidebar_position: 1 +title: Open Source Compliance +description: Open-source tools installed alongside Pilot Shell +--- + +# Open Source Compliance + +Pilot Shell installs the following open-source tools during setup. Each tool is installed only if not already present on your system. All tools retain their original licenses and are not modified or redistributed by Pilot Shell. **Claude Code** (proprietary, by Anthropic) is also installed automatically if missing — it is the foundation that Pilot Shell extends. + +## System Prerequisites + +*Installed via Homebrew (macOS) or system package manager (Linux)* + +| Tool | Purpose | License | +|------|---------|---------| +| [Homebrew](https://github.com/Homebrew/brew) | Package manager (macOS/Linux) | BSD-2-Clause | +| [Git](https://github.com/git/git) | Version control | GPL-2.0 | +| [GitHub CLI](https://github.com/cli/cli) | GitHub operations from the terminal | MIT | +| [Python 3.12](https://github.com/python/cpython) | Programming language runtime | PSF-2.0 | +| [Node.js 22](https://github.com/nodejs/node) | JavaScript runtime | MIT | +| [NVM](https://github.com/nvm-sh/nvm) | Node.js version manager | MIT | +| [pnpm](https://github.com/pnpm/pnpm) | Fast Node.js package manager | MIT | +| [Bun](https://github.com/oven-sh/bun) | JavaScript runtime and toolkit | MIT | +| [uv](https://github.com/astral-sh/uv) | Python package manager | MIT / Apache-2.0 | +| [Go](https://github.com/golang/go) | Programming language runtime | BSD-3-Clause | +| [gopls](https://github.com/golang/tools) | Go language server | BSD-3-Clause | +| [ripgrep](https://github.com/BurntSushi/ripgrep) | Fast text search | Unlicense / MIT | + +## Development Tools + +*Linters, formatters, type checkers, and language servers* + +| Tool | Purpose | License | +|------|---------|---------| +| [Ruff](https://github.com/astral-sh/ruff) | Python linter and formatter | MIT | +| [basedpyright](https://github.com/DetachHead/basedpyright) | Python type checker | MIT | +| [Prettier](https://github.com/prettier/prettier) | Code formatter (JS/TS/CSS/HTML) | MIT | +| [TypeScript](https://github.com/microsoft/TypeScript) | TypeScript compiler | Apache-2.0 | +| [golangci-lint](https://github.com/golangci/golangci-lint) | Go linter aggregator | GPL-3.0 | +| [vtsls](https://github.com/yioneko/vtsls) | TypeScript language server | MIT | + +## Search & Utilities + +*Code search, usage analytics, and skill management* + +| Tool | Purpose | License | +|------|---------|---------| +| [Probe](https://github.com/probelabs/probe) | Semantic code search engine | ISC | +| [ccusage](https://github.com/ryoppippi/ccusage) | Claude Code usage analytics | MIT | +| [Skillshare](https://github.com/runkids/skillshare) | AI skill sharing and sync | MIT | + +## Plugin Runtime Dependencies + +*npm packages used by Pilot Shell's memory and processing features* + +| Tool | Purpose | License | +|------|---------|---------| +| [Transformers.js](https://github.com/xenova/transformers.js) | Local ML model inference for embeddings | Apache-2.0 | +| [sharp](https://github.com/lovell/sharp) | High-performance image processing | Apache-2.0 | + +## Testing Tools + +*Browser automation and property-based testing* + +| Tool | Purpose | License | +|------|---------|---------| +| [Playwright CLI](https://github.com/nicepkg/playwright-cli) | Browser automation and E2E testing | Apache-2.0 | +| [Chromium](https://www.chromium.org/chromium-projects/) | Headless browser engine (via Playwright) | BSD-3-Clause | +| [hypothesis](https://github.com/HypothesisWorks/hypothesis) | Property-based testing (Python) | MPL-2.0 | +| [fast-check](https://github.com/dubzzz/fast-check) | Property-based testing (TypeScript) | MIT | + +## MCP Servers + +*Model Context Protocol servers pre-cached during install* + +| Tool | Purpose | License | +|------|---------|---------| +| [Context7](https://github.com/upstash/context7) | Library documentation lookup | MIT | +| [open-websearch](https://github.com/Aas-ee/open-webSearch) | Web search (multi-engine, no API key) | MIT | +| [fetcher-mcp](https://github.com/jae-jae/fetcher-mcp) | Web page fetching via Playwright | MIT | diff --git a/docs/docusaurus/docs/tools/cli.md b/docs/docusaurus/docs/tools/cli.md new file mode 100644 index 00000000..f6099368 --- /dev/null +++ b/docs/docusaurus/docs/tools/cli.md @@ -0,0 +1,48 @@ +--- +sidebar_position: 4 +title: Pilot CLI +description: Full command reference for the pilot binary at ~/.pilot/bin/pilot +--- + +# Pilot CLI + +Full command reference for the pilot binary at `~/.pilot/bin/pilot`. + +The `pilot` binary manages sessions, worktrees, licensing, and context. Run `pilot` or `ccp` with no arguments to start Claude with Pilot enhancements. All commands support `--json` for structured output. Multiple sessions can run in parallel on the same project — each tracks its own worktree and context state independently. + +## Session & Context + +| Command | Description | +|---------|-------------| +| `pilot` | Start Claude with Pilot enhancements, auto-update, and license check | +| `pilot run [args...]` | Same as above, with optional flags (`--skip-update-check`) | +| `ccp` | Alias for pilot — shorter to type | +| `pilot check-context --json` | Get current context usage percentage (informational) | +| `pilot register-plan ` | Associate a plan file with the current session for statusline display | +| `pilot sessions [--json]` | Show count of active Pilot sessions | + +## Worktree Isolation + +| Command | Description | +|---------|-------------| +| `pilot worktree create --json ` | Create isolated git worktree for safe experimentation | +| `pilot worktree detect --json ` | Check if a worktree already exists | +| `pilot worktree diff --json ` | List changed files in the worktree | +| `pilot worktree sync --json ` | Squash merge worktree changes back to base branch | +| `pilot worktree cleanup --json ` | Remove worktree and branch when done | +| `pilot worktree status --json` | Show active worktree info for current session | + +## License & Auth + +| Command | Description | +|---------|-------------| +| `pilot activate ` | Activate a license key on this machine | +| `pilot deactivate` | Deactivate license on this machine | +| `pilot status [--json]` | Show current license status and tier | +| `pilot verify [--json]` | Verify license validity (used by hooks) | +| `pilot trial --check [--json]` | Check trial eligibility for this machine | +| `pilot trial --start [--json]` | Start a trial (one-time per machine) | + +:::info Slug format +The `` parameter for worktree commands is the plan filename without the date prefix and `.md` extension. For example, `docs/plans/2026-02-22-add-auth.md` → `add-auth`. +::: diff --git a/docs/docusaurus/docs/tools/console.md b/docs/docusaurus/docs/tools/console.md new file mode 100644 index 00000000..8da420c2 --- /dev/null +++ b/docs/docusaurus/docs/tools/console.md @@ -0,0 +1,41 @@ +--- +sidebar_position: 3 +title: Pilot Console +description: Local web dashboard at localhost:41777 — monitor and manage your sessions +--- + +# Pilot Console + +Local web dashboard at `localhost:41777` — monitor and manage your sessions. + +The Console runs locally as a Bun/Express server with a React web UI. It's automatically started when you launch Pilot and stopped when all sessions close. All data — memories, sessions, usage — is stored in a local SQLite database. Nothing leaves your machine. + +```bash +$ open http://localhost:41777 +``` + +## 8 Views + +| View | Description | +|------|-------------| +| **Dashboard** | Workspace status, active sessions, spec progress, git info, recent activity. Your real-time command center. | +| **Specifications** | All spec plans with task progress (checkboxes), phase tracking (PENDING/COMPLETE/VERIFIED), and iteration history. | +| **Memories** | Browsable observations — decisions, discoveries, bugfixes — with type filters, search, and timeline view. | +| **Sessions** | Active and past sessions with observation counts, duration, and the ability to browse session context. | +| **Usage** | Daily token costs, model routing breakdown (Opus vs Sonnet distribution), and usage trends over time. | +| **Share** | Browse, edit, rename, and delete all assets (skills, rules, commands, agents). Filter by scope and type. Push/pull to git remotes. Markdown preview. | +| **Settings** | Model selection per command and sub-agent (Sonnet 4.6 vs Opus 4.6), extended context toggle (1M tokens). | +| **Help** | Embedded documentation from pilot-shell.com — full technical reference without leaving the Console. | + +## Smart Notifications via SSE + +The Console sends real-time alerts via Server-Sent Events when Claude needs your input or a significant phase completes. You don't need to watch the terminal constantly — the Console notifies you. + +- Plan requires your approval — review and respond in the terminal or via notification +- Spec phase completed — implementation done, verification starting +- Clarification needed — Claude is waiting for design decisions before proceeding +- Session ended — completion summary with observation count + +:::info Settings tab +Configure model selection per component — Planning (Opus), Implementation (Sonnet), Verification (Sonnet), each sub-agent independently. Enable the **Extended Context (1M)** toggle to use the 1M token context window across all models simultaneously. *Requires Max 20x or Enterprise subscription.* +::: diff --git a/docs/docusaurus/docs/tools/language-servers.md b/docs/docusaurus/docs/tools/language-servers.md new file mode 100644 index 00000000..8bb37f02 --- /dev/null +++ b/docs/docusaurus/docs/tools/language-servers.md @@ -0,0 +1,55 @@ +--- +sidebar_position: 2 +title: Language Servers +description: Real-time diagnostics and go-to-definition, auto-installed and configured +--- + +# Language Servers + +Real-time diagnostics and go-to-definition, auto-installed and configured. + +Language servers (LSP) give Claude real-time diagnostics, type information, and go-to-definition on every file edit. All three are auto-installed and configured via stdio transport — no manual setup. They work alongside the `file_checker.py` hook: hooks catch formatting and linting errors, LSP provides type-level intelligence. + +## Python — basedpyright + +- Strict type checking with inference +- Real-time diagnostics on every edit +- Go-to-definition and find-references +- Hover documentation for any symbol +- Auto-restart on crash (max 3 attempts) + +> Configured with strict mode for maximum type safety. Works with uv virtual environments automatically. + +## TypeScript — vtsls + +- Full TypeScript and JavaScript support +- Vue.js compatibility via Volar integration +- Type checking across the entire project +- Import auto-completion and refactoring +- Auto-restart on crash (max 3 attempts) + +> Handles both `.ts` and `.tsx` files. Respects your `tsconfig.json` settings automatically. + +## Go — gopls + +- Official Go language server by Google +- Static analysis and vet diagnostics +- Go module-aware resolution +- Rename and code actions support +- Auto-restart on crash (max 3 attempts) + +> Requires Go modules. Respects GOPATH and module proxy settings. + +:::tip Add custom language servers +Add custom language servers via `.lsp.json` in your project root. All servers use stdio transport and support auto-restart configuration. + +```json +{ + "servers": [{ + "name": "rust-analyzer", + "command": "rust-analyzer", + "args": [] + }] +} +``` +::: diff --git a/docs/docusaurus/docs/tools/mcp-servers.md b/docs/docusaurus/docs/tools/mcp-servers.md new file mode 100644 index 00000000..9a4c5012 --- /dev/null +++ b/docs/docusaurus/docs/tools/mcp-servers.md @@ -0,0 +1,71 @@ +--- +sidebar_position: 1 +title: MCP Servers +description: External context always available to every session +--- + +# MCP Servers + +External context always available to every session. + +Five MCP servers are pre-configured and always available. They're lazy-loaded via `ToolSearch` to keep context lean — discovered and called on demand. Add your own in `.mcp.json`, then run `/sync` to generate documentation. + +## lib-docs (Context7) + +**Library documentation lookup** + +Get up-to-date API docs and code examples for any library or framework. Two-step: resolve the library ID, then query for specific documentation. + +``` +resolve-library-id(libraryName="react") +query-docs(libraryId="/npm/react", query="useEffect cleanup") +``` + +## mem-search + +**Persistent memory search** + +Recall decisions, discoveries, and context from past sessions. Three-layer workflow: search → timeline → get_observations for token efficiency. + +``` +search(query="authentication flow", limit=5) +timeline(anchor=22865, depth_before=3) +get_observations(ids=[22865, 22866]) +``` + +## web-search + +**Web search + article fetching** + +Web search via DuckDuckGo, Bing, and Exa (no API keys needed). Also fetches GitHub READMEs, Linux.do articles, and other content sources. + +``` +search(query="React Server Components 2026", limit=5) +fetchGithubReadme(url="https://github.com/org/repo") +``` + +## grep-mcp + +**GitHub code search** + +Find real-world code examples from 1M+ public repositories. Search by literal code patterns, filter by language, repo, or file path. Supports regex. + +``` +searchGitHub(query="useServerAction", language=["TypeScript"]) +searchGitHub(query="FastMCP", language=["Python"]) +``` + +## web-fetch + +**Full web page fetching** + +Fetch complete web pages via Playwright (handles JS-rendered content, no truncation). Fetches single or multiple URLs in one call. + +``` +fetch_url(url="https://docs.example.com/api") +fetch_urls(urls=["https://a.com", "https://b.com"]) +``` + +:::info Tool selection +Rules specify the preferred order — Probe CLI first for codebase questions, lib-docs for library API lookups, grep-mcp for production code examples, web-search for current information. The `tool_redirect.py` hook blocks the built-in WebSearch/WebFetch and redirects to these MCP alternatives. +::: diff --git a/docs/docusaurus/docs/workflows/learn.md b/docs/docusaurus/docs/workflows/learn.md new file mode 100644 index 00000000..22ee3c9a --- /dev/null +++ b/docs/docusaurus/docs/workflows/learn.md @@ -0,0 +1,40 @@ +--- +sidebar_position: 4 +title: /learn — Online Learning +description: Capture non-obvious discoveries as reusable skills +--- + +# /learn — Online Learning + +Capture non-obvious discoveries as reusable skills. + +When Pilot solves a non-obvious problem — a tricky debugging session, an undocumented API pattern, a workaround for a framework quirk — `/learn` extracts that knowledge into a reusable skill. Future sessions load and apply it automatically. Triggered automatically when relevant, or invoked manually after significant investigations. + +## Automatic Trigger Conditions + +- Non-obvious debugging solution discovered after 10+ minutes +- Misleading errors — error pointed the wrong direction, found the real cause +- Workaround for a library limitation found during work +- Undocumented tool or API integration pattern +- Trial-and-error — multiple approaches tried before finding the solution +- Multi-step workflow that will likely recur +- External service query pattern (Jira, GitHub, Confluence) +- User-facing automation — reports or status checks user will ask for again + +## What Gets Extracted Into a Skill + +- The problem context and why standard approaches failed +- Step-by-step solution with exact commands and code +- When to apply this knowledge in future sessions +- Edge cases and caveats to watch out for + +## Manual Invocation + +```bash +> /learn "Extract the debugging workflow we used for the race condition" +> /learn "Save the PostgreSQL connection pooling pattern we discovered" +``` + +:::info +Skills are plain markdown files stored in `.claude/skills/`. They're loaded on-demand when relevant, created by `/learn`, and shareable across your team via the **Share dashboard**. Skills follow a frontmatter format that describes when they apply. +::: diff --git a/docs/docusaurus/docs/workflows/quick-mode.md b/docs/docusaurus/docs/workflows/quick-mode.md new file mode 100644 index 00000000..170f584b --- /dev/null +++ b/docs/docusaurus/docs/workflows/quick-mode.md @@ -0,0 +1,32 @@ +--- +sidebar_position: 3 +title: Quick Mode +description: Direct execution — no plan file, no approval gate +--- + +# Quick Mode + +Direct execution — no plan file, no approval gate. + +Quick mode is the default interaction model. Just describe your task and Pilot gets it done — no spec file, no approval step, no directory scaffolding. Zero overhead on simple tasks. All quality guardrails still apply — hooks, TDD, type checking — but nothing slows down the interaction. When you need a plan, use `/spec` — not Claude Code's built-in plan mode (Shift+Tab). + +```bash +$ pilot +> Add a loading spinner to the submit button +> Write tests for the OrderService class +> Explain how the auth middleware works +> Rename the "products" table to "items" across the codebase +``` + +## Quality Guardrails Active in Quick Mode + +- Quality hooks — auto-format, lint, type-check on every file edit +- TDD enforcement — write failing tests before implementation +- Context preservation across auto-compaction cycles +- Persistent memory for recalling past decisions and context +- MCP servers (lib-docs, mem-search, web-search, grep-mcp, web-fetch) +- Language servers — real-time diagnostics and go-to-definition + +:::tip When to use /spec instead +Use `/spec` for bug fixes (root cause investigation with test-before-fix), complex features that need a plan before implementation, or refactors with many interdependent changes. +::: diff --git a/docs/docusaurus/docs/workflows/spec.md b/docs/docusaurus/docs/workflows/spec.md new file mode 100644 index 00000000..c38772ec --- /dev/null +++ b/docs/docusaurus/docs/workflows/spec.md @@ -0,0 +1,73 @@ +--- +sidebar_position: 2 +title: /spec — Spec-Driven Development +description: Plan, implement, and verify complex features with full automation +--- + +# /spec — Spec-Driven Development + +Plan, implement, and verify complex features with full automation. + +**Replaces Claude Code's built-in plan mode (Shift+Tab).** Best for complex features, refactoring tasks, or any work where you want to review a plan before implementation begins. The structured workflow prevents scope creep and ensures every task is tested and verified before being marked complete. + +```bash +$ pilot +> /spec "Add user authentication with OAuth and JWT tokens" +> /spec "Migrate the REST API to GraphQL" +> /spec "Fix the crash when deleting nodes with two children" # bugfix auto-detected +``` + +## Workflow + +``` +Discuss → Plan → Approve → Implement → Verify → Done +``` + +The only manual step is **Approve**. Everything else runs automatically. The Verify → Implement feedback loop repeats until all checks pass, then prompts for squash merge. + +## Spec Types + +### Feature Spec + +Full exploration workflow for new functionality, refactoring, or any work where architecture decisions matter. + +- Codebase exploration with Probe semantic search +- Architecture design decisions via Q&A +- Full plan with scope, risks, and Definition of Done +- Unified verification agent (optional, configurable in Console Settings) + +### Bugfix Spec (auto-detected) + +Investigation-first flow for targeted fixes. Finds the root cause before touching any code. + +- Root cause tracing: backward through call chain to `file:line` +- Pattern analysis: compare broken vs working code paths +- Test-before-fix: regression test FAILS → fix → all tests PASS +- Lightweight verify: regression test + full suite, no sub-agents + +## Three Phases + +### Plan Phase + +- Explores codebase with semantic search, asks clarifying questions +- Writes detailed spec with scope, tasks, and definition of done +- Plan-reviewer sub-agent validates completeness (optional, enabled by default) +- Waits for your approval — edit the plan directly before accepting + +### Implement Phase + +- Isolated git worktree on a dedicated branch (optional) +- Strict TDD for each task: RED → GREEN → REFACTOR +- Quality hooks auto-lint, format, and type-check every edit +- Full test suite after each task to catch regressions early + +### Verify Phase + +- Full test suite + type checking + lint + build verification +- Features: unified review sub-agent (optional, enabled by default) +- Bugfixes: regression test + full suite — no sub-agents needed +- Auto-fixes findings, loops back until all checks pass + +## Worktree Isolation (Optional) + +When starting a `/spec` task, you can choose to work in an isolated git worktree. All implementation happens on a dedicated branch — `main` stays clean throughout. Pilot auto-stashes any uncommitted changes before creating the worktree and restores them after. After verification passes, choose to squash merge back. If the experiment doesn't work out, discard the worktree with no cleanup required. diff --git a/docs/docusaurus/docs/workflows/sync.md b/docs/docusaurus/docs/workflows/sync.md new file mode 100644 index 00000000..b5c3920f --- /dev/null +++ b/docs/docusaurus/docs/workflows/sync.md @@ -0,0 +1,44 @@ +--- +sidebar_position: 1 +title: /sync — Codebase Sync +description: Learn your existing codebase and sync rules with it +--- + +# /sync — Codebase Sync + +Learn your existing codebase and sync rules with it. + +Run `/sync` to explore your project structure, discover your conventions and undocumented patterns, update project documentation, and create new custom skills. This is how Pilot adapts to your project — not the other way around. Run it once initially, then any time your codebase changes significantly. + +```bash +$ pilot +> /sync +``` + +## What /sync Does + +13 phases (zero-indexed): + +| Phase | Action | +|-------|--------| +| 0 | Load reference guidelines, recommended directory structure, error handling | +| 1 | Read existing rules (including nested subdirectories), detect structure and path-scoping | +| 2 | Migrate unscoped assets to `{slug}`-prefixed names | +| 3 | Quality audit against best practices (size, specificity, path-scoping enforcement) | +| 4 | Explore codebase with Probe CLI/Grep to find patterns | +| 5 | Compare discovered vs documented patterns | +| 6 | Sync project rule, nested directories, and generate rules README | +| 7 | Sync MCP server documentation | +| 8 | Update existing custom skills that have changed | +| 9 | Discover new rules, place in correct directory by scope | +| 10 | Create new skills via `/learn` command | +| 11 | Cross-check: validate references, README, path-scoping | +| 12 | Report summary of all changes made | + +## When to Run /sync + +- After installing Pilot in a new project +- After making significant architectural changes +- When adding new MCP servers to `.mcp.json` +- Before starting a complex `/spec` task on an unfamiliar codebase +- After onboarding to a project you didn't write diff --git a/docs/docusaurus/docusaurus.config.ts b/docs/docusaurus/docusaurus.config.ts new file mode 100644 index 00000000..804be718 --- /dev/null +++ b/docs/docusaurus/docusaurus.config.ts @@ -0,0 +1,119 @@ +import { themes as prismThemes } from "prism-react-renderer"; +import type { Config } from "@docusaurus/types"; +import type * as Preset from "@docusaurus/preset-classic"; + +const config: Config = { + title: "Pilot Shell", + tagline: "The professional development environment for Claude Code", + favicon: "img/favicon.png", + + url: "https://pilot-shell.com", + baseUrl: "/", + + organizationName: "maxritter", + projectName: "pilot-shell", + + onBrokenLinks: "warn", + + markdown: { + format: "md", + hooks: { + onBrokenMarkdownLinks: "warn", + }, + }, + + i18n: { + defaultLocale: "en", + locales: ["en"], + }, + + themes: ["@easyops-cn/docusaurus-search-local"], + + presets: [ + [ + "classic", + { + docs: { + routeBasePath: "docs", + sidebarPath: "./sidebars.ts", + editUrl: + "https://github.com/maxritter/pilot-shell/tree/main/docs/docusaurus/", + }, + blog: false, + theme: { + customCss: "./src/css/custom.css", + }, + } satisfies Preset.Options, + ], + ], + + themeConfig: { + colorMode: { + defaultMode: "dark", + disableSwitch: false, + respectPrefersColorScheme: true, + }, + navbar: { + title: "Pilot Shell", + logo: { + alt: "Pilot Shell Logo", + src: "img/favicon.png", + href: "/docs/", + }, + items: [ + { + type: "docSidebar", + sidebarId: "docsSidebar", + position: "left", + label: "Docs", + }, + { + href: "https://pilot-shell.com", + label: "Home", + position: "right", + }, + { + href: "https://github.com/maxritter/pilot-shell", + label: "GitHub", + position: "right", + }, + ], + }, + footer: { + style: "dark", + links: [ + { + title: "Docs", + items: [ + { label: "Getting Started", to: "/docs/getting-started/prerequisites" }, + { label: "Workflows", to: "/docs/workflows/sync" }, + { label: "Features", to: "/docs/features/share" }, + ], + }, + { + title: "Community", + items: [ + { + label: "GitHub", + href: "https://github.com/maxritter/pilot-shell", + }, + ], + }, + { + title: "More", + items: [ + { label: "Home", href: "https://pilot-shell.com" }, + ], + }, + ], + copyright: `Copyright ${new Date().getFullYear()} Pilot Shell. Built with Docusaurus.`, + }, + prism: { + theme: prismThemes.github, + darkTheme: prismThemes.dracula, + additionalLanguages: ["bash", "json", "python", "toml"], + }, + } satisfies Preset.ThemeConfig, +}; + +export default config; diff --git a/docs/docusaurus/package-lock.json b/docs/docusaurus/package-lock.json new file mode 100644 index 00000000..e8018544 --- /dev/null +++ b/docs/docusaurus/package-lock.json @@ -0,0 +1,18991 @@ +{ + "name": "pilot-shell-docs", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "pilot-shell-docs", + "version": "0.0.0", + "dependencies": { + "@docusaurus/core": "3.9.2", + "@docusaurus/preset-classic": "3.9.2", + "@easyops-cn/docusaurus-search-local": "^0.55.1", + "@mdx-js/react": "^3.0.0", + "clsx": "^2.0.0", + "prism-react-renderer": "^2.3.0", + "react": "^18.0.0", + "react-dom": "^18.0.0" + }, + "devDependencies": { + "@docusaurus/module-type-aliases": "3.9.2", + "@docusaurus/tsconfig": "3.9.2", + "@docusaurus/types": "3.9.2", + "typescript": "~5.6.0" + }, + "engines": { + "node": ">=18.0" + } + }, + "node_modules/@algolia/abtesting": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.15.2.tgz", + "integrity": "sha512-rF7vRVE61E0QORw8e2NNdnttcl3jmFMWS9B4hhdga12COe+lMa26bQLfcBn/Nbp9/AF/8gXdaRCPsVns3CnjsA==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.49.2", + "@algolia/requester-browser-xhr": "5.49.2", + "@algolia/requester-fetch": "5.49.2", + "@algolia/requester-node-http": "5.49.2" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/autocomplete-core": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.19.2.tgz", + "integrity": "sha512-mKv7RyuAzXvwmq+0XRK8HqZXt9iZ5Kkm2huLjgn5JoCPtDy+oh9yxUMfDDaVCw0oyzZ1isdJBc7l9nuCyyR7Nw==", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-plugin-algolia-insights": "1.19.2", + "@algolia/autocomplete-shared": "1.19.2" + } + }, + "node_modules/@algolia/autocomplete-plugin-algolia-insights": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.19.2.tgz", + "integrity": "sha512-TjxbcC/r4vwmnZaPwrHtkXNeqvlpdyR+oR9Wi2XyfORkiGkLTVhX2j+O9SaCCINbKoDfc+c2PB8NjfOnz7+oKg==", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-shared": "1.19.2" + }, + "peerDependencies": { + "search-insights": ">= 1 < 3" + } + }, + "node_modules/@algolia/autocomplete-shared": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.19.2.tgz", + "integrity": "sha512-jEazxZTVD2nLrC+wYlVHQgpBoBB5KPStrJxLzsIFl6Kqd1AlG9sIAGl39V5tECLpIQzB3Qa2T6ZPJ1ChkwMK/w==", + "license": "MIT", + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/client-abtesting": { + "version": "5.49.2", + "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.49.2.tgz", + "integrity": "sha512-XyvKCm0RRmovMI/ChaAVjTwpZhXdbgt3iZofK914HeEHLqD1MUFFVLz7M0+Ou7F56UkHXwRbpHwb9xBDNopprQ==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.49.2", + "@algolia/requester-browser-xhr": "5.49.2", + "@algolia/requester-fetch": "5.49.2", + "@algolia/requester-node-http": "5.49.2" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-analytics": { + "version": "5.49.2", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.49.2.tgz", + "integrity": "sha512-jq/3qvtmj3NijZlhq7A1B0Cl41GfaBpjJxcwukGsYds6aMSCWrEAJ9pUqw/C9B3hAmILYKl7Ljz3N9SFvekD3Q==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.49.2", + "@algolia/requester-browser-xhr": "5.49.2", + "@algolia/requester-fetch": "5.49.2", + "@algolia/requester-node-http": "5.49.2" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-common": { + "version": "5.49.2", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.49.2.tgz", + "integrity": "sha512-bn0biLequn3epobCfjUqCxlIlurLr4RHu7RaE4trgN+RDcUq6HCVC3/yqq1hwbNYpVtulnTOJzcaxYlSr1fnuw==", + "license": "MIT", + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-insights": { + "version": "5.49.2", + "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.49.2.tgz", + "integrity": "sha512-z14wfFs1T3eeYbCArC8pvntAWsPo9f6hnUGoj8IoRUJTwgJiiySECkm8bmmV47/x0oGHfsVn3kBdjMX0yq0sNA==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.49.2", + "@algolia/requester-browser-xhr": "5.49.2", + "@algolia/requester-fetch": "5.49.2", + "@algolia/requester-node-http": "5.49.2" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-personalization": { + "version": "5.49.2", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.49.2.tgz", + "integrity": "sha512-GpRf7yuuAX93+Qt0JGEJZwgtL0MFdjFO9n7dn8s2pA9mTjzl0Sc5+uTk1VPbIAuf7xhCP9Mve+URGb6J+EYxgA==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.49.2", + "@algolia/requester-browser-xhr": "5.49.2", + "@algolia/requester-fetch": "5.49.2", + "@algolia/requester-node-http": "5.49.2" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-query-suggestions": { + "version": "5.49.2", + "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.49.2.tgz", + "integrity": "sha512-HZwApmNkp0DiAjZcLYdQLddcG4Agb88OkojiAHGgcm5DVXobT5uSZ9lmyrbw/tmQBJwgu2CNw4zTyXoIB7YbPA==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.49.2", + "@algolia/requester-browser-xhr": "5.49.2", + "@algolia/requester-fetch": "5.49.2", + "@algolia/requester-node-http": "5.49.2" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-search": { + "version": "5.49.2", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.49.2.tgz", + "integrity": "sha512-y1IOpG6OSmTpGg/CT0YBb/EAhR2nsC18QWp9Jy8HO9iGySpcwaTvs5kHa17daP3BMTwWyaX9/1tDTDQshZzXdg==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.49.2", + "@algolia/requester-browser-xhr": "5.49.2", + "@algolia/requester-fetch": "5.49.2", + "@algolia/requester-node-http": "5.49.2" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/events": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@algolia/events/-/events-4.0.1.tgz", + "integrity": "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==", + "license": "MIT" + }, + "node_modules/@algolia/ingestion": { + "version": "1.49.2", + "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.49.2.tgz", + "integrity": "sha512-YYJRjaZ2bqk923HxE4um7j/Cm3/xoSkF2HC2ZweOF8cXL3sqnlndSUYmCaxHFjNPWLaSHk2IfssX6J/tdKTULw==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.49.2", + "@algolia/requester-browser-xhr": "5.49.2", + "@algolia/requester-fetch": "5.49.2", + "@algolia/requester-node-http": "5.49.2" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/monitoring": { + "version": "1.49.2", + "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.49.2.tgz", + "integrity": "sha512-9WgH+Dha39EQQyGKCHlGYnxW/7W19DIrEbCEbnzwAMpGAv1yTWCHMPXHxYa+LcL3eCp2V/5idD1zHNlIKmHRHg==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.49.2", + "@algolia/requester-browser-xhr": "5.49.2", + "@algolia/requester-fetch": "5.49.2", + "@algolia/requester-node-http": "5.49.2" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/recommend": { + "version": "5.49.2", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.49.2.tgz", + "integrity": "sha512-K7Gp5u+JtVYgaVpBxF5rGiM+Ia8SsMdcAJMTDV93rwh00DKNllC19o1g+PwrDjDvyXNrnTEbofzbTs2GLfFyKA==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.49.2", + "@algolia/requester-browser-xhr": "5.49.2", + "@algolia/requester-fetch": "5.49.2", + "@algolia/requester-node-http": "5.49.2" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-browser-xhr": { + "version": "5.49.2", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.49.2.tgz", + "integrity": "sha512-3UhYCcWX6fbtN8ABcxZlhaQEwXFh3CsFtARyyadQShHMPe3mJV9Wel4FpJTa+seugRkbezFz0tt6aPTZSYTBuA==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.49.2" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-fetch": { + "version": "5.49.2", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.49.2.tgz", + "integrity": "sha512-G94VKSGbsr+WjsDDOBe5QDQ82QYgxvpxRGJfCHZBnYKYsy/jv9qGIDb93biza+LJWizQBUtDj7bZzp3QZyzhPQ==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.49.2" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-node-http": { + "version": "5.49.2", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.49.2.tgz", + "integrity": "sha512-UuihBGHafG/ENsrcTGAn5rsOffrCIRuHMOsD85fZGLEY92ate+BMTUqxz60dv5zerh8ZumN4bRm8eW2z9L11jA==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.49.2" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", + "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.3" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.6.tgz", + "integrity": "sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-member-expression-to-functions": "^7.28.5", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/helper-replace-supers": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/traverse": "^7.28.6", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.28.5.tgz", + "integrity": "sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "regexpu-core": "^6.3.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.7", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.7.tgz", + "integrity": "sha512-6Fqi8MtQ/PweQ9xvux65emkLQ83uB+qAVtfHkC9UodyHMIZdxNI01HjLCLUtybElp2KY2XNE0nOgyP1E1vXw9w==", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "debug": "^4.4.3", + "lodash.debounce": "^4.0.8", + "resolve": "^1.22.11" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz", + "integrity": "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", + "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz", + "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-wrap-function": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.28.6.tgz", + "integrity": "sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==", + "license": "MIT", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.28.5", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", + "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.6.tgz", + "integrity": "sha512-z+PwLziMNBeSQJonizz2AGnndLsP2DeGHIxDAn+wdHOGuo4Fo1x1HBPPXeE9TAOPHNNWQKCSlA2VZyYyyibDnQ==", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz", + "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz", + "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.28.5.tgz", + "integrity": "sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz", + "integrity": "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz", + "integrity": "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz", + "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.6.tgz", + "integrity": "sha512-a0aBScVTlNaiUe35UtfxAN7A/tehvvG4/ByO6+46VPKTRSlfnAFsgKy0FUh+qAkQrDTmhDkT+IBOKlOoMUxQ0g==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.28.6.tgz", + "integrity": "sha512-pSJUpFHdx9z5nqTSirOCMtYVP2wFgoWhP0p3g8ONK/4IHhLIBd0B9NYqAvIUAhq+OkhO4VM1tENCt0cjlsNShw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz", + "integrity": "sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.28.6.tgz", + "integrity": "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.28.6.tgz", + "integrity": "sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", + "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.29.0.tgz", + "integrity": "sha512-va0VdWro4zlBr2JsXC+ofCPB2iG12wPtVGTWFx2WLDOM3nYQZZIGP82qku2eW/JR83sD+k2k+CsNtyEbUqhU6w==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-remap-async-to-generator": "^7.27.1", + "@babel/traverse": "^7.29.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.28.6.tgz", + "integrity": "sha512-ilTRcmbuXjsMmcZ3HASTe4caH5Tpo93PkTxF9oG2VZsSWsahydmcEHhix9Ik122RcTnZnUzPbmux4wh1swfv7g==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-remap-async-to-generator": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz", + "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.6.tgz", + "integrity": "sha512-tt/7wOtBmwHPNMPu7ax4pdPz6shjFrmHDghvNC+FG9Qvj7D6mJcoRQIF5dy4njmxR941l6rgtvfSB2zX3VlUIw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.28.6.tgz", + "integrity": "sha512-dY2wS3I2G7D697VHndN91TJr8/AAfXQNt5ynCTI/MpxMsSzHp+52uNivYT5wCPax3whc47DR8Ba7cmlQMg24bw==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.6.tgz", + "integrity": "sha512-rfQ++ghVwTWTqQ7w8qyDxL1XGihjBss4CmTgGRCTAC9RIbhVpyp4fOeZtta0Lbf+dTNIVJer6ych2ibHwkZqsQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.6.tgz", + "integrity": "sha512-EF5KONAqC5zAqT783iMGuM2ZtmEBy+mJMOKl2BCvPZ2lVrwvXnB6o+OBWCS+CoeCCpVRF2sA2RBKUxvT8tQT5Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-globals": "^7.28.0", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-replace-supers": "^7.28.6", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.28.6.tgz", + "integrity": "sha512-bcc3k0ijhHbc2lEfpFHgx7eYw9KNXqOerKWfzbxEHUGKnS3sz9C4CNL9OiFN1297bDNfUiSO7DaLzbvHQQQ1BQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/template": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.5.tgz", + "integrity": "sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.28.6.tgz", + "integrity": "sha512-SljjowuNKB7q5Oayv4FoPzeB74g3QgLt8IVJw9ADvWy3QnUb/01aw8I4AVv8wYnPvQz2GDDZ/g3GhcNyDBI4Bg==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz", + "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.29.0.tgz", + "integrity": "sha512-zBPcW2lFGxdiD8PUnPwJjag2J9otbcLQzvbiOzDxpYXyCuYX9agOwMPGn1prVH0a4qzhCKu24rlH4c1f7yA8rw==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz", + "integrity": "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-explicit-resource-management": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.6.tgz", + "integrity": "sha512-Iao5Konzx2b6g7EPqTy40UZbcdXE126tTxVFr/nAIj+WItNxjKSYTEw3RC+A2/ZetmdJsgueL1KhaMCQHkLPIg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-transform-destructuring": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.28.6.tgz", + "integrity": "sha512-WitabqiGjV/vJ0aPOLSFfNY1u9U3R7W36B03r5I2KoNix+a3sOhJ3pKFB3R5It9/UiK78NiO0KE9P21cMhlPkw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz", + "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", + "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", + "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.28.6.tgz", + "integrity": "sha512-Nr+hEN+0geQkzhbdgQVPoqr47lZbm+5fCUmO70722xJZd0Mvb59+33QLImGj6F+DkK3xgDi1YVysP8whD6FQAw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", + "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.28.6.tgz", + "integrity": "sha512-+anKKair6gpi8VsM/95kmomGNMD0eLz1NQ8+Pfw5sAwWH9fGYXT50E55ZpV0pHUHWf6IUTWPM+f/7AAff+wr9A==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz", + "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz", + "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.28.6.tgz", + "integrity": "sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.29.0.tgz", + "integrity": "sha512-PrujnVFbOdUpw4UHiVwKvKRLMMic8+eC0CuNlxjsyZUiBjhFdPsewdXCkveh2KqBA9/waD0W1b4hXSOBQJezpQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.29.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz", + "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.29.0.tgz", + "integrity": "sha512-1CZQA5KNAD6ZYQLPw7oi5ewtDNxH/2vuCh+6SmvgDfhumForvs8a1o9n0UrEoBD8HU4djO2yWngTQlXl1NDVEQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz", + "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.28.6.tgz", + "integrity": "sha512-3wKbRgmzYbw24mDJXT7N+ADXw8BC/imU9yo9c9X9NKaLF1fW+e5H1U5QjMUBe4Qo4Ox/o++IyUkl1sVCLgevKg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.28.6.tgz", + "integrity": "sha512-SJR8hPynj8outz+SlStQSwvziMN4+Bq99it4tMIf5/Caq+3iOc0JtKyse8puvyXkk3eFRIA5ID/XfunGgO5i6w==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.6.tgz", + "integrity": "sha512-5rh+JR4JBC4pGkXLAcYdLHZjXudVxWMXbB6u6+E9lRL5TrGVbHt1TjxGbZ8CkmYw9zjkB7jutzOROArsqtncEA==", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-transform-destructuring": "^7.28.5", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz", + "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.28.6.tgz", + "integrity": "sha512-R8ja/Pyrv0OGAvAXQhSTmWyPJPml+0TMqXlO5w+AsMEiwb2fg3WkOvob7UxFSL3OIttFSGSRFKQsOhJ/X6HQdQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.6.tgz", + "integrity": "sha512-A4zobikRGJTsX9uqVFdafzGkqD30t26ck2LmOzAuLL8b2x6k3TIqRiT2xVvA9fNmFeTX484VpsdgmKNA0bS23w==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.27.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz", + "integrity": "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.28.6.tgz", + "integrity": "sha512-piiuapX9CRv7+0st8lmuUlRSmX6mBcVeNQ1b4AYzJxfCMuBfB0vBXDiGSmm03pKJw1v6cZ8KSeM+oUnM6yAExg==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.28.6.tgz", + "integrity": "sha512-b97jvNSOb5+ehyQmBpmhOCiUC5oVK4PMnpRvO7+ymFBoqYjeDHIU9jnrNUuwHOiL9RpGDoKBpSViarV+BU+eVA==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz", + "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-constant-elements": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.27.1.tgz", + "integrity": "sha512-edoidOjl/ZxvYo4lSBOQGDSyToYVkTAwyVoa2tkuYTSmjrB1+uAedoL5iROVLXkxH+vRgA7uP4tMg2pUJpZ3Ug==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.28.0.tgz", + "integrity": "sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.28.6.tgz", + "integrity": "sha512-61bxqhiRfAACulXSLd/GxqmAedUSrRZIu/cbaT18T1CetkTmtDN15it7i80ru4DVqRK1WMxQhXs+Lf9kajm5Ow==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-syntax-jsx": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.27.1.tgz", + "integrity": "sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==", + "license": "MIT", + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.27.1.tgz", + "integrity": "sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.29.0.tgz", + "integrity": "sha512-FijqlqMA7DmRdg/aINBSs04y8XNTYw/lr1gJ2WsmBnnaNw1iS43EPkJW+zK7z65auG3AWRFXWj+NcTQwYptUog==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.28.6.tgz", + "integrity": "sha512-QGWAepm9qxpaIs7UM9FvUSnCGlb8Ua1RhyM4/veAxLwt3gMat/LSGrZixyuj4I6+Kn9iwvqCyPTtbdxanYoWYg==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz", + "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.29.0.tgz", + "integrity": "sha512-jlaRT5dJtMaMCV6fAuLbsQMSwz/QkvaHOHOSXRitGGwSpR1blCY4KUKoyP2tYO8vJcqYe8cEj96cqSztv3uF9w==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "babel-plugin-polyfill-corejs2": "^0.4.14", + "babel-plugin-polyfill-corejs3": "^0.13.0", + "babel-plugin-polyfill-regenerator": "^0.6.5", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", + "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.28.6.tgz", + "integrity": "sha512-9U4QObUC0FtJl05AsUcodau/RWDytrU6uKgkxu09mLR9HLDAtUMoPuuskm5huQsoktmsYpI+bGmq+iapDcriKA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", + "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", + "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz", + "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.6.tgz", + "integrity": "sha512-0YWL2RFxOqEm9Efk5PvreamxPME8OyY0wM5wh5lHjF+VtVhdneCWGzZeSqzOfiobVqQaNCd2z0tQvnI9DaPWPw==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz", + "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.28.6.tgz", + "integrity": "sha512-4Wlbdl/sIZjzi/8St0evF0gEZrgOswVO6aOzqxh1kDZOl9WmLrHq2HtGhnOJZmHZYKP8WZ1MDLCt5DAWwRo57A==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz", + "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.28.6.tgz", + "integrity": "sha512-/wHc/paTUmsDYN7SZkpWxogTOBNnlx7nBQYfy6JJlCT7G3mVhltk3e++N7zV0XfgGsrqBxd4rJQt9H16I21Y1Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.29.0.tgz", + "integrity": "sha512-fNEdfc0yi16lt6IZo2Qxk3knHVdfMYX33czNb4v8yWhemoBhibCpQK/uYHtSKIiO+p/zd3+8fYVXhQdOVV608w==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.28.5", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.6", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-import-assertions": "^7.28.6", + "@babel/plugin-syntax-import-attributes": "^7.28.6", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.27.1", + "@babel/plugin-transform-async-generator-functions": "^7.29.0", + "@babel/plugin-transform-async-to-generator": "^7.28.6", + "@babel/plugin-transform-block-scoped-functions": "^7.27.1", + "@babel/plugin-transform-block-scoping": "^7.28.6", + "@babel/plugin-transform-class-properties": "^7.28.6", + "@babel/plugin-transform-class-static-block": "^7.28.6", + "@babel/plugin-transform-classes": "^7.28.6", + "@babel/plugin-transform-computed-properties": "^7.28.6", + "@babel/plugin-transform-destructuring": "^7.28.5", + "@babel/plugin-transform-dotall-regex": "^7.28.6", + "@babel/plugin-transform-duplicate-keys": "^7.27.1", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.29.0", + "@babel/plugin-transform-dynamic-import": "^7.27.1", + "@babel/plugin-transform-explicit-resource-management": "^7.28.6", + "@babel/plugin-transform-exponentiation-operator": "^7.28.6", + "@babel/plugin-transform-export-namespace-from": "^7.27.1", + "@babel/plugin-transform-for-of": "^7.27.1", + "@babel/plugin-transform-function-name": "^7.27.1", + "@babel/plugin-transform-json-strings": "^7.28.6", + "@babel/plugin-transform-literals": "^7.27.1", + "@babel/plugin-transform-logical-assignment-operators": "^7.28.6", + "@babel/plugin-transform-member-expression-literals": "^7.27.1", + "@babel/plugin-transform-modules-amd": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.28.6", + "@babel/plugin-transform-modules-systemjs": "^7.29.0", + "@babel/plugin-transform-modules-umd": "^7.27.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.29.0", + "@babel/plugin-transform-new-target": "^7.27.1", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.28.6", + "@babel/plugin-transform-numeric-separator": "^7.28.6", + "@babel/plugin-transform-object-rest-spread": "^7.28.6", + "@babel/plugin-transform-object-super": "^7.27.1", + "@babel/plugin-transform-optional-catch-binding": "^7.28.6", + "@babel/plugin-transform-optional-chaining": "^7.28.6", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/plugin-transform-private-methods": "^7.28.6", + "@babel/plugin-transform-private-property-in-object": "^7.28.6", + "@babel/plugin-transform-property-literals": "^7.27.1", + "@babel/plugin-transform-regenerator": "^7.29.0", + "@babel/plugin-transform-regexp-modifiers": "^7.28.6", + "@babel/plugin-transform-reserved-words": "^7.27.1", + "@babel/plugin-transform-shorthand-properties": "^7.27.1", + "@babel/plugin-transform-spread": "^7.28.6", + "@babel/plugin-transform-sticky-regex": "^7.27.1", + "@babel/plugin-transform-template-literals": "^7.27.1", + "@babel/plugin-transform-typeof-symbol": "^7.27.1", + "@babel/plugin-transform-unicode-escapes": "^7.27.1", + "@babel/plugin-transform-unicode-property-regex": "^7.28.6", + "@babel/plugin-transform-unicode-regex": "^7.27.1", + "@babel/plugin-transform-unicode-sets-regex": "^7.28.6", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.15", + "babel-plugin-polyfill-corejs3": "^0.14.0", + "babel-plugin-polyfill-regenerator": "^0.6.6", + "core-js-compat": "^3.48.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.14.1.tgz", + "integrity": "sha512-ENp89vM9Pw4kv/koBb5N2f9bDZsR0hpf3BdPMOg/pkS3pwO4dzNnQZVXtBbeyAadgm865DmQG2jMMLqmZXvuCw==", + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.7", + "core-js-compat": "^3.48.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-react": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.28.5.tgz", + "integrity": "sha512-Z3J8vhRq7CeLjdC58jLv4lnZ5RKFUJWqH5emvxmv9Hv3BD1T9R/Im713R4MTKwvFaV74ejZ3sM01LyEKk4ugNQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-transform-react-display-name": "^7.28.0", + "@babel/plugin-transform-react-jsx": "^7.27.1", + "@babel/plugin-transform-react-jsx-development": "^7.27.1", + "@babel/plugin-transform-react-pure-annotations": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.28.5.tgz", + "integrity": "sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-typescript": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.6.tgz", + "integrity": "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/runtime-corejs3": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.29.0.tgz", + "integrity": "sha512-TgUkdp71C9pIbBcHudc+gXZnihEDOjUAmXO1VO4HHGES7QLZcShR0stfKIxLSNIYx2fqhmJChOjm/wkF8wv4gA==", + "license": "MIT", + "dependencies": { + "core-js-pure": "^3.48.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@csstools/cascade-layer-name-parser": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-2.0.5.tgz", + "integrity": "sha512-p1ko5eHgV+MgXFVa4STPKpvPxr6ReS8oS2jzTukjR74i5zJNyWO1ZM1m8YKBXnzDKWfBN1ztLYlHxbVemDD88A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/color-helpers": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz", + "integrity": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/css-calc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz", + "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-color-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz", + "integrity": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/color-helpers": "^5.1.0", + "@csstools/css-calc": "^2.1.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", + "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/media-query-list-parser": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.3.tgz", + "integrity": "sha512-HAYH7d3TLRHDOUQK4mZKf9k9Ph/m8Akstg66ywKR4SFAigjs3yBiUeZtFxywiTm5moZMAp/5W/ZuFnNXXYLuuQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/postcss-alpha-function": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-alpha-function/-/postcss-alpha-function-1.0.1.tgz", + "integrity": "sha512-isfLLwksH3yHkFXfCI2Gcaqg7wGGHZZwunoJzEZk0yKYIokgre6hYVFibKL3SYAoR1kBXova8LB+JoO5vZzi9w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-cascade-layers": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-5.0.2.tgz", + "integrity": "sha512-nWBE08nhO8uWl6kSAeCx4im7QfVko3zLrtgWZY4/bP87zrSPpSyN/3W3TDqz1jJuH+kbKOHXg5rJnK+ZVYcFFg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-cascade-layers/node_modules/@csstools/selector-specificity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/@csstools/postcss-cascade-layers/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@csstools/postcss-color-function": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-4.0.12.tgz", + "integrity": "sha512-yx3cljQKRaSBc2hfh8rMZFZzChaFgwmO2JfFgFr1vMcF3C/uyy5I4RFIBOIWGq1D+XbKCG789CGkG6zzkLpagA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-color-function-display-p3-linear": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function-display-p3-linear/-/postcss-color-function-display-p3-linear-1.0.1.tgz", + "integrity": "sha512-E5qusdzhlmO1TztYzDIi8XPdPoYOjoTY6HBYBCYSj+Gn4gQRBlvjgPQXzfzuPQqt8EhkC/SzPKObg4Mbn8/xMg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-color-mix-function": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-3.0.12.tgz", + "integrity": "sha512-4STERZfCP5Jcs13P1U5pTvI9SkgLgfMUMhdXW8IlJWkzOOOqhZIjcNhWtNJZes2nkBDsIKJ0CJtFtuaZ00moag==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-color-mix-variadic-function-arguments": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-variadic-function-arguments/-/postcss-color-mix-variadic-function-arguments-1.0.2.tgz", + "integrity": "sha512-rM67Gp9lRAkTo+X31DUqMEq+iK+EFqsidfecmhrteErxJZb6tUoJBVQca1Vn1GpDql1s1rD1pKcuYzMsg7Z1KQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-content-alt-text": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@csstools/postcss-content-alt-text/-/postcss-content-alt-text-2.0.8.tgz", + "integrity": "sha512-9SfEW9QCxEpTlNMnpSqFaHyzsiRpZ5J5+KqCu1u5/eEJAWsMhzT40qf0FIbeeglEvrGRMdDzAxMIz3wqoGSb+Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-contrast-color-function": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-contrast-color-function/-/postcss-contrast-color-function-2.0.12.tgz", + "integrity": "sha512-YbwWckjK3qwKjeYz/CijgcS7WDUCtKTd8ShLztm3/i5dhh4NaqzsbYnhm4bjrpFpnLZ31jVcbK8YL77z3GBPzA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-exponential-functions": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-exponential-functions/-/postcss-exponential-functions-2.0.9.tgz", + "integrity": "sha512-abg2W/PI3HXwS/CZshSa79kNWNZHdJPMBXeZNyPQFbbj8sKO3jXxOt/wF7juJVjyDTc6JrvaUZYFcSBZBhaxjw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-font-format-keywords": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-4.0.0.tgz", + "integrity": "sha512-usBzw9aCRDvchpok6C+4TXC57btc4bJtmKQWOHQxOVKen1ZfVqBUuCZ/wuqdX5GHsD0NRSr9XTP+5ID1ZZQBXw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-gamut-mapping": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@csstools/postcss-gamut-mapping/-/postcss-gamut-mapping-2.0.11.tgz", + "integrity": "sha512-fCpCUgZNE2piVJKC76zFsgVW1apF6dpYsqGyH8SIeCcM4pTEsRTWTLCaJIMKFEundsCKwY1rwfhtrio04RJ4Dw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-gradients-interpolation-method": { + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-5.0.12.tgz", + "integrity": "sha512-jugzjwkUY0wtNrZlFeyXzimUL3hN4xMvoPnIXxoZqxDvjZRiSh+itgHcVUWzJ2VwD/VAMEgCLvtaJHX+4Vj3Ow==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-hwb-function": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-4.0.12.tgz", + "integrity": "sha512-mL/+88Z53KrE4JdePYFJAQWFrcADEqsLprExCM04GDNgHIztwFzj0Mbhd/yxMBngq0NIlz58VVxjt5abNs1VhA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-ic-unit": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-4.0.4.tgz", + "integrity": "sha512-yQ4VmossuOAql65sCPppVO1yfb7hDscf4GseF0VCA/DTDaBc0Wtf8MTqVPfjGYlT5+2buokG0Gp7y0atYZpwjg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-initial": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-initial/-/postcss-initial-2.0.1.tgz", + "integrity": "sha512-L1wLVMSAZ4wovznquK0xmC7QSctzO4D0Is590bxpGqhqjboLXYA16dWZpfwImkdOgACdQ9PqXsuRroW6qPlEsg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-is-pseudo-class": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-5.0.3.tgz", + "integrity": "sha512-jS/TY4SpG4gszAtIg7Qnf3AS2pjcUM5SzxpApOrlndMeGhIbaTzWBzzP/IApXoNWEW7OhcjkRT48jnAUIFXhAQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-is-pseudo-class/node_modules/@csstools/selector-specificity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/@csstools/postcss-is-pseudo-class/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@csstools/postcss-light-dark-function": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@csstools/postcss-light-dark-function/-/postcss-light-dark-function-2.0.11.tgz", + "integrity": "sha512-fNJcKXJdPM3Lyrbmgw2OBbaioU7yuKZtiXClf4sGdQttitijYlZMD5K7HrC/eF83VRWRrYq6OZ0Lx92leV2LFA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-float-and-clear": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-float-and-clear/-/postcss-logical-float-and-clear-3.0.0.tgz", + "integrity": "sha512-SEmaHMszwakI2rqKRJgE+8rpotFfne1ZS6bZqBoQIicFyV+xT1UF42eORPxJkVJVrH9C0ctUgwMSn3BLOIZldQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-overflow": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-overflow/-/postcss-logical-overflow-2.0.0.tgz", + "integrity": "sha512-spzR1MInxPuXKEX2csMamshR4LRaSZ3UXVaRGjeQxl70ySxOhMpP2252RAFsg8QyyBXBzuVOOdx1+bVO5bPIzA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-overscroll-behavior": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-overscroll-behavior/-/postcss-logical-overscroll-behavior-2.0.0.tgz", + "integrity": "sha512-e/webMjoGOSYfqLunyzByZj5KKe5oyVg/YSbie99VEaSDE2kimFm0q1f6t/6Jo+VVCQ/jbe2Xy+uX+C4xzWs4w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-resize": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-resize/-/postcss-logical-resize-3.0.0.tgz", + "integrity": "sha512-DFbHQOFW/+I+MY4Ycd/QN6Dg4Hcbb50elIJCfnwkRTCX05G11SwViI5BbBlg9iHRl4ytB7pmY5ieAFk3ws7yyg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-viewport-units": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-viewport-units/-/postcss-logical-viewport-units-3.0.4.tgz", + "integrity": "sha512-q+eHV1haXA4w9xBwZLKjVKAWn3W2CMqmpNpZUk5kRprvSiBEGMgrNH3/sJZ8UA3JgyHaOt3jwT9uFa4wLX4EqQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-media-minmax": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-media-minmax/-/postcss-media-minmax-2.0.9.tgz", + "integrity": "sha512-af9Qw3uS3JhYLnCbqtZ9crTvvkR+0Se+bBqSr7ykAnl9yKhk6895z9rf+2F4dClIDJWxgn0iZZ1PSdkhrbs2ig==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/media-query-list-parser": "^4.0.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-media-queries-aspect-ratio-number-values": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/postcss-media-queries-aspect-ratio-number-values/-/postcss-media-queries-aspect-ratio-number-values-3.0.5.tgz", + "integrity": "sha512-zhAe31xaaXOY2Px8IYfoVTB3wglbJUVigGphFLj6exb7cjZRH9A6adyE22XfFK3P2PzwRk0VDeTJmaxpluyrDg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/media-query-list-parser": "^4.0.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-nested-calc": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-4.0.0.tgz", + "integrity": "sha512-jMYDdqrQQxE7k9+KjstC3NbsmC063n1FTPLCgCRS2/qHUbHM0mNy9pIn4QIiQGs9I/Bg98vMqw7mJXBxa0N88A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-normalize-display-values": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.1.tgz", + "integrity": "sha512-TQUGBuRvxdc7TgNSTevYqrL8oItxiwPDixk20qCB5me/W8uF7BPbhRrAvFuhEoywQp/woRsUZ6SJ+sU5idZAIA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-oklab-function": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-4.0.12.tgz", + "integrity": "sha512-HhlSmnE1NKBhXsTnNGjxvhryKtO7tJd1w42DKOGFD6jSHtYOrsJTQDKPMwvOfrzUAk8t7GcpIfRyM7ssqHpFjg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-position-area-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-position-area-property/-/postcss-position-area-property-1.0.0.tgz", + "integrity": "sha512-fUP6KR8qV2NuUZV3Cw8itx0Ep90aRjAZxAEzC3vrl6yjFv+pFsQbR18UuQctEKmA72K9O27CoYiKEgXxkqjg8Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-progressive-custom-properties": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-4.2.1.tgz", + "integrity": "sha512-uPiiXf7IEKtUQXsxu6uWtOlRMXd2QWWy5fhxHDnPdXKCQckPP3E34ZgDoZ62r2iT+UOgWsSbM4NvHE5m3mAEdw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-property-rule-prelude-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-property-rule-prelude-list/-/postcss-property-rule-prelude-list-1.0.0.tgz", + "integrity": "sha512-IxuQjUXq19fobgmSSvUDO7fVwijDJaZMvWQugxfEUxmjBeDCVaDuMpsZ31MsTm5xbnhA+ElDi0+rQ7sQQGisFA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-random-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-random-function/-/postcss-random-function-2.0.1.tgz", + "integrity": "sha512-q+FQaNiRBhnoSNo+GzqGOIBKoHQ43lYz0ICrV+UudfWnEF6ksS6DsBIJSISKQT2Bvu3g4k6r7t0zYrk5pDlo8w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-relative-color-syntax": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-3.0.12.tgz", + "integrity": "sha512-0RLIeONxu/mtxRtf3o41Lq2ghLimw0w9ByLWnnEVuy89exmEEq8bynveBxNW3nyHqLAFEeNtVEmC1QK9MZ8Huw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-scope-pseudo-class": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-scope-pseudo-class/-/postcss-scope-pseudo-class-4.0.1.tgz", + "integrity": "sha512-IMi9FwtH6LMNuLea1bjVMQAsUhFxJnyLSgOp/cpv5hrzWmrUYU5fm0EguNDIIOHUqzXode8F/1qkC/tEo/qN8Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-scope-pseudo-class/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@csstools/postcss-sign-functions": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@csstools/postcss-sign-functions/-/postcss-sign-functions-1.1.4.tgz", + "integrity": "sha512-P97h1XqRPcfcJndFdG95Gv/6ZzxUBBISem0IDqPZ7WMvc/wlO+yU0c5D/OCpZ5TJoTt63Ok3knGk64N+o6L2Pg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-stepped-value-functions": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-4.0.9.tgz", + "integrity": "sha512-h9btycWrsex4dNLeQfyU3y3w40LMQooJWFMm/SK9lrKguHDcFl4VMkncKKoXi2z5rM9YGWbUQABI8BT2UydIcA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-syntax-descriptor-syntax-production": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-syntax-descriptor-syntax-production/-/postcss-syntax-descriptor-syntax-production-1.0.1.tgz", + "integrity": "sha512-GneqQWefjM//f4hJ/Kbox0C6f2T7+pi4/fqTqOFGTL3EjnvOReTqO1qUQ30CaUjkwjYq9qZ41hzarrAxCc4gow==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-system-ui-font-family": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-system-ui-font-family/-/postcss-system-ui-font-family-1.0.0.tgz", + "integrity": "sha512-s3xdBvfWYfoPSBsikDXbuorcMG1nN1M6GdU0qBsGfcmNR0A/qhloQZpTxjA3Xsyrk1VJvwb2pOfiOT3at/DuIQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-text-decoration-shorthand": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-4.0.3.tgz", + "integrity": "sha512-KSkGgZfx0kQjRIYnpsD7X2Om9BUXX/Kii77VBifQW9Ih929hK0KNjVngHDH0bFB9GmfWcR9vJYJJRvw/NQjkrA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/color-helpers": "^5.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-trigonometric-functions": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-4.0.9.tgz", + "integrity": "sha512-Hnh5zJUdpNrJqK9v1/E3BbrQhaDTj5YiX7P61TOvUhoDHnUmsNNxcDAgkQ32RrcWx9GVUvfUNPcUkn8R3vIX6A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-unset-value": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-4.0.0.tgz", + "integrity": "sha512-cBz3tOCI5Fw6NIFEwU3RiwK6mn3nKegjpJuzCndoGq3BZPkUjnsq7uQmIeMNeMbMk7YD2MfKcgCpZwX5jyXqCA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/utilities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@csstools/utilities/-/utilities-2.0.0.tgz", + "integrity": "sha512-5VdOr0Z71u+Yp3ozOx8T11N703wIFGVRgOWbOZMKgglPJsWA54MRIoMNVMa7shUToIhx5J8vX4sOZgD2XiihiQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@docsearch/core": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@docsearch/core/-/core-4.6.0.tgz", + "integrity": "sha512-IqG3oSd529jVRQ4dWZQKwZwQLVd//bWJTz2HiL0LkiHrI4U/vLrBasKB7lwQB/69nBAcCgs3TmudxTZSLH/ZQg==", + "license": "MIT", + "peerDependencies": { + "@types/react": ">= 16.8.0 < 20.0.0", + "react": ">= 16.8.0 < 20.0.0", + "react-dom": ">= 16.8.0 < 20.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/@docsearch/css": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-4.6.0.tgz", + "integrity": "sha512-YlcAimkXclvqta47g47efzCM5CFxDwv2ClkDfEs/fC/Ak0OxPH2b3czwa4o8O1TRBf+ujFF2RiUwszz2fPVNJQ==", + "license": "MIT" + }, + "node_modules/@docsearch/react": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-4.6.0.tgz", + "integrity": "sha512-j8H5B4ArGxBPBWvw3X0J0Rm/Pjv2JDa2rV5OE0DLTp5oiBCptIJ/YlNOhZxuzbO2nwge+o3Z52nJRi3hryK9cA==", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-core": "1.19.2", + "@docsearch/core": "4.6.0", + "@docsearch/css": "4.6.0" + }, + "peerDependencies": { + "@types/react": ">= 16.8.0 < 20.0.0", + "react": ">= 16.8.0 < 20.0.0", + "react-dom": ">= 16.8.0 < 20.0.0", + "search-insights": ">= 1 < 3" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "search-insights": { + "optional": true + } + } + }, + "node_modules/@docusaurus/babel": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/babel/-/babel-3.9.2.tgz", + "integrity": "sha512-GEANdi/SgER+L7Japs25YiGil/AUDnFFHaCGPBbundxoWtCkA2lmy7/tFmgED4y1htAy6Oi4wkJEQdGssnw9MA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.25.9", + "@babel/generator": "^7.25.9", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-transform-runtime": "^7.25.9", + "@babel/preset-env": "^7.25.9", + "@babel/preset-react": "^7.25.9", + "@babel/preset-typescript": "^7.25.9", + "@babel/runtime": "^7.25.9", + "@babel/runtime-corejs3": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@docusaurus/logger": "3.9.2", + "@docusaurus/utils": "3.9.2", + "babel-plugin-dynamic-import-node": "^2.3.3", + "fs-extra": "^11.1.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@docusaurus/bundler": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/bundler/-/bundler-3.9.2.tgz", + "integrity": "sha512-ZOVi6GYgTcsZcUzjblpzk3wH1Fya2VNpd5jtHoCCFcJlMQ1EYXZetfAnRHLcyiFeBABaI1ltTYbOBtH/gahGVA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.25.9", + "@docusaurus/babel": "3.9.2", + "@docusaurus/cssnano-preset": "3.9.2", + "@docusaurus/logger": "3.9.2", + "@docusaurus/types": "3.9.2", + "@docusaurus/utils": "3.9.2", + "babel-loader": "^9.2.1", + "clean-css": "^5.3.3", + "copy-webpack-plugin": "^11.0.0", + "css-loader": "^6.11.0", + "css-minimizer-webpack-plugin": "^5.0.1", + "cssnano": "^6.1.2", + "file-loader": "^6.2.0", + "html-minifier-terser": "^7.2.0", + "mini-css-extract-plugin": "^2.9.2", + "null-loader": "^4.0.1", + "postcss": "^8.5.4", + "postcss-loader": "^7.3.4", + "postcss-preset-env": "^10.2.1", + "terser-webpack-plugin": "^5.3.9", + "tslib": "^2.6.0", + "url-loader": "^4.1.1", + "webpack": "^5.95.0", + "webpackbar": "^6.0.1" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "@docusaurus/faster": "*" + }, + "peerDependenciesMeta": { + "@docusaurus/faster": { + "optional": true + } + } + }, + "node_modules/@docusaurus/core": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.9.2.tgz", + "integrity": "sha512-HbjwKeC+pHUFBfLMNzuSjqFE/58+rLVKmOU3lxQrpsxLBOGosYco/Q0GduBb0/jEMRiyEqjNT/01rRdOMWq5pw==", + "license": "MIT", + "dependencies": { + "@docusaurus/babel": "3.9.2", + "@docusaurus/bundler": "3.9.2", + "@docusaurus/logger": "3.9.2", + "@docusaurus/mdx-loader": "3.9.2", + "@docusaurus/utils": "3.9.2", + "@docusaurus/utils-common": "3.9.2", + "@docusaurus/utils-validation": "3.9.2", + "boxen": "^6.2.1", + "chalk": "^4.1.2", + "chokidar": "^3.5.3", + "cli-table3": "^0.6.3", + "combine-promises": "^1.1.0", + "commander": "^5.1.0", + "core-js": "^3.31.1", + "detect-port": "^1.5.1", + "escape-html": "^1.0.3", + "eta": "^2.2.0", + "eval": "^0.1.8", + "execa": "5.1.1", + "fs-extra": "^11.1.1", + "html-tags": "^3.3.1", + "html-webpack-plugin": "^5.6.0", + "leven": "^3.1.0", + "lodash": "^4.17.21", + "open": "^8.4.0", + "p-map": "^4.0.0", + "prompts": "^2.4.2", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "react-loadable": "npm:@docusaurus/react-loadable@6.0.0", + "react-loadable-ssr-addon-v5-slorber": "^1.0.1", + "react-router": "^5.3.4", + "react-router-config": "^5.1.1", + "react-router-dom": "^5.3.4", + "semver": "^7.5.4", + "serve-handler": "^6.1.6", + "tinypool": "^1.0.2", + "tslib": "^2.6.0", + "update-notifier": "^6.0.2", + "webpack": "^5.95.0", + "webpack-bundle-analyzer": "^4.10.2", + "webpack-dev-server": "^5.2.2", + "webpack-merge": "^6.0.1" + }, + "bin": { + "docusaurus": "bin/docusaurus.mjs" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "@mdx-js/react": "^3.0.0", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/cssnano-preset": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.9.2.tgz", + "integrity": "sha512-8gBKup94aGttRduABsj7bpPFTX7kbwu+xh3K9NMCF5K4bWBqTFYW+REKHF6iBVDHRJ4grZdIPbvkiHd/XNKRMQ==", + "license": "MIT", + "dependencies": { + "cssnano-preset-advanced": "^6.1.2", + "postcss": "^8.5.4", + "postcss-sort-media-queries": "^5.2.0", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@docusaurus/logger": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.9.2.tgz", + "integrity": "sha512-/SVCc57ByARzGSU60c50rMyQlBuMIJCjcsJlkphxY6B0GV4UH3tcA1994N8fFfbJ9kX3jIBe/xg3XP5qBtGDbA==", + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@docusaurus/mdx-loader": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.9.2.tgz", + "integrity": "sha512-wiYoGwF9gdd6rev62xDU8AAM8JuLI/hlwOtCzMmYcspEkzecKrP8J8X+KpYnTlACBUUtXNJpSoCwFWJhLRevzQ==", + "license": "MIT", + "dependencies": { + "@docusaurus/logger": "3.9.2", + "@docusaurus/utils": "3.9.2", + "@docusaurus/utils-validation": "3.9.2", + "@mdx-js/mdx": "^3.0.0", + "@slorber/remark-comment": "^1.0.0", + "escape-html": "^1.0.3", + "estree-util-value-to-estree": "^3.0.1", + "file-loader": "^6.2.0", + "fs-extra": "^11.1.1", + "image-size": "^2.0.2", + "mdast-util-mdx": "^3.0.0", + "mdast-util-to-string": "^4.0.0", + "rehype-raw": "^7.0.0", + "remark-directive": "^3.0.0", + "remark-emoji": "^4.0.0", + "remark-frontmatter": "^5.0.0", + "remark-gfm": "^4.0.0", + "stringify-object": "^3.3.0", + "tslib": "^2.6.0", + "unified": "^11.0.3", + "unist-util-visit": "^5.0.0", + "url-loader": "^4.1.1", + "vfile": "^6.0.1", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/module-type-aliases": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.9.2.tgz", + "integrity": "sha512-8qVe2QA9hVLzvnxP46ysuofJUIc/yYQ82tvA/rBTrnpXtCjNSFLxEZfd5U8cYZuJIVlkPxamsIgwd5tGZXfvew==", + "license": "MIT", + "dependencies": { + "@docusaurus/types": "3.9.2", + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router-config": "*", + "@types/react-router-dom": "*", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "react-loadable": "npm:@docusaurus/react-loadable@6.0.0" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/@docusaurus/plugin-content-blog": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.9.2.tgz", + "integrity": "sha512-3I2HXy3L1QcjLJLGAoTvoBnpOwa6DPUa3Q0dMK19UTY9mhPkKQg/DYhAGTiBUKcTR0f08iw7kLPqOhIgdV3eVQ==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.9.2", + "@docusaurus/logger": "3.9.2", + "@docusaurus/mdx-loader": "3.9.2", + "@docusaurus/theme-common": "3.9.2", + "@docusaurus/types": "3.9.2", + "@docusaurus/utils": "3.9.2", + "@docusaurus/utils-common": "3.9.2", + "@docusaurus/utils-validation": "3.9.2", + "cheerio": "1.0.0-rc.12", + "feed": "^4.2.2", + "fs-extra": "^11.1.1", + "lodash": "^4.17.21", + "schema-dts": "^1.1.2", + "srcset": "^4.0.0", + "tslib": "^2.6.0", + "unist-util-visit": "^5.0.0", + "utility-types": "^3.10.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "@docusaurus/plugin-content-docs": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-docs": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.9.2.tgz", + "integrity": "sha512-C5wZsGuKTY8jEYsqdxhhFOe1ZDjH0uIYJ9T/jebHwkyxqnr4wW0jTkB72OMqNjsoQRcb0JN3PcSeTwFlVgzCZg==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.9.2", + "@docusaurus/logger": "3.9.2", + "@docusaurus/mdx-loader": "3.9.2", + "@docusaurus/module-type-aliases": "3.9.2", + "@docusaurus/theme-common": "3.9.2", + "@docusaurus/types": "3.9.2", + "@docusaurus/utils": "3.9.2", + "@docusaurus/utils-common": "3.9.2", + "@docusaurus/utils-validation": "3.9.2", + "@types/react-router-config": "^5.0.7", + "combine-promises": "^1.1.0", + "fs-extra": "^11.1.1", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "schema-dts": "^1.1.2", + "tslib": "^2.6.0", + "utility-types": "^3.10.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-pages": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.9.2.tgz", + "integrity": "sha512-s4849w/p4noXUrGpPUF0BPqIAfdAe76BLaRGAGKZ1gTDNiGxGcpsLcwJ9OTi1/V8A+AzvsmI9pkjie2zjIQZKA==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.9.2", + "@docusaurus/mdx-loader": "3.9.2", + "@docusaurus/types": "3.9.2", + "@docusaurus/utils": "3.9.2", + "@docusaurus/utils-validation": "3.9.2", + "fs-extra": "^11.1.1", + "tslib": "^2.6.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-css-cascade-layers": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-css-cascade-layers/-/plugin-css-cascade-layers-3.9.2.tgz", + "integrity": "sha512-w1s3+Ss+eOQbscGM4cfIFBlVg/QKxyYgj26k5AnakuHkKxH6004ZtuLe5awMBotIYF2bbGDoDhpgQ4r/kcj4rQ==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.9.2", + "@docusaurus/types": "3.9.2", + "@docusaurus/utils": "3.9.2", + "@docusaurus/utils-validation": "3.9.2", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@docusaurus/plugin-debug": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.9.2.tgz", + "integrity": "sha512-j7a5hWuAFxyQAkilZwhsQ/b3T7FfHZ+0dub6j/GxKNFJp2h9qk/P1Bp7vrGASnvA9KNQBBL1ZXTe7jlh4VdPdA==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.9.2", + "@docusaurus/types": "3.9.2", + "@docusaurus/utils": "3.9.2", + "fs-extra": "^11.1.1", + "react-json-view-lite": "^2.3.0", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-analytics": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.9.2.tgz", + "integrity": "sha512-mAwwQJ1Us9jL/lVjXtErXto4p4/iaLlweC54yDUK1a97WfkC6Z2k5/769JsFgwOwOP+n5mUQGACXOEQ0XDuVUw==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.9.2", + "@docusaurus/types": "3.9.2", + "@docusaurus/utils-validation": "3.9.2", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-gtag": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.9.2.tgz", + "integrity": "sha512-YJ4lDCphabBtw19ooSlc1MnxtYGpjFV9rEdzjLsUnBCeis2djUyCozZaFhCg6NGEwOn7HDDyMh0yzcdRpnuIvA==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.9.2", + "@docusaurus/types": "3.9.2", + "@docusaurus/utils-validation": "3.9.2", + "@types/gtag.js": "^0.0.12", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-tag-manager": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.9.2.tgz", + "integrity": "sha512-LJtIrkZN/tuHD8NqDAW1Tnw0ekOwRTfobWPsdO15YxcicBo2ykKF0/D6n0vVBfd3srwr9Z6rzrIWYrMzBGrvNw==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.9.2", + "@docusaurus/types": "3.9.2", + "@docusaurus/utils-validation": "3.9.2", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-sitemap": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.9.2.tgz", + "integrity": "sha512-WLh7ymgDXjG8oPoM/T4/zUP7KcSuFYRZAUTl8vR6VzYkfc18GBM4xLhcT+AKOwun6kBivYKUJf+vlqYJkm+RHw==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.9.2", + "@docusaurus/logger": "3.9.2", + "@docusaurus/types": "3.9.2", + "@docusaurus/utils": "3.9.2", + "@docusaurus/utils-common": "3.9.2", + "@docusaurus/utils-validation": "3.9.2", + "fs-extra": "^11.1.1", + "sitemap": "^7.1.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-svgr": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-svgr/-/plugin-svgr-3.9.2.tgz", + "integrity": "sha512-n+1DE+5b3Lnf27TgVU5jM1d4x5tUh2oW5LTsBxJX4PsAPV0JGcmI6p3yLYtEY0LRVEIJh+8RsdQmRE66wSV8mw==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.9.2", + "@docusaurus/types": "3.9.2", + "@docusaurus/utils": "3.9.2", + "@docusaurus/utils-validation": "3.9.2", + "@svgr/core": "8.1.0", + "@svgr/webpack": "^8.1.0", + "tslib": "^2.6.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/preset-classic": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-3.9.2.tgz", + "integrity": "sha512-IgyYO2Gvaigi21LuDIe+nvmN/dfGXAiMcV/murFqcpjnZc7jxFAxW+9LEjdPt61uZLxG4ByW/oUmX/DDK9t/8w==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.9.2", + "@docusaurus/plugin-content-blog": "3.9.2", + "@docusaurus/plugin-content-docs": "3.9.2", + "@docusaurus/plugin-content-pages": "3.9.2", + "@docusaurus/plugin-css-cascade-layers": "3.9.2", + "@docusaurus/plugin-debug": "3.9.2", + "@docusaurus/plugin-google-analytics": "3.9.2", + "@docusaurus/plugin-google-gtag": "3.9.2", + "@docusaurus/plugin-google-tag-manager": "3.9.2", + "@docusaurus/plugin-sitemap": "3.9.2", + "@docusaurus/plugin-svgr": "3.9.2", + "@docusaurus/theme-classic": "3.9.2", + "@docusaurus/theme-common": "3.9.2", + "@docusaurus/theme-search-algolia": "3.9.2", + "@docusaurus/types": "3.9.2" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/theme-classic": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.9.2.tgz", + "integrity": "sha512-IGUsArG5hhekXd7RDb11v94ycpJpFdJPkLnt10fFQWOVxAtq5/D7hT6lzc2fhyQKaaCE62qVajOMKL7OiAFAIA==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.9.2", + "@docusaurus/logger": "3.9.2", + "@docusaurus/mdx-loader": "3.9.2", + "@docusaurus/module-type-aliases": "3.9.2", + "@docusaurus/plugin-content-blog": "3.9.2", + "@docusaurus/plugin-content-docs": "3.9.2", + "@docusaurus/plugin-content-pages": "3.9.2", + "@docusaurus/theme-common": "3.9.2", + "@docusaurus/theme-translations": "3.9.2", + "@docusaurus/types": "3.9.2", + "@docusaurus/utils": "3.9.2", + "@docusaurus/utils-common": "3.9.2", + "@docusaurus/utils-validation": "3.9.2", + "@mdx-js/react": "^3.0.0", + "clsx": "^2.0.0", + "infima": "0.2.0-alpha.45", + "lodash": "^4.17.21", + "nprogress": "^0.2.0", + "postcss": "^8.5.4", + "prism-react-renderer": "^2.3.0", + "prismjs": "^1.29.0", + "react-router-dom": "^5.3.4", + "rtlcss": "^4.1.0", + "tslib": "^2.6.0", + "utility-types": "^3.10.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/theme-common": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.9.2.tgz", + "integrity": "sha512-6c4DAbR6n6nPbnZhY2V3tzpnKnGL+6aOsLvFL26VRqhlczli9eWG0VDUNoCQEPnGwDMhPS42UhSAnz5pThm5Ag==", + "license": "MIT", + "dependencies": { + "@docusaurus/mdx-loader": "3.9.2", + "@docusaurus/module-type-aliases": "3.9.2", + "@docusaurus/utils": "3.9.2", + "@docusaurus/utils-common": "3.9.2", + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router-config": "*", + "clsx": "^2.0.0", + "parse-numeric-range": "^1.3.0", + "prism-react-renderer": "^2.3.0", + "tslib": "^2.6.0", + "utility-types": "^3.10.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "@docusaurus/plugin-content-docs": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/theme-search-algolia": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.9.2.tgz", + "integrity": "sha512-GBDSFNwjnh5/LdkxCKQHkgO2pIMX1447BxYUBG2wBiajS21uj64a+gH/qlbQjDLxmGrbrllBrtJkUHxIsiwRnw==", + "license": "MIT", + "dependencies": { + "@docsearch/react": "^3.9.0 || ^4.1.0", + "@docusaurus/core": "3.9.2", + "@docusaurus/logger": "3.9.2", + "@docusaurus/plugin-content-docs": "3.9.2", + "@docusaurus/theme-common": "3.9.2", + "@docusaurus/theme-translations": "3.9.2", + "@docusaurus/utils": "3.9.2", + "@docusaurus/utils-validation": "3.9.2", + "algoliasearch": "^5.37.0", + "algoliasearch-helper": "^3.26.0", + "clsx": "^2.0.0", + "eta": "^2.2.0", + "fs-extra": "^11.1.1", + "lodash": "^4.17.21", + "tslib": "^2.6.0", + "utility-types": "^3.10.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/theme-translations": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.9.2.tgz", + "integrity": "sha512-vIryvpP18ON9T9rjgMRFLr2xJVDpw1rtagEGf8Ccce4CkTrvM/fRB8N2nyWYOW5u3DdjkwKw5fBa+3tbn9P4PA==", + "license": "MIT", + "dependencies": { + "fs-extra": "^11.1.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@docusaurus/tsconfig": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/tsconfig/-/tsconfig-3.9.2.tgz", + "integrity": "sha512-j6/Fp4Rlpxsc632cnRnl5HpOWeb6ZKssDj6/XzzAzVGXXfm9Eptx3rxCC+fDzySn9fHTS+CWJjPineCR1bB5WQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@docusaurus/types": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.9.2.tgz", + "integrity": "sha512-Ux1JUNswg+EfUEmajJjyhIohKceitY/yzjRUpu04WXgvVz+fbhVC0p+R0JhvEu4ytw8zIAys2hrdpQPBHRIa8Q==", + "license": "MIT", + "dependencies": { + "@mdx-js/mdx": "^3.0.0", + "@types/history": "^4.7.11", + "@types/mdast": "^4.0.2", + "@types/react": "*", + "commander": "^5.1.0", + "joi": "^17.9.2", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.95.0", + "webpack-merge": "^5.9.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/types/node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@docusaurus/utils": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.9.2.tgz", + "integrity": "sha512-lBSBiRruFurFKXr5Hbsl2thmGweAPmddhF3jb99U4EMDA5L+e5Y1rAkOS07Nvrup7HUMBDrCV45meaxZnt28nQ==", + "license": "MIT", + "dependencies": { + "@docusaurus/logger": "3.9.2", + "@docusaurus/types": "3.9.2", + "@docusaurus/utils-common": "3.9.2", + "escape-string-regexp": "^4.0.0", + "execa": "5.1.1", + "file-loader": "^6.2.0", + "fs-extra": "^11.1.1", + "github-slugger": "^1.5.0", + "globby": "^11.1.0", + "gray-matter": "^4.0.3", + "jiti": "^1.20.0", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "micromatch": "^4.0.5", + "p-queue": "^6.6.2", + "prompts": "^2.4.2", + "resolve-pathname": "^3.0.0", + "tslib": "^2.6.0", + "url-loader": "^4.1.1", + "utility-types": "^3.10.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@docusaurus/utils-common": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.9.2.tgz", + "integrity": "sha512-I53UC1QctruA6SWLvbjbhCpAw7+X7PePoe5pYcwTOEXD/PxeP8LnECAhTHHwWCblyUX5bMi4QLRkxvyZ+IT8Aw==", + "license": "MIT", + "dependencies": { + "@docusaurus/types": "3.9.2", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@docusaurus/utils-validation": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.9.2.tgz", + "integrity": "sha512-l7yk3X5VnNmATbwijJkexdhulNsQaNDwoagiwujXoxFbWLcxHQqNQ+c/IAlzrfMMOfa/8xSBZ7KEKDesE/2J7A==", + "license": "MIT", + "dependencies": { + "@docusaurus/logger": "3.9.2", + "@docusaurus/utils": "3.9.2", + "@docusaurus/utils-common": "3.9.2", + "fs-extra": "^11.2.0", + "joi": "^17.9.2", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@easyops-cn/autocomplete.js": { + "version": "0.38.1", + "resolved": "https://registry.npmjs.org/@easyops-cn/autocomplete.js/-/autocomplete.js-0.38.1.tgz", + "integrity": "sha512-drg76jS6syilOUmVNkyo1c7ZEBPcPuK+aJA7AksM5ZIIbV57DMHCywiCr+uHyv8BE5jUTU98j/H7gVrkHrWW3Q==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "immediate": "^3.2.3" + } + }, + "node_modules/@easyops-cn/docusaurus-search-local": { + "version": "0.55.1", + "resolved": "https://registry.npmjs.org/@easyops-cn/docusaurus-search-local/-/docusaurus-search-local-0.55.1.tgz", + "integrity": "sha512-jmBKj1J+tajqNrCvECwKCQYTWwHVZDGApy8lLOYEPe+Dm0/f3Ccdw8BP5/OHNpltr7WDNY2roQXn+TWn2f1kig==", + "license": "MIT", + "dependencies": { + "@docusaurus/plugin-content-docs": "^2 || ^3", + "@docusaurus/theme-translations": "^2 || ^3", + "@docusaurus/utils": "^2 || ^3", + "@docusaurus/utils-common": "^2 || ^3", + "@docusaurus/utils-validation": "^2 || ^3", + "@easyops-cn/autocomplete.js": "^0.38.1", + "@node-rs/jieba": "^1.6.0", + "cheerio": "^1.0.0", + "clsx": "^2.1.1", + "comlink": "^4.4.2", + "debug": "^4.2.0", + "fs-extra": "^10.0.0", + "klaw-sync": "^6.0.0", + "lunr": "^2.3.9", + "lunr-languages": "^1.4.0", + "mark.js": "^8.11.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "@docusaurus/theme-common": "^2 || ^3", + "open-ask-ai": "^0.7.3", + "react": "^16.14.0 || ^17 || ^18 || ^19", + "react-dom": "^16.14.0 || 17 || ^18 || ^19" + }, + "peerDependenciesMeta": { + "open-ask-ai": { + "optional": true + } + } + }, + "node_modules/@easyops-cn/docusaurus-search-local/node_modules/cheerio": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.2.0.tgz", + "integrity": "sha512-WDrybc/gKFpTYQutKIK6UvfcuxijIZfMfXaYm8NMsPQxSYvf+13fXUJ4rztGGbJcBQ/GF55gvrZ0Bc0bj/mqvg==", + "license": "MIT", + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.2", + "encoding-sniffer": "^0.2.1", + "htmlparser2": "^10.1.0", + "parse5": "^7.3.0", + "parse5-htmlparser2-tree-adapter": "^7.1.0", + "parse5-parser-stream": "^7.1.2", + "undici": "^7.19.0", + "whatwg-mimetype": "^4.0.0" + }, + "engines": { + "node": ">=20.18.1" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/@easyops-cn/docusaurus-search-local/node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/@easyops-cn/docusaurus-search-local/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@easyops-cn/docusaurus-search-local/node_modules/htmlparser2": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.1.0.tgz", + "integrity": "sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.2", + "entities": "^7.0.1" + } + }, + "node_modules/@emnapi/core": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.8.1.tgz", + "integrity": "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==", + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.1.0", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz", + "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz", + "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@hapi/hoek": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@hapi/topo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@jsonjoy.com/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/buffers": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-17.67.0.tgz", + "integrity": "sha512-tfExRpYxBvi32vPs9ZHaTjSP4fHAfzSmcahOfNxtvGHcyJel+aibkPlGeBB+7AoC6hL7lXIE++8okecBxx7lcw==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/codegen": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/codegen/-/codegen-1.0.0.tgz", + "integrity": "sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-core": { + "version": "4.56.11", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-core/-/fs-core-4.56.11.tgz", + "integrity": "sha512-wThHjzUp01ImIjfCwhs+UnFkeGPFAymwLEkOtenHewaKe2pTP12p6r1UuwikA9NEvNf9Vlck92r8fb8n/MWM5w==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-node-builtins": "4.56.11", + "@jsonjoy.com/fs-node-utils": "4.56.11", + "thingies": "^2.5.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-fsa": { + "version": "4.56.11", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-fsa/-/fs-fsa-4.56.11.tgz", + "integrity": "sha512-ZYlF3XbMayyp97xEN8ZvYutU99PCHjM64mMZvnCseXkCJXJDVLAwlF8Q/7q/xiWQRsv3pQBj1WXHd9eEyYcaCQ==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-core": "4.56.11", + "@jsonjoy.com/fs-node-builtins": "4.56.11", + "@jsonjoy.com/fs-node-utils": "4.56.11", + "thingies": "^2.5.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-node": { + "version": "4.56.11", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node/-/fs-node-4.56.11.tgz", + "integrity": "sha512-D65YrnP6wRuZyEWoSFnBJSr5zARVpVBGctnhie4rCsMuGXNzX7IHKaOt85/Aj7SSoG1N2+/xlNjWmkLvZ2H3Tg==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-core": "4.56.11", + "@jsonjoy.com/fs-node-builtins": "4.56.11", + "@jsonjoy.com/fs-node-utils": "4.56.11", + "@jsonjoy.com/fs-print": "4.56.11", + "@jsonjoy.com/fs-snapshot": "4.56.11", + "glob-to-regex.js": "^1.0.0", + "thingies": "^2.5.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-node-builtins": { + "version": "4.56.11", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-builtins/-/fs-node-builtins-4.56.11.tgz", + "integrity": "sha512-CNmt3a0zMCIhniFLXtzPWuUxXFU+U+2VyQiIrgt/rRVeEJNrMQUABaRbVxR0Ouw1LyR9RjaEkPM6nYpED+y43A==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-node-to-fsa": { + "version": "4.56.11", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-to-fsa/-/fs-node-to-fsa-4.56.11.tgz", + "integrity": "sha512-5OzGdvJDgZVo+xXWEYo72u81zpOWlxlbG4d4nL+hSiW+LKlua/dldNgPrpWxtvhgyntmdFQad2UTxFyGjJAGhA==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-fsa": "4.56.11", + "@jsonjoy.com/fs-node-builtins": "4.56.11", + "@jsonjoy.com/fs-node-utils": "4.56.11" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-node-utils": { + "version": "4.56.11", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-utils/-/fs-node-utils-4.56.11.tgz", + "integrity": "sha512-JADOZFDA3wRfsuxkT0+MYc4F9hJO2PYDaY66kRTG6NqGX3+bqmKu66YFYAbII/tEmQWPZeHoClUB23rtQM9UPg==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-node-builtins": "4.56.11" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-print": { + "version": "4.56.11", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-print/-/fs-print-4.56.11.tgz", + "integrity": "sha512-rnaKRgCRIn8JGTjxhS0JPE38YM3Pj/H7SW4/tglhIPbfKEkky7dpPayNKV2qy25SZSL15oFVgH/62dMZ/z7cyA==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-node-utils": "4.56.11", + "tree-dump": "^1.1.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-snapshot": { + "version": "4.56.11", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-snapshot/-/fs-snapshot-4.56.11.tgz", + "integrity": "sha512-IIldPX+cIRQuUol9fQzSS3hqyECxVpYMJQMqdU3dCKZFRzEl1rkIkw4P6y7Oh493sI7YdxZlKr/yWdzEWZ1wGQ==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/buffers": "^17.65.0", + "@jsonjoy.com/fs-node-utils": "4.56.11", + "@jsonjoy.com/json-pack": "^17.65.0", + "@jsonjoy.com/util": "^17.65.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/base64": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-17.67.0.tgz", + "integrity": "sha512-5SEsJGsm15aP8TQGkDfJvz9axgPwAEm98S5DxOuYe8e1EbfajcDmgeXXzccEjh+mLnjqEKrkBdjHWS5vFNwDdw==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/codegen": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/codegen/-/codegen-17.67.0.tgz", + "integrity": "sha512-idnkUplROpdBOV0HMcwhsCUS5TRUi9poagdGs70A6S4ux9+/aPuKbh8+UYRTLYQHtXvAdNfQWXDqZEx5k4Dj2Q==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/json-pack": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-17.67.0.tgz", + "integrity": "sha512-t0ejURcGaZsn1ClbJ/3kFqSOjlryd92eQY465IYrezsXmPcfHPE/av4twRSxf6WE+TkZgLY+71vCZbiIiFKA/w==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/base64": "17.67.0", + "@jsonjoy.com/buffers": "17.67.0", + "@jsonjoy.com/codegen": "17.67.0", + "@jsonjoy.com/json-pointer": "17.67.0", + "@jsonjoy.com/util": "17.67.0", + "hyperdyperid": "^1.2.0", + "thingies": "^2.5.0", + "tree-dump": "^1.1.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/json-pointer": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pointer/-/json-pointer-17.67.0.tgz", + "integrity": "sha512-+iqOFInH+QZGmSuaybBUNdh7yvNrXvqR+h3wjXm0N/3JK1EyyFAeGJvqnmQL61d1ARLlk/wJdFKSL+LHJ1eaUA==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/util": "17.67.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/util": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-17.67.0.tgz", + "integrity": "sha512-6+8xBaz1rLSohlGh68D1pdw3AwDi9xydm8QNlAFkvnavCJYSze+pxoW2VKP8p308jtlMRLs5NTHfPlZLd4w7ew==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/buffers": "17.67.0", + "@jsonjoy.com/codegen": "17.67.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/json-pack": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.21.0.tgz", + "integrity": "sha512-+AKG+R2cfZMShzrF2uQw34v3zbeDYUqnQ+jg7ORic3BGtfw9p/+N6RJbq/kkV8JmYZaINknaEQ2m0/f693ZPpg==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/base64": "^1.1.2", + "@jsonjoy.com/buffers": "^1.2.0", + "@jsonjoy.com/codegen": "^1.0.0", + "@jsonjoy.com/json-pointer": "^1.0.2", + "@jsonjoy.com/util": "^1.9.0", + "hyperdyperid": "^1.2.0", + "thingies": "^2.5.0", + "tree-dump": "^1.1.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/json-pack/node_modules/@jsonjoy.com/buffers": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-1.2.1.tgz", + "integrity": "sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/json-pointer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pointer/-/json-pointer-1.0.2.tgz", + "integrity": "sha512-Fsn6wM2zlDzY1U+v4Nc8bo3bVqgfNTGcn6dMgs6FjrEnt4ZCe60o6ByKRjOGlI2gow0aE/Q41QOigdTqkyK5fg==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/codegen": "^1.0.0", + "@jsonjoy.com/util": "^1.9.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/util": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.9.0.tgz", + "integrity": "sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/buffers": "^1.0.0", + "@jsonjoy.com/codegen": "^1.0.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/util/node_modules/@jsonjoy.com/buffers": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-1.2.1.tgz", + "integrity": "sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", + "license": "MIT" + }, + "node_modules/@mdx-js/mdx": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.1.1.tgz", + "integrity": "sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdx": "^2.0.0", + "acorn": "^8.0.0", + "collapse-white-space": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-util-scope": "^1.0.0", + "estree-walker": "^3.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "markdown-extensions": "^2.0.0", + "recma-build-jsx": "^1.0.0", + "recma-jsx": "^1.0.0", + "recma-stringify": "^1.0.0", + "rehype-recma": "^1.0.0", + "remark-mdx": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.0.0", + "source-map": "^0.7.0", + "unified": "^11.0.0", + "unist-util-position-from-estree": "^2.0.0", + "unist-util-stringify-position": "^4.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@mdx-js/react": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.1.tgz", + "integrity": "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==", + "license": "MIT", + "dependencies": { + "@types/mdx": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@types/react": ">=16", + "react": ">=16" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", + "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.3", + "@emnapi/runtime": "^1.4.3", + "@tybys/wasm-util": "^0.10.0" + } + }, + "node_modules/@noble/hashes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@node-rs/jieba": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba/-/jieba-1.10.4.tgz", + "integrity": "sha512-GvDgi8MnBiyWd6tksojej8anIx18244NmIOc1ovEw8WKNUejcccLfyu8vj66LWSuoZuKILVtNsOy4jvg3aoxIw==", + "license": "MIT", + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "optionalDependencies": { + "@node-rs/jieba-android-arm-eabi": "1.10.4", + "@node-rs/jieba-android-arm64": "1.10.4", + "@node-rs/jieba-darwin-arm64": "1.10.4", + "@node-rs/jieba-darwin-x64": "1.10.4", + "@node-rs/jieba-freebsd-x64": "1.10.4", + "@node-rs/jieba-linux-arm-gnueabihf": "1.10.4", + "@node-rs/jieba-linux-arm64-gnu": "1.10.4", + "@node-rs/jieba-linux-arm64-musl": "1.10.4", + "@node-rs/jieba-linux-x64-gnu": "1.10.4", + "@node-rs/jieba-linux-x64-musl": "1.10.4", + "@node-rs/jieba-wasm32-wasi": "1.10.4", + "@node-rs/jieba-win32-arm64-msvc": "1.10.4", + "@node-rs/jieba-win32-ia32-msvc": "1.10.4", + "@node-rs/jieba-win32-x64-msvc": "1.10.4" + } + }, + "node_modules/@node-rs/jieba-android-arm-eabi": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-android-arm-eabi/-/jieba-android-arm-eabi-1.10.4.tgz", + "integrity": "sha512-MhyvW5N3Fwcp385d0rxbCWH42kqDBatQTyP8XbnYbju2+0BO/eTeCCLYj7Agws4pwxn2LtdldXRSKavT7WdzNA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-android-arm64": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-android-arm64/-/jieba-android-arm64-1.10.4.tgz", + "integrity": "sha512-XyDwq5+rQ+Tk55A+FGi6PtJbzf974oqnpyCcCPzwU3QVXJCa2Rr4Lci+fx8oOpU4plT3GuD+chXMYLsXipMgJA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-darwin-arm64": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-darwin-arm64/-/jieba-darwin-arm64-1.10.4.tgz", + "integrity": "sha512-G++RYEJ2jo0rxF9626KUy90wp06TRUjAsvY/BrIzEOX/ingQYV/HjwQzNPRR1P1o32a6/U8RGo7zEBhfdybL6w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-darwin-x64": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-darwin-x64/-/jieba-darwin-x64-1.10.4.tgz", + "integrity": "sha512-MmDNeOb2TXIZCPyWCi2upQnZpPjAxw5ZGEj6R8kNsPXVFALHIKMa6ZZ15LCOkSTsKXVC17j2t4h+hSuyYb6qfQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-freebsd-x64": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-freebsd-x64/-/jieba-freebsd-x64-1.10.4.tgz", + "integrity": "sha512-/x7aVQ8nqUWhpXU92RZqd333cq639i/olNpd9Z5hdlyyV5/B65LLy+Je2B2bfs62PVVm5QXRpeBcZqaHelp/bg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-linux-arm-gnueabihf": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-linux-arm-gnueabihf/-/jieba-linux-arm-gnueabihf-1.10.4.tgz", + "integrity": "sha512-crd2M35oJBRLkoESs0O6QO3BBbhpv+tqXuKsqhIG94B1d02RVxtRIvSDwO33QurxqSdvN9IeSnVpHbDGkuXm3g==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-linux-arm64-gnu": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-linux-arm64-gnu/-/jieba-linux-arm64-gnu-1.10.4.tgz", + "integrity": "sha512-omIzNX1psUzPcsdnUhGU6oHeOaTCuCjUgOA/v/DGkvWC1jLcnfXe4vdYbtXMh4XOCuIgS1UCcvZEc8vQLXFbXQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-linux-arm64-musl": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-linux-arm64-musl/-/jieba-linux-arm64-musl-1.10.4.tgz", + "integrity": "sha512-Y/tiJ1+HeS5nnmLbZOE+66LbsPOHZ/PUckAYVeLlQfpygLEpLYdlh0aPpS5uiaWMjAXYZYdFkpZHhxDmSLpwpw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-linux-x64-gnu": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-linux-x64-gnu/-/jieba-linux-x64-gnu-1.10.4.tgz", + "integrity": "sha512-WZO8ykRJpWGE9MHuZpy1lu3nJluPoeB+fIJJn5CWZ9YTVhNDWoCF4i/7nxz1ntulINYGQ8VVuCU9LD86Mek97g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-linux-x64-musl": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-linux-x64-musl/-/jieba-linux-x64-musl-1.10.4.tgz", + "integrity": "sha512-uBBD4S1rGKcgCyAk6VCKatEVQb6EDD5I40v/DxODi5CuZVCANi9m5oee/MQbAoaX7RydA2f0OSCE9/tcwXEwUg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-wasm32-wasi": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-wasm32-wasi/-/jieba-wasm32-wasi-1.10.4.tgz", + "integrity": "sha512-Y2umiKHjuIJy0uulNDz9SDYHdfq5Hmy7jY5nORO99B4pySKkcrMjpeVrmWXJLIsEKLJwcCXHxz8tjwU5/uhz0A==", + "cpu": [ + "wasm32" + ], + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^0.2.3" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@node-rs/jieba-win32-arm64-msvc": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-win32-arm64-msvc/-/jieba-win32-arm64-msvc-1.10.4.tgz", + "integrity": "sha512-nwMtViFm4hjqhz1it/juQnxpXgqlGltCuWJ02bw70YUDMDlbyTy3grCJPpQQpueeETcALUnTxda8pZuVrLRcBA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-win32-ia32-msvc": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-win32-ia32-msvc/-/jieba-win32-ia32-msvc-1.10.4.tgz", + "integrity": "sha512-DCAvLx7Z+W4z5oKS+7vUowAJr0uw9JBw8x1Y23Xs/xMA4Em+OOSiaF5/tCJqZUCJ8uC4QeImmgDFiBqGNwxlyA==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-win32-x64-msvc": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-win32-x64-msvc/-/jieba-win32-x64-msvc-1.10.4.tgz", + "integrity": "sha512-+sqemSfS1jjb+Tt7InNbNzrRh1Ua3vProVvC4BZRPg010/leCbGFFiQHpzcPRfpxAXZrzG5Y0YBTsPzN/I4yHQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@peculiar/asn1-cms": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-cms/-/asn1-cms-2.6.1.tgz", + "integrity": "sha512-vdG4fBF6Lkirkcl53q6eOdn3XYKt+kJTG59edgRZORlg/3atWWEReRCx5rYE1ZzTTX6vLK5zDMjHh7vbrcXGtw==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.1", + "@peculiar/asn1-x509-attr": "^2.6.1", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-csr": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-csr/-/asn1-csr-2.6.1.tgz", + "integrity": "sha512-WRWnKfIocHyzFYQTka8O/tXCiBquAPSrRjXbOkHbO4qdmS6loffCEGs+rby6WxxGdJCuunnhS2duHURhjyio6w==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.1", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-ecc": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-ecc/-/asn1-ecc-2.6.1.tgz", + "integrity": "sha512-+Vqw8WFxrtDIN5ehUdvlN2m73exS2JVG0UAyfVB31gIfor3zWEAQPD+K9ydCxaj3MLen9k0JhKpu9LqviuCE1g==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.1", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-pfx": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-pfx/-/asn1-pfx-2.6.1.tgz", + "integrity": "sha512-nB5jVQy3MAAWvq0KY0R2JUZG8bO/bTLpnwyOzXyEh/e54ynGTatAR+csOnXkkVD9AFZ2uL8Z7EV918+qB1qDvw==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-cms": "^2.6.1", + "@peculiar/asn1-pkcs8": "^2.6.1", + "@peculiar/asn1-rsa": "^2.6.1", + "@peculiar/asn1-schema": "^2.6.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-pkcs8": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs8/-/asn1-pkcs8-2.6.1.tgz", + "integrity": "sha512-JB5iQ9Izn5yGMw3ZG4Nw3Xn/hb/G38GYF3lf7WmJb8JZUydhVGEjK/ZlFSWhnlB7K/4oqEs8HnfFIKklhR58Tw==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.1", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-pkcs9": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs9/-/asn1-pkcs9-2.6.1.tgz", + "integrity": "sha512-5EV8nZoMSxeWmcxWmmcolg22ojZRgJg+Y9MX2fnE2bGRo5KQLqV5IL9kdSQDZxlHz95tHvIq9F//bvL1OeNILw==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-cms": "^2.6.1", + "@peculiar/asn1-pfx": "^2.6.1", + "@peculiar/asn1-pkcs8": "^2.6.1", + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.1", + "@peculiar/asn1-x509-attr": "^2.6.1", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-rsa": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-rsa/-/asn1-rsa-2.6.1.tgz", + "integrity": "sha512-1nVMEh46SElUt5CB3RUTV4EG/z7iYc7EoaDY5ECwganibQPkZ/Y2eMsTKB/LeyrUJ+W/tKoD9WUqIy8vB+CEdA==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.1", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-schema": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.6.0.tgz", + "integrity": "sha512-xNLYLBFTBKkCzEZIw842BxytQQATQv+lDTCEMZ8C196iJcJJMBUZxrhSTxLaohMyKK8QlzRNTRkUmanucnDSqg==", + "license": "MIT", + "dependencies": { + "asn1js": "^3.0.6", + "pvtsutils": "^1.3.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-x509": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509/-/asn1-x509-2.6.1.tgz", + "integrity": "sha512-O9jT5F1A2+t3r7C4VT7LYGXqkGLK7Kj1xFpz7U0isPrubwU5PbDoyYtx6MiGst29yq7pXN5vZbQFKRCP+lLZlA==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.6.0", + "asn1js": "^3.0.6", + "pvtsutils": "^1.3.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-x509-attr": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509-attr/-/asn1-x509-attr-2.6.1.tgz", + "integrity": "sha512-tlW6cxoHwgcQghnJwv3YS+9OO1737zgPogZ+CgWRUK4roEwIPzRH4JEiG770xe5HX2ATfCpmX60gurfWIF9dcQ==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.1", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/x509": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/@peculiar/x509/-/x509-1.14.3.tgz", + "integrity": "sha512-C2Xj8FZ0uHWeCXXqX5B4/gVFQmtSkiuOolzAgutjTfseNOHT3pUjljDZsTSxXFGgio54bCzVFqmEOUrIVk8RDA==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-cms": "^2.6.0", + "@peculiar/asn1-csr": "^2.6.0", + "@peculiar/asn1-ecc": "^2.6.0", + "@peculiar/asn1-pkcs9": "^2.6.0", + "@peculiar/asn1-rsa": "^2.6.0", + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.0", + "pvtsutils": "^1.3.6", + "reflect-metadata": "^0.2.2", + "tslib": "^2.8.1", + "tsyringe": "^4.10.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@pnpm/config.env-replace": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", + "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", + "license": "MIT", + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/@pnpm/network.ca-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", + "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", + "license": "MIT", + "dependencies": { + "graceful-fs": "4.2.10" + }, + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "license": "ISC" + }, + "node_modules/@pnpm/npm-conf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-3.0.2.tgz", + "integrity": "sha512-h104Kh26rR8tm+a3Qkc5S4VLYint3FE48as7+/5oCEcKR2idC/pF1G6AhIXKI+eHPJa/3J9i5z0Al47IeGHPkA==", + "license": "MIT", + "dependencies": { + "@pnpm/config.env-replace": "^1.1.0", + "@pnpm/network.ca-file": "^1.0.1", + "config-chain": "^1.1.11" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.29", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", + "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", + "license": "MIT" + }, + "node_modules/@sideway/address": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", + "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@sideway/formula": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==", + "license": "BSD-3-Clause" + }, + "node_modules/@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.10", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.10.tgz", + "integrity": "sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==", + "license": "MIT" + }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@slorber/remark-comment": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@slorber/remark-comment/-/remark-comment-1.0.0.tgz", + "integrity": "sha512-RCE24n7jsOj1M0UPvIQCHTe7fI0sFL4S2nwKVWwHyVr/wI/H8GosgsJGyhnsZoGFnD/P2hLf1mSbrrgSLN93NA==", + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.1.0", + "micromark-util-symbol": "^1.0.1" + } + }, + "node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz", + "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz", + "integrity": "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz", + "integrity": "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz", + "integrity": "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz", + "integrity": "sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz", + "integrity": "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-preset": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.1.0.tgz", + "integrity": "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==", + "license": "MIT", + "dependencies": { + "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0", + "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0", + "@svgr/babel-plugin-svg-dynamic-title": "8.0.0", + "@svgr/babel-plugin-svg-em-dimensions": "8.0.0", + "@svgr/babel-plugin-transform-react-native-svg": "8.1.0", + "@svgr/babel-plugin-transform-svg-component": "8.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/core": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", + "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^8.1.3", + "snake-case": "^3.0.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/hast-util-to-babel-ast": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz", + "integrity": "sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.21.3", + "entities": "^4.4.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-jsx": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz", + "integrity": "sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "@svgr/hast-util-to-babel-ast": "8.0.0", + "svg-parser": "^2.0.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" + } + }, + "node_modules/@svgr/plugin-svgo": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-8.1.0.tgz", + "integrity": "sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA==", + "license": "MIT", + "dependencies": { + "cosmiconfig": "^8.1.3", + "deepmerge": "^4.3.1", + "svgo": "^3.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" + } + }, + "node_modules/@svgr/webpack": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-8.1.0.tgz", + "integrity": "sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@babel/plugin-transform-react-constant-elements": "^7.21.3", + "@babel/preset-env": "^7.20.2", + "@babel/preset-react": "^7.18.6", + "@babel/preset-typescript": "^7.21.0", + "@svgr/core": "8.1.0", + "@svgr/plugin-jsx": "8.1.0", + "@svgr/plugin-svgo": "8.1.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", + "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", + "license": "MIT", + "dependencies": { + "defer-to-connect": "^2.0.1" + }, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", + "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.6", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", + "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", + "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", + "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", + "license": "MIT", + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/eslint": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", + "license": "MIT", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "license": "MIT", + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "license": "MIT" + }, + "node_modules/@types/estree-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/express": { + "version": "4.17.25", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.25.tgz", + "integrity": "sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==", + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "^1" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.19.8", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.8.tgz", + "integrity": "sha512-02S5fmqeoKzVZCHPZid4b8JH2eM5HzQLZWN2FohQEy/0eXTq8VXZfSN6Pcr3F6N9R/vNrj7cpgbhjie6m/1tCA==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/gtag.js": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/@types/gtag.js/-/gtag.js-0.0.12.tgz", + "integrity": "sha512-YQV9bUsemkzG81Ea295/nF/5GijnD2Af7QhEofh7xu+kvCN6RdodgNwwGWXB5GMI3NoyvQo0odNctoH/qLMIpg==", + "license": "MIT" + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/history": { + "version": "4.7.11", + "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", + "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==", + "license": "MIT" + }, + "node_modules/@types/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", + "license": "MIT" + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==", + "license": "MIT" + }, + "node_modules/@types/http-errors": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", + "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", + "license": "MIT" + }, + "node_modules/@types/http-proxy": { + "version": "1.17.17", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.17.tgz", + "integrity": "sha512-ED6LB+Z1AVylNTu7hdzuBqOgMnvG/ld6wGCG8wFnAzKX5uyW2K3WD52v0gnLCTK/VLpXtKckgWuyScYK6cSPaw==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "license": "MIT" + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mdx": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.13.tgz", + "integrity": "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==", + "license": "MIT" + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "license": "MIT" + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "25.4.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.4.0.tgz", + "integrity": "sha512-9wLpoeWuBlcbBpOY3XmzSTG3oscB6xjBEEtn+pYXTfhyXhIxC5FsBer2KTopBlvKEiW9l13po9fq+SJY/5lkhw==", + "license": "MIT", + "dependencies": { + "undici-types": "~7.18.0" + } + }, + "node_modules/@types/prismjs": { + "version": "1.26.6", + "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.6.tgz", + "integrity": "sha512-vqlvI7qlMvcCBbVe0AKAb4f97//Hy0EBTaiW8AalRnG/xAN5zOiWWyrNqNXeq8+KAuvRewjCVY1+IPxk4RdNYw==", + "license": "MIT" + }, + "node_modules/@types/qs": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.15.0.tgz", + "integrity": "sha512-JawvT8iBVWpzTrz3EGw9BTQFg3BQNmwERdKE22vlTxawwtbyUSlMppvZYKLZzB5zgACXdXxbD3m1bXaMqP/9ow==", + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "19.2.14", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", + "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-router": { + "version": "5.1.20", + "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz", + "integrity": "sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==", + "license": "MIT", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*" + } + }, + "node_modules/@types/react-router-config": { + "version": "5.0.11", + "resolved": "https://registry.npmjs.org/@types/react-router-config/-/react-router-config-5.0.11.tgz", + "integrity": "sha512-WmSAg7WgqW7m4x8Mt4N6ZyKz0BubSj/2tVUMsAHp+Yd2AMwcSbeFq9WympT19p5heCFmF97R9eD5uUR/t4HEqw==", + "license": "MIT", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router": "^5.1.0" + } + }, + "node_modules/@types/react-router-dom": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz", + "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==", + "license": "MIT", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router": "*" + } + }, + "node_modules/@types/retry": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz", + "integrity": "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==", + "license": "MIT" + }, + "node_modules/@types/sax": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.7.tgz", + "integrity": "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", + "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/serve-index": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", + "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", + "license": "MIT", + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.10", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.10.tgz", + "integrity": "sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==", + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "<1" + } + }, + "node_modules/@types/serve-static/node_modules/@types/send": { + "version": "0.17.6", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.6.tgz", + "integrity": "sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==", + "license": "MIT", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT" + }, + "node_modules/@types/ws": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/yargs": { + "version": "17.0.35", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", + "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "license": "MIT" + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "license": "ISC" + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "license": "MIT", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "license": "Apache-2.0", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "license": "BSD-3-Clause" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "license": "Apache-2.0" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-phases": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", + "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", + "license": "MIT", + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "acorn": "^8.14.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz", + "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==", + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/address": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", + "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "license": "MIT", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/algoliasearch": { + "version": "5.49.2", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.49.2.tgz", + "integrity": "sha512-1K0wtDaRONwfhL4h8bbJ9qTjmY6rhGgRvvagXkMBsAOMNr+3Q2SffHECh9DIuNVrMA1JwA0zCwhyepgBZVakng==", + "license": "MIT", + "dependencies": { + "@algolia/abtesting": "1.15.2", + "@algolia/client-abtesting": "5.49.2", + "@algolia/client-analytics": "5.49.2", + "@algolia/client-common": "5.49.2", + "@algolia/client-insights": "5.49.2", + "@algolia/client-personalization": "5.49.2", + "@algolia/client-query-suggestions": "5.49.2", + "@algolia/client-search": "5.49.2", + "@algolia/ingestion": "1.49.2", + "@algolia/monitoring": "1.49.2", + "@algolia/recommend": "5.49.2", + "@algolia/requester-browser-xhr": "5.49.2", + "@algolia/requester-fetch": "5.49.2", + "@algolia/requester-node-http": "5.49.2" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/algoliasearch-helper": { + "version": "3.28.0", + "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.28.0.tgz", + "integrity": "sha512-GBN0xsxGggaCPElZq24QzMdfphrjIiV2xA+hRXE4/UMpN3nsF2WrM8q+x80OGvGpJWtB7F+4Hq5eSfWwuejXrg==", + "license": "MIT", + "dependencies": { + "@algolia/events": "^4.0.1" + }, + "peerDependencies": { + "algoliasearch": ">= 3.1 < 6" + } + }, + "node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "license": "ISC", + "dependencies": { + "string-width": "^4.1.0" + } + }, + "node_modules/ansi-align/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/ansi-align/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "engines": [ + "node >= 0.8.0" + ], + "license": "Apache-2.0", + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "license": "MIT" + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/asn1js": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.7.tgz", + "integrity": "sha512-uLvq6KJu04qoQM6gvBfKFjlh6Gl0vOKQuR5cJMDHQkmwfMOQeN3F3SHCv9SNYSL+CRoHvOGFfllDlVz03GQjvQ==", + "license": "BSD-3-Clause", + "dependencies": { + "pvtsutils": "^1.3.6", + "pvutils": "^1.1.3", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/astring": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz", + "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==", + "license": "MIT", + "bin": { + "astring": "bin/astring" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.27", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.27.tgz", + "integrity": "sha512-NP9APE+tO+LuJGn7/9+cohklunJsXWiaWEfV3si4Gi/XHDwVNgkwr1J3RQYFIvPy76GmJ9/bW8vyoU1LcxwKHA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.1", + "caniuse-lite": "^1.0.30001774", + "fraction.js": "^5.3.4", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/babel-loader": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.2.1.tgz", + "integrity": "sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==", + "license": "MIT", + "dependencies": { + "find-cache-dir": "^4.0.0", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0", + "webpack": ">=5" + } + }, + "node_modules/babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "license": "MIT", + "dependencies": { + "object.assign": "^4.1.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.16", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.16.tgz", + "integrity": "sha512-xaVwwSfebXf0ooE11BJovZYKhFjIvQo7TsyVpETuIeH2JHv0k/T6Y5j22pPTvqYqmpkxdlPAJlyJ0tfOJAoMxw==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-define-polyfill-provider": "^0.6.7", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz", + "integrity": "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==", + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.5", + "core-js-compat": "^3.43.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.7", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.7.tgz", + "integrity": "sha512-OTYbUlSwXhNgr4g6efMZgsO8//jA61P7ZbRX3iTT53VON8l+WQS8IAUEVo4a4cWknrg2W8Cj4gQhRYNCJ8GkAA==", + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.7" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.0.tgz", + "integrity": "sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA==", + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "license": "MIT" + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/body-parser": { + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz", + "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "~1.2.0", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "on-finished": "~2.4.1", + "qs": "~6.14.0", + "raw-body": "~2.5.3", + "type-is": "~1.6.18", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/bonjour-service": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz", + "integrity": "sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "license": "ISC" + }, + "node_modules/boxen": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-6.2.1.tgz", + "integrity": "sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw==", + "license": "MIT", + "dependencies": { + "ansi-align": "^3.0.1", + "camelcase": "^6.2.0", + "chalk": "^4.1.2", + "cli-boxes": "^3.0.0", + "string-width": "^5.0.1", + "type-fest": "^2.5.0", + "widest-line": "^4.0.1", + "wrap-ansi": "^8.0.1" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "license": "MIT" + }, + "node_modules/bundle-name": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "license": "MIT", + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/bytestreamjs": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/bytestreamjs/-/bytestreamjs-2.0.1.tgz", + "integrity": "sha512-U1Z/ob71V/bXfVABvNr/Kumf5VyeQRBEm6Txb0PQ6S7V5GpBM3w4Cbqz/xPDicR5tN0uvDifng8C+5qECeGwyQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/cacheable-lookup": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", + "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", + "license": "MIT", + "engines": { + "node": ">=14.16" + } + }, + "node_modules/cacheable-request": { + "version": "10.2.14", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.14.tgz", + "integrity": "sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==", + "license": "MIT", + "dependencies": { + "@types/http-cache-semantics": "^4.0.2", + "get-stream": "^6.0.1", + "http-cache-semantics": "^4.1.1", + "keyv": "^4.5.3", + "mimic-response": "^4.0.0", + "normalize-url": "^8.0.0", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "license": "MIT", + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001777", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001777.tgz", + "integrity": "sha512-tmN+fJxroPndC74efCdp12j+0rk0RHwV5Jwa1zWaFVyw2ZxAuPeG8ZgWC3Wz7uSjT3qMRQ5XHZ4COgQmsCMJAQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/cheerio": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", + "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", + "license": "MIT", + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "htmlparser2": "^8.0.1", + "parse5": "^7.0.0", + "parse5-htmlparser2-tree-adapter": "^7.0.0" + }, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/clean-css": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", + "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", + "license": "MIT", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.0" + } + }, + "node_modules/clean-css/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-boxes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-table3": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", + "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", + "license": "MIT", + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, + "node_modules/cli-table3/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/cli-table3/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/collapse-white-space": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz", + "integrity": "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/colord": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", + "license": "MIT" + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "license": "MIT" + }, + "node_modules/combine-promises": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/combine-promises/-/combine-promises-1.2.0.tgz", + "integrity": "sha512-VcQB1ziGD0NXrhKxiwyNbCDmRzs/OShMs2GqW2DlU2A/Sd0nQxE1oWDAE5O0ygSx5mgQOn9eIFh7yKPgFRVkPQ==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/comlink": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/comlink/-/comlink-4.4.2.tgz", + "integrity": "sha512-OxGdvBmJuNKSCMO4NTl1L47VRp6xn2wG4F/2hYzB6tiCb709otOxtEYCSvK80PtjODfXXZu8ds+Nw5kVCjqd2g==", + "license": "Apache-2.0" + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/common-path-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", + "license": "ISC" + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "license": "MIT", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compressible/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz", + "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "compressible": "~2.0.18", + "debug": "2.6.9", + "negotiator": "~0.6.4", + "on-headers": "~1.1.0", + "safe-buffer": "5.2.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "license": "MIT" + }, + "node_modules/config-chain": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "license": "MIT", + "dependencies": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "node_modules/config-chain/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" + }, + "node_modules/configstore": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-6.0.0.tgz", + "integrity": "sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==", + "license": "BSD-2-Clause", + "dependencies": { + "dot-prop": "^6.0.1", + "graceful-fs": "^4.2.6", + "unique-string": "^3.0.0", + "write-file-atomic": "^3.0.3", + "xdg-basedir": "^5.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/yeoman/configstore?sponsor=1" + } + }, + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/consola": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", + "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", + "license": "MIT", + "engines": { + "node": "^14.18.0 || >=16.10.0" + } + }, + "node_modules/content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", + "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", + "license": "MIT" + }, + "node_modules/copy-webpack-plugin": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", + "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", + "license": "MIT", + "dependencies": { + "fast-glob": "^3.2.11", + "glob-parent": "^6.0.1", + "globby": "^13.1.1", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/globby": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", + "license": "MIT", + "dependencies": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/copy-webpack-plugin/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/core-js": { + "version": "3.48.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.48.0.tgz", + "integrity": "sha512-zpEHTy1fjTMZCKLHUZoVeylt9XrzaIN2rbPXEt0k+q7JE5CkCZdo6bNq55bn24a69CH7ErAVLKijxJja4fw+UQ==", + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat": { + "version": "3.48.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.48.0.tgz", + "integrity": "sha512-OM4cAF3D6VtH/WkLtWvyNC56EZVXsZdU3iqaMG2B4WvYrlqU831pc4UtG5yp0sE9z8Y02wVN7PjW5Zf9Gt0f1Q==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-pure": { + "version": "3.48.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.48.0.tgz", + "integrity": "sha512-1slJgk89tWC51HQ1AEqG+s2VuwpTRr8ocu4n20QUcH1v9lAN0RXen0Q0AABa/DK1I7RrNWLucplOHMx8hfTGTw==", + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "license": "MIT" + }, + "node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "license": "MIT", + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-random-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", + "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", + "license": "MIT", + "dependencies": { + "type-fest": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/crypto-random-string/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/css-blank-pseudo": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-7.0.1.tgz", + "integrity": "sha512-jf+twWGDf6LDoXDUode+nc7ZlrqfaNphrBIBrcmeP3D8yw1uPaix1gCC8LUQUGQ6CycuK2opkbFFWFuq/a94ag==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-blank-pseudo/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/css-declaration-sorter": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.3.1.tgz", + "integrity": "sha512-gz6x+KkgNCjxq3Var03pRYLhyNfwhkKF1g/yoLgDNtFvVu0/fOLV9C8fFEZRjACp/XQLumjAYo7JVjzH3wLbxA==", + "license": "ISC", + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.0.9" + } + }, + "node_modules/css-has-pseudo": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-7.0.3.tgz", + "integrity": "sha512-oG+vKuGyqe/xvEMoxAQrhi7uY16deJR3i7wwhBerVrGQKSqUC5GiOVxTpM9F9B9hw0J+eKeOWLH7E9gZ1Dr5rA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-has-pseudo/node_modules/@csstools/selector-specificity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/css-has-pseudo/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/css-loader": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", + "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==", + "license": "MIT", + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/css-minimizer-webpack-plugin": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-5.0.1.tgz", + "integrity": "sha512-3caImjKFQkS+ws1TGcFn0V1HyDJFq1Euy589JlD6/3rV2kj+w7r5G9WDMgSHvpvXHNZ2calVypZWuEDQd9wfLg==", + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "cssnano": "^6.0.1", + "jest-worker": "^29.4.3", + "postcss": "^8.4.24", + "schema-utils": "^4.0.1", + "serialize-javascript": "^6.0.1" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@parcel/css": { + "optional": true + }, + "@swc/css": { + "optional": true + }, + "clean-css": { + "optional": true + }, + "csso": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "lightningcss": { + "optional": true + } + } + }, + "node_modules/css-prefers-color-scheme": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-10.0.0.tgz", + "integrity": "sha512-VCtXZAWivRglTZditUfB4StnsWr6YVZ2PRtuxQLKTNRdtAf8tpzaVPE9zXIF3VaSc7O70iK/j1+NXxyQCqdPjQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-select": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", + "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-tree": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css-what": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssdb": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-8.8.0.tgz", + "integrity": "sha512-QbLeyz2Bgso1iRlh7IpWk6OKa3lLNGXsujVjDMPl9rOZpxKeiG69icLpbLCFxeURwmcdIfZqQyhlooKJYM4f8Q==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + } + ], + "license": "MIT-0" + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-6.1.2.tgz", + "integrity": "sha512-rYk5UeX7VAM/u0lNqewCdasdtPK81CgX8wJFLEIXHbV2oldWRgJAsZrdhRXkV1NJzA2g850KiFm9mMU2HxNxMA==", + "license": "MIT", + "dependencies": { + "cssnano-preset-default": "^6.1.2", + "lilconfig": "^3.1.1" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/cssnano" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/cssnano-preset-advanced": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-6.1.2.tgz", + "integrity": "sha512-Nhao7eD8ph2DoHolEzQs5CfRpiEP0xa1HBdnFZ82kvqdmbwVBUr2r1QuQ4t1pi+D1ZpqpcO4T+wy/7RxzJ/WPQ==", + "license": "MIT", + "dependencies": { + "autoprefixer": "^10.4.19", + "browserslist": "^4.23.0", + "cssnano-preset-default": "^6.1.2", + "postcss-discard-unused": "^6.0.5", + "postcss-merge-idents": "^6.0.3", + "postcss-reduce-idents": "^6.0.3", + "postcss-zindex": "^6.0.2" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/cssnano-preset-default": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-6.1.2.tgz", + "integrity": "sha512-1C0C+eNaeN8OcHQa193aRgYexyJtU8XwbdieEjClw+J9d94E41LwT6ivKH0WT+fYwYWB0Zp3I3IZ7tI/BbUbrg==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "css-declaration-sorter": "^7.2.0", + "cssnano-utils": "^4.0.2", + "postcss-calc": "^9.0.1", + "postcss-colormin": "^6.1.0", + "postcss-convert-values": "^6.1.0", + "postcss-discard-comments": "^6.0.2", + "postcss-discard-duplicates": "^6.0.3", + "postcss-discard-empty": "^6.0.3", + "postcss-discard-overridden": "^6.0.2", + "postcss-merge-longhand": "^6.0.5", + "postcss-merge-rules": "^6.1.1", + "postcss-minify-font-values": "^6.1.0", + "postcss-minify-gradients": "^6.0.3", + "postcss-minify-params": "^6.1.0", + "postcss-minify-selectors": "^6.0.4", + "postcss-normalize-charset": "^6.0.2", + "postcss-normalize-display-values": "^6.0.2", + "postcss-normalize-positions": "^6.0.2", + "postcss-normalize-repeat-style": "^6.0.2", + "postcss-normalize-string": "^6.0.2", + "postcss-normalize-timing-functions": "^6.0.2", + "postcss-normalize-unicode": "^6.1.0", + "postcss-normalize-url": "^6.0.2", + "postcss-normalize-whitespace": "^6.0.2", + "postcss-ordered-values": "^6.0.2", + "postcss-reduce-initial": "^6.1.0", + "postcss-reduce-transforms": "^6.0.2", + "postcss-svgo": "^6.0.3", + "postcss-unique-selectors": "^6.0.4" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/cssnano-utils": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-4.0.2.tgz", + "integrity": "sha512-ZR1jHg+wZ8o4c3zqf1SIUSTIvm/9mU343FMR6Obe/unskbvpGhZOo1J6d/r8D1pzkRQYuwbcH3hToOuoA2G7oQ==", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/csso": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", + "license": "MIT", + "dependencies": { + "css-tree": "~2.2.0" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.28", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", + "license": "CC0-1.0" + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/debounce": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", + "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decode-named-character-reference": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", + "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==", + "license": "MIT", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-browser": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.5.0.tgz", + "integrity": "sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==", + "license": "MIT", + "dependencies": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz", + "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "license": "MIT" + }, + "node_modules/detect-port": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.6.1.tgz", + "integrity": "sha512-CmnVc+Hek2egPx1PeTFVta2W78xy2K/9Rkf6cC4T59S50tVnzKj+tnx5mmx5lwvCkujZ4uRrpRSuV+IVs3f90Q==", + "license": "MIT", + "dependencies": { + "address": "^1.0.1", + "debug": "4" + }, + "bin": { + "detect": "bin/detect-port.js", + "detect-port": "bin/detect-port.js" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dns-packet": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + "license": "MIT", + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "license": "MIT", + "dependencies": { + "utila": "~0.4" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/dot-prop": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", + "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", + "license": "MIT", + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/dot-prop/node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "license": "MIT" + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "license": "MIT" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.307", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.307.tgz", + "integrity": "sha512-5z3uFKBWjiNR44nFcYdkcXjKMbg5KXNdciu7mhTPo9tB7NbqSNP2sSnGR+fqknZSCwKkBN+oxiiajWs4dT6ORg==", + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "license": "MIT" + }, + "node_modules/emojilib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz", + "integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==", + "license": "MIT" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/emoticon": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/emoticon/-/emoticon-4.1.0.tgz", + "integrity": "sha512-VWZfnxqwNcc51hIy/sbOdEem6D+cVtpPzEEtVAFdaas30+1dgkyaOQ4sQ6Bp0tOMqWO1v+HQfYaoodOkdhK6SQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/encoding-sniffer": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.1.tgz", + "integrity": "sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==", + "license": "MIT", + "dependencies": { + "iconv-lite": "^0.6.3", + "whatwg-encoding": "^3.1.1" + }, + "funding": { + "url": "https://github.com/fb55/encoding-sniffer?sponsor=1" + } + }, + "node_modules/encoding-sniffer/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.20.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.20.0.tgz", + "integrity": "sha512-/ce7+jQ1PQ6rVXwe+jKEg5hW5ciicHwIQUagZkp6IufBoY3YDgdTTY1azVs0qoRgVmvsNB+rbjLJxDAeHHtwsQ==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz", + "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==", + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esast-util-from-estree": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/esast-util-from-estree/-/esast-util-from-estree-2.0.0.tgz", + "integrity": "sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-visit": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/esast-util-from-js": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/esast-util-from-js/-/esast-util-from-js-2.0.1.tgz", + "integrity": "sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "acorn": "^8.0.0", + "esast-util-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-goat": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-4.0.0.tgz", + "integrity": "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-util-attach-comments": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz", + "integrity": "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-build-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz", + "integrity": "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-walker": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-is-identifier-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", + "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-scope": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/estree-util-scope/-/estree-util-scope-1.0.0.tgz", + "integrity": "sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-to-js": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz", + "integrity": "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "astring": "^1.8.0", + "source-map": "^0.7.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-value-to-estree": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/estree-util-value-to-estree/-/estree-util-value-to-estree-3.5.0.tgz", + "integrity": "sha512-aMV56R27Gv3QmfmF1MY12GWkGzzeAezAX+UplqHVASfjc9wNzI/X6hC0S9oxq61WT4aQesLGslWP9tKk6ghRZQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/remcohaszing" + } + }, + "node_modules/estree-util-visit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-2.0.0.tgz", + "integrity": "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eta": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/eta/-/eta-2.2.0.tgz", + "integrity": "sha512-UVQ72Rqjy/ZKQalzV5dCCJP80GrmPrMxh6NlNf+erV6ObL0ZFkhCstWRawS85z3smdr3d2wXPsZEY7rDPfGd2g==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "url": "https://github.com/eta-dev/eta?sponsor=1" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eval": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/eval/-/eval-0.1.8.tgz", + "integrity": "sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==", + "dependencies": { + "@types/node": "*", + "require-like": ">= 0.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "license": "MIT" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/express": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz", + "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "~1.20.3", + "content-disposition": "~0.5.4", + "content-type": "~1.0.4", + "cookie": "~0.7.1", + "cookie-signature": "~1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.3.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "~0.1.12", + "proxy-addr": "~2.0.7", + "qs": "~6.14.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "~0.19.0", + "serve-static": "~1.16.2", + "setprototypeof": "1.2.0", + "statuses": "~2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/express/node_modules/path-to-regexp": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "license": "MIT" + }, + "node_modules/express/node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fault": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fault/-/fault-2.0.1.tgz", + "integrity": "sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==", + "license": "MIT", + "dependencies": { + "format": "^0.2.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "license": "Apache-2.0", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/feed": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/feed/-/feed-4.2.2.tgz", + "integrity": "sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==", + "license": "MIT", + "dependencies": { + "xml-js": "^1.6.11" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/figures/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/file-loader": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", + "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/file-loader/node_modules/ajv": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/file-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/file-loader/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "license": "MIT" + }, + "node_modules/file-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", + "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "statuses": "~2.0.2", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/find-cache-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", + "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", + "license": "MIT", + "dependencies": { + "common-path-prefix": "^3.0.0", + "pkg-dir": "^7.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "license": "MIT", + "dependencies": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data-encoder": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", + "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", + "license": "MIT", + "engines": { + "node": ">= 14.17" + } + }, + "node_modules/format": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", + "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fraction.js": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", + "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "11.3.4", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.4.tgz", + "integrity": "sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", + "license": "ISC" + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/github-slugger": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz", + "integrity": "sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==", + "license": "ISC" + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-to-regex.js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/glob-to-regex.js/-/glob-to-regex.js-1.2.0.tgz", + "integrity": "sha512-QMwlOQKU/IzqMUOAZWubUOT8Qft+Y0KQWnX9nK3ch0CJg0tTp4TvGZsTfudYKv2NzoQSyPcnA6TYeIQ3jGichQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "license": "BSD-2-Clause" + }, + "node_modules/global-dirs": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", + "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", + "license": "MIT", + "dependencies": { + "ini": "2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/got": { + "version": "12.6.1", + "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz", + "integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==", + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^5.2.0", + "@szmarczak/http-timer": "^5.0.1", + "cacheable-lookup": "^7.0.0", + "cacheable-request": "^10.2.8", + "decompress-response": "^6.0.0", + "form-data-encoder": "^2.1.2", + "get-stream": "^6.0.1", + "http2-wrapper": "^2.1.10", + "lowercase-keys": "^3.0.0", + "p-cancelable": "^3.0.0", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/got/node_modules/@sindresorhus/is": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz", + "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/gray-matter": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", + "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", + "license": "MIT", + "dependencies": { + "js-yaml": "^3.13.1", + "kind-of": "^6.0.2", + "section-matter": "^1.0.0", + "strip-bom-string": "^1.0.0" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/gray-matter/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/gray-matter/node_modules/js-yaml": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/gzip-size": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "license": "MIT", + "dependencies": { + "duplexer": "^0.1.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "license": "MIT" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-yarn": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-3.0.0.tgz", + "integrity": "sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hast-util-from-parse5": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz", + "integrity": "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "hastscript": "^9.0.0", + "property-information": "^7.0.0", + "vfile": "^6.0.0", + "vfile-location": "^5.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", + "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.1.0.tgz", + "integrity": "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "@ungap/structured-clone": "^1.0.0", + "hast-util-from-parse5": "^8.0.0", + "hast-util-to-parse5": "^8.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "parse5": "^7.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-estree": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-3.1.3.tgz", + "integrity": "sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-attach-comments": "^3.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-js": "^1.0.0", + "unist-util-position": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-jsx-runtime": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", + "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-js": "^1.0.0", + "unist-util-position": "^5.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-parse5": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.1.tgz", + "integrity": "sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz", + "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^4.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/history": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", + "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.1.2", + "loose-envify": "^1.2.0", + "resolve-pathname": "^3.0.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0", + "value-equal": "^1.0.1" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hpack.js/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "license": "MIT" + }, + "node_modules/html-minifier-terser": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz", + "integrity": "sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==", + "license": "MIT", + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "~5.3.2", + "commander": "^10.0.0", + "entities": "^4.4.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.15.1" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": "^14.13.1 || >=16.0.0" + } + }, + "node_modules/html-minifier-terser/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/html-tags": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", + "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/html-webpack-plugin": { + "version": "5.6.6", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.6.tgz", + "integrity": "sha512-bLjW01UTrvoWTJQL5LsMRo1SypHW80FTm12OJRSnr3v6YHNhfe+1r0MYUZJMACxnCHURVnBWRwAsWs2yPU9Ezw==", + "license": "MIT", + "dependencies": { + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/html-webpack-plugin" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.20.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/html-webpack-plugin/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/html-webpack-plugin/node_modules/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "license": "MIT", + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", + "license": "BSD-2-Clause" + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "license": "MIT" + }, + "node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz", + "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==", + "license": "MIT" + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz", + "integrity": "sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==", + "license": "MIT", + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/http-proxy-middleware/node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/http2-wrapper": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", + "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==", + "license": "MIT", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.2.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/hyperdyperid": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz", + "integrity": "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==", + "license": "MIT", + "engines": { + "node": ">=10.18" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/image-size": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-2.0.2.tgz", + "integrity": "sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w==", + "license": "MIT", + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=16.x" + } + }, + "node_modules/immediate": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.3.0.tgz", + "integrity": "sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==", + "license": "MIT" + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-lazy": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", + "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/infima": { + "version": "0.2.0-alpha.45", + "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.45.tgz", + "integrity": "sha512-uyH0zfr1erU1OohLk0fT4Rrb94AOhguWNOcD9uGrSpRvNB+6gZXUoJX5J0NtvzBO10YZ9PgvA4NFgt+fYg8ojw==", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/inline-style-parser": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.7.tgz", + "integrity": "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==", + "license": "MIT" + }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/ipaddr.js": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.3.0.tgz", + "integrity": "sha512-Zv/pA+ciVFbCSBBjGfaKUya/CcGmUHzTydLMaTwrUUEM2DIEO3iZvueGxmacvmN50fGpGVKeTXpb2LcYQxeVdg==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "license": "MIT" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-ci": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", + "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", + "license": "MIT", + "dependencies": { + "ci-info": "^3.2.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-inside-container/node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "license": "MIT", + "dependencies": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-network-error": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.3.1.tgz", + "integrity": "sha512-6QCxa49rQbmUWLfk0nuGqzql9U8uaV2H6279bRErPBHe/109hCzsLUBUHfbEtvLIHBd6hyXbgedBSHevm43Edw==", + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-npm": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-6.1.0.tgz", + "integrity": "sha512-O2z4/kNgyjhQwVR1Wpkbfc19JIhggF97NZNCpWTnjH7kVcZMUrnut9XSN7txI7VdyIYk5ZatOq3zvSuWpU8hoA==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "license": "MIT" + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-yarn-global": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.4.1.tgz", + "integrity": "sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jiti": { + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", + "license": "MIT", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/joi": { + "version": "17.13.3", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz", + "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==", + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.3.0", + "@hapi/topo": "^5.1.0", + "@sideway/address": "^4.1.5", + "@sideway/formula": "^3.0.1", + "@sideway/pinpoint": "^2.0.0" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/klaw-sync": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz", + "integrity": "sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.11" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/latest-version": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-7.0.0.tgz", + "integrity": "sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==", + "license": "MIT", + "dependencies": { + "package-json": "^8.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/launch-editor": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.13.1.tgz", + "integrity": "sha512-lPSddlAAluRKJ7/cjRFoXUFzaX7q/YKI7yPHuEvSJVqoXvFnJov1/Ud87Aa4zULIbA9Nja4mSPK8l0z/7eV2wA==", + "license": "MIT", + "dependencies": { + "picocolors": "^1.1.1", + "shell-quote": "^1.8.3" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "license": "MIT" + }, + "node_modules/loader-runner": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.1.tgz", + "integrity": "sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==", + "license": "MIT", + "engines": { + "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "license": "MIT", + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", + "license": "MIT" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "license": "MIT" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "license": "MIT" + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", + "license": "MIT" + }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lowercase-keys": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", + "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lunr": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", + "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", + "license": "MIT" + }, + "node_modules/lunr-languages": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/lunr-languages/-/lunr-languages-1.14.0.tgz", + "integrity": "sha512-hWUAb2KqM3L7J5bcrngszzISY4BxrXn/Xhbb9TTCJYEGqlR1nG67/M14sp09+PTIRklobrn57IAxcdcO/ZFyNA==", + "license": "MPL-1.1" + }, + "node_modules/mark.js": { + "version": "8.11.1", + "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz", + "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==", + "license": "MIT" + }, + "node_modules/markdown-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz", + "integrity": "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==", + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/markdown-table": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", + "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mdast-util-directive": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-directive/-/mdast-util-directive-3.1.0.tgz", + "integrity": "sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", + "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.3.tgz", + "integrity": "sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-from-markdown/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/mdast-util-frontmatter": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-2.0.1.tgz", + "integrity": "sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "escape-string-regexp": "^5.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-extension-frontmatter": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-frontmatter/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdast-util-gfm": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", + "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-gfm-autolink-literal": "^2.0.0", + "mdast-util-gfm-footnote": "^2.0.0", + "mdast-util-gfm-strikethrough": "^2.0.0", + "mdast-util-gfm-table": "^2.0.0", + "mdast-util-gfm-task-list-item": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", + "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-find-and-replace": "^3.0.0", + "micromark-util-character": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-autolink-literal/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", + "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", + "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz", + "integrity": "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", + "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz", + "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", + "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", + "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", + "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdn-data": { + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "license": "CC0-1.0" + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "4.56.11", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.56.11.tgz", + "integrity": "sha512-/GodtwVeKVIHZKLUSr2ZdOxKBC5hHki4JNCU22DoCGPEHr5o2PD5U721zvESKyWwCfTfavFl9WZYgA13OAYK0g==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-core": "4.56.11", + "@jsonjoy.com/fs-fsa": "4.56.11", + "@jsonjoy.com/fs-node": "4.56.11", + "@jsonjoy.com/fs-node-builtins": "4.56.11", + "@jsonjoy.com/fs-node-to-fsa": "4.56.11", + "@jsonjoy.com/fs-node-utils": "4.56.11", + "@jsonjoy.com/fs-print": "4.56.11", + "@jsonjoy.com/fs-snapshot": "4.56.11", + "@jsonjoy.com/json-pack": "^1.11.0", + "@jsonjoy.com/util": "^1.9.0", + "glob-to-regex.js": "^1.0.1", + "thingies": "^2.5.0", + "tree-dump": "^1.0.3", + "tslib": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromark": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-directive": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-3.0.2.tgz", + "integrity": "sha512-wjcXHgk+PPdmvR58Le9d7zQYWy+vKEU9Se44p2CrCDPiLr2FMyiT4Fyb5UFKFC66wGB3kPlgD7q3TnoqPS7SZA==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "parse-entities": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-directive/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-directive/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-directive/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-frontmatter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-frontmatter/-/micromark-extension-frontmatter-2.0.0.tgz", + "integrity": "sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==", + "license": "MIT", + "dependencies": { + "fault": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-frontmatter/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-frontmatter/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", + "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", + "license": "MIT", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^2.0.0", + "micromark-extension-gfm-footnote": "^2.0.0", + "micromark-extension-gfm-strikethrough": "^2.0.0", + "micromark-extension-gfm-table": "^2.0.0", + "micromark-extension-gfm-tagfilter": "^2.0.0", + "micromark-extension-gfm-task-list-item": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", + "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", + "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm-table": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", + "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-table/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-table/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", + "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", + "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-mdx-expression": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.1.tgz", + "integrity": "sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-expression/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-expression/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-expression/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-mdx-jsx": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.2.tgz", + "integrity": "sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-mdx-md": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz", + "integrity": "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz", + "integrity": "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==", + "license": "MIT", + "dependencies": { + "acorn": "^8.0.0", + "acorn-jsx": "^5.0.0", + "micromark-extension-mdx-expression": "^3.0.0", + "micromark-extension-mdx-jsx": "^3.0.0", + "micromark-extension-mdx-md": "^2.0.0", + "micromark-extension-mdxjs-esm": "^3.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs-esm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz", + "integrity": "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs-esm/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdxjs-esm/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-destination/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-destination/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-mdx-expression": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.3.tgz", + "integrity": "sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + } + }, + "node_modules/micromark-factory-mdx-expression/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-mdx-expression/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-mdx-expression/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-space": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz", + "integrity": "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-factory-space/node_modules/micromark-util-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-character": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", + "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-character/node_modules/micromark-util-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-events-to-acorn": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.3.tgz", + "integrity": "sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "estree-util-visit": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" + } + }, + "node_modules/micromark-util-events-to-acorn/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-normalize-identifier/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-symbol": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", + "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "license": "MIT", + "dependencies": { + "mime-db": "~1.33.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/mimic-response": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", + "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.10.1.tgz", + "integrity": "sha512-k7G3Y5QOegl380tXmZ68foBRRjE9Ljavx835ObdvmZjQ639izvZD8CS7BkWw1qKPPzHsGL/JDhl0uyU1zc2rJw==", + "license": "MIT", + "dependencies": { + "schema-utils": "^4.0.0", + "tapable": "^2.2.1" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "license": "ISC" + }, + "node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mrmime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "license": "MIT", + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "license": "MIT" + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "license": "MIT", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-emoji": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.2.0.tgz", + "integrity": "sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==", + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^4.6.0", + "char-regex": "^1.0.2", + "emojilib": "^2.4.0", + "skin-tone": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/node-releases": { + "version": "2.0.36", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.36.tgz", + "integrity": "sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==", + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.1.1.tgz", + "integrity": "sha512-JYc0DPlpGWB40kH5g07gGTrYuMqV653k3uBKY6uITPWds3M0ov3GaWGp9lbE3Bzngx8+XkfzgvASb9vk9JDFXQ==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nprogress": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", + "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==", + "license": "MIT" + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/null-loader": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/null-loader/-/null-loader-4.0.1.tgz", + "integrity": "sha512-pxqVbi4U6N26lq+LmgIbB5XATP0VdZKOG25DhHi8btMmJJefGArFyDg1yc4U3hWCJbMqSrw0qyrz1UQX+qYXqg==", + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/null-loader/node_modules/ajv": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/null-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/null-loader/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "license": "MIT" + }, + "node_modules/null-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "license": "MIT" + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", + "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "license": "MIT", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "license": "(WTFPL OR MIT)", + "bin": { + "opener": "bin/opener-bin.js" + } + }, + "node_modules/p-cancelable": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", + "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", + "license": "MIT", + "engines": { + "node": ">=12.20" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "license": "MIT", + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "license": "MIT", + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "license": "MIT", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-queue": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", + "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.4", + "p-timeout": "^3.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-retry": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.1.tgz", + "integrity": "sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==", + "license": "MIT", + "dependencies": { + "@types/retry": "0.12.2", + "is-network-error": "^1.0.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-timeout": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "license": "MIT", + "dependencies": { + "p-finally": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/package-json": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-8.1.1.tgz", + "integrity": "sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==", + "license": "MIT", + "dependencies": { + "got": "^12.1.0", + "registry-auth-token": "^5.0.1", + "registry-url": "^6.0.0", + "semver": "^7.3.7" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-entities": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", + "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-numeric-range": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz", + "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==", + "license": "ISC" + }, + "node_modules/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz", + "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==", + "license": "MIT", + "dependencies": { + "domhandler": "^5.0.3", + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-parser-stream": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz", + "integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==", + "license": "MIT", + "dependencies": { + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", + "license": "(WTFPL OR MIT)" + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" + }, + "node_modules/path-to-regexp": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.9.0.tgz", + "integrity": "sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==", + "license": "MIT", + "dependencies": { + "isarray": "0.0.1" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-dir": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", + "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", + "license": "MIT", + "dependencies": { + "find-up": "^6.3.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkijs": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/pkijs/-/pkijs-3.3.3.tgz", + "integrity": "sha512-+KD8hJtqQMYoTuL1bbGOqxb4z+nZkTAwVdNtWwe8Tc2xNbEmdJYIYoc6Qt0uF55e6YW6KuTHw1DjQ18gMhzepw==", + "license": "BSD-3-Clause", + "dependencies": { + "@noble/hashes": "1.4.0", + "asn1js": "^3.0.6", + "bytestreamjs": "^2.0.1", + "pvtsutils": "^1.3.6", + "pvutils": "^1.1.3", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/postcss": { + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", + "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-attribute-case-insensitive": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-7.0.1.tgz", + "integrity": "sha512-Uai+SupNSqzlschRyNx3kbCTWgY/2hcwtHEI/ej2LJWc9JJ77qKgGptd8DHwY1mXtZ7Aoh4z4yxfwMBue9eNgw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-attribute-case-insensitive/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-calc": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-9.0.1.tgz", + "integrity": "sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.11", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.2.2" + } + }, + "node_modules/postcss-clamp": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", + "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=7.6.0" + }, + "peerDependencies": { + "postcss": "^8.4.6" + } + }, + "node_modules/postcss-color-functional-notation": { + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-7.0.12.tgz", + "integrity": "sha512-TLCW9fN5kvO/u38/uesdpbx3e8AkTYhMvDZYa9JpmImWuTE99bDQ7GU7hdOADIZsiI9/zuxfAJxny/khknp1Zw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-color-hex-alpha": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-10.0.0.tgz", + "integrity": "sha512-1kervM2cnlgPs2a8Vt/Qbe5cQ++N7rkYo/2rz2BkqJZIHQwaVuJgQH38REHrAi4uM0b1fqxMkWYmese94iMp3w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-color-rebeccapurple": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-10.0.0.tgz", + "integrity": "sha512-JFta737jSP+hdAIEhk1Vs0q0YF5P8fFcj+09pweS8ktuGuZ8pPlykHsk6mPxZ8awDl4TrcxUqJo9l1IhVr/OjQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-colormin": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-6.1.0.tgz", + "integrity": "sha512-x9yX7DOxeMAR+BgGVnNSAxmAj98NX/YxEMNFP+SDCEeNLb2r3i6Hh1ksMsnW8Ub5SLCpbescQqn9YEbE9554Sw==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "caniuse-api": "^3.0.0", + "colord": "^2.9.3", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-convert-values": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-6.1.0.tgz", + "integrity": "sha512-zx8IwP/ts9WvUM6NkVSkiU902QZL1bwPhaVaLynPtCsOTqp+ZKbNi+s6XJg3rfqpKGA/oc7Oxk5t8pOQJcwl/w==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-custom-media": { + "version": "11.0.6", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-11.0.6.tgz", + "integrity": "sha512-C4lD4b7mUIw+RZhtY7qUbf4eADmb7Ey8BFA2px9jUbwg7pjTZDl4KY4bvlUV+/vXQvzQRfiGEVJyAbtOsCMInw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/cascade-layer-name-parser": "^2.0.5", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/media-query-list-parser": "^4.0.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-custom-properties": { + "version": "14.0.6", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-14.0.6.tgz", + "integrity": "sha512-fTYSp3xuk4BUeVhxCSJdIPhDLpJfNakZKoiTDx7yRGCdlZrSJR7mWKVOBS4sBF+5poPQFMj2YdXx1VHItBGihQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/cascade-layer-name-parser": "^2.0.5", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-custom-selectors": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-8.0.5.tgz", + "integrity": "sha512-9PGmckHQswiB2usSO6XMSswO2yFWVoCAuih1yl9FVcwkscLjRKjwsjM3t+NIWpSU2Jx3eOiK2+t4vVTQaoCHHg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/cascade-layer-name-parser": "^2.0.5", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-custom-selectors/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-dir-pseudo-class": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-9.0.1.tgz", + "integrity": "sha512-tRBEK0MHYvcMUrAuYMEOa0zg9APqirBcgzi6P21OhxtJyJADo/SWBwY1CAwEohQ/6HDaa9jCjLRG7K3PVQYHEA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-dir-pseudo-class/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-discard-comments": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-6.0.2.tgz", + "integrity": "sha512-65w/uIqhSBBfQmYnG92FO1mWZjJ4GL5b8atm5Yw2UgrwD7HiNiSSNwJor1eCFGzUgYnN/iIknhNRVqjrrpuglw==", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-discard-duplicates": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-6.0.3.tgz", + "integrity": "sha512-+JA0DCvc5XvFAxwx6f/e68gQu/7Z9ud584VLmcgto28eB8FqSFZwtrLwB5Kcp70eIoWP/HXqz4wpo8rD8gpsTw==", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-discard-empty": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-6.0.3.tgz", + "integrity": "sha512-znyno9cHKQsK6PtxL5D19Fj9uwSzC2mB74cpT66fhgOadEUPyXFkbgwm5tvc3bt3NAy8ltE5MrghxovZRVnOjQ==", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-discard-overridden": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-6.0.2.tgz", + "integrity": "sha512-j87xzI4LUggC5zND7KdjsI25APtyMuynXZSujByMaav2roV6OZX+8AaCUcZSWqckZpjAjRyFDdpqybgjFO0HJQ==", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-discard-unused": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-6.0.5.tgz", + "integrity": "sha512-wHalBlRHkaNnNwfC8z+ppX57VhvS+HWgjW508esjdaEYr3Mx7Gnn2xA4R/CKf5+Z9S5qsqC+Uzh4ueENWwCVUA==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-double-position-gradients": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-6.0.4.tgz", + "integrity": "sha512-m6IKmxo7FxSP5nF2l63QbCC3r+bWpFUWmZXZf096WxG0m7Vl1Q1+ruFOhpdDRmKrRS+S3Jtk+TVk/7z0+BVK6g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-focus-visible": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-10.0.1.tgz", + "integrity": "sha512-U58wyjS/I1GZgjRok33aE8juW9qQgQUNwTSdxQGuShHzwuYdcklnvK/+qOWX1Q9kr7ysbraQ6ht6r+udansalA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-focus-visible/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-focus-within": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-9.0.1.tgz", + "integrity": "sha512-fzNUyS1yOYa7mOjpci/bR+u+ESvdar6hk8XNK/TRR0fiGTp2QT5N+ducP0n3rfH/m9I7H/EQU6lsa2BrgxkEjw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-focus-within/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-font-variant": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", + "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", + "license": "MIT", + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-gap-properties": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-6.0.0.tgz", + "integrity": "sha512-Om0WPjEwiM9Ru+VhfEDPZJAKWUd0mV1HmNXqp2C29z80aQ2uP9UVhLc7e3aYMIor/S5cVhoPgYQ7RtfeZpYTRw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-image-set-function": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-7.0.0.tgz", + "integrity": "sha512-QL7W7QNlZuzOwBTeXEmbVckNt1FSmhQtbMRvGGqqU4Nf4xk6KUEQhAoWuMzwbSv5jxiRiSZ5Tv7eiDB9U87znA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-lab-function": { + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-7.0.12.tgz", + "integrity": "sha512-tUcyRk1ZTPec3OuKFsqtRzW2Go5lehW29XA21lZ65XmzQkz43VY2tyWEC202F7W3mILOjw0voOiuxRGTsN+J9w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-loader": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.4.tgz", + "integrity": "sha512-iW5WTTBSC5BfsBJ9daFMPVrLT36MrNiC6fqOZTTaHjBNX6Pfd5p+hSBqe/fEeNd7pc13QiAyGt7VdGMw4eRC4A==", + "license": "MIT", + "dependencies": { + "cosmiconfig": "^8.3.5", + "jiti": "^1.20.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^5.0.0" + } + }, + "node_modules/postcss-logical": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-8.1.0.tgz", + "integrity": "sha512-pL1hXFQ2fEXNKiNiAgtfA005T9FBxky5zkX6s4GZM2D8RkVgRqz3f4g1JUoq925zXv495qk8UNldDwh8uGEDoA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-merge-idents": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-6.0.3.tgz", + "integrity": "sha512-1oIoAsODUs6IHQZkLQGO15uGEbK3EAl5wi9SS8hs45VgsxQfMnxvt+L+zIr7ifZFIH14cfAeVe2uCTa+SPRa3g==", + "license": "MIT", + "dependencies": { + "cssnano-utils": "^4.0.2", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-merge-longhand": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-6.0.5.tgz", + "integrity": "sha512-5LOiordeTfi64QhICp07nzzuTDjNSO8g5Ksdibt44d+uvIIAE1oZdRn8y/W5ZtYgRH/lnLDlvi9F8btZcVzu3w==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "stylehacks": "^6.1.1" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-merge-rules": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-6.1.1.tgz", + "integrity": "sha512-KOdWF0gju31AQPZiD+2Ar9Qjowz1LTChSjFFbS+e2sFgc4uHOp3ZvVX4sNeTlk0w2O31ecFGgrFzhO0RSWbWwQ==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^4.0.2", + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-minify-font-values": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-6.1.0.tgz", + "integrity": "sha512-gklfI/n+9rTh8nYaSJXlCo3nOKqMNkxuGpTn/Qm0gstL3ywTr9/WRKznE+oy6fvfolH6dF+QM4nCo8yPLdvGJg==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-minify-gradients": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-6.0.3.tgz", + "integrity": "sha512-4KXAHrYlzF0Rr7uc4VrfwDJ2ajrtNEpNEuLxFgwkhFZ56/7gaE4Nr49nLsQDZyUe+ds+kEhf+YAUolJiYXF8+Q==", + "license": "MIT", + "dependencies": { + "colord": "^2.9.3", + "cssnano-utils": "^4.0.2", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-minify-params": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-6.1.0.tgz", + "integrity": "sha512-bmSKnDtyyE8ujHQK0RQJDIKhQ20Jq1LYiez54WiaOoBtcSuflfK3Nm596LvbtlFcpipMjgClQGyGr7GAs+H1uA==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "cssnano-utils": "^4.0.2", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-minify-selectors": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-6.0.4.tgz", + "integrity": "sha512-L8dZSwNLgK7pjTto9PzWRoMbnLq5vsZSTu8+j1P/2GB8qdtGQfn+K1uSvFgYvgh83cbyxT5m43ZZhUMTJDSClQ==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", + "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", + "license": "MIT", + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", + "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", + "license": "ISC", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "license": "ISC", + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-nesting": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-13.0.2.tgz", + "integrity": "sha512-1YCI290TX+VP0U/K/aFxzHzQWHWURL+CtHMSbex1lCdpXD1SoR2sYuxDu5aNI9lPoXpKTCggFZiDJbwylU0LEQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/selector-resolve-nested": "^3.1.0", + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-nesting/node_modules/@csstools/selector-resolve-nested": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-resolve-nested/-/selector-resolve-nested-3.1.0.tgz", + "integrity": "sha512-mf1LEW0tJLKfWyvn5KdDrhpxHyuxpbNwTIwOYLIvsTffeyOf85j5oIzfG0yosxDgx/sswlqBnESYUcQH0vgZ0g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/postcss-nesting/node_modules/@csstools/selector-specificity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/postcss-nesting/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-normalize-charset": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-6.0.2.tgz", + "integrity": "sha512-a8N9czmdnrjPHa3DeFlwqst5eaL5W8jYu3EBbTTkI5FHkfMhFZh1EGbku6jhHhIzTA6tquI2P42NtZ59M/H/kQ==", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-display-values": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-6.0.2.tgz", + "integrity": "sha512-8H04Mxsb82ON/aAkPeq8kcBbAtI5Q2a64X/mnRRfPXBq7XeogoQvReqxEfc0B4WPq1KimjezNC8flUtC3Qz6jg==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-positions": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-6.0.2.tgz", + "integrity": "sha512-/JFzI441OAB9O7VnLA+RtSNZvQ0NCFZDOtp6QPFo1iIyawyXg0YI3CYM9HBy1WvwCRHnPep/BvI1+dGPKoXx/Q==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-repeat-style": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-6.0.2.tgz", + "integrity": "sha512-YdCgsfHkJ2jEXwR4RR3Tm/iOxSfdRt7jplS6XRh9Js9PyCR/aka/FCb6TuHT2U8gQubbm/mPmF6L7FY9d79VwQ==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-string": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-6.0.2.tgz", + "integrity": "sha512-vQZIivlxlfqqMp4L9PZsFE4YUkWniziKjQWUtsxUiVsSSPelQydwS8Wwcuw0+83ZjPWNTl02oxlIvXsmmG+CiQ==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-timing-functions": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-6.0.2.tgz", + "integrity": "sha512-a+YrtMox4TBtId/AEwbA03VcJgtyW4dGBizPl7e88cTFULYsprgHWTbfyjSLyHeBcK/Q9JhXkt2ZXiwaVHoMzA==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-unicode": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-6.1.0.tgz", + "integrity": "sha512-QVC5TQHsVj33otj8/JD869Ndr5Xcc/+fwRh4HAsFsAeygQQXm+0PySrKbr/8tkDKzW+EVT3QkqZMfFrGiossDg==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-url": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-6.0.2.tgz", + "integrity": "sha512-kVNcWhCeKAzZ8B4pv/DnrU1wNh458zBNp8dh4y5hhxih5RZQ12QWMuQrDgPRw3LRl8mN9vOVfHl7uhvHYMoXsQ==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-whitespace": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-6.0.2.tgz", + "integrity": "sha512-sXZ2Nj1icbJOKmdjXVT9pnyHQKiSAyuNQHSgRCUgThn2388Y9cGVDR+E9J9iAYbSbLHI+UUwLVl1Wzco/zgv0Q==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-opacity-percentage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-3.0.0.tgz", + "integrity": "sha512-K6HGVzyxUxd/VgZdX04DCtdwWJ4NGLG212US4/LA1TLAbHgmAsTWVR86o+gGIbFtnTkfOpb9sCRBx8K7HO66qQ==", + "funding": [ + { + "type": "kofi", + "url": "https://ko-fi.com/mrcgrtz" + }, + { + "type": "liberapay", + "url": "https://liberapay.com/mrcgrtz" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-ordered-values": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-6.0.2.tgz", + "integrity": "sha512-VRZSOB+JU32RsEAQrO94QPkClGPKJEL/Z9PCBImXMhIeK5KAYo6slP/hBYlLgrCjFxyqvn5VC81tycFEDBLG1Q==", + "license": "MIT", + "dependencies": { + "cssnano-utils": "^4.0.2", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-overflow-shorthand": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-6.0.0.tgz", + "integrity": "sha512-BdDl/AbVkDjoTofzDQnwDdm/Ym6oS9KgmO7Gr+LHYjNWJ6ExORe4+3pcLQsLA9gIROMkiGVjjwZNoL/mpXHd5Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-page-break": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", + "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", + "license": "MIT", + "peerDependencies": { + "postcss": "^8" + } + }, + "node_modules/postcss-place": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-10.0.0.tgz", + "integrity": "sha512-5EBrMzat2pPAxQNWYavwAfoKfYcTADJ8AXGVPcUZ2UkNloUTWzJQExgrzrDkh3EKzmAx1evfTAzF9I8NGcc+qw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-preset-env": { + "version": "10.6.1", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-10.6.1.tgz", + "integrity": "sha512-yrk74d9EvY+W7+lO9Aj1QmjWY9q5NsKjK2V9drkOPZB/X6KZ0B3igKsHUYakb7oYVhnioWypQX3xGuePf89f3g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/postcss-alpha-function": "^1.0.1", + "@csstools/postcss-cascade-layers": "^5.0.2", + "@csstools/postcss-color-function": "^4.0.12", + "@csstools/postcss-color-function-display-p3-linear": "^1.0.1", + "@csstools/postcss-color-mix-function": "^3.0.12", + "@csstools/postcss-color-mix-variadic-function-arguments": "^1.0.2", + "@csstools/postcss-content-alt-text": "^2.0.8", + "@csstools/postcss-contrast-color-function": "^2.0.12", + "@csstools/postcss-exponential-functions": "^2.0.9", + "@csstools/postcss-font-format-keywords": "^4.0.0", + "@csstools/postcss-gamut-mapping": "^2.0.11", + "@csstools/postcss-gradients-interpolation-method": "^5.0.12", + "@csstools/postcss-hwb-function": "^4.0.12", + "@csstools/postcss-ic-unit": "^4.0.4", + "@csstools/postcss-initial": "^2.0.1", + "@csstools/postcss-is-pseudo-class": "^5.0.3", + "@csstools/postcss-light-dark-function": "^2.0.11", + "@csstools/postcss-logical-float-and-clear": "^3.0.0", + "@csstools/postcss-logical-overflow": "^2.0.0", + "@csstools/postcss-logical-overscroll-behavior": "^2.0.0", + "@csstools/postcss-logical-resize": "^3.0.0", + "@csstools/postcss-logical-viewport-units": "^3.0.4", + "@csstools/postcss-media-minmax": "^2.0.9", + "@csstools/postcss-media-queries-aspect-ratio-number-values": "^3.0.5", + "@csstools/postcss-nested-calc": "^4.0.0", + "@csstools/postcss-normalize-display-values": "^4.0.1", + "@csstools/postcss-oklab-function": "^4.0.12", + "@csstools/postcss-position-area-property": "^1.0.0", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/postcss-property-rule-prelude-list": "^1.0.0", + "@csstools/postcss-random-function": "^2.0.1", + "@csstools/postcss-relative-color-syntax": "^3.0.12", + "@csstools/postcss-scope-pseudo-class": "^4.0.1", + "@csstools/postcss-sign-functions": "^1.1.4", + "@csstools/postcss-stepped-value-functions": "^4.0.9", + "@csstools/postcss-syntax-descriptor-syntax-production": "^1.0.1", + "@csstools/postcss-system-ui-font-family": "^1.0.0", + "@csstools/postcss-text-decoration-shorthand": "^4.0.3", + "@csstools/postcss-trigonometric-functions": "^4.0.9", + "@csstools/postcss-unset-value": "^4.0.0", + "autoprefixer": "^10.4.23", + "browserslist": "^4.28.1", + "css-blank-pseudo": "^7.0.1", + "css-has-pseudo": "^7.0.3", + "css-prefers-color-scheme": "^10.0.0", + "cssdb": "^8.6.0", + "postcss-attribute-case-insensitive": "^7.0.1", + "postcss-clamp": "^4.1.0", + "postcss-color-functional-notation": "^7.0.12", + "postcss-color-hex-alpha": "^10.0.0", + "postcss-color-rebeccapurple": "^10.0.0", + "postcss-custom-media": "^11.0.6", + "postcss-custom-properties": "^14.0.6", + "postcss-custom-selectors": "^8.0.5", + "postcss-dir-pseudo-class": "^9.0.1", + "postcss-double-position-gradients": "^6.0.4", + "postcss-focus-visible": "^10.0.1", + "postcss-focus-within": "^9.0.1", + "postcss-font-variant": "^5.0.0", + "postcss-gap-properties": "^6.0.0", + "postcss-image-set-function": "^7.0.0", + "postcss-lab-function": "^7.0.12", + "postcss-logical": "^8.1.0", + "postcss-nesting": "^13.0.2", + "postcss-opacity-percentage": "^3.0.0", + "postcss-overflow-shorthand": "^6.0.0", + "postcss-page-break": "^3.0.4", + "postcss-place": "^10.0.0", + "postcss-pseudo-class-any-link": "^10.0.1", + "postcss-replace-overflow-wrap": "^4.0.0", + "postcss-selector-not": "^8.0.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-pseudo-class-any-link": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-10.0.1.tgz", + "integrity": "sha512-3el9rXlBOqTFaMFkWDOkHUTQekFIYnaQY55Rsp8As8QQkpiSgIYEcF/6Ond93oHiDsGb4kad8zjt+NPlOC1H0Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-pseudo-class-any-link/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-reduce-idents": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-6.0.3.tgz", + "integrity": "sha512-G3yCqZDpsNPoQgbDUy3T0E6hqOQ5xigUtBQyrmq3tn2GxlyiL0yyl7H+T8ulQR6kOcHJ9t7/9H4/R2tv8tJbMA==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-reduce-initial": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-6.1.0.tgz", + "integrity": "sha512-RarLgBK/CrL1qZags04oKbVbrrVK2wcxhvta3GCxrZO4zveibqbRPmm2VI8sSgCXwoUHEliRSbOfpR0b/VIoiw==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "caniuse-api": "^3.0.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-reduce-transforms": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-6.0.2.tgz", + "integrity": "sha512-sB+Ya++3Xj1WaT9+5LOOdirAxP7dJZms3GRcYheSPi1PiTMigsxHAdkrbItHxwYHr4kt1zL7mmcHstgMYT+aiA==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-replace-overflow-wrap": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", + "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", + "license": "MIT", + "peerDependencies": { + "postcss": "^8.0.3" + } + }, + "node_modules/postcss-selector-not": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-8.0.1.tgz", + "integrity": "sha512-kmVy/5PYVb2UOhy0+LqUYAhKj7DUGDpSWa5LZqlkWJaaAV+dxxsOG3+St0yNLu6vsKD7Dmqx+nWQt0iil89+WA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-selector-not/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-sort-media-queries": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-5.2.0.tgz", + "integrity": "sha512-AZ5fDMLD8SldlAYlvi8NIqo0+Z8xnXU2ia0jxmuhxAU+Lqt9K+AlmLNJ/zWEnE9x+Zx3qL3+1K20ATgNOr3fAA==", + "license": "MIT", + "dependencies": { + "sort-css-media-queries": "2.2.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.4.23" + } + }, + "node_modules/postcss-svgo": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-6.0.3.tgz", + "integrity": "sha512-dlrahRmxP22bX6iKEjOM+c8/1p+81asjKT+V5lrgOH944ryx/OHpclnIbGsKVd3uWOXFLYJwCVf0eEkJGvO96g==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "svgo": "^3.2.0" + }, + "engines": { + "node": "^14 || ^16 || >= 18" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-unique-selectors": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-6.0.4.tgz", + "integrity": "sha512-K38OCaIrO8+PzpArzkLKB42dSARtC2tmG6PvD4b1o1Q2E9Os8jzfWFfSy/rixsHwohtsDdFtAWGjFVFUdwYaMg==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "license": "MIT" + }, + "node_modules/postcss-zindex": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-6.0.2.tgz", + "integrity": "sha512-5BxW9l1evPB/4ZIc+2GobEBoKC+h8gPGCMi+jxsYvd2x0mjq7wazk6DrP71pStqxE9Foxh5TVnonbWpFZzXaYg==", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/pretty-error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", + "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", + "license": "MIT", + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^3.0.0" + } + }, + "node_modules/pretty-time": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz", + "integrity": "sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/prism-react-renderer": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-2.4.1.tgz", + "integrity": "sha512-ey8Ls/+Di31eqzUxC46h8MksNuGx/n0AAC8uKpwFau4RPDYLuE3EXTp8N8G2vX2N7UC/+IXeNUnlWBGGcAG+Ig==", + "license": "MIT", + "dependencies": { + "@types/prismjs": "^1.26.0", + "clsx": "^2.0.0" + }, + "peerDependencies": { + "react": ">=16.0.0" + } + }, + "node_modules/prismjs": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", + "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "license": "MIT" + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/property-information": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", + "license": "ISC" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pupa": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.3.0.tgz", + "integrity": "sha512-LjgDO2zPtoXP2wJpDjZrGdojii1uqO0cnwKoIoUzkfS98HDmbeiGmYiXo3lXeFlq2xvne1QFQhwYXSUCLKtEuA==", + "license": "MIT", + "dependencies": { + "escape-goat": "^4.0.0" + }, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pvtsutils": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.3.6.tgz", + "integrity": "sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.8.1" + } + }, + "node_modules/pvutils": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.1.5.tgz", + "integrity": "sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA==", + "license": "MIT", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/qs": { + "version": "6.14.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.2.tgz", + "integrity": "sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", + "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-fast-compare": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz", + "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==", + "license": "MIT" + }, + "node_modules/react-helmet-async": { + "name": "@slorber/react-helmet-async", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@slorber/react-helmet-async/-/react-helmet-async-1.3.0.tgz", + "integrity": "sha512-e9/OK8VhwUSc67diWI8Rb3I0YgI9/SBQtnhe9aEuK6MhZm7ntZZimXgwXnd8W96YTmSOb9M4d8LwhRZyhWr/1A==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime": "^7.12.5", + "invariant": "^2.2.4", + "prop-types": "^15.7.2", + "react-fast-compare": "^3.2.0", + "shallowequal": "^1.1.0" + }, + "peerDependencies": { + "react": "^16.6.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.6.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/react-json-view-lite": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/react-json-view-lite/-/react-json-view-lite-2.5.0.tgz", + "integrity": "sha512-tk7o7QG9oYyELWHL8xiMQ8x4WzjCzbWNyig3uexmkLb54r8jO0yH3WCWx8UZS0c49eSA4QUmG5caiRJ8fAn58g==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/react-loadable": { + "name": "@docusaurus/react-loadable", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-6.0.0.tgz", + "integrity": "sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==", + "license": "MIT", + "dependencies": { + "@types/react": "*" + }, + "peerDependencies": { + "react": "*" + } + }, + "node_modules/react-loadable-ssr-addon-v5-slorber": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/react-loadable-ssr-addon-v5-slorber/-/react-loadable-ssr-addon-v5-slorber-1.0.1.tgz", + "integrity": "sha512-lq3Lyw1lGku8zUEJPDxsNm1AfYHBrO9Y1+olAYwpUJ2IGFBskM0DMKok97A6LWUpHm+o7IvQBOWu9MLenp9Z+A==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.3" + }, + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "react-loadable": "*", + "webpack": ">=4.41.1 || 5.x" + } + }, + "node_modules/react-router": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", + "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "hoist-non-react-statics": "^3.1.0", + "loose-envify": "^1.3.1", + "path-to-regexp": "^1.7.0", + "prop-types": "^15.6.2", + "react-is": "^16.6.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "peerDependencies": { + "react": ">=15" + } + }, + "node_modules/react-router-config": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/react-router-config/-/react-router-config-5.1.1.tgz", + "integrity": "sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.1.2" + }, + "peerDependencies": { + "react": ">=15", + "react-router": ">=5" + } + }, + "node_modules/react-router-dom": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.4.tgz", + "integrity": "sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "loose-envify": "^1.3.1", + "prop-types": "^15.6.2", + "react-router": "5.3.4", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "peerDependencies": { + "react": ">=15" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/recma-build-jsx": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-build-jsx/-/recma-build-jsx-1.0.0.tgz", + "integrity": "sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-util-build-jsx": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/recma-jsx": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/recma-jsx/-/recma-jsx-1.0.1.tgz", + "integrity": "sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w==", + "license": "MIT", + "dependencies": { + "acorn-jsx": "^5.0.0", + "estree-util-to-js": "^2.0.0", + "recma-parse": "^1.0.0", + "recma-stringify": "^1.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/recma-parse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-parse/-/recma-parse-1.0.0.tgz", + "integrity": "sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "esast-util-from-js": "^2.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/recma-stringify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-stringify/-/recma-stringify-1.0.0.tgz", + "integrity": "sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-util-to-js": "^2.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/reflect-metadata": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", + "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", + "license": "Apache-2.0" + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "license": "MIT" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz", + "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==", + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regexpu-core": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz", + "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==", + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.2.2", + "regjsgen": "^0.8.0", + "regjsparser": "^0.13.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.2.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/registry-auth-token": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.1.1.tgz", + "integrity": "sha512-P7B4+jq8DeD2nMsAcdfaqHbssgHtZ7Z5+++a5ask90fvmJ8p5je4mOa+wzu+DB4vQ5tdJV/xywY+UnVFeQLV5Q==", + "license": "MIT", + "dependencies": { + "@pnpm/npm-conf": "^3.0.2" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/registry-url": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-6.0.1.tgz", + "integrity": "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==", + "license": "MIT", + "dependencies": { + "rc": "1.2.8" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", + "license": "MIT" + }, + "node_modules/regjsparser": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.0.tgz", + "integrity": "sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==", + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~3.1.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/rehype-raw": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", + "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-raw": "^9.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-recma": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rehype-recma/-/rehype-recma-1.0.0.tgz", + "integrity": "sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "hast-util-to-estree": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/remark-directive": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/remark-directive/-/remark-directive-3.0.1.tgz", + "integrity": "sha512-gwglrEQEZcZYgVyG1tQuA+h58EZfq5CSULw7J90AFuCTyib1thgHPoqQ+h9iFvU6R+vnZ5oNFQR5QKgGpk741A==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-directive": "^3.0.0", + "micromark-extension-directive": "^3.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-emoji": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/remark-emoji/-/remark-emoji-4.0.1.tgz", + "integrity": "sha512-fHdvsTR1dHkWKev9eNyhTo4EFwbUvJ8ka9SgeWkMPYFX4WoI7ViVBms3PjlQYgw5TLvNQso3GUB/b/8t3yo+dg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.2", + "emoticon": "^4.0.1", + "mdast-util-find-and-replace": "^3.0.1", + "node-emoji": "^2.1.0", + "unified": "^11.0.4" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/remark-frontmatter": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/remark-frontmatter/-/remark-frontmatter-5.0.0.tgz", + "integrity": "sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-frontmatter": "^2.0.0", + "micromark-extension-frontmatter": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-gfm": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", + "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-gfm": "^3.0.0", + "micromark-extension-gfm": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-mdx": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.1.1.tgz", + "integrity": "sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg==", + "license": "MIT", + "dependencies": { + "mdast-util-mdx": "^3.0.0", + "micromark-extension-mdxjs": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", + "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-stringify": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", + "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-to-markdown": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/renderkid": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", + "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", + "license": "MIT", + "dependencies": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" + } + }, + "node_modules/renderkid/node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/renderkid/node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-like": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz", + "integrity": "sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==", + "engines": { + "node": "*" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "license": "MIT" + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pathname": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", + "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==", + "license": "MIT" + }, + "node_modules/responselike": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", + "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", + "license": "MIT", + "dependencies": { + "lowercase-keys": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rtlcss": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.3.0.tgz", + "integrity": "sha512-FI+pHEn7Wc4NqKXMXFM+VAYKEj/mRIcW4h24YVwVtyjI+EqGrLc2Hx/Ny0lrZ21cBWU2goLy36eqMcNj3AQJig==", + "license": "MIT", + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0", + "postcss": "^8.4.21", + "strip-json-comments": "^3.1.1" + }, + "bin": { + "rtlcss": "bin/rtlcss.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/run-applescript": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", + "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/sax": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.5.0.tgz", + "integrity": "sha512-21IYA3Q5cQf089Z6tgaUTr7lDAyzoTPx5HRtbhsME8Udispad8dC/+sziTNugOEx54ilvatQ9YCzl4KQLPcRHA==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=11.0.0" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/schema-dts": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/schema-dts/-/schema-dts-1.1.5.tgz", + "integrity": "sha512-RJr9EaCmsLzBX2NDiO5Z3ux2BVosNZN5jo0gWgsyKvxKIUL5R3swNvoorulAeL9kLB0iTSX7V6aokhla2m7xbg==", + "license": "Apache-2.0" + }, + "node_modules/schema-utils": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/search-insights": { + "version": "2.17.3", + "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.17.3.tgz", + "integrity": "sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==", + "license": "MIT", + "peer": true + }, + "node_modules/section-matter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", + "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", + "license": "MIT", + "dependencies": { + "extend-shallow": "^2.0.1", + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "license": "MIT" + }, + "node_modules/selfsigned": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-5.5.0.tgz", + "integrity": "sha512-ftnu3TW4+3eBfLRFnDEkzGxSF/10BJBkaLJuBHZX0kiPS7bRdlpZGu6YGt4KngMkdTwJE6MbjavFpqHvqVt+Ew==", + "license": "MIT", + "dependencies": { + "@peculiar/x509": "^1.14.2", + "pkijs": "^3.3.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz", + "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==", + "license": "MIT", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/send": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", + "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.1", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "~2.4.1", + "range-parser": "~1.2.1", + "statuses": "~2.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/send/node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serialize-javascript": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-7.0.4.tgz", + "integrity": "sha512-DuGdB+Po43Q5Jxwpzt1lhyFSYKryqoNjQSA9M92tyw0lyHIOur+XCalOUe0KTJpyqzT8+fQ5A0Jf7vCx/NKmIg==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/serve-handler": { + "version": "6.1.7", + "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.7.tgz", + "integrity": "sha512-CinAq1xWb0vR3twAv9evEU8cNWkXCb9kd5ePAHUKJBkOsUpR1wt/CvGdeca7vqumL1U5cSaeVQ6zZMxiJ3yWsg==", + "license": "MIT", + "dependencies": { + "bytes": "3.0.0", + "content-disposition": "0.5.2", + "mime-types": "2.1.18", + "minimatch": "3.1.5", + "path-is-inside": "1.0.2", + "path-to-regexp": "3.3.0", + "range-parser": "1.2.0" + } + }, + "node_modules/serve-handler/node_modules/path-to-regexp": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.3.0.tgz", + "integrity": "sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==", + "license": "MIT" + }, + "node_modules/serve-index": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.2.tgz", + "integrity": "sha512-KDj11HScOaLmrPxl70KYNW1PksP4Nb/CLL2yvC+Qd2kHMPEEpfc4Re2e4FOay+bC/+XQl/7zAcWON3JVo5v3KQ==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.8.0", + "mime-types": "~2.1.35", + "parseurl": "~1.3.3" + }, + "engines": { + "node": ">= 0.8.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "license": "MIT", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", + "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "~0.19.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", + "license": "MIT" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", + "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" + }, + "node_modules/sirv": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", + "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", + "license": "MIT", + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "license": "MIT" + }, + "node_modules/sitemap": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-7.1.3.tgz", + "integrity": "sha512-tAjEd+wt/YwnEbfNB2ht51ybBJxbEWwe5ki/Z//Wh0rpBFTCUSj46GnxUKEWzhfuJTsee8x3lybHxFgUMig2hw==", + "license": "MIT", + "dependencies": { + "@types/node": "^17.0.5", + "@types/sax": "^1.2.1", + "arg": "^5.0.0", + "sax": "^1.2.4" + }, + "bin": { + "sitemap": "dist/cli.js" + }, + "engines": { + "node": ">=12.0.0", + "npm": ">=5.6.0" + } + }, + "node_modules/sitemap/node_modules/@types/node": { + "version": "17.0.45", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", + "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==", + "license": "MIT" + }, + "node_modules/skin-tone": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/skin-tone/-/skin-tone-2.0.0.tgz", + "integrity": "sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==", + "license": "MIT", + "dependencies": { + "unicode-emoji-modifier-base": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/snake-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", + "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "license": "MIT", + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/sort-css-media-queries": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-2.2.0.tgz", + "integrity": "sha512-0xtkGhWCC9MGt/EzgnvbbbKhqWjl1+/rncmhTh5qCpbYguXh6S/qwePfv/JQ8jePXXmqingylxoC49pCkSPIbA==", + "license": "MIT", + "engines": { + "node": ">= 6.3.0" + } + }, + "node_modules/source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 12" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "license": "BSD-3-Clause" + }, + "node_modules/srcset": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/srcset/-/srcset-4.0.0.tgz", + "integrity": "sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/std-env": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", + "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", + "license": "MIT" + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "license": "BSD-2-Clause", + "dependencies": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/style-to-js": { + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.21.tgz", + "integrity": "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==", + "license": "MIT", + "dependencies": { + "style-to-object": "1.0.14" + } + }, + "node_modules/style-to-object": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.14.tgz", + "integrity": "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==", + "license": "MIT", + "dependencies": { + "inline-style-parser": "0.2.7" + } + }, + "node_modules/stylehacks": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-6.1.1.tgz", + "integrity": "sha512-gSTTEQ670cJNoaeIp9KX6lZmm8LJ3jPB5yJmX8Zq/wQxOsAFXV3qjWzHas3YYk1qesuVIyYWWUpZ0vSE/dTSGg==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", + "license": "MIT" + }, + "node_modules/svgo": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.3.tgz", + "integrity": "sha512-+wn7I4p7YgJhHs38k2TNjy1vCfPIfLIJWR5MnCStsN8WuuTcBnRKcMHQLMM2ijxGZmDoZwNv8ipl5aTTen62ng==", + "license": "MIT", + "dependencies": { + "commander": "^7.2.0", + "css-select": "^5.1.0", + "css-tree": "^2.3.1", + "css-what": "^6.1.0", + "csso": "^5.0.5", + "picocolors": "^1.0.0", + "sax": "^1.5.0" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/svgo" + } + }, + "node_modules/svgo/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/tapable": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/terser": { + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.46.0.tgz", + "integrity": "sha512-jTwoImyr/QbOWFFso3YoU3ik0jBBDJ6JTOQiy/J2YxVJdZCc+5u7skhNwiOR3FQIygFqVUPHl7qbbxtjW2K3Qg==", + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.15.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.4.0.tgz", + "integrity": "sha512-Bn5vxm48flOIfkdl5CaD2+1CiUVbonWQ3KQPyP7/EuIl9Gbzq/gQFOzaMFUEgVjB1396tcK0SG8XcNJ/2kDH8g==", + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "jest-worker": "^27.4.5", + "schema-utils": "^4.3.0", + "terser": "^5.31.1" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/terser-webpack-plugin/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "license": "MIT" + }, + "node_modules/thingies": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/thingies/-/thingies-2.5.0.tgz", + "integrity": "sha512-s+2Bwztg6PhWUD7XMfeYm5qliDdSiZm7M7n8KjTkIsm3l/2lgVRc2/Gx/v+ZX8lT4FMA+i8aQvhcWylldc+ZNw==", + "license": "MIT", + "engines": { + "node": ">=10.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "^2" + } + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "license": "MIT" + }, + "node_modules/tiny-invariant": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", + "license": "MIT" + }, + "node_modules/tiny-warning": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==", + "license": "MIT" + }, + "node_modules/tinypool": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", + "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/tree-dump": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.1.0.tgz", + "integrity": "sha512-rMuvhU4MCDbcbnleZTFezWsaZXRFemSqAM+7jPnzUl1fo9w3YEKOxAeui0fz3OI4EU4hf23iyA7uQRVko+UaBA==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/tsyringe": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/tsyringe/-/tsyringe-4.10.0.tgz", + "integrity": "sha512-axr3IdNuVIxnaK5XGEUFTu3YmAQ6lllgrvqfEoR16g/HGnYY/6We4oWENtAnzK6/LpJ2ur9PAb80RBt7/U4ugw==", + "license": "MIT", + "dependencies": { + "tslib": "^1.9.3" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/tsyringe/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "license": "0BSD" + }, + "node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/type-is/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/type-is/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "license": "MIT", + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/typescript": { + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", + "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", + "devOptional": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici": { + "version": "7.22.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.22.0.tgz", + "integrity": "sha512-RqslV2Us5BrllB+JeiZnK4peryVTndy9Dnqq62S3yYRRTj0tFQCwEniUy2167skdGOy3vqRzEvl1Dm4sV2ReDg==", + "license": "MIT", + "engines": { + "node": ">=20.18.1" + } + }, + "node_modules/undici-types": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", + "license": "MIT" + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-emoji-modifier-base": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz", + "integrity": "sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "license": "MIT", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz", + "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz", + "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unique-string": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", + "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", + "license": "MIT", + "dependencies": { + "crypto-random-string": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", + "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position-from-estree": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz", + "integrity": "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz", + "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", + "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/update-notifier": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-6.0.2.tgz", + "integrity": "sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==", + "license": "BSD-2-Clause", + "dependencies": { + "boxen": "^7.0.0", + "chalk": "^5.0.1", + "configstore": "^6.0.0", + "has-yarn": "^3.0.0", + "import-lazy": "^4.0.0", + "is-ci": "^3.0.1", + "is-installed-globally": "^0.4.0", + "is-npm": "^6.0.0", + "is-yarn-global": "^0.4.0", + "latest-version": "^7.0.0", + "pupa": "^3.1.0", + "semver": "^7.3.7", + "semver-diff": "^4.0.0", + "xdg-basedir": "^5.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/yeoman/update-notifier?sponsor=1" + } + }, + "node_modules/update-notifier/node_modules/boxen": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.1.1.tgz", + "integrity": "sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==", + "license": "MIT", + "dependencies": { + "ansi-align": "^3.0.1", + "camelcase": "^7.0.1", + "chalk": "^5.2.0", + "cli-boxes": "^3.0.0", + "string-width": "^5.1.2", + "type-fest": "^2.13.0", + "widest-line": "^4.0.1", + "wrap-ansi": "^8.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-notifier/node_modules/camelcase": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", + "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-notifier/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-loader": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", + "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "mime-types": "^2.1.27", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "file-loader": "*", + "webpack": "^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "file-loader": { + "optional": true + } + } + }, + "node_modules/url-loader/node_modules/ajv": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/url-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/url-loader/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "license": "MIT" + }, + "node_modules/url-loader/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/url-loader/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/url-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", + "license": "MIT" + }, + "node_modules/utility-types": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz", + "integrity": "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/value-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", + "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==", + "license": "MIT" + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz", + "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/watchpack": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.1.tgz", + "integrity": "sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==", + "license": "MIT", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "license": "MIT", + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/web-namespaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", + "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/webpack": { + "version": "5.105.4", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.105.4.tgz", + "integrity": "sha512-jTywjboN9aHxFlToqb0K0Zs9SbBoW4zRUlGzI2tYNxVYcEi/IPpn+Xi4ye5jTLvX2YeLuic/IvxNot+Q1jMoOw==", + "license": "MIT", + "dependencies": { + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.8", + "@types/json-schema": "^7.0.15", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.16.0", + "acorn-import-phases": "^1.0.3", + "browserslist": "^4.28.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.20.0", + "es-module-lexer": "^2.0.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.3.1", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^4.3.3", + "tapable": "^2.3.0", + "terser-webpack-plugin": "^5.3.17", + "watchpack": "^2.5.1", + "webpack-sources": "^3.3.4" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-bundle-analyzer": { + "version": "4.10.2", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.2.tgz", + "integrity": "sha512-vJptkMm9pk5si4Bv922ZbKLV8UTT4zib4FPgXMhgzUny0bfDDkLXAVQs3ly3fS4/TN9ROFtb0NFrm04UXFE/Vw==", + "license": "MIT", + "dependencies": { + "@discoveryjs/json-ext": "0.5.7", + "acorn": "^8.0.4", + "acorn-walk": "^8.0.0", + "commander": "^7.2.0", + "debounce": "^1.2.1", + "escape-string-regexp": "^4.0.0", + "gzip-size": "^6.0.0", + "html-escaper": "^2.0.2", + "opener": "^1.5.2", + "picocolors": "^1.0.0", + "sirv": "^2.0.3", + "ws": "^7.3.1" + }, + "bin": { + "webpack-bundle-analyzer": "lib/bin/analyzer.js" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/webpack-dev-middleware": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.4.5.tgz", + "integrity": "sha512-uxQ6YqGdE4hgDKNf7hUiPXOdtkXvBJXrfEGYSx7P7LC8hnUYGK70X6xQXUvXeNyBDDcsiQXpG2m3G9vxowaEuA==", + "license": "MIT", + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^4.43.1", + "mime-types": "^3.0.1", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + } + } + }, + "node_modules/webpack-dev-middleware/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack-dev-middleware/node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/webpack-dev-middleware/node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack-dev-server": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.2.3.tgz", + "integrity": "sha512-9Gyu2F7+bg4Vv+pjbovuYDhHX+mqdqITykfzdM9UyKqKHlsE5aAjRhR+oOEfXW5vBeu8tarzlJFIZva4ZjAdrQ==", + "license": "MIT", + "dependencies": { + "@types/bonjour": "^3.5.13", + "@types/connect-history-api-fallback": "^1.5.4", + "@types/express": "^4.17.25", + "@types/express-serve-static-core": "^4.17.21", + "@types/serve-index": "^1.9.4", + "@types/serve-static": "^1.15.5", + "@types/sockjs": "^0.3.36", + "@types/ws": "^8.5.10", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.2.1", + "chokidar": "^3.6.0", + "colorette": "^2.0.10", + "compression": "^1.8.1", + "connect-history-api-fallback": "^2.0.0", + "express": "^4.22.1", + "graceful-fs": "^4.2.6", + "http-proxy-middleware": "^2.0.9", + "ipaddr.js": "^2.1.0", + "launch-editor": "^2.6.1", + "open": "^10.0.3", + "p-retry": "^6.2.0", + "schema-utils": "^4.2.0", + "selfsigned": "^5.5.0", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^7.4.2", + "ws": "^8.18.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/webpack-dev-server/node_modules/open": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz", + "integrity": "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==", + "license": "MIT", + "dependencies": { + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "wsl-utils": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/webpack-dev-server/node_modules/ws": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", + "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/webpack-merge": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz", + "integrity": "sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==", + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.4.tgz", + "integrity": "sha512-7tP1PdV4vF+lYPnkMR0jMY5/la2ub5Fc/8VQrrU+lXkiM6C4TjVfGw7iKfyhnTQOsD+6Q/iKw0eFciziRgD58Q==", + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpackbar": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-6.0.1.tgz", + "integrity": "sha512-TnErZpmuKdwWBdMoexjio3KKX6ZtoKHRVvLIU0A47R0VVBDtx3ZyOJDktgYixhoJokZTYTt1Z37OkO9pnGJa9Q==", + "license": "MIT", + "dependencies": { + "ansi-escapes": "^4.3.2", + "chalk": "^4.1.2", + "consola": "^3.2.3", + "figures": "^3.2.0", + "markdown-table": "^2.0.0", + "pretty-time": "^1.1.0", + "std-env": "^3.7.0", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=14.21.3" + }, + "peerDependencies": { + "webpack": "3 || 4 || 5" + } + }, + "node_modules/webpackbar/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/webpackbar/node_modules/markdown-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz", + "integrity": "sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==", + "license": "MIT", + "dependencies": { + "repeat-string": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/webpackbar/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/webpackbar/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "license": "Apache-2.0", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/whatwg-encoding": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation", + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/widest-line": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", + "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", + "license": "MIT", + "dependencies": { + "string-width": "^5.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "license": "MIT" + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/wsl-utils": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz", + "integrity": "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==", + "license": "MIT", + "dependencies": { + "is-wsl": "^3.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wsl-utils/node_modules/is-wsl": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz", + "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==", + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/xdg-basedir": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz", + "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/xml-js": { + "version": "1.6.11", + "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", + "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", + "license": "MIT", + "dependencies": { + "sax": "^1.2.4" + }, + "bin": { + "xml-js": "bin/cli.js" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "license": "ISC" + }, + "node_modules/yocto-queue": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz", + "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==", + "license": "MIT", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/docs/docusaurus/package.json b/docs/docusaurus/package.json new file mode 100644 index 00000000..70245cf5 --- /dev/null +++ b/docs/docusaurus/package.json @@ -0,0 +1,51 @@ +{ + "name": "pilot-shell-docs", + "version": "0.0.0", + "private": true, + "scripts": { + "docusaurus": "docusaurus", + "start": "docusaurus start", + "build": "docusaurus build", + "swizzle": "docusaurus swizzle", + "deploy": "docusaurus deploy", + "clear": "docusaurus clear", + "serve": "docusaurus serve", + "write-translations": "docusaurus write-translations", + "write-heading-ids": "docusaurus write-heading-ids", + "typecheck": "tsc" + }, + "dependencies": { + "@docusaurus/core": "3.9.2", + "@docusaurus/preset-classic": "3.9.2", + "@easyops-cn/docusaurus-search-local": "^0.55.1", + "@mdx-js/react": "^3.0.0", + "clsx": "^2.0.0", + "prism-react-renderer": "^2.3.0", + "react": "^18.0.0", + "react-dom": "^18.0.0" + }, + "devDependencies": { + "@docusaurus/module-type-aliases": "3.9.2", + "@docusaurus/tsconfig": "3.9.2", + "@docusaurus/types": "3.9.2", + "typescript": "~5.6.0" + }, + "browserslist": { + "production": [ + ">0.5%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 3 chrome version", + "last 3 firefox version", + "last 5 safari version" + ] + }, + "engines": { + "node": ">=18.0" + }, + "overrides": { + "serialize-javascript": ">=7.0.3" + } +} diff --git a/docs/docusaurus/sidebars.ts b/docs/docusaurus/sidebars.ts new file mode 100644 index 00000000..c39d9f75 --- /dev/null +++ b/docs/docusaurus/sidebars.ts @@ -0,0 +1,58 @@ +import type { SidebarsConfig } from "@docusaurus/plugin-content-docs"; + +const sidebars: SidebarsConfig = { + docsSidebar: [ + "intro", + { + type: "category", + label: "Getting Started", + collapsed: false, + items: [ + "getting-started/prerequisites", + "getting-started/installation", + ], + }, + { + type: "category", + label: "Workflows", + collapsed: false, + items: [ + "workflows/sync", + "workflows/spec", + "workflows/quick-mode", + "workflows/learn", + ], + }, + { + type: "category", + label: "Features", + collapsed: false, + items: [ + "features/share", + "features/hooks", + "features/context-preservation", + "features/rules", + "features/model-routing", + ], + }, + { + type: "category", + label: "Tools", + collapsed: false, + items: [ + "tools/mcp-servers", + "tools/language-servers", + "tools/console", + "tools/cli", + ], + }, + { + type: "category", + label: "Reference", + collapsed: false, + items: ["reference/open-source"], + }, + ], +}; + +export default sidebars; diff --git a/docs/docusaurus/src/css/custom.css b/docs/docusaurus/src/css/custom.css new file mode 100644 index 00000000..fed15784 --- /dev/null +++ b/docs/docusaurus/src/css/custom.css @@ -0,0 +1,22 @@ +:root { + --ifm-color-primary: #6d5ce7; + --ifm-color-primary-dark: #5a47e3; + --ifm-color-primary-darker: #503bdf; + --ifm-color-primary-darkest: #3a25c8; + --ifm-color-primary-light: #8071eb; + --ifm-color-primary-lighter: #8a7ded; + --ifm-color-primary-lightest: #a79cf3; + --ifm-code-font-size: 95%; + --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.1); +} + +[data-theme="dark"] { + --ifm-color-primary: #a79cf3; + --ifm-color-primary-dark: #8f81ef; + --ifm-color-primary-darker: #8375ed; + --ifm-color-primary-darkest: #5f4be6; + --ifm-color-primary-light: #bfb7f7; + --ifm-color-primary-lighter: #cbc4f9; + --ifm-color-primary-lightest: #efedfd; + --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.3); +} diff --git a/docs/docusaurus/static/img/favicon.png b/docs/docusaurus/static/img/favicon.png new file mode 100644 index 00000000..fab716a1 Binary files /dev/null and b/docs/docusaurus/static/img/favicon.png differ diff --git a/docs/docusaurus/tsconfig.json b/docs/docusaurus/tsconfig.json new file mode 100644 index 00000000..d250afae --- /dev/null +++ b/docs/docusaurus/tsconfig.json @@ -0,0 +1,6 @@ +{ + "extends": "@docusaurus/tsconfig", + "compilerOptions": { + "baseUrl": "." + } +} diff --git a/docs/img/dashboard.png b/docs/img/dashboard.png index e40952b1..5f7179c7 100644 Binary files a/docs/img/dashboard.png and b/docs/img/dashboard.png differ diff --git a/docs/img/teams.png b/docs/img/teams.png deleted file mode 100644 index a4e95daf..00000000 Binary files a/docs/img/teams.png and /dev/null differ diff --git a/docs/site/build-all.sh b/docs/site/build-all.sh new file mode 100755 index 00000000..12f3a291 --- /dev/null +++ b/docs/site/build-all.sh @@ -0,0 +1,47 @@ +#!/bin/bash +# Build both the Vite landing page and Docusaurus docs, combine into single output. +# Output: docs/site/dist/ (Vite) with docs/site/dist/docs/ (Docusaurus) +set -e + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +SITE_DIR="$SCRIPT_DIR" +DOCUSAURUS_DIR="$SCRIPT_DIR/../docusaurus" + +echo "=== Building Vite landing page ===" +cd "$SITE_DIR" +npm ci --prefer-offline 2>/dev/null || npm install +npm run build + +echo "=== Building Docusaurus docs ===" +cd "$DOCUSAURUS_DIR" +npm ci --prefer-offline 2>/dev/null || npm install +npm run build + +echo "=== Combining outputs ===" +DIST="$SITE_DIR/dist" +BUILD="$DOCUSAURUS_DIR/build" + +# Copy Docusaurus docs into Vite dist +cp -r "$BUILD/docs" "$DIST/docs" + +# Merge Docusaurus assets into Vite assets (no filename conflicts — Vite uses hashes, Docusaurus uses css/js subdirs) +cp -r "$BUILD/assets/"* "$DIST/assets/" + +# Copy search plugin files +[ -d "$BUILD/search" ] && cp -r "$BUILD/search" "$DIST/search" +[ -f "$BUILD/search-index.json" ] && cp "$BUILD/search-index.json" "$DIST/search-index.json" + +# Copy Docusaurus img (favicon etc.) — merge into existing img or create +[ -d "$BUILD/img" ] && cp -r "$BUILD/img" "$DIST/img" + +# Copy sitemaps +for f in "$BUILD"/*.xml; do + [ -f "$f" ] && cp "$f" "$DIST/" 2>/dev/null || true +done + +echo "=== Build complete ===" +echo "Landing page: $DIST/" +echo "Documentation: $DIST/docs/" +echo "" +echo "File counts:" +echo " docs: $(find "$DIST/docs" -name '*.html' | wc -l | tr -d ' ') pages" diff --git a/docs/site/dev.mjs b/docs/site/dev.mjs new file mode 100644 index 00000000..70fe7abb --- /dev/null +++ b/docs/site/dev.mjs @@ -0,0 +1,73 @@ +#!/usr/bin/env node +/** + * Unified dev server: starts both Vite (landing page) and Docusaurus (docs + blog). + * Vite redirects /docs and /blog to the Docusaurus dev server automatically. + * Ctrl+C stops both. + */ + +import { spawn } from "child_process"; +import { resolve, dirname } from "path"; +import { fileURLToPath } from "url"; + +const __dirname = dirname(fileURLToPath(import.meta.url)); +const docusaurusDir = resolve(__dirname, "../docusaurus"); + +const procs = []; + +function start(name, cmd, args, cwd) { + const proc = spawn(cmd, args, { + cwd, + stdio: ["ignore", "pipe", "pipe"], + env: { ...process.env, FORCE_COLOR: "1" }, + }); + + proc.stdout.on("data", (d) => { + for (const line of d.toString().split("\n").filter(Boolean)) { + process.stdout.write(`\x1b[36m[${name}]\x1b[0m ${line}\n`); + } + }); + + proc.stderr.on("data", (d) => { + for (const line of d.toString().split("\n").filter(Boolean)) { + process.stderr.write(`\x1b[36m[${name}]\x1b[0m ${line}\n`); + } + }); + + proc.on("exit", (code) => { + if (code !== null && code !== 0) { + console.error(`\x1b[31m[${name}] exited with code ${code}\x1b[0m`); + } + }); + + procs.push(proc); + return proc; +} + +function shutdown() { + console.log("\n\x1b[33mShutting down dev servers...\x1b[0m"); + for (const proc of procs) { + if (!proc.killed) { + proc.kill("SIGTERM"); + } + } + // Force kill after 3s if still alive + setTimeout(() => { + for (const proc of procs) { + if (!proc.killed) { + proc.kill("SIGKILL"); + } + } + process.exit(0); + }, 3000); +} + +process.on("SIGINT", shutdown); +process.on("SIGTERM", shutdown); + +console.log("\x1b[32m=== Starting unified dev server ===\x1b[0m"); +console.log(" Landing page: http://localhost:8080"); +console.log(" Docs + Blog: http://localhost:3000 (proxied from :8080/docs and :8080/blog)"); +console.log(""); + +start("docusaurus", "npx", ["docusaurus", "start", "--port", "3000"], docusaurusDir); +start("vite", "npx", ["vite", "--port", "8080", "--host"], __dirname); diff --git a/docs/site/index.html b/docs/site/index.html index 1c5fff44..ce5210a1 100644 --- a/docs/site/index.html +++ b/docs/site/index.html @@ -13,7 +13,7 @@ /> @@ -111,7 +111,6 @@ "Quick Mode - Small tasks, exploration, and quick changes", "Semantic Code Search - Find code by meaning with context-aware search", "Persistent Memory - Context carries across sessions via intelligent hooks", - "Dev Container Support - Works with VS Code, Cursor, Windsurf", "Python & TypeScript - Quality hooks and linting tools" ], "keywords": "Claude Code, AI coding, TDD, quality automation, spec-driven development" diff --git a/docs/site/netlify.toml b/docs/site/netlify.toml index f73bf68f..a3c78953 100644 --- a/docs/site/netlify.toml +++ b/docs/site/netlify.toml @@ -1,11 +1,22 @@ [build] - command = "npm run build" + command = "bash build-all.sh" publish = "dist" [build.environment] NODE_VERSION = "20" -# SPA redirect +# Docs and blog are static (Docusaurus) — no redirect +[[redirects]] + from = "/docs/*" + to = "/docs/:splat" + status = 200 + +[[redirects]] + from = "/blog/*" + to = "/blog/:splat" + status = 200 + +# SPA redirect for landing page [[redirects]] from = "/*" to = "/index.html" diff --git a/docs/site/package.json b/docs/site/package.json index 68486b23..1a79b64a 100644 --- a/docs/site/package.json +++ b/docs/site/package.json @@ -4,7 +4,8 @@ "version": "0.0.0", "type": "module", "scripts": { - "dev": "vite --port 8080 --host", + "dev": "node dev.mjs", + "dev:site-only": "vite --port 8080 --host", "build": "vite build", "build:dev": "vite build --mode development", "lint": "eslint .", diff --git a/docs/site/public/console/changes.png b/docs/site/public/console/changes.png new file mode 100644 index 00000000..c6c05620 Binary files /dev/null and b/docs/site/public/console/changes.png differ diff --git a/docs/site/public/console/dashboard.png b/docs/site/public/console/dashboard.png index e40952b1..5f7179c7 100644 Binary files a/docs/site/public/console/dashboard.png and b/docs/site/public/console/dashboard.png differ diff --git a/docs/site/public/console/memories.png b/docs/site/public/console/memories.png index 83704642..e4941e2a 100644 Binary files a/docs/site/public/console/memories.png and b/docs/site/public/console/memories.png differ diff --git a/docs/site/public/console/sessions.png b/docs/site/public/console/sessions.png index 6ed984ad..a04ca845 100644 Binary files a/docs/site/public/console/sessions.png and b/docs/site/public/console/sessions.png differ diff --git a/docs/site/public/console/settings.png b/docs/site/public/console/settings.png index ca1d9abc..df0750ea 100644 Binary files a/docs/site/public/console/settings.png and b/docs/site/public/console/settings.png differ diff --git a/docs/site/public/console/share.png b/docs/site/public/console/share.png new file mode 100644 index 00000000..438edfe8 Binary files /dev/null and b/docs/site/public/console/share.png differ diff --git a/docs/site/public/console/specification.png b/docs/site/public/console/specification.png index 7cadcabc..361366ec 100644 Binary files a/docs/site/public/console/specification.png and b/docs/site/public/console/specification.png differ diff --git a/docs/site/public/console/teams.png b/docs/site/public/console/teams.png deleted file mode 100644 index a4e95daf..00000000 Binary files a/docs/site/public/console/teams.png and /dev/null differ diff --git a/docs/site/public/console/usage.png b/docs/site/public/console/usage.png index 6bfdd5f8..d86bd316 100644 Binary files a/docs/site/public/console/usage.png and b/docs/site/public/console/usage.png differ diff --git a/docs/site/src/App.tsx b/docs/site/src/App.tsx index 4113befa..429cd088 100644 --- a/docs/site/src/App.tsx +++ b/docs/site/src/App.tsx @@ -9,9 +9,6 @@ import { SpeedInsights } from "@vercel/speed-insights/react"; import ScrollToTop from "@/components/ScrollToTop"; import ScrollToHash from "@/components/ScrollToHash"; import Index from "./pages/Index"; -import BlogPage from "./pages/BlogPage"; -import BlogArticlePage from "./pages/BlogArticlePage"; -import DocsPage from "./pages/DocsPage"; import NotFound from "./pages/NotFound"; const queryClient = new QueryClient(); @@ -27,9 +24,7 @@ const App = () => ( } /> - } /> - } /> - } /> + {/* /docs is served by Docusaurus static files */} {/* ADD ALL CUSTOM ROUTES ABOVE THE CATCH-ALL "*" ROUTE */} } /> diff --git a/docs/site/src/components/ConsoleSection.tsx b/docs/site/src/components/ConsoleSection.tsx index 6cfb1d09..089b7a6d 100644 --- a/docs/site/src/components/ConsoleSection.tsx +++ b/docs/site/src/components/ConsoleSection.tsx @@ -39,6 +39,18 @@ const consoleSlides = [ alt: "Usage view — daily costs, token charts, and model routing strategy", desc: "Daily token costs, model routing breakdown, and usage trends over time.", }, + { + label: "Share", + src: "/console/share.png", + alt: "Share view — browse, edit, and manage skills, rules, commands, and agents", + desc: "Browse, edit, rename, and delete assets. Filter by scope and type. Push/pull to git remotes.", + }, + { + label: "Changes", + src: "/console/changes.png", + alt: "Changes view — git diff, staged files, and commit management", + desc: "Git changes, staged files, and diff viewer with AI-generated commit messages.", + }, ]; const ConsoleSection = () => { @@ -87,7 +99,7 @@ const ConsoleSection = () => { {/* Thumbnail strip */} -
+
{consoleSlides.map((s, i) => (
  • - Docs - +
  • -
  • - - Blog - -
  • { asChild className="w-full sm:w-auto text-sm xs:text-base" > - + Read Documentation diff --git a/docs/site/src/components/NavBar.tsx b/docs/site/src/components/NavBar.tsx index 8e002cff..bb7c15a4 100644 --- a/docs/site/src/components/NavBar.tsx +++ b/docs/site/src/components/NavBar.tsx @@ -64,15 +64,7 @@ const NavBar = () => { size="sm" className="hidden sm:inline-flex" > - Docs - - { {link.label} ))} - setMobileMenuOpen(false)} + Docs - - setMobileMenuOpen(false)} - className="block w-full text-left py-3 text-muted-foreground hover:text-foreground border-b border-border last:border-0 transition-colors" - > - Blog - +
  • +
  • + + + Cross-machine skill sync — push/pull skills across all your machines + +
  • @@ -195,7 +201,7 @@ const PricingSection = () => {
  • - Team asset sharing — manage shared assets in the Teams console dashboard + Team license management — assign and manage Pilot Shell for your whole team
  • @@ -225,8 +231,8 @@ const PricingSection = () => {
  • - All plans work across multiple personal machines and Dev Containers — - one subscription, all your devices. + All plans work across multiple personal machines — one subscription, + all your devices.

    Already a subscriber?{" "} @@ -234,6 +240,34 @@ const PricingSection = () => { Manage your subscription

    + + {/* Rolling out for your team */} +
    +

    + Rolling Out for Your Team? +

    +

    + Let's figure out if Pilot Shell is the right fit for your team and get everyone set up. +

    + +
    ); diff --git a/docs/site/src/components/SEO.tsx b/docs/site/src/components/SEO.tsx index e5f3224c..149f7da8 100644 --- a/docs/site/src/components/SEO.tsx +++ b/docs/site/src/components/SEO.tsx @@ -13,7 +13,7 @@ interface SEOProps { const SEO = ({ title = "Pilot Shell - Claude Code is powerful. Pilot Shell makes it reliable.", description = "Start a task, grab a coffee, come back to production-grade code. Tests enforced, context preserved, quality automated.", - keywords = "Pilot Shell, Claude Code, AI coding assistant, AI pair programming, TDD enforcement, Test-Driven Development, code quality automation, linting, formatting, type checking, spec-driven development, dev containers, VS Code, Cursor, Windsurf, Claude API, Anthropic, AI development tools, automated testing, code review, persistent memory, semantic code search", + keywords = "Pilot Shell, Claude Code, AI coding assistant, AI pair programming, TDD enforcement, Test-Driven Development, code quality automation, linting, formatting, type checking, spec-driven development, VS Code, Cursor, Windsurf, Claude API, Anthropic, AI development tools, automated testing, code review, persistent memory, semantic code search", canonicalUrl = "https://pilot-shell.com", ogImage = "https://pilot-shell.com/logo.png", type = "website", diff --git a/docs/site/src/components/TeamsDashboardSection.tsx b/docs/site/src/components/TeamsDashboardSection.tsx deleted file mode 100644 index b78708eb..00000000 --- a/docs/site/src/components/TeamsDashboardSection.tsx +++ /dev/null @@ -1,118 +0,0 @@ -import { useInView } from "@/hooks/use-in-view"; -import ImageModal from "@/components/ImageModal"; -import { Button } from "@/components/ui/button"; -import { Users, GitBranch, Package, RefreshCw, Calendar, Mail } from "lucide-react"; - -const features = [ - { - icon: Package, - title: "Shared Assets", - desc: "Push and install rules, skills, commands, and agents across your team from a single Git repository.", - }, - { - icon: GitBranch, - title: "Project-Scoped", - desc: "Assets are scoped to repositories — each project gets exactly the assets it needs, automatically.", - }, - { - icon: RefreshCw, - title: "Version Tracking", - desc: "Every asset is versioned. See what's installed locally vs. what's latest in the repository at a glance.", - }, - { - icon: Users, - title: "Team Consistency", - desc: "New team members run one command to get every rule, skill, and workflow the team has standardized on.", - }, -]; - -const TeamsDashboardSection = () => { - const [ref, inView] = useInView(); - - return ( -
    -
    -
    - -
    -
    -

    - Teams Asset Sharing -

    -

    - Share AI assets across your team. Rules, skills, commands, and - agents — managed from a central Git repository and synced to every - project. -

    -
    - - {/* Screenshot */} -
    -
    - -
    -
    - - {/* Feature cards */} -
    - {features.map((f) => ( -
    - -

    - {f.title} -

    -

    - {f.desc} -

    -
    - ))} -
    - - {/* Team rollout CTA */} -
    -

    - Rolling Out for Your Team? -

    -

    - Let's figure out if Pilot Shell is the right fit for your team and - get everyone set up. -

    - -
    -
    -
    -
    - ); -}; - -export default TeamsDashboardSection; diff --git a/docs/site/src/components/WhatsInside.tsx b/docs/site/src/components/WhatsInside.tsx index 148498cf..cecac9a1 100644 --- a/docs/site/src/components/WhatsInside.tsx +++ b/docs/site/src/components/WhatsInside.tsx @@ -3,7 +3,7 @@ import { Plug2, GitBranch, Lightbulb, - Infinity as InfinityIcon, + Sparkles, Search, Stethoscope, Terminal, @@ -20,17 +20,17 @@ interface InsideItem { const insideItems: InsideItem[] = [ { icon: Workflow, - title: "Spec-Driven Development", + title: "Spec-Driven", description: "Plan → Implement → Verify", summary: "A structured workflow with human review gates, sequential TDD, mandatory verification, and independent code review. Loops back automatically if any check fails.", }, { - icon: InfinityIcon, - title: "Unlimited Context", - description: "Auto-compaction, zero interruptions", + icon: Sparkles, + title: "Customize & Share", + description: "Create assets, share everywhere", summary: - "Decisions, plans, and progress are preserved across context boundaries. Sessions run indefinitely — no manual restarts, no lost work.", + "Create rules, commands, skills, and agents in .claude/ — all plain markdown. Share all four asset types across machines via git, across teams via project repos, or org-wide via tracked repos. Works with 50+ AI tools — one source of truth for Claude Code, Cursor, Codex, and more.", }, { icon: Plug2, diff --git a/docs/site/src/content/blog/agent-fundamentals.md b/docs/site/src/content/blog/agent-fundamentals.md deleted file mode 100644 index 2b018229..00000000 --- a/docs/site/src/content/blog/agent-fundamentals.md +++ /dev/null @@ -1,195 +0,0 @@ ---- -slug: "agent-fundamentals" -title: "Claude Code Agents: Engineering Autonomous AI Assistants" -description: "Master agent engineering in Claude Code. Design and deploy autonomous agents that handle complex multi-step tasks independently and reliably." -date: "2025-08-23" -author: "Max Ritter" -tags: [Guide, Agents] -readingTime: 5 -keywords: "agent, agents, ai, assistants, autonomous, claude, code, engineering, fundamentals" ---- - -Agents - -# Claude Code Agents: Engineering Autonomous AI Assistants - -Master agent engineering in Claude Code. Design and deploy autonomous agents that handle complex multi-step tasks independently and reliably. - -**Problem**: Complex projects demand multiple perspectives - security reviewer, performance analyst, documentation writer. Switching mental contexts burns time and dilutes focus. - -**Quick Win**: Spawn a sub-agent to handle a parallel task right now: - -```p-4 -Use a sub-agent to review the authentication module for security vulnerabilities while I continue working on the API endpoints. -``` - -Claude Code launches an isolated sub-agent that works independently, then reports findings back to your main session. - -**Understanding**: Claude Code provides multiple ways to create agent-like behavior - from built-in sub-agents to custom slash commands. Each approach serves different needs. Master these fundamentals before exploring [advanced agent patterns](/blog/guide/agents/agent-patterns). - -## [Five Agent Approaches in Claude Code](#five-agent-approaches-in-claude-code) - -Claude Code offers several ways to achieve specialized, agent-like behavior: - -| Approach | Best For | Persistence | -| --- | --- | --- | -| **Task Tool (Sub-agents)** | Parallel execution, isolated work | Session only | -| **`.claude/agents/` Definitions** | Persistent specialist sub-agents | Permanent | -| **Custom Slash Commands** | Reusable workflows, team sharing | Permanent | -| **CLAUDE.md Personas** | Project-wide behavior rules | Permanent | -| **Perspective Prompting** | Quick context switches | Single request | - -Each approach has trade-offs. Sub-agents excel at parallel work; `.claude/agents/` definitions give sub-agents persistent identities; slash commands excel at reusability. - -## [Sub-Agents: Built-in Parallel Execution](#sub-agents-built-in-parallel-execution) - -The Task tool spawns mini Claude Code instances inside your session. Each sub-agent gets its own context window, works independently, and returns results to the orchestrator. - -**Launch parallel sub-agents:** - -```p-4 -Complete these tasks using 3 sub-agents in parallel: -1. Review src/auth/ for security vulnerabilities -2. Analyze src/api/ for performance bottlenecks -3. Check src/utils/ for code duplication -``` - -**Why sub-agents matter:** - -- Isolated context prevents pollution between tasks -- Parallel execution speeds up multi-file analysis -- Failed sub-agents don't crash your main session -- Background execution lets you continue working (press `Ctrl+B`) - -**New**: When Claude spawns sub-agents, you can now background them with `Ctrl+B` and continue chatting with the main agent on other tasks. Results surface automatically when complete. See [async workflows](/blog/guide/agents/async-workflows) for the full guide. - -Learn more about [sub-agent design patterns](/blog/guide/agents/sub-agent-design) for complex orchestration. - -## [Persistent Agent Definitions with `.claude/agents/`](#persistent-agent-definitions-with-claudeagents) - -Claude Code now supports defining custom sub-agents as Markdown files with YAML frontmatter in a dedicated `agents/` directory. These are distinct from slash commands. While slash commands are prompts you invoke manually, agent definitions configure persistent sub-agents that Claude's orchestrator can spawn automatically when needed. - -**Two scopes for agent definitions:** - -- **Project agents** (`.claude/agents/`) - Specific to your repository, shareable with your team via git -- **User agents** (`~/.claude/agents/`) - Available across all your projects, personal to your machine - -Sub-agents defined in `.claude/agents/` inherit your project's CLAUDE.md context, so they automatically pick up your coding standards, conventions, and project-specific instructions. - -**Controlling the sub-agent model**: Set the `CLAUDE_CODE_SUBAGENT_MODEL` environment variable to choose which model your sub-agents use. This is useful for cost optimization (running sub-agents on a lighter model) or for tasks that benefit from stronger reasoning. - -```p-4 -# Run sub-agents on Sonnet for cost savings -export CLAUDE_CODE_SUBAGENT_MODEL="claude-sonnet-4-5-20250929" -``` - -### [Restricting Sub-Agent Access with Permission Rules](#restricting-sub-agent-access-with-permission-rules) - -You can control which sub-agents Claude is allowed to invoke using `Task(AgentName)` [permission rules](/blog/guide/development/permission-management). Add these to the `deny` array in your `settings.json` or use the `--disallowedTools` CLI flag: - -```p-4 -{ - "permissions": { - "deny": ["Task(Explore)"] - } -} -``` - -This prevents Claude from spawning the `Explore` sub-agent. Built-in agent names include `Explore`, `Plan`, and `Verify`. You can also disable agents at launch: - -```p-4 -claude --disallowedTools "Task(Plan)" "Task(Verify)" -``` - -Use this when you want tighter control over agent behavior in sensitive environments or to reduce token usage from autonomous exploration. - -## [Custom Slash Commands: Reusable Specialists](#custom-slash-commands-reusable-specialists) - -Create permanent, reusable commands by adding Markdown files to `.claude/commands/`: - -```p-4 -## - -description: "Security-focused code review" -allowed-tools: ["Read", "Grep", "Bash"] - ---- - -Review the specified code for security vulnerabilities: - -1. Check for SQL injection risks -2. Identify authentication bypasses -3. Flag hardcoded secrets -4. Report findings with severity ratings - -Target: $ARGUMENTS -``` - -Now run `/project:security-review src/auth/` to invoke your specialist. - -**Command locations:** - -- `.claude/commands/` - Project-specific, shareable via git -- `~/.claude/commands/` - Personal, available everywhere - -## [CLAUDE.md: Persistent Agent Behavior](#claudemd-persistent-agent-behavior) - -Your [CLAUDE.md file](/blog/guide/mechanics/claude-md-mastery) shapes Claude's behavior for every interaction in your project: - -```p-4 - - -## Code Review Protocol - -When reviewing code, always: - -1. Check for security vulnerabilities first -2. Identify performance implications -3. Suggest specific improvements with code examples -4. Flag any deviation from project conventions -``` - -This creates agent-like consistency without explicit invocation. - -## [Perspective Prompting: Quick Context Switches](#perspective-prompting-quick-context-switches) - -For one-off analysis, prompt Claude to adopt a specific perspective: - -```p-4 -Analyze this authentication flow from three perspectives: -1. Security engineer: What vulnerabilities exist? -2. Performance engineer: What bottlenecks could occur at scale? -3. Junior developer: What parts are confusing or poorly documented? -``` - -No setup required - immediate specialized analysis. - -## [Choosing Your Approach](#choosing-your-approach) - -**Use sub-agents when:** You need parallel execution or isolated context for multiple tasks. - -**Use `.claude/agents/` when:** You want persistent, named specialist agents that Claude's orchestrator can invoke automatically based on task type. - -**Use slash commands when:** You repeat the same workflow across sessions or want to share with your team. - -**Use CLAUDE.md when:** You want consistent behavior applied automatically to all interactions. - -**Use perspective prompting when:** You need quick, one-time specialized analysis. - -**Next Action**: Create your first slash command in `.claude/commands/` for a workflow you repeat often, then explore [task distribution strategies](/blog/guide/agents/task-distribution) for complex orchestration. - -**Explore More Agent Concepts**: - -- [Sub-Agent Best Practices](/blog/guide/agents/sub-agent-best-practices) - When to use parallel, sequential, or background execution -- [Sub-Agent Design](/blog/guide/agents/sub-agent-design) - Architecture patterns for orchestrating multiple agents -- [Custom Agents](/blog/guide/agents/custom-agents) - Build specialized agents with slash commands -- [Agent Patterns](/blog/guide/agents/agent-patterns) - Proven design patterns for agent systems -- [Human-Like Agents](/blog/guide/agents/human-like-agents) - Create agents with distinct personalities - -Last updated on - -[Previous - -Efficiency Patterns](/blog/guide/performance/efficiency-patterns)[Next - -Async Workflows](/blog/guide/agents/async-workflows) diff --git a/docs/site/src/content/blog/agent-patterns.md b/docs/site/src/content/blog/agent-patterns.md deleted file mode 100644 index c2b8841a..00000000 --- a/docs/site/src/content/blog/agent-patterns.md +++ /dev/null @@ -1,177 +0,0 @@ ---- -slug: "agent-patterns" -title: "Claude Code Patterns: Top-Down vs Bottom-Up Development" -description: "Master Claude Code development patterns for different project types. Learn when to use top-down architecture vs bottom-up feature building." -date: "2025-08-23" -author: "Max Ritter" -tags: [Guide, Agents] -readingTime: 5 -keywords: "agent, bottomup, claude, code, development, patterns, topdown, vs" ---- - -Agents - -# Claude Code Patterns: Top-Down vs Bottom-Up Development - -Master Claude Code development patterns for different project types. Learn when to use top-down architecture vs bottom-up feature building. - -**Problem**: You're throwing complex tasks at Claude Code and getting frustrated results - incomplete solutions, context confusion, or outright failures. - -**Quick Win**: Test your baseline with a focused task. Open Claude Code in your project and ask: - -```p-4 -claude "Create a utility function that validates email addresses and add it to utils/" -``` - -Watch how Claude handles the task. Does it create the file? Add proper exports? Include tests? This single interaction reveals your current working pattern before attempting complex multi-file architectures. - -## [Bottom-Up: The Foundation Pattern](#bottom-up-the-foundation-pattern) - -**When to use**: New to Claude Code, unfamiliar codebase, or learning new technology stack. - -Start small and build competence incrementally. Each successful interaction teaches you Claude's capabilities and your own context management skills. - -### [Implementation Strategy](#implementation-strategy) - -```p-4 -# Week 1: Single functions -claude "Write a function to validate email addresses" - -# Week 2: Small modules -claude "Create a user validation module with 3 functions" - -# Week 3: Connected components -claude "Build a simple login system using the validation module" -``` - -This approach builds pattern recognition. You learn what Claude handles well (focused tasks with clear requirements) versus what causes confusion (vague, multi-layered requests). - -### [Context Window Training](#context-window-training) - -Bottom-up development naturally trains your context window management: - -```p-4 -# Instead of overwhelming context: -claude "Build a full e-commerce platform with user auth, payments, inventory..." - -# Build incrementally: -claude "Create a product model with validation" -# Then: "Add inventory tracking to the product model" -# Then: "Create a shopping cart that uses products" -``` - -Each step validates before moving forward. You catch issues early when they're fixable, not after 30 minutes of complex generation. When context grows large, use `/compact` to summarize the conversation and free up working memory for the next component. - -## [Top-Down: The Architecture Pattern](#top-down-the-architecture-pattern) - -**When to use**: Experienced with Claude Code, clear vision of end state, well-defined requirements. - -Top-down works when you can provide comprehensive context and break complexity into manageable chunks yourself. - -### [Strategic Planning Approach](#strategic-planning-approach) - -```p-4 -# First: Define complete architecture -claude "Plan a microservices architecture for a task management app. -Include: API gateway, user service, task service, notification service. -Provide: Service boundaries, data models, API contracts." - -# Then: Implement each service systematically -claude "Implement the user service based on the architecture plan" -``` - -### [Success Requirements for Top-Down](#success-requirements-for-top-down) - -Before attempting top-down patterns, ensure you have: - -- **Clear specifications**: Detailed requirements, not vague goals -- **Context mastery**: Understanding of Claude's token limits and when to use `/compact` -- **Error recovery**: Plans for when complex requests fail -- **Validation checkpoints**: Ways to test each architectural layer - -## [Pattern Selection Framework](#pattern-selection-framework) - -Choose your approach based on project characteristics: - -### [Bottom-Up Indicators](#bottom-up-indicators) - -Choose bottom-up when: - -- **Exploration mode**: "I want to build something like X" without full specs -- **Learning curve**: New framework, language, or unfamiliar codebase -- **Unclear scope**: Requirements still evolving or undefined -- **First projects**: Building Claude Code intuition and pattern recognition -- **Token efficiency**: Budget constraints or complex existing context - -### [Top-Down Indicators](#top-down-indicators) - -Choose top-down when: - -- **Defined specs**: Detailed requirements document or PRD exists -- **Proven experience**: You know Claude Code's strengths and limits -- **Clear architecture**: Mental model of the complete system -- **Established patterns**: Templates and conventions already in place -- **Known scope**: Time pressure with well-defined deliverables - -## [Hybrid Pattern: Start Small, Scale Smart](#hybrid-pattern-start-small-scale-smart) - -The most effective developers combine both approaches: - -```p-4 -# 1. Bottom-up exploration -claude "Create a simple task model with basic CRUD operations" - -# 2. Validate and learn -# Test the model, understand the patterns Claude uses - -# 3. Top-down expansion -claude "Using the task model pattern, architect a complete -project management system with teams, projects, and notifications" -``` - -This hybrid approach gives you the confidence of validated patterns while enabling complex system design. - -## [Common Pattern Failures](#common-pattern-failures) - -**Avoid these mistakes**: - -- **The Big Bang**: Asking for complete applications in one request overwhelms context -- **Context Overload**: Providing too much information without structure or using `/compact` -- **Pattern Switching**: Starting bottom-up then suddenly jumping to top-down mid-task -- **No Validation**: Building complex systems without testing individual components - -## [Measuring Pattern Success](#measuring-pattern-success) - -Track your effectiveness with these metrics: - -**Bottom-up success metrics:** - -- Completion rate of individual tasks (aim for >90%) -- Time from request to working solution (under 5 minutes for simple tasks) -- Follow-up clarifications needed (fewer is better) - -**Top-down success metrics:** - -- Architectural coherence across generated components -- Successful integration without major rewrites -- Reduced back-and-forth for requirement clarification - -## [Next Steps](#next-steps) - -Master your chosen pattern with these guides: - -- **New to Claude Code?** Start with [Terminal Basics](/blog/guide/mechanics/terminal-main-thread) to understand the foundation -- **Ready for complex projects?** Learn [Context Management](/blog/guide/mechanics/context-management) for top-down success -- **Want efficiency?** Check [Planning Modes](/blog/guide/mechanics/planning-modes) for structured approaches -- **Building teams of agents?** Explore [Sub-Agent Design](/blog/guide/agents/sub-agent-design) for advanced coordination -- **Need systematic workflows?** See [Task Distribution](/blog/guide/agents/task-distribution) for managing complex projects - -**Remember**: The best pattern is the one that consistently delivers working solutions. Start where you are, use what works, and scale gradually. Both approaches have their place in effective Claude Code development. - -Last updated on - -[Previous - -Custom Agents](/blog/guide/agents/custom-agents)[Next - -Human-like Agents](/blog/guide/agents/human-like-agents) diff --git a/docs/site/src/content/blog/agent-teams-best-practices.md b/docs/site/src/content/blog/agent-teams-best-practices.md deleted file mode 100644 index b962ceff..00000000 --- a/docs/site/src/content/blog/agent-teams-best-practices.md +++ /dev/null @@ -1,159 +0,0 @@ ---- -slug: "agent-teams-best-practices" -title: "Claude Code Agent Teams Best Practices & Troubleshooting Guide" -description: "Battle-tested practices for agent team workflows. Troubleshooting guide, current limitations, plan mode behavior, and recent fixes from v2.1.33 to v2.1.45." -date: "2026-02-12" -author: "Max Ritter" -tags: [Guide, Agents] -readingTime: 18 -keywords: "agent, teams, best, practices, troubleshooting, delegate, mode, claude, code, limitations" ---- - -Agents - -# Claude Code Agent Teams Best Practices & Troubleshooting Guide - -Battle-tested practices for agent team workflows. Troubleshooting guide, current limitations, plan mode behavior, and recent fixes from v2.1.33 to v2.1.45. - -**Problem**: Your Claude Code agent team is running but burning through tokens without clear results. Teammates step on each other's files. The lead does work instead of coordinating. Tasks get stuck in "in progress" forever. These are solvable problems, and the patterns below come from real-world agent team usage across the community and months of iteration since the feature launched. - -**Quick Win**: Use delegate mode (Shift+Tab) and give each teammate explicit file boundaries in the spawn prompt. These two changes alone eliminate the most common agent team failures. - -**Note**: This is a companion guide to the [Agent Teams overview](/blog/guide/agents/agent-teams). Start there if you haven't set up your first team yet. For controls and configuration, see [Advanced Controls](/blog/guide/agents/agent-teams-controls). - -## Give Teammates Enough Context - -Include task-specific details in the spawn prompt. Teammates load project context automatically (CLAUDE.md, MCP servers, skills) but they don't inherit the lead's conversation history. Reference specific files, acceptance criteria, and constraints. The more specific the spawn prompt, the less back-and-forth the teammate needs. - -A vague prompt like "review the auth module" forces the teammate to explore the codebase, figure out what matters, and guess at priorities. That exploration costs tokens and time. A specific prompt removes that ambiguity entirely. - -The pattern is straightforward: what to do, where to do it, what to focus on, and what the deliverable looks like. Teammates that know their scope from the start finish faster and produce better results. For users coming from [subagent patterns](/blog/guide/agents/agent-fundamentals), the principle is the same but the stakes are higher since each teammate is a full context window. - -## Right-Size Your Tasks - -Too small and coordination overhead exceeds the benefit. Too large and teammates work too long without check-ins, increasing the risk of wasted effort. The sweet spot is self-contained units that produce a clear deliverable: a function, a test file, a review document. - -Aim for 5-6 tasks per teammate. This keeps everyone productive and lets the lead reassign work if someone gets stuck. If the lead isn't creating enough tasks, ask it to split the work into smaller pieces. A teammate with one massive task has no natural check-in points. A teammate with 5-6 focused tasks reports progress after each one, giving you opportunities to steer. - -## Avoid File Conflicts - -Two teammates editing the same file leads to overwrites. This is the single most important rule for implementation tasks. Break the work so each teammate owns a different set of files. Define clear directory boundaries in your spawn prompt. - -If your project structure doesn't naturally separate into independent directories, create the separation in your task decomposition. Instead of "refactor the API layer" split across teammates, assign "refactor the user endpoints in src/api/users/" to one teammate and "refactor the billing endpoints in src/api/billing/" to another. Explicit file ownership prevents silent overwrites that waste entire teammate sessions. - -For projects where shared files are unavoidable, mark those files as "coordinate before editing" in your [CLAUDE.md](/blog/guide/mechanics/claude-md-mastery) and have the lead manage access through task sequencing. - -## Use Delegate Mode - -Enable delegate mode (Shift+Tab) as soon as you start a team. Without it, the lead sometimes grabs tasks that teammates should handle, creating confusion about who owns what. Delegate mode restricts the lead to coordination-only tools so it focuses on orchestration rather than implementation. For setup details and configuration options, see the [delegate mode walkthrough](/blog/guide/agents/agent-teams-controls). - -## Start with Research Tasks - -If you're new to agent teams, start with tasks that have clear boundaries and don't require writing code: reviewing a PR, researching a library, investigating a bug, or auditing a module for specific issues. These tasks show the value of parallel exploration without the coordination challenges that come with parallel implementation. - -Research tasks are also forgiving. If a teammate goes down an unproductive path, you've lost some tokens but no code is affected. Implementation mistakes are harder to unwind, especially when multiple teammates have built on top of each other's work. - -Once you're comfortable with the team dynamics, move to implementation tasks. The same patterns apply, but the stakes are higher and file ownership boundaries matter more. - -## Monitor and Redirect - -Check progress with **Ctrl+T** and redirect approaches that aren't working. Letting a team run unattended too long increases the risk of wasted effort, especially if one teammate goes down a path that isn't productive. - -Agent teams work best as a supervised workflow. You're the project manager. The lead coordinates, but you make the strategic calls: when to redirect, when to spawn a replacement, and when to shut down a teammate that's stuck. Think of it like managing a distributed team of contractors. Regular check-ins catch problems before they compound. - -## Keep Teams Small - -In our experience, 3-5 teammates is the practical sweet spot. More teammates means more coordination overhead, more token cost, and more potential for miscommunication. The lead's context fills faster when it's tracking 8 teammates versus 3. Communication costs scale with team size since every broadcast message hits every teammate's context window. - -If your task genuinely needs more than 5 parallel workers, consider breaking it into phases instead. Run a team of 3 for the first phase, clean up, then run another team of 3 for the next phase. Sequential phases with smaller teams produce cleaner results than one massive team trying to coordinate everything at once. - -## Plan Mode in Teams - -Plan mode in agent teams has two important behaviors that are not obvious from the documentation. - -**Plan mode is evaluated on every turn, not just once.** When a teammate runs in plan mode, it stays in plan mode for its entire lifetime. Every action it takes is filtered through plan mode's read-only constraints. This makes plan mode great for design-only roles and initial task shaping, but not for execution. - -**An agent's mode stays fixed for its lifetime.** Once spawned, a teammate's mode (plan or default) cannot be changed. If you need a teammate to transition from planning to execution, spawn a new teammate in default mode and hand off the plan. Don't try to "switch" an existing teammate out of plan mode. - -This has a practical implication for team design: use plan mode teammates for architecture and review roles where you want a read-only perspective. Use default mode teammates for any role that needs to write code or modify files. If you want a plan-then-implement workflow, use the [plan approval feature](/blog/guide/agents/agent-teams-controls) instead, which lets a default-mode teammate plan first and implement after approval. - -## Leverage CLAUDE.md for Self-Reporting - -With clear rules in your CLAUDE.md, teammates self-report exactly what they did without lead intervention. When a teammate finishes a cleanup task with proper CLAUDE.md context, you get reports like: - -> "Removed 27 console.log across 3 files. Kept all 12 console.error and 2 console.warn in component-page.js. Verified zero console.log remaining in my assigned files." - -No lead intervention needed. Clear rules in, clear reports out. - -This pattern emerges naturally when your CLAUDE.md has specific verification criteria. Instead of "clean up logging," the teammate knows from your CLAUDE.md that "verified" means running grep for remaining instances and checking that error-level logging is preserved. For details on structuring your CLAUDE.md for agent teams, see [CLAUDE.md mastery](/blog/guide/mechanics/claude-md-mastery) and the CLAUDE.md optimization section in [Advanced Controls](/blog/guide/agents/agent-teams-controls). - -## Troubleshooting - -Common issues and their solutions, drawn from community reports and release notes: - -| Issue | Solution | -| --- | --- | -| Teammates not appearing | Check Shift+Down to cycle through active teammates. Verify task complexity warrants a team. For split-pane mode, check tmux/iTerm2 setup. | -| Too many permission prompts | Pre-approve common operations in your [permission settings](/blog/guide/development/permission-management) before spawning teammates. Each teammate inherits the lead's permissions, so configuring once covers the whole team. | -| Teammates stopping on errors | Give additional instructions directly (Shift+Up/Down to select, then type). Or spawn a replacement teammate to continue the work. | -| Lead shuts down before work is done | Tell the lead to keep going. Say "Wait for your teammates to complete their tasks before proceeding." | -| Orphaned tmux sessions | Run `tmux ls` to list sessions, then `tmux kill-session -t ` to clean up. | -| Teammates stepping on each other's files | Define explicit file boundaries in the spawn prompt. Use directory-level ownership. See the "Avoid File Conflicts" section above. | -| Task status looks stuck | Teammates sometimes forget to mark tasks complete. Check manually with Ctrl+T and prompt the teammate to update status. | -| Teammates on Bedrock/Vertex/Foundry fail | Update to v2.1.45+. Earlier versions had issues with model identifiers and missing API provider environment variables for tmux teammates. | -| Crash when toggling agent teams setting | Update to v2.1.34+. Fixed a crash when the agent teams setting changed between renders. | -| tmux teammates can't send/receive messages | Update to v2.1.33+. Fixed agent teammate sessions in tmux to send and receive messages correctly. | - -If your issue isn't listed here, check which Claude Code version you're running. Many early pain points were resolved in the v2.1.33 through v2.1.45 releases. - -## Known Limitations - -Agent Teams is experimental. These constraints are worth knowing before you commit to a team-based workflow: - -- **No session resumption**: In-process teammates are not restored when using `/resume` or `/rewind`. After resuming, the lead may try to message teammates that no longer exist. Tell it to spawn replacements. -- **Task status can lag**: Teammates sometimes forget to mark tasks as completed, blocking dependent work. Check manually if something looks stuck. -- **Slow shutdown**: Teammates finish their current request or tool call before shutting down. This can take time if a teammate is mid-implementation. -- **One team per session**: A lead manages one team at a time. Clean up the current team before starting another. -- **No nested teams**: Teammates cannot spawn their own teams. Only the lead manages the team hierarchy. -- **Fixed lead**: The session that creates the team stays the lead for its lifetime. You cannot promote a teammate or transfer leadership. -- **Permissions set at spawn**: All teammates start with the lead's [permission settings](/blog/guide/development/permission-management). You can change individual modes after spawning, but not at spawn time. -- **Split panes require tmux or iTerm2**: Split-pane mode is not supported in VS Code's integrated terminal, Windows Terminal, or Ghostty. - -Being transparent about these limitations matters. Agent Teams is a powerful tool with rough edges. The developers who learn the workarounds now will be ready when Anthropic polishes the feature. - -## Recent Fixes - -Since the initial Agent Teams release in v2.1.32, Anthropic has shipped several important fixes. If you tried agent teams early and hit issues, check whether your problem was resolved: - -**v2.1.33**: - -- Added TeammateIdle and TaskCompleted hooks for quality gate enforcement -- Added `Task(agent_type)` spawn restrictions to control which subagent types can be spawned -- Added persistent `memory` field for agents with user, project, and local scopes -- Fixed tmux teammate sessions to correctly send and receive messages -- Fixed plan mode warnings in team contexts - -**v2.1.34**: - -- Fixed crash when agent teams setting changed between renders - -**v2.1.41**: - -- Fixed wrong model identifier for teammates on Bedrock/Vertex/Foundry -- Added `speed` attribute to OTel events for fast mode observability - -**v2.1.45**: - -- Fixed teammates failing on Bedrock/Vertex/Foundry by propagating API provider environment variables to tmux sessions -- Fixed skills invoked by subagents incorrectly appearing in main session after compaction - -If you're experiencing issues, update Claude Code to the latest version. The team ships fixes regularly and agent teams is under active development. - -## Related Guides - -This guide covers the operational patterns. For the full picture: - -- **[Agent Teams overview](/blog/guide/agents/agent-teams)** for the feature fundamentals and architecture -- **[Advanced Controls](/blog/guide/agents/agent-teams-controls)** for display modes, delegate mode, hooks, and token cost management -- **[Use Cases and Prompt Templates](/blog/guide/agents/agent-teams-use-cases)** for copy-paste prompts across 10+ real-world scenarios -- **[Sub-agent best practices](/blog/guide/agents/sub-agent-best-practices)** for when a full team is overkill and focused subagents are the better fit diff --git a/docs/site/src/content/blog/agent-teams-controls.md b/docs/site/src/content/blog/agent-teams-controls.md deleted file mode 100644 index 53243aa8..00000000 --- a/docs/site/src/content/blog/agent-teams-controls.md +++ /dev/null @@ -1,174 +0,0 @@ ---- -slug: "agent-teams-controls" -title: "Claude Code Agent Teams Controls: Delegate Mode, Hooks & More" -description: "Stop your agent team lead from grabbing implementation work. Configure delegate mode, plan approval, quality hooks, and CLAUDE.md optimization for teams." -date: "2026-02-12" -author: "Max Ritter" -tags: [Guide, Agents] -readingTime: 20 -keywords: "agent, teams, controls, delegate, mode, hooks, plan, approval, claude, code" ---- - -Agents - -# Claude Code Agent Teams Controls: Delegate Mode, Hooks & More - -Stop your agent team lead from grabbing implementation work. Configure delegate mode, plan approval, quality hooks, and CLAUDE.md optimization for teams. - -**Problem**: You enabled Claude Code Agent Teams and your first team is running. But the lead keeps doing work itself instead of delegating. Teammates edit the same files. You can't see what anyone is working on. The controls exist to solve all of this, but they're not obvious out of the box. - -**Quick Win**: Press **Shift+Tab** after starting a team to cycle into delegate mode. The lead stops touching code and focuses entirely on coordination. - -**Note**: This is a companion guide to the [Agent Teams overview](/blog/guide/agents/agent-teams). Start there if you haven't set up your first team yet. - -## Display Modes - -Agent Teams offers two display modes that change how you monitor and interact with teammates. - -### In-Process Mode (Default) - -All teammates run inside your main terminal. You navigate between them with keyboard shortcuts: - -| Shortcut | Action | -| --- | --- | -| Shift+Up/Down | Select a teammate to view or message | -| Enter | View a teammate's full session | -| Escape | Interrupt a teammate's current turn | -| Ctrl+T | Toggle the task list | -| Shift+Tab | Cycle through modes (including delegate) | - -This works in any terminal. No extra setup, no dependencies. You see one teammate's output at a time and switch between them as needed. For most workflows, in-process mode is enough. - -### Split Pane Mode - -Each teammate gets its own terminal pane. You see everyone's output simultaneously and click into any pane to interact directly. This is useful when you need to watch multiple teammates working through a complex problem at the same time. - -Split pane mode requires tmux or iTerm2. Using `tmux -CC` in iTerm2 is the recommended entry point on macOS. **Important**: split-pane mode is NOT supported in VS Code's integrated terminal, Windows Terminal, or Ghostty. tmux has known compatibility limitations on certain operating systems and works best on macOS. - -Configure your preferred mode via `settings.json`: - -Three options: - -- `"auto"` (default) uses split panes if you're already running inside tmux, otherwise falls back to in-process -- `"tmux"` enables split panes and auto-detects whether you're in tmux or iTerm2 -- `"in-process"` forces everything into your main terminal - -Override per session with the CLI flag. - -## Delegate Mode - -Without delegate mode, the lead sometimes starts implementing tasks itself instead of waiting for teammates to handle them. This defeats the purpose of having a team. You told it to coordinate, but it grabbed a wrench and started building. - -Press **Shift+Tab** to cycle into delegate mode after starting a team. This restricts the lead to coordination-only tools: spawning teammates, messaging, shutting them down, and managing tasks. The lead can't touch code directly. It focuses entirely on orchestration. - -Use delegate mode when you want the lead to act as a project manager rather than an individual contributor. This is especially important for larger teams where the lead's job is coordination, not implementation. In practice, enabling delegate mode on 4+ teammate sessions noticeably reduces wasted lead context and prevents the lead from competing with its own teammates for work. - -If you notice the lead racing ahead while teammates are still working, you can also tell it directly: "Wait for your teammates to complete their tasks before proceeding." Sometimes a natural language nudge is all you need. But for consistent behavior across sessions, delegate mode enforces the constraint automatically. - -## Plan Approval - -For complex or risky tasks, require teammates to plan before they implement anything. The teammate works in read-only plan mode until the lead reviews and approves their approach. - -The workflow: - -1. Teammate receives the task and enters read-only mode -2. Teammate creates a plan and sends a plan approval request to the lead -3. Lead reviews the plan and either approves or rejects with feedback -4. If rejected, the teammate stays in plan mode, revises, and resubmits -5. Once approved, the teammate exits plan mode and begins implementation - -The lead makes approval decisions autonomously. You influence its judgment through your initial prompt. Tell it "only approve plans that include test coverage" or "reject plans that modify the database schema without a migration." The lead applies those rules as a filter on every plan it receives. - -Plan mode is particularly valuable when teammates are working on shared infrastructure, touching database schemas, or making changes that are expensive to reverse. The cost of planning is a fraction of the cost of rolling back a bad implementation across multiple files. - -## Quality Gate Hooks - -Agent Teams integrates with Claude Code's hook system for automated quality checks. Two hooks are built specifically for team workflows: - -**TeammateIdle**: Runs when a teammate is about to go idle. Exit with code 2 to send feedback and keep the teammate working. Use this to automatically assign follow-up tasks or redirect a teammate that finished early. If a teammate completes its primary task while others are still working, a TeammateIdle hook can assign it review work or cleanup tasks without manual intervention. - -**TaskCompleted**: Runs when a task is being marked complete. Exit with code 2 to prevent completion and send feedback. Use this to enforce quality gates: require tests to pass, lint checks to succeed, or specific acceptance criteria to be met before a task can close. - -These hooks let you build structured quality gates without watching every teammate manually. A TaskCompleted hook that runs your test suite means no task closes with broken tests, regardless of which teammate worked on it. For a full walkthrough of the hook system and configuration, see the [hooks guide](/blog/tools/hooks/hooks-guide). - -## Direct Communication with Teammates - -Each teammate is a full, independent Claude Code session. You can message any teammate directly without going through the lead. - -**In-process mode**: Use Shift+Up/Down to select a teammate, then type to send them a message. Press Enter to view a teammate's full session and see everything they've done. Press Escape to interrupt their current turn if they're heading in the wrong direction. - -**Split-pane mode**: Click into a teammate's pane to interact with their session directly. Each pane behaves exactly like a standalone Claude Code session. - -This is useful when you want to redirect a specific teammate, give additional context the lead doesn't have, or ask a targeted follow-up question. Sometimes the fastest path is talking to the worker directly instead of routing through a coordinator. - -## Task Coordination - -The shared task list coordinates all work across the team. The lead creates tasks and teammates work through them. Tasks have three states: **pending**, **in progress**, and **completed**. Tasks can depend on other tasks: a pending task with unresolved dependencies cannot be claimed until those dependencies are completed. This mirrors the dependency chain patterns from [team orchestration](/blog/guide/agents/team-orchestration). - -The lead can assign tasks explicitly to specific teammates, or teammates can self-claim available work. After finishing a task, a teammate picks up the next unassigned, unblocked task on its own. This self-claiming behavior keeps the team moving without constant lead intervention. - -Task claiming uses file locking to prevent race conditions where two teammates grab the same task simultaneously. The system manages task dependencies automatically: when a teammate completes a task that other tasks depend on, blocked tasks unblock without manual intervention. A teammate waiting on a dependency starts working the moment that dependency resolves. - -For more on task coordination patterns, see [task distribution](/blog/guide/agents/task-distribution) and [todo workflows](/blog/guide/development/todo-workflows). - -## Team Size and Model Mix - -Claude decides the number of teammates based on the complexity of your task, or you can specify exactly what you want. - -You can also mix models within a team. Run the lead on Opus for strategic coordination while teammates run on Sonnet for focused implementation. This balances cost with capability. The lead needs strong reasoning for task decomposition and plan approval. Teammates doing scoped implementation work often perform well on Sonnet at a fraction of the cost. - -For even faster lead responses during coordination-heavy phases, combine agent teams with [fast mode](/blog/guide/performance/fast-mode). - -## Token Cost Management - -Agent Teams use significantly more tokens than a single session. Each teammate has its own context window, and token usage scales with the number of active teammates. When teammates run in plan mode before implementation, expect roughly 7x the tokens of a standard session for that phase. - -**Where the tokens go:** - -- Each teammate loads project context independently (CLAUDE.md, skills, project files) -- Communication adds cost: every message between agents consumes tokens in both the sender's and receiver's context -- Broadcasting multiplies cost by the number of teammates receiving the message -- The lead consumes tokens for coordination, task management, and result synthesis - -**When the cost is worth it:** - -- Research and review tasks where multiple perspectives catch issues a single pass would miss -- Debugging sessions where parallel hypothesis testing resolves issues faster than sequential guessing -- Large feature implementations where the time savings justify the token spend -- Architectural decisions where thorough evaluation prevents costly mistakes later - -**When to keep costs down:** - -- Use Sonnet for teammates doing focused implementation work and reserve Opus for the lead -- Prefer direct messages over broadcasts when possible -- Limit team size to what the task actually requires (3 teammates is often better than 6) -- Use [subagents](/blog/guide/agents/agent-fundamentals) or single sessions for routine tasks that don't need inter-agent communication -- Set clear scope for each teammate to prevent unnecessary exploration - -**Rough guideline**: A 3-teammate team running for 30 minutes will use roughly 3-4x the tokens of a single session doing the same work sequentially. The trade-off is speed and coverage versus cost. - -## CLAUDE.md Optimization for Teams - -Every teammate loads your CLAUDE.md on startup with a fresh context window. The lead's previous discussion doesn't carry over, which is why CLAUDE.md quality matters so much for teams. If your CLAUDE.md is vague, each teammate wastes tokens re-exploring the codebase independently. Three teammates loading context simultaneously means three times the token cost if that context requires exploration instead of a quick read. - -Three rules that make agent teams significantly more effective: - -### Rule 1: Describe Your Module Boundaries - -The clearer your module boundaries in CLAUDE.md, the smarter Claude splits work across teammates. Use a table to map directories to their purpose and ownership. When you tell Claude to "create a team and split by file ownership," it reads this structure and assigns explicit file lists to each teammate. Zero conflicts. - -### Rule 2: Keep Project Context Short and Operational - -Stack, entry point, test command, database. Short reads, not explorations. No teammate should need to ask the lead what the project is about or where files live. Every round of "what framework is this?" costs tokens in both the teammate's context and the lead's context when it answers. - -### Rule 3: Define What "Verified" Means - -When your CLAUDE.md lists how to check that things work, teammates use those signals to self-verify their own work before reporting back. Claude adapts verification per task. For a cleanup task, teammates might use grep to verify removals. For a feature, they run the test suite. Having project-wide gates gives the lead a vocabulary for "done" that it can apply automatically. - -With clear rules in CLAUDE.md, teammates self-report exactly what they did without lead intervention. Clear rules in, clear reports out. For more on structuring your project files, see [CLAUDE.md mastery](/blog/guide/mechanics/claude-md-mastery). - -## Next Steps - -You now have the controls to run agent teams effectively. Start with delegate mode on your next team session and watch the difference it makes in lead behavior. Add a TaskCompleted hook to enforce your test suite. Write module boundaries in your CLAUDE.md and let Claude split work automatically. - -For real-world prompts you can copy and adapt, see [Agent Teams Use Cases and Prompt Templates](/blog/guide/agents/agent-teams-use-cases). For troubleshooting common issues and current limitations, see [Agent Teams Best Practices](/blog/guide/agents/agent-teams-best-practices). diff --git a/docs/site/src/content/blog/agent-teams-use-cases.md b/docs/site/src/content/blog/agent-teams-use-cases.md deleted file mode 100644 index 2f315dcd..00000000 --- a/docs/site/src/content/blog/agent-teams-use-cases.md +++ /dev/null @@ -1,130 +0,0 @@ ---- -slug: "agent-teams-use-cases" -title: "Claude Code Agent Teams Use Cases and Prompt Templates" -description: "Real-world agent team examples and prompts for code review, debugging, full-stack features, architecture decisions, marketing campaigns, and more." -date: "2026-02-12" -author: "Max Ritter" -tags: [Guide, Agents] -readingTime: 22 -keywords: "agent, teams, use, cases, prompts, templates, code, review, debugging, claude" ---- - -Agents - -# Claude Code Agent Teams Use Cases and Prompt Templates - -Real-world agent team examples and prompts for code review, debugging, full-stack features, architecture decisions, marketing campaigns, and more. Copy, paste, run. - -**Problem**: You have [Claude Code Agent Teams](/blog/guide/agents/agent-teams) enabled and running. But "create a team to help with my project" produces unfocused results. The difference between a productive team and a token-burning mess comes down to how you structure the prompt. These agent teams examples and prompt templates give you tested starting points for every common multi-agent workflow. - -**Quick Win**: Try the parallel code review prompt below. It is the most universally useful Agent Teams pattern and works on any codebase. Three reviewers, three lenses, one comprehensive review. You will see results in minutes that would take a single reviewer three separate passes. - -This is a companion guide to the [Agent Teams overview](/blog/guide/agents/agent-teams). Start there if you have not set up your first team yet. For controls and configuration, see [Advanced Controls](/blog/guide/agents/agent-teams-controls). - -## Development Use Cases - -These prompts target the most common development workflows where parallel execution with active coordination outperforms sequential work. - -### 1. Parallel Code Review - -**Why it works**: A single reviewer gravitates toward one type of issue at a time. Splitting review criteria into independent domains means security, performance, and test coverage all get thorough attention simultaneously. The lead synthesizes findings into a comprehensive review that catches issues a single reviewer would miss. In testing, three-reviewer teams consistently surfaced issues that single-pass reviews missed. Expect roughly 2-3x the token usage of a single-session review, a worthwhile trade for the coverage. - -Delegate mode is important here. Without it, the lead tends to do its own review and then awkwardly merge it with the teammates' results. With delegate mode, the lead focuses entirely on coordination and synthesis. - -### 2. Debugging with Competing Hypotheses - -**Why it works**: The debate structure fights anchoring bias. Sequential investigation suffers from it: once one theory is explored, subsequent investigation is biased toward confirming it. Multiple independent investigators actively trying to disprove each other means the surviving theory is more likely the actual root cause. - -This pattern also surfaces unexpected connections. When teammate #3 finds a memory leak and teammate #1 was investigating timeout behavior, they can connect the dots directly without the lead acting as intermediary. That direct communication is what separates Agent Teams from [subagent patterns](/blog/guide/agents/agent-fundamentals). - -### 3. Full-Stack Feature Implementation - -**Why it works**: File-level boundaries prevent merge conflicts. Each teammate knows exactly which directories they own, and the shared task list keeps everyone synchronized on progress. When the backend teammate finishes the API contract, the frontend teammate can pick it up immediately because they are both watching the same task list. - -Without explicit file boundaries, two teammates will inevitably edit the same file and create conflicts. Directory-level ownership is the single most important detail in implementation prompts. - -### 4. Architecture Decision Record - -**Why it works**: This deliberation pattern produces better architectural decisions than a single agent weighing options alone. Each teammate commits fully to their position and looks for weaknesses in the others. The lead synthesizes only the arguments that survive challenge. - -This is especially useful for decisions where every option has real trade-offs and no clear winner. A single session tends to pick one early and rationalize it. The adversarial structure forces genuine evaluation of alternatives. - -### 5. Bottleneck Analysis - -**Why it works**: Cross-domain communication is where Agent Teams shine over [subagents](/blog/guide/agents/agent-fundamentals). When the database analyst discovers a missing index that explains the API teammate's slow endpoint, they can share that finding directly. This is the kind of collaboration that subagents simply cannot do, since subagents only report results back to the main session and never talk to each other. - -The performance bottleneck pattern also benefits from the shared task list. As each teammate identifies issues, they log them to the task list with severity ratings. The lead can watch the picture form in real time and redirect effort toward the most impactful findings. - -### 6. Inventory Classification - -**Why it works**: Data-parallel work scales linearly with teammates. Each works through their segment independently, flagging ambiguous items for human review. Four teammates processing 125 items each finishes roughly 4x faster than a single session processing 500. - -This pattern applies to any bulk operation: tagging support tickets, categorizing documentation pages, normalizing database records, or processing CSV files. The key is splitting the work by data boundaries, not by function. - -## Non-Code Use Cases - -Agent Teams are not limited to code. Any task that benefits from parallel perspectives and active coordination works. These prompts demonstrate workflows for research, content, and campaign strategy. - -### 7. Campaign Research Sprint - -**Why it works**: The competitor researcher finds gaps in the market. The voice-of-customer teammate validates whether real buyers actually care about those gaps. The positioning stress-tester takes both inputs and tests whether your message holds up. Three lenses, one synthesis. Each teammate's output directly feeds the others. - -Compare this to running three separate research sessions. You would get three independent reports and then spend time manually cross-referencing them. With Agent Teams, the cross-referencing happens automatically through inter-agent messaging. - -### 8. Landing Page Build with Adversarial Review - -**Why it works**: The plan approval step catches bad directions before they burn cycles. The adversarial reviewer finds the holes that the builder-focused teammates miss. Real buyers are skeptical. Your team should be too. - -Plan approval is especially important here because landing page copy is expensive to rewrite. Catching a weak value proposition at the outline stage takes minutes. Catching it after a full page build takes hours. - -### 9. Ad Creative Exploration - -**Why it works**: One agent exploring alone anchors on the first decent idea. Four agents actively trying to outperform each other produces battle-tested creative. The debate structure means the winning angle survived real challenge, not just a single session's internal monologue. - -This produces angles that no single session would have explored. When teammate #2 pushes back on teammate #1's approach, teammate #1 often refines their angle into something stronger rather than abandoning it. The competitive pressure raises the quality floor. - -### 10. Content Production Pipeline - -**Why it works**: Parallel research and sequential quality gates. The researcher and writer can overlap on different pieces while the reviewer catches issues before anything ships. Built-in QA without a separate review process. - -Task chaining is the key detail here. Without it, all three teammates start simultaneously and the writer drafts content without research to draw from. Explicit task dependencies through the shared task list enforce the right execution order. For more on chaining tasks across agents, see [async workflows](/blog/guide/agents/async-workflows). - -## Getting Started Progression - -If you are new to Agent Teams, start simple and build up. Jumping straight into a five-teammate implementation prompt is a recipe for confusion. This three-week progression builds your intuition for when teams add value and when they add overhead. - -### Week 1: Research and Review - -Pick a PR that needs review. Enable Agent Teams, then run a parallel code review. Three reviewers, three lenses, one comprehensive review. You will see how teammates work through the task list, communicate findings, and deliver results. Low risk, high learning. If something goes wrong, the worst case is an incomplete review that you can finish manually. - -### Week 2: Debugging with Debate - -Take a bug report and use the competing hypotheses pattern. This teaches you how inter-agent communication works in practice. Watch how teammates share evidence, how they challenge weak theories, and how consensus forms. The [shared task list](/blog/guide/agents/agent-teams) is where most of this coordination becomes visible. - -### Week 3: Implementation - -Once you are comfortable with coordination patterns, try a feature implementation with clear file boundaries. By week three, you will have intuition for when teams add value and when a single session or [subagent approach](/blog/guide/agents/sub-agent-design) is the better choice. Most developers find that teams work best for tasks requiring three or more independent work streams with at least some cross-domain communication need. - -## Prompt Writing Tips - -After running dozens of Agent Team sessions, these patterns consistently produce better results: - -- **Be specific about roles**: "one on security, one on performance" beats "reviewers." Vague roles produce vague work. -- **Define file boundaries**: Directory-level ownership prevents merge conflicts. This is non-negotiable for implementation tasks. -- **Include success criteria**: "Report findings" or "update the decision doc" gives each teammate a clear finish line. -- **Use delegate mode for pure coordination**: Keeps the lead from doing the work itself. The lead's job is synthesis, not production. -- **Require plan approval for risky work**: Catches bad directions before they waste tokens. Especially important for creative and implementation tasks. -- **Let teammates argue**: The friction produces better results than agreement. Debate patterns consistently outperform consensus-seeking patterns. -- **Keep team size to 3-5**: More teammates means more coordination overhead and higher token costs. Beyond five, the communication volume often outweighs the parallelism benefit. -- **Match the pattern to the task**: Data-parallel work (classification, processing) splits by data boundaries. Functional work (feature implementation) splits by domain. Evaluative work (architecture decisions, creative) splits by perspective. -- **Speed up the lead with fast mode**: Enable [fast mode](/blog/guide/performance/fast-mode) on the lead for snappier coordination while teammates run at standard speed to keep costs down. - -For best practices, troubleshooting, and known limitations, see [Agent Teams Best Practices](/blog/guide/agents/agent-teams-best-practices). For display modes, token cost management, and quality gate hooks, see [Advanced Controls](/blog/guide/agents/agent-teams-controls). - -## From Templates to Frameworks - -These prompts work out of the box for any Claude Code user with Agent Teams enabled. As your team workflows become more complex, you may want structured orchestration that handles agent routing, permission management, and coordination protocols automatically. - -The [multi-agent system](/blog/guide/agents/team-orchestration) provides pre-configured agent definitions and invocation protocols for exactly this purpose. If you find yourself repeatedly setting up the same team structures, a framework that codifies those patterns saves significant setup time on every session. - -The developers building agent team muscle memory today are investing in a skill that will compound as multi-agent AI tooling matures. Start with the code review prompt this week. The overhead is low, and the prompts in this guide give you a tested starting point for every common workflow. diff --git a/docs/site/src/content/blog/agent-teams.md b/docs/site/src/content/blog/agent-teams.md deleted file mode 100644 index 8cdfc5f1..00000000 --- a/docs/site/src/content/blog/agent-teams.md +++ /dev/null @@ -1,528 +0,0 @@ ---- -slug: "agent-teams" -title: "Claude Code Agent Teams: Multi-Session Orchestration" -description: "Orchestrate teams of Claude Code sessions working together. Shared tasks, inter-agent messaging, and centralized management for parallel AI development." -date: "2026-02-05" -author: "Max Ritter" -tags: [Guide, Agents] -readingTime: 23 -keywords: "agent, claude, code, multisession, orchestration, teams" ---- - -Agents - -# Claude Code Agent Teams: Orchestrate Multiple Claude Sessions in Parallel - -Orchestrate teams of Claude Code sessions working together. Shared tasks, inter-agent messaging, and centralized management for parallel AI development. - -**Problem**: You're managing a complex codebase refactor that touches the API layer, database migrations, test coverage, and documentation. A single Claude Code session handles one piece at a time. [Subagents](/blog/guide/agents/agent-fundamentals) can parallelize work, but they report results back in isolation. They can't share findings, challenge assumptions, or coordinate directly with each other. When you need real collaboration between AI workers, subagents hit a wall. - -**Quick Win**: Enable Claude Code Agent Teams and orchestrate a collaborative team in one prompt: - -```p-4 -# Add to your environment or settings.json -export CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1 -``` - -Then tell Claude: - -```p-4 -Create an agent team to refactor the payment module. Spawn three teammates: -one for the API layer, one for the database migrations, one for test coverage. -Have them coordinate through the shared task list. -``` - -Claude creates a team lead, spawns three independent teammates, and coordinates their work through a shared task list and direct messaging. Each teammate owns their scope. No conflicts, no isolation. - -**Note on terminology**: This post covers Claude Code's native Agent Teams feature, an experimental built-in system for multi-agent collaboration. If you're looking for DIY builder-validator patterns using the Task tool, see [team orchestration with builder-validator chains](/blog/guide/agents/team-orchestration). Both approaches enable multi-agent workflows, but they work very differently under the hood. - -## [What Are Claude Code Agent Teams?](#what-are-claude-code-agent-teams) - -Agent Teams is an experimental feature that lets you orchestrate teams of Claude Code sessions working together on a shared project. One session acts as the team lead. It coordinates work, assigns tasks, and synthesizes results. Teammates work independently, each in its own context window, and communicate directly with each other. - -The key difference from [subagents](/blog/guide/agents/agent-fundamentals) is communication. Subagents run within a single session and can only report results back to the main agent. They can't message each other, share discoveries mid-task, or coordinate without the main agent acting as intermediary. Agent Teams removes that bottleneck entirely. Teammates message each other, claim tasks from a shared list, and work through problems collaboratively. You can interact with individual teammates directly without going through the lead. - -Think of it this way: subagents are contractors you send on separate errands. Agent Teams is a project team sitting in the same room, each working on their piece while staying in sync through conversation. It's the difference between managing a freelancer queue and managing a full crew. - -## [Why Agent Teams Matter Now](#why-agent-teams-matter-now) - -Anthropic shipped Agent Teams as an experimental feature with the Opus 4.6 release. The community had been building similar patterns independently for months, using tools like OpenClaw and custom orchestration scripts. Anthropic recognized the demand and built it into Claude Code natively. - -This is significant for three reasons: - -1. **Native integration beats bolted-on solutions.** The shared task list, mailbox system, and teammate lifecycle management are built into Claude Code's core. No external dependencies, no fragile scripts. -2. **The multi-agent paradigm is maturing.** Developers who build muscle memory with agent teams now will have a serious edge as these tools evolve. The gap between "uses Claude Code" and "orchestrates Claude Code teams" will widen. -3. **Complex projects demand collaboration, not just parallelism.** A [task distribution](/blog/guide/agents/task-distribution) strategy gets you parallel execution. Agent Teams gets you parallel execution with active coordination, where teammates can share context, challenge each other's approaches, and converge on better solutions together. - -## [When to Use Agent Teams](#when-to-use-agent-teams) - -Agent Teams add coordination overhead and use significantly more tokens than a single session. They work best when teammates can operate independently on distinct scopes while still benefiting from communication. - -### [Strong Use Cases](#strong-use-cases) - -- **Research and review**: Multiple teammates investigate different aspects of a problem simultaneously, then share and challenge each other's findings -- **New modules or features**: Teammates each own a separate component without stepping on each other's files -- **Debugging with competing hypotheses**: Teammates test different theories in parallel and actively try to disprove each other -- **Cross-layer coordination**: Changes that span frontend, backend, and tests, each owned by a different teammate -- **Debate and consensus**: Multiple teammates argue different positions on an architectural decision, converging on the strongest approach -- **Large-scale inventory or classification**: Teammates divide a large dataset and process segments independently - -### [When to Skip Agent Teams](#when-to-skip-agent-teams) - -For sequential tasks, same-file edits, or work with tight dependencies, a single session or [subagent patterns](/blog/guide/agents/sub-agent-best-practices) are more cost-effective. If your workers don't need to communicate with each other, the overhead of an Agent Team isn't worth it. Use [async workflows](/blog/guide/agents/async-workflows) for simple parallel execution without the collaboration layer. - -## [Subagents vs Agent Teams: Choosing Your Approach](#subagents-vs-agent-teams-choosing-your-approach) - -Both let you parallelize work, but they operate at different levels. The deciding question: do your workers need to communicate with each other? - -| Feature | Subagents | Agent Teams | -| --- | --- | --- | -| **Context** | Own window, results summarized back to caller | Own window, fully independent | -| **Communication** | Report results back to the main agent only | Teammates message each other directly | -| **Coordination** | Main agent manages all work | Shared task list with self-coordination | -| **Best for** | Focused tasks where only the result matters | Complex work requiring discussion and collaboration | -| **Token cost** | Lower: results summarized back to main context | Higher: each teammate is a separate Claude instance | -| **Use case examples** | Code review, file analysis, research lookups | Multi-component features, debates, cross-layer refactors | -| **Setup required** | None (built into Claude Code) | Environment variable to enable | -| **Communication pattern** | Hub-and-spoke (all through main agent) | Mesh (any teammate to any teammate) | - -Use subagents when you need quick, focused workers that report back. Use Agent Teams when teammates need to share findings, challenge each other, and coordinate on their own. - -For more on subagent routing decisions, see [sub-agent best practices](/blog/guide/agents/sub-agent-best-practices). - -## [Step-by-Step: Your First Agent Team in 5 Minutes](#step-by-step-your-first-agent-team-in-5-minutes) - -### [Step 1: Enable Agent Teams](#step-1-enable-agent-teams) - -Set the environment variable in your shell: - -```p-4 -export CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1 -``` - -Or add it to your `settings.json` for persistence across sessions: - -```p-4 -{ - "env": { - "CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS": "1" - } -} -``` - -### [Step 2: Describe Your Task and Team Structure](#step-2-describe-your-task-and-team-structure) - -Tell Claude what you need in natural language. Be specific about roles and scope: - -```p-4 -Create an agent team to review our authentication system. Spawn three teammates: -- Security reviewer: audit for vulnerabilities, check token handling -- Performance analyst: profile response times, identify bottlenecks -- Test coverage checker: verify edge cases, find untested paths -Have them share findings and coordinate through the task list. -``` - -### [Step 3: Watch the Team Form](#step-3-watch-the-team-form) - -Claude creates a team lead (your main session), spawns the teammates, and distributes work through the shared task list. You'll see teammates appear in the interface. - -Claude can also propose creating a team on its own. If it determines your task would benefit from parallel work, it may suggest forming a team. You confirm before it proceeds. Either way, you stay in control. - -### [Step 4: Monitor and Steer](#step-4-monitor-and-steer) - -Use the keyboard shortcuts to track progress: - -- **Shift+Up/Down**: Select a teammate to view or message -- **Enter**: View a teammate's full session -- **Ctrl+T**: Toggle the task list -- **Escape**: Interrupt a teammate's current turn - -### [Step 5: Clean Up](#step-5-clean-up) - -When work is done, shut down teammates and clean up: - -```p-4 -Ask all teammates to shut down, then clean up the team. -``` - -When a teammate receives a shutdown request, it can approve (exiting gracefully) or reject with an explanation if it still has pending work. Teammates finish their current request or tool call before shutting down, so this can take time. - -Shut down all teammates before running cleanup. The lead checks for active teammates and won't clean up if any are still running. Always use the lead to clean up. Teammates should not run cleanup because their team context may not resolve correctly, potentially leaving shared resources in an inconsistent state. - -## [Architecture: How Agent Teams Work](#architecture-how-agent-teams-work) - -An Agent Team has four components working together: - -| Component | Purpose | -| --- | --- | -| **Team Lead** | Your main Claude Code session. Creates the team, spawns teammates, assigns tasks, and synthesizes results. | -| **Teammates** | Separate Claude Code instances. Each gets its own context window and works on assigned tasks. | -| **Shared Task List** | Central work queue all agents can see. Tasks have states (pending, in progress, completed) and support dependencies. | -| **Mailbox** | Messaging system for communication between agents. | - -Teams and their configuration live locally: - -- Team config: `~/.claude/teams/{team-name}/config.json` -- Task list: `~/.claude/tasks/{team-name}/` - -The team config contains a members array with each teammate's name, agent ID, and agent type. - -### [Context and Communication](#context-and-communication) - -Each teammate has its own context window. When spawned, a teammate loads the same project context as a regular Claude Code session: your [CLAUDE.md](/blog/guide/mechanics/claude-md-mastery), MCP servers, and [skills](/blog/guide/mechanics/claude-skills-guide). It also receives the spawn prompt from the lead. The lead's conversation history does not carry over. - -Communication works through several channels: - -- **Automatic message delivery**: when teammates send messages, they are delivered automatically to recipients -- **Idle notifications**: when a teammate finishes and stops, they automatically notify the lead -- **Shared task list**: all agents can see task status and claim available work -- **Message**: send to one specific teammate -- **Broadcast**: send to all teammates simultaneously (use sparingly, since costs scale with team size) - -### [Permissions](#permissions) - -Teammates start with the lead's permission settings. If the lead runs with `--dangerously-skip-permissions`, all teammates do too. After spawning, you can change individual teammate modes, but you cannot set per-teammate modes at spawn time. - -## [Display Modes: Watching Your Team Work](#display-modes-watching-your-team-work) - -Agent Teams supports two ways to view what's happening. - -### [In-Process Mode (Default)](#in-process-mode-default) - -All teammates run inside your main terminal. You see the lead's output by default and can switch between teammates using keyboard shortcuts: - -| Shortcut | Action | -| --- | --- | -| **Shift+Up/Down** | Select a teammate to view or message | -| **Enter** | View a teammate's full session | -| **Escape** | Interrupt a teammate's current turn | -| **Ctrl+T** | Toggle the task list | -| **Shift+Tab** | Cycle through modes (including delegate) | - -This works in any terminal. No extra setup required. - -### [Split Pane Mode](#split-pane-mode) - -Each teammate gets its own terminal pane. You see everyone's output simultaneously and click into any pane to interact with their session directly. This requires tmux or iTerm2. - -tmux has known limitations on certain operating systems and traditionally works best on macOS. Using `tmux -CC` in iTerm2 is the suggested entrypoint into tmux. - -To configure display mode, set `teammateMode` in your `settings.json`: - -```p-4 -{ - "teammateMode": "in-process" -} -``` - -The three options: - -- `"auto"` (default): Uses split panes if you're already inside a tmux session, otherwise falls back to in-process -- `"tmux"`: Enables split panes, auto-detects between tmux and iTerm2 based on your terminal -- `"in-process"`: Forces all teammates into the main terminal - -You can also override per-session with a flag: - -```p-4 -claude --teammate-mode in-process -``` - -## [Delegate Mode: Keep the Lead Focused](#delegate-mode-keep-the-lead-focused) - -Without delegate mode, the lead sometimes starts implementing tasks itself instead of waiting for teammates. This defeats the purpose of having a team. - -Press **Shift+Tab** to cycle into delegate mode after starting a team. This restricts the lead to coordination-only tools: spawning teammates, messaging, shutting them down, and managing tasks. The lead can't touch code directly. It focuses entirely on orchestration. - -Use delegate mode when you want the lead to act as a project manager rather than an individual contributor. This is especially important for larger teams where the lead's job is coordination, not implementation. - -## [Plan Approval: Review Before Execution](#plan-approval-review-before-execution) - -For complex or risky tasks, require teammates to plan before they implement anything. The teammate works in read-only plan mode until the lead approves their approach. - -```p-4 -Spawn an architect teammate to refactor the authentication module. -Require plan approval before they make any changes. -``` - -The workflow: - -1. Teammate receives the task and works in read-only mode -2. Teammate creates a plan and sends a plan approval request to the lead -3. Lead reviews the plan and either approves or rejects with feedback -4. If rejected, the teammate stays in plan mode, revises, and resubmits -5. Once approved, the teammate exits plan mode and begins implementation - -The lead makes approval decisions autonomously. Influence its judgment through your initial prompt: "only approve plans that include test coverage" or "reject plans that modify the database schema." - -## [Quality Gates with Hooks](#quality-gates-with-hooks) - -Agent Teams integrates with Claude Code's hook system for automated quality checks. Two hooks are particularly useful for team workflows: - -**TeammateIdle**: Runs when a teammate is about to go idle. Exit with code 2 to send feedback and keep the teammate working. Use this to automatically assign follow-up tasks or redirect a teammate that finished early. - -**TaskCompleted**: Runs when a task is being marked complete. Exit with code 2 to prevent completion and send feedback. Use this to enforce quality gates: require tests to pass, code review to happen, or specific acceptance criteria to be met before a task can close. - -These hooks let you build structured quality gates without manual intervention. The team operates with built-in guardrails that enforce your standards automatically. For more on hooks, see the [hooks guide](/blog/tools/hooks/hooks-guide). - -## [Talking to Teammates Directly](#talking-to-teammates-directly) - -Each teammate is a full, independent Claude Code session. You can message any teammate directly without going through the lead. - -**In-process mode**: Use Shift+Up/Down to select a teammate, then type to send them a message. Press Enter to view a teammate's session, then Escape to interrupt their current turn. Press Ctrl+T to toggle the task list. - -**Split-pane mode**: Click into a teammate's pane to interact with their session directly. - -## [Task Assignment and Claiming](#task-assignment-and-claiming) - -The shared task list coordinates all work. The lead creates tasks and teammates work through them. Tasks have three states: **pending**, **in progress**, and **completed**. Tasks can depend on other tasks: a pending task with unresolved dependencies cannot be claimed until those dependencies are completed. This mirrors the dependency chain patterns from [team orchestration](/blog/guide/agents/team-orchestration). - -The lead can assign tasks explicitly, or teammates can self-claim available work. After finishing a task, a teammate picks up the next unassigned, unblocked task on its own. - -Task claiming uses file locking to prevent race conditions where two teammates grab the same task. This is the coordination layer that prevents teammates from stepping on each other's toes. The system manages task dependencies automatically: when a teammate completes a task that other tasks depend on, blocked tasks unblock without manual intervention. - -For more on task coordination patterns, see [task distribution](/blog/guide/agents/task-distribution) and [todo workflows](/blog/guide/development/todo-workflows). - -## [Real-World Use Cases with Prompt Templates](#real-world-use-cases-with-prompt-templates) - -Here are battle-tested prompts you can copy and adapt for common scenarios. - -### [1. Parallel Code Review](#1-parallel-code-review) - -```p-4 -Create an agent team to review PR #142. Spawn three reviewers: -- One focused on security implications -- One checking performance impact -- One validating test coverage -Have them each review and report findings. Use delegate mode so the -lead synthesizes a final review without doing its own analysis. -``` - -Each reviewer works from the same PR but applies a different lens. The lead synthesizes findings into a comprehensive review that catches issues a single reviewer would miss by focusing on only one concern at a time. - -### [2. Debugging with Competing Hypotheses](#2-debugging-with-competing-hypotheses) - -```p-4 -Users report the app exits after one message instead of staying connected. -Spawn 5 agent teammates to investigate different hypotheses. Have them talk -to each other to try to disprove each other's theories, like a scientific -debate. Update the findings doc with whatever consensus emerges. -``` - -The debate structure fights anchoring bias. Multiple independent investigators actively trying to disprove each other means the surviving theory is more likely correct. Instead of testing theories sequentially (where you tend to stop at the first plausible explanation), parallel investigation with active challenge produces more reliable conclusions. - -### [3. Full-Stack Feature Implementation](#3-full-stack-feature-implementation) - -```p-4 -Create an agent team to implement the user notifications system. -Spawn four teammates: -- Backend: Create the notification service, database schema, and API endpoints -- Frontend: Build the notification bell component, dropdown, and read/unread states -- Tests: Write integration tests for the full notification flow -- Docs: Update the API documentation and add usage examples - -Assign each teammate clear file boundaries. Backend owns src/api/notifications/ -and src/db/migrations/. Frontend owns src/components/notifications/. -Tests own tests/notifications/. No file overlap. -``` - -File-level boundaries prevent merge conflicts. Each teammate knows exactly which directories they own, and the shared task list keeps everyone synchronized on progress. - -### [4. Architecture Decision Record](#4-architecture-decision-record) - -```p-4 -Create an agent team to evaluate database options for our new analytics feature. -Spawn three teammates, each advocating for a different approach: -- Teammate 1: Argue for PostgreSQL with materialized views -- Teammate 2: Argue for ClickHouse as a dedicated analytics store -- Teammate 3: Argue for keeping everything in the existing MongoDB - -Have them challenge each other's arguments. Focus on: query performance -at 10M+ rows, operational complexity, migration effort, and cost. -The lead should synthesize a decision document with the strongest arguments -from each side. -``` - -This deliberation pattern produces better architectural decisions than a single agent weighing options alone. Each teammate commits fully to their position and looks for weaknesses in the others. - -### [5. Bottleneck Analysis](#5-bottleneck-analysis) - -```p-4 -Create an agent team to identify performance bottlenecks in the application. -Spawn three teammates: -- One profiling API response times across all endpoints -- One analyzing database query performance and indexing -- One reviewing frontend bundle size and rendering performance - -Have them share findings when they discover something that affects -another teammate's domain (e.g., slow API caused by missing DB index). -``` - -Cross-domain communication is where Agent Teams shine over subagents. When the database analyst discovers a missing index that explains the API teammate's slow endpoint, they can share that finding directly. - -### [6. Inventory Classification](#6-inventory-classification) - -```p-4 -Create an agent team to classify our product catalog. We have 500 items -that need categorization, tagging, and description updates. -Spawn 4 teammates, each handling a segment: -- Teammate 1: Items 1-125 -- Teammate 2: Items 126-250 -- Teammate 3: Items 251-375 -- Teammate 4: Items 376-500 - -Use the classification schema in docs/taxonomy.md. Have teammates -flag edge cases for the lead to review. -``` - -Data-parallel work scales linearly with teammates. Each works through their segment independently, flagging ambiguous items for human review. - -## [Specifying Teammates and Models](#specifying-teammates-and-models) - -Claude decides the number of teammates based on the complexity of your task, or you can specify exactly what you want: - -```p-4 -Create a team with 4 teammates to refactor these modules in parallel. -Use Sonnet for each teammate. -``` - -You can also mix models. Run the lead on Opus for strategic coordination while teammates run on Sonnet for focused implementation. This balances cost with capability. - -## [Token Cost Considerations](#token-cost-considerations) - -Agent Teams use significantly more tokens than a single session. Each teammate has its own context window, and token usage scales with the number of active teammates. - -**Where the tokens go:** - -- Each teammate loads project context independently (CLAUDE.md, skills, project files) -- Communication adds cost: every message consumes tokens in both the sender's and receiver's context -- Broadcasting multiplies cost by the number of teammates receiving the message -- The lead consumes tokens for coordination, task management, and synthesis - -**When the cost is worth it:** - -- Research and review tasks where multiple perspectives catch issues a single pass would miss -- Debugging sessions where parallel hypothesis testing resolves issues faster -- Large feature implementations where the time savings justify the token spend -- Architectural decisions where thorough evaluation prevents costly mistakes later - -**When to keep costs down:** - -- Use Sonnet for teammates doing focused implementation work; reserve Opus for the lead -- Prefer direct messages over broadcasts -- Limit team size to what the task requires (3 teammates is often better than 6) -- Use subagents or single sessions for routine tasks that don't need inter-agent communication -- Set clear scope for each teammate to prevent unnecessary exploration - -**Rough guideline**: A 3-teammate team running for 30 minutes will use roughly 3-4x the tokens of a single session doing the same work sequentially. The trade-off is speed and coverage versus cost. - -## [Best Practices](#best-practices) - -- **Give teammates enough context**: Include task-specific details in the spawn prompt so teammates don't start blind. Reference specific files, acceptance criteria, and constraints. -- **Size tasks appropriately**: Not too small, not too large. Aim for self-contained units with clear deliverables, roughly 5-6 tasks per teammate. -- **Wait for teammates to finish before proceeding**: Don't let the lead race ahead while teammates are still working. Use delegate mode to enforce this. -- **Start with research and review before implementation**: Build intuition for when teams add value before applying them to implementation-heavy workflows. -- **Avoid file conflicts**: Each teammate should own different files. Two teammates editing the same file leads to overwrites. Define clear directory boundaries in your spawn prompt. -- **Monitor and steer**: Check progress regularly with Ctrl+T and redirect approaches that are going off track. -- **Use delegate mode by default**: It prevents the lead from doing work that teammates should handle, keeping the coordination clean. - -## [Troubleshooting](#troubleshooting) - -| Issue | Solution | -| --- | --- | -| Teammates not appearing | Check Shift+Down, verify task complexity warrants a team, check tmux/iTerm2 setup for split-pane mode | -| Too many permission prompts | Pre-approve common operations in your permission settings | -| Teammates stopping on errors | Give additional instructions or spawn replacement teammates | -| Lead shuts down before work is done | Tell the lead to keep going and wait for teammates to finish | -| Orphaned tmux sessions | Run `tmux ls` to list sessions, then `tmux kill-session -t ` to clean up | -| Teammates stepping on each other | Define explicit file boundaries in the spawn prompt; use directory-level ownership | -| Task status looks stuck | Teammates sometimes forget to mark tasks complete; check manually with Ctrl+T and prompt the teammate | - -## [Current Limitations](#current-limitations) - -Agent Teams is experimental. These constraints are worth knowing before you commit to a team-based workflow: - -- **No session resumption**: In-process teammates are not restored when using `/resume` or `/rewind`. After resuming, the lead may try to message teammates that no longer exist. Tell it to spawn replacements. -- **Task status can lag**: Teammates sometimes forget to mark tasks as completed, blocking dependent work. Check manually if something looks stuck. -- **Slow shutdown**: Teammates finish their current request or tool call before shutting down. This can take time. -- **One team per session**: A lead manages one team at a time. Clean up the current team before starting another. -- **No nested teams**: Teammates cannot spawn their own teams. Only the lead manages the team hierarchy. -- **Fixed lead**: The session that creates the team stays the lead for its lifetime. You cannot promote a teammate or transfer leadership. -- **Permissions set at spawn**: All teammates start with the lead's permission settings. You can change individual modes after spawning, but not at spawn time. -- **Split panes require tmux or iTerm2**: Split-pane mode is not supported in other terminals. -- **CLAUDE.md works normally**: Teammates load project instructions the same way any session does. - -Being transparent about these limitations matters. Agent Teams is a powerful tool with rough edges. The developers who learn the workarounds now will be ready when Anthropic polishes the feature. - -## [Managing Agent Coordination at Scale](#managing-agent-coordination-at-scale) - -As your agent teams grow in complexity, the coordination challenge shifts from "can I parallelize?" to "how do I manage the orchestration?" The spawn prompts, task boundaries, permission settings, and model selection decisions add up. - -This is where structured frameworks help. - -## [Getting Started: A Progressive Path](#getting-started-a-progressive-path) - -If you're new to Agent Teams, start simple and build up. - -### [Week 1: Research and Review](#week-1-research-and-review) - -Pick a PR that needs review. Enable Agent Teams, then run: - -```p-4 -Create an agent team to review PR #142. Spawn three reviewers: -- One focused on security implications -- One checking performance impact -- One validating test coverage -Have them each review and report findings. -``` - -Three reviewers, three lenses, one comprehensive review. You'll see how teammates work through the task list, communicate findings, and deliver results. Low risk, high learning. - -### [Week 2: Debugging with Debate](#week-2-debugging-with-debate) - -Take a bug report and use the competing hypotheses pattern: - -```p-4 -Users report intermittent 500 errors on the checkout endpoint. -Spawn 3 teammates to investigate different hypotheses: -- One checking database connection pooling -- One investigating race conditions in the payment flow -- One analyzing server resource limits -Have them share findings and challenge each other's theories. -``` - -This teaches you how inter-agent communication works in practice. - -### [Week 3: Implementation](#week-3-implementation) - -Once you're comfortable with coordination patterns, try a feature implementation with clear file boundaries: - -```p-4 -Create an agent team to build the webhook system. -Assign directory-level ownership to prevent conflicts. -Use delegate mode for the lead. -``` - -By week three, you'll have intuition for when teams add value and when a single session or [subagent approach](/blog/guide/agents/sub-agent-design) is the better choice. - -## [The Multi-Agent Spectrum](#the-multi-agent-spectrum) - -Agent Teams sits at one end of a spectrum of multi-agent approaches in Claude Code. Understanding where each tool fits helps you choose the right one: - -| Approach | Communication | Best For | Guide | -| --- | --- | --- | --- | -| **Single session** | N/A | Sequential, focused tasks | [Context management](/blog/guide/mechanics/context-management) | -| **Subagents (Task tool)** | Results only, back to main | Parallel focused work | [Agent fundamentals](/blog/guide/agents/agent-fundamentals) | -| **Builder-validator pairs** | Structured handoff via tasks | Quality-gated implementation | [Team orchestration](/blog/guide/agents/team-orchestration) | -| **Agent Teams** | Full mesh, direct messaging | Collaborative exploration | This guide | - -Combine these approaches based on your needs. Use Agent Teams for the collaborative exploration phase, then switch to [builder-validator patterns](/blog/guide/agents/team-orchestration) for the implementation phase where quality gates matter. For [keeping context manageable](/blog/guide/performance/context-preservation) across long-running team sessions, apply the same strategies you would with any multi-agent workflow. - -The developers building agent team muscle memory today are investing in a skill that will compound as multi-agent AI tooling matures. Start with a review task this week. The overhead is low, and the capabilities will change how you think about complex development work. - -Last updated on - -[Previous - -Team Orchestration](/blog/guide/agents/team-orchestration)[Next - -Custom Agents](/blog/guide/agents/custom-agents) diff --git a/docs/site/src/content/blog/agentic-engineering-best-practices.md b/docs/site/src/content/blog/agentic-engineering-best-practices.md deleted file mode 100644 index 000d0401..00000000 --- a/docs/site/src/content/blog/agentic-engineering-best-practices.md +++ /dev/null @@ -1,88 +0,0 @@ ---- -slug: "agentic-engineering-best-practices" -title: "5 Claude Code Agentic Engineering Best Practices" -description: "Master agentic engineering with 5 proven Claude Code best practices. Workflows top engineers use daily for 10x AI-assisted productivity gains." -date: "2026-01-08" -author: "Max Ritter" -tags: [Guide, Development] -readingTime: 4 -keywords: "5, agentic, best, claude, code, engineering, practices" ---- - -Development - -# Agentic Engineering Best Practices: 5 Techniques Top Engineers Use Daily - -Master agentic engineering with 5 proven Claude Code best practices. Workflows top engineers use daily for 10x AI-assisted productivity gains. - -Most developers using Claude Code are leaving 90% of its potential on the table. - -They jump straight into prompting, fight context drift, and wonder why their AI assistant seems to forget everything mid-conversation. Sound familiar? - -Here's the fix: five agentic engineering techniques that transform how you work with AI. No new tools required. Just a better system that the top agentic engineers use daily. - -## [1. PRD-First Development](#1-prd-first-development) - -Before writing a single line of code, create a Product Requirements Document. Not a 50-page corporate spec. A simple markdown file that answers: what are we building, what's in scope, and what's explicitly out of scope. - -This becomes your north star. Every conversation with Claude Code references it. Instead of context drifting across sessions, you ask: "Based on the PRD, what should we build next?" - -The PRD splits your project into granular features. Authentication. API endpoints. User interface. One feature per session. Claude Code handles focused work beautifully. It falls apart when you ask it to do everything at once. - -Want to go deeper? Check out our guide on [planning modes](/blog/guide/mechanics/planning-modes) for structuring complex projects. - -## [2. Modular Rules Architecture](#2-modular-rules-architecture) - -Your CLAUDE.md file is probably too long. Most developers dump everything into one massive rules file. That's a mistake. - -Keep your global rules lightweight. Tech stack, testing strategy, logging conventions. Things that apply no matter what you're working on. - -Then split task-specific context into separate reference documents. Frontend conventions in one file. API patterns in another. Deployment rules somewhere else. Your CLAUDE.md references these paths, and Claude Code loads them only when relevant. - -The goal: protect your context window. Load what you need, when you need it. Our [CLAUDE.md mastery guide](/blog/guide/mechanics/claude-md-mastery) breaks this down in detail. - -## [3. Command-ify Everything](#3-command-ify-everything) - -If you prompt something twice, turn it into a command. - -Creating commits? That's a `/commit` command. Code reviews? `/review`. Priming context at session start? `/prime`. - -These aren't complicated. They're markdown files that define workflows. You'll save thousands of keystrokes over time, and more importantly, you'll build a system that compounds. - -Check out how to create your own reusable workflows in our [skills guide](/blog/guide/mechanics/claude-skills-guide). - -## [4. The Context Reset](#4-the-context-reset) - -Here's what most people miss: planning and execution should happen in separate conversations. - -During planning, you research, discuss, and output a structured plan document. Then you clear the conversation completely. Fresh context. When you execute, you feed only that plan document. Nothing else. - -Why? Context window degradation is real. After enough back-and-forth, Claude Code starts making assumptions based on earlier messages that are no longer relevant. A fresh start means sharper focus, better results. - -Learn more about managing this in our [context management guide](/blog/guide/mechanics/context-management). - -## [5. System Evolution Mindset](#5-system-evolution-mindset) - -Every bug is an opportunity to make your system smarter. - -When Claude Code uses the wrong import style, don't just fix it. Add a rule: "Always use @ path aliases for imports." When it forgets to run tests, update your plan template to include a testing section. - -The difference between good and great isn't fixing bugs. It's fixing the system that allowed the bug. - -This mindset turns every session into a compounding improvement. Over time, your AI coding assistant gets more reliable, more consistent, and more valuable. Our [experimentation mindset guide](/blog/guide/mechanics/experimentation-mindset) explores this further. - -## [The Agentic Engineering Difference](#the-agentic-engineering-difference) - -None of these agentic engineering techniques require new tools. They're just better ways of working with AI. - -PRD-first. Modular rules. Commands for everything. Context resets. System evolution. - -The developers who master agentic engineering aren't just using Claude Code. They're building a system that gets smarter every day. That's the core of what agentic engineering is all about: systematic improvement, not one-off prompting. - -Last updated on - -[Previous - -Robots-First Engineering](/blog/guide/mechanics/robots-first-engineering)[Next - -InfraOps VPS Guide](/blog/guide/development/infraops-vps-guide) diff --git a/docs/site/src/content/blog/ai-seo-geo-optimization.md b/docs/site/src/content/blog/ai-seo-geo-optimization.md deleted file mode 100644 index 42eca210..00000000 --- a/docs/site/src/content/blog/ai-seo-geo-optimization.md +++ /dev/null @@ -1,135 +0,0 @@ ---- -slug: "ai-seo-geo-optimization" -title: "AI SEO & GEO: Get Your Content Cited by ChatGPT & Perplexity" -description: "Learn GEO to get cited by ChatGPT, Claude, and Perplexity. Traditional SEO is dying. Here is what replaces it for AI-first discovery." -date: "2025-11-13" -author: "Max Ritter" -tags: [Guide, Tools] -readingTime: 4 -keywords: "ai, by, chatgpt, cited, content, geo, get, optimization, perplexity, seo" ---- - -Extensions - -# AI SEO & GEO: Get Your Content Cited by ChatGPT & Perplexity - -Learn GEO to get cited by ChatGPT, Claude, and Perplexity. Traditional SEO is dying. Here is what replaces it for AI-first discovery. - -**Problem**: Your content ranks on Google but ChatGPT never cites it. You're invisible to the AI assistants your users actually ask. - -Traditional SEO is dying. By 2026, search traffic drops 25%. By 2028, it drops 50%. ChatGPT alone handles 10 million queries daily—more than Bing. When users ask AI assistants for answers, your competitors get cited. You don't. - -Here's your 2-minute quick win: - -```p-4 -# Check if you're indexed in Bing (powers ChatGPT, Copilot) -site:yourdomain.com -``` - -Search that in Bing. See results? Good start. See nothing? You're invisible to every AI assistant that uses Bing's index. That's ChatGPT, Copilot, and Perplexity. - -## [What is GEO (Generative Engine Optimization)](#what-is-geo-generative-engine-optimization) - -GEO optimizes content to be **cited** by AI assistants, not just ranked on Google. When someone asks ChatGPT "What's the best way to deploy Next.js?", you want your content referenced in the answer. - -The difference from traditional SEO: - -- **SEO goal**: Get a click to your website -- **GEO goal**: Become the answer AI assistants cite -- **SEO metric**: Search rankings and traffic -- **GEO metric**: Citation rates and reference frequency - -ChatGPT doesn't care about your meta descriptions or backlinks. It cares whether your content provides clear, structured answers that LLMs can parse and cite. - -## [Why This Matters for Claude Code Users](#why-this-matters-for-claude-code-users) - -If you're building with [Claude Code](/blog/guide/what-is-claude-code), you're already thinking in AI-native terms. The same principles that make you effective with Claude apply directly to GEO: - -- **Structured content**: Claude responds best to clear, well-organized instructions. So do AI search engines parsing your content. -- **Context optimization**: You manage [context windows](/blog/guide/mechanics/context-management) when coding. GEO is essentially context optimization for LLM consumption. -- **Automation at scale**: Your [agent workflows](/blog/guide/agents/agent-fundamentals) can generate GEO-optimized documentation automatically—a massive advantage over manual SEO. - -## [How to Optimize Content for AI Citations](#how-to-optimize-content-for-ai-citations) - -**1. Structure for AI Comprehension** - -AI assistants prefer content that's easy to parse. Use clear headings, lists, and definitions: - -```p-4 -## What is [Topic] - -[Topic] is [clear one-sentence definition]. - -### Key Benefits - -- Benefit 1: [specific outcome] -- Benefit 2: [measurable result] -- Benefit 3: [clear advantage] -``` - -This structure helps LLMs extract and cite your content accurately. - -**2. Get Indexed Fast with IndexNow** - -Google crawls slowly. ChatGPT and Perplexity use Bing's index, which supports IndexNow—instant indexing. - -[ShowUpInAI](https://showupinai.com/) automates this: - -```p-4 -# What ShowUpInAI does automatically: -1. Crawls your site daily for changes -2. Detects updated content instantly -3. Submits to Bing via IndexNow (indexed in minutes) -4. Monitors how AI assistants perceive your pages -``` - -Without automation, you wait weeks for Bing to crawl you. With ShowUpInAI, your content updates appear in ChatGPT/Perplexity responses within hours. Plans start at $14.99/month for 500 pages. - -**3. Test Your AI Visibility** - -Check what AI assistants actually say about your content: - -```p-4 -# Prompt for ChatGPT/Claude/Perplexity: -"What are the best tools for [your topic]? Include sources." -``` - -Do they cite you? If not, your content isn't GEO-optimized yet. - -## [Common GEO Mistakes](#common-geo-mistakes) - -**Mistake 1: "My Google ranking is #1, so I'm good"** - -Google rankings don't transfer to AI citations. ChatGPT doesn't see your Google position—it sees Bing's index and evaluates content authority independently. - -**Fix**: Focus on content depth and structure, not keyword density. AI assistants reward comprehensive answers, not SEO tricks. - -**Mistake 2: "I'll just wait for AI to find my content"** - -Bing's crawl schedule is unpredictable. Your content update might wait 3-6 weeks before AI assistants see it. - -**Fix**: Use [ShowUpInAI](https://showupinai.com/) for automatic IndexNow submissions. Your changes go live in minutes, not weeks. - -## [What You Just Learned](#what-you-just-learned) - -Traditional SEO is declining—GEO is replacing it. Here's what you now know: - -- AI assistants cite content, they don't rank it -- Bing's index powers ChatGPT, Copilot, and Perplexity -- IndexNow gets you indexed 100x faster than waiting for crawls -- Content structure matters more than keywords - -**Next steps**: - -- Test your current AI visibility with the prompt above -- Check your [configuration basics](/blog/guide/configuration-basics) to see how Claude Code can auto-generate GEO-optimized docs -- Automate your indexing with [ShowUpInAI](https://showupinai.com/) (3-day free trial) -- Learn advanced [automation patterns](/blog/guide/agents/agent-patterns) to scale GEO content creation - -The AI search revolution is already here. Get cited or get ignored. - -Last updated on - -[Previous - -Claude Code vs Cursor](/blog/tools/extensions/claude-code-vs-cursor) diff --git a/docs/site/src/content/blog/async-workflows.md b/docs/site/src/content/blog/async-workflows.md deleted file mode 100644 index ceea28e9..00000000 --- a/docs/site/src/content/blog/async-workflows.md +++ /dev/null @@ -1,140 +0,0 @@ ---- -slug: "async-workflows" -title: "Claude Code Async: Background Agents & Parallel Tasks" -description: "Run Claude Code sub-agents in the background while you keep working. True parallel AI development that eliminates blocking and boosts throughput." -date: "2025-12-11" -author: "Max Ritter" -tags: [Guide, Agents] -readingTime: 4 -keywords: "agents, async, background, claude, code, parallel, tasks, workflows" ---- - -Agents - -# Claude Code Async: Background Agents & Parallel Tasks - -Run Claude Code sub-agents in the background while you keep working. True parallel AI development that eliminates blocking and boosts throughput. - -**Problem**: When Claude Code spawns a sub-agent for research or complex analysis, your entire session blocks. You wait while the sub-agent works, unable to continue the conversation. - -**Quick Win**: When Claude spawns a sub-agent, press `Ctrl+B` to move it to the background: - -```p-4 -You: Research authentication best practices for our Next.js app -Claude: I'll spawn a sub-agent to research this... -[Sub-agent starts] -You: [Press Ctrl+B] -You: While that runs, let's work on the database schema... -``` - -Your session continues. The sub-agent works independently and surfaces results when done. - -## [Background Agents: True Parallel Execution](#background-agents-true-parallel-execution) - -Claude Code now supports asynchronous agent execution. When the main agent spawns sub-agents, you can background them and keep working with Claude on other tasks. - -**The workflow:** - -1. **Request**: Ask Claude to handle a task that benefits from a sub-agent -2. **Claude spawns**: The main agent creates a sub-agent for the work -3. **Background it**: Press `Ctrl+B` while the sub-agent runs -4. **Continue working**: Keep chatting with the main agent on other tasks -5. **Auto-resume**: When the sub-agent completes, it wakes up the main agent with results - -Check running agents anytime with `/tasks`: - -```p-4 -/tasks -``` - -You'll see each background agent's status, token usage, and progress. Click any agent to inspect details. - -## [When Background Agents Excel](#when-background-agents-excel) - -**Perfect for background execution:** - -- Research tasks requiring web searches -- Code analysis across large codebases -- Documentation generation -- Security audits and vulnerability scans -- Performance profiling reports - -**Keep in foreground:** - -- Tasks requiring your immediate input -- File modifications you need to review -- Anything with sequential dependencies on your current work - -## [Background Bash Commands](#background-bash-commands) - -The same pattern works for long-running shell commands. When Claude runs `npm install`, `docker build`, or `ffmpeg` and it takes a while, background it: - -```p-4 -Claude: Running npm install... -[Command starts] -You: [Press Ctrl+B] -You: While that installs, can you review the API routes? -``` - -Monitor with `/tasks`, same as agents. - -## [The `--agent` Flag: Debug Your Sub-Agents](#the---agent-flag-debug-your-sub-agents) - -New CLI flag lets you run Claude Code AS any sub-agent: - -```p-4 -claude --agent plan -``` - -This launches Claude Code with the planning agent's configuration. Ask it questions, test its behavior, verify it works as expected before deploying in workflows. - -**Use cases:** - -- Debug custom sub-agents before production use -- Test agent instructions and tool access -- Run specialized agents manually for one-off tasks -- Understand built-in agent capabilities - -Works with built-in agents (`plan`, `explore`, etc.) and your custom agents in `.claude/agents/`. - -## [Also in This Release](#also-in-this-release) - -Anthropic shipped several other features alongside background agents: - -**Instant compaction**: The `/compact` command now executes immediately. Claude maintains a continuous session memory, so compaction just loads the summary into a fresh context. Learn more in our [context management guide](/blog/guide/mechanics/context-management). - -**Session memory architecture**: Every session now maintains a structured summary including status, completed work, discussion points, and a work log. See [memory optimization](/blog/guide/mechanics/memory-optimization) for details. - -**Stats dashboard**: Run `/stats` to see your usage patterns, favorite models, token counts, and streaks. Press `Ctrl+S` to copy for sharing. - -**Session naming**: Use `/rename` to name sessions, then resume by name with `claude --resume session-name`. The `/resume` screen now groups forked sessions and adds keyboard shortcuts (`P` preview, `R` rename, `B` browse forks). - -**MCP quick toggle**: Enable or disable MCP servers without editing config files. See our [MCP basics guide](/blog/tools/mcp-extensions/mcp-basics) for the commands. - -**Slack integration**: Delegate tasks to Claude Code directly from Slack channels. Tag @Claude with bug reports or feature requests for team workflows. - -## [Common Issues](#common-issues) - -**Agent doesn't background**: Press `Ctrl+B` while the agent is actively running, not after it completes. - -**Lost track of agents**: Use `/tasks` to see all running background processes with their IDs. - -**Agent completed but no results**: The `AgentOutputTool` automatically surfaces results. If missed, check `/tasks` for the completed agent's output. - -## [Next Steps](#next-steps) - -- **Execution patterns**: Master [parallel, sequential, and background patterns](/blog/guide/agents/sub-agent-best-practices) to choose the right approach -- **Foundation**: Understand [agent fundamentals](/blog/guide/agents/agent-fundamentals) before building complex workflows -- **Design patterns**: Learn [sub-agent design](/blog/guide/agents/sub-agent-design) for effective task delegation -- **Distribution**: Master [task distribution](/blog/guide/agents/task-distribution) for multi-agent orchestration -- **Custom agents**: Build specialized agents with [custom agent patterns](/blog/guide/agents/custom-agents) - -Background agents transform Claude Code from a turn-based assistant into a parallel development environment. Launch research, continue building, get results when ready. - -Last updated on - -[Previous - -Agent Fundamentals](/blog/guide/agents/agent-fundamentals)[Next - -Sub-Agent Patterns](/blog/guide/agents/sub-agent-best-practices) diff --git a/docs/site/src/content/blog/auto-planning-strategies.md b/docs/site/src/content/blog/auto-planning-strategies.md deleted file mode 100644 index c33f678b..00000000 --- a/docs/site/src/content/blog/auto-planning-strategies.md +++ /dev/null @@ -1,130 +0,0 @@ ---- -slug: "auto-planning-strategies" -title: "Claude Code Auto Planning: Let AI Architect Your Solution" -description: "Enable Claude Code's auto-planning to automatically design optimal solutions. Learn configuration tips for better architectural decisions." -date: "2025-08-23" -author: "Max Ritter" -tags: [Guide, Workflow] -readingTime: 4 -keywords: "ai, architect, auto, claude, code, let, planning, solution, strategies" ---- - -Mechanics - -# Claude Code Auto Planning: Let AI Architect Your Solution - -Enable Claude Code's auto-planning to automatically design optimal solutions. Learn configuration tips for better architectural decisions. - -You asked for a "quick database optimization" and Claude rewrote your entire ORM layer. Auto Plan Mode prevents these surprises by forcing Claude to show you the plan before touching any files. - -**Quick Win**: Copy this command and run it right now: - -```p-4 -claude --append-system-prompt "$(cat <<'EOF' -MANDATORY PLANNING STEP: Before executing ANY tool, you MUST: -1. Use exit_plan_mode tool to present your plan -2. WAIT for explicit user approval -3. ONLY THEN execute the planned actions -ZERO EXCEPTIONS: Each new user message requires fresh planning approval. -EOF -)" -``` - -Claude now presents a plan before every file operation. You approve or reject before anything changes. - -## [How Auto Plan Mode Works](#how-auto-plan-mode-works) - -The `--append-system-prompt` flag (added in Claude Code v1.0.51) lets you inject instructions into Claude's system prompt. Auto Plan Mode uses this to trigger the hidden `exit_plan_mode` tool automatically. - -The workflow becomes: **Plan -> Your Approval -> Execute** - -This differs from manual [Plan Mode](/blog/guide/mechanics/planning-modes) (activated with `Shift+Tab` twice), which requires you to remember when to activate it. Auto Plan Mode removes that mental overhead entirely. - -## [The Trade-Off: Safety vs Speed](#the-trade-off-safety-vs-speed) - -More planning means more tokens and slower execution. Here's when each approach makes sense: - -**Use Auto Plan Mode when:** - -- Working in unfamiliar codebases -- Making changes you can't easily reverse -- Training yourself to think before executing -- Onboarding team members to Claude Code - -**Skip Auto Plan Mode when:** - -- Rapid prototyping where mistakes are cheap -- Simple, well-understood changes -- You need maximum execution speed - -## [Copy-Paste System Prompts](#copy-paste-system-prompts) - -### [Standard Protection (Recommended)](#standard-protection-recommended) - -Plans before any file modification: - -```p-4 -claude --append-system-prompt "Before executing Write, Edit, Bash, or MultiEdit tools, use exit_plan_mode to present your plan and wait for approval." -``` - -### [Maximum Protection](#maximum-protection) - -Plans before everything, including searches: - -```p-4 -claude --append-system-prompt "Before executing ANY tool (Read, Write, Edit, Bash, Grep, Glob, WebSearch), use exit_plan_mode to present your plan first." -``` - -### [Reusable Configuration](#reusable-configuration) - -Save to a file for consistent activation: - -```p-4 -# Save the prompt -echo "MANDATORY PLANNING STEP: Before executing ANY tool, use exit_plan_mode to present your plan and wait for approval." > ~/auto-plan.txt - -# Use it every time -claude --append-system-prompt "$(cat ~/auto-plan.txt)" -``` - -## [When Auto-Planning Saves You](#when-auto-planning-saves-you) - -**Scenario 1: The Overeager Refactor** - -You ask: "Fix the null check in user.js" - -Without auto-planning, Claude might "helpfully" refactor the entire user module. With auto-planning, you see the plan first and say "just fix line 47, nothing else." - -**Scenario 2: The Cascade Delete** - -You ask: "Clean up unused imports" - -Claude's plan reveals it wants to modify 23 files. You approve the 5 that actually need changes and reject the experimental ones. - -**Scenario 3: The Breaking Change** - -You ask: "Update the API response format" - -The plan shows Claude intends to modify both the API and every frontend component consuming it. You catch the breaking change before it happens. - -## [Combining with Manual Plan Mode](#combining-with-manual-plan-mode) - -Auto Plan Mode complements manual activation. Use `Shift+Tab` twice for pure research tasks where you want Claude to analyze without planning overhead. Auto-planning handles everything else. - -## [Troubleshooting](#troubleshooting) - -**Planning every small request?** Use the "Standard Protection" prompt that only triggers on Write, Edit, and Bash operations. - -**Not activating at all?** Verify you're on Claude Code v1.0.51 or later. Check the `exit_plan_mode` reference is spelled correctly. - -**Approval not sticking?** By design, each new user message requires fresh approval. Previous approvals don't carry over. - -**Next Steps**: Master manual [Planning Modes](/blog/guide/mechanics/planning-modes) for research-only sessions. Configure your [CLAUDE.md file](/blog/guide/mechanics/claude-md-mastery) for project-specific auto-planning rules. Understand [Context Management](/blog/guide/mechanics/context-management) to optimize token usage with auto-planning enabled. - -Last updated on - -[Previous - -Planning Modes](/blog/guide/mechanics/planning-modes)[Next - -Experimentation Mindset](/blog/guide/mechanics/experimentation-mindset) diff --git a/docs/site/src/content/blog/autonomous-agent-loops.md b/docs/site/src/content/blog/autonomous-agent-loops.md deleted file mode 100644 index ed0418fc..00000000 --- a/docs/site/src/content/blog/autonomous-agent-loops.md +++ /dev/null @@ -1,356 +0,0 @@ ---- -slug: "autonomous-agent-loops" -title: "Claude Code Autonomous Loops: Ship Features While You Sleep" -description: "Combine Ralph Wiggum loops with thread-based engineering for autonomous Claude Code development that ships production features while you sleep." -date: "2026-01-14" -author: "Max Ritter" -tags: [Guide, Workflow] -readingTime: 8 -keywords: "agent, autonomous, claude, code, features, loops, ship, sleep, while, you" ---- - -Mechanics - -# Claude Code Autonomous Loops: Ship Features While You Sleep - -Combine Ralph Wiggum loops with thread-based engineering for autonomous Claude Code development that ships production features while you sleep. - -Two frameworks are reshaping how engineers work with AI agents: [Ralph Wiggum loops](/blog/guide/mechanics/ralph-wiggum-technique) and [thread-based engineering](/blog/guide/mechanics/thread-based-engineering). - -Ralph tells you how to keep agents running autonomously. Threads tell you how to scale and measure that autonomy. Together, they form a complete system for autonomous software development. - -This post connects them. - -## [The Unified Model](#the-unified-model) - -Here's how everything fits together: - -**Thread-based engineering** provides the structure. You think in threads: base, parallel, chained, fusion, big, and long-duration. Each thread type serves a different purpose. - -**Ralph loops** power the L-threads. The stop hook pattern, completion promises, and verification-first development make long-duration autonomous work reliable. - -**Verification** is the foundation that makes both work. Without verification, threads end prematurely and loops spin forever. - -```p-4 -Thread Types × Verification → Reliable Autonomous Work - ↓ -Ralph Loops = Implementation of L-Threads - ↓ -Result: Features shipping while you sleep -``` - -## [The Verification Stack](#the-verification-stack) - -Boris Cherny's one rule: always give Claude a way to verify its work. - -This applies everywhere in the unified model: - -| Thread Type | Verification Method | -| --- | --- | -| Base | Manual review | -| P-Threads | Parallel reviews, consensus | -| C-Threads | Phase-by-phase validation | -| F-Threads | Compare multiple outputs | -| B-Threads | Sub-agent verification | -| L-Threads | Automated tests + stop hooks | - -The key insight: as threads get longer and more autonomous, verification must get more automated. You can't manually review a 26-hour L-thread. The system must verify itself. - -## [Building the Complete Stack](#building-the-complete-stack) - -Here's a practical setup that combines all the concepts: - -### [Layer 1: Specification (The Pin)](#layer-1-specification-the-pin) - -Every autonomous run starts with a specification. The spec is your "pin" that prevents invention. - -```p-4 -## Feature: User Dashboard - -### Scope - -- Display user metrics -- Show recent activity -- Add export functionality - -### Out of Scope - -- Real-time updates (Phase 2) -- Mobile responsiveness (Phase 2) - -### Acceptance Criteria - -- [ ] Metrics load in under 2 seconds -- [ ] Activity shows last 30 days -- [ ] Export generates valid CSV -``` - -The spec references existing code where possible. It tells the agent what NOT to do. It defines "done" objectively. - -### [Layer 2: Test-Driven Verification](#layer-2-test-driven-verification) - -Write tests before implementation. Tests become the verification layer that makes L-threads reliable. - -```p-4 -// For each acceptance criterion, create a test -tests/ - dashboard/ - metrics.test.ts # Verifies metrics load time - activity.test.ts # Verifies activity display - export.test.ts # Verifies CSV generation -``` - -When the agent runs, it executes tests continuously. The loop doesn't complete until tests pass. No ambiguity. No premature exits. - -### [Layer 3: The Stop Hook](#layer-3-the-stop-hook) - -Configure your stop hook to enforce verification: - -```p-4 -// stop-hook.js -module.exports = async function (context) { - // Run test suite - const testResult = await runTests(); - - if (testResult.failed > 0) { - return { - decision: "block", - reason: `${testResult.failed} tests failing. Continue work.`, - }; - } - - // Check for completion promise - if (!context.output.includes("complete")) { - return { - decision: "block", - reason: "Completion promise not found. Verify all work is done.", - }; - } - - return { decision: "allow" }; -}; -``` - -The stop hook is the enforcer. It doesn't care if Claude thinks it's done. It cares if the tests pass. - -### [Layer 4: Thread Selection](#layer-4-thread-selection) - -Now choose the right thread type for your workload: - -**Small feature, one file**: Base thread. Prompt, agent works, review. - -**Five independent features**: P-threads. Spin up five terminals, assign one feature each. - -**Database migration with three phases**: C-thread. Verify after each phase before continuing. - -**Critical architecture decision**: F-thread. Get three agents' opinions, compare results. - -**Overnight feature build**: L-thread with Ralph loop. Set it running before bed. - -**Multi-file refactor with sub-tasks**: B-thread. Orchestrator spawns workers for each file. - -### [Layer 5: Checkpoint State](#layer-5-checkpoint-state) - -For L-threads especially, maintain external state: - -```p-4 -## Progress: User Dashboard - -### Completed - -- [x] Set up test infrastructure -- [x] Implement metrics API endpoint -- [x] Create metrics display component - -### In Progress - -- [ ] Implement activity feed - -### Remaining - -- [ ] Add export functionality -- [ ] Performance optimization -``` - -The agent updates this file as it works. If context fills and the agent restarts, it reads the progress file and continues from where it left off. - -## [UI Verification: The Missing Piece](#ui-verification-the-missing-piece) - -Functional tests pass. But the UI might be broken. - -For any thread type that touches UI, add screenshot-based verification: - -```p-4 -Workflow extension for UI work: - -1. Complete implementation -2. Take screenshots of affected components -3. Review each screenshot for visual issues -4. Rename verified screenshots with "verified_" prefix -5. Do NOT output completion promise yet -6. Run one more loop to confirm all screenshots verified -7. Only then output "complete" -``` - -This forces visual verification. Claude can't skip the screenshot review and claim completion. - -## [Scaling with Loom](#scaling-with-loom) - -The next evolution: Loom-style orchestration. - -Loom is an environment designed for agents, not humans. It chains Ralph loops together into reactive systems. - -**Level 1**: Single Ralph loop (L-thread) -**Level 2**: Multiple parallel Ralph loops (P-threads of L-threads) -**Level 3**: Orchestrated chains of loops (B-threads containing L-threads) -**Level 4**: Autonomous product systems (agents that ship, observe, and iterate) - -At Level 4, agents: - -- Ship behind feature flags -- Deploy without code review -- Observe analytics -- Decide if changes worked -- Iterate automatically - -This is the Z-thread destination. Zero human touch. Full autonomy. - -## [Economics of Autonomous Loops](#economics-of-autonomous-loops) - -Running agents continuously costs approximately **$10.42 USD per hour** with Sonnet. - -That changes the calculation entirely. - -| Approach | Cost | Output | -| --- | --- | --- | -| Human developer | ~$100/hour | 8 hours/day | -| Single agent | ~$10/hour | 24 hours/day | -| 5 parallel agents | ~$50/hour | 120 agent-hours/day | - -The constraint isn't cost. It's **how much reliable work can you define**. - -Teams that master verification-first autonomous loops will ship at a fundamentally different rate than teams that don't. - -## [Common Integration Patterns](#common-integration-patterns) - -### [Pattern 1: Planning + L-Thread](#pattern-1-planning--l-thread) - -1. C-thread for planning (you verify the plan) -2. Fresh context -3. L-thread for implementation (Ralph loop) -4. Final review - -**Why it works**: Planning and implementation in separate contexts. Planning gets your attention. Implementation runs autonomously. - -### [Pattern 2: P-Thread Feature Sprint](#pattern-2-p-thread-feature-sprint) - -1. Write specs for multiple features -2. Spin up P-threads (one per feature) -3. Each P-thread runs as an L-thread internally -4. Review completed features as they finish - -**Why it works**: Parallelism at the feature level. Autonomy at the implementation level. - -### [Pattern 3: F-Thread Architecture](#pattern-3-f-thread-architecture) - -1. Define architectural question -2. Spin up F-thread (3-4 agents) -3. Each agent proposes a solution -4. Compare results, pick the best -5. Implement chosen solution with L-thread - -**Why it works**: Multiple perspectives for important decisions. Autonomous implementation once decided. - -### [Pattern 4: B-Thread Orchestration](#pattern-4-b-thread-orchestration) - -1. Main agent receives large task -2. Decomposes into sub-tasks -3. Spawns worker agents (each runs mini L-thread) -4. Aggregates results -5. Main agent verifies and commits - -**Why it works**: Division of labor. Each worker is focused. Main agent coordinates. - -## [Failure Modes and Fixes](#failure-modes-and-fixes) - -### [Threads End Too Early](#threads-end-too-early) - -**Cause**: Weak verification -**Fix**: Add more tests. Make completion criteria objective. Use screenshot verification for UI. - -### [L-Threads Spin Forever](#l-threads-spin-forever) - -**Cause**: Impossible task or missing completion promise -**Fix**: Set max iterations. Add explicit completion criteria. Ensure the agent knows when to output the promise. - -### [P-Threads Create Conflicts](#p-threads-create-conflicts) - -**Cause**: Agents modifying same files -**Fix**: Isolate by feature/file. Use git worktrees. Clear boundaries between parallel work. - -### [B-Threads Lose Coherence](#b-threads-lose-coherence) - -**Cause**: Sub-agents drift from main goal -**Fix**: Better specs. More frequent checkpoints. Orchestrator verification of sub-agent work. - -### [Verification Passes But Work Is Wrong](#verification-passes-but-work-is-wrong) - -**Cause**: Tests don't cover actual requirements -**Fix**: Better acceptance criteria. Screenshot verification for UI. Manual review of first few runs. - -## [The Implementation Path](#the-implementation-path) - -Start where you are. Build toward full autonomy. - -**Week 1**: Run reliable base threads. Verify every result manually. - -**Week 2**: Add P-threads. Run two agents in parallel. Handle the context switching. - -**Week 3**: Implement test-driven verification. Write tests before implementation. - -**Week 4**: Try your first L-thread. Use the stop hook. Set a max iteration count. Watch it run. - -**Week 5**: Scale L-threads. Run them overnight. Trust the verification. - -**Week 6**: Add B-threads. Let your agent spawn sub-agents. Orchestrate multi-file changes. - -**Week 7**: Try F-threads. Get multiple opinions on architecture decisions. - -**Week 8**: Combine patterns. P-threads of L-threads. B-threads containing F-threads. - -Each week, measure: How many threads? How long do they run? How many checkpoints needed? - -## [The Destination](#the-destination) - -The future of software engineering is autonomous agent loops scaled through thread-based thinking. - -- **More threads**: Parallelism at every level -- **Longer threads**: Hours and days, not minutes -- **Thicker threads**: Agents spawning agents spawning agents -- **Fewer checkpoints**: Verification replaces review - -The developers who master this aren't just "using AI." They're operating autonomous software factories. - -Ralph provides the loop mechanism. Threads provide the scaling framework. Verification provides the reliability. - -Put them together, and you get systems that ship while you sleep. - -## [Next Steps](#next-steps) - -- Start with [Ralph Wiggum loops](/blog/guide/mechanics/ralph-wiggum-technique) for L-thread foundations -- Learn [thread-based engineering](/blog/guide/mechanics/thread-based-engineering) for the mental model -- Master [feedback loops](/blog/guide/development/feedback-loops) for verification patterns -- Explore [async workflows](/blog/guide/agents/async-workflows) for P-thread management -- Build [custom agents](/blog/guide/agents/custom-agents) for B-thread orchestration - -The loop is simple. The verification is critical. The threads are the multiplier. - -Now start building. - -Last updated on - -[Previous - -Thread-Based Engineering](/blog/guide/mechanics/thread-based-engineering)[Next - -Robots-First Engineering](/blog/guide/mechanics/robots-first-engineering) diff --git a/docs/site/src/content/blog/backlink-strategy-guide.md b/docs/site/src/content/blog/backlink-strategy-guide.md deleted file mode 100644 index 2a2cbfd2..00000000 --- a/docs/site/src/content/blog/backlink-strategy-guide.md +++ /dev/null @@ -1,121 +0,0 @@ ---- -slug: "backlink-strategy-guide" -title: "The 3-Category Backlink Strategy for SaaS Founders" -description: "Categorize backlinks by purpose: traffic-driving, SEO authority, and no-follow. Plus submission strategies and link exchange tactics." -date: "2025-09-08" -author: "Max Ritter" -tags: [Guide] -readingTime: 3 -keywords: "3category, backlink, founders, guide, saas, strategy" ---- - -SaaS & Startups - -# The 3-Category Backlink Strategy for SaaS Founders - -Categorize backlinks by purpose: traffic-driving, SEO authority, and no-follow. Plus submission strategies and link exchange tactics. - -Not all backlinks serve the same purpose. The difference between wasting months on low-value submissions and building real domain authority comes down to categorizing links correctly and prioritizing accordingly. - -This framework breaks backlinks into three categories based on their actual function, then covers the three pricing models for directory submissions—including a live backlink exchange section at the end. - -## [The Three Categories of Backlinks](#the-three-categories-of-backlinks) - -### [1. Traffic-Driving Submissions](#1-traffic-driving-submissions) - -Backlinks from platforms where users actively discover products. The SEO benefit exists but is secondary—these drive actual visitors. - -**Examples:** - -- Product Hunt, BetaList launches -- SaaS directories: Capterra, G2, GetApp -- AI directories: There's An AI For That, Futurepedia -- Niche-specific directories in your vertical - -**Identification:** Real search functionality, active user bases, category browsing. If people use the site to find tools, it's traffic-driving. - -### [2. SEO Authority Backlinks (Dofollow)](#2-seo-authority-backlinks-dofollow) - -Foundational links that boost domain authority without sending meaningful traffic. These signal legitimacy to Google. - -**Examples:** - -- Startup listings: Crunchbase, AngelList, F6S -- Business directories (industry-specific) -- Profile backlinks: GitHub, Dribbble, LinkedIn company pages -- Curated resource pages and "best tools" lists - -**Identification:** Check for `rel="nofollow"` in the HTML. No attribute = dofollow by default. MozBar or similar extensions speed this up. - -### [3. No-Follow Backlinks](#3-no-follow-backlinks) - -Links with `rel="nofollow"` that don't pass direct authority. Often dismissed, but that's shortsighted. - -**Examples:** - -- Social profiles (Twitter/X, Facebook, Instagram bios) -- Forum engagement (Reddit, Indie Hackers, Hacker News) -- Blog comments on relevant articles - -**Why they matter:** Google's 2019 update treats nofollow as a "hint" rather than directive—they may still influence rankings. More importantly, a profile with 100% dofollow links looks manipulated. Natural link profiles include nofollow. - -## [The Three Submission Pricing Models](#the-three-submission-pricing-models) - -### [Completely Free](#completely-free) - -Most directories accept free submissions. Trade-off: slower approval, less visibility, often lower DR. - -**Approach:** Batch submit to 20-30 free directories using curated lists like the [Awesome SEO Backlinks repo](https://github.com/indie-hacking/Awesome-SEO-Backlinks). Complete profiles fully—logos, descriptions, screenshots accelerate approval. - -### [Paid Submissions ($9-$49)](#paid-submissions-9-49) - -Premium placement, faster approval, higher-authority sites. - -**Worth it for:** - -- Launch platforms with real audiences (Product Hunt Ship, BetaList featured spots) -- High-DR directories (50+) where organic placement takes months -- Time-sensitive launches - -**Skip:** Directories under DR 30 or those accepting everyone. You're paying for exclusivity—if it doesn't exist, neither does the value. - -### [Free with Badge/Link Exchange](#free-with-badgelink-exchange) - -Directories offering free listings in exchange for displaying their badge or adding a reciprocal link on your site. - -**Evaluation criteria:** - -- Their DR should significantly exceed yours for the exchange to be worthwhile -- Badge placement should fit naturally (Partners page, Featured On section) -- Avoid homepage clutter—dedicated pages work better - -This is also how direct backlink exchanges work between SaaS founders. You link to them, they link to you. The section below facilitates exactly that. - -*Here are a few websites and directories that implement submissions with link/badge verfication.* - -- [TurboZero](https://turbo0.com/item/claude-fast) -- [Wired Business](https://wired.business) -- [Findly](https://findly.tools/claude-fast?utm_source=claude-fast) -- [Fazier](https://fazier.com) -- [Foundrlist](https://foundrlist.com/) - -## [Execution Framework](#execution-framework) - -**Phase 1: Foundation:** -Submit to 20-30 free directories across all three categories. Prioritize traffic-driving submissions first—they compound both SEO and user acquisition. - -**Phase 2: Strategic Investment:** -Identify 5-10 paid directories worth the spend. Layer in forum engagement for nofollow diversity. - -**Phase 3: Ongoing:** -Maintain 2-4 quality backlinks monthly. Shift toward guest posts and editorial links as DR increases past 20-30. - ---- - -Last updated on - -[Previous - -Human-like Agents](/blog/guide/agents/human-like-agents)[Next - -Examples & Templates](/blog/guide/examples-templates) diff --git a/docs/site/src/content/blog/best-addons.md b/docs/site/src/content/blog/best-addons.md deleted file mode 100644 index 077dcf74..00000000 --- a/docs/site/src/content/blog/best-addons.md +++ /dev/null @@ -1,134 +0,0 @@ ---- -slug: "best-addons" -title: "50+ Best MCP Servers for Claude Code in 2026" -description: "50+ curated MCP servers for Claude Code in 2026. The definitive list of best extensions and addons with direct links and install commands." -date: "2025-08-23" -author: "Max Ritter" -tags: [Guide, MCP] -readingTime: 5 -keywords: "2026, 50, addons, best, claude, code, mcp, servers" ---- - -MCP & Extensions - -# Best MCP Servers for Claude Code 2026: 50+ Tools & Extensions - -50+ curated MCP servers for Claude Code in 2026. The definitive list of best extensions and addons with direct links and install commands. - -Looking for the **best MCP for Claude Code**? This is the definitive collection of the best MCP servers, Claude Code extensions, and addons for 2026. Whether you need the best MCPs for Claude Code development, browser automation, or database access, this curated list has you covered. - -> **New: MCP Tool Search Now Available** - Claude Code's [MCP Tool Search feature](/blog/tools/mcp-extensions/mcp-tool-search) enables lazy loading for MCP servers, reducing context usage by up to 95%. You can now run all these MCP servers without worrying about context limits. - -## [📚 Awesome MCP Servers & Collections](#-awesome-mcp-servers--collections) - -These awesome MCP servers lists are essential resources for finding the best Claude Code MCP integrations: - -- [awesome-claude-code](https://github.com/hesreallyhim/awesome-claude-code) - The main curated list of Claude Code commands, files, and workflows -- [awesome-mcp-servers](https://github.com/punkpeye/awesome-mcp-servers) - Comprehensive collection of Model Context Protocol servers -- [awesome-mcp-servers (wong2)](https://github.com/wong2/awesome-mcp-servers) - Another excellent MCP server collection -- [awesome-dxt-mcp](https://github.com/MCPStar/awesome-dxt-mcp) - Desktop Extensions (DXT) and MCP servers for Claude Desktop -- [awesome-claude-code-agents](https://github.com/hesreallyhim/a-list-of-claude-code-agents) - Specialized Claude Code sub-agents -- [awesome-mcp-clients](https://github.com/punkpeye/awesome-mcp-clients) - Collection of MCP client implementations -- [awesome-claude-dxt](https://github.com/milisp/awesome-claude-dxt) - Claude Desktop Extensions collection - -## [🧰 IDE Integrations & Editors](#-ide-integrations--editors) - -- [Claude Code Chat (VS Code)](https://marketplace.visualstudio.com/items?itemName=AndrePimenta.claude-code-chat) - Elegant Claude Code chat interface for VS Code with inline suggestions -- [claude-code-ide.el](https://github.com/manzaltu/claude-code-ide.el) - Emacs integration showing ediff-based code suggestions and buffer context tracking -- [claude-code.el](https://github.com/stevemolitor/claude-code.el) - Emacs interface for Claude Code CLI with full feature support -- [claude-code.nvim](https://github.com/greggh/claude-code.nvim) - Seamless Neovim integration for Claude Code AI assistant -- [Cursor](https://cursor.com) - AI-first VS Code fork with native MCP support for enhanced AI capabilities -- [Cline](https://github.com/cline/cline) - Uses MCP to create tools and extend AI coding capabilities - -## [📊 Usage Monitors & Dashboards](#-usage-monitors--dashboards) - -- [CC Usage](https://github.com/ryoppippi/ccusage) - CLI tool for analyzing Claude Code logs with cost and token consumption dashboard -- [ccflare](https://github.com/snipeship/ccflare) - Comprehensive Claude Code usage dashboard with beautiful web UI -- [Claude Code Usage Monitor](https://github.com/Maciek-roboblog/Claude-Code-Usage-Monitor) - Real-time terminal-based monitoring for token usage - -## [🤖 Orchestrators & Multi-Agent Systems](#-orchestrators--multi-agent-systems) - -- [Claude Flow](https://github.com/ruvnet/claude-flow) - Autonomous code writing, editing, testing, and optimization orchestration layer -- [Claude Squad](https://github.com/smtg-ai/claude-squad) - Terminal app managing multiple Claude Code agents in separate workspaces -- [Swarm SDK](https://github.com/parruda/swarm) - Launch Claude Code sessions connected to swarms of specialized agents - -## [🚀 MCP Servers - Core Development](#-mcp-servers---core-development) - -- [GitHub MCP Server](https://github.com/modelcontextprotocol/servers/tree/main/src/github) - Official GitHub integration for repos, PRs, issues, and CI/CD workflows -- [PostgreSQL MCP](https://github.com/modelcontextprotocol/servers/tree/main/src/postgres) - Natural language database queries and operations -- [File System MCP](https://github.com/modelcontextprotocol/servers/tree/main/src/filesystem) - Advanced file operations for local development -- [SQLite MCP](https://github.com/modelcontextprotocol/servers/tree/main/src/sqlite) - SQLite database management and queries -- [Git MCP](https://github.com/modelcontextprotocol/servers/tree/main/src/git) - Git operations beyond basic commands -- [Fetch MCP](https://github.com/modelcontextprotocol/servers/tree/main/src/fetch) - Web content fetching and conversion for LLM usage - -## [🔗 MCP Servers - Integrations](#-mcp-servers---integrations) - -- [Slack MCP](https://github.com/modelcontextprotocol/servers/tree/main/src/slack) - Team communication, channel management, and messaging -- [Sentry MCP](https://github.com/modelcontextprotocol/servers/tree/main/src/sentry) - Error tracking and issue analysis from Sentry.io -- [Google Drive MCP](https://github.com/modelcontextprotocol/servers/tree/main/src/gdrive) - File access and search for Google Drive -- [Google Maps MCP](https://github.com/modelcontextprotocol/servers/tree/main/src/google-maps) - Location services, directions, and place details -- [Brave Search MCP](https://github.com/modelcontextprotocol/servers/tree/main/src/brave-search) - Web and local search using Brave's Search API -- [GitLab MCP](https://github.com/modelcontextprotocol/servers/tree/main/src/gitlab) - GitLab API for project management - -## [🌐 MCP Servers - Web & Automation](#-mcp-servers---web--automation) - -- [Puppeteer MCP](https://github.com/modelcontextprotocol/servers/tree/main/src/puppeteer) - Browser automation and web scraping with Puppeteer -- [Browserbase MCP](https://github.com/browserbase/mcp-server-browserbase) - Cloud browser automation (community) - -## [📝 Slash Command Collections](#-slash-command-collections) - -- [Claude Command Suite](https://github.com/qdhenry/Claude-Command-Suite) - 119+ professional slash commands for code review, features, security, and architecture -- [Claude Sessions](https://github.com/iannuttall/claude-sessions) - Session tracking and documentation commands - -## [🔨 Special Purpose MCP Servers](#-special-purpose-mcp-servers) - -- [Claude Context MCP](https://github.com/zilliztech/claude-context) - Semantic code search across millions of lines -- [Claude Code MCP](https://github.com/steipete/claude-code-mcp) - Claude Code as one-shot MCP server for nested agents -- [Memory MCP](https://github.com/modelcontextprotocol/servers/tree/main/src/memory) - Knowledge graph-based persistent memory -- [Everything MCP](https://github.com/modelcontextprotocol/servers/tree/main/src/everything) - Reference server with prompts, resources, and tools - -## [🎯 Browser Extensions](#-browser-extensions) - -- [Claude MCP Browser Extension](https://github.com/dnakov/claude-mcp) - Enable MCP in claude.ai web interface - -## [🚀 Starter Kits & Project Foundations](#-starter-kits--project-foundations) - -Claude Code works best when you give it a strong foundation to build upon rather than starting from scratch. Using a professional starter kit accelerates development significantly. - -- [TurboStarter](https://www.turbostarter.dev?aff=5OA7J) - **Recommended**: Professional Next.js starter kit with authentication, payments, and AI integrations built-in. Perfect foundation for Claude Code projects - -## [🛠️ Development Tools & Utilities](#️-development-tools--utilities) - -- [Claude Code Cookbook](https://github.com/wasabeef/claude-code-cookbook) - Collection of settings and configurations to make Claude Code more useful -- [Claude Code Cookbook (Chinese)](https://github.com/foreveryh/claude-code-cookbook) - Chinese language version with similar functionality - -## [🎓 Learning Resources & Documentation](#-learning-resources--documentation) - -- [Official Claude Code Docs](https://code.claude.com/docs/en/overview) - Anthropic's official documentation -- [MCP Protocol Specification](https://modelcontextprotocol.io/docs/getting-started/intro) - Model Context Protocol documentation -- [MCP Servers Repository](https://github.com/modelcontextprotocol/servers) - Official MCP server implementations -- [Builder.io Claude Code Guide](https://www.builder.io/blog/claude-code) - How to use Claude Code effectively - ---- - -## [📖 More Resources](#-more-resources) - -For additional Claude Code content: - -- [MCP Tool Search - MCP lazy loading](/blog/tools/mcp-extensions/mcp-tool-search) -- [MCP server basics](/blog/tools/mcp-extensions/mcp-basics) -- [Custom integrations guide](/blog/tools/mcp-extensions/custom-integrations) -- [Browser automation](/blog/tools/mcp-extensions/browser-automation) -- [Configuration guide](/blog/guide/configuration-basics) -- [Agent fundamentals](/blog/guide/agents/agent-fundamentals) - -**Based on**: [awesome-claude-code](https://github.com/hesreallyhim/awesome-claude-code) community collection -**Last Updated**: January 2026 - -Last updated on - -[Previous - -Context7 MCP](/blog/tools/mcp-extensions/context7-mcp)[Next - -Cursor MCP](/blog/tools/mcp-extensions/cursor-mcp-setup) diff --git a/docs/site/src/content/blog/browser-automation.md b/docs/site/src/content/blog/browser-automation.md deleted file mode 100644 index 0946dae1..00000000 --- a/docs/site/src/content/blog/browser-automation.md +++ /dev/null @@ -1,174 +0,0 @@ ---- -slug: "browser-automation" -title: "Claude Code Playwright MCP: Browser Automation" -description: "Set up Playwright MCP for Claude Code browser automation. Scrape data and test web apps with Playwright and Puppeteer MCP server configs." -date: "2025-08-23" -author: "Max Ritter" -tags: [Guide, MCP] -readingTime: 4 -keywords: "automation, browser, claude, code, mcp, playwright" ---- - -MCP & Extensions - -# Playwright MCP for Claude Code: AI-Powered Browser Automation - -Set up Playwright MCP for Claude Code browser automation. Scrape data and test web apps with Playwright and Puppeteer MCP server configs. - -**Problem**: Manually testing web applications, scraping data, and automating repetitive browser tasks wastes hours of development time. Browser automation through [MCP servers](/blog/tools/mcp-extensions/mcp-basics) solves this. - -**Quick Win**: Configure the Puppeteer MCP server and automate your first browser task in minutes. Add this to your Claude Code settings file: - -```p-4 -{ - "mcpServers": { - "puppeteer": { - "command": "npx", - "args": ["-y", "@modelcontextprotocol/server-puppeteer"] - } - } -} -``` - -Now tell Claude: "Open a browser, navigate to example.com, and take a screenshot" - it handles the rest automatically. - -## [Why Browser Automation with Claude Code?](#why-browser-automation-with-claude-code) - -Traditional browser automation requires writing complex scripts, handling selectors, and managing browser states. Claude Code with browser MCP servers turns natural language into browser actions. - -Instead of writing 50 lines of Puppeteer code, you simply describe what you want: "Fill out this contact form with test data and submit it." - -## [Setting Up Browser Automation](#setting-up-browser-automation) - -### [Puppeteer MCP Server Configuration](#puppeteer-mcp-server-configuration) - -Add the Puppeteer MCP server to your MCP configuration file (`~/.claude.json` for CLI or `claude_desktop_config.json` for Desktop): - -```p-4 -{ - "mcpServers": { - "puppeteer": { - "command": "npx", - "args": ["-y", "@modelcontextprotocol/server-puppeteer"] - } - } -} -``` - -After saving, restart Claude Code to load the new MCP server. Test by asking Claude to launch a browser and navigate to any website. - -### [Playwright MCP Server Setup](#playwright-mcp-server-setup) - -For advanced browser testing with multi-browser support, use the Playwright MCP server. Install and configure `@modelcontextprotocol/server-playwright`: - -```p-4 -npm install -g @modelcontextprotocol/server-playwright -``` - -Then add to your MCP configuration: - -```p-4 -{ - "mcpServers": { - "playwright": { - "command": "npx", - "args": ["-y", "@modelcontextprotocol/server-playwright"] - } - } -} -``` - -**Alternative Playwright MCP**: The community `@executeautomation/playwright-mcp-server` package offers similar functionality: - -```p-4 -{ - "mcpServers": { - "playwright": { - "command": "npx", - "args": ["-y", "@executeautomation/playwright-mcp-server"] - } - } -} -``` - -Playwright MCP provides cross-browser testing capabilities (Chrome, Firefox, Safari) and is preferred for comprehensive test automation with Claude Code. - -## [Common Browser Automation Tasks](#common-browser-automation-tasks) - -### [Web Scraping Made Simple](#web-scraping-made-simple) - -Ask Claude to scrape data with natural language: - -> "Open example.com, find all product listings, and extract the titles and prices into a CSV file" - -Claude Code handles opening the browser, finding elements, extracting structured data, and formatting the output. - -### [Form Testing Automation](#form-testing-automation) - -> "Open my local development site at localhost:3000, fill out the signup form with test data, submit it, and verify the success message appears" - -This replaces manual testing with a single request that navigates to your site, generates realistic test data, fills all form fields, and validates success states. - -### [Visual Regression Testing](#visual-regression-testing) - -> "Take screenshots of my homepage at different screen sizes (mobile, tablet, desktop) and save them to ./screenshots/" - -## [Advanced Browser Automation Patterns](#advanced-browser-automation-patterns) - -### [Multi-Step User Journeys](#multi-step-user-journeys) - -Claude Code excels at complex workflows: - -> "Simulate a complete e-commerce purchase flow: browse products, add to cart, go through checkout with test details, and verify the order confirmation page" - -### [Authentication Flows](#authentication-flows) - -> "Log into my staging environment, navigate to the admin dashboard, and verify all navigation links work correctly" - -### [Performance Monitoring](#performance-monitoring) - -> "Open my app, measure page load times for the dashboard, and report any pages that take longer than 3 seconds to load" - -## [Troubleshooting Browser Automation](#troubleshooting-browser-automation) - -**Browser launch fails**: Ensure Chrome or Chromium is installed on your system. On Linux: - -```p-4 -sudo apt-get install -y chromium-browser -``` - -**Elements not found**: Ask Claude to wait for dynamic content: "Wait for the login button to be visible before clicking it." - -**Timeouts**: For slow-loading pages, specify longer waits: "Navigate to the page and wait up to 30 seconds for it to fully load." - -## [Integration with Development Workflow](#integration-with-development-workflow) - -Browser automation integrates naturally with your development process: - -- **Testing**: Automate regression tests during builds -- **Debugging**: Capture visual proof of bugs -- **Monitoring**: Check production sites continuously -- **Development**: Test features across browsers instantly - -## [Context Optimization with MCP Tool Search](#context-optimization-with-mcp-tool-search) - -Browser automation MCP servers work seamlessly with Claude Code's [MCP Tool Search feature](/blog/tools/mcp-extensions/mcp-tool-search). MCP Tool Search ensures Playwright and Puppeteer tools only load when you actually need browser automation, keeping your context free for other tasks. - -## [Next Steps](#next-steps) - -Master browser automation by exploring these areas: - -- Learn about [MCP server configuration](/blog/tools/mcp-extensions/mcp-basics) for customizing browser settings -- Set up [custom integration patterns](/blog/tools/mcp-extensions/custom-integrations) for your specific testing needs -- Explore [popular MCP servers](/blog/tools/mcp-extensions/best-addons) for additional automation capabilities -- Check out [MCP Tool Search](/blog/tools/mcp-extensions/mcp-tool-search) to optimize context usage with multiple MCP servers - -Start with simple tasks like taking screenshots, then progress to complex user journey testing as you get comfortable with natural language browser control. - -Last updated on - -[Previous - -Search Tools](/blog/tools/mcp-extensions/search-tools)[Next - -Social Media MCPs](/blog/tools/mcp-extensions/social-media-mcps) diff --git a/docs/site/src/content/blog/choosing-the-right-claude-model.md b/docs/site/src/content/blog/choosing-the-right-claude-model.md deleted file mode 100644 index 6ad5ae52..00000000 --- a/docs/site/src/content/blog/choosing-the-right-claude-model.md +++ /dev/null @@ -1,94 +0,0 @@ ---- -slug: "choosing-the-right-claude-model" -title: "Choosing the Right Claude Model for Your Task" -description: "Compare Opus, Sonnet, and Haiku for coding tasks. Match the model to the complexity and save money without sacrificing quality." -date: "2026-01-17" -author: "Max Ritter" -tags: [Guide, Models] -readingTime: 4 -keywords: "Claude models comparison, Claude Opus, Claude Sonnet, Claude Haiku, Claude Code model selection, AI model pricing" ---- - -# Choosing the Right Claude Model for Your Task - -Claude Code supports multiple models with different strengths. Picking the right one for each task saves money and gets better results. - -## Available Models - -| Model | Best For | Speed | Cost | -|-------|---------|-------|------| -| **Opus 4.6** | Complex architecture, multi-file refactors, debugging | Slower | Higher | -| **Sonnet 4.5** | General development, most coding tasks | Fast | Medium | -| **Haiku 4.5** | Quick lookups, simple edits, formatting | Fastest | Lowest | - -## When to Use Each - -### Opus 4.6 - -Use for tasks that require deep reasoning: - -- Designing system architecture from scratch -- Debugging complex race conditions or state management issues -- Multi-file refactors that need to maintain consistency -- Understanding and modifying unfamiliar codebases -- Writing complex algorithms - -Opus thinks more carefully and catches subtle issues that faster models miss. - -### Sonnet 4.5 - -The default for most work: - -- Implementing features from clear specifications -- Writing tests -- Code reviews -- Documentation -- Standard bug fixes -- API endpoint implementation - -Sonnet 4.5 handles 90% of coding tasks well. Start here unless you have a reason to upgrade. - -### Haiku 4.5 - -Use for high-volume, low-complexity tasks: - -- Formatting and style fixes -- Simple variable renames -- Generating boilerplate -- Quick file lookups -- Answering factual questions about the codebase - -Haiku is 10x cheaper than Opus. For simple tasks, it's equally accurate and much faster. - -## Switching Models - -Change models mid-session with `/model`: - -``` -/model opus # Switch to Opus for complex work -/model sonnet # Back to Sonnet for implementation -/model haiku # Haiku for quick tasks -``` - -Or set a default in settings: - -```json -{ - "model": "claude-sonnet-4-5-20241219" -} -``` - -## Cost Optimization Strategy - -1. **Start with Sonnet** — It handles most tasks -2. **Escalate to Opus** — When you hit complexity (deep bugs, architecture) -3. **Drop to Haiku** — For bulk simple operations -4. **Use sub-agents wisely** — Pilot uses Haiku for review sub-agents where appropriate - -## Context Window - -All current Claude models support 200K token context windows. Opus 4.6 also has a 1M token context beta for extremely large codebases. For most projects, 200K is sufficient — Pilot's auto-compaction and persistent memory handle the rest. - -## Key Insight - -The best model isn't always the most expensive one. Match the model to the task complexity and you'll get faster results at lower cost. diff --git a/docs/site/src/content/blog/claude-3-5-sonnet-v2.md b/docs/site/src/content/blog/claude-3-5-sonnet-v2.md deleted file mode 100644 index cbe01eca..00000000 --- a/docs/site/src/content/blog/claude-3-5-sonnet-v2.md +++ /dev/null @@ -1,76 +0,0 @@ ---- -slug: "claude-3-5-sonnet-v2" -title: "Claude 3.5 Sonnet v2 and Haiku: Computer Use Arrives" -description: "October 2024 brought an upgraded Claude 3.5 Sonnet, Claude 3.5 Haiku, and the groundbreaking Computer Use feature in public beta." -date: "2024-10-22" -author: "Max Ritter" -tags: [Reference, Models] -readingTime: 4 -keywords: "3, 35, 5, arrives, claude, computer, haiku, sonnet, use, v2" ---- - -# Claude 3.5 Sonnet v2 and Haiku: Computer Use Arrives - -October 2024 brought an upgraded Claude 3.5 Sonnet, Claude 3.5 Haiku, and the groundbreaking Computer Use feature in public beta. - -The October 22, 2024 release was a double launch: an upgraded Claude 3.5 Sonnet with meaningful performance gains, a new Claude 3.5 Haiku for fast and cheap workloads, and a feature that no one saw coming. Computer Use put Claude in control of a desktop, complete with cursor movement, clicking, and typing. AI models could now interact with software the same way humans do. - -## [Key Specs](#key-specs) - -| Spec | Claude 3.5 Sonnet v2 | Claude 3.5 Haiku | -| --- | --- | --- | -| **API ID** | `claude-3-5-sonnet-20241022` | `claude-3-5-haiku-20241022` | -| **Context window** | 200K tokens | 200K tokens | -| **Input pricing** | $3 / 1M tokens | $0.80 / 1M tokens | -| **Output pricing** | $15 / 1M tokens | $4 / 1M tokens | -| **Max output tokens** | 8,192 | 8,192 | -| **Release date** | October 22, 2024 | October 22, 2024 | - -## [What This Release Brought to the Table](#what-this-release-brought-to-the-table) - -**Computer Use (public beta).** The headline feature. Claude could now look at a screen, move the mouse, click buttons, and type text. This was not a browser automation tool or a scripted macro. The model received screenshots, interpreted what was on screen, and decided where to click and what to type. It could fill out forms, navigate between applications, search the web, and operate any software with a GUI. - -No major AI model had shipped anything like this before. Computer Use opened a new category of agentic capabilities: instead of building custom API integrations for every tool, you could point Claude at the interface and let it work. - -**Upgraded Sonnet.** The v2 Sonnet was not a minor patch. It delivered significant improvements in coding, tool use, and instruction-following over the [original 3.5 Sonnet](/blog/models/claude-3-5-sonnet). Agentic coding tasks, multi-step tool use, and following complex instructions all improved. For developers using Claude as a coding assistant, the upgrade was immediately noticeable. - -**Claude 3.5 Haiku.** The new Haiku brought 3.5-generation intelligence to the budget tier. At $0.80/$4 per million tokens, it offered strong performance for classification, content moderation, chat applications, and any high-volume workload where cost matters more than peak capability. - -## [Computer Use in Practice](#computer-use-in-practice) - -Computer Use launched in public beta through the API. Developers could build agents that: - -- Navigate web applications and fill out forms -- Move between desktop applications -- Extract information from visual interfaces -- Perform repetitive GUI-based tasks -- Test software by interacting with the actual UI - -The feature required sending screenshots to the model and receiving coordinates for mouse actions. Anthropic built it with safety constraints: the model could not perform irreversible actions without confirmation, and rate limits were applied to prevent abuse. - -## [How It Compared to the Original 3.5 Sonnet](#how-it-compared-to-the-original-35-sonnet) - -The v2 release kept the same pricing ($3/$15) while improving output quality. The gains were most visible in agentic workflows where Claude needed to chain multiple tool calls, interpret results, and adjust its approach. Instruction-following accuracy also improved, reducing the "close but not quite" moments that frustrated developers using the original version. - -## [Current Status](#current-status) - -| Model | Status | -| --- | --- | -| Claude 3.5 Sonnet v2 | Superseded by Claude 3.7 Sonnet (February 2025) | -| Claude 3.5 Haiku | Still referenced in some deployments | - -Both models have been superseded by newer generations, but they marked the moment Claude became more than a text generator. Computer Use was the proof of concept that led to increasingly sophisticated agentic capabilities in the [Claude 3.7 Sonnet](/blog/models/claude-3-7-sonnet) and [Claude 4](/blog/models/claude-4) releases. - -## [Navigation](#navigation) - -- [All Claude Models](/blog/models) for the complete model index -- [Claude 3.5 Sonnet](/blog/models/claude-3-5-sonnet), the original June 2024 release -- [Claude 3.7 Sonnet](/blog/models/claude-3-7-sonnet), the next generation with hybrid reasoning - -Last updated on - -[Previous - -Claude 3.7 Sonnet](/blog/models/claude-3-7-sonnet)[Next - -Claude 3.5 Sonnet](/blog/models/claude-3-5-sonnet) diff --git a/docs/site/src/content/blog/claude-3-5-sonnet.md b/docs/site/src/content/blog/claude-3-5-sonnet.md deleted file mode 100644 index 7f617cdb..00000000 --- a/docs/site/src/content/blog/claude-3-5-sonnet.md +++ /dev/null @@ -1,74 +0,0 @@ ---- -slug: "claude-3-5-sonnet" -title: "Claude 3.5 Sonnet: When the Mid-Tier Outperformed the Flagship" -description: "Claude 3.5 Sonnet launched June 2024 and outperformed the larger Claude 3 Opus on most benchmarks. A mid-tier model that redefined expectations." -date: "2024-06-20" -author: "Max Ritter" -tags: [Reference, Models] -readingTime: 3 -keywords: "3, 35, 5, claude, flagship, midtier, outperformed, sonnet, when" ---- - -# Claude 3.5 Sonnet: When the Mid-Tier Outperformed the Flagship - -Claude 3.5 Sonnet launched June 2024 and outperformed the larger Claude 3 Opus on most benchmarks. A mid-tier model that redefined expectations. - -Claude 3.5 Sonnet proved that bigger is not always better. Released June 20, 2024, this mid-tier model outperformed the larger, more expensive Claude 3 Opus on most benchmarks while costing 80% less. It was the moment developers stopped assuming that the flagship model was automatically the best choice. - -## [Key Specs](#key-specs) - -| Spec | Details | -| --- | --- | -| **API ID** | `claude-3-5-sonnet-20240620` | -| **Context window** | 200K tokens | -| **Input pricing** | $3 / 1M tokens | -| **Output pricing** | $15 / 1M tokens | -| **Release date** | June 20, 2024 | -| **Max output tokens** | 8,192 | - -## [What Claude 3.5 Sonnet Brought to the Table](#what-claude-35-sonnet-brought-to-the-table) - -**Flagship intelligence at mid-tier pricing.** Claude 3.5 Sonnet matched or exceeded Claude 3 Opus across graduate-level reasoning (GPQA), undergraduate knowledge (MMLU), and coding (HumanEval). It did this at $3/$15 per million tokens instead of $15/$75. The cost-performance ratio was unprecedented. - -**Coding strength.** This was the model that made Claude a serious coding tool. It solved 64% of problems on HumanEval, up from Opus's 55%. Developers who had been using GPT-4 for code started switching. The combination of reasoning quality and code output made it the default for software engineering tasks. - -**Speed.** Claude 3.5 Sonnet operated at roughly twice the speed of Claude 3 Opus. For interactive coding sessions, chat applications, and any latency-sensitive workflow, the speed improvement was immediately noticeable. - -**The "Sonnet is enough" realization.** Before this release, the assumption was simple: harder problem, bigger model. Claude 3.5 Sonnet broke that pattern. Teams that had been paying for Opus discovered they could get equal or better results from Sonnet at a fifth of the price. This shift in thinking influenced how developers approached [model selection](/blog/models/model-selection) going forward. - -## [How It Compared to Claude 3 Opus](#how-it-compared-to-claude-3-opus) - -| Benchmark | Claude 3 Opus | Claude 3.5 Sonnet | -| --- | --- | --- | -| MMLU | 86.8% | 88.7% | -| GPQA | 50.4% | 59.4% | -| HumanEval | 55% | 64% | -| GSM8K | 95.0% | 96.4% | - -Higher scores across the board, at one-fifth the cost. The numbers made the case on their own. - -## [What About Claude 3.5 Opus?](#what-about-claude-35-opus) - -Anthropic announced a Claude 3.5 Opus during the 3.5 Sonnet launch. It never shipped. The Claude 4 generation superseded the entire 3.5 line before a larger 3.5 model was needed. Given how well Sonnet performed, the market pressure for a 3.5 Opus simply never materialized. - -## [Current Status](#current-status) - -| Model | Status | -| --- | --- | -| Claude 3.5 Sonnet (v1) | Superseded by v2 (October 2024) | - -The original 3.5 Sonnet was replaced by an [upgraded version in October 2024](/blog/models/claude-3-5-sonnet-v2) that brought further improvements and the groundbreaking Computer Use feature. - -## [Navigation](#navigation) - -- [All Claude Models](/blog/models) for the complete model index -- [Claude 3](/blog/models/claude-3), the predecessor family -- [Claude 3.5 Sonnet v2](/blog/models/claude-3-5-sonnet-v2), the October 2024 upgrade with Computer Use - -Last updated on - -[Previous - -Claude 3.5 Sonnet v2](/blog/models/claude-3-5-sonnet-v2)[Next - -Claude 3](/blog/models/claude-3) diff --git a/docs/site/src/content/blog/claude-3-7-sonnet.md b/docs/site/src/content/blog/claude-3-7-sonnet.md deleted file mode 100644 index ea201420..00000000 --- a/docs/site/src/content/blog/claude-3-7-sonnet.md +++ /dev/null @@ -1,82 +0,0 @@ ---- -slug: "claude-3-7-sonnet" -title: "Claude 3.7 Sonnet: Hybrid Reasoning and Extended Thinking" -description: "Claude 3.7 Sonnet introduced hybrid reasoning in February 2025. Extended thinking mode lets Claude pause and think step-by-step before responding." -date: "2025-02-25" -author: "Max Ritter" -tags: [Reference, Models] -readingTime: 4 -keywords: "3, 37, 7, claude, extended, hybrid, reasoning, sonnet, thinking" ---- - -# Claude 3.7 Sonnet: Hybrid Reasoning and Extended Thinking - -Claude 3.7 Sonnet introduced hybrid reasoning in February 2025. Extended thinking mode lets Claude pause and think step-by-step before responding. - -Claude 3.7 Sonnet was the model that gave Claude the ability to think before it speaks. Released February 25, 2025, it introduced hybrid reasoning, a mode where Claude can pause, work through a problem step-by-step internally, and then deliver a more accurate response. This was the last model in the Claude 3.x generation, and it set the foundation for everything that followed in the Claude 4 line. - -## [Key Specs](#key-specs) - -| Spec | Details | -| --- | --- | -| **API ID** | `claude-3-7-sonnet-20250225` | -| **Context window** | 200K tokens | -| **Input pricing** | $3 / 1M tokens | -| **Output pricing** | $15 / 1M tokens | -| **Thinking token pricing** | Included in output pricing | -| **Max output tokens** | 64,000 (with extended thinking) | -| **Release date** | February 25, 2025 | - -## [What Claude 3.7 Sonnet Brought to the Table](#what-claude-37-sonnet-brought-to-the-table) - -**Extended thinking.** The defining feature. When enabled, Claude can "think out loud" internally before generating a response. Instead of immediately producing output token by token, the model allocates a thinking budget to reason through the problem first. For math proofs, multi-step code logic, scientific analysis, and complex planning tasks, extended thinking produced dramatically better results. - -API users got fine-grained control over the thinking budget. Set a low budget for quick tasks, high budget for problems that demand careful reasoning. The thinking tokens counted toward output pricing but the quality improvement justified the cost for hard problems. - -**Hybrid reasoning.** Claude 3.7 Sonnet could operate in two modes within the same conversation. Quick, real-time responses for straightforward questions. Deep, step-by-step reasoning for complex ones. You did not have to choose a "thinking model" versus a "fast model." One model handled both, switching based on the task. - -**State-of-the-art agentic coding.** The model set new highs on SWE-bench Verified, which tests real-world software engineering tasks (fixing actual GitHub issues). This was not a synthetic benchmark. Claude 3.7 Sonnet could read a bug report, navigate a codebase, identify the root cause, and generate a working fix more reliably than any previous Claude model. - -**Instruction-following and multimodal improvements.** Building on the [3.5 Sonnet v2](/blog/models/claude-3-5-sonnet-v2) gains, 3.7 Sonnet further improved at following complex, multi-constraint instructions. It also handled images, charts, and mixed media inputs with higher accuracy. - -## [Extended Thinking in Practice](#extended-thinking-in-practice) - -Extended thinking transformed how developers approached hard problems with Claude. The pattern was straightforward: - -1. Send a complex prompt (code review, mathematical proof, architectural decision) -2. Claude allocates thinking budget to reason through it internally -3. The response arrives with higher accuracy and fewer logical errors - -The biggest gains showed up in math, science, and multi-file code changes. Tasks that previously required multiple back-and-forth corrections often resolved correctly on the first attempt with extended thinking enabled. - -For a deeper look at how to use this effectively, see the [deep thinking techniques guide](/blog/guide/performance/deep-thinking-techniques). - -## [How It Compared to Claude 3.5 Sonnet v2](#how-it-compared-to-claude-35-sonnet-v2) - -Same pricing ($3/$15 per million tokens). Same 200K context window. But meaningfully better at reasoning, coding, and following instructions. The max output token limit jumped to 64,000 when using extended thinking (up from 8,192), making it viable for generating long-form code, documentation, or analysis in a single response. - -The most important difference was qualitative: Claude 3.7 Sonnet made fewer reasoning errors on complex tasks. The extended thinking mode gave it a way to "show its work" internally, catching mistakes before they reached the output. - -## [Current Status](#current-status) - -| Model | Status | -| --- | --- | -| Claude 3.7 Sonnet | Superseded by Claude 4 generation | - -Claude 3.7 Sonnet was the bridge between the 3.x and 4.x generations. The hybrid reasoning and extended thinking capabilities it pioneered became standard features in [Claude 4](/blog/models/claude-4) and every model that followed. If you are still running 3.7 Sonnet in production, the upgrade path to Claude 4 models is straightforward and the pricing remains competitive. - -## [Navigation](#navigation) - -- [All Claude Models](/blog/models) for the complete model index -- [Claude 3.5 Sonnet v2](/blog/models/claude-3-5-sonnet-v2), the October 2024 predecessor -- [Claude 4](/blog/models/claude-4), the next generation -- [Deep thinking techniques](/blog/guide/performance/deep-thinking-techniques) for getting the most out of extended thinking -- [Model selection strategies](/blog/models/model-selection) for choosing between Claude models - -Last updated on - -[Previous - -Claude 4](/blog/models/claude-4)[Next - -Claude 3.5 Sonnet v2](/blog/models/claude-3-5-sonnet-v2) diff --git a/docs/site/src/content/blog/claude-3.md b/docs/site/src/content/blog/claude-3.md deleted file mode 100644 index 34feca1c..00000000 --- a/docs/site/src/content/blog/claude-3.md +++ /dev/null @@ -1,64 +0,0 @@ ---- -slug: "claude-3" -title: "Claude 3: The Model Family That Started It All" -description: "Claude 3 introduced Opus, Sonnet, and Haiku in March 2024. Vision capabilities, 200K context, and three performance tiers that defined modern AI pricing." -date: "2024-03-04" -author: "Max Ritter" -tags: [Reference, Models] -readingTime: 3 -keywords: "3, all, claude, family, model, started, that" ---- - -# Claude 3: The Model Family That Started It All - -Claude 3 introduced Opus, Sonnet, and Haiku in March 2024. Vision capabilities, 200K context, and three performance tiers that defined modern AI pricing. - -Claude 3 was the release that turned Anthropic from a safety research lab into a serious competitor. Launched March 4, 2024, it introduced three models at three price points, each purpose-built for different workloads. This was the first time any AI company shipped a coherent family with clear tradeoffs between speed, cost, and capability. - -## [Key Specs](#key-specs) - -| Spec | Opus | Sonnet | Haiku | -| --- | --- | --- | --- | -| **API ID** | `claude-3-opus-20240229` | `claude-3-sonnet-20240229` | `claude-3-haiku-20240307` | -| **Context window** | 200K tokens | 200K tokens | 200K tokens | -| **Input pricing** | $15 / 1M tokens | $3 / 1M tokens | $0.25 / 1M tokens | -| **Output pricing** | $75 / 1M tokens | $15 / 1M tokens | $1.25 / 1M tokens | -| **Release date** | March 4, 2024 | March 4, 2024 | March 7, 2024 | - -## [What Claude 3 Brought to the Table](#what-claude-3-brought-to-the-table) - -**Three-tier model family.** Before Claude 3, you picked one model and lived with its tradeoffs. Anthropic gave developers a clear hierarchy: Haiku for speed and cost, Sonnet for the daily workhorse, Opus for the hardest problems. This pricing structure became the template every AI lab copied. - -**Vision capabilities.** Claude could see for the first time. Photos, charts, diagrams, handwritten notes, screenshots. You could drop an image into the conversation and get analysis back. This opened up use cases that pure text models simply could not handle. - -**200K token context window.** At launch, this was among the largest context windows commercially available. Developers could feed entire codebases, legal documents, or research papers into a single prompt without chunking. - -**Benchmark performance.** Opus topped the charts on MMLU (86.8%), GPQA (50.4%), and GSM8K (95.0%), outperforming GPT-4 and Gemini 1.0 Ultra across most academic benchmarks. It was the first Claude model that could credibly claim "best in class." - -**Haiku's speed.** The smallest model could read and process a 10,000-token research paper with charts and graphs in under 3 seconds. For high-volume, latency-sensitive applications, nothing else came close at the price point. - -## [How It Compared to Predecessors](#how-it-compared-to-predecessors) - -Claude 2 was a single model with a single personality. Claude 3 replaced that with a full product line. The jump in reasoning, multilingual support, and accuracy was substantial. Claude 2 had a tendency to refuse tasks unnecessarily. Claude 3 was more willing to engage with complex requests while maintaining safety guardrails. The addition of vision alone made it a fundamentally different product. - -## [Current Status](#current-status) - -| Model | Status | -| --- | --- | -| Claude 3 Opus | Retired (January 2026) | -| Claude 3 Sonnet | Retired (July 2025) | -| Claude 3 Haiku | Still available | - -Claude 3 Haiku remains accessible for lightweight, cost-sensitive workloads. Opus and Sonnet have been fully superseded by the 3.5 and 4.x generations. - -## [Navigation](#navigation) - -- [All Claude Models](/blog/models) for the complete model index -- [Claude 3.5 Sonnet](/blog/models/claude-3-5-sonnet), the next release that surpassed Opus at a fraction of the cost -- [Model selection strategies](/blog/models/model-selection) for choosing the right model for your workload - -Last updated on - -[Previous - -Claude 3.5 Sonnet](/blog/models/claude-3-5-sonnet) diff --git a/docs/site/src/content/blog/claude-4.md b/docs/site/src/content/blog/claude-4.md deleted file mode 100644 index fbba6c7c..00000000 --- a/docs/site/src/content/blog/claude-4.md +++ /dev/null @@ -1,73 +0,0 @@ ---- -slug: "claude-4" -title: "Claude 4: Sonnet 4 and Opus 4 Launch the Next Generation" -description: "Claude 4 launched May 2025 with Sonnet 4 and Opus 4. The generation that brought Claude Code mainstream with professional-grade coding capabilities." -date: "2025-05-22" -author: "Max Ritter" -tags: [Reference, Models] -readingTime: 3 -keywords: "4, claude, generation, launch, next, opus, sonnet" ---- - -# Claude 4: Sonnet 4 and Opus 4 Launch the Next Generation - -Claude 4 launched May 2025 with Sonnet 4 and Opus 4. The generation that brought Claude Code mainstream with professional-grade coding capabilities. - -Claude 4 is the generation that turned Claude Code from an interesting experiment into a professional software engineering tool. Anthropic launched the family on May 22, 2025, with two models: Sonnet 4 and Opus 4. - -## [Key Specs](#key-specs) - -| Spec | Sonnet 4 | Opus 4 | -| --- | --- | --- | -| **API ID** | `claude-sonnet-4-20250514` | `claude-opus-4-20250514` | -| **Release Date** | May 22, 2025 | May 22, 2025 | -| **Context** | 200K tokens | 200K tokens | -| **Max Output** | 16,384 tokens | 16,384 tokens | -| **Status** | Active (still available) | Superseded by Opus 4.1 | - -## [What Claude 4 Brought to the Table](#what-claude-4-brought-to-the-table) - -The Claude 4 family represented a generational leap in coding capability. Before this release, Claude Code was a promising tool that early adopters were experimenting with. After it, Claude Code became a daily driver for professional developers. - -**Professional software engineering.** Claude 4 models could handle real-world codebases, not just toy examples. Multi-file refactoring, complex debugging across dependency chains, and meaningful code reviews became reliable operations. - -**Agentic reliability.** Both Sonnet 4 and Opus 4 showed significant improvements in following complex, multi-step instructions without drifting off-task. This made agentic workflows (where Claude executes a sequence of tool calls to accomplish a goal) practical for production use. - -**Better instruction following.** Previous Claude models would sometimes ignore parts of detailed prompts or add unwanted changes. Claude 4 brought noticeably tighter adherence to constraints and specifications. - -## [How It Compared to Claude 3.7](#how-it-compared-to-claude-37) - -Claude 3.7 Sonnet introduced extended thinking, which was a significant capability. But Claude 4 built on that foundation and delivered across the board: - -- More consistent code quality across long sessions -- Fewer hallucinated imports and non-existent APIs -- Better understanding of project context and conventions -- Stronger performance on real-world software engineering benchmarks (SWE-bench) - -The difference felt less like a spec bump and more like going from a junior developer to a mid-level one. Claude 4 models understood what you were trying to build, not just the literal instruction you gave. - -## [The Two Models](#the-two-models) - -**Sonnet 4** became the workhorse. Fast enough for interactive development, capable enough for most tasks, and priced for all-day use. Most Claude Code users ran Sonnet 4 as their default. - -**Opus 4** was the heavy hitter. Reserved for complex architecture decisions, deep debugging, and tasks that required maximum reasoning depth. More expensive, slower, but noticeably better at problems that required holding many constraints in mind simultaneously. - -## [Current Status](#current-status) - -Sonnet 4 remains available through the API and can still be referenced by its model ID. Opus 4 has been superseded by [Opus 4.1](/blog/models/claude-opus-4-1), which improved on its reliability for production workflows. - -For most users today, the [4.5 generation](/blog/models/claude-sonnet-4-5) is the recommended starting point. But Claude 4 deserves its place in the timeline as the generation that proved AI-assisted coding could be a serious engineering workflow. - -## [Related Pages](#related-pages) - -- [All Claude Models](/blog/models) for the complete model timeline -- [Opus 4.1](/blog/models/claude-opus-4-1) for the next Opus iteration -- [Model selection guide](/blog/models/model-selection) for choosing the right model today - -Last updated on - -[Previous - -Opus 4.1](/blog/models/claude-opus-4-1)[Next - -Claude 3.7 Sonnet](/blog/models/claude-3-7-sonnet) diff --git a/docs/site/src/content/blog/claude-code-hooks-guide.md b/docs/site/src/content/blog/claude-code-hooks-guide.md deleted file mode 100644 index 71cdf7dc..00000000 --- a/docs/site/src/content/blog/claude-code-hooks-guide.md +++ /dev/null @@ -1,168 +0,0 @@ ---- -slug: "claude-code-hooks-guide" -title: "A Practical Guide to Claude Code Hooks" -description: "Learn how to use Claude Code hooks to auto-lint, block dangerous commands, load context, and verify work. Includes configuration examples." -date: "2026-02-12" -author: "Max Ritter" -tags: [Guide, Hooks] -readingTime: 5 -keywords: "Claude Code hooks, PreToolUse, PostToolUse, Stop hook, SessionStart, Claude Code automation, Claude Code settings" ---- - -# A Practical Guide to Claude Code Hooks - -Hooks let you run custom scripts at key moments during a Claude Code session. They're the primary mechanism for enforcing workflows, automating checks, and injecting context — without relying on Claude to remember to do it. - -## How Hooks Work - -Hooks are shell commands that fire on specific events. You configure them in `settings.json` or `.claude/settings.json`. When the event triggers, Claude Code runs your script and uses the output to inform its behavior. - -There are five hook types: - -| Hook | Fires When | Common Use | -|------|-----------|------------| -| **PreToolUse** | Before a tool executes | Block dangerous commands, validate inputs | -| **PostToolUse** | After a tool completes | Run linters, check test status | -| **Stop** | Claude is about to respond | Verify work is complete before stopping | -| **SessionStart** | Session begins | Load project context, check dependencies | -| **SessionEnd** | Session ends | Save progress, clean up resources | - -## Configuration - -Add hooks to your project's `.claude/settings.json`: - -```json -{ - "hooks": { - "PostToolUse": [ - { - "matcher": "Edit", - "hooks": [ - { - "type": "command", - "command": "ruff check $CLAUDE_FILE_PATH --fix" - } - ] - } - ] - } -} -``` - -The `matcher` field filters which tool triggers the hook. Without a matcher, the hook fires on every tool call of that type. - -## Practical Examples - -### Auto-lint on every file edit - -```json -{ - "hooks": { - "PostToolUse": [ - { - "matcher": "Edit|Write", - "hooks": [ - { - "type": "command", - "command": "ruff check \"$CLAUDE_FILE_PATH\" --fix --quiet" - } - ] - } - ] - } -} -``` - -### Block dangerous git commands - -```json -{ - "hooks": { - "PreToolUse": [ - { - "matcher": "Bash", - "hooks": [ - { - "type": "command", - "command": "echo \"$CLAUDE_TOOL_INPUT\" | grep -qE 'git (push --force|reset --hard|clean -f)' && echo 'BLOCK: Destructive git command blocked' && exit 2 || exit 0" - } - ] - } - ] - } -} -``` - -Exit code 2 blocks the tool. Any other exit code allows it. - -### Load context at session start - -```json -{ - "hooks": { - "SessionStart": [ - { - "hooks": [ - { - "type": "command", - "command": "cat .claude/project-context.md" - } - ] - } - ] - } -} -``` - -The script's stdout becomes part of Claude's context. - -### Verify before responding (Stop Hook) - -```json -{ - "hooks": { - "Stop": [ - { - "hooks": [ - { - "type": "command", - "command": "python scripts/verify-work.py" - } - ] - } - ] - } -} -``` - -If the stop hook exits non-zero, Claude continues working instead of responding. This is powerful for ensuring tests pass or linting is clean before Claude considers its work done. - -## Hook Environment Variables - -Claude Code passes context to hooks via environment variables: - -| Variable | Available In | Description | -|----------|-------------|-------------| -| `CLAUDE_TOOL_NAME` | PreToolUse, PostToolUse | Name of the tool being called | -| `CLAUDE_TOOL_INPUT` | PreToolUse, PostToolUse | JSON input to the tool | -| `CLAUDE_FILE_PATH` | PostToolUse (Edit/Write) | Path of the file modified | -| `CLAUDE_SESSION_ID` | All hooks | Current session identifier | - -## Tips - -- **Keep hooks fast.** They run synchronously — slow hooks degrade the experience. -- **Use exit codes deliberately.** Exit 0 = allow, exit 2 = block (PreToolUse only). -- **Print sparingly.** Hook stdout goes into Claude's context. Be concise. -- **Test hooks independently.** Run your hook scripts manually first before adding them to settings. - -## How Pilot Uses Hooks - -Pilot Shell installs several hooks automatically: - -- **TDD Enforcer** (PostToolUse): Reminds Claude to write tests before production code -- **Context Monitor** (PostToolUse): Tracks context usage and warns at ~80% and ~90%+ as compaction approaches -- **Tool Redirect** (PreToolUse): Blocks inefficient tools and suggests better alternatives -- **PreCompact** (PreCompact): Captures active plan, task progress, and key context to memory before compaction -- **Session End** (SessionEnd): Stops worker daemon when no other sessions are active and sends completion notifications - -These hooks work together to enforce quality workflows without relying on Claude remembering rules. Hooks are deterministic — they always run, unlike rules which Claude might occasionally skip. diff --git a/docs/site/src/content/blog/claude-code-rules-guide.md b/docs/site/src/content/blog/claude-code-rules-guide.md deleted file mode 100644 index d4a38b45..00000000 --- a/docs/site/src/content/blog/claude-code-rules-guide.md +++ /dev/null @@ -1,119 +0,0 @@ ---- -slug: "claude-code-rules-guide" -title: "The Complete Guide to Claude Code Rules" -description: "Everything you need to know about Claude Code rules: types, locations, frontmatter, writing effective rules, practical examples, and team management." -date: "2026-02-08" -author: "Max Ritter" -tags: [Guide, Configuration] -readingTime: 5 -keywords: "Claude Code rules, CLAUDE.md, Claude Code custom instructions, Claude Code configuration, Claude Code rules guide" ---- - -# The Complete Guide to Claude Code Rules - -Rules are markdown files that give Claude persistent instructions — coding standards, project conventions, workflow requirements. Instead of repeating "use pytest, not unittest" every session, you write it once as a rule and Claude follows it automatically. - -## Rule Types and Locations - -Claude Code supports rules at three levels: - -| Level | Location | Scope | -|-------|----------|-------| -| **Global** | `~/.claude/rules/` | All projects on your machine | -| **Project** | `.claude/rules/` | This project only (committed to git) | -| **Conditional** | Frontmatter with `globs:` | Only when matching files are active | - -Project rules override global rules when they conflict. Conditional rules activate only for matching file patterns: - -```markdown ---- -globs: ["**/*.test.ts", "**/*.spec.ts"] ---- -# Test File Standards -- Use `describe` blocks grouped by function name -- Prefer `toEqual` over `toBe` for objects -``` - -## Writing Effective Rules - -### Be Specific, Not Vague - -``` -❌ Write clean, maintainable code following best practices. -✅ Functions must be under 30 lines. No function takes more than 4 parameters. -``` - -### Use Tables for Decisions - -Tables are the most reliable format — Claude parses them consistently: - -```markdown -| Task Complexity | Approach | -|----------------|----------| -| Trivial (1 file) | Execute directly | -| Moderate (2-5 files) | Track with tasks | -| High (10+ files) | Plan first | -``` - -### Include Why - -Claude follows rules better when it understands the reasoning: - -```markdown -## File Size Limit -Files must stay under 300 lines. Above 500 is a hard limit. -**Why:** Large files indicate poor separation of concerns. -``` - -### Cover Exceptions - -```markdown -## TDD Enforcement -All code changes require a failing test first. -**Exceptions:** Documentation, config files, dependency updates. -**When uncertain, use TDD.** -``` - -## Practical Examples - -### Python Project - -```markdown -# Python Standards -| Task | Command | -|------|---------| -| Install deps | `uv sync` | -| Run tests | `uv run pytest -q` | -| Lint | `ruff check . --fix` | -| Type check | `basedpyright src` | - -- Type hints on all public functions -- Dataclasses over dicts for structured data -- pathlib.Path over os.path -``` - -### React/TypeScript Project - -```markdown -# React Conventions -- Functional components only -- Props interface defined above component -- Local state: useState / useReducer -- Server state: React Query -- Global state: Zustand (no Redux) -``` - -## Common Mistakes - -- **Too long** — Keep each rule file focused on one topic. Split "coding standards" into separate files. -- **Duplicating defaults** — Don't write rules for things Claude already does well. Focus on behaviors you want to change. -- **Stale rules** — Update rules when your stack changes. Treat them like code. - -## Automating Rule Management - -Pilot provides two tools for rule management: - -- **`/sync`** scans your codebase and generates rules matching your actual project structure, dependencies, and patterns -- **Team Vault** (`sx`) shares rules across your team via a private Git repository — push once, everyone gets it - -Rules compound. A well-maintained library means Claude starts every session already understanding your project, conventions, and quality bar. diff --git a/docs/site/src/content/blog/claude-code-session-context.md b/docs/site/src/content/blog/claude-code-session-context.md deleted file mode 100644 index 113e6d7c..00000000 --- a/docs/site/src/content/blog/claude-code-session-context.md +++ /dev/null @@ -1,143 +0,0 @@ ---- -slug: "claude-code-session-context" -title: "Claude Code: Load Different Starting Context by Session" -description: "Use --init with slash commands to load different context per session type. A simpler alternative to setup hooks for context loading." -date: "2026-01-27" -author: "Max Ritter" -tags: [Guide, Workflow] -readingTime: 4 -keywords: "by, claude, code, context, different, load, session, starting" ---- - -Mechanics - -# Load Different Context Based on Session Type in Claude Code - -Use --init with slash commands to load different context per session type. A simpler alternative to setup hooks for context loading. - -Different work needs different context. Writing blog posts requires brand guidelines and SEO workflows. Building features requires architecture docs and coding patterns. Debugging needs system diagrams and error handling conventions. - -You could put everything in CLAUDE.md and hope Claude figures out what's relevant. Or you could load the right context for each session type. - -## [The Simple Solution](#the-simple-solution) - -Claude Code accepts a prompt after the `--init` flag: - -```p-4 -claude --init "/blog" -``` - -This starts Claude and immediately executes the `/blog` slash command. That command can load whatever context you need: writing guidelines, content workflows, example posts, linking strategies. - -No setup hooks. No environment variables. No file copying. Just a command file that contains your context. - -## [When Setup Hooks Are Overkill](#when-setup-hooks-are-overkill) - -[Setup hooks](/blog/tools/hooks/claude-code-setup-hooks) (released January 25th, 2026) combine deterministic scripts with agentic oversight. They install dependencies, initialize databases, and run maintenance tasks. - -But if you only need to **load context** for a session type, setup hooks add complexity you don't need. A slash command does the job with less moving parts. - -| Need | Solution | -| --- | --- | -| Install dependencies, run migrations | Setup hooks | -| Load context for different work types | Slash commands | -| CI/CD automation with deterministic behavior | `claude --init-only` | -| Interactive onboarding with questions | Setup hooks + `/install true` | - -## [Our Implementation](#our-implementation) - -We use this pattern for blog writing sessions. The file structure: - -```p-4 -.claude/ - commands/ - blog.md # Context embedded in command -justfile # Launcher shortcuts -``` - -The `blog.md` command contains everything needed for a blog session: brand voice guidelines, content workflow documentation, loading tier instructions, SEO checklists, internal linking rules. - -The justfile provides a shortcut: - -```p-4 -blog: - claude --init "/blog" -``` - -Running `just blog` starts a Claude session with all blog context loaded. The session knows the brand voice, understands the linking strategy, and follows the content workflow without being told. - -## [What Goes in a Context Command](#what-goes-in-a-context-command) - -A good session context command includes: - -**Startup message**: Tell Claude what kind of session this is and report that context is loaded. - -**Workflow documentation**: The steps and processes for this type of work. - -**Reference material**: Guidelines, examples, checklists that apply to every task in this session. - -**Quality gates**: What to check before considering work complete. - -Here's the structure: - -```p-4 ---- -description: Start a blog writing session with pre-loaded context ---- - -# Blog Session - -You are starting a blog/content writing session. Report: "Blog session started." - ---- - -## Content Workflow - -[Workflow steps and process documentation] - -## Brand Voice - -[Guidelines and patterns] - -## Quality Checklist - -[Verification steps before publishing] -``` - -The context lives directly in the command file. When the command runs, Claude has everything it needs. - -## [Multiple Session Types](#multiple-session-types) - -You can create commands for each type of work: - -```p-4 -.claude/commands/ - blog.md # Blog writing context - feature.md # Feature development context - debug.md # Debugging context - review.md # Code review context -``` - -Each command loads the specific guidelines, workflows, and reference material for that session type. Starting the right kind of session is one command: - -```p-4 -just blog # Blog writing -just feature # Feature development -just debug # Debugging session -``` - -## [Why This Works](#why-this-works) - -The `--init` flag runs your command before any user interaction. By the time you type your first message, Claude already has the context loaded. You skip the "load these files first" dance and get straight to work. - -For [skills](/blog/guide/mechanics/claude-skills-guide), this pattern means loading the right skill configuration automatically. For [CLAUDE.md](/blog/guide/mechanics/claude-md-mastery) overrides, it means session-specific instructions without cluttering your base configuration. - -Start simple. If you find yourself needing deterministic scripts, installation automation, or agent oversight during setup, move to [setup hooks](/blog/tools/hooks/claude-code-setup-hooks). But for context loading, a slash command is often all you need. - -Last updated on - -[Previous - -Claude Skills Guide](/blog/guide/mechanics/claude-skills-guide)[Next - -CLAUDE.md Mastery](/blog/guide/mechanics/claude-md-mastery) diff --git a/docs/site/src/content/blog/claude-code-settings-reference.md b/docs/site/src/content/blog/claude-code-settings-reference.md deleted file mode 100644 index 4507d9b4..00000000 --- a/docs/site/src/content/blog/claude-code-settings-reference.md +++ /dev/null @@ -1,150 +0,0 @@ ---- -slug: "claude-code-settings-reference" -title: "Claude Code Settings: What You Can Configure" -description: "A concise reference for Claude Code settings: scopes, permissions, hooks, MCP servers, environment variables, and project vs user configuration." -date: "2026-02-07" -author: "Max Ritter" -tags: [Reference, Configuration] -readingTime: 5 -keywords: "Claude Code settings, settings.json, Claude Code configuration, Claude Code permissions, Claude Code environment variables" ---- - -# Claude Code Settings: What You Can Configure - -Claude Code has a layered settings system with five scopes, from broad defaults to project-specific overrides. Understanding what you can configure — and where — helps you set up Claude exactly how your team needs it. - -## The Five Scopes - -Settings are applied in order of specificity. More specific scopes override broader ones: - -| Scope | Location | Applies To | -|-------|----------|-----------| -| **Default** | Built into Claude Code | Everyone | -| **Enterprise** | Managed policy | Your organization | -| **User** | `~/.claude/settings.json` | All your projects | -| **Project** | `.claude/settings.json` | This project | -| **Local** | `.claude/settings.local.json` | Only you, this project | - -The local scope is gitignored — use it for personal preferences that shouldn't affect teammates. - -## Key Settings - -### Allowed and Blocked Tools - -Control which tools Claude can use without asking: - -```json -{ - "permissions": { - "allow": [ - "Bash(npm test)", - "Bash(npm run build)", - "Read", - "Edit", - "Write" - ], - "deny": [ - "Bash(rm -rf *)", - "Bash(git push --force)" - ] - } -} -``` - -### Model Selection - -Set the default model: - -```json -{ - "model": "claude-sonnet-4-20250514" -} -``` - -### MCP Servers - -Configure external tool integrations: - -```json -{ - "mcpServers": { - "context7": { - "command": "npx", - "args": ["-y", "@upstreamapi/context7-mcp@latest"] - } - } -} -``` - -### Hooks - -Run scripts on specific events: - -```json -{ - "hooks": { - "PostToolUse": [ - { - "matcher": "Edit", - "hooks": [{ "type": "command", "command": "ruff check $CLAUDE_FILE_PATH" }] - } - ] - } -} -``` - -### Custom Slash Commands - -Create project-specific commands in `.claude/commands/`: - -```markdown - -Run the deployment pipeline: -1. Run all tests -2. Build the production bundle -3. Deploy to staging -4. Run smoke tests -``` - -Invoke with `/deploy` in any session. - -## Environment Variables - -Some settings can also be set via environment variables: - -| Variable | Purpose | -|----------|---------| -| `CLAUDE_CODE_USE_BEDROCK` | Use AWS Bedrock as the API provider | -| `CLAUDE_CODE_USE_VERTEX` | Use Google Vertex AI as the API provider | -| `ANTHROPIC_API_KEY` | API key for direct Anthropic access | -| `CLAUDE_CODE_MAX_TURNS` | Maximum agentic turns per session | - -## Project vs User Settings - -**User settings** (`~/.claude/settings.json`): -- Your preferred model -- Global tool permissions -- Personal MCP servers -- Editor preferences - -**Project settings** (`.claude/settings.json`, committed to git): -- Team-agreed tool permissions -- Project-specific hooks (linting, testing) -- Shared MCP servers -- Custom commands - -**Local settings** (`.claude/settings.local.json`, gitignored): -- API key overrides -- Personal tool permissions that differ from team -- Debug MCP servers - -## How Pilot Configures Settings - -During installation, Pilot sets up: - -- **Hooks** for TDD enforcement, context monitoring, and tool redirection -- **MCP servers** for persistent memory, web search, and documentation -- **Custom commands** for `/spec`, `/sync`, and `/learn` -- **Rules** for coding standards, testing strategies, and workflow enforcement - -These are installed as project settings so they're shared with your team and version-controlled. You can customize any of them by editing the files directly. diff --git a/docs/site/src/content/blog/claude-code-setup-hooks.md b/docs/site/src/content/blog/claude-code-setup-hooks.md deleted file mode 100644 index 0405cd23..00000000 --- a/docs/site/src/content/blog/claude-code-setup-hooks.md +++ /dev/null @@ -1,248 +0,0 @@ ---- -slug: "claude-code-setup-hooks" -title: "Claude Code Setup Hooks: Automate Onboarding and Maintenance" -description: "Setup hooks combine deterministic scripts with agentic oversight. Automate installation, maintenance, and CI/CD with Claude Code." -date: "2026-01-27" -author: "Max Ritter" -tags: [Guide, Hooks] -readingTime: 7 -keywords: "automate, claude, code, hooks, maintenance, onboarding, setup" ---- - -Hooks - -# Claude Code Setup Hooks: Onboard Engineers in Minutes, Not Days - -Setup hooks combine deterministic scripts with agentic oversight. Automate installation, maintenance, and CI/CD with Claude Code. - -You can tell how great an engineering team is by the time it takes for a new engineer to run the project locally. - -For great teams, it's one link, one doc, a few commands. For most teams, it's one to two days of pair programming, Slack messages, rummaging through outdated docs, and tons of back and forth testing. - -In the age of agents, we can do better. - -## [The Problem with Traditional Approaches](#the-problem-with-traditional-approaches) - -Setting up a codebase forces you to choose between bad options: - -**Pure scripts** are predictable but brittle. They run the same commands every time, but they can't adapt when something goes wrong. When the database connection fails or a dependency is missing, the script just crashes. - -**Pure agents** are smart but unpredictable. You can't rely on them for CI/CD pipelines where you need the exact same behavior every time. - -**Pure docs** are flexible but manual. Nobody reads them, and they drift out of sync with reality within weeks. - -The trick is combining all three. Your deterministic scripts handle execution. Agents provide oversight. The result: **a living document that executes**. - -## [What Setup Hooks Do](#what-setup-hooks-do) - -Setup hooks were released in Claude Code on January 25th, 2026. They're a special hook type that runs *before* your session starts. When you run: - -```p-4 -claude --init -``` - -The setup hook runs first, then Claude boots up. The hook can install dependencies, initialize databases, and set up your environment. When it finishes, Claude sees the results and knows what happened. - -Here's where it gets interesting. You can pass a prompt *after* the init flag: - -```p-4 -claude --init "/install" -``` - -Now the hook runs first, then the `/install` command executes automatically. The agent reads the log files, analyzes what happened, and reports the results. - -## [Three Modes of Operation](#three-modes-of-operation) - -This creates three ways to set up your codebase: - -```p-4 -┌─────────────────────────────────────────────────────────┐ -│ DETERMINISTIC AGENTIC INTERACTIVE │ -│ (hooks only) (hooks + prompt) (hooks + Qs) │ -│ │ -│ claude --init /install /install true │ -│ │ -│ - Fast - Supervised - Asks Qs │ -│ - Predictable - Diagnostic - Adapts │ -│ - CI-friendly - Reports status - Context- │ -│ aware │ -└─────────────────────────────────────────────────────────┘ -``` - -**Deterministic mode**: The script runs alone. Fast, predictable, perfect for CI/CD where you need identical behavior every time. - -**Agentic mode**: The script runs, then an agent analyzes the results. It reads log files, interprets errors, and tells you what happened in plain language. - -**Interactive mode**: The script runs, then the agent asks questions. "Fresh database or keep existing data? Full install or minimal? Should I verify your environment first?" - -The script is the source of truth. Both hooks and prompts execute the same script. The difference is whether an agent supervises, and whether it asks you questions first. - -## [A Command Launcher for Everything](#a-command-launcher-for-everything) - -[Just](https://github.com/casey/just) is a simple command runner that works perfectly with setup hooks. Think of it as a launchpad for your engineering work. Instead of remembering flags and syntax, you type `just` and see all available commands: - -```p-4 -just # See all commands -just cldi # Deterministic setup -just cldii # Agentic setup (with reporting) -just cldit # Interactive setup (asks questions) -``` - -Here's what the justfile looks like: - -```p-4 -# Deterministic codebase setup -cldi: - claude --init - -# Agentic codebase setup -cldii: - claude --init "/install" - -# Interactive setup (asks questions) -cldit: - claude --init "/install true" - -# Deterministic maintenance -cldm: - claude --maintenance - -# Agentic maintenance (with reporting) -cldmm: - claude --maintenance "/maintenance" -``` - -You, your team, and your agents don't need to remember flags more than once. They just run `just cldii` and everything works. - -## [When to Use Each Mode](#when-to-use-each-mode) - -| Scenario | Mode | Command | -| --- | --- | --- | -| CI/CD pipeline | Deterministic | `claude --init-only` | -| Quick local setup | Deterministic | `just cldi` | -| Setup failed, need diagnosis | Agentic | `just cldii` | -| New engineer, unfamiliar codebase | Interactive | `just cldit` | -| Weekly dependency updates | Agentic | `just cldmm` | - -The `--init-only` flag is specifically for pipelines. It runs the hook and exits cleanly with a return code, no interactive session. - -## [The Interactive Experience](#the-interactive-experience) - -This is where it gets powerful for onboarding. When a new engineer runs `just cldit`, the agent walks them through setup: - -```p-4 -Agent: How should I handle the database? - -┌─ Database Setup ─────────────────────────────────┐ -│ ○ Fresh database (Recommended) │ -│ ○ Keep existing │ -│ ○ Skip database setup │ -└──────────────────────────────────────────────────┘ -``` - -The agent asks about installation mode, environment variables, and whether to verify prerequisites. It adapts to the answers and runs the appropriate steps. - -This is something scripts can never do. They run the same way every time. Agents can ask clarifying questions mid-workflow and adapt to the context. - -## [How It Works Under the Hood](#how-it-works-under-the-hood) - -Setup hooks are one of [12 lifecycle events](/blog/tools/hooks/hooks-guide) in Claude Code's hook system. They're configured in `.claude/settings.json`: - -```p-4 -{ - "hooks": { - "Setup": [ - { - "matcher": "init", - "hooks": [ - { - "type": "command", - "command": ".claude/hooks/setup_init.py", - "timeout": 120 - } - ] - }, - { - "matcher": "maintenance", - "hooks": [ - { - "type": "command", - "command": ".claude/hooks/setup_maintenance.py", - "timeout": 60 - } - ] - } - ] - } -} -``` - -The hook script runs commands and logs everything: - -```p-4 -def main(): - # Install backend dependencies - run(["uv", "sync"], cwd="apps/backend") - - # Install frontend dependencies - run(["npm", "install"], cwd="apps/frontend") - - # Initialize database - run(["uv", "run", "python", "init_db.py"], cwd="apps/backend") - - # Tell Claude what happened - print(json.dumps({ - "hookSpecificOutput": { - "hookEventName": "Setup", - "additionalContext": "Setup complete. Run 'just be' and 'just fe' to start." - } - })) -``` - -The `/install` [slash command](/blog/guide/mechanics/claude-skills-guide) then reads the log file and reports the results: - -```p-4 ---- -description: Run setup and report installation results ---- - -## Workflow - -1. Run /prime to understand the codebase -2. Read the log file at .claude/hooks/setup.init.log -3. Analyze for successes and failures -4. Write results to app_docs/install_results.md -5. Report to user -``` - -If something fails, the agent has context to diagnose it. You can add common issues and solutions to the prompt, and the agent will follow them automatically. - -## [Why This Pattern Matters](#why-this-pattern-matters) - -Think about the time it takes to onboard a new engineer. Now think about how fast you want your team to grow. Can you build a prompt that runs the setup and installation process? Can you make it interactive to make every step clear? - -The answer is yes. Agents are good enough. You just need to standardize it. - -**Determinism preserved**: The hook runs the same script every time. No LLM variance in execution. Agents only analyze *after* the deterministic work is done. - -**CI compatible**: GitHub Actions can run `claude --init-only` and get a clean exit code. - -**Interactive when it matters**: New hires get walked through setup. Veterans run the fast deterministic version. - -**A living document that executes**: Your installation process is now in natural language, embedded in prompts that agents follow. When you need to update something, you update the prompt. - -## [Getting Started](#getting-started) - -Start with the basics: create a `.claude/hooks/setup_init.py` script that installs your dependencies, and configure it in [`.claude/settings.json`](/blog/guide/configuration-basics). Add a `/install` command that reads the log file and reports results. Then wrap it all in a justfile so your team can run `just install` and be done. - -For simpler scenarios where you just need to load different context for different session types, see [conditional context loading with slash commands](/blog/guide/mechanics/claude-code-session-context). When you don't need installation scripts, a slash command is often enough. - -Setup hooks shine when you want **one command** that installs everything, diagnoses problems, and walks new engineers through the process. Combine deterministic scripts with intelligent agents, and you get the best of both worlds. - -Last updated on - -[Previous - -Hooks Guide](/blog/tools/hooks/hooks-guide)[Next - -Stop Hook](/blog/tools/hooks/stop-hook-task-enforcement) diff --git a/docs/site/src/content/blog/claude-code-task-management.md b/docs/site/src/content/blog/claude-code-task-management.md deleted file mode 100644 index dafe0f5c..00000000 --- a/docs/site/src/content/blog/claude-code-task-management.md +++ /dev/null @@ -1,87 +0,0 @@ ---- -slug: "claude-code-task-management" -title: "Multi-Session Task Management in Claude Code" -description: "Track work across sessions with built-in task management. Dependencies, progress tracking, and cross-session persistence." -date: "2026-02-06" -author: "Max Ritter" -tags: [Guide, Workflow] -readingTime: 4 -keywords: "Claude Code tasks, task management, multi-session, Claude Code workflow, task dependencies, progress tracking" ---- - -# Multi-Session Task Management in Claude Code - -Claude Code includes a built-in task system for coordinating work across sessions. Tasks persist between sessions, support dependencies, and show real-time progress in your terminal. - -## Task Operations - -### Creating Tasks - -Break work into trackable units: - -``` -TaskCreate: "Add user authentication" -TaskCreate: "Write auth integration tests" [blockedBy: task-1] -TaskCreate: "Update API documentation" [blockedBy: task-1] -``` - -Each task gets a unique ID and status tracking: `pending` → `in_progress` → `completed`. - -### Managing Progress - -| Operation | What It Does | -|-----------|-------------| -| **TaskCreate** | Add a new task with description and dependencies | -| **TaskList** | See all tasks, their status, and what's blocked | -| **TaskGet** | Read full details of a specific task | -| **TaskUpdate** | Change status, add dependencies, update description | - -Mark tasks as you work: - -``` -TaskUpdate: task-1, status: "in_progress" # Starting work -TaskUpdate: task-1, status: "completed" # Done -``` - -### Dependencies - -Tasks can block other tasks. A blocked task won't show as ready until its dependencies complete: - -``` -Task 1: Set up database schema -Task 2: Implement user model [blockedBy: 1] -Task 3: Add API endpoints [blockedBy: 2] -Task 4: Write E2E tests [blockedBy: 3] -``` - -This prevents Claude from jumping ahead and building on incomplete foundations. Tasks 3 and 4 can also run in parallel once task 2 completes — just set both to depend on task 2. - -## Progress Tracking - -Tasks show real-time status in your terminal via `Ctrl+T`: - -- Which task is currently in progress (with a spinner) -- How many tasks are completed vs remaining -- What's blocked and why - -This visibility is especially valuable for long features where you need to track progress across hours of work. - -## Cross-Session Persistence - -Tasks survive auto-compaction. When auto-compaction triggers, the task list is preserved exactly where it left off. Claude checks `TaskList` to find where to resume and continues seamlessly. - -Stale tasks from previous sessions are cleaned up automatically — each session starts by reviewing the task list and removing anything no longer relevant. - -## When to Use Tasks - -| Scenario | Use Tasks? | -|----------|-----------| -| Quick bug fix | No — just do it | -| Feature with 3+ steps | Yes | -| Multi-file refactor | Yes | -| User provides a list of items | Yes | -| Spec-driven development | Automatic | - -## How Pilot Uses Tasks - -During `/spec` implementation, Pilot automatically creates tasks from the plan. Each plan task becomes a tracked item with proper dependencies. The TDD loop runs for each task in sequence, with real-time progress visible in your terminal throughout. When context fills up and auto-compaction triggers, the task list is preserved and work continues from the first uncompleted task. diff --git a/docs/site/src/content/blog/claude-code-vs-cursor.md b/docs/site/src/content/blog/claude-code-vs-cursor.md deleted file mode 100644 index 255a47b1..00000000 --- a/docs/site/src/content/blog/claude-code-vs-cursor.md +++ /dev/null @@ -1,112 +0,0 @@ ---- -slug: "claude-code-vs-cursor" -title: "Claude Code vs Cursor: Which AI Coding Tool Wins in 2025?" -description: "Compare Claude Code and Cursor head-to-head. Terminal-first vs IDE-native, pricing, features, and which tool developers actually prefer." -date: "2025-11-13" -author: "Max Ritter" -tags: [Guide, Tools] -readingTime: 4 -keywords: "2025, ai, claude, code, coding, cursor, tool, vs, which, wins" ---- - -Extensions - -# Claude Code vs Cursor: Which AI Coding Tool Wins in 2025? - -Compare Claude Code and Cursor head-to-head. Terminal-first vs IDE-native, pricing, features, and which tool developers actually prefer. - -**Problem**: Choosing between Claude Code and Cursor for your dev workflow? Here's the breakdown in 2 minutes. - -**Quick win**: Try both right now: - -```p-4 -# Claude Code (terminal-based) -curl -fsSL https://claude.ai/install.sh | bash # macOS/Linux -# Or on Windows PowerShell: irm https://claude.ai/install.ps1 | iex -claude - -# Cursor (IDE-based) -# Download from cursor.com, then: -cursor . # Opens Cursor IDE -``` - -You'll immediately see the core difference: Claude Code lives in your terminal, Cursor replaces VS Code. Both use Claude AI, but the experience is completely different. - -## [Terminal-First vs IDE-Native: The Core Split](#terminal-first-vs-ide-native-the-core-split) - -Claude Code is a **command-line AI agent** that works directly in your terminal. It sees your entire codebase, makes multi-file changes, and handles autonomous workflows. You type commands, it executes tasks. - -Cursor is a **VS Code fork** with AI built into the editor. It provides real-time coding assistance, autocomplete, and chat within the IDE interface. You code normally, it helps as you type. - -The choice depends on your workflow: autonomous execution or real-time assistance? - -## [Context Window: Where It Matters](#context-window-where-it-matters) - -**Claude Code**: True 200k-token context window. Maintains consistent context across long conversations. Ideal for complex refactoring across 50+ files or comprehensive codebase analysis. - -**Cursor**: 128k tokens (Normal), 200k tokens (Max Mode). In practice, may reduce context to keep responses fast. Works great for focused tasks within a few files. - -When you need to [optimize context management](/blog/guide/mechanics/context-management) across large projects, Claude Code's reliable 200k capacity wins. For quick edits, Cursor's speed matters more. - -## [Pricing Comparison](#pricing-comparison) - -| Feature | Claude Code | Cursor | -| --- | --- | --- | -| **Base Cost** | $0 (CLI tool) | Free plan available | -| **Model Access** | $20-$100/month (Anthropic usage) | $20-$200/month (flat tier) | -| **Billing** | Usage-based (pay per token) | Fixed subscription with caps | -| **Best For** | Variable usage patterns | Predictable monthly cost | - -Claude Code costs what you use. Heavy month = higher bill. Light month = lower bill. Cursor gives predictable pricing but caps premium model usage on lower tiers. - -Check our [troubleshooting guide](/blog/guide/troubleshooting) if you hit usage limits on either platform. - -## [Best Use Cases](#best-use-cases) - -**Choose Claude Code when**: - -- Building new features from scratch autonomously -- Refactoring across entire codebase -- Generating comprehensive documentation -- Need reliable 200k-token context for complex tasks -- Prefer terminal workflows over GUI -- Want to learn [agent-based development patterns](/blog/guide/agents/agent-fundamentals) - -**Choose Cursor when**: - -- Need real-time autocomplete while coding -- Want familiar VS Code interface -- Working on focused, file-by-file edits -- Prefer GUI over terminal -- Need fast, interactive coding assistance -- Standard IDE experience with AI enhancement - -## [Performance: Real-World Testing](#performance-real-world-testing) - -Multiple developer tests show: - -- **Cursor**: Faster setup, better for Docker/deployment tasks, higher code quality in reviews -- **Claude Code**: Superior for rapid prototypes, terminal-friendly, handles autonomous operations better - -Many developers use **both together**: Cursor for daily coding, Claude Code for complex autonomous tasks. - -## [Try Both and See](#try-both-and-see) - -Install both tools (commands above). Spend 30 minutes with each. The right choice becomes obvious once you experience the terminal vs IDE difference. - -**Next steps**: - -- New to Claude Code? Start with [installation guide](/blog/guide/installation-guide) -- Want autonomous workflows? Learn about [task distribution patterns](/blog/guide/agents/task-distribution) -- Ready for advanced usage? Check [planning modes](/blog/guide/mechanics/planning-modes) -- Exploring MCP extensions? See [MCP basics](/blog/tools/mcp-extensions/mcp-basics) - -The terminal-first vs IDE-native split defines everything else. Pick based on where you code, not which AI model you prefer (both use Claude). - -Last updated on - -[Previous - -Claude Code VS Code](/blog/tools/extensions/claude-code-vscode)[Next - -GEO Guide](/blog/tools/extensions/ai-seo-geo-optimization) diff --git a/docs/site/src/content/blog/claude-code-vscode.md b/docs/site/src/content/blog/claude-code-vscode.md deleted file mode 100644 index a8ca0df0..00000000 --- a/docs/site/src/content/blog/claude-code-vscode.md +++ /dev/null @@ -1,176 +0,0 @@ ---- -slug: "claude-code-vscode" -title: "Claude Code VS Code Extension: Setup & Integration Guide" -description: "Connect Claude Code to VS Code for the best of both worlds. Terminal power meets IDE convenience with this complete integration setup guide." -date: "2025-11-13" -author: "Max Ritter" -tags: [Guide, Tools] -readingTime: 5 -keywords: "claude, code, extension, guide, integration, setup, vs, vscode" ---- - -Extensions - -# Claude Code VS Code Extension: Setup & Integration Guide - -Connect Claude Code to VS Code for the best of both worlds. Terminal power meets IDE convenience with this complete integration setup guide. - -**Problem**: Want Claude Code's terminal power inside VS Code? - -Here's your 2-minute quick win: Open VS Code, go to Extensions (Ctrl+Shift+X), and search "Claude Code". Install the official Anthropic extension (2M+ installs, verified publisher). - -Click the Spark icon in your sidebar, and Claude Code runs directly in your IDE. No terminal switching. No context loss. Over 2 million developers already use it. - -## [Why Use Claude Code in VS Code](#why-use-claude-code-in-vs-code) - -The Claude Code VS Code extension brings terminal AI power into your IDE: - -- **Autonomous exploration**: Claude reads, writes, and navigates your codebase independently -- **Real-time diffs**: See changes as inline diffs with accept/reject buttons -- **Subagents**: Run parallel AI tasks for complex multi-file operations -- **Custom slash commands**: Access CLI commands directly in the extension -- **MCP support**: Use [MCP servers](/blog/tools/mcp-extensions/mcp-basics) for browser automation and search -- **Extended thinking**: Toggle Claude's reasoning visibility for [deep thinking](/blog/guide/performance/deep-thinking-techniques) -- **Plan mode**: Review and edit Claude's [plans](/blog/guide/mechanics/planning-modes) before accepting changes - -Your [first project](/blog/guide/first-project) becomes faster when Claude edits files directly in your workspace. - -## [Installing the Claude Code Extension](#installing-the-claude-code-extension) - -**Via VS Code Marketplace** (recommended): - -1. Open VS Code -2. Click Extensions (Ctrl+Shift+X) -3. Search "Claude Code" -4. Install the official Anthropic extension (verified publisher badge) - -**Requirements**: VS Code 1.98.0+ and one of these: - -- Claude Pro or Max subscription -- Team or Enterprise plan -- API key (pay-as-you-go) - -Check your setup with our [installation guide](/blog/guide/installation-guide). The extension also works with Cursor, Windsurf, and VSCodium. - -## [Setting Up Your First Session](#setting-up-your-first-session) - -Click the Spark icon in the VS Code sidebar to open Claude Code. Start a new conversation with `Cmd+N` (Mac) or `Ctrl+N` (Windows). - -Ask Claude something practical: - -```p-4 -Create a React component with useState hook for a counter -``` - -Watch the real-time diff appear. Drag the sidebar wider to see inline diffs: - -1. **Highlighted changes** showing what Claude wants to add -2. **Accept/Reject buttons** at the diff level -3. **File preview** before committing - -Accept the changes. Code appears in your workspace immediately. - -Want modifications? Just ask: - -```p-4 -Add a reset button to the counter -``` - -Claude updates the same file with another diff. You maintain full control. Learn more in our [configuration basics](/blog/guide/configuration-basics) guide. - -## [Configuration Options](#configuration-options) - -### [Extended Thinking Mode](#extended-thinking-mode) - -Toggle Claude's reasoning visibility with the Extended Thinking button (bottom-right of prompt input). See Claude's thought process before changes - invaluable for debugging complex logic. - -### [Auto-Accept Mode](#auto-accept-mode) - -Enable auto-accept to automatically apply Claude's changes. Best for trusted workflows where you want to watch implementation without interruption. - -### [File Attachments](#file-attachments) - -Drag files into the chat or use @-mentions: - -```p-4 -@readme.md explain this project structure -@src/components/Header.tsx refactor to TypeScript generics -``` - -Claude already knows your workspace context. No manual setup needed. - -### [Multiple Sessions](#multiple-sessions) - -Run separate Claude sessions per workspace folder - perfect for microservices. Each session maintains its own context. Learn about [agent workflows](/blog/guide/agents/agent-fundamentals) for advanced patterns. - -## [Terminal Setup in VS Code](#terminal-setup-in-vs-code) - -The VS Code integrated terminal needs a small configuration to support **Shift+Enter** for multi-line prompts. Run `/terminal-setup` inside a Claude Code session and it auto-configures the keybinding for you. No manual editing required. - -If you prefer multi-line input through Option+Enter, open Settings, then Profiles, then Keys, and set the Left/Right Option key to "Esc+". - -For the full terminal optimization walkthrough, see the [terminal setup guide](/blog/guide/terminal-setup-guide). - -### [Windows-Specific Keybindings](#windows-specific-keybindings) - -On Windows, two default keybindings differ from macOS: - -- **Alt+V** for image paste (instead of Ctrl+V, which is reserved for clipboard paste) -- **Meta+M** for cycling permission modes on older Node.js versions (below 24.2.0 or 22.17.0) that lack VT mode support - -These are the defaults, but you can customize any shortcut through the [keybindings configuration](/blog/tools/keybindings-guide). - -### [Controlling Extension Auto-Installation](#controlling-extension-auto-installation) - -Claude Code's CLI automatically installs the VS Code extension when it detects a VS Code environment. To prevent this behavior, set the environment variable: - -```p-4 -export CLAUDE_CODE_IDE_SKIP_AUTO_INSTALL=1 -``` - -This is useful when managing extension installations through a corporate policy, using a locked-down VS Code profile, or running Claude Code in CI/CD pipelines where the extension is not needed. - -## [When Things Go Wrong](#when-things-go-wrong) - -| Error | Fix | -| --- | --- | -| Extension not loading | Update VS Code to 1.98.0+ (`code --version`) | -| Claude not responding | `Ctrl+Shift+P` → "Developer: Reload Window" | -| Authentication failed | Verify Pro/Max/Team/Enterprise subscription or API key | -| Never gets a response | Check internet, start new conversation, try CLI fallback | - -See our [troubleshooting guide](/blog/guide/troubleshooting) for more fixes. - -## [Enterprise: Third-Party Providers](#enterprise-third-party-providers) - -Using Amazon Bedrock or Google Vertex AI? Add to your settings.json: - -```p-4 -{ - "env": { - "CLAUDE_CODE_USE_BEDROCK": "1", - "AWS_REGION": "us-east-2" - } -} -``` - -Disable login prompts with `"claudeCode.disableLoginPrompt": true`. - -## [You Can Now Code with Claude in VS Code](#you-can-now-code-with-claude-in-vs-code) - -- You connected terminal AI power to your IDE -- Try next: [MCP extensions](/blog/tools/mcp-extensions/mcp-basics) for browser automation -- Go deeper: [Agent workflows](/blog/guide/agents/agent-fundamentals) for multi-step tasks -- Compare: [Claude Code vs Cursor](/blog/tools/extensions/claude-code-vs-cursor) -- Configure: [Terminal setup](/blog/guide/terminal-setup-guide) and [keyboard shortcuts](/blog/tools/keybindings-guide) for your workflow -- Customize: [Settings reference](/blog/guide/settings-reference) for all configuration options - -The extension updates regularly. Currently in beta - [report issues on GitHub](https://github.com/anthropics/claude-code/issues). - -Last updated on - -[Previous - -Custom Integrations](/blog/tools/mcp-extensions/custom-integrations)[Next - -Claude Code vs Cursor](/blog/tools/extensions/claude-code-vs-cursor) diff --git a/docs/site/src/content/blog/claude-haiku-4-5.md b/docs/site/src/content/blog/claude-haiku-4-5.md deleted file mode 100644 index 8573db14..00000000 --- a/docs/site/src/content/blog/claude-haiku-4-5.md +++ /dev/null @@ -1,86 +0,0 @@ ---- -slug: "claude-haiku-4-5" -title: "Claude Haiku 4.5: Fast, Cheap, and Surprisingly Capable" -description: "Claude Haiku 4.5 launched October 2025 as the budget model in the 4.5 family. Smart model switching made it the default for routine Claude Code tasks." -date: "2025-10-15" -author: "Max Ritter" -tags: [Reference, Models] -readingTime: 4 -keywords: "4, 45, 5, capable, cheap, claude, fast, haiku, surprisingly" ---- - -# Claude Haiku 4.5: Fast, Cheap, and Surprisingly Capable - -Claude Haiku 4.5 launched October 2025 as the budget model in the 4.5 family. Smart model switching made it the default for routine Claude Code tasks. - -Claude Haiku 4.5 launched on October 15, 2025, as the smallest and cheapest model in the 4.5 family. Its real impact came from Claude Code's smart model switching feature, which automatically routed simple tasks to Haiku while reserving heavier models for complex work. - -## [Key Specs](#key-specs) - -| Spec | Details | -| --- | --- | -| **API ID** | `claude-haiku-4-5-20251001` | -| **Release Date** | October 15, 2025 | -| **Context Window** | 200K tokens | -| **Max Output** | 8,192 tokens | -| **Pricing** | Budget tier (significantly cheaper than Sonnet) | -| **Status** | Active | - -## [What Haiku 4.5 Brought to the Table](#what-haiku-45-brought-to-the-table) - -Haiku 4.5 was not built to replace Sonnet or Opus. It was built to handle the 30-40% of Claude Code tasks that do not require heavy reasoning, and to handle them fast and cheap. - -**Smart model switching.** This was the headline feature. Claude Code began automatically routing simpler tasks to Haiku 4.5: file reads, quick edits, simple questions, boilerplate generation, and straightforward refactors. Users did not have to manually switch models. The system made the call. - -**Pro plan availability.** Haiku 4.5 was added for Claude Code Pro plan users, making intelligent model routing available without API billing. This expanded the practical value of the Pro subscription significantly. - -**Speed.** Haiku models are fast. For tasks where you are waiting for a quick answer or a simple file edit, the lower latency was noticeable. Responses that took 3-5 seconds on Sonnet came back in under 2 seconds on Haiku. - -**Cost reduction.** For teams paying per token through the API, routing routine operations to Haiku cut daily costs substantially. The savings compounded quickly for teams running Claude Code across multiple developers. - -## [What Haiku 4.5 Is Good At](#what-haiku-45-is-good-at) - -The model handles routine development tasks well: - -- **File reading and summarization.** Scanning a file and answering questions about its contents. -- **Quick edits.** Small, targeted changes to existing code. -- **Simple questions.** "What does this function do?" or "What's the correct import path?" -- **Boilerplate generation.** Creating standard patterns, test scaffolding, and configuration files. -- **Commit messages and documentation.** Writing clear, conventional commit messages and inline documentation. - -## [Where Haiku 4.5 Falls Short](#where-haiku-45-falls-short) - -Know its limits. Do not rely on Haiku for: - -- **Complex architecture decisions.** Multi-system design requires the reasoning depth of [Sonnet 4.5](/blog/models/claude-sonnet-4-5) or Opus. -- **Multi-file refactoring.** Large-scale changes across many files need a model that can hold more context in its working memory. -- **Deep debugging.** Tracing subtle bugs through dependency chains demands stronger reasoning. -- **Nuanced code review.** Catching security issues, performance bottlenecks, and architectural anti-patterns requires more capability. - -Smart model switching handles this routing automatically in most cases. But if you are explicitly choosing a model for a complex task, reach for Sonnet or [Opus](/blog/models/model-selection). - -## [How It Compared to Previous Haiku Models](#how-it-compared-to-previous-haiku-models) - -Haiku 4.5 was a significant step up from earlier Haiku releases. Previous Haiku models felt like a different class of tool entirely. Haiku 4.5 closed the gap enough that for simple tasks, most users could not tell the difference between Haiku output and Sonnet output. - -The quality floor rose substantially. Earlier Haiku models would occasionally produce obviously wrong or incomplete code. Haiku 4.5 made those failures rare for its intended use cases. - -## [Current Status](#current-status) - -Haiku 4.5 remains active and is the current Haiku model available in Claude Code. It is accessible via the `haiku` alias or its full model ID. - -## [Related Pages](#related-pages) - -- [All Claude Models](/blog/models) for the complete model timeline -- [Sonnet 4.5](/blog/models/claude-sonnet-4-5) for the mid-tier daily driver -- [Opus 4.5](/blog/models/claude-opus-4-5) for the top-tier reasoning model -- [Model selection guide](/blog/models/model-selection) for strategic model switching -- [Usage optimization](/blog/guide/development/usage-optimization) for managing Claude Code costs - -Last updated on - -[Previous - -Sonnet 4.5](/blog/models/claude-sonnet-4-5)[Next - -Opus 4.1](/blog/models/claude-opus-4-1) diff --git a/docs/site/src/content/blog/claude-md-mastery.md b/docs/site/src/content/blog/claude-md-mastery.md deleted file mode 100644 index c79f40e4..00000000 --- a/docs/site/src/content/blog/claude-md-mastery.md +++ /dev/null @@ -1,554 +0,0 @@ ---- -slug: "claude-md-mastery" -title: "CLAUDE.md Mastery: Your AI's Operating System" -description: "CLAUDE.md is your AI's operating system, not documentation. Define orchestration, conversation management, and delegation patterns that work." -date: "2025-12-07" -author: "Max Ritter" -tags: [Guide, Workflow] -readingTime: 15 -keywords: "ais, claude, claudemd, mastery, md, operating, system" ---- - -Mechanics - -# CLAUDE.md Mastery: Your AI's Operating System - -CLAUDE.md is your AI's operating system, not documentation. Define orchestration, conversation management, and delegation patterns that work. - -Most guidance about CLAUDE.md gets it wrong. The common advice treats CLAUDE.md as project documentation - a place to describe your tech stack, list commands, and explain directory structure. This fundamentally misunderstands what CLAUDE.md should be. - -**CLAUDE.md is your central AI's operating system.** It defines how Claude operates, how conversations are managed, and how work gets delegated. Project-specific knowledge belongs in skills - modular, dynamically-loaded components that activate when relevant. - -## [Two Paradigms: Onboarding vs. Orchestration](#two-paradigms-onboarding-vs-orchestration) - -### [The Inferior Approach: Project Onboarding](#the-inferior-approach-project-onboarding) - -The conventional wisdom says CLAUDE.md should "onboard Claude to your codebase" by answering WHAT (tech stack), WHY (project purpose), and HOW (commands to run). Some even recommend keeping files under 60 lines. - -This approach has problems: - -**Priority saturation**: CLAUDE.md content receives **high priority** in Claude's context window - the model treats these instructions as authoritative. When you stuff everything into one file, all of it competes for that elevated attention. Your React patterns fight with your API guidelines, even when you're working on database migrations. High priority everywhere means priority nowhere. - -**Context waste**: If your CLAUDE.md describes React patterns for a React project, that context loads every session - even when you're working on database migrations or deployment scripts. - -**No behavioral control**: Listing your tech stack doesn't tell Claude how to approach problems, when to delegate, or how to manage complex multi-step work. - -**Repetition across projects**: Every new project needs a new CLAUDE.md explaining similar patterns, leading to inconsistent AI behavior across your work. - -**Static knowledge**: Project documentation becomes outdated. Your API patterns from six months ago may not reflect current best practices. - -The onboarding approach treats Claude as a contractor who needs to be briefed on each job. The orchestration approach treats Claude as an intelligent system that needs operational parameters. - -### [The Superior Approach: Orchestration Layer](#the-superior-approach-orchestration-layer) - -CLAUDE.md should define: - -1. **Operational workflows** - The sequence Claude follows for every request -2. **Context management strategy** - How to conserve and allocate context effectively -3. **Delegation patterns** - When to use sub-agents vs. handle directly -4. **Quality standards** - Coding practices, error handling, security requirements -5. **Coordination protocols** - How to manage parallel vs. sequential work - -Project-specific knowledge - your tech stack, patterns, conventions - lives in **skills** that load dynamically when relevant. This separation provides: - -- **Consistent AI behavior** across all projects -- **Efficient context usage** - domain knowledge loads only when needed -- **Portable expertise** - skills transfer between projects -- **Maintainable knowledge** - update a skill once, benefit everywhere - -## [Structuring Your CLAUDE.md](#structuring-your-claudemd) - -### [Core Principles Section](#core-principles-section) - -Start with the fundamental behaviors you want from your AI. These should apply universally, regardless of what project or task you're working on. - -```p-4 -## Core Principles - -### Skills-First Workflow - -**EVERY user request follows this sequence:** - -Request → Load Skills → Gather Context → Execute - -Skills contain critical workflows and protocols not in base context. -Loading them first prevents missing key instructions. - -### Context Management Strategy - -**Central AI should conserve context to extend pre-compaction capacity**: - -- Delegate file explorations and low-lift tasks to sub-agents -- Reserve context for coordination, user communication, and strategic decisions -- For straightforward tasks with clear scope: skip heavy orchestration, execute directly - -**Sub-agents should maximize context collection**: - -- Sub-agent context windows are temporary -- After execution, unused capacity = wasted opportunity -- Instruct sub-agents to read all relevant files, load skills, and gather examples -``` - -This establishes behavioral patterns that govern every interaction - not project facts that may or may not be relevant. - -### [Routing and Delegation Logic](#routing-and-delegation-logic) - -Define when Claude should handle work directly versus delegate to specialists: - -```p-4 -### Routing Decision - -**Direct Execution**: - -- Simple/bounded task with clear scope -- Single-component changes -- Quick fixes and trivial modifications - -**Sub-Agent Delegation**: - -- Complex/multi-phase implementations -- Tasks requiring specialized domain expertise -- Work that benefits from isolated context - -**Master Orchestrator**: - -- Ambiguous requirements needing research -- Architectural decisions with wide impact -- Multi-day features requiring session management -``` - -This routing logic ensures Claude makes intelligent decisions about work distribution rather than either doing everything itself or delegating unnecessarily. - -### [Operational Protocols](#operational-protocols) - -Define how Claude should coordinate work, especially when parallelism is possible: - -```p-4 -## Operational Protocols - -### Agent Coordination - -**Parallel** (REQUIRED when applicable): - -- Multiple Task tool invocations in single message -- Independent tasks execute simultaneously -- Bash commands run in parallel - -**Sequential** (ENFORCE for dependencies): - -- Database → API → Frontend -- Research → Planning → Implementation -- Implementation → Testing → Security - -### Quality Self-Checks - -Before finalizing code, verify: - -- All inputs have validation -- Authentication/authorization checks exist -- All external calls have error handling -- Import paths verified against existing codebase examples -``` - -### [Coding Standards and Practices](#coding-standards-and-practices) - -Include universal coding principles that should govern all work: - -```p-4 -## Coding Best Practices - -**Priority Order** (when trade-offs arise): -Correctness > Maintainability > Performance > Brevity - -### Task Complexity Assessment - -Before starting, classify: - -- **Trivial** (single file, obvious fix) → execute directly -- **Moderate** (2-5 files, clear scope) → brief planning then execute -- **Complex** (architectural impact, ambiguous requirements) → full research first - -Match effort to complexity. Don't over-engineer trivial tasks or under-plan complex ones. - -### Integration Safety - -Before modifying any feature: - -- Identify all downstream consumers using codebase search -- Validate changes against all consumers -- Test integration points to prevent breakage -``` - -## [The Rules Directory: Modular Instructions](#the-rules-directory-modular-instructions) - -As of Claude Code v2.0.64, you have another option for organizing instructions: the `.claude/rules/` directory. This solves the priority saturation problem by letting you distribute high-priority instructions across targeted files. - -**Key insight from Anthropic**: Rules files load with the **same high priority as CLAUDE.md**. The difference is you can scope when that priority applies using path targeting. - -### [When Rules Beat CLAUDE.md](#when-rules-beat-claudemd) - -The rules directory shines when your instructions have **domain boundaries**: - -```p-4 -.claude/rules/ -├── api-guidelines.md # Only relevant for API work -├── react-patterns.md # Only relevant for frontend -├── testing-rules.md # Only relevant for test files -└── security-rules.md # Only relevant for auth/payment code -``` - -Each file loads as project memory, but you can target rules to specific file patterns: - -```p-4 ---- -paths: src/api/**/*.ts ---- - -# API Development Rules - -- All endpoints must validate input with Zod -- Return consistent error shapes -``` - -This rule **only activates when Claude touches API files**. Your API guidelines stay out of the way during frontend work. - -### [The Instruction Priority Hierarchy](#the-instruction-priority-hierarchy) - -Think of it as layers combining priority level with loading behavior: - -| Layer | Priority | Contains | Loads | -| --- | --- | --- | --- | -| **CLAUDE.md** | High | Operational workflows, routing logic | Always | -| **Rules Directory** | High | Domain-specific guidelines | Always (filtered by path) | -| **Skills** | Medium | Reusable procedures, cross-project expertise | On-demand | -| **File contents** | Standard | Code, documentation | When read | - -**Use CLAUDE.md** for universal behavior that deserves constant high priority. **Use rules** for domain-specific instructions - they get high priority only when relevant files are in scope. **Use skills** for portable expertise - medium priority, loaded on-demand. - -For a deep dive into path-targeted rules and migration strategies, see the [Rules Directory guide](/blog/guide/mechanics/rules-directory). - -### [Loading CLAUDE.md from Additional Directories](#loading-claudemd-from-additional-directories) - -As of Claude Code v2.1.20, you can load CLAUDE.md files from directories outside your current project. This is particularly useful for monorepos, shared team standards, or multi-project workflows. - -**How it works:** - -```p-4 -# Enable the feature and specify additional directories -CLAUDE_CODE_ADDITIONAL_DIRECTORIES_CLAUDE_MD=1 claude --add-dir ../shared-standards - -# Multiple directories work too -CLAUDE_CODE_ADDITIONAL_DIRECTORIES_CLAUDE_MD=1 claude --add-dir ../shared-config ../team-rules -``` - -When enabled, Claude loads from each additional directory: - -- `CLAUDE.md` files -- `.claude/CLAUDE.md` files -- `.claude/rules/*.md` files - -**Why this matters vs. verbally referencing files:** - -| Approach | Loads Automatically | Persists Across Sessions | Context Efficient | -| --- | --- | --- | --- | -| `--add-dir` with env var | Yes | Yes | Yes (system memory) | -| "Read that CLAUDE.md" | No | No | No (costs tokens each time) | - -The `--add-dir` approach treats external CLAUDE.md files as proper system memory rather than conversation context. They load automatically, persist across sessions, and respect the priority hierarchy. - -**Practical use cases:** - -**Monorepo with shared standards:** - -```p-4 -company/ -├── shared-standards/ -│ └── CLAUDE.md # Company coding guidelines -├── apps/ -│ ├── web/ -│ │ └── CLAUDE.md # Web-specific rules -│ └── api/ -│ └── CLAUDE.md # API-specific rules -``` - -From the `web/` directory: - -```p-4 -CLAUDE_CODE_ADDITIONAL_DIRECTORIES_CLAUDE_MD=1 claude --add-dir ../../shared-standards -``` - -**Cross-project consistency:** Keep your personal development standards in a central location and load them into any project without duplicating files. - -**Team onboarding:** New team members can point to a shared directory containing team conventions, eliminating the "every project has slightly different CLAUDE.md" problem. - -**Updated priority hierarchy:** - -| Layer | Priority | Contains | Loads | -| --- | --- | --- | --- | -| **CLAUDE.md** | High | Operational workflows, routing logic | Always | -| **Rules Directory** | High | Domain-specific guidelines | Always (filtered by path) | -| **Additional Directories** | High | Shared/external CLAUDE.md files | When `--add-dir` specified | -| **Skills** | Medium | Reusable procedures, cross-project expertise | On-demand | -| **File contents** | Standard | Code, documentation | When read | - -**Note:** The environment variable `CLAUDE_CODE_ADDITIONAL_DIRECTORIES_CLAUDE_MD=1` must be set for this feature to work. The `--add-dir` flag alone only grants file access to those directories without loading their CLAUDE.md files. - -### [@import Syntax: A Simpler Alternative](#import-syntax-a-simpler-alternative) - -While `--add-dir` is powerful for loading entire external directories, there's a lighter-weight option for pulling in specific files. CLAUDE.md files support `@path/to/import` syntax for composable memory: - -```p-4 -See @README for project overview and @package.json for available npm commands. - -# Standards - -- coding guidelines @docs/coding-standards.md -- git workflow @docs/git-instructions.md -``` - -Both relative and absolute paths work. Relative paths resolve from the file containing the import, not from your working directory. - -**How this differs from `--add-dir`:** - -| Approach | Granularity | Loads | Requires env var | -| --- | --- | --- | --- | -| `@import` | Individual files | Specified files only | No | -| `--add-dir` | Entire directory | All CLAUDE.md + rules | Yes | - -**First-time approval**: When Claude Code encounters imports for the first time in a project, it shows an approval dialog listing the specific files. This is a one-time decision per project. Once declined, the dialog does not resurface and those imports remain disabled. - -**Recursive imports**: Imported files can themselves import additional files, with a max-depth of 5 hops. This lets you build layered instruction sets: - -```p-4 -# CLAUDE.md imports standards.md - -@.claude/standards.md - -# standards.md imports sub-files - -@.claude/standards/api.md -@.claude/standards/testing.md -``` - -Imports are not evaluated inside markdown code spans or code blocks, so code examples containing `@path` references won't trigger unintended loads. - -### [CLAUDE.local.md: Personal Project Preferences](#claudelocalmd-personal-project-preferences) - -For project-specific preferences that should not be shared with your team, use `CLAUDE.local.md`. This file is automatically added to `.gitignore` and loads alongside `CLAUDE.md` with the same priority. - -This is the right place for: - -- Your local dev server URLs and sandbox endpoints -- Personal test data preferences -- Branch naming conventions you prefer -- Editor and tool configurations specific to your setup - -**Git worktree tip**: Since `CLAUDE.local.md` only exists in one worktree, use a home-directory import to share personal instructions across all worktrees: - -```p-4 -# CLAUDE.local.md - -@~/.claude/my-project-instructions.md -``` - -### [Viewing Loaded Memory with /memory](#viewing-loaded-memory-with-memory) - -Use the `/memory` command to see what files are currently loaded into Claude's context and to open any memory file in your system editor. This is essential for debugging when instructions appear to be missing or when you need to verify that imports and rules are loading correctly. - -## [Skills: Where Domain Knowledge Lives](#skills-where-domain-knowledge-lives) - -Skills are the counterpart to your CLAUDE.md operating system. While CLAUDE.md defines **how** Claude operates, skills provide **what** Claude knows about specific domains. - -### [The Skills Architecture](#the-skills-architecture) - -Anthropic describes the distinction clearly: "Projects say 'here's what you need to know.' Skills say 'here's how to do things.'" - -Skills use progressive disclosure: - -1. **Metadata loads first** (~100 tokens) - enough to know when the skill is relevant -2. **Full instructions load when needed** (<5k tokens) -3. **Bundled files/scripts load only as required** - -This architecture means you can have dozens of skills available without overwhelming context. Claude accesses exactly what it needs, when it needs it. - -### [What Belongs in Skills](#what-belongs-in-skills) - -**Technology patterns**: - -- Framework conventions (React patterns, API design) -- Database operations and migrations -- Testing strategies and utilities - -**Domain workflows**: - -- Payment processing integrations -- Authentication implementations -- Deployment procedures - -**Project-specific context**: - -- Codebase navigation guides -- Architecture documentation -- Team conventions - -### [Example: Separating Concerns](#example-separating-concerns) - -Instead of putting this in CLAUDE.md: - -```p-4 -## About This Project - -FastAPI REST API for user authentication. -Uses SQLAlchemy for database operations. - -## Commands - -uvicorn app.main:app --reload -pytest tests/ -v -``` - -Create a `backend-api` skill: - -```p-4 -# Backend API Development Skill - -## Framework - -FastAPI with SQLAlchemy ORM, Pydantic validation. - -## Development Commands - -- `uvicorn app.main:app --reload` - Start dev server -- `pytest tests/ -v` - Run test suite -- `alembic upgrade head` - Apply migrations - -## Patterns - -[Detailed patterns, examples, conventions...] -``` - -Your CLAUDE.md references the skill system: - -```p-4 -### Key Skills - -`backend-api`, `frontend-react`, `database-ops`, `deployment` - -Load relevant skills before beginning domain-specific work. -``` - -Now the backend knowledge loads only during backend work, preserving context for everything else. - -## [The Line Count Debate](#the-line-count-debate) - -Some popular guidance recommends keeping CLAUDE.md under 60 lines, claiming Claude "ignores" longer files. This advice misunderstands how Claude processes context. - -**The reality**: Anthropic recommends skill files be 500 lines maximum. If a dynamically-loaded skill can effectively use 500 lines, your always-loaded CLAUDE.md can certainly use 200-400 lines for comprehensive operational instructions. - -The key isn't brevity - it's **relevance**. A 60-line file full of project-specific details that don't apply to every task wastes more effective context than a 300-line file of universally-applicable operational protocols. - -**The sweet spot is 200-400 lines** of: - -- Operational workflows (always relevant) -- Routing logic (always relevant) -- Quality standards (always relevant) -- Coordination protocols (always relevant) - -Not 60 lines of project facts that may or may not matter for any given task. - -## [Framework Evolution](#framework-evolution) - -Your CLAUDE.md should include instructions for its own improvement: - -```p-4 -### Framework Improvement - -**Recognize patterns that warrant updates:** - -**Update existing skill when**: - -- A workaround was needed for something the skill should have covered -- New library version changes established patterns -- A better approach was discovered during implementation - -**Create new skill when**: - -- Same domain-specific context needed across 2+ sessions -- A payment processor, API, or tool integration was figured out -- Reusable patterns emerged that will apply to future projects - -**Action**: Prompt user with: "This [pattern/workaround/integration] seems -reusable. Should I update [skill] or create a new skill to capture this?" -``` - -This creates a self-improving system where Claude actively identifies opportunities to enhance the framework. - -## [Why This Approach Works](#why-this-approach-works) - -### [Multi-Agent Orchestration](#multi-agent-orchestration) - -Modern Claude Code development increasingly involves sub-agents - specialized instances handling discrete tasks. Your CLAUDE.md defines how the central AI orchestrates these agents. - -As Anthropic notes, Opus 4.5 is explicitly trained to manage teams of sub-agents. Your CLAUDE.md should leverage this by defining: - -- When to delegate vs. handle directly -- How to construct sub-agent prompts -- How sub-agent results flow back to the main conversation - -### [Context Economics](#context-economics) - -Context is finite. Every token of project-specific documentation in CLAUDE.md is a token unavailable for actual work. The orchestration approach optimizes context allocation: - -- **CLAUDE.md**: Operational instructions (always needed) -- **Skills**: Domain knowledge (loaded on demand) -- **Sub-agents**: Fresh context for specialized work - -### [Consistency Across Projects](#consistency-across-projects) - -When CLAUDE.md defines behavior rather than project facts, you get consistent AI assistance regardless of what you're working on. The same routing logic, quality standards, and coordination patterns apply whether you're building a React app or a Python CLI tool. - -## [Quick Reference](#quick-reference) - -```p-4 -Request → Load Skills → Route Decision → Execute -``` - -**Routing**: - -- Simple/bounded task → Direct execution -- Complex/multi-phase → Sub-agent delegation or session management - -**CLAUDE.md Contains**: - -- Operational workflows -- Context management strategy -- Routing and delegation logic -- Quality standards -- Coordination protocols - -**Skills Contain**: - -- Tech stack specifics -- Framework patterns -- Project conventions -- Domain workflows - -## [Next Steps](#next-steps) - -1. **Audit your current CLAUDE.md**: Is it project documentation or operational instructions? -2. **Extract domain knowledge to skills**: Move tech stack, patterns, and conventions out of CLAUDE.md -3. **Define your operational workflows**: How should Claude approach every request? -4. **Establish routing logic**: When should Claude delegate vs. handle directly? -5. **Set quality standards**: What practices should govern all work? - -**Remember**: CLAUDE.md isn't documentation for Claude to read - it's an operating system for Claude to run. Define behavior, delegate knowledge to skills, and build a system that improves itself over time. - -For a complete system that builds on these principles, see our guide to [5 Claude Code best practices](/blog/guide/development/agentic-engineering-best-practices) that separate top developers. - -Last updated on - -[Previous - -Dynamic Starting Context](/blog/guide/mechanics/claude-code-session-context)[Next - -Rules Directory](/blog/guide/mechanics/rules-directory) diff --git a/docs/site/src/content/blog/claude-opus-4-1.md b/docs/site/src/content/blog/claude-opus-4-1.md deleted file mode 100644 index eec5279c..00000000 --- a/docs/site/src/content/blog/claude-opus-4-1.md +++ /dev/null @@ -1,77 +0,0 @@ ---- -slug: "claude-opus-4-1" -title: "Claude Opus 4.1: Incremental Refinement for Production Code" -description: "Claude Opus 4.1 shipped August 2025 as a focused update to Opus 4. Improved reliability and code quality for production engineering workflows." -date: "2025-08-05" -author: "Max Ritter" -tags: [Reference, Models] -readingTime: 3 -keywords: "1, 4, 41, claude, code, incremental, opus, production, refinement" ---- - -# Claude Opus 4.1: Incremental Refinement for Production Code - -Claude Opus 4.1 shipped August 2025 as a focused update to Opus 4. Improved reliability and code quality for production engineering workflows. - -Claude Opus 4.1 was a focused reliability update to Opus 4, released on August 5, 2025. Not a headline-grabbing capability leap, but the kind of refinement that production teams care about: fewer regressions, cleaner output, and more consistent behavior across long sessions. - -## [Key Specs](#key-specs) - -| Spec | Details | -| --- | --- | -| **API ID** | `claude-opus-4-1-20250805` | -| **Release Date** | August 5, 2025 | -| **Context Window** | 200K tokens | -| **Max Output** | 16,384 tokens | -| **Availability** | General Availability (GA) | -| **Status** | Superseded by Opus 4.5 | - -## [What Opus 4.1 Improved](#what-opus-41-improved) - -Anthropic positioned this as a stability release, and the improvements reflected that focus. - -**Code quality consistency.** Opus 4 occasionally produced inconsistent output quality, especially toward the end of long sessions. Opus 4.1 smoothed this out. The code you got in turn 50 was closer in quality to the code you got in turn 5. - -**Reduced regressions.** When refactoring or modifying existing code, Opus 4 sometimes broke adjacent functionality. Opus 4.1 showed measurable improvement in preserving working code while making requested changes. - -**Better error handling patterns.** The model generated more robust error handling by default, with fewer instances of swallowed exceptions or overly generic catch blocks. - -**Instruction adherence.** Tighter compliance with detailed specifications, particularly around formatting constraints, naming conventions, and architectural boundaries. - -## [How It Compared to Opus 4](#how-it-compared-to-opus-4) - -Think of this as a point release, not a major version. If Opus 4 was the foundation, Opus 4.1 was the quality-of-life patch. - -Users who ran Opus 4 for daily work noticed the difference immediately in reduced "cleanup passes." The model's first attempt was correct more often, which meant less time reviewing and fixing generated code. - -There was no significant change to pricing, context window size, or fundamental capabilities. The improvements were about doing the same things with fewer mistakes. - -## [Who Benefited Most](#who-benefited-most) - -Teams running Claude Code in production workflows got the most value from Opus 4.1. If you were using Opus 4 for: - -- Multi-file refactoring across large codebases -- CI/CD pipeline integration where code needed to pass tests on first generation -- Complex debugging sessions spanning dozens of tool calls -- Code review and security audit workflows - -Then Opus 4.1 reduced your iteration count and improved first-pass accuracy. - -## [Current Status](#current-status) - -Opus 4.1 has been superseded by [Opus 4.5](/blog/models/claude-opus-4-5), which brought dramatic cost reductions and token efficiency improvements. Opus 4.1 remains an important stepping stone in the model timeline, but there is no practical reason to select it over the current [Opus generation](/blog/models/model-selection). - -## [Related Pages](#related-pages) - -- [All Claude Models](/blog/models) for the complete model timeline -- [Claude 4 family](/blog/models/claude-4) for the generation overview -- [Sonnet 4.5](/blog/models/claude-sonnet-4-5) for the next major release -- [Model selection guide](/blog/models/model-selection) for choosing the right model today - -Last updated on - -[Previous - -Haiku 4.5](/blog/models/claude-haiku-4-5)[Next - -Claude 4](/blog/models/claude-4) diff --git a/docs/site/src/content/blog/claude-opus-4-5-guide.md b/docs/site/src/content/blog/claude-opus-4-5-guide.md deleted file mode 100644 index 494b0467..00000000 --- a/docs/site/src/content/blog/claude-opus-4-5-guide.md +++ /dev/null @@ -1,130 +0,0 @@ ---- -slug: "claude-opus-4-5-guide" -title: "Claude Opus 4.5 | Faster, Cheaper, Better for Developers" -description: "Claude Opus 4.5 cuts costs 67%, uses 76% fewer tokens, and masters multi-agent workflows. Here's how to use it in Claude Code today." -date: "2025-12-07" -author: "Max Ritter" -tags: [Reference, Models] -readingTime: 4 -keywords: "4, 45, 5, better, cheaper, claude, developers, faster, guide, opus" ---- - -# Claude Opus 4.5 | Faster, Cheaper, Better for Developers - -Claude Opus 4.5 cuts costs 67%, uses 76% fewer tokens, and masters multi-agent workflows. Here's how to use it in Claude Code today. - -Your Claude Code sessions burn through tokens too fast and cost too much. Opus 4.5 fixes both problems while writing better code than any previous model. - -Here's the headline: **67% cheaper pricing** ($5/$25 per million tokens, down from $15/$75) with **76% fewer output tokens** for the same work. Try it right now: - -```p-4 -claude config set model claude-opus-4-5-20251101 -claude -``` - -You're now running the most token-efficient coding model available. - -## [The Token Efficiency Revolution](#the-token-efficiency-revolution) - -This isn't marketing fluff. GitHub reports Opus 4.5 "surpasses internal coding benchmarks while cutting token usage in half." Replit says it "beats Sonnet 4.5 and competition on our internal benchmarks, using fewer tokens to solve the same problems." - -Here's what that looks like in practice: - -| Metric | Improvement | -| --- | --- | -| Output tokens vs Sonnet 4.5 | 76% reduction | -| Tool calls per task | 50% fewer | -| Long-running tasks | Up to 65% reduction | -| With Tool Search enabled | 85% reduction | - -Fewer tokens means faster responses, lower costs, and more headroom before hitting [context limits](/blog/guide/performance/context-preservation). - -## [Multi-Agent Mastery](#multi-agent-mastery) - -Opus 4.5 writes better prompts for sub-agents than any other model. Anthropic explicitly trained it for delegation. - -This matters when you're running parallel agents for testing, code generation, or [task distribution](/blog/guide/agents/task-distribution). Your primary agent orchestrates sub-agents more effectively: - -```p-4 -# Example: Running parallel browser tests -claude "Run 4 parallel test agents against staging - -test login flow, checkout, search, and user settings" -``` - -The model handles the coordination. Each sub-agent gets clear, specific instructions. Results synthesize back to you without the chaos of previous models. - -## [The Effort Parameter](#the-effort-parameter) - -New API control for tuning speed vs thoroughness. Set it per-call without switching models: - -```p-4 -const response = await anthropic.messages.create({ - model: "claude-opus-4-5-20251101", - max_tokens: 8192, - thinking: { - type: "enabled", - budget_tokens: 10000, // Low: 1024, Medium: 5000, High: 10000+ - }, - messages: [{ role: "user", content: prompt }], -}); -``` - -Low effort for quick tasks. High effort for complex refactoring. You control the thinking budget. - -## [Auto-Compaction for Infinite Context](#auto-compaction-for-infinite-context) - -Hit 95% of your 200K context window? Claude automatically compacts earlier messages while preserving your full chat history. Alex Albert calls it "effectively infinite context." - -Manual control when you need it: - -```p-4 -/compact -``` - -Best practice: compact at logical milestones rather than waiting for automatic triggers. Preserves more detail where it matters. - -## [When Things Go Wrong](#when-things-go-wrong) - -**Error: "model not found"** - -Fix: Update your Claude Code installation: - -```p-4 -npm update -g @anthropic-ai/claude-code -``` - -**Error: "rate limit exceeded"** - -Fix: Opus 4.5 has separate limits from Sonnet. Check your plan tier or add a brief delay between requests. - -**Error: "context too long"** - -Fix: Use `/compact` manually or break your task into smaller chunks. See [memory optimization](/blog/guide/mechanics/memory-optimization) for advanced patterns. - -## [What This Means for Your Workflow](#what-this-means-for-your-workflow) - -Opus 4.5 isn't just an upgrade - it's a different approach to AI-assisted development: - -- **Delegate more**: Hand off complex coordination tasks you wouldn't trust to previous models -- **Run longer sessions**: Token efficiency means more work before compaction -- **Pay less**: 67% cost reduction at the same or better quality - -The model scores 80.9% on SWE-bench Verified (new high) and leads across 7 of 8 programming languages. Your code works the first time, not the fifth. - -## [Next Steps](#next-steps) - -- Configure your [model selection strategy](/blog/models/model-selection) for when to use Opus vs Sonnet -- Learn [sub-agent design patterns](/blog/guide/agents/sub-agent-design) to maximize delegation -- Set up [efficiency patterns](/blog/guide/performance/efficiency-patterns) for production workflows - -The convergence of premium intelligence with practical affordability is here. Faster, cheaper, and better at orchestration. Start building. - -> **Update**: [Claude Opus 4.6](/blog/models/claude-opus-4-6) is now available with 1M token context and native agent teams. See the [complete model timeline](/blog/models) for all Claude models. - -Last updated on - -[Previous - -Model Selection](/blog/models/model-selection)[Next - -Claude Opus 4.6](/blog/models/claude-opus-4-6) diff --git a/docs/site/src/content/blog/claude-opus-4-5.md b/docs/site/src/content/blog/claude-opus-4-5.md deleted file mode 100644 index 66567fe2..00000000 --- a/docs/site/src/content/blog/claude-opus-4-5.md +++ /dev/null @@ -1,88 +0,0 @@ ---- -slug: "claude-opus-4-5" -title: "Claude Opus 4.5: 67% Cheaper, 76% Fewer Tokens" -description: "Claude Opus 4.5 launched November 2025 with a 67% price cut to $5/$25 per million tokens and 76% fewer output tokens. The efficiency revolution for Claude Code." -date: "2025-11-24" -author: "Max Ritter" -tags: [Reference, Models] -readingTime: 4 -keywords: "4, 45, 5, 67, 76, cheaper, claude, fewer, opus, tokens" ---- - -# Claude Opus 4.5: 67% Cheaper, 76% Fewer Tokens - -Claude Opus 4.5 launched November 2025 with a 67% price cut to $5/$25 per million tokens and 76% fewer output tokens. The efficiency revolution for Claude Code. - -Claude Opus 4.5 launched on November 24, 2025, and rewrote the economics of AI-assisted development. A 67% price cut to $5/$25 per million tokens, combined with 76% fewer output tokens for equivalent work, made premium-tier intelligence accessible for daily use. - -## [Key Specs](#key-specs) - -| Spec | Details | -| --- | --- | -| **API ID** | `claude-opus-4-5-20251101` | -| **Release Date** | November 24, 2025 | -| **Context Window** | 200K tokens (standard), 1M tokens (with beta header) | -| **Max Output** | 16,384 tokens | -| **Pricing (Input)** | $5 per million tokens | -| **Pricing (Output)** | $25 per million tokens | -| **Previous Opus Pricing** | $15/$75 per million tokens | -| **SWE-bench Verified** | 80.9% (new high at release) | -| **Status** | Active, superseded by Opus 4.6 for latest features | - -## [What Opus 4.5 Brought to the Table](#what-opus-45-brought-to-the-table) - -Three headline changes defined this release: pricing, token efficiency, and multi-agent orchestration. - -**67% cheaper.** Opus 4 and 4.1 priced at $15 input / $75 output per million tokens. Opus 4.5 dropped to $5/$25. For teams running Opus through the API, this was an immediate and dramatic cost reduction. - -**76% fewer output tokens.** Opus 4.5 produced the same quality work with dramatically less output. Where [Sonnet 4.5](/blog/models/claude-sonnet-4-5) might generate 500 tokens to complete a task, Opus 4.5 often accomplished the same result in roughly 120 tokens. Less verbose, more precise. - -**50% fewer tool calls.** The model completed tasks with half the tool call overhead of previous generations. Fewer round trips meant faster task completion and lower cumulative costs. - -**With Tool Search enabled, the efficiency gains compounded to 85% token reduction.** Tool Search let the model discover and select the right tools dynamically, eliminating wasted calls to irrelevant tools. - -## [Multi-Agent Mastery](#multi-agent-mastery) - -Anthropic explicitly trained Opus 4.5 for delegation and sub-agent orchestration. This was not a side effect of general capability improvement. It was a targeted training objective. - -The result: Opus 4.5 writes better prompts for sub-agents, structures [task distribution](/blog/guide/agents/task-distribution) more effectively, and synthesizes results from parallel agents with less information loss. If you run multi-agent workflows in Claude Code, Opus 4.5 was the first model that made orchestration feel reliable rather than fragile. - -GitHub reported that Opus 4.5 "surpasses internal coding benchmarks while cutting token usage in half." Replit confirmed similar results on their internal evaluations. - -## [New Capabilities](#new-capabilities) - -**Effort parameter.** A new API control for tuning the thinking depth per request. Low effort for quick tasks, high effort for complex reasoning. You control the budget without switching models. - -**Auto-compaction.** When sessions hit 95% of the context window, the model automatically compacts earlier messages while preserving the full conversation thread. This created effectively unbounded session length for long engineering tasks. - -**1M token context window.** Available with a beta header via the API, matching the extended context capability introduced with [Sonnet 4.5](/blog/models/claude-sonnet-4-5). - -## [How It Compared to Sonnet 4.5](#how-it-compared-to-sonnet-45) - -This was the first Opus model where cost-per-task approached Sonnet territory. The raw per-token price was still higher ($5/$25 vs $3/$15), but the 76% reduction in output tokens frequently made Opus 4.5 cheaper per completed task. - -For complex work requiring deep reasoning, the math was clear: Opus 4.5 delivered better results at comparable or lower total cost. For routine tasks, [Sonnet 4.5](/blog/models/claude-sonnet-4-5) and [Haiku 4.5](/blog/models/claude-haiku-4-5) remained the more efficient choices. - -## [The Detailed Guide](#the-detailed-guide) - -This page covers the model profile and specs. For a comprehensive walkthrough of how to configure and use Opus 4.5 in Claude Code (including the effort parameter, auto-compaction, and multi-agent patterns), see the [Claude Opus 4.5 usage guide](/blog/models/claude-opus-4-5-guide). - -## [Current Status](#current-status) - -Opus 4.5 remains active and available through the API. It has been superseded by [Opus 4.6](/blog/models/claude-opus-4-6) for the latest features and capability improvements, but continues to serve as a reliable, well-understood model for production workflows. - -## [Related Pages](#related-pages) - -- [All Claude Models](/blog/models) for the complete model timeline -- [Haiku 4.5](/blog/models/claude-haiku-4-5) for the budget option in the same family -- [Opus 4.6](/blog/models/claude-opus-4-6) for the next generation -- [Opus 4.5 usage guide](/blog/models/claude-opus-4-5-guide) for hands-on configuration -- [Model selection guide](/blog/models/model-selection) for strategic model switching - -Last updated on - -[Previous - -Claude Opus 4.6](/blog/models/claude-opus-4-6)[Next - -Sonnet 4.5](/blog/models/claude-sonnet-4-5) diff --git a/docs/site/src/content/blog/claude-opus-4-6.md b/docs/site/src/content/blog/claude-opus-4-6.md deleted file mode 100644 index 73a90f38..00000000 --- a/docs/site/src/content/blog/claude-opus-4-6.md +++ /dev/null @@ -1,146 +0,0 @@ ---- -slug: "claude-opus-4-6" -title: "Claude Opus 4.6: Anthropic's Smartest Model Gets a Major Coding Upgrade" -description: "Claude Opus 4.6 leads Terminal-Bench 2.0, Humanity's Last Exam, and GDPval-AA. Better coding, 1M context beta, 128K output, and same $5/$25 pricing." -date: "2026-02-05" -author: "Max Ritter" -tags: [Reference, Models] -readingTime: 8 -keywords: "4, 46, 6, anthropics, claude, coding, gets, major, model, opus, smartest, upgrade" ---- - -# Claude Opus 4.6: Anthropic's Smartest Model Gets a Major Coding Upgrade - -Claude Opus 4.6 leads Terminal-Bench 2.0, Humanity's Last Exam, and GDPval-AA. Better coding, 1M context beta, 128K output, and same $5/$25 pricing. - -Claude Opus 4.6 is Anthropic's smartest model, upgraded. It plans more carefully, sustains agentic tasks for longer, operates more reliably in larger codebases, and has better code review and debugging skills to catch its own mistakes. In a first for Opus-class models, it also features a 1M token context window in beta and supports up to 128K output tokens. - -The model is state-of-the-art across several evaluations. It tops Terminal-Bench 2.0 for agentic coding, leads all frontier models on Humanity's Last Exam (a complex multidisciplinary reasoning test), and outperforms GPT-5.2 on GDPval-AA by around 144 Elo points and its own predecessor Opus 4.5 by 190 points. Pricing stays identical at $5/$25 per million tokens. - -## [Key Specs](#key-specs) - -| Spec | Details | -| --- | --- | -| **API ID** | `claude-opus-4-6` | -| **Release Date** | February 5, 2026 | -| **Context Window** | 200K tokens (standard), 1M tokens (beta) | -| **Max Output** | 128,000 tokens | -| **Pricing (Standard)** | $5 input / $25 output per 1M tokens | -| **Pricing (Extended 200K+)** | $10 input / $37.50 output per 1M tokens | -| **Status** | Active, current recommended Opus | - -## [What Changed: The Coding Improvements](#what-changed-the-coding-improvements) - -Anthropic builds Claude with Claude. Their engineers use Claude Code every day, and every new model gets tested on their own work first. With Opus 4.6, the improvements are specific and practical: - -**More careful planning.** The model thinks more deeply before settling on an approach. It revisits its reasoning, catches logical errors earlier, and produces more reliable first-pass results on complex tasks. - -**Longer agentic sessions.** Opus 4.6 sustains focus over longer sessions without the performance drift that affected earlier models. Multi-step workflows that span dozens of tool calls complete more reliably. - -**Better in large codebases.** Navigation, understanding, and modification of large projects improved. The model maintains better awareness of project structure and conventions across long sessions. - -**Stronger code review and debugging.** The model catches its own mistakes more effectively, writes more thorough reviews, and traces bugs through dependency chains with less hand-holding. - -**Faster on straightforward work.** Opus 4.6 focuses its deeper reasoning on the hardest parts of a task and moves quickly through the more straightforward parts. If the model overthinks a simpler task, dial effort down from its default (high) to medium with `/effort`. - -## [Benchmark Results](#benchmark-results) - -Opus 4.6 set new records across multiple categories: - -| Benchmark | Score | Notable Comparison | -| --- | --- | --- | -| **Terminal-Bench 2.0** | 65.4% | GPT-5.2: 64.7% | -| **GDPval-AA Elo** | 1,606 | 144 Elo above GPT-5.2, 190 above Opus 4.5 | -| **Humanity's Last Exam** | Leading | Highest among all frontier models | -| **BrowseComp** | Leading | Best at finding hard-to-locate information online | -| **OSWorld** | 72.7% | State-of-the-art for computer use | -| **MRCR v2 (8-needle)** | 76% | Sonnet 4.5: 18.5% | - -Terminal-Bench 2.0 is the one that matters most for Claude Code users. It measures real-world terminal task completion across coding, system administration, and file manipulation. Opus 4.6 taking the top spot means it is the strongest model available for the work developers actually do in their terminals. - -GDPval-AA measures performance on economically valuable knowledge work across finance, legal, and other professional domains. Opus 4.6 outperforms the industry's next-best model by a wide margin. - -The MRCR v2 score of 76% reflects a qualitative shift in how much context the model can actually use. A common complaint about AI models is "context rot" where performance degrades as conversations get longer. Opus 4.6 holds and tracks information over hundreds of thousands of tokens with less drift, and picks up buried details that even Opus 4.5 would miss. - -## [1M Token Context Window and 128K Output](#1m-token-context-window-and-128k-output) - -Opus 4.6 is the first Opus-class model with a 1M token context window, available in beta. Premium pricing applies for prompts exceeding 200K tokens ($10/$37.50 per million input/output tokens). - -The model also supports outputs of up to 128K tokens, up from the previous 16K limit. This lets Claude complete larger-output tasks, generate entire modules, or produce comprehensive analyses without breaking them into multiple requests. - -In Claude Code, the standard 200K context window still applies. The 1M window is currently available through the API with a beta header. Your existing [context preservation strategies](/blog/guide/performance/context-preservation) remain relevant for day-to-day Claude Code work. - -## [Safety Profile](#safety-profile) - -These intelligence gains do not come at the cost of safety. On Anthropic's automated behavioral audit, Opus 4.6 showed a low rate of misaligned behaviors including deception, sycophancy, encouragement of user delusions, and cooperation with misuse. It is just as well-aligned as Opus 4.5, which was the most-aligned frontier model to date. - -Opus 4.6 also shows the **lowest rate of over-refusals** of any recent Claude model, meaning fewer false blocks on legitimate requests. - -On the cybersecurity front, the model discovered **500+ previously unknown high-severity zero-day flaws** in open-source libraries. Anthropic is accelerating cyberdefensive uses, applying the model to help find and patch vulnerabilities in open-source software. For security-conscious teams, Opus 4.6 serves as a strong first-pass vulnerability scanner during code reviews. - -## [New API and Product Features](#new-api-and-product-features) - -Alongside the model upgrade, Anthropic shipped several features: - -**Adaptive thinking.** Previously, extended thinking was binary (on or off). Now Claude decides when deeper reasoning would be helpful. At the default effort level (high), the model uses extended thinking when useful. Developers can adjust this with four effort levels: low, medium, high (default), and max. - -**Context compaction (beta).** Long-running conversations that approach the context window now get automatically summarized and compacted, letting Claude perform longer tasks without hitting limits. - -**Agent teams (Claude Code research preview).** Multiple Claude instances can now work in parallel as a coordinated team. Best for tasks that split into independent, read-heavy work like codebase reviews. See the full [agent teams guide](/blog/guide/agents/agent-teams) for details. - -**Claude in PowerPoint (research preview).** Claude reads your layouts, fonts, and slide masters to stay on brand, whether building from a template or generating a full deck from a description. Available for Max, Team, and Enterprise plans. - -## [Pricing](#pricing) - -No price increase. Opus 4.6 costs the same as Opus 4.5: - -| Tier | Cost | -| --- | --- | -| **Standard context** (up to 200K) | $5 input / $25 output per 1M tokens | -| **Extended context** (200K+, beta) | $10 input / $37.50 output per 1M tokens | -| **Pro plan** | $20/month | -| **Max plan** | $100/month | - -If you have been running Opus 4.5 and managing your [usage and costs](/blog/guide/development/usage-optimization), the upgrade is pure upside at the same price. - -## [How to Use Opus 4.6 in Claude Code](#how-to-use-opus-46-in-claude-code) - -Switch your default model with one command: - -```p-4 -claude config set model claude-opus-4-6 -``` - -For per-session overrides without changing your default: - -```p-4 -claude --model claude-opus-4-6 -``` - -The model is available across all platforms: claude.ai, the Messages API, AWS Bedrock, and Google Vertex AI. The API model identifier is `claude-opus-4-6`. - -## [Opus 4.6 vs Opus 4.5: What Changed](#opus-46-vs-opus-45-what-changed) - -| Feature | Opus 4.5 | Opus 4.6 | -| --- | --- | --- | -| **Context window** | 200K (standard), 1M (API beta) | 200K (standard), 1M (API beta) | -| **Max output tokens** | 16,384 | 128,000 | -| **Terminal-Bench 2.0** | Not tested on v2.0 | 65.4% (highest) | -| **GDPval-AA Elo** | 1,416 | 1,606 (+190 points) | -| **MRCR v2** | Not tested | 76% | -| **Over-refusals** | Low | Lowest of any recent model | -| **Adaptive thinking** | Not available | Built in | -| **Context compaction** | Auto at 95% | Configurable threshold (beta) | -| **Standard pricing** | $5/$25 per 1M | $5/$25 per 1M (unchanged) | - -The core improvements are in coding quality and sustained agentic performance. Everything Opus 4.5 did well (token efficiency, multi-agent delegation, the effort parameter) carries forward. The 128K output limit and adaptive thinking are practical upgrades for everyday Claude Code use. - -For [model selection](/blog/models/model-selection), the calculus is simple. Use Opus 4.6 for complex work where reasoning depth matters. Use Sonnet for fast iteration on smaller tasks where speed trumps depth. The pricing parity means there is no cost reason to stay on the older model. - -Last updated on - -[Previous - -Claude Opus 4.5 Guide](/blog/models/claude-opus-4-5-guide)[Next - -Opus 4.5](/blog/models/claude-opus-4-5) diff --git a/docs/site/src/content/blog/claude-skills-guide.md b/docs/site/src/content/blog/claude-skills-guide.md deleted file mode 100644 index ae252be8..00000000 --- a/docs/site/src/content/blog/claude-skills-guide.md +++ /dev/null @@ -1,159 +0,0 @@ ---- -slug: "claude-skills-guide" -title: "Claude Skills: Stop Repeating Instructions Forever" -description: "Skills are Claude Code's missing link between prompts and MCP. Load instructions on-demand, save context, give Claude domain expertise." -date: "2025-12-07" -author: "Max Ritter" -tags: [Guide, Workflow] -readingTime: 4 -keywords: "claude, forever, guide, instructions, repeating, skills, stop" ---- - -Mechanics - -# Claude Skills: Stop Repeating Instructions Forever - -Skills are Claude Code's missing link between prompts and MCP. Load instructions on-demand, save context, give Claude domain expertise. - -**Problem**: You type the same instructions into Claude Code every session. "Follow our brand guidelines." "Use our deployment process." "Check security patterns first." Context wasted. Time lost. Instructions forgotten. - -**Quick Win**: Create your first skill right now: - -```p-4 -.claude/skills/my-skill/SKILL.md -``` - -```p-4 ---- -name: code-review -description: Reviews code for security and performance issues ---- - -# Code Review Process - -1. Check for SQL injection vulnerabilities -2. Verify input validation exists -3. Confirm error handling patterns -``` - -That is a complete skill. Drop it in your project, and Claude automatically loads it when you ask for code review. - -## [What Are Skills?](#what-are-skills) - -**Skills are folders containing instructions that Claude discovers and loads dynamically.** Think of them as specialized training manuals Claude references only when needed. - -Unlike prompts (which disappear after each conversation) or [MCP servers](/blog/tools/mcp-extensions/mcp-basics) (which connect to external tools), skills teach Claude *how to do things*. They encode procedural knowledge: workflows, guidelines, checklists, and domain expertise. - -Simon Willison noted this efficiency: "Each skill only takes up a few dozen extra tokens, with the full details only loaded in should the user request a task that the skill can help solve." - -## [How Progressive Disclosure Works](#how-progressive-disclosure-works) - -Skills use a two-stage loading system that saves your [context window](/blog/guide/performance/context-preservation): - -**Stage 1 - Metadata Only (~100 tokens)**: Claude sees skill names and descriptions. Just enough to know what is available. - -**Stage 2 - Full Instructions (when needed)**: Only when Claude determines a skill matches your task does it load full instructions—typically under 5,000 tokens. - -```p-4 -my-skill/ -├── SKILL.md # Core instructions (loads when needed) -├── scripts/ # Automation scripts -├── references/ # Documentation Claude can read -└── assets/ # Templates and files -``` - -This architecture means you can have dozens of skills available without overwhelming Claude's working memory. - -## [Skills vs Everything Else](#skills-vs-everything-else) - -Where do skills fit in Claude's ecosystem? - -| Feature | Skills | Prompts | Projects | MCP | -| --- | --- | --- | --- | --- | -| **What it provides** | Procedural knowledge | Moment instructions | Background knowledge | Tool connectivity | -| **Persistence** | Across conversations | Single conversation | Within project | Always connected | -| **When it loads** | Dynamically, as needed | Each turn | Always in project | Always available | -| **Best for** | Workflows and expertise | Quick requests | Reference documents | External data access | - -**Key distinction**: Projects say "here's what you need to know." Skills say "here's how to do things." [MCP](/blog/tools/mcp-extensions/mcp-basics) says "here's how to connect." - -## [When to Create a Skill](#when-to-create-a-skill) - -**The rule**: If you type the same prompt across multiple conversations, create a skill instead. - -**Good candidates for skills**: - -- Brand guidelines and style rules -- Code review checklists -- Deployment procedures -- Security audit patterns -- Documentation templates -- [Git commit conventions](/blog/guide/development/git-integration) - -**Not ideal for skills**: - -- One-time requests -- Project-specific context (use Projects instead) -- External API access (use MCP instead) - -## [Writing an Effective SKILL.md](#writing-an-effective-skillmd) - -Every skill needs three components: - -```p-4 ---- -name: my-skill -description: What it does and WHEN to trigger it -allowed-tools: "Read,Write,Bash" ---- - -# Clear Purpose Statement - -## Step-by-Step Instructions - -1. First action -2. Second action -3. Expected output -``` - -**Critical**: The `description` field determines when Claude activates your skill. Be specific about triggers: "When user requests code review" beats "Helps with code." - -## [Pre-Built Skills from Anthropic](#pre-built-skills-from-anthropic) - -Anthropic maintains official skills you can use immediately: - -- **pdf**: Extract text and tables from PDF documents -- **docx**: Create and edit Word documents with tracked changes -- **xlsx**: Manipulate Excel spreadsheets -- **pptx**: Generate PowerPoint presentations -- **brand-guidelines**: Apply consistent styling - -Find them at [github.com/anthropics/skills](https://github.com/anthropics/skills) or create your own following their patterns. - -## [Common Mistakes](#common-mistakes) - -**Vague descriptions**: "This skill helps with documents" will not trigger reliably. Be specific. - -**Overloaded instructions**: Keep SKILL.md under 5,000 words. Use reference files for detailed documentation. - -**Missing boundaries**: Tell Claude what the skill does NOT do. Prevents inappropriate activation. - -## [Your Next Steps](#your-next-steps) - -1. **Create one skill** for your most repeated instruction -2. **Test triggering** with natural requests (not just explicit commands) -3. **Iterate** based on how it performs in real sessions -4. Explore [context management](/blog/guide/mechanics/context-management) to maximize your skill efficiency -5. Learn how skills fit into [context engineering](/blog/guide/mechanics/context-engineering) for production AI - -Skills transform Claude from a general assistant into a specialized expert without burning context tokens on repeated explanations. Your expertise becomes portable, reusable, and always available. - -Skills are one of five techniques that top agentic engineers use daily. See all five in our [Claude Code best practices](/blog/guide/development/agentic-engineering-best-practices) guide. - -Last updated on - -[Previous - -Context Buffer Management](/blog/guide/mechanics/context-buffer-management)[Next - -Dynamic Starting Context](/blog/guide/mechanics/claude-code-session-context) diff --git a/docs/site/src/content/blog/claude-sonnet-4-5.md b/docs/site/src/content/blog/claude-sonnet-4-5.md deleted file mode 100644 index cf8b20cc..00000000 --- a/docs/site/src/content/blog/claude-sonnet-4-5.md +++ /dev/null @@ -1,76 +0,0 @@ ---- -slug: "claude-sonnet-4-5" -title: "Claude Sonnet 4.5: The Best Coding Model Gets Better" -description: "Claude Sonnet 4.5 launched September 2025 with top intelligence across most tasks, 1M beta context, and best-in-class agent and coding performance." -date: "2025-09-29" -author: "Max Ritter" -tags: [Reference, Models] -readingTime: 4 -keywords: "4, 45, 5, best, better, claude, coding, gets, model, sonnet" ---- - -# Claude Sonnet 4.5: The Best Coding Model Gets Better - -Claude Sonnet 4.5 launched September 2025 with top intelligence across most tasks, 1M beta context, and best-in-class agent and coding performance. - -Claude Sonnet 4.5 launched on September 29, 2025, as the highest-intelligence Sonnet model at its price point. It delivered best-in-class coding and agent performance while maintaining the speed that made Sonnet the default choice for Claude Code daily use. - -## [Key Specs](#key-specs) - -| Spec | Details | -| --- | --- | -| **API ID** | `claude-sonnet-4-5-20250929` | -| **Alias** | `claude-sonnet-4-5` | -| **Release Date** | September 29, 2025 | -| **Context Window** | 200K tokens (standard), 1M tokens (beta) | -| **Max Output** | 16,384 tokens | -| **Pricing (Input)** | $3 per million tokens | -| **Pricing (Output)** | $15 per million tokens | -| **Extended Context** | Different pricing tier for 200K+ token windows | -| **Status** | Active, current recommended Sonnet | - -## [What Sonnet 4.5 Brought to the Table](#what-sonnet-45-brought-to-the-table) - -This release hit the sweet spot that Claude Code users care about most: high intelligence at a price that supports all-day use. - -**Top-tier intelligence.** At launch, Sonnet 4.5 scored highest across most evaluation tasks in its tier. Complex reasoning, nuanced code generation, and multi-step problem solving all showed measurable improvement over previous Sonnet models. - -**Best-in-class agent performance.** Agentic workflows (where Claude chains multiple tool calls together to accomplish a goal) became significantly more reliable. Fewer abandoned chains, better error recovery, and smarter decision-making about when to ask for clarification versus proceeding. - -**1M token context window (beta).** For users with long sessions or large codebases, the beta 1M context window meant working through entire features without hitting [context compaction](/blog/guide/performance/context-preservation). This required a beta header via the API or Console access, but it was a meaningful capability for extended engineering sessions. - -**Coding benchmark leadership.** SWE-bench scores, HumanEval pass rates, and real-world coding task completion all placed Sonnet 4.5 at or near the top of its class. The gap between Sonnet and Opus narrowed significantly with this release. - -## [How It Compared to Previous Models](#how-it-compared-to-previous-models) - -Relative to Sonnet 4, the jump was substantial. Sonnet 4.5 handled ambiguity better, produced more idiomatic code across a wider range of languages, and maintained coherence over longer conversations. - -Relative to [Opus 4.1](/blog/models/claude-opus-4-1), the comparison got interesting. Sonnet 4.5 matched or exceeded Opus 4.1 on many coding tasks while running faster and costing less. For most Claude Code workflows, Sonnet 4.5 became the better choice. - -The $3/$15 pricing (input/output per million tokens) kept it accessible for teams running Claude Code throughout the workday. At roughly one-fifth the cost of Opus models, Sonnet 4.5 delivered 90% or more of the capability. - -## [The Workhorse Model](#the-workhorse-model) - -Sonnet 4.5 became the model that most Claude Code users set as their default and rarely changed. The combination of speed, intelligence, and cost made it the obvious daily driver. - -For tasks requiring deeper reasoning, users would switch to [Opus](/blog/models/model-selection). For simple, quick tasks, [Haiku 4.5](/blog/models/claude-haiku-4-5) handled the job at a fraction of the cost. But Sonnet 4.5 covered the middle 90% of work without compromise. - -## [Current Status](#current-status) - -Sonnet 4.5 remains active and is the current recommended Sonnet model. It is available through the API using both its full model ID and the `sonnet` alias in Claude Code. - -## [Related Pages](#related-pages) - -- [All Claude Models](/blog/models) for the complete model timeline -- [Opus 4.1](/blog/models/claude-opus-4-1) for the previous generation's top model -- [Haiku 4.5](/blog/models/claude-haiku-4-5) for the budget-friendly option in the same family -- [Model selection guide](/blog/models/model-selection) for strategic model switching -- [Usage optimization](/blog/guide/development/usage-optimization) for managing costs across models - -Last updated on - -[Previous - -Opus 4.5](/blog/models/claude-opus-4-5)[Next - -Haiku 4.5](/blog/models/claude-haiku-4-5) diff --git a/docs/site/src/content/blog/claude-sonnet-4-6.md b/docs/site/src/content/blog/claude-sonnet-4-6.md deleted file mode 100644 index ac0aee9c..00000000 --- a/docs/site/src/content/blog/claude-sonnet-4-6.md +++ /dev/null @@ -1,135 +0,0 @@ ---- -slug: "claude-sonnet-4-6" -title: "Claude Sonnet 4.6: Opus-Level Intelligence at Sonnet Pricing" -description: "Claude Sonnet 4.6 brings Opus-level intelligence to the $3/$15 price point. 70% preferred over Sonnet 4.5 in coding, 1M context, and major computer use gains." -date: "2026-02-17" -author: "Max Ritter" -tags: [Reference, Models] -readingTime: 12 -keywords: "claude, sonnet, 4.6, model, coding, computer, use, pricing, benchmark, opus" ---- - -Models - -# Claude Sonnet 4.6: Opus-Level Intelligence at Sonnet Pricing - -Claude Sonnet 4.6 brings Opus-level intelligence to the $3/$15 price point. 70% preferred over Sonnet 4.5 in coding, 1M context, and major computer use gains. - -Claude Sonnet 4.6 delivers Opus-level intelligence at a price point that makes it practical for far more tasks. In Claude Code testing, developers preferred it over Sonnet 4.5 approximately 70% of the time. It was even preferred to Opus 4.5 (the November 2025 frontier model) 59% of the time. That is a mid-tier model beating the previous generation's flagship in head-to-head coding evaluations. - -Computer use took a major leap forward. The model hit 94% accuracy on insurance benchmarks, the highest of any model tested. And across enterprise document tasks, it matches Opus 4.6 on OfficeQA. Pricing stays at $3/$15 per million tokens. - -## Specifications - -| Spec | Details | -| --- | --- | -| **API ID** | `claude-sonnet-4-6` | -| **Release Date** | February 17, 2026 | -| **Context Window** | 200K tokens (standard), 1M tokens (beta) | -| **Max Output** | 16,384 tokens | -| **Pricing (Input)** | $3 per million tokens | -| **Pricing (Output)** | $15 per million tokens | -| **Status** | Active, current recommended Sonnet | - -## What Improved - -The improvements in Sonnet 4.6 are specific and practical. In long development sessions, the model reads context more carefully before modifying code, consolidates shared logic rather than duplicating it, and reduces the overengineering that made earlier models frustrating to work with. - -**Better context comprehension.** The model reads and understands existing code more thoroughly before making changes. It picks up on project conventions, avoids redundant patterns, and produces edits that fit the surrounding codebase. - -**Reduced overengineering.** When you ask for a simple fix, you get a simple fix. Sonnet 4.6 significantly cuts the hallucinations and false success claims that plagued earlier models. Fewer "I've refactored the entire module for you" responses when all you needed was a one-line change. - -**Stronger on complex tasks.** Bug detection improved enough that teams can now run Sonnet-level reviewers in parallel where they previously needed Opus. Complex code fixes across large codebases, including multi-step refactors and cross-file dependency chains, complete more reliably. - -**Improved design sensibility.** Frontend code generation produces more polished results. Better layouts, cleaner animations, and outputs that require fewer iterations to reach production quality. Early testers described the model as having "perfect design taste" for building frontend pages and data reports. - -**Long-horizon planning.** On Vending-Bench Arena, a strategic simulation benchmark, Sonnet 4.6 outperformed Sonnet 4.5 by investing in capacity early and pivoting to profitability in the final stretch. This kind of multi-step strategic reasoning translates directly to better performance on complex, branched tasks. - -## Benchmarks - -Sonnet 4.6 consistently performs at or above what previously required Opus-class models: - -| Metric | Result | -| --- | --- | -| **vs Sonnet 4.5 (Claude Code)** | 70% developer preference | -| **vs Opus 4.5 (Nov 2025)** | 59% developer preference | -| **Computer use (Pace insurance)** | 94% accuracy, highest model tested | -| **OfficeQA (Databricks)** | Matches Opus 4.6 | -| **Box heavy reasoning Q&A** | +15 percentage points over Sonnet 4.5 | -| **Prompt injection resistance** | Comparable to Opus 4.6 | - -The Claude Code preference numbers are the most telling for developers. A model at $3/$15 being preferred over Opus 4.5 (which was $5/$25) in 59% of coding sessions rewrites the value equation for daily development work. - -Third-party validation backs this up. Cursor's co-founder called it "a notable improvement over Sonnet 4.5 across the board, including long-horizon tasks and more difficult problems." GitHub reported "strong resolution rates and the kind of consistency developers need" on complex code fixes across large codebases. Cognition found it "meaningfully closed the gap with Opus on bug detection," letting them run more parallel reviewers without increasing cost. - -## Computer Use - -Computer use saw a major leap with Sonnet 4.6. The model navigates complex spreadsheets, fills multi-step web forms, and processes enterprise documents with substantially higher accuracy. Pace, an insurance technology company, reported 94% accuracy on their submission intake and first notice of loss workflows, making it the highest-performing model they have tested. - -Prompt injection resistance also improved. Sonnet 4.6 performs similarly to Opus 4.6 on prompt injection benchmarks, meaning computer use sessions are harder for adversarial content to derail. - -## Safety - -Intelligence gains did not come at the cost of safety. Anthropic's safety evaluations concluded that Sonnet 4.6 is "broadly warm, honest, prosocial, and at times funny" in character, with "very strong safety behaviors and no signs of major concerns around high-stakes forms of misalignment." - -Prompt injection resistance improved compared to Sonnet 4.5, performing on par with Opus 4.6. For teams deploying computer use or processing untrusted documents, this is a meaningful improvement in the model's ability to resist adversarial manipulation. - -## Platform Features - -Alongside the model, several platform features shipped or expanded: - -- **Claude in Excel with MCP.** The Claude in Excel add-in now supports MCP connectors, integrating with data providers like S&P Global, LSEG, Daloopa, PitchBook, Moody's, and FactSet. Available on Pro, Max, Team, and Enterprise plans. -- **Free tier upgrades.** Free plan users now get file creation, connectors, skills, and context compaction. Previously Pro-only features are becoming baseline capabilities. -- **Default on Free and Pro.** Sonnet 4.6 replaces Sonnet 4.5 as the default model for Free and Pro plan users on claude.ai and Claude Cowork. -- **Expanded tool access.** Web search with dynamic filtering, code execution, memory, programmatic tool calling, and tool search are all generally available with the new model. - -## Pricing - -No price increase. Sonnet 4.6 costs the same as Sonnet 4.5: - -| Tier | Cost | -| --- | --- | -| **Standard context** (up to 200K) | $3 input / $15 output per 1M tokens | -| **Pro plan** | $20/month | -| **Max plan** | $100/month | - -If you have been running Sonnet 4.5 and managing your [usage and costs](/blog/guide/development/usage-optimization), the upgrade is pure upside at the same price. - -## How to Use - -Switch your default model with one command: - -```p-4 -/model claude-sonnet-4-6 -``` - -For per-session overrides without changing your default, use the CLI flag. The model is available across all platforms: claude.ai (default for Free and Pro), Claude Cowork, the Messages API, Claude Code, Amazon Bedrock, and Google Vertex AI. The API model identifier is `claude-sonnet-4-6`. - -## Sonnet 4.5 vs 4.6 - -| Feature | Sonnet 4.5 | Sonnet 4.6 | -| --- | --- | --- | -| **Context window** | 200K (standard), 1M (beta) | 200K (standard), 1M (beta) | -| **Coding preference** | Baseline | 70% preferred over 4.5 | -| **vs Opus 4.5 (Nov)** | Below Opus tier | 59% preferred | -| **Computer use** | Good | 94% insurance benchmark (highest) | -| **OfficeQA** | Not reported | Matches Opus 4.6 | -| **Heavy reasoning Q&A** | Baseline | +15pp (Box evaluation) | -| **Instruction following** | Good | Significantly reduced overengineering | -| **Prompt injection** | Baseline | Comparable to Opus 4.6 | -| **Design quality** | Good | "Perfect design taste" (Triple Whale) | -| **Standard pricing** | $3/$15 per 1M | $3/$15 per 1M (unchanged) | - -The core improvements are in coding quality, computer use, and instruction following. Everything Sonnet 4.5 did well (speed, cost efficiency, agent performance) carries forward with a significant intelligence upgrade on top. - -## Model Selection - -For [model selection](/blog/models/model-selection), the calculus is straightforward. Use Sonnet 4.6 as your daily driver for fast iteration and the 90%+ of coding tasks where speed and cost matter. Use [Opus 4.6](/blog/models/claude-opus-4-6) for the deepest reasoning, codebase refactoring, multi-agent coordination, and precision-critical work. Opus 4.6 remains the top performer on Terminal-Bench 2.0 and Humanity's Last Exam. - -## Related - -- [All Claude Models](/blog/models) for the complete model timeline -- [Opus 4.6](/blog/models/claude-opus-4-6) for the top-tier option in the same generation -- [Sonnet 4.5](/blog/models/claude-sonnet-4-5) for the previous Sonnet release -- [Model selection guide](/blog/models/model-selection) for strategic model switching -- [Usage optimization](/blog/guide/development/usage-optimization) for managing costs across models diff --git a/docs/site/src/content/blog/configuration-basics.md b/docs/site/src/content/blog/configuration-basics.md deleted file mode 100644 index 919e7807..00000000 --- a/docs/site/src/content/blog/configuration-basics.md +++ /dev/null @@ -1,320 +0,0 @@ ---- -slug: "configuration-basics" -title: "3 Claude Code Config Files (Stop Generic Responses)" -description: "CLAUDE.md, MCP servers, and slash commands. Set up once and Claude Code knows your stack, conventions, and workflows every single session." -date: "2025-08-23" -author: "Max Ritter" -tags: [Guide] -readingTime: 8 -keywords: "3, basics, claude, code, config, configuration, files, generic, responses, stop" ---- - -# 3 Claude Code Config Files That Stop Generic Responses Forever - -CLAUDE.md, MCP servers, and slash commands. Set up once and Claude Code knows your stack, conventions, and workflows every single session. - -Configure Claude Code for your workflow in 3 steps. Proper setup separates productive sessions from frustrating ones. - -**Problem**: Claude Code gives generic responses because it lacks context about your project. - -**Quick Win**: Create a CLAUDE.md file in your project root: - -```p-4 -# Project Name: [Your App Name] - -## Tech Stack - -- Framework: React 18 / Next.js 15 / Express / Django -- Database: PostgreSQL / MongoDB / MySQL -- Deployment: Vercel / AWS / DigitalOcean - -## Current Priority - -[What you're working on this week] - -## Coding Rules - -- Use TypeScript for all new files -- Test critical functions -- Comment complex logic -- Use semantic commits - -## Don't Change - -- Authentication system (unless explicitly requested) -- Database schema (migration required) -- Production environment variables -``` - -**Result**: Claude now understands your project and gives contextual advice instead of generic tutorials. - -## [Step 1: Essential Project Configuration](#step-1-essential-project-configuration) - -Create your configuration files: - -```p-4 -touch CLAUDE.md # Project root - required -mkdir -p .claude/commands # Custom workflows - optional -``` - -**CLAUDE.md in project root (Required)** - Your project's AI briefing document: - -```p-4 -# [Project Name] - Development Context - -## What This Project Does - -[2-sentence description of your app's purpose] - -## Tech Stack & Version - -- Frontend: React 18.2.0 with TypeScript 5.0 -- Backend: Node.js with Express or Next.js App Router -- Database: PostgreSQL 15 with Prisma ORM -- Styling: Tailwind CSS 3.4 - -## File Structure -``` - -src/ -├── app/ # Next.js pages (App Router) -├── components/ # Reusable UI components -├── lib/ # Utilities and configurations -└── types/ # TypeScript definitions - -```p-4 -## Current Sprint Goals -- [ ] User authentication system -- [ ] Dashboard with user data -- [ ] API endpoints for CRUD operations - -## Never Touch Without Permission -- package.json dependencies (ask first) -- Database migrations (explain changes) -- Production environment variables -``` - -**Success Check**: Claude now mentions your tech stack and current goals in responses. - -## [Step 2: MCP Server Setup (Power Features)](#step-2-mcp-server-setup-power-features) - -MCP (Model Context Protocol) servers extend Claude's capabilities. Add this to your global settings at `~/.claude/settings.json`: - -```p-4 -{ - "mcpServers": { - "filesystem": { - "command": "npx", - "args": ["-y", "@modelcontextprotocol/server-filesystem"], - "env": { - "ACCESS_DIRECTORIES": "/Users/yourname/projects" - } - }, - "github": { - "command": "npx", - "args": ["-y", "@modelcontextprotocol/server-github"], - "env": { - "GITHUB_PERSONAL_ACCESS_TOKEN": "ghp_your_token_here" - } - } - } -} -``` - -**What This Enables**: - -- Claude can read/write files directly -- Search your GitHub repositories -- Access project documentation -- Understand your coding patterns - -**Success Check**: Claude can now access files and GitHub repos directly. - -## [Step 3: Custom Slash Commands](#step-3-custom-slash-commands) - -Create reusable workflows in `.claude/commands/`. Each markdown file becomes a slash command. - -**Debug Workflow** (`.claude/commands/debug.md`): - -```p-4 -# Debug Workflow - -When debugging: - -1. Reproduce the error in isolation -2. Check browser console and network tab -3. Add console.logs to trace execution -4. Test with minimal data -5. Check recent changes in git log -6. Ask before suggesting major architecture changes -``` - -**Test Generation** (`.claude/commands/test.md`): - -```p-4 -# Test Generation Guidelines - -For new functions: - -1. Write unit tests with Jest/Vitest -2. Test happy path and edge cases -3. Mock external dependencies -4. Use descriptive test names -5. Aim for 80% coverage on critical paths -``` - -**Usage**: Type `/debug` or `/test` in any Claude Code session to invoke these workflows. - -**Success Check**: Claude follows your documented processes consistently. - -## [Common Configuration Fixes](#common-configuration-fixes) - -**Error**: "MCP server not responding" -**Fix**: Check token permissions and directory paths in `settings.json` - -**Error**: "Context window exceeded" -**Fix**: Keep CLAUDE.md under 10KB. Split into multiple files if needed: - -```p-4 -# Main CLAUDE.md (keep short) - -See also: - -- .claude/database-schema.md (detailed schema) -- .claude/api-patterns.md (endpoint conventions) -``` - -**Error**: "Claude forgot my project details" -**Fix**: Verify CLAUDE.md exists in project root (not inside `.claude/` folder) - -**Error**: "Generic responses despite configuration" -**Fix**: Run `/init` to regenerate CLAUDE.md, or reference it explicitly in your prompt - -## [The settings.json Scope System](#the-settingsjson-scope-system) - -Beyond CLAUDE.md, Claude Code uses `settings.json` files to configure permissions, environment variables, model defaults, and tool behavior. Settings follow a **4-scope hierarchy** where more specific scopes override broader ones: - -| Scope | Location | Who It Affects | Shared? | -| --- | --- | --- | --- | -| **Managed** | System-level `managed-settings.json` | All users on the machine | Yes (deployed by IT) | -| **User** | `~/.claude/settings.json` | You, across all projects | No | -| **Project** | `.claude/settings.json` | All collaborators on the repo | Yes (committed to git) | -| **Local** | `.claude/settings.local.json` | You, in this repo only | No (gitignored) | - -**Precedence order** (highest to lowest): Managed > Command line args > Local > Project > User. Managed settings cannot be overridden, so organizational policies always apply. - -Add the `$schema` line to your settings.json for autocomplete and inline validation in VS Code, Cursor, or any editor that supports JSON schemas: - -```p-4 -{ - "$schema": "https://json.schemastore.org/claude-code-settings.json", - "permissions": { - "allow": ["Bash(npm run lint)", "Bash(npm run test *)"], - "deny": ["Read(./.env)", "Read(./.env.*)", "Read(./secrets/**)"] - }, - "env": { - "CLAUDE_CODE_ENABLE_TELEMETRY": "1" - } -} -``` - -Claude Code automatically creates timestamped backups of your configuration files and retains the five most recent backups, so you won't lose settings if something goes wrong. - -For the complete list of every settings key and its options, see our [settings reference guide](/blog/guide/settings-reference). - -### [Key Settings Categories](#key-settings-categories) - -Settings.json covers several categories that each have dedicated guides: - -- **Permissions** - Control which tools Claude can use, which files it can read, and which commands it can run. Define `allow`, `deny`, and `ask` rules. See [permission management](/blog/guide/development/permission-management). -- **Sandbox** - Isolate bash commands from your filesystem and network with OS-level enforcement. Enable with `/sandbox` or the `sandbox.enabled` setting. See our [sandboxing guide](/blog/guide/sandboxing-guide). -- **Attribution** - Customize or disable the `Co-Authored-By` trailer on git commits and PR descriptions. Configure separately for commits and PRs. -- **Plugins** - Extend Claude Code with skills, agents, hooks, and MCP servers distributed through marketplaces. Control with `enabledPlugins` and `extraKnownMarketplaces`. -- **Model** - Set a permanent default model via the `model` key instead of passing `--model` every session. See [model selection strategies](/blog/models/model-selection). -- **Status Line** - Display live context usage, git branch, model name, or cost data in a persistent status bar. See our [status line guide](/blog/tools/statusline-guide). -- **Keybindings** - Customize keyboard shortcuts with `/keybindings` to create `~/.claude/keybindings.json`. See our [keybindings guide](/blog/tools/keybindings-guide). - -## [Essential Environment Variables](#essential-environment-variables) - -Environment variables give you fine-grained control over Claude Code behavior. You can set them in your shell profile, pass them inline, or add them to the `env` key in settings.json. Here are the most useful ones for daily development: - -| Variable | What It Does | -| --- | --- | -| `ANTHROPIC_MODEL` | Set the default model (e.g., `claude-sonnet-4-20250514`) | -| `CLAUDE_CODE_MAX_OUTPUT_TOKENS` | Max output tokens per response. Default: 32,000. Max: 64,000 | -| `MAX_THINKING_TOKENS` | Control the extended thinking budget. Default: 31,999. Set to `0` to disable | -| `CLAUDE_AUTOCOMPACT_PCT_OVERRIDE` | Trigger auto-compaction at a specific context % (1-100) | -| `CLAUDE_CODE_SUBAGENT_MODEL` | Set the model for sub-agents separately from your main model | -| `BASH_DEFAULT_TIMEOUT_MS` | Default timeout for long-running bash commands | -| `BASH_MAX_OUTPUT_LENGTH` | Max characters in bash output before truncation | -| `CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC` | Disable auto-updates, telemetry, error reporting, and bug reports in one variable | -| `DISABLE_AUTOUPDATER` | Disable automatic updates only (set to `1`) | -| `CLAUDE_CODE_ENABLE_TASKS` | Set to `false` to revert to the previous TODO list system | -| `MAX_MCP_OUTPUT_TOKENS` | Max tokens in MCP tool responses (default: 25,000) | -| `MCP_TIMEOUT` | Timeout in ms for MCP server startup | -| `CLAUDE_CODE_SHELL` | Override automatic shell detection | -| `CLAUDE_CONFIG_DIR` | Store configuration and data files in a custom directory | -| `HTTP_PROXY` / `HTTPS_PROXY` | Route connections through a proxy server | - -Set variables inline for a single session or add them to your shell profile for persistence: - -```p-4 -# Single session -ANTHROPIC_MODEL=claude-sonnet-4-20250514 claude - -# Persistent (add to ~/.bashrc or ~/.zshrc) -export CLAUDE_AUTOCOMPACT_PCT_OVERRIDE=80 -export MAX_THINKING_TOKENS=10000 -``` - -Or configure them in settings.json so they apply automatically: - -```p-4 -{ - "env": { - "CLAUDE_AUTOCOMPACT_PCT_OVERRIDE": "80", - "MAX_THINKING_TOKENS": "10000" - } -} -``` - -For the full list of ~70 environment variables, see the [settings reference](/blog/guide/settings-reference). For terminal-specific setup like line breaks and notifications, see our [terminal setup guide](/blog/guide/terminal-setup-guide). - -## [Global vs Project Configuration](#global-vs-project-configuration) - -**Global Settings** (`~/.claude/settings.json`): - -- MCP server configurations -- Personal preferences and model defaults -- Universal coding standards - -**Project Settings** (project root): - -- `CLAUDE.md` - Project context and rules -- `.claude/commands/` - Custom slash commands -- `.claude/settings.json` - Team-shared permissions, hooks, and MCP servers -- `.claude/settings.local.json` - Your personal overrides for this project (gitignored) - -**Priority**: Managed > Local > Project > User. Use `/init` to auto-generate a starter CLAUDE.md. - -**Multi-Project Setup**: For monorepos or shared team standards, you can load CLAUDE.md files from additional directories using the `--add-dir` flag. See [Loading CLAUDE.md from Additional Directories](/blog/guide/mechanics/claude-md-mastery#loading-claudemd-from-additional-directories) for details. - -## [What's Next](#whats-next) - -You now have Claude Code configured for maximum productivity. Next steps: - -- **Try your first AI-powered build**: [Create your first project](/blog/guide/first-project) with proper configuration -- **Master advanced features**: Learn [terminal control techniques](/blog/guide/mechanics/terminal-main-thread) -- **Optimize performance**: Explore [context management strategies](/blog/guide/mechanics/context-management) -- **Add more power**: Set up [popular MCP servers](/blog/tools/mcp-extensions/best-addons) -- **Join the community**: Get help in our [troubleshooting guide](/blog/guide/troubleshooting) - -**Pro Tip**: Keep your CLAUDE.md updated. When you change tech stack or priorities, update the file. Claude's effectiveness depends on current context. - -Last updated on - -[Previous - -First Project](/blog/guide/first-project)[Next - -Terminal Setup](/blog/guide/terminal-setup-guide) diff --git a/docs/site/src/content/blog/context-buffer-management.md b/docs/site/src/content/blog/context-buffer-management.md deleted file mode 100644 index a13282fd..00000000 --- a/docs/site/src/content/blog/context-buffer-management.md +++ /dev/null @@ -1,297 +0,0 @@ ---- -slug: "context-buffer-management" -title: "Claude Code Context Buffer: The 33K-45K Token Problem" -description: "Claude Code reduced its autocompact buffer from 45K to 33K tokens. Learn what changed, what triggers autocompact, and workarounds." -date: "2026-01-26" -author: "Max Ritter" -tags: [Guide, Workflow] -readingTime: 9 -keywords: "33k45k, buffer, claude, code, context, management, problem, token" ---- - -Mechanics - -# Claude Code Context Buffer: Why 33K-45K Tokens Are Reserved (And What You Can Do About It) - -Claude Code reduced its autocompact buffer from 45K to 33K tokens. Learn what changed, what triggers autocompact, and workarounds. - -You hit 167K tokens. Claude compacts. You lose context. Every. Single. Time. - -Here's the frustrating truth: Claude Code reserves a chunk of your context window that you can't use. Until recently, that was 45,000 tokens (22.5% of 200K). **As of early 2026, the buffer has been reduced to ~33,000 tokens (16.5%)** - giving you roughly 12K more usable space. - -| What It Is | Current (2026) | Previous | Can You Change It? | -| --- | --- | --- | --- | -| Compaction buffer | ~33K tokens (16.5%) | ~45K tokens (22.5%) | No - hardcoded | -| Compaction trigger | ~83.5% usage | ~77-78% usage | Yes - `CLAUDE_AUTOCOMPACT_PCT_OVERRIDE` (1-100) | -| Usable context | ~167K tokens | ~155K tokens | Yes - use `sonnet[1m]` for 1M token window | - -This change was not announced in the official [Claude Code changelog](https://github.com/anthropics/claude-code/blob/main/CHANGELOG.md). The closest related entry is v2.1.21: *"Fixed auto-compact triggering too early on models with large output token limits"* - which likely adjusted how the buffer is calculated. The 45K figure still dominates online discussions and documentation, but `/context` now reports 33K on current versions. - -The buffer exists for legitimate reasons. But understanding exactly how it works makes the difference between fighting the system and working with it. - -## [How Auto-Compaction Actually Works](#how-auto-compaction-actually-works) - -Claude Code monitors your context usage continuously. When usage hits approximately 83.5% of the raw context window (up from the previous ~77-78%), auto-compaction triggers. - -> **Note:** Pilot Shell's status bar rescales this to an effective 0–100% range, where 83.5% raw = 100% effective. This means the bar fills completely right before compaction fires — no hidden buffer confusion. - -Here's what happens: - -1. Claude summarizes your conversation history -2. Older messages get replaced with a condensed summary -3. You lose granular details from early in the session -4. The session continues with reduced context - -For a 200K context window, compaction happens around 167K tokens of actual usage. That 33K buffer? It's not sitting idle. Claude uses it for the summarization process itself. - -### [The /context Command](#the-context-command) - -Run `/context` to see exactly where your tokens are going: - -```p-4 -claude-opus-4-5-20251101 · 76k/200k tokens (38%) - -System prompt: 2.7k tokens (1.3%) -System tools: 16.8k tokens (8.4%) -Custom agents: 1.3k tokens (0.7%) -Memory files: 7.4k tokens (3.7%) -Skills: 1.0k tokens (0.5%) -Messages: 9.6k tokens (4.8%) -Free space: 118k (58.9%) -Autocompact buffer: 33.0k tokens (16.5%) -``` - -That Messages line is your conversation history. Watch it grow. When free space hits zero (accounting for the buffer), compaction fires. - -## [Why the Buffer Exists](#why-the-buffer-exists) - -The ~33K buffer serves three purposes: - -1. **Working space for compaction** - The summarization process itself needs tokens to operate -2. **Completion buffer** - Allows current tasks to finish before compaction triggers -3. **Response generation space** - Claude needs working memory to reason and construct responses - -This buffer is hardcoded in Claude Code's architecture. Feature requests to make it configurable have been closed as duplicates. GitHub Issue [#15435](https://github.com/anthropics/claude-code/issues/15435) asked for this. The answer was no. - -## [The Output Tokens Misconception](#the-output-tokens-misconception) - -Many developers assume `CLAUDE_CODE_MAX_OUTPUT_TOKENS` controls the compaction buffer. - -It doesn't. - -| Variable | What It Controls | Default | -| --- | --- | --- | -| `CLAUDE_CODE_MAX_OUTPUT_TOKENS` | Max tokens per API response | 32K | -| (none - hardcoded) | Compaction buffer reservation | ~33K | - -These are completely separate mechanisms: - -- **Output tokens**: Limits how long a single Claude response can be -- **Compaction buffer**: Reserved context space that triggers auto-compaction - -Setting `CLAUDE_CODE_MAX_OUTPUT_TOKENS=16000` will shorten Claude's maximum response length. It will NOT give you more context before compaction triggers. The 33K buffer stays fixed. - -```p-4 -# This limits response length, NOT context buffer -export CLAUDE_CODE_MAX_OUTPUT_TOKENS=16000 -``` - -Use cases for reducing output tokens: - -- Faster responses (less to generate) -- Lower costs per response -- Force conciseness - -Your usable context before compaction? Still ~167K. - -One important caveat: while `CLAUDE_CODE_MAX_OUTPUT_TOKENS` doesn't change the compaction buffer, setting it to a very high value can reduce your *effective* context window. The output token allocation comes out of the same context window, so a larger output reservation means less room for conversation history and system context. The default of 32K is a reasonable balance for most workflows. - -## [The Real-World Impact](#the-real-world-impact) - -Consider a typical complex session: - -| Phase | Context Used | What Happens | -| --- | --- | --- | -| Start | 20K | System prompt, CLAUDE.md, skills load | -| Mid-session | 80K | Deep in implementation, full context | -| Pre-compact | 167K | Auto-compact triggers | -| Post-compact | ~60K | Summarized history, details lost | - -With a 33K buffer, you hit compaction at 167K. That's your working limit - an improvement over the previous 155K ceiling. - -The information loss happens in the summarization. Specific variable names, exact error messages, nuanced decisions from early in the session - all compressed into a summary that captures the gist but loses precision. - -## [What You Can Actually Control](#what-you-can-actually-control) - -### [1. Override the Compaction Trigger Percentage](#1-override-the-compaction-trigger-percentage) - -The `CLAUDE_AUTOCOMPACT_PCT_OVERRIDE` environment variable lets you control when auto-compaction fires: - -```p-4 -# Trigger compaction at 90% instead of the default ~83.5% -export CLAUDE_AUTOCOMPACT_PCT_OVERRIDE=90 - -# Trigger earlier at 70% for more aggressive compaction -export CLAUDE_AUTOCOMPACT_PCT_OVERRIDE=70 -``` - -This accepts values from 1-100 and directly controls the percentage threshold at which auto-compaction triggers. Setting it higher gives you more usable context before compaction, but leaves less buffer for the summarization process. Setting it lower triggers compaction earlier, preserving more working space but giving you less room before the first compaction. - -This is the closest thing to a configurable buffer. It doesn't change the buffer size itself, but it shifts when compaction fires relative to your total context window. - -### [2. Use Extended Context Models](#2-use-extended-context-models) - -Instead of fighting the 200K context limit, `sonnet[1m]` gives you a 1 million token context window: - -```p-4 -/model sonnet[1m] -``` - -With 1M tokens, the compaction threshold moves dramatically. Even with a proportional buffer, you get significantly more usable space before compaction triggers. This is available to Console and API users and has different pricing than standard Sonnet. - -For sessions involving large codebases, extensive debugging, or multi-file refactoring, `sonnet[1m]` may be more cost-effective than repeatedly losing context to compaction. See the [model selection guide](/blog/models/model-selection) for the full model alias reference. - -### [3. Disable Auto-Compaction (Risky)](#3-disable-auto-compaction-risky) - -```p-4 -// ~/.claude/settings.json -{ - "autoCompact": false -} -``` - -**Warning**: GitHub Issue [#18264](https://github.com/anthropics/claude-code/issues/18264) reports this setting may be ignored in some scenarios. Even when it works, you risk hitting hard context limits and session failures. - -Only use this if you're prepared to: - -- Monitor context manually with `/context` -- Run `/compact` before hitting 100% -- Accept occasional session crashes - -### [4. Manual Compaction at Strategic Points](#4-manual-compaction-at-strategic-points) - -Disable auto-compact, then compact when YOU choose: - -```p-4 -/compact # Compact when you decide -/clear # Full reset when starting new major task -``` - -Strategic compaction points: - -- After completing a major feature -- Before starting a new component -- When debugging context feels stale - -The advantage: you control what gets summarized and when, preserving granular details for active work. - -### [5. Work Within the 167K Limit](#5-work-within-the-167k-limit) - -Accept that complex sessions will compact. Optimize for it: - -- Keep CLAUDE.md and skills lean -- Use [session files](/blog/guide/development/task-management) to persist state -- Break complex tasks into multiple sessions - -### [6. Proactive Backup Strategy](#6-proactive-backup-strategy) - -The most effective approach: backup before compaction happens. - -Here's the insight gaining traction in the Claude Code community: **proactive clearing at 50% + structured recovery beats lossy auto-compaction**. - -Auto-compaction summarizes your conversation, losing granular details. But if you: - -1. Continuously record your session to a structured backup -2. Clear context manually at a threshold (like 50%) -3. Reload from structured backup instead of lossy summary - -You get better context fidelity. The backup preserves exact details that summarization loses. - -## [StatusLine: The Only Live Monitor](#statusline-the-only-live-monitor) - -StatusLine is the only mechanism that receives real-time context metrics. Other hooks don't get token counts. - -```p-4 -// .claude/settings.json -{ - "statusLine": { - "type": "command", - "command": "node .claude/hooks/context-monitor.mjs" - } -} -``` - -The statusline receives JSON with `context_window.remaining_percentage` - live data you can act on. - -**Critical calculation**: The `remaining_percentage` field includes the 16.5% autocompact buffer. To get actual "free until autocompact": - -```p-4 -const AUTOCOMPACT_BUFFER_PCT = 16.5; -const freeUntilCompact = Math.max( - 0, - remaining_percentage - AUTOCOMPACT_BUFFER_PCT, -); -``` - -At 25% remaining, you actually have 8.5% before compaction. - -## [Why Hooks Can't Inject /clear](#why-hooks-cant-inject-clear) - -Here's a technical limitation many discover: **hooks cannot inject slash commands**. - -You might think a hook could detect high context usage and inject `/clear`. It can't: - -- UserPromptSubmit has no `updatedPrompt` field - it can add context or block, not replace -- Slash commands bypass hook evaluation entirely -- No hook fires "instead of" user input - -To programmatically clear and recover: - -1. **Claude Agent SDK** - Send `/clear` via the SDK -2. **Headless CLI wrapper** - Pipe commands to headless Claude Code -3. **Manual workflow** - Hook warns you, you run `/clear`, SessionStart restores - -## [What Happens at 100% Context](#what-happens-at-100-context) - -If you push context to the absolute limit: - -1. **Best case**: Claude's response gets truncated -2. **Worse case**: API returns an error, turn fails -3. **Worst case**: Session becomes unresponsive - -The 33K buffer exists to prevent these scenarios. It's protection, not waste. - -## [Key Takeaways](#key-takeaways) - -1. **The buffer was recently reduced from 45K to 33K** - An undocumented improvement giving ~12K more usable tokens -2. **Compaction now triggers at ~83.5% usage** - You get ~167K usable tokens (up from ~155K) -3. **`CLAUDE_AUTOCOMPACT_PCT_OVERRIDE` shifts the trigger** - Set a value from 1-100 to control when compaction fires -4. **`sonnet[1m]` offers 1M token context** - A viable alternative to fighting 200K limits -5. **Output tokens and compaction buffer are separate** - Don't confuse them -6. **autoCompact: false may work** - But has reported bugs -7. **StatusLine is the only live context monitor** - Other hooks don't receive token counts -8. **Hooks cannot inject /clear** - Use SDK, wrapper, or manual workflow -9. **Proactive clearing + structured recovery** beats lossy auto-compaction - -The buffer exists for good reasons. Rather than fighting it, work with it: use session files to persist state, run [threshold-based backups](/blog/tools/hooks/context-recovery-hook) before compaction, and consider proactive clearing strategies for complex sessions. - -## [The Solution: Threshold-Based Backups](#the-solution-threshold-based-backups) - -The buffer is fixed, but how you handle approaching it isn't. - -See our [threshold-based backup system](/blog/tools/hooks/context-recovery-hook) for a proactive solution that monitors context via StatusLine and creates backups at 30%, 15%, and 5% remaining - before compaction destroys your session history. - -## [Related Resources](#related-resources) - -- [Context Recovery Hook](/blog/tools/hooks/context-recovery-hook) - Threshold-based backup system -- [Context Engineering Guide](/blog/guide/mechanics/context-engineering) - Strategic context usage -- [Memory Optimization](/blog/guide/mechanics/memory-optimization) - Reduce static context overhead -- [Claude Code Hooks Guide](/blog/tools/hooks/hooks-guide) - All 12 hook types explained - -Last updated on - -[Previous - -Context Engineering](/blog/guide/mechanics/context-engineering)[Next - -Claude Skills Guide](/blog/guide/mechanics/claude-skills-guide) diff --git a/docs/site/src/content/blog/context-engineering.md b/docs/site/src/content/blog/context-engineering.md deleted file mode 100644 index 67452dad..00000000 --- a/docs/site/src/content/blog/context-engineering.md +++ /dev/null @@ -1,224 +0,0 @@ ---- -slug: "context-engineering" -title: "Claude Code Context Engineering: 6 Pillars Framework" -description: "Master context engineering in Claude Code. The six pillars framework transforms inconsistent AI into a reliable, predictable coding partner." -date: "2025-12-10" -author: "Max Ritter" -tags: [Guide, Workflow] -readingTime: 7 -keywords: "6, claude, code, context, engineering, framework, pillars" ---- - -Mechanics - -# Context Engineering: The Six Pillars That Make Claude Code Reliable - -Master context engineering in Claude Code. The six pillars framework transforms inconsistent AI into a reliable, predictable coding partner. - -**Problem**: Claude Code gives you inconsistent results. Sometimes brilliant, sometimes frustrating. You can't predict when it will nail your request or miss the mark entirely. - -**Quick Win**: Stop stuffing everything into your prompt. Load context strategically: - -```p-4 -# Bad: dump everything upfront -claude "Here's my entire codebase architecture, all conventions, -every pattern we use, plus the task..." - -# Good: let Skills load what's needed, when needed -claude "Build the auth module" -# Skills load authentication patterns only when Claude needs them -``` - -The difference: prompt engineering asks questions well. Context engineering ensures Claude has the right information at the right time. - -## [What Is Context Engineering?](#what-is-context-engineering) - -Context engineering is the discipline of architecting how information flows to your AI model. It's what separates frustrating AI experiences from having a coding partner you can trust to bring any idea to life. - -Think of it this way: a context window is finite workspace measured in tokens. Your instructions, retrieved documents, tool outputs, and conversation history all compete for space. When you hit limits, older information gets discarded. When you organize poorly, Claude loses track of what matters. - -The insight: **context is a scarce resource**. How you structure it determines whether Claude delivers exactly what you envisioned or produces code that misses the point. - -## [The Context Window Challenge](#the-context-window-challenge) - -Claude Code fails in four predictable ways when context isn't managed well: - -| Failure Mode | What Happens | Prevention | -| --- | --- | --- | -| **Context Poisoning** | Errors compound as agents reuse contaminated context | Fresh sessions, `/clear` command | -| **Context Distraction** | Over-reliance on repeating prior behavior | [Strategic chunking](/blog/guide/mechanics/context-management) | -| **Context Confusion** | Irrelevant tools or docs misdirect the agent | [Skills system](/blog/guide/mechanics/claude-skills-guide) | -| **Context Clash** | Contradictory information creates conflicts | CLAUDE.md as single source of truth | - -Recognize these patterns. They're the enemy. - -## [The Six Pillars Framework](#the-six-pillars-framework) - -Context engineering has six interconnected components. Here's how each applies to Claude Code: - -### [1. Agents](#1-agents) - -AI agents combine an LLM with tools, memory, and reasoning to achieve goals. They orchestrate context, deciding what surfaces, persists, or gets discarded. - -Claude Code evolved from single-agent to multi-agent with the release of subagents. This matters for context engineering: - -```p-4 -# Single agent: one context window handles everything -claude "Research, plan, build, test, and deploy the payment system" - -# Multi-agent: specialized contexts, distributed load -# Central AI delegates to focused subagents -claude "Build the payment system" -# → Research agent gathers requirements -# → Backend agent builds Stripe integration -# → Frontend agent creates checkout UI -# → Each agent has clean, focused context -``` - -Multi-agent architectures prevent context confusion by scoping each agent's responsibility. Your central AI becomes the CTO coordinating specialists. - -### [2. Query Augmentation](#2-query-augmentation) - -Real user queries are messy and unclear. Query augmentation refines them before execution. - -When you position your Claude Code central AI as a co-founder or development manager, query augmentation happens naturally: - -```p-4 -Your input: "fix the auth bug" - -Central AI refinement: -→ Analyze recent changes to auth module -→ Identify error patterns in logs -→ Scope to affected files (src/lib/auth.ts) -→ Generate targeted fix with test coverage - -Subagent receives: Clear, scoped task with context -``` - -The central AI funnels your rough ideas through its understanding before delegating. Subagents receive optimized prompts, not your raw input. - -### [3. Retrieval](#3-retrieval) - -Retrieval pulls relevant information from external sources into the context window. This requires thoughtful chunking: small chunks give precise retrieval but miss surrounding context; large chunks provide rich context but consume more tokens. - -Claude Code doesn't have native retrieval. Some workarounds exist through MCPs and CLI tools, but it's not currently a platform strength. For now, structure your CLAUDE.md and Skills to serve as your retrieval layer: - -```p-4 -# CLAUDE.md - Your retrieval substitute - -## Architecture (always loaded) - -- Next.js 15, App Router, TypeScript strict - -## Patterns (reference when needed) - -See /docs/patterns/ for component conventions -``` - -### [4. Prompting Techniques](#4-prompting-techniques) - -Here's what most people miss: stuffing information into the context window doesn't guarantee good performance. The method, order, and timing of how you layer information matters enormously. - -Research shows the beginning and ending portions of the context window are more effective than the middle. This is why [Skills](/blog/guide/mechanics/claude-skills-guide) work so well: - -```p-4 -Conversation start: -├── CLAUDE.md (beginning of context - high attention) -├── Your initial prompt -├── ... conversation history ... -├── Claude's work -└── Skill loads HERE (end of context - high attention) - └── Fresh, relevant instructions at peak attention -``` - -Before the skill loads, Claude operates lean and efficient. When the skill loads mid-conversation, it occupies the bottom of the context window, the high-attention zone, exactly when you need that expertise. - -### [5. Memory](#5-memory) - -Memory transforms stateless models into systems that maintain context across interactions. - -Claude Code's actual memory implementation: - -| What | How It Works | Persistence | -| --- | --- | --- | -| **CLAUDE.md** | Loads at session start, treated as authoritative | Permanent | -| **Skills** | Load on-demand when triggered | Permanent | -| **Session files** | `.claude/tasks/session-current.md` tracks progress | Across sessions | -| **Conversation** | Current context window | This session | - -With session management and evolving documentation, you create a memory layer highly specific to your repo. Claude both writes it (documenting decisions) and reads it (picking up where you left off). Over time, your Claude becomes proficient with your specific codebase. - -### [6. Tools](#6-tools) - -Tools bridge reasoning and real-world action. Claude Code started with basics: Read, Write, Edit, Bash, and MCP for external integrations. - -With Skills, Anthropic added something powerful: executable scripts that Claude can run without reading the code inside. This is the MCP-S CLI paradigm. The model follows a protocol without consuming context on implementation details. - -Example: We built Context7 MCP into a documentation-research skill: - -```p-4 -# .claude/skills/documentation-research/SKILL.md - ---- - -name: documentation-research -description: Fetch library docs using Context7 API - ---- - -## When to Use - -User needs current documentation for any library - -## Workflow - -1. Resolve library ID via Context7 -2. Fetch relevant documentation -3. Apply to current task - -## Tools Available - -- mcp**context7**resolve-library-id -- mcp**context7**get-library-docs -``` - -Claude invokes the MCP tools through a skill interface. Context-efficient, protocol-driven, no code reading required. - -## [Implementing the Framework](#implementing-the-framework) - -**Today**: Audit your CLAUDE.md. Is it structured for retrieval? Are patterns documented where Claude can find them? - -**This week**: Set up Skills for repeated workflows. Each skill prevents context confusion by loading expertise on-demand. - -**Ongoing**: Watch for the four failure modes. When Claude starts repeating mistakes or ignoring context, you've hit contamination. Start fresh. - -## [The Bottom Line](#the-bottom-line) - -Reliable AI output isn't about bigger models. It's about engineering the flow of information to those models. - -The six pillars work together: - -- **Agents** distribute context across specialists -- **Query augmentation** refines messy input -- **Retrieval** (via CLAUDE.md/Skills) surfaces relevant info -- **Prompting** layers information strategically -- **Memory** maintains state across sessions -- **Tools** extend capabilities efficiently - -Master these, and Claude Code becomes the coding partner you can trust with any feature or idea you have in mind. - -**Next steps**: - -- [Context buffer management](/blog/guide/mechanics/context-buffer-management) for understanding the 45K reservation -- [Context management](/blog/guide/mechanics/context-management) for token optimization -- [Memory optimization](/blog/guide/mechanics/memory-optimization) for persistence strategies -- [Skills guide](/blog/guide/mechanics/claude-skills-guide) for on-demand expertise loading -- [Sub-agent design](/blog/guide/agents/sub-agent-design) for multi-agent architectures - -Last updated on - -[Previous - -Settings Reference](/blog/guide/settings-reference)[Next - -Context Buffer Management](/blog/guide/mechanics/context-buffer-management) diff --git a/docs/site/src/content/blog/context-management.md b/docs/site/src/content/blog/context-management.md deleted file mode 100644 index b5774768..00000000 --- a/docs/site/src/content/blog/context-management.md +++ /dev/null @@ -1,147 +0,0 @@ ---- -slug: "context-management" -title: "Claude Code Context Window: Optimize Your Token Usage" -description: "Master Claude Code's context window management to handle larger projects. Learn token optimization strategies that 5x your effective context." -date: "2025-08-23" -author: "Max Ritter" -tags: [Guide, Workflow] -readingTime: 4 -keywords: "claude, code, context, management, optimize, token, usage, window" ---- - -Mechanics - -# Claude Code Context Window: Optimize Your Token Usage - -Master Claude Code's context window management to handle larger projects. Learn token optimization strategies that 5x your effective context. - -**Problem**: Claude Code loses track of your project when conversations get too long, and you end up re-explaining everything from scratch. - -**Quick Win**: Watch the token percentage in Claude Code's status bar. When you hit 80%, exit the session and restart with `claude` for complex multi-file work: - -```p-4 -# Exit current session (Ctrl+C or type 'exit') -# Then start fresh -claude -``` - -This single habit prevents the performance degradation that kills productivity on large projects. - -## [Why Context Depletes Performance](#why-context-depletes-performance) - -Claude Code's context window is active working memory, not passive storage. As it fills up, Claude struggles to maintain awareness across your entire project. - -**Memory-intensive tasks** that degrade first: - -- Large-scale refactoring across multiple files -- Feature implementation spanning several components -- Debugging complex interaction patterns -- Code reviews requiring architectural understanding - -**Isolated tasks** that handle high context better: - -- Single-file edits with clear scope -- Independent utility function creation -- Documentation updates -- Simple bug fixes with localized impact - -The insight from experienced users: avoid the last 20% of the context window for anything touching multiple parts of your codebase. - -## [Strategic Task Chunking](#strategic-task-chunking) - -Instead of pushing Claude to exhaustion, divide work into context-sized chunks with natural breakpoints. - -**Complete components before integration:** - -```p-4 -# First session: build the component completely -claude "Build the UserProfile component with all props and styling" - -# New session: integrate with the larger system -claude "Integrate UserProfile with the dashboard layout" -``` - -**Finish research phases before implementation:** - -```p-4 -# Research session -claude "Research authentication patterns for our Next.js app - document options" - -# Implementation session (fresh context) -claude "Implement OAuth using the NextAuth pattern" -``` - -Between sessions, have Claude create checkpoint notes: - -```p-4 -claude "Document the authentication decisions, patterns used, and integration points for future reference" -``` - -Store these notes in your project. When starting fresh, point Claude to them for continuity. See our [memory optimization guide](/blog/guide/mechanics/memory-optimization) for advanced persistence strategies. - -## [CLAUDE.md for Persistent Context](#claudemd-for-persistent-context) - -Your [CLAUDE.md file](/blog/guide/mechanics/claude-md-mastery) persists across sessions automatically. Use it for context that should never be lost: - -```p-4 -# CLAUDE.md - -## Project Architecture - -- Frontend: Next.js 15 with App Router -- Database: PostgreSQL with Prisma ORM -- Auth: NextAuth with Google provider - -## Current Sprint Focus - -- Building user dashboard -- Integrating payment processing -``` - -Claude reads this file at session start, giving you free context that survives restarts. - -## [The Compaction Option](#the-compaction-option) - -Use the `/compact` slash command to summarize and compress your conversation history. **Compaction is now instant** - Claude maintains a continuous session memory in the background, so compaction just loads that summary into a fresh context. - -Your session memory includes: - -- Session title and current status -- Completed work and key results -- Discussion points and open questions -- A work log updated with every message - -Find your session memory at `~/.claude/projects/[project]/[session]/session_memory`. This automatic summarization means compaction no longer takes two minutes - it happens immediately. - -The goal: provide minimum context necessary for effective task execution. This maximizes performance, token efficiency, and cost simultaneously. - -## [Constraints as Training](#constraints-as-training) - -Working within token limits forces deliberate choices that make you a better Claude Code user: - -- **Explicit file selection** - Include only relevant files, not entire codebases -- **Clear task definition** - Break objectives into concrete, actionable steps -- **Priority-based organization** - Structure prompts with critical details first -- **Compact examples** - Provide minimal but representative code samples - -These skills transfer when context windows eventually expand. Developers who embrace constraints become better collaborators regardless of technical limits. - -## [Next Actions](#next-actions) - -**Immediate**: Check your token percentage in the status bar. If above 80%, exit and restart for your next complex task. - -**This week**: Practice chunking one large feature into component-then-integration phases. - -**Ongoing**: Build your [CLAUDE.md file](/blog/guide/mechanics/claude-md-mastery) with project context that persists across sessions. Explore [context preservation strategies](/blog/guide/performance/context-preservation) for advanced workflows. For the complete framework, see [context engineering](/blog/guide/mechanics/context-engineering). - -Master context management and you handle projects 5x larger than developers who ignore these limits. - -This is why top developers use "context resets" between planning and execution. Learn this and four other [Claude Code best practices](/blog/guide/development/agentic-engineering-best-practices) that compound over time. - -Last updated on - -[Previous - -Experimentation Mindset](/blog/guide/mechanics/experimentation-mindset)[Next - -Memory Optimization](/blog/guide/mechanics/memory-optimization) diff --git a/docs/site/src/content/blog/context-preservation.md b/docs/site/src/content/blog/context-preservation.md deleted file mode 100644 index 0ec983a8..00000000 --- a/docs/site/src/content/blog/context-preservation.md +++ /dev/null @@ -1,160 +0,0 @@ ---- -slug: "context-preservation" -title: "Claude Code Context: Never Lose Project State" -description: "Master context preservation in Claude Code for seamless long sessions. Learn continuous update techniques that maintain project coherence." -date: "2025-08-23" -author: "Max Ritter" -tags: [Guide, Performance] -readingTime: 5 -keywords: "claude, code, context, lose, never, preservation, project, state" ---- - -Performance - -# Claude Code Context Optimization: Never Lose Your Project State - -Master context preservation in Claude Code for seamless long sessions. Learn continuous update techniques that maintain project coherence. - -**Problem**: Claude Code forgets your project details when conversations get too long, breaking mid-session and forcing you to re-explain everything. - -**Quick Win**: Use the `/compact` command when context gets heavy. This compresses your conversation history while preserving key information, giving you more room to continue working. - -For manual checkpoints, save your current state: - -```p-4 -claude "Create detailed notes about our current progress, including all key decisions, patterns we've established, and next steps" -``` - -Run this every 20-30 minutes during long sessions. Claude will generate comprehensive notes you can reference later. - -## [Why Context Preservation Matters](#why-context-preservation-matters) - -Context window depletion is Claude Code's biggest limitation. When you hit the ~200K token limit, Claude loses track of your project architecture, coding patterns, and decisions made earlier in the session. This leads to: - -- Inconsistent code that conflicts with earlier work -- Repeated questions about project structure -- Lost architectural decisions and naming conventions -- Breaking changes that ignore established patterns - -The solution isn't avoiding long sessions - it's strategic context management that maintains project coherence throughout extended development work. - -## [The 80/20 Context Rule](#the-8020-context-rule) - -Never use the final 20% of your context window for complex, multi-file tasks. [Memory-intensive operations](/blog/guide/development/feedback-loops) like refactoring, feature implementation, and debugging require substantial working memory to track relationships between components. - -**High Context Tasks** (Stop at 80% capacity): - -- Large-scale refactoring across multiple files -- Feature implementation spanning several components -- Complex debugging requiring architectural understanding -- Code review with cross-file dependencies - -**Low Context Tasks** (Safe to continue): - -- Single-file edits with clear scope -- Independent utility function creation -- Documentation updates -- Simple, localized bug fixes - -## [Strategic Context Chunking](#strategic-context-chunking) - -Break complex workflows into natural checkpoints that fit within optimal context limits. This approach maintains quality while accommodating Claude's memory constraints. - -### [Checkpoint Strategy](#checkpoint-strategy) - -```p-4 -# At each natural breakpoint -claude "Summarize all architectural decisions, patterns, and progress. Include specific details about naming conventions, file structure, and implementation approaches that future context should maintain." -``` - -**Pro tip**: Store critical context in your project's `CLAUDE.md` file. This markdown file persists across sessions and loads automatically, ensuring Claude always has access to your project's core patterns and decisions. - -**Natural Breakpoints**: - -- After completing individual components -- Before starting integration work -- After research phases, before implementation -- When switching between major features - -### [Context Handoff Technique](#context-handoff-technique) - -When approaching context limits, create detailed handoff notes: - -```p-4 -claude "Create comprehensive handoff notes including: -1. Current project state and architecture -2. Coding patterns and conventions we've established -3. Key decisions made and reasoning -4. Specific next steps with implementation details -5. Files that will need attention and why" -``` - -## [Continuous Context Updates](#continuous-context-updates) - -Maintain project awareness through regular context reinforcement. Don't wait for memory issues - proactively preserve important information. - -### [Regular Refresh Pattern](#regular-refresh-pattern) - -Every 30 minutes in long sessions: - -```p-4 -# Quick context refresh -claude "Update your understanding of our project: review recent changes, confirm current patterns, and note any shifts in approach" -``` - -This prevents context drift where Claude gradually loses alignment with your project's specific requirements and patterns. - -### [Pattern Preservation](#pattern-preservation) - -When establishing new patterns or making architectural decisions, explicitly document them: - -```p-4 -claude "Document this pattern/decision in detail so we maintain consistency: [describe the pattern/decision]" -``` - -## [Context Optimization Techniques](#context-optimization-techniques) - -Maximize your effective context window through strategic information management: - -**File Selection Strategy**: Only include files directly relevant to current tasks. Use [configuration basics](/blog/guide/configuration-basics) to set up smart file filtering. - -**Example-Driven Learning**: Provide minimal but representative examples that demonstrate patterns efficiently, rather than exhaustive documentation. - -**Priority Information First**: Structure conversations with critical project details early, before diving into implementation specifics. - -## [Working Within Constraints](#working-within-constraints) - -Context limitations become training for better development practices. Constraints force deliberate choices about information architecture and task organization. - -Skills developed through context management: - -- Identifying essential vs. tangential information -- Breaking complex tasks into focused chunks -- Creating modular, well-documented code -- Writing precise, actionable requests - -These skills make you more effective even with intelligent context management, similar to how optimizing for slower hardware teaches fundamental performance principles. - -## [Recovery Techniques](#recovery-techniques) - -When context loss occurs mid-session: - -1. **Quick Recovery**: Reference your most recent checkpoint notes -2. **Pattern Review**: Ask Claude to scan recent files and identify established patterns -3. **Architecture Refresh**: Provide a brief project overview focusing on current components -4. **Continuation Strategy**: Start with small, isolated tasks while context rebuilds -5. **Fresh Start**: Use `/clear` when context becomes too corrupted to salvage - sometimes starting clean with good handoff notes is faster than fighting degraded context - -## [Next Steps](#next-steps) - -Master context optimization by implementing strategic checkpointing in your next session. Explore [deep thinking techniques](/blog/guide/performance/deep-thinking-techniques) for maintaining quality under constraints. For the complete framework on managing information flow, see [context engineering](/blog/guide/mechanics/context-engineering). - -For immediate improvement, set a timer for 30-minute intervals during your next long session and practice the checkpoint strategy outlined above. - -Last updated on - -[Previous - -Deep Thinking Techniques](/blog/guide/performance/deep-thinking-techniques)[Next - -Speed Optimization](/blog/guide/performance/speed-optimization) diff --git a/docs/site/src/content/blog/context-recovery-hook.md b/docs/site/src/content/blog/context-recovery-hook.md deleted file mode 100644 index 71f48023..00000000 --- a/docs/site/src/content/blog/context-recovery-hook.md +++ /dev/null @@ -1,276 +0,0 @@ ---- -slug: "context-recovery-hook" -title: "Claude Code Context Backups: Beat Auto-Compaction" -description: "Proactively backup your Claude Code session before compaction hits. StatusLine monitoring and threshold triggers keep your work safe." -date: "2026-01-26" -author: "Max Ritter" -tags: [Guide, Hooks] -readingTime: 8 -keywords: "autocompaction, backups, beat, claude, code, context, hook, recovery" ---- - -Hooks - -# Never Lose Work to Compaction: Threshold-Based Context Backups for Claude Code - -Proactively backup your Claude Code session before compaction hits. StatusLine monitoring and threshold triggers keep your work safe. - -You're 4 hours into a complex implementation. Context hits 100%. Auto-compaction fires. Suddenly Claude doesn't remember the specific error message you debugged, the exact function signatures you discussed, or the architectural decisions that led to your current approach. - -The summary captures the gist. The precision is gone. - -Here's the alternative: **backup your session at 30%, 15%, and 5% remaining - before compaction destroys your context**. When compaction hits, you have a structured markdown file with every user request, file modification, and key decision preserved. - -## [Why StatusLine Is the Only Solution](#why-statusline-is-the-only-solution) - -Most Claude Code hooks don't receive context metrics. PreToolUse, PostToolUse, Stop - none of them know how much context you've consumed. - -StatusLine is different. It receives a JSON payload on every turn with `context_window.remaining_percentage` - live data showing exactly how much room you have left. - -```p-4 -{ - "session_id": "abc123...", - "context_window": { - "remaining_percentage": 35.5, - "context_window_size": 200000 - } -} -``` - -This is the ONLY mechanism in Claude Code that provides real-time context visibility. Without it, you're flying blind until compaction hits. - -### [The 16.5% Buffer Calculation](#the-165-buffer-calculation) - -Here's what trips people up: that `remaining_percentage` field includes the 16.5% autocompact buffer that you can't actually use. (This was previously 22.5% when the buffer was 45K tokens -- it was [recently reduced to 33K](/blog/guide/mechanics/context-buffer-management).) - -When StatusLine reports 25% remaining, you don't have 25% before compaction. You have **8.5%**. - -```p-4 -const AUTOCOMPACT_BUFFER_PCT = 16.5; -const freeUntilCompact = Math.max( - 0, - remaining_percentage - AUTOCOMPACT_BUFFER_PCT, -); -``` - -The threshold-based backup system accounts for this. When we say "backup at 30%", we mean 30% free-until-compaction - which is actually 46.5% remaining in the raw metric. - -## [The Threshold Concept](#the-threshold-concept) - -Auto-compaction is reactive - it fires when you've already used too much context, then throws away detail in the summarization process. - -Threshold-based backup is proactive. Set thresholds at meaningful points: - -| Threshold | When It Fires | Purpose | -| --- | --- | --- | -| **30%** | ~60K tokens free until compact | First warning, full backup | -| **15%** | ~30K tokens free until compact | Getting critical, updated backup | -| **5%** | ~10K tokens free until compact | Last chance before compaction | -| **Under 5%** | Every context decrease | Continuous backup mode | - -Why these numbers? At 30%, you still have substantial working room but should capture state. At 15%, compaction is approaching. Below 5%, every turn could be your last - so backup continuously. - -## [Three-File Architecture](#three-file-architecture) - -A production backup system needs clean separation of concerns. We use three files: - -```p-4 -.claude/hooks/ContextRecoveryHook/ -├── backup-core.mjs # Shared backup logic -├── statusline-monitor.mjs # Threshold detection + display -└── conv-backup.mjs # PreCompact hook trigger -``` - -### [backup-core.mjs - The Engine](#backup-coremjs---the-engine) - -This file handles everything about creating backups: - -- **Transcript parsing**: Reads the JSONL transcript file and extracts user requests, file modifications, tasks, and Claude's key responses -- **Markdown formatting**: Structures the data as a readable markdown file -- **File operations**: Saves numbered backups with timestamps -- **State management**: Tracks which session is active and what the current backup path is - -The key insight: backups should be structured, not raw dumps. The markdown format groups information logically so you can quickly find what you need when recovering. - -### [statusline-monitor.mjs - The Detector](#statusline-monitormjs---the-detector) - -This runs on every turn via StatusLine. Its job: - -1. Calculate true "free until compaction" percentage -2. Check if any threshold was crossed (going down) -3. Trigger `backup-core` when thresholds cross -4. Display formatted status with warning indicators - -The output format tells you exactly where you stand: - -```p-4 -[!] 25.0% free (50.0K/200K) --> .claude/backups/3-backup-26th-Jan-2026-5-45pm.md -``` - -That second line? It's the file you'll load after compaction. No hunting through directories. - -### [conv-backup.mjs - The Safety Net](#conv-backupmjs---the-safety-net) - -PreCompact hooks fire right before compaction happens - your last chance to capture state. This file triggers `backup-core` with `precompact_auto` or `precompact_manual` as the trigger reason. - -Think of it as the emergency backup. StatusLine-based thresholds are proactive; PreCompact is reactive but still better than losing everything. - -## [Configuration](#configuration) - -The system requires two settings.json entries: - -```p-4 -{ - "statusLine": { - "type": "command", - "command": "node .claude/hooks/ContextRecoveryHook/statusline-monitor.mjs" - }, - "hooks": { - "PreCompact": [ - { - "hooks": [ - { - "type": "command", - "command": "node .claude/hooks/ContextRecoveryHook/conv-backup.mjs", - "async": true - } - ] - } - ] - } -} -``` - -The `async: true` on PreCompact matters - backups shouldn't slow down the compaction process. - -## [Backup File Format](#backup-file-format) - -Backups use numbered filenames with human-readable timestamps: - -```p-4 -.claude/backups/1-backup-26th-Jan-2026-4-30pm.md -.claude/backups/2-backup-26th-Jan-2026-5-15pm.md -.claude/backups/3-backup-26th-Jan-2026-5-45pm.md -``` - -Inside, you get a structured summary: - -```p-4 -# Session Backup - -**Session ID:** abc123... -**Trigger:** crossed_30pct_free -**Context Remaining:** 27.5% -**Generated:** 2026-01-26T17:45:00.000Z - -## User Requests - -- Create two blog posts about context management -- Add the new post to blog-structure.ts -- Fix the internal linking - -## Files Modified - -- apps/web/src/content/blog/guide/mechanics/context-buffer-management.mdx -- apps/web/src/content/blog/tools/hooks/context-recovery-hook.mdx -- apps/web/src/content/blog/blog-structure.ts - -## Tasks - -### Created - -- **Write Post 1: Context Buffer Management** -- **Write Post 2: Context Recovery Hook** - -### Completed - -- 2 tasks completed - -## Skills Loaded - -- content-writer -``` - -This isn't a raw transcript. It's a structured summary that tells you what happened, what changed, and what's still pending. - -## [The Recovery Workflow](#the-recovery-workflow) - -When compaction happens: - -1. **StatusLine shows backup path**: You see exactly which file has your latest backup -2. **Run /clear**: Start a fresh session (cleaner than continuing with compacted context) -3. **Load the backup**: Read the markdown file to restore context -4. **Continue work**: Claude now has structured context about what you were doing - -The alternative - working with compacted context - means Claude has a summary of your session but has lost the specifics. Loading a structured backup gives you those specifics back. - -### [Why /clear Instead of Continuing?](#why-clear-instead-of-continuing) - -After compaction, you have two types of context: - -1. **Compaction summary**: Auto-generated, lossy, captures the gist -2. **Loaded backup**: Structured, detailed, captures specifics - -Having both can confuse things. The summary might contradict details in the backup. Starting fresh with `/clear` and loading only the backup gives you cleaner, more reliable context. - -## [Transcript Parsing Details](#transcript-parsing-details) - -The backup system parses Claude Code's JSONL transcript files to extract meaningful data. Here's what it captures: - -| Data Type | How It's Extracted | -| --- | --- | -| **User Requests** | Messages where `type === "user"` | -| **Files Modified** | Write/Edit tool calls with `file_path` | -| **Tasks Created** | TaskCreate tool calls | -| **Tasks Completed** | TaskUpdate with `status === "completed"` | -| **Sub-Agent Calls** | Task tool invocations | -| **Skills Loaded** | Skill tool calls | -| **MCP Tool Usage** | Tool names starting with `mcp__` | -| **Build/Test Runs** | Bash commands containing build/test/npm/pnpm | - -The parser filters out noise - tool results, system messages, single-character inputs - to focus on what actually matters for session recovery. - -## [Why This Beats Manual Tracking](#why-this-beats-manual-tracking) - -You could manually copy important context into a file as you work. But you won't. You're focused on the implementation, not on documentation. - -The threshold system runs automatically. Every time context drops through a threshold, you get an updated backup without thinking about it. The cognitive load is zero. - -And the backups are structured. Not a raw paste of conversation, but organized sections you can scan quickly. - -## [Comparison: Auto-Compaction vs Threshold Backup](#comparison-auto-compaction-vs-threshold-backup) - -| Aspect | Auto-Compaction | Threshold Backup + /clear | -| --- | --- | --- | -| **When it happens** | At 100% effective usage | At configurable thresholds | -| **What's preserved** | Lossy summary | Structured markdown with full detail | -| **Control** | None (hardcoded) | You choose thresholds | -| **Recovery** | Continue with summary | Load specific backup file | -| **Specifics retained** | Only what fits summary | Everything in backup | - -Auto-compaction is the default because most users don't set up backup systems. But if you're working on complex, multi-hour sessions where precision matters, threshold-based backup gives you much better recovery options. - -## [Key Takeaways](#key-takeaways) - -1. **StatusLine is the only live context monitor** - Other hooks don't get token counts -2. **Raw percentage includes 16.5% buffer** - Calculate true "free until compact" -3. **Threshold backups are proactive** - Capture state before compaction, not during -4. **Structured backups beat raw dumps** - Parse transcripts into organized markdown -5. **Three-file architecture** - Clean separation between detection, backup logic, and triggers -6. **Recovery workflow: /clear + load** - Cleaner than mixing compacted context with backup - -## [Related Resources](#related-resources) - -- [Context Buffer Management](/blog/guide/mechanics/context-buffer-management) - Why the 33K-45K buffer exists -- [Claude Code Hooks Guide](/blog/tools/hooks/hooks-guide) - All 12 hook types explained -- [Context Engineering](/blog/guide/mechanics/context-engineering) - Strategic context usage -- [Session Lifecycle Hooks](/blog/tools/hooks/session-lifecycle-hooks) - Setup and cleanup automation - -Last updated on - -[Previous - -Session Lifecycle](/blog/tools/hooks/session-lifecycle-hooks)[Next - -Skill Activation Hook](/blog/tools/hooks/skill-activation-hook) diff --git a/docs/site/src/content/blog/context7-library-docs.md b/docs/site/src/content/blog/context7-library-docs.md deleted file mode 100644 index 9904e681..00000000 --- a/docs/site/src/content/blog/context7-library-docs.md +++ /dev/null @@ -1,84 +0,0 @@ ---- -slug: "context7-library-docs" -title: "Context7: Access Library Docs Directly in Claude Code" -description: "Give Claude access to current documentation for thousands of libraries. Stop getting deprecated APIs and outdated patterns." -date: "2026-01-15" -author: "Max Ritter" -tags: [Guide, MCP] -readingTime: 3 -keywords: "Context7, Claude Code documentation, MCP server, library docs, Claude Code MCP, up-to-date docs" ---- - -# Context7: Access Library Docs Directly in Claude Code - -Claude's training data has a cutoff date. Libraries update constantly — new APIs, changed parameters, deprecated methods. Context7 gives Claude access to current documentation for thousands of libraries, directly in your session. - -## The Problem - -Claude knows React 18 patterns, but not the hook that was added last month. It knows Express 4, but not the breaking change in Express 5. Without current docs, Claude: - -- Uses deprecated APIs -- Misses new features that would simplify your code -- Guesses at parameter types instead of checking - -## Setup - -Add Context7 as an MCP server in `.mcp.json`: - -```json -{ - "mcpServers": { - "context7": { - "command": "npx", - "args": ["-y", "@upstreamapi/context7-mcp@latest"] - } - } -} -``` - -That's it. Claude can now query documentation during any session. - -## How It Works - -Context7 indexes documentation for thousands of libraries. Claude uses two steps: - -1. **Resolve** — Find the library ID (`/npm/react`, `/pytest-dev/pytest`) -2. **Query** — Ask a specific question about the library - -Claude does this automatically when it needs documentation. You don't have to prompt it. - -## When Claude Uses Context7 - -| Situation | What Happens | -|-----------|-------------| -| New dependency added | Claude checks setup and usage patterns | -| Unfamiliar API | Claude looks up the method signature | -| Getting library errors | Claude checks correct usage | -| Implementation choice | Claude checks what the library supports | - -## Query Tips - -Descriptive queries get better results: - -- "how to create fixtures in pytest" (specific) -- "useState and useEffect patterns" (focused) -- "JWT authentication with refresh tokens" (practical) - -Vague queries like "hooks" or "auth" return less useful results. - -## Supported Libraries - -Context7 covers libraries across all major ecosystems: - -- **npm** — React, Vue, Next.js, Express, Prisma, and thousands more -- **PyPI** — pytest, FastAPI, SQLAlchemy, Django, pandas -- **Go** — Standard library, Gin, GORM, Cobra -- **Rust** — Tokio, Serde, Actix, Diesel - -If a library has published documentation, Context7 likely has it indexed. - -## Impact - -With Context7, Claude writes code using current APIs instead of guessing from training data. This means fewer "this method doesn't exist" errors, fewer deprecated patterns, and code that matches the library version you're actually using. - -Pilot installs Context7 automatically during setup. No additional configuration needed. diff --git a/docs/site/src/content/blog/cross-platform-hooks.md b/docs/site/src/content/blog/cross-platform-hooks.md deleted file mode 100644 index 9227b6d8..00000000 --- a/docs/site/src/content/blog/cross-platform-hooks.md +++ /dev/null @@ -1,172 +0,0 @@ ---- -slug: "cross-platform-hooks" -title: "Claude Code Hooks on Windows, Linux, and macOS (2026)" -description: "Claude Code hooks that work on Windows, Linux, and macOS. One Node.js file, zero platform wrappers. Cross-platform patterns, permissions, and full working examples." -date: "2026-02-14" -author: "Max Ritter" -tags: [Guide, Hooks] -readingTime: 10 -keywords: "claude, code, hooks, windows, linux, macos, cross, platform, node, universal" ---- - -Hooks - -# Claude Code Hooks on Windows, Linux, and macOS (2026) - -Claude Code hooks that work on Windows, Linux, and macOS. One Node.js file, zero platform wrappers. Cross-platform patterns, permissions, and full working examples. - -**Problem**: You built a [Claude Code hook](/blog/tools/hooks/hooks-guide) on Windows using `cmd /c` or PowerShell. A teammate on Linux opens the project and every hook throws errors. Now you're maintaining three wrapper scripts per hook -- `.cmd` for Windows, `.sh` for Linux, `.ps1` for PowerShell -- and they all do the same thing: call the actual `.mjs` file. - -**Quick Win**: Delete every wrapper. Invoke Node.js directly in your Claude Code hooks config: - -```json -{ - "hooks": { - "PostToolUse": [ - { - "matcher": "Write|Edit", - "hooks": [{ "command": "node .claude/hooks/post-write.mjs" }] - } - ] - } -} -``` - -This works on Windows, Linux, and macOS. Claude Code requires Node.js, so `node` is always available. - -## Why Cross-Platform Hooks Matter - -If you're the only person using your Claude Code setup, platform compatibility isn't a concern. But the moment you share [`.claude/settings.json`](/blog/guide/configuration-basics) with a teammate, open-source a project, or switch between a Windows workstation and a macOS laptop, platform-specific hooks become a maintenance burden. Every hook that uses `bash` or `powershell` in the command field is a hook that breaks on half your team's machines. - -Most tutorials show platform-specific invocations. Each wrapper is a 2-line file that just calls `node`. Three files maintained across three platforms, all doing the same thing. When the wrapper is the only platform-dependent layer, eliminate it. - -## The Universal Pattern - -Every hook in [`settings.json`](/blog/guide/configuration-basics) follows this universal pattern: - -```json -{ - "command": "node .claude/hooks/your-hook.mjs" -} -``` - -No `cmd /c`. No `bash`. No `powershell`. Just `node`. This pattern works for every [Claude Code hook type](/blog/tools/hooks/hooks-guide) -- PostToolUse, [SessionStart/SessionEnd](/blog/tools/hooks/session-lifecycle-hooks), Stop, and all 12 lifecycle events. - -## Three Rules for Cross-Platform .mjs Files - -Inside your `.mjs` files, three rules keep Claude Code hooks universal across Windows, Linux, and macOS: - -### Use `os.homedir()` Instead of Platform Variables - -Never hardcode `$HOME`, `$env:USERPROFILE`, or `%USERPROFILE%`. - -```javascript -import os from 'node:os'; -const home = os.homedir(); // Works everywhere -``` - -### Use `os.tmpdir()` for Temporary File Paths - -Never hardcode `/tmp` or `$env:TEMP`. - -```javascript -import os from 'node:os'; -const tmp = os.tmpdir(); // Works everywhere -``` - -### Use `path.join()` for All File Path Construction - -Never concatenate paths with `/` or `\\`. Node.js handles the separator for each OS automatically. - -```javascript -import path from 'node:path'; -const logFile = path.join(os.homedir(), '.claude', 'hooks.log'); -``` - -## Cross-Platform Permissions - -Your [`settings.json` permissions](/blog/guide/development/permission-management) should include equivalents for both platforms: - -Commands that don't exist on a platform simply won't be used. Including both costs nothing, and your Claude Code hooks can reference whichever command is available without hitting permission prompts. For more advanced permission automation, see the [Permission Hook guide](/blog/tools/hooks/permission-hook-guide). - -## Complete Working Example - -Here's a complete Claude Code hook that works everywhere -- a file logger that records every Write/Edit operation: - -```javascript -// .claude/hooks/log-writes.mjs -import fs from 'node:fs'; -import os from 'node:os'; -import path from 'node:path'; - -const logDir = path.join(os.homedir(), '.claude', 'logs'); -fs.mkdirSync(logDir, { recursive: true }); - -const logFile = path.join(logDir, 'file-writes.log'); -const input = JSON.parse(fs.readFileSync('/dev/stdin', 'utf8')); - -const entry = `${new Date().toISOString()} ${input.tool_input?.file_path || 'unknown'}\n`; -fs.appendFileSync(logFile, entry); -``` - -Register it in your `settings.json`: - -```json -{ - "hooks": { - "PostToolUse": [ - { - "matcher": "Write|Edit", - "hooks": [{ "command": "node .claude/hooks/log-writes.mjs" }] - } - ] - } -} -``` - -Works identically on Windows 11, Arch Linux, and macOS Sequoia. No wrappers needed. - -## Debugging Cross-Platform Failures - -When a Claude Code hook works on one OS but fails on another, check these three things in order: - -1. **Hardcoded path separators.** Search your `.mjs` files for `/` or `\\` used in file paths. Replace with `path.join()`. -2. **Environment variable references.** Look for `process.env.HOME`, `process.env.USERPROFILE`, or `process.env.TEMP`. Replace with `os.homedir()` and `os.tmpdir()`. -3. **Shell-specific commands in settings.json.** Any `command` field containing `bash`, `cmd`, `powershell`, or `sh` breaks on other platforms. Replace with `node`. - -Run hooks manually to isolate the failure. If it exits 0 on one OS and fails on another, the issue is in the `.mjs` file's path handling, not the hook configuration. - -## Pre-Ship Checklist - -Before shipping Claude Code hooks to a team or open-source project, verify: - -- All `settings.json` commands use `node` (not `cmd`, `powershell`, `bash`) -- All `.mjs` files use `os.homedir()` (not `$HOME` or `%USERPROFILE%`) -- All `.mjs` files use `os.tmpdir()` (not `/tmp` or `$env:TEMP`) -- All `.mjs` files use `path.join()` (not hardcoded separators) -- Permissions include both Windows and Unix equivalents -- StatusLine command uses `node` (not `powershell`) - -One implementation. Three platforms. Zero maintenance overhead. - -## FAQ - -### Do Claude Code hooks work on Windows? - -Yes. Claude Code hooks work on Windows, Linux, and macOS when you invoke them with `node` instead of platform-specific shells. Since Claude Code requires Node.js on every platform, the `node` command is always available. Use `node .claude/hooks/your-hook.mjs` in `settings.json` and your hooks run identically on all three operating systems. - -### Can I use Python instead of Node.js for hooks? - -Python works for cross-platform hooks if your team has Python installed everywhere. Use `python3` (not `python`, which may not exist on some Linux distributions) in the `command` field. However, Node.js is the safer default since Claude Code guarantees its availability on every platform. - -### How do I handle line endings across platforms? - -Node.js handles line endings automatically when using `readFileSync` and `writeFileSync`. If you're reading stdin (which all hooks do), the JSON parsing is line-ending agnostic. The only place line endings matter is if you're generating shell scripts from a hook -- in that case, use `\n` and let Git's `autocrlf` setting handle conversion. - -## Related - -- Read the [complete hooks guide](/blog/tools/hooks/hooks-guide) for all 12 lifecycle events and exit code patterns -- Set up [Context Recovery](/blog/tools/hooks/context-recovery-hook) with cross-platform backup triggers -- Configure [Skill Activation](/blog/tools/hooks/skill-activation-hook) for automatic skill loading -- Explore [Setup Hooks](/blog/tools/hooks/claude-code-setup-hooks) for cross-platform onboarding -- Master [permission rules](/blog/guide/development/permission-management) alongside cross-platform hook permissions diff --git a/docs/site/src/content/blog/cursor-mcp-setup.md b/docs/site/src/content/blog/cursor-mcp-setup.md deleted file mode 100644 index ff7fff36..00000000 --- a/docs/site/src/content/blog/cursor-mcp-setup.md +++ /dev/null @@ -1,335 +0,0 @@ ---- -slug: "cursor-mcp-setup" -title: "Cursor MCP Servers: Complete Setup Guide for 2026" -description: "Set up MCP servers in Cursor IDE. Step-by-step guide to configure Cursor MCP servers for AI-powered development with Model Context Protocol." -date: "2026-01-17" -author: "Max Ritter" -tags: [Guide, MCP] -readingTime: 6 -keywords: "2026, complete, cursor, guide, mcp, servers, setup" ---- - -MCP & Extensions - -# Cursor MCP Servers: Complete Setup Guide for 2026 - -Set up MCP servers in Cursor IDE. Step-by-step guide to configure Cursor MCP servers for AI-powered development with Model Context Protocol. - -**Problem**: You want to extend Cursor with external tools and data sources, but the MCP configuration process feels unclear. Where do the files go? What format do they use? How does it compare to Claude Code? - -**Quick Win**: Create a `.cursor/mcp.json` file in your project root and add your first MCP server: - -```p-4 -{ - "mcpServers": { - "brave-search": { - "command": "npx", - "args": ["-y", "@modelcontextprotocol/server-brave-search"], - "env": { "BRAVE_API_KEY": "your-api-key" } - } - } -} -``` - -Restart Cursor, and you now have web search capabilities inside the IDE. - -## [What Are Cursor MCP Servers?](#what-are-cursor-mcp-servers) - -Cursor MCP servers connect Cursor's AI to external tools, databases, and APIs through the [Model Context Protocol](/blog/tools/mcp-extensions/mcp-basics). They work identically to MCP servers in Claude Code and Claude Desktop since they all use the same underlying protocol. - -With MCP servers configured, Cursor can: - -- Search the web and fetch documentation -- Query databases with natural language -- Interact with GitHub, Slack, and other services -- Automate browser tasks for testing -- Access any service with an MCP server implementation - -The MCP ecosystem is shared across all compatible tools. Any MCP server that works with Claude Desktop also works with Cursor. - -## [Setting Up MCP Servers in Cursor](#setting-up-mcp-servers-in-cursor) - -### [Configuration File Locations](#configuration-file-locations) - -Cursor supports two configuration locations: - -| Location | Path | Scope | -| --- | --- | --- | -| **Project-level** | `.cursor/mcp.json` | Only this project | -| **Global** | `~/.cursor/mcp.json` | All Cursor workspaces | - -Use project-level configs for project-specific tools (like a database server for your app). Use global configs for tools you want everywhere (like web search or GitHub). - -### [Step-by-Step Setup](#step-by-step-setup) - -**Method 1: Manual Configuration** - -1. Create the config file at `.cursor/mcp.json` (project) or `~/.cursor/mcp.json` (global) -2. Add your MCP server configuration -3. Restart Cursor to load the new servers -4. Test by asking the AI to use a tool from your server - -**Method 2: Command Palette** - -1. Open Command Palette (Cmd+Shift+P on Mac, Ctrl+Shift+P on Windows) -2. Search for "MCP" and select "View: Open MCP Settings" -3. Click "New MCP Server" under MCP Tools -4. Cursor creates and opens the mcp.json file for editing - -### [Configuration Format](#configuration-format) - -Cursor MCP servers use the same JSON format as Claude Desktop: - -```p-4 -{ - "mcpServers": { - "server-name": { - "command": "npx", - "args": ["-y", "@modelcontextprotocol/server-name"], - "env": { - "API_KEY": "your-key-here" - } - } - } -} -``` - -For Python-based MCP servers: - -```p-4 -{ - "mcpServers": { - "python-server": { - "command": "python", - "args": ["path/to/server.py"], - "env": { - "DATABASE_URL": "postgresql://localhost/mydb" - } - } - } -} -``` - -### [Remote Server Configuration](#remote-server-configuration) - -Cursor also supports remote MCP servers via HTTP: - -```p-4 -{ - "mcpServers": { - "remote-server": { - "url": "http://localhost:3000/mcp", - "headers": { - "Authorization": "Bearer your-token" - } - } - } -} -``` - -This enables connecting to MCP servers running on remote machines or as shared services. - -## [Best MCP Servers for Cursor](#best-mcp-servers-for-cursor) - -These Cursor MCP servers provide the highest-impact capabilities. All configurations work directly in your `.cursor/mcp.json`: - -### [Web Search and Research](#web-search-and-research) - -```p-4 -{ - "mcpServers": { - "brave-search": { - "command": "npx", - "args": ["-y", "@modelcontextprotocol/server-brave-search"], - "env": { "BRAVE_API_KEY": "your-key" } - } - } -} -``` - -Enables web search directly in Cursor for documentation lookup and research. - -### [GitHub Integration](#github-integration) - -```p-4 -{ - "mcpServers": { - "github": { - "command": "npx", - "args": ["-y", "@modelcontextprotocol/server-github"], - "env": { "GITHUB_TOKEN": "your-token" } - } - } -} -``` - -Access repositories, create issues, manage PRs, and review code without leaving Cursor. - -### [Database Access](#database-access) - -```p-4 -{ - "mcpServers": { - "postgres": { - "command": "npx", - "args": ["-y", "@modelcontextprotocol/server-postgres"], - "env": { "DATABASE_URL": "postgresql://user:pass@localhost/db" } - } - } -} -``` - -Query databases with natural language and get schema information for development. - -### [Browser Automation](#browser-automation) - -```p-4 -{ - "mcpServers": { - "playwright": { - "command": "npx", - "args": ["-y", "@executeautomation/playwright-mcp-server"] - } - } -} -``` - -Automate browser testing, scraping, and visual verification. See our [browser automation guide](/blog/tools/mcp-extensions/browser-automation) for advanced patterns. - -### [File Operations](#file-operations) - -```p-4 -{ - "mcpServers": { - "filesystem": { - "command": "npx", - "args": [ - "-y", - "@modelcontextprotocol/server-filesystem", - "/path/to/allowed/directory" - ] - } - } -} -``` - -Enhanced file operations for reading and modifying files outside Cursor's default scope. - -### [Memory and Knowledge](#memory-and-knowledge) - -```p-4 -{ - "mcpServers": { - "memory": { - "command": "npx", - "args": ["-y", "@modelcontextprotocol/server-memory"] - } - } -} -``` - -Persistent memory across sessions using a knowledge graph structure. - -Browse our [complete MCP servers list](/blog/tools/mcp-extensions/best-addons) for 50+ additional options. - -## [Cursor vs Claude Code MCP](#cursor-vs-claude-code-mcp) - -Cursor and Claude Code both use the same Model Context Protocol, making server configurations largely interchangeable. Key differences: - -| Feature | Cursor | Claude Code | -| --- | --- | --- | -| **Config location** | `.cursor/mcp.json` | `~/.claude.json` or `.mcp.json` | -| **Transport types** | stdio, SSE, HTTP | stdio | -| **OAuth support** | Built-in | Manual | -| **Tool search** | Not available | [Available](/blog/tools/mcp-extensions/mcp-tool-search) | -| **Resources** | Not yet supported | Supported | - -Claude Code's [MCP Tool Search](/blog/tools/mcp-extensions/mcp-tool-search) provides lazy loading that reduces context usage by 95%. Cursor loads all configured MCP tools at session start. - -Both support the same server packages. A server configured for Claude Desktop works in Cursor and vice versa. - -## [Troubleshooting Cursor MCP Servers](#troubleshooting-cursor-mcp-servers) - -### [Server Not Loading](#server-not-loading) - -**Symptom**: MCP server doesn't appear in available tools. - -**Fix**: - -1. Verify the JSON syntax is valid (no trailing commas) -2. Restart Cursor completely (not just reload window) -3. Check the Output panel for MCP-related errors - -### [Authentication Failed](#authentication-failed) - -**Symptom**: Server loads but API calls fail. - -**Fix**: Verify environment variables are set correctly: - -```p-4 -{ - "mcpServers": { - "github": { - "command": "npx", - "args": ["-y", "@modelcontextprotocol/server-github"], - "env": { - "GITHUB_TOKEN": "${env:GITHUB_TOKEN}" - } - } - } -} -``` - -Use `${env:VAR_NAME}` to reference system environment variables instead of hardcoding secrets. - -### [npx Command Not Found](#npx-command-not-found) - -**Symptom**: Server fails with "command not found" error. - -**Fix**: Ensure Node.js is installed and npx is in your PATH. On some systems, use the full path: - -```p-4 -{ - "mcpServers": { - "server-name": { - "command": "/usr/local/bin/npx", - "args": ["-y", "@modelcontextprotocol/server-name"] - } - } -} -``` - -### [Remote Server Connection Issues](#remote-server-connection-issues) - -**Symptom**: HTTP-based MCP server fails to connect. - -**Fix**: - -1. Verify the server is running and accessible -2. Check firewall rules allow the connection -3. Ensure the URL includes the correct protocol (http/https) - -## [Next Steps](#next-steps) - -Expand your Cursor MCP setup: - -1. **Start simple**: Configure Brave Search for immediate web access -2. **Add development tools**: GitHub and database servers accelerate coding workflows -3. **Explore automation**: Set up [browser automation](/blog/tools/mcp-extensions/browser-automation) for testing -4. **Build custom servers**: Create MCP servers for your specific APIs and tools -5. **Browse all options**: Check the [complete MCP servers list](/blog/tools/mcp-extensions/best-addons) - -Cursor MCP servers transform the IDE from an isolated editor into a connected development environment. Start with one server, prove the value, then expand as your workflow demands. - -Sources: - -- [Cursor MCP Documentation](https://cursor.com/docs/context/mcp) -- [How to Add MCP Server to Cursor](https://snyk.io/articles/how-to-add-a-new-mcp-server-to-cursor/) - -Last updated on - -[Previous - -Extensions & Addons](/blog/tools/mcp-extensions/best-addons)[Next - -Search Tools](/blog/tools/mcp-extensions/search-tools) diff --git a/docs/site/src/content/blog/custom-agents.md b/docs/site/src/content/blog/custom-agents.md deleted file mode 100644 index 80e69040..00000000 --- a/docs/site/src/content/blog/custom-agents.md +++ /dev/null @@ -1,213 +0,0 @@ ---- -slug: "custom-agents" -title: "Claude Code Custom Commands: Build Your Own AI Agents" -description: "Create custom Claude Code agents tailored to your workflow. Learn to build specialized commands that automate your unique development patterns." -date: "2025-08-23" -author: "Max Ritter" -tags: [Guide, Agents] -readingTime: 5 -keywords: "agents, ai, build, claude, code, commands, custom, own" ---- - -Agents - -# Claude Code Custom Commands: Build Your Own AI Agents - -Create custom Claude Code agents tailored to your workflow. Learn to build specialized commands that automate your unique development patterns. - -**Problem**: Claude Code's default capabilities don't match your specific workflow. You need a code reviewer that follows your team's standards, or a deployment specialist that knows your infrastructure. - -**Quick Win**: Create your first custom slash command in under 2 minutes: - -```p-4 -mkdir -p .claude/commands -``` - -Create `.claude/commands/code-review.md`: - -```p-4 -Review the recent code changes for quality and security: - -1. Run git diff to see recent changes -2. Focus on modified files only - -Review checklist: - -- Code is readable and well-named -- No duplicated logic -- Proper error handling exists -- No exposed secrets or credentials -- Performance considerations addressed - -Provide feedback by priority: Critical → Warnings → Suggestions -``` - -Then invoke it with `/project:code-review` in Claude Code. - -**Understanding**: Custom slash commands are reusable prompts that invoke Claude with specialized instructions. They act like expert consultants you can summon with a single command. - -## [How Custom Commands Transform Your Workflow](#how-custom-commands-transform-your-workflow) - -Custom commands solve the "remembering the prompt" problem. Instead of typing out detailed instructions every time, you create reusable command files that encode your team's expertise. - -**Three Approaches to Custom Agents**: - -1. **Slash Commands** (`.claude/commands/`): Invoke on-demand with `/project:command-name` -2. **Agent Definitions** (`.claude/agents/`): Persistent sub-agent identities with YAML frontmatter that Claude's orchestrator spawns automatically -3. **CLAUDE.md Instructions**: Always-active behaviors that shape every interaction - -**Commands vs. Agents**: These serve different purposes. Slash commands are prompts you invoke manually for specific workflows. Agent definitions in `.claude/agents/` configure persistent sub-agents that Claude's Task tool can spawn during orchestration. Think of commands as "tools you pick up" and agents as "team members always available." - -Both support the same scoping model: - -| Scope | Commands | Agents | -| --- | --- | --- | -| **Project** | `.claude/commands/` | `.claude/agents/` | -| **User** | `~/.claude/commands/` | `~/.claude/agents/` | - -Project-scoped files are shareable via git. User-scoped files are personal to your machine and available across all projects. - -**Separation of Concerns**: Like good software architecture, specialized commands perform better than general prompts. A security-focused command with specific checklists catches more issues than asking "review this code." - -## [Creating Effective Custom Commands](#creating-effective-custom-commands) - -**Start Simple**: Begin with one specific problem you face repeatedly. - -Create `.claude/commands/security-audit.md`: - -```p-4 -You are a security expert. Scan this codebase for vulnerabilities. - -Check for: - -- SQL injection vulnerabilities -- XSS attack vectors -- Authentication bypass issues -- Exposed API keys or secrets -- OWASP Top 10 violations - -For each finding, provide: - -1. Vulnerability description -2. Risk level (Critical/High/Medium/Low) -3. Specific fix recommendation -4. Code example of the fix - -Start by searching for common vulnerability patterns in the codebase. -``` - -Invoke with `/project:security-audit` whenever you need a security review. - -**Dynamic Arguments**: Commands can accept arguments using `$ARGUMENTS`: - -Create `.claude/commands/review-file.md`: - -```p-4 -Review this specific file for issues: $ARGUMENTS - -Focus on: code quality, potential bugs, security concerns. -``` - -Invoke with `/project:review-file src/auth/login.ts` - -## [CLAUDE.md: Always-Active Agent Behavior](#claudemd-always-active-agent-behavior) - -For behaviors you want active in every session, add them to your project's `CLAUDE.md`: - -```p-4 -## Code Review Standards - -When reviewing code, always check: - -- All functions have error handling -- No console.log statements in production code -- API endpoints validate input parameters -- Database queries use parameterized statements - -## Commit Message Format - -Use conventional commits: type(scope): description -Types: feat, fix, docs, refactor, test, chore -``` - -These instructions shape Claude's behavior automatically without needing to invoke a command. - -**Project vs User Commands**: - -- `.claude/commands/` - Shared with your team via git -- `~/.claude/commands/` - Personal commands on your machine only - -## [Persistent Sub-Agent Definitions with `.claude/agents/`](#persistent-sub-agent-definitions-with-claudeagents) - -For sub-agents that Claude's orchestrator should be able to spawn automatically, use the `.claude/agents/` directory. These are Markdown files with YAML frontmatter that define the agent's identity, capabilities, and instructions. - -Unlike slash commands (which you invoke manually), agent definitions are available to Claude's Task tool during orchestration. When Claude determines it needs a specialist for a particular task, it can spawn a defined agent with the right context and constraints already configured. - -Agents defined here also inherit your project's [CLAUDE.md instructions](/blog/guide/mechanics/claude-md-mastery), so they automatically follow your coding standards and project conventions. - -For a deeper look at how sub-agents work, including parallel execution, backgrounding with `Ctrl+B`, and invocation quality, see the [agent fundamentals guide](/blog/guide/agents/agent-fundamentals). - -## [Common Command Examples](#common-command-examples) - -**Database Optimizer** (`.claude/commands/db-optimize.md`): - -```p-4 -You are a database performance expert. - -Analyze the database queries in this codebase: - -1. Find slow or inefficient queries -2. Check for missing indexes -3. Review schema design - -For each issue, provide: - -- The problematic query or schema -- Why it's a problem -- Optimized version with explanation -``` - -**Documentation Writer** (`.claude/commands/write-docs.md`): - -```p-4 -Write documentation for: $ARGUMENTS - -Include: - -- Purpose and overview -- Setup instructions -- Usage examples -- Common troubleshooting - -Target audience: developers new to this project. -Write in clear, concise language. -``` - -## [Prompting for Specialized Roles](#prompting-for-specialized-roles) - -Sometimes you don't need a saved command. Just prompt Claude directly: - -```p-4 -Act as a senior security engineer. Review the authentication -flow in src/auth/ for vulnerabilities. Be thorough and paranoid. -``` - -This works well for one-off tasks. Save it as a command when you find yourself repeating it. - -## [Next Actions](#next-actions) - -Ready to build your specialist commands? Start with your biggest pain point: - -- **Code Quality**: Create a reviewer command with your team's standards using our [agent fundamentals guide](/blog/guide/agents/agent-fundamentals) -- **Security Focus**: Build a vulnerability scanner with our [sub-agent design patterns](/blog/guide/agents/sub-agent-design) -- **Team Workflow**: Design collaboration patterns using [task distribution strategies](/blog/guide/agents/task-distribution) - -Your custom commands become more valuable as you refine them. Commit them to git, share with your team, and build a library that encodes your collective expertise. - -Last updated on - -[Previous - -Agent Teams](/blog/guide/agents/agent-teams)[Next - -Agent Patterns](/blog/guide/agents/agent-patterns) diff --git a/docs/site/src/content/blog/custom-integrations.md b/docs/site/src/content/blog/custom-integrations.md deleted file mode 100644 index 737ea65e..00000000 --- a/docs/site/src/content/blog/custom-integrations.md +++ /dev/null @@ -1,218 +0,0 @@ ---- -slug: "custom-integrations" -title: "Claude Code Integrations: Build Your Own MCP Servers" -description: "Create custom Claude Code integrations with MCP servers. Learn to extend Claude's capabilities with your tools, APIs, and database connections." -date: "2025-08-23" -author: "Max Ritter" -tags: [Guide, MCP] -readingTime: 4 -keywords: "build, claude, code, custom, integrations, mcp, own, servers" ---- - -MCP & Extensions - -# Claude Code Integrations: Build Your Own MCP Servers - -Create custom Claude Code integrations with MCP servers. Learn to extend Claude's capabilities with your tools, APIs, and database connections. - -**Problem**: Available MCP servers don't connect to YOUR specific tools - your company's database, internal APIs, or custom workflows. You need Claude Code integrated with systems only you use. - -**Quick Win**: Build a basic MCP server in 5 minutes that connects Claude to any REST API: - -```p-4 -// my-api-server.js - Connect Claude to your API -const { Server } = require("@modelcontextprotocol/sdk/server/index.js"); - -const server = new Server({ name: "my-api-server", version: "1.0.0" }); - -server.setRequestHandler("tools/list", async () => ({ - tools: [ - { - name: "fetch_user_data", - description: "Get user information from our internal API", - inputSchema: { - type: "object", - properties: { - userId: { type: "string", description: "User ID to fetch" }, - }, - required: ["userId"], - }, - }, - ], -})); - -server.setRequestHandler("tools/call", async (request) => { - const { name, arguments: args } = request.params; - - if (name === "fetch_user_data") { - const response = await fetch( - `https://api.yourcompany.com/users/${args.userId}`, - { - headers: { Authorization: `Bearer ${process.env.API_TOKEN}` }, - }, - ); - return { - content: [{ type: "text", text: JSON.stringify(await response.json()) }], - }; - } -}); - -server.connect(process.stdio); -``` - -Save this as `my-api-server.js` and test: `node my-api-server.js` - you've created your first custom integration. - -## [MCP Server Development Essentials](#mcp-server-development-essentials) - -MCP servers are Node.js applications that expose tools to Claude Code. They run as separate processes, giving Claude access to APIs, databases, and services. - -**Every MCP Server Needs**: - -- **Tool definitions**: Functions Claude can call -- **Tool handlers**: Code that executes those functions -- **Error handling**: Meaningful responses when things fail -- **Authentication**: Secure access to external systems - -## [Essential Integration Patterns](#essential-integration-patterns) - -### [REST API Integration](#rest-api-integration) - -Connect Claude to any HTTP API or web service: - -```p-4 -// Generic API connector pattern -const { Server } = require("@modelcontextprotocol/sdk/server/index.js"); - -const server = new Server({ name: "api-connector", version: "1.0.0" }); - -server.setRequestHandler("tools/list", async () => ({ - tools: [ - { - name: "api_get", - description: "GET request to any endpoint", - inputSchema: { - type: "object", - properties: { - endpoint: { type: "string", description: "API endpoint path" }, - params: { type: "object", description: "Query parameters" }, - }, - required: ["endpoint"], - }, - }, - ], -})); - -server.setRequestHandler("tools/call", async (request) => { - const { name, arguments: args } = request.params; - - if (name === "api_get") { - const url = new URL(`${process.env.API_BASE_URL}${args.endpoint}`); - if (args.params) { - Object.entries(args.params).forEach(([key, value]) => - url.searchParams.append(key, value), - ); - } - - const response = await fetch(url, { - headers: { Authorization: `Bearer ${process.env.API_TOKEN}` }, - }); - - return { - content: [ - { type: "text", text: JSON.stringify(await response.json(), null, 2) }, - ], - }; - } -}); - -server.connect(process.stdio); -``` - -Works with Stripe, Shopify, internal APIs, or any HTTP service. - -### [Database Integration](#database-integration) - -Connect Claude to your databases: - -```p-4 -// Database connector for PostgreSQL, MySQL, SQLite -const { Server } = require("@modelcontextprotocol/sdk/server/index.js"); -const { Client } = require("pg"); - -const server = new Server({ name: "database-connector", version: "1.0.0" }); -const client = new Client({ connectionString: process.env.DATABASE_URL }); - -server.setRequestHandler("tools/call", async (request) => { - if (request.params.name === "query_database") { - const result = await client.query(request.params.arguments.query); - return { - content: [{ type: "text", text: JSON.stringify(result.rows, null, 2) }], - }; - } -}); -``` - -Now Claude can run queries and help with database operations. - -## [Setup and Testing](#setup-and-testing) - -Create your server project: - -```p-4 -mkdir my-mcp-server && cd my-mcp-server -npm init -y && npm install @modelcontextprotocol/sdk -``` - -Configure Claude Code by adding your server to the MCP settings file. The location depends on your setup: - -- **Claude Code CLI**: `~/.claude.json` (user-level) or `.mcp.json` (project-level) -- **Claude Desktop**: `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS) or `%APPDATA%\Claude\claude_desktop_config.json` (Windows) - -```p-4 -{ - "mcpServers": { - "my-custom-server": { - "command": "node", - "args": ["/path/to/your/server.js"], - "env": { "API_TOKEN": "your-token" } - } - } -} -``` - -After saving the configuration, restart Claude Code to load your new server. - -## [Common Issues and Solutions](#common-issues-and-solutions) - -**Server not found**: Check your configuration file path and JSON syntax. Ensure the command path is absolute. - -**Tool timeout**: Add timeout handling to prevent hanging operations. - -**Authentication failed**: Check environment variables in your server configuration. - -## [Best Practices](#best-practices) - -- Wrap external calls in try-catch blocks for error handling -- Store tokens in environment variables, never hardcode them -- Add rate limiting for APIs with usage restrictions -- Use console.log for debugging - shows in Claude's logs - -## [Next Steps](#next-steps) - -Start building your custom integrations: - -1. **Pick your first API**: Choose one tool you use daily -2. **Use the REST pattern**: Follow the connector template above -3. **Test thoroughly**: Ask Claude "What MCP tools are available?" to verify your server loaded -4. **Add server instructions**: Include descriptive instructions for [MCP Tool Search](/blog/tools/mcp-extensions/mcp-tool-search) compatibility -5. **Learn more**: Check our [MCP basics guide](/blog/tools/mcp-extensions/mcp-basics) and [popular MCP servers](/blog/tools/mcp-extensions/best-addons) - -MCP servers transform Claude Code into your personalized development environment. - -Last updated on - -[Previous - -Social Media MCPs](/blog/tools/mcp-extensions/social-media-mcps)[Next - -Claude Code VS Code](/blog/tools/extensions/claude-code-vscode) diff --git a/docs/site/src/content/blog/deep-thinking-techniques.md b/docs/site/src/content/blog/deep-thinking-techniques.md deleted file mode 100644 index 50ebd50c..00000000 --- a/docs/site/src/content/blog/deep-thinking-techniques.md +++ /dev/null @@ -1,203 +0,0 @@ ---- -slug: "deep-thinking-techniques" -title: "Claude Code Deep Thinking: Unlock Better Results" -description: "Improve Claude Code performance with deep thinking techniques. Learn how to trigger advanced reasoning for complex problem-solving tasks." -date: "2025-08-23" -author: "Max Ritter" -tags: [Guide, Performance] -readingTime: 6 -keywords: "better, claude, code, deep, results, techniques, thinking, unlock" ---- - -Performance - -# Claude Code Performance: Unlock Deep Thinking for Better Results - -Improve Claude Code performance with deep thinking techniques. Learn how to trigger advanced reasoning for complex problem-solving tasks. - -**Problem**: Claude Code gives you surface-level solutions when you need deep, thoughtful analysis for complex problems. - -**Quick Win**: Add a thinking trigger phrase to your next Claude Code prompt: - -```p-4 -claude "think harder about this: Analyze this codebase and suggest architectural improvements" -``` - -Phrases like `think harder`, `ultrathink`, and `think step by step` are prompt techniques that encourage Claude to allocate more test-time compute for deeper reasoning. - -## [What is Deep Thinking?](#what-is-deep-thinking) - -Deep thinking in Claude Code means triggering extended reasoning through specific prompt techniques. When you include phrases like `think harder`, `ultrathink`, or `think step by step` in your prompts, Claude uses more test-time compute to analyze your problem thoroughly. - -These are not special CLI commands. They are natural language cues that signal Claude to engage its extended thinking capabilities before responding. Think of it as the difference between a quick glance and careful examination. Regular prompts get fast answers. Deep thinking prompts get thoughtful, comprehensive solutions. - -## [The Performance Stack](#the-performance-stack) - -### [Level 1: Enhanced Thinking](#level-1-enhanced-thinking) - -Start with a thinking trigger phrase for any complex task: - -```p-4 -claude "think step by step: Optimize this React component for performance" -``` - -This activates Claude's extended thinking mode without changing models. You can use `think harder`, `ultrathink`, or `think step by step` interchangeably. - -### [Level 2: Planning Mode + Deep Thinking](#level-2-planning-mode--deep-thinking) - -Combine a thinking phrase with planning for structured analysis: - -```p-4 -claude "think harder + plan mode: Create a migration strategy from JavaScript to TypeScript" -``` - -This gives you both extended reasoning AND systematic planning. - -### [Level 3: The Revision Engine](#level-3-the-revision-engine) - -Use multiple critique rounds to push performance further: - -```p-4 -claude "ultrathink + plan mode: Create deployment strategy. Then critique your plan for edge cases and improvements." -``` - -Each revision cycle improves the solution quality. The thinking phrase combined with self-critique maximizes test-time compute usage. - -## [Real-World Applications](#real-world-applications) - -### [Debugging Complex Issues](#debugging-complex-issues) - -Instead of: "Why isn't this working?" - -Try: "think harder: Analyze this error stack trace and provide root cause analysis with multiple potential solutions." - -### [Architecture Decisions](#architecture-decisions) - -Instead of: "What's the best database for this?" - -Try: "think step by step + plan mode: Evaluate database options for a real-time chat application with 100K users." - -### [Code Reviews](#code-reviews) - -Instead of: "Review this code" - -Try: "ultrathink: Perform comprehensive code review focusing on performance, security, and maintainability." - -## [Persistent Thinking Configuration](#persistent-thinking-configuration) - -If you use deep thinking regularly, you can enable it permanently instead of adding trigger phrases to every prompt. - -### [Always-On Extended Thinking](#always-on-extended-thinking) - -Add `alwaysThinkingEnabled` to your [settings.json](/blog/guide/configuration-basics) to activate extended thinking for every response: - -```p-4 -// ~/.claude/settings.json -{ - "alwaysThinkingEnabled": true -} -``` - -With this enabled, Claude engages extended thinking on every prompt without needing `think harder` or `ultrathink` phrases. This is ideal for developers who consistently work on complex problems and want maximum reasoning depth by default. - -### [Controlling the Thinking Budget](#controlling-the-thinking-budget) - -The `MAX_THINKING_TOKENS` environment variable controls how many tokens Claude can spend on its internal reasoning process: - -```p-4 -# Set a custom thinking budget (default is 31,999) -export MAX_THINKING_TOKENS=31999 - -# Disable extended thinking entirely -export MAX_THINKING_TOKENS=0 -``` - -Higher values give Claude more space to reason through complex problems but increase latency and token consumption. Lower values force more concise reasoning. Setting it to `0` disables extended thinking completely, which can be useful for simple tasks where speed matters more than depth. - -### [Prompt Caching and Extended Thinking](#prompt-caching-and-extended-thinking) - -Extended thinking can impact prompt caching efficiency. When Claude uses extended thinking, the thinking tokens are part of the response and don't benefit from caching on subsequent turns. For sessions where you're doing repetitive work (like applying the same refactoring pattern across files), you may get better throughput by disabling extended thinking and relying on clear, specific prompts instead. - -If you need fine-grained control over prompt caching, see the [model selection guide](/blog/models/model-selection) for per-model caching configuration. - -## [Cost vs Performance Trade-offs](#cost-vs-performance-trade-offs) - -Before jumping to expensive models like Claude Opus, maximize your current model: - -1. **Use thinking phrases** - `think harder`, `ultrathink`, or `think step by step` often bridge the intelligence gap -2. **Add planning mode** - Structures the extended thinking process -3. **Use revision cycles** - Multiple critiques improve quality -4. **Consider sub-agents** - Different perspectives on complex problems - -This approach delivers 80% of Opus performance at 20% of the cost. Extended thinking uses test-time compute more efficiently than switching models. - -## [Common Deep Thinking Patterns](#common-deep-thinking-patterns) - -### [The Systematic Approach](#the-systematic-approach) - -```p-4 -claude "think step by step + plan mode: -1. Analyze the current system -2. Identify bottlenecks -3. Propose solutions -4. Create implementation plan -5. Critique the plan for missing elements" -``` - -### [The Multi-Perspective Analysis](#the-multi-perspective-analysis) - -```p-4 -claude "think harder: Analyze this API design from the perspectives of: -- Performance engineer -- Security auditor -- Frontend developer -- DevOps engineer" -``` - -### [The Iterative Refinement](#the-iterative-refinement) - -```p-4 -claude "ultrathink + plan mode: Design a caching strategy. -Then critique it for edge cases and suggest improvements." -``` - -## [When Deep Thinking Falls Short](#when-deep-thinking-falls-short) - -If thinking phrases + planning + revisions still aren't enough: - -1. **Add sub-agents** for different specialized perspectives -2. **Break down the problem** into smaller, focused tasks -3. **Consider Claude Opus** for truly complex scenarios -4. **Use domain-specific [MCP extensions](/blog/tools/mcp-extensions/mcp-basics)** for specialized tasks - -## [Success Indicators](#success-indicators) - -You know deep thinking is working when Claude: - -- Provides multiple solution approaches -- Considers edge cases you didn't think of -- Explains trade-offs and reasoning -- Offers implementation strategies -- Suggests potential improvements - -## [Next Actions](#next-actions) - -**Immediate**: Add `think harder:` or `think step by step:` to your next challenging prompt and compare the response quality - -**Advanced**: Learn [planning mode strategies](/blog/guide/mechanics/planning-modes) to structure extended thinking - -**Optimization**: Explore [model selection](/blog/models/model-selection) to balance cost and performance - -**Scaling**: Set up [custom agents](/blog/guide/agents/custom-agents) for specialized deep thinking tasks - -**Troubleshooting**: Check our [performance optimization guide](/blog/guide/performance/speed-optimization) if deep thinking feels slow - -Deep thinking transforms Claude Code from a quick answer tool into a thoughtful problem-solving partner. These prompt techniques cost nothing extra to use but dramatically improve solution quality by leveraging Claude's extended reasoning capabilities. - -Last updated on - -[Previous - -Usage Optimization](/blog/guide/development/usage-optimization)[Next - -Context Preservation](/blog/guide/performance/context-preservation) diff --git a/docs/site/src/content/blog/efficiency-patterns.md b/docs/site/src/content/blog/efficiency-patterns.md deleted file mode 100644 index f6b4247c..00000000 --- a/docs/site/src/content/blog/efficiency-patterns.md +++ /dev/null @@ -1,151 +0,0 @@ ---- -slug: "efficiency-patterns" -title: "Claude Code Permutation Frameworks for Better Code" -description: "Master efficiency patterns in Claude Code using permutation frameworks. Learn to generate multiple solutions and pick the best approach." -date: "2025-08-23" -author: "Max Ritter" -tags: [Guide, Performance] -readingTime: 4 -keywords: "better, claude, code, efficiency, frameworks, patterns, permutation" ---- - -Performance - -# Claude Code Optimization: Permutation Frameworks for Better Solutions - -Master efficiency patterns in Claude Code using permutation frameworks. Learn to generate multiple solutions and pick the best approach. - -**Problem**: Building similar features one by one wastes time and creates inconsistent code patterns. - -**Quick Win**: Add this to your [CLAUDE.md](/blog/guide/mechanics/claude-md-mastery) right now - it will immediately improve consistency: - -```p-4 -# Component Generation Framework - -When creating new [cards/forms/modals], follow the pattern in /components/examples/: - -1. Copy the closest existing example -2. Replace data fields (keep structure identical) -3. Update types to match new data model -4. Run existing tests as template for new tests -``` - -This simple instruction eliminates Claude's tendency to reinvent patterns that already exist in your codebase. - -**Understanding**: Permutation frameworks transform Claude Code from building individual features to generating systematic variations of proven patterns. - -## [What Are Permutation Frameworks?](#what-are-permutation-frameworks) - -A permutation framework is a structured approach where you build 10+ similar features manually, then create a CLAUDE.md template that lets Claude generate the 11th, 12th, and 13th variations reliably. Instead of coding each feature from scratch, you establish the pattern once and let Claude fill in the variations. - -This shifts your role from implementation to orchestration - reviewing AI-generated feature permutations rather than building each manually. - -## [The Three-Phase Framework Development](#the-three-phase-framework-development) - -### [Phase 1: Manual Foundation Building](#phase-1-manual-foundation-building) - -Start by implementing 8-12 similar features by hand. Document every decision, pattern, and constraint. This creates your reference library that Claude will learn from. - -```p-4 -# Track your patterns -mkdir /patterns/user-interfaces -# Build: LoginForm, SignupForm, ProfileForm, etc. -# Document decisions in each component -``` - -### [Phase 2: Pattern Recognition and Templating](#phase-2-pattern-recognition-and-templating) - -Analyze your manual implementations to identify: - -- Common code structures -- Variable elements that change between implementations -- Constraints that ensure quality -- Success criteria for each variation - -Create a detailed CLAUDE.md section that captures these patterns with specific examples of what works and what doesn't. - -### [Phase 3: Automated Generation](#phase-3-automated-generation) - -Use your framework to generate new variations. Start with simple cases and gradually increase complexity as Claude demonstrates reliability within your constraints. - -## [Framework Refinement Strategies](#framework-refinement-strategies) - -### [Constraint-Based Quality Control](#constraint-based-quality-control) - -Well-defined frameworks limit Claude's creative variance while maintaining useful output diversity. Include specific constraints in your CLAUDE.md: - -```p-4 -CONSTRAINTS: - -- All components must include PropTypes -- Use established naming conventions (camelCase for props) -- Include accessibility attributes -- Follow existing file structure in /components/ -``` - -### [Variance Testing](#variance-testing) - -Test your framework by generating 5-10 variations and analyzing consistency. If variance is too high, add more specific examples and constraints to your CLAUDE.md template. - -### [Iterative Improvement](#iterative-improvement) - -Each framework iteration should improve both Claude's adherence to your patterns and your own understanding of what creates reliable AI-generated code. - -## [Permutation Framework in Action](#permutation-framework-in-action) - -Here's a real example. After building UserCard, ProductCard, and OrderCard manually, you add this to CLAUDE.md: - -```p-4 -# Card Component Framework - -Reference: /components/cards/UserCard.tsx (canonical example) - -To create a new [Entity]Card: - -1. Props: { data: [Entity], onClick?: () => void, variant?: 'compact' | 'full' } -2. Structure: Avatar/Icon + Title + Subtitle + Action buttons -3. Styling: Use existing Tailwind classes from UserCard -4. Tests: Copy UserCard.test.tsx, replace User with [Entity] -``` - -Now when you ask Claude to "create a SubscriptionCard", it follows your established pattern exactly - same prop structure, same styling approach, same test coverage. - -## [Common Efficiency Patterns](#common-efficiency-patterns) - -**API Endpoints**: Framework for routes with consistent error handling, validation, and response shapes. - -**UI Components**: Framework for design system components handling different data types. - -**Database Operations**: Framework for CRUD with consistent transaction handling across models. - -## [Success Metrics for Frameworks](#success-metrics-for-frameworks) - -Monitor these indicators to ensure your permutation framework is working effectively: - -- **Consistency Score**: How similar are generated variations to your manual examples? -- **Implementation Speed**: Time from request to working feature -- **Review Time**: How long does it take to validate generated code? -- **Bug Frequency**: Are generated variations introducing more or fewer bugs? - -## [From Linear to Exponential Scaling](#from-linear-to-exponential-scaling) - -Traditional development scales linearly - one developer builds one feature at a time. Permutation frameworks enable exponential scaling where one framework generates multiple feature variations, transforming your development velocity. - -This approach works best when you can identify repetitive patterns in your codebase that provide different value to users but follow similar technical implementations. - -**Next Actions**: - -1. **Today**: Find 3 similar components in your codebase (cards, forms, or modals work best) -2. **This week**: Build your first framework by documenting what makes those components consistent -3. **Deep dive**: Master [CLAUDE.md techniques](/blog/guide/mechanics/claude-md-mastery) for framework documentation -4. **Related**: Use [planning modes](/blog/guide/mechanics/planning-modes) to structure complex framework requests -5. **Optimize**: Apply [model selection strategies](/blog/models/model-selection) to balance cost and quality -6. **Automate**: Set up [feedback loops](/blog/guide/development/feedback-loops) for continuous improvement - -Last updated on - -[Previous - -Speed Optimization](/blog/guide/performance/speed-optimization)[Next - -Agent Fundamentals](/blog/guide/agents/agent-fundamentals) diff --git a/docs/site/src/content/blog/examples-templates.md b/docs/site/src/content/blog/examples-templates.md deleted file mode 100644 index fe47f6bc..00000000 --- a/docs/site/src/content/blog/examples-templates.md +++ /dev/null @@ -1,146 +0,0 @@ ---- -slug: "examples-templates" -title: "7 Claude Code Prompts That Build Real Apps Fast" -description: "Copy-paste Claude Code prompts for React apps, REST APIs, database schemas, and test suites. Each generates working code you can ship today." -date: "2025-08-23" -author: "Max Ritter" -tags: [Guide] -readingTime: 4 -keywords: "7, apps, build, claude, code, examples, fast, prompts, real, templates, that" ---- - -# 7 Claude Code Prompts That Build Production Apps in Minutes - -Copy-paste Claude Code prompts for React apps, REST APIs, database schemas, and test suites. Each generates working code you can ship today. - -Copy these Claude Code examples and start building immediately. Each template is production-tested and demonstrates patterns that work in real projects. No tweaking required. - -## [Quick Start Web App](#quick-start-web-app) - -Build a complete React application in minutes with this template: - -```p-4 -claude "Create a React todo app with TypeScript and Tailwind CSS. Store todos in localStorage. Include add, edit, delete, mark complete, and filter by status. Make it mobile-responsive." -``` - -This generates: - -- TypeScript React components -- Tailwind CSS styling -- Local storage integration -- Full CRUD operations -- Responsive design - -Perfect for prototyping or learning React patterns. Expand it into a full project by adding authentication or API integration using our [Configuration Basics guide](/blog/guide/configuration-basics). - -## [API Backend Template](#api-backend-template) - -Create a Node.js Express API with authentication: - -```p-4 -claude "Build an Express.js REST API with JWT authentication. Include user registration, login, and logout endpoints. Hash passwords with bcrypt. Add middleware for protected routes and centralized error handling." -``` - -You'll get: - -- JWT token authentication -- Password hashing with bcrypt -- Input validation middleware -- Error handling patterns -- Protected route examples - -This template handles the security basics so you focus on business logic. Scale it further with database integration covered in our [First Project tutorial](/blog/guide/first-project). - -## [Database Schema Generator](#database-schema-generator) - -Generate PostgreSQL schemas with relationships: - -```p-4 -claude "Create a PostgreSQL schema for an e-commerce app. I need users, products, orders, and order_items tables with proper foreign keys. Add indexes for common queries and include sample INSERT statements for testing." -``` - -Creates: - -- Normalized table structures -- Foreign key relationships -- Performance indexes -- Sample INSERT statements -- Proper data types - -Use this pattern for any domain - just replace "e-commerce" with your use case. When you're ready to implement, check our [Installation Guide](/blog/guide/installation-guide) for database setup. - -## [Testing Framework Setup](#testing-framework-setup) - -Generate complete test suites with this template: - -```p-4 -claude "Set up Jest and React Testing Library for a TypeScript React project. Include example unit tests for a Button component, integration tests with mocked API calls, and factory functions for test data. Add test and test:coverage scripts to package.json." -``` - -This provides: - -- Jest configuration -- Component testing utilities -- API mocking patterns -- Test data generators -- NPM script automation - -Essential for production applications. Learn more about project structure in our [Configuration Basics](/blog/guide/configuration-basics). - -## [Mobile-First Responsive Template](#mobile-first-responsive-template) - -Create mobile-optimized layouts instantly: - -```p-4 -claude "Build a responsive landing page with mobile-first design. Include a hero section with CTA, three feature cards, a testimonials carousel, and a contact form. Use CSS Grid for layout and Flexbox for components. Add breakpoints at 640px, 768px, and 1024px." -``` - -Generates: - -- Mobile-first CSS patterns -- Responsive grid layouts -- Modern flexbox usage -- Cross-browser compatibility -- Accessibility basics - -## [Common Development Patterns](#common-development-patterns) - -### [Error Handling Template](#error-handling-template) - -```p-4 -claude "Create an error handling system for a Node.js Express app. Include custom error classes for validation, authentication, and not-found errors. Add async error wrapper, Winston logging, and JSON error responses with proper HTTP status codes." -``` - -### [State Management Setup](#state-management-setup) - -```p-4 -claude "Set up Redux Toolkit with TypeScript for a React app. Create store configuration, a userSlice with login/logout actions, and an appSlice for UI state. Include an async thunk for fetching user data and show how to use useSelector and useDispatch in components." -``` - -### [Form Validation Pattern](#form-validation-pattern) - -```p-4 -claude "Create a signup form with React Hook Form and Zod validation. Include fields for name, email, and password with real-time error messages. The password needs 8+ characters, one uppercase, and one number. Show loading state on submit and infer TypeScript types from the Zod schema." -``` - -## [Usage Tips](#usage-tips) - -**Be Specific**: The more details you provide, the better results you get. Include technology stack, specific features, and any constraints. "Add a dark mode toggle" is better than "make it customizable." - -**Iterate Fast**: Use these templates as starting points, then refine with follow-up requests. "Add user authentication to this" or "Convert the styling to Tailwind" work naturally in conversation. - -**Combine Patterns**: Mix templates for complete solutions. Start with the web app, add the API backend, then integrate the database schema. Claude Code maintains context across requests. - -## [What's Next?](#whats-next) - -These templates solve common development challenges, but Claude Code handles any project structure you throw at it. Got stuck? Check our [Troubleshooting guide](/blog/guide/troubleshooting) for solutions. - -Ready to customize these patterns for your specific stack? Our [FAQ section](/blog/guide/faq) covers project customization and optimization techniques. - -Last updated on - -[Previous - -Backlink Strategy Guide](/blog/guide/saas-startups/backlink-strategy-guide)[Next - -Troubleshooting](/blog/guide/troubleshooting) diff --git a/docs/site/src/content/blog/experimentation-mindset.md b/docs/site/src/content/blog/experimentation-mindset.md deleted file mode 100644 index 4b3d13e9..00000000 --- a/docs/site/src/content/blog/experimentation-mindset.md +++ /dev/null @@ -1,148 +0,0 @@ ---- -slug: "experimentation-mindset" -title: "Claude Code: 4 Experiments That Optimize Results" -description: "Prompt style showdown, context loading tests, and planning mode comparison. Run these 4 Claude Code experiments and stop guessing what works." -date: "2025-08-23" -author: "Max Ritter" -tags: [Guide, Workflow] -readingTime: 4 -keywords: "4, claude, code, experimentation, experiments, mindset, optimize, results, that" ---- - -Mechanics - -# Claude Code Experiments: 4 Tests to Optimize Your Workflow - -Prompt style showdown, context loading tests, and planning mode comparison. Run these 4 Claude Code experiments and stop guessing what works. - -**Problem**: You use the same prompting patterns every session - and you have no idea if they are optimal or costing you time. - -**Quick Win**: Run this experiment right now to see how prompt style changes Claude's output: - -```p-4 -# Experiment A: Direct command -claude "Fix the bug in auth.js" - -# Experiment B: Collaborative framing -claude "Let's debug auth.js together. Walk me through what you see first." -``` - -Compare the outputs. The collaborative version typically produces more thorough analysis and catches edge cases the direct version misses. That is experimentation in action. - -## [Experiment 1: Prompt Style Showdown](#experiment-1-prompt-style-showdown) - -The same task produces dramatically different results based on how you frame it. Try these three styles on any debugging task: - -```p-4 -# Style 1: Command -claude "Fix the login validation bug" - -# Style 2: Teaching request -claude "Explain what's wrong with login validation and show me the fix step by step" - -# Style 3: Review mode -claude "Review the login validation code. What bugs, security issues, or edge cases do you see?" -``` - -**What you'll discover**: Style 3 (review mode) consistently finds more issues because it frames the task as analysis rather than quick-fix execution. Document which style works best for different task types in your projects. - -## [Experiment 2: File Context Impact](#experiment-2-file-context-impact) - -Claude's code quality changes based on what files you provide as context. Test this yourself: - -```p-4 -# Experiment A: Single file -claude "Refactor UserService.ts for better error handling" - -# Experiment B: Related files included -claude "Refactor UserService.ts for better error handling. Related files: AuthController.ts, types/user.ts, utils/errors.ts" -``` - -The second version produces refactors that align with your existing patterns. Without context, Claude invents patterns that may conflict with your codebase. - -**Try this**: Before your next refactoring task, explicitly list 2-3 related files. Compare the output quality to working with a single file. - -## [Experiment 3: Planning Mode vs Direct Execution](#experiment-3-planning-mode-vs-direct-execution) - -[Planning mode](/blog/guide/mechanics/planning-modes) (`Shift+Tab` twice) changes how Claude approaches problems. Run this comparison: - -```p-4 -# Direct execution -claude "Add user role permissions to the dashboard" - -# Planning first (enter planning mode, then) -claude "Add user role permissions to the dashboard" -``` - -In planning mode, Claude analyzes your codebase and presents options before touching files. You get to review the approach, catch potential issues, and choose the best path forward. - -**The discovery**: Complex features (3+ files affected) almost always benefit from planning mode. Simple fixes do not. Find your threshold. - -## [Experiment 4: CLAUDE.md Configurations](#experiment-4-claudemd-configurations) - -Your [CLAUDE.md file](/blog/guide/mechanics/claude-md-mastery) directly shapes Claude's behavior. Test different configurations: - -```p-4 -# Configuration A: Minimal - -Always run tests after changes. - -# Configuration B: Detailed - -Always run tests after changes. -Prefer small, focused commits. -Ask before modifying files outside src/. -Use existing patterns from the codebase. -``` - -Run the same task with each configuration and compare: - -- How many clarifying questions does Claude ask? -- Does it follow your project patterns? -- Are the commits appropriately scoped? - -Your CLAUDE.md is not documentation - it is an operating system. Experiment with different instructions to find what produces the best results for your workflow. - -## [Building Your Experiment Log](#building-your-experiment-log) - -Create a simple tracking file: - -```p-4 -# Experiments Log - -## 2025-01-15: Prompt Framing - -- **Test**: "Fix X" vs "Review X for issues" -- **Result**: Review framing found 3 additional edge cases -- **Action**: Use review framing for any security-related code - -## 2025-01-16: Context Loading - -- **Test**: Single file vs multi-file context -- **Result**: Multi-file context matched existing error patterns -- **Action**: Always include related type files for refactors -``` - -This log becomes your personal optimization guide. Patterns that work get repeated. Patterns that fail get avoided. - -## [Next Experiments](#next-experiments) - -Ready to test more? Try these: - -1. **[Context management](/blog/guide/mechanics/context-management)**: What happens at 60% vs 90% context usage? -2. **[Auto-planning](/blog/guide/mechanics/auto-planning-strategies)**: Does automated planning outperform manual mode switching? -3. **[Model selection](/blog/models/model-selection)**: How do different models handle the same complex task? - -Stop guessing what works. Run the experiment. Document the result. Iterate. - -Every session is a chance to discover something that makes you faster. The developers who experiment systematically outperform those who stick with their first approach. - -This experimentation approach is what we call the "system evolution mindset." It's one of [5 Claude Code best practices](/blog/guide/development/agentic-engineering-best-practices) that separate top developers from everyone else. - -Last updated on - -[Previous - -Auto-Planning Strategies](/blog/guide/mechanics/auto-planning-strategies)[Next - -Context Management](/blog/guide/mechanics/context-management) diff --git a/docs/site/src/content/blog/faq.md b/docs/site/src/content/blog/faq.md deleted file mode 100644 index 0d0ca1cb..00000000 --- a/docs/site/src/content/blog/faq.md +++ /dev/null @@ -1,159 +0,0 @@ ---- -slug: "faq" -title: "Is Claude Code Free? 12 Questions Answered" -description: "Real costs ($6/day typical), Cursor vs Claude Code differences, what Skills do, and whether you can use Claude Code offline. No fluff answers." -date: "2025-08-14" -author: "Max Ritter" -tags: [Guide] -readingTime: 6 -keywords: "12, answered, claude, code, faq, free, questions" ---- - -# Is Claude Code Free? (Plus 12 Questions You're Googling) - -Real costs ($6/day typical), Cursor vs Claude Code differences, what Skills do, and whether you can use Claude Code offline. No fluff answers. - -## [Is Claude Code free?](#is-claude-code-free) - -Claude Code itself is free to install, but you need either an Anthropic API key or a Claude subscription to use it. The API charges per token used - expect roughly $6 per day for typical development work, with 90% of users staying under $12 daily. Alternatively, Claude Pro ($20/month) includes Claude Code access with usage limits, while Max plans ($100-200/month) offer higher limits and access to Claude 4 Opus. - -```p-4 -# Native installer (recommended) - no Node.js required -curl -fsSL https://claude.ai/install.sh | bash # macOS/Linux -# Windows: irm https://claude.ai/install.ps1 | iex - -claude # Prompts for API key on first run -``` - -Check our [native installer guide](/blog/guide/native-installer) for one-command setup, or the [complete installation guide](/blog/guide/installation-guide) for all options. - -## [What models does Claude Code use?](#what-models-does-claude-code-use) - -Claude Code runs on the Claude 4 model family. **Claude 4 Sonnet** is the default, balancing speed, capability, and cost for daily development. **Claude 4 Opus** offers superior reasoning for complex architectural decisions but runs slower and costs more. - -You can switch models using aliases instead of full model names: `sonnet`, `opus`, `haiku`, and `opusplan`. The `opusplan` alias is a hybrid strategy that uses Opus for planning and Sonnet for execution, giving you stronger reasoning where it matters most while keeping costs reasonable. - -```p-4 -# Use aliases for quick switching -claude --model sonnet -/model opus - -# Hybrid mode: Opus plans, Sonnet executes -/model opusplan - -# Set a permanent default in settings.json -# { "model": "claude-sonnet-4-20250514" } -``` - -Model priority (highest to lowest): `/model` during session > `--model` at startup > `ANTHROPIC_MODEL` env var > `model` in settings.json. You can also control sub-agent models separately with the `CLAUDE_CODE_SUBAGENT_MODEL` environment variable. - -Learn model selection strategies in our [model selection guide](/blog/models/model-selection). - -## [What's the difference between Claude Code vs Cursor?](#whats-the-difference-between-claude-code-vs-cursor) - -Claude Code is a terminal-first AI agent - it sees your entire codebase, executes commands, and handles multi-file operations autonomously. Cursor is an AI-enhanced IDE with real-time code completion and inline suggestions. Think of it as: **Claude Code = AI drives, you supervise** while **Cursor = you drive, AI assists**. Many developers use both together - Cursor as the IDE and Claude Code for complex reasoning and automation tasks. - -Deep dive: [Claude Code vs Cursor comparison](/blog/tools/extensions/claude-code-vs-cursor). - -## [What are Claude Code Skills?](#what-are-claude-code-skills) - -Skills are modular expertise packages that extend Claude's capabilities. Each Skill contains instructions, scripts, and resources in a folder that Claude automatically loads when relevant. For example, a "code-review" skill teaches Claude your team's review standards without you explaining them every time. Skills live in `~/.claude/skills/` (personal) or `.claude/skills/` (project-specific). - -```p-4 -# Skills auto-load when relevant, or invoke manually -/skill security-review -``` - -Master this powerful feature: [Claude Code Skills guide](/blog/guide/mechanics/claude-skills-guide). - -## [What's CLAUDE.md and why do I need it?](#whats-claudemd-and-why-do-i-need-it) - -CLAUDE.md is your project's memory file - it gives Claude persistent context about your codebase, conventions, and preferences. Unlike chat messages that fade, CLAUDE.md loads automatically every session. Put it in your project root with tech stack details, code style rules, and common commands. Keep it under 300 lines; Claude follows these instructions more strictly than chat prompts. - -```p-4 -# Auto-generate a starter CLAUDE.md -/init -``` - -Complete setup: [CLAUDE.md mastery guide](/blog/guide/mechanics/claude-md-mastery). - -## [How do I manage API costs?](#how-do-i-manage-api-costs) - -Track usage with the `ccusage` tool, use Claude 4 Sonnet (not Opus) for routine work, and leverage prompt caching for repeated operations. The `/compact` command compresses context to reduce token usage. For heavy usage, Max subscriptions ($100-200/month) provide better value than pay-per-token API billing. - -```p-4 -# Check your usage -npx ccusage - -# Compress context to save tokens -/compact -``` - -Detailed strategies: [usage optimization guide](/blog/guide/development/usage-optimization). - -## [Can Claude Code write tests and deploy apps?](#can-claude-code-write-tests-and-deploy-apps) - -Yes to tests - Claude Code writes unit tests, integration tests, and end-to-end tests across frameworks like Jest, Pytest, and Vitest. For deployment, Claude generates scripts, Dockerfiles, and CI/CD configs but doesn't execute production deployments directly. It prepares everything; you run the final deploy command for safety. - -See testing workflows: [feedback loops guide](/blog/guide/development/feedback-loops). - -## [Does Claude Code work offline?](#does-claude-code-work-offline) - -No. Claude Code requires internet connectivity to communicate with Anthropic's API for all AI processing. Your code stays local, but queries go to Anthropic's servers. There's no offline mode - plan for connectivity when using Claude Code in production workflows. - -## [How do I configure Claude Code for my project?](#how-do-i-configure-claude-code-for-my-project) - -Claude Code has two configuration systems working together. **CLAUDE.md files** give Claude instructions and context (what to do), while **settings.json files** control permissions, tools, and behavior (how to operate). - -For instructions, use **CLAUDE.md** in your project root for codebase context, **Skills** in `.claude/skills/` for reusable workflows, and **slash commands** in `.claude/commands/` for custom actions. Start with `/init` to generate a baseline CLAUDE.md. - -For configuration, `settings.json` uses a **4-scope hierarchy**: Managed (IT-deployed, highest priority), Local (`.claude/settings.local.json`, personal per-project), Project (`.claude/settings.json`, shared with your team), and User (`~/.claude/settings.json`, your global defaults). More specific scopes override broader ones, so you can set team standards in Project scope and personal overrides in Local scope. - -```p-4 -# Initialize CLAUDE.md -/init - -# Add $schema for autocomplete in your editor -# Then edit .claude/settings.json -``` - -Configuration deep dive: [configuration basics](/blog/guide/configuration-basics). Full settings key reference: [settings reference](/blog/guide/settings-reference). - -## [What can Claude Code actually do?](#what-can-claude-code-actually-do) - -Claude Code builds complete applications from scratch, refactors across hundreds of files, debugs complex issues by reading logs and tracing code, writes comprehensive tests, manages git operations, and runs terminal commands. It maintains a 200K token context window, so it actually remembers your entire conversation and codebase structure. Unlike chatbots that forget context, Claude Code sees and understands your full project. - -Start building: [first project tutorial](/blog/guide/first-project). - -## [How do I fix "command not found" errors?](#how-do-i-fix-command-not-found-errors) - -This usually means the installation didn't add Claude to your PATH. The native installer handles this automatically. Try reinstalling: - -```p-4 -# Recommended: use native installer -curl -fsSL https://claude.ai/install.sh | bash # macOS/Linux -# Windows PowerShell: irm https://claude.ai/install.ps1 | iex - -# Restart terminal, then verify: -claude --version -``` - -More fixes: [troubleshooting guide](/blog/guide/troubleshooting). - -## [Do I need programming experience?](#do-i-need-programming-experience) - -No prior coding experience required. Claude Code explains every action, suggests next steps, and teaches concepts as it works. Non-technical founders have successfully built and launched MVPs using natural language instructions. That said, basic terminal familiarity helps - know how to navigate folders and run commands. - -## [How does Claude Code handle privacy?](#how-does-claude-code-handle-privacy) - -Your code transmits to Anthropic's API for processing - necessary for AI analysis. Anthropic states they don't train models on API data. For sensitive codebases, review Anthropic's security documentation and consider enterprise agreements with additional guarantees. Code remains on your local machine; only the context you actively share gets sent to the API. - -Privacy details: [Anthropic's data policy](https://www.anthropic.com/legal/privacy). - -Last updated on - -[Previous - -Troubleshooting](/blog/guide/troubleshooting)[Next - -Changelog](/blog/guide/changelog) diff --git a/docs/site/src/content/blog/fast-mode.md b/docs/site/src/content/blog/fast-mode.md deleted file mode 100644 index 57030670..00000000 --- a/docs/site/src/content/blog/fast-mode.md +++ /dev/null @@ -1,138 +0,0 @@ ---- -slug: "fast-mode" -title: "Claude Code Fast Mode: Speed Up Opus 4.6 Responses" -description: "Get 2.5x faster Claude Code responses with fast mode. Same Opus 4.6 quality, lower latency, higher cost. Toggle with /fast for rapid iteration cycles." -date: "2026-02-17" -author: "Max Ritter" -tags: [Guide, Performance] -readingTime: 14 -keywords: "fast, mode, claude, code, opus, 4.6, speed, latency, performance, toggle" ---- - -Performance - -# Claude Code Fast Mode: Speed Up Opus 4.6 Responses - -Get 2.5x faster Claude Code responses with fast mode. Same Opus 4.6 quality, lower latency, higher cost. Toggle with /fast for rapid iteration cycles. - -**Problem**: You're iterating on code with Opus 4.6 and the response times feel sluggish for interactive work. Reducing the effort level trades quality for speed. You want full Opus 4.6 reasoning at a faster pace. - -**Quick Win**: Type `/fast` in your Claude Code session and press Tab to toggle fast mode on. You'll see a lightning bolt icon next to your prompt. Same model, 2.5x faster output. - -## What Fast Mode Actually Does - -Here's the most important thing to understand about Claude Code fast mode: it does not switch you to a different model. You're still running [Claude Opus 4.6](/blog/models/claude-opus-4-6). The same weights, the same capabilities, the same quality ceiling. This isn't Haiku wearing an Opus label. It's actual Opus 4.6 with infrastructure-level priority. - -What changes is the API configuration behind the scenes. Anthropic routes your requests through a faster serving path, delivering responses roughly 2.5x faster than standard Opus 4.6. You pay more per token for this priority treatment, but the intelligence stays identical. The model doesn't skip reasoning steps or compress its output to hit lower latency. It produces the same response, just faster. - -This distinction matters because the traditional path to faster Claude Code responses has been [reducing your effort level](/blog/guide/performance/deep-thinking-techniques), which genuinely reduces thinking depth. A lower effort level tells the model to spend less time reasoning, which works for simple tasks but hurts quality on anything complex. Fast mode sidesteps that tradeoff entirely. You get speed without sacrificing quality. - -Fast mode launched as a research preview, so expect Anthropic to refine pricing, rate limits, and the overall experience over time. - -## How to Enable Fast Mode - -Toggle fast mode with a single command: - -```p-4 -/fast -``` - -Press Tab to confirm. That's it. A lightning bolt icon appears next to your prompt, confirming fast mode is active. Run `/fast` again to disable it. - -You can also set it permanently in your user settings file. See the [settings reference](/blog/guide/settings-reference) for all available configuration options. - -A few behaviors to know: - -- **Persists across sessions.** Once enabled, fast mode stays on until you disable it. -- **Auto-switches to Opus 4.6.** If you're on Haiku or Sonnet when you enable fast mode, it bumps you to Opus 4.6 automatically. -- **Disabling keeps your model.** When you toggle fast mode off with `/fast`, you stay on Opus 4.6. Use `/model` to [switch to a different model](/blog/guide/performance/speed-optimization) if needed. - -## Pricing - -Opus 4.6 fast mode pricing varies based on your context window size: - -| Mode | Input (per MTok) | Output (per MTok) | -| --- | --- | --- | -| Fast mode Opus 4.6 (under 200K context) | $30 | $150 | -| Fast mode Opus 4.6 (over 200K context) | $60 | $225 | - -Several pricing details matter for budgeting: - -- **Compatible with 1M extended context.** Fast mode works with the full [1M context window](/blog/guide/mechanics/context-management), though pricing increases above 200K tokens. -- **Billed to extra usage only.** Fast mode tokens don't count against your plan's included usage. Every token goes straight to extra usage billing. -- **Switching mid-conversation is expensive.** When you enable fast mode partway through a session, you pay the full uncached input price for your entire existing context. Enable fast mode at the start of a session for the best cost efficiency. - -## When to Use Fast Mode - -Fast mode shines during interactive work where latency directly impacts your productivity: - -- **Rapid iteration cycles.** You make a change, test it, ask Claude to adjust, and repeat. The 2.5x speed boost compounds across dozens of these micro-interactions per session. In a typical debugging session with 25 back-and-forth exchanges, fast mode shaves roughly 15-20 minutes off the total wait time compared to standard Opus 4.6. -- **Live debugging.** When you're chasing a bug through stack traces and log output, waiting for responses breaks your concentration. Faster answers keep you in flow state. -- **Time-sensitive deadlines.** Shipping a fix at 2 AM or racing to complete a feature before a demo. Those are the moments where paying extra per token makes obvious sense. -- **Interactive pair programming.** When latency matters more than cost, because you're actively thinking alongside Claude and every pause disrupts the rhythm. This is especially true during design discussions where you're bouncing ideas back and forth rapidly. - -## When to Skip Fast Mode - -Standard Opus 4.6 is the better choice when speed isn't the bottleneck. The simple test: will you be actively waiting for the response? If not, standard mode gives you the same output at a lower cost. - -- **Long autonomous tasks.** If you're kicking off a large refactor and walking away, the response time doesn't affect your workflow. Save the money. -- **Batch processing or CI/CD pipelines.** Automated workflows don't benefit from lower latency. Standard rates make more sense here. -- **Cost-sensitive workloads.** When you're burning through tokens on a large codebase analysis, standard mode delivers the same results at a lower rate. -- **Tasks where you step away.** If you tell Claude to restructure an entire module and go grab coffee, you won't notice the speed difference. Fast mode only matters when you're sitting there watching the cursor. - -## Fast Mode vs Effort Levels - -These two settings affect speed through completely different mechanisms: - -| Setting | What It Does | -| --- | --- | -| Fast mode | Same model quality, lower latency, higher cost per token | -| Lower effort level | Less thinking time, faster responses, potentially lower quality on complex tasks | - -You can combine both. Running fast mode with a reduced effort level stacks the 2.5x infrastructure speed with less thinking overhead. This combination works well for straightforward tasks like formatting, simple refactors, or generating boilerplate where [efficiency patterns](/blog/guide/performance/efficiency-patterns) matter more than deep analysis. For complex architectural decisions or tricky debugging, keep the effort level high and let fast mode handle the speed. The two settings give you independent control over quality and latency, which means you can optimize for each task individually rather than settling for a single compromise. - -For a deeper look at how effort levels affect output quality, see our guide on [deep thinking techniques](/blog/guide/performance/deep-thinking-techniques). - -## Rate Limits and Fallback - -Fast mode has its own rate limits, separate from standard Opus 4.6. This means enabling fast mode doesn't eat into your standard Opus 4.6 rate limit, and vice versa. When you hit the fast mode ceiling, Claude Code handles it gracefully: - -1. **Auto-fallback to standard Opus 4.6.** Your session continues without interruption. You just lose the speed boost temporarily. No error messages, no broken workflow. -2. **Lightning bolt turns gray.** The icon changes to a cooldown indicator, so you always know which mode is active at a glance. -3. **Standard speed and pricing apply.** During fallback, you're billed at normal Opus 4.6 rates. This is actually a nice cost break if you've been running fast mode heavily. -4. **Auto re-enables when ready.** Once your rate limit cooldown expires, fast mode kicks back in automatically. No action needed on your end. - -If you'd rather not wait for the cooldown, run `/fast` to disable fast mode manually and continue at standard rates indefinitely. - -## Availability - -Fast mode isn't available everywhere. Here's what you need: - -- **Anthropic direct only.** Fast mode works through the Anthropic Console API and Claude subscription plans. It's not available on Amazon Bedrock, Google Vertex AI, or Microsoft Azure Foundry. -- **Extra usage must be enabled.** Since fast mode bills entirely to extra usage, your account needs extra usage turned on. -- **Teams and Enterprise restrictions.** Organization admins must explicitly enable fast mode in Console settings or Claude AI admin settings. If your admin hasn't enabled it, running `/fast` returns: "Fast mode has been disabled by your organization." - -## Fast Mode with Agent Teams - -When running [agent teams](/blog/guide/agents/agent-teams), fast mode applies to the lead session only. Your teammate agents can use different speed configurations independently. This gives you granular control over cost allocation across a multi-agent workflow. - -A practical approach for team-based workflows: enable fast mode on the lead agent for quick coordination and decision-making, while teammates run at standard speed to keep costs manageable. The lead agent typically handles shorter, more interactive exchanges where latency matters most, like reviewing teammate output, making routing decisions, and responding to your direct questions. Teammates handle longer, autonomous tasks like writing tests, refactoring modules, or generating documentation, where the 2.5x speed boost wouldn't noticeably change your experience. - -## Cost Optimization Tips - -A few practical ways to keep fast mode costs under control: - -- **Enable at session start.** Switching to fast mode mid-conversation forces a full-context re-price at the uncached input rate. Starting with fast mode from the first message avoids this penalty entirely. -- **Pair with effort levels.** Use fast mode plus a lower effort level for simple tasks, then bump effort back up for complex work. This gives you maximum speed when quality requirements are lower. -- **Toggle based on work type.** Use fast mode during active coding sessions, then disable it before kicking off autonomous work. Five seconds of toggling can save meaningful token costs over a full day of development. -- **Monitor through Console.** Check your [usage and billing](/blog/guide/development/usage-optimization) in the Anthropic Console dashboard to track how fast mode affects your spend. - -## The Three Levers of Performance - -Fast mode fills a specific gap: you want Opus 4.6 quality without Opus 4.6 latency. The tradeoff is cost, not capability. Claude Code now gives you three independent levers for tuning performance: - -1. **Fast mode** controls infrastructure speed -2. **[Effort levels](/blog/guide/performance/deep-thinking-techniques)** control thinking depth -3. **[Model selection](/blog/guide/performance/speed-optimization)** controls the base capability tier - -Each lever operates independently, and you can combine them in whatever way fits your current task. For your highest-value interactive work, turn everything up: fast mode on, high effort, Opus 4.6. For quick formatting or boilerplate, try fast mode with low effort. For background tasks you won't watch, standard speed saves money without any perceived cost. The key is matching each setting to the work in front of you, not picking one configuration and leaving it forever. diff --git a/docs/site/src/content/blog/feedback-loops.md b/docs/site/src/content/blog/feedback-loops.md deleted file mode 100644 index 53e088d8..00000000 --- a/docs/site/src/content/blog/feedback-loops.md +++ /dev/null @@ -1,154 +0,0 @@ ---- -slug: "feedback-loops" -title: "Claude Code Workflow: Create Tight Feedback Loops" -description: "Optimize your Claude Code workflow with tight feedback loops for faster iteration. Learn proven techniques that 10x your AI development speed." -date: "2025-08-23" -author: "Max Ritter" -tags: [Guide, Development] -readingTime: 4 -keywords: "claude, code, create, feedback, loops, tight, workflow" ---- - -Development - -# Claude Code Workflow: Create Tight Feedback Loops - -Optimize your Claude Code workflow with tight feedback loops for faster iteration. Learn proven techniques that 10x your AI development speed. - -**Problem**: You ask Claude to implement something, it writes code, and you have no idea if it works until you manually test it. Slow and frustrating. - -**Quick Win**: Ask Claude to run and iterate in one prompt: - -```p-4 -claude "implement the validation function and run tests until they pass" -``` - -Claude writes the code, runs your test suite, sees the failures, fixes them, and repeats until green. One prompt, complete feedback loop. - -## [How Claude Code Feedback Loops Actually Work](#how-claude-code-feedback-loops-actually-work) - -Claude Code's power is that it runs in your terminal with full access to your tools. The feedback loop is simple: - -1. Claude writes code -2. Claude runs it (or runs tests) -3. Claude sees the output or errors -4. Claude fixes based on what it saw -5. Repeat until working - -No special flags or config files. Just ask Claude to iterate. - -## [Real Iteration Prompts](#real-iteration-prompts) - -### [Run Until Tests Pass](#run-until-tests-pass) - -```p-4 -claude "implement user authentication and run the tests until they all pass" -``` - -Claude writes auth code, runs `npm test` (or your test command), reads failures, fixes them, runs again. - -### [Fix Errors as They Appear](#fix-errors-as-they-appear) - -```p-4 -claude "start the dev server and fix any errors that come up" -``` - -Claude runs `npm run dev`, watches the output, and fixes TypeScript errors or runtime issues as they appear. - -### [Iterate on Specific Problems](#iterate-on-specific-problems) - -```p-4 -# When you see an error, paste it -claude "this error appeared: [paste error]. fix it and run again" -``` - -Claude gets direct feedback from your terminal output. - -## [Using Your Actual Dev Tools](#using-your-actual-dev-tools) - -Claude works with whatever tools your project uses: - -```p-4 -# Node.js projects -claude "run npm test and fix any failures" - -# Python projects -claude "run pytest and fix the failing tests" - -# With watch mode -claude "run the tests in watch mode and fix issues as they fail" -``` - -The dev server, test runner, linter - Claude sees their output and responds. - -## [Structuring Work for Fast Iteration](#structuring-work-for-fast-iteration) - -Break big tasks into pieces Claude can validate: - -```p-4 -# Instead of one massive request -claude "build the entire user system" - -# Break into validatable chunks -claude "create the user model and write a test for it" -claude "add the registration endpoint and test it" -claude "implement login with the tests" -``` - -Each chunk has clear success criteria. Claude knows when it's done. - -## [Error-Driven Development](#error-driven-development) - -Let errors guide the implementation: - -```p-4 -# Start with a failing test -claude "write a test for user registration that checks email validation" - -# Then make it pass -claude "implement registration to make this test pass" -``` - -The test gives Claude concrete feedback. It knows exactly what "done" looks like. - -## [When Things Go Wrong](#when-things-go-wrong) - -**Error: Claude keeps making the same mistake** -Fix: Be more specific about what's wrong: - -```p-4 -claude "the test still fails because X. try a different approach" -``` - -**Error: Infinite loop of fixes** -Fix: Ask Claude to step back: - -```p-4 -claude "stop and explain what's going wrong before trying another fix" -``` - -**Error: Claude can't see the error** -Fix: Paste the error directly: - -```p-4 -claude "here's the full error output: [paste]. fix this specific issue" -``` - -## [Next Steps](#next-steps) - -Your Claude Code workflow should feel like pair programming: write, run, see results, fix, repeat. - -- Set up [permission management](/blog/guide/development/permission-management) for smoother execution -- Learn [git integration](/blog/guide/development/git-integration) for version control -- Master [todo workflows](/blog/guide/development/todo-workflows) for complex projects -- Explore [usage optimization](/blog/guide/development/usage-optimization) to manage costs - -The tightest feedback loop wins. Ask Claude to iterate, and let it. - -Last updated on - -[Previous - -Permission Management](/blog/guide/development/permission-management)[Next - -Todo Workflows](/blog/guide/development/todo-workflows) diff --git a/docs/site/src/content/blog/first-project.md b/docs/site/src/content/blog/first-project.md deleted file mode 100644 index 89c4f959..00000000 --- a/docs/site/src/content/blog/first-project.md +++ /dev/null @@ -1,191 +0,0 @@ ---- -slug: "first-project" -title: "Your First Claude Code Project: Let's Build Something Real" -description: "Skip Hello World. Build a CLI journal with Claude Code and discover conversational programming through a real project you'll actually use." -date: "2025-08-23" -author: "Max Ritter" -tags: [Guide] -readingTime: 4 -keywords: "build, claude, code, first, lets, project, real, something" ---- - -# Your First Claude Code Project: Let's Build Something Real - -Skip Hello World. Build a CLI journal with Claude Code and discover conversational programming through a real project you'll actually use. - -Build your first app with Claude Code in 5 minutes. Skip Hello World - we're creating a personal task manager that you'll actually use every day. New to Claude Code? Start with the [main guide](/blog/guide) for a complete overview. - -**Quick Win**: Copy this command to start immediately: - -```p-4 -mkdir smart-todos && cd smart-todos && claude -``` - -You just created your workspace and launched Claude Code. Now watch what happens next. - -## [Create Your First Real App](#create-your-first-real-app) - -Tell Claude exactly what you want: - -> "Create a CLI task manager where I can add tasks, mark them done, and see my list. Make it save to a file so tasks persist." - -Claude will respond with a complete implementation plan. You'll see it thinking through: - -- File structure (a simple Node.js app) -- Core functionality (add, complete, list tasks) -- Data persistence (JSON file storage) -- User interface (clean terminal output) - -Claude doesn't just plan - it builds. Watch it create working files: - -```p-4 -// Claude creates tasks.js automatically -#!/usr/bin/env node -import fs from 'fs'; -import path from 'path'; - -const TASKS_FILE = path.join(process.cwd(), 'tasks.json'); -// ... complete working code appears -``` - -## [Your App Is Already Working](#your-app-is-already-working) - -Test your new task manager immediately: - -```p-4 -node tasks.js add "Learn Claude Code" -node tasks.js add "Build something amazing" -node tasks.js list -``` - -**Expected output**: - -```p-4 -✓ Added: Learn Claude Code -✓ Added: Build something amazing - -Your Tasks: -□ 1. Learn Claude Code -□ 2. Build something amazing -``` - -**This took 2 minutes.** You have a working CLI application with file persistence, error handling, and clean output formatting. - -## [Make It Even Better](#make-it-even-better) - -Now comes the magic - enhancing your app through conversation. Try these requests: - -**Add colors**: "Make completed tasks show in green and pending in yellow" - -**Priority system**: "Let me add priority levels - high, medium, low" - -**Due dates**: "Allow setting due dates and show overdue tasks in red" - -**Search function**: "Add ability to search tasks by keyword" - -Claude implements each feature instantly. No Stack Overflow hunting. No configuration headaches. Describe what you want, watch it appear. - -## [Why This Works So Well](#why-this-works-so-well) - -Traditional coding forces you to know everything upfront: - -- Which libraries to choose -- How to structure files -- Command-line argument parsing -- File I/O operations -- Error handling patterns - -**Claude Code eliminates all that friction.** You describe the outcome, Claude handles the implementation details. - -The task manager you just built includes: - -- Cross-platform file operations -- JSON data persistence -- Argument parsing with Commander.js -- Colorized terminal output with Chalk -- Proper error handling -- User-friendly help messages - -That's typically 2-3 hours of setup and research. You did it in 5 minutes. - -## [Common Issues (And Quick Fixes)](#common-issues-and-quick-fixes) - -Having trouble? Check the [installation guide](/blog/guide/installation-guide) for detailed setup help. - -**"Permission denied"** error when running tasks.js? (Mac/Linux) - -```p-4 -chmod +x tasks.js -``` - -**"Module not found"** errors? - -```p-4 -npm init -y && npm install commander chalk -``` - -**Want to make it globally available?** - -Add this to package.json: - -```p-4 -{ - "bin": { - "todo": "./tasks.js" - } -} -``` - -Then: `npm link` - -Now you can run `todo add "anything"` from anywhere on your system. - -## [The Wow Moment](#the-wow-moment) - -What just happened: - -- You described an idea in plain English -- Claude created a complete, working application -- You're using it in under 5 minutes - -This is **conversational programming**. Think in problems and solutions, not syntax and APIs. - -## [Your Next Challenge](#your-next-challenge) - -Your task manager is working, but try this enhancement: - -> "Add a web interface so I can manage tasks from my browser. Keep the CLI working too." - -Claude will create an Express server, HTML interface, and keep your existing CLI functionality intact. You'll have a full-stack application in minutes. - -Or explore different directions: - -- [Browse real project examples](/blog/guide/examples-templates) for inspiration -- [Configure Claude Code](/blog/guide/configuration-basics) for your workflow -- [Troubleshoot common issues](/blog/guide/troubleshooting) when things go wrong - -## [What Makes This Different](#what-makes-this-different) - -Unlike traditional tutorials that teach syntax, you just learned the **Claude Code development pattern**: - -1. **Describe the outcome** you want -2. **Let Claude architect** the solution -3. **Test immediately** to verify it works -4. **Enhance conversationally** by describing changes -5. **Deploy with confidence** knowing the code is solid - -This pattern works for any project size. Solo developers use it to build entire SaaS applications. Teams use it to prototype features before planning sprints. - -**Next Steps**: - -- [Configure Claude Code](/blog/guide/configuration-basics) for your development style -- Learn about [skills](/blog/guide/mechanics/claude-skills-guide) to give Claude specialized expertise -- Dive into [troubleshooting](/blog/guide/troubleshooting) when things go sideways - -Last updated on - -[Previous - -Native Installer](/blog/guide/native-installer)[Next - -Configuration Basics](/blog/guide/configuration-basics) diff --git a/docs/site/src/content/blog/git-integration.md b/docs/site/src/content/blog/git-integration.md deleted file mode 100644 index 8f8aec04..00000000 --- a/docs/site/src/content/blog/git-integration.md +++ /dev/null @@ -1,202 +0,0 @@ ---- -slug: "git-integration" -title: "Claude Code Git Integration: Automated Version Control" -description: "Set up Claude Code's git integration for seamless commits and version control. Learn best practices for AI-assisted development workflows." -date: "2025-08-23" -author: "Max Ritter" -tags: [Guide, Development] -readingTime: 5 -keywords: "automated, claude, code, control, git, integration, version" ---- - -Development - -# Claude Code Git Integration: Automated Version Control - -Set up Claude Code's git integration for seamless commits and version control. Learn best practices for AI-assisted development workflows. - -**Problem**: You made a bunch of changes with Claude Code and now you need to commit them properly without losing track of what happened. - -**Quick Win**: After Claude makes changes, just ask it to commit: - -```p-4 -claude "commit these changes with a descriptive message" -``` - -Claude reads the diff, writes a meaningful commit message, and runs `git commit` for you. No fake config commands - just ask. - -## [How Claude Code Actually Works with Git](#how-claude-code-actually-works-with-git) - -Claude Code runs git commands directly in your terminal. There's no special "auto-commit" mode or configuration - you simply ask Claude to handle git operations and it does. - -What Claude can do: - -- **Run any git command**: add, commit, push, pull, branch, merge -- **Write commit messages**: Based on the actual changes it made -- **Create branches**: For features or experiments -- **Create PRs**: Using the `gh` CLI if installed -- **Resolve conflicts**: By reading both versions and merging intelligently - -The key insight: Claude sees your git history and understands context, so its commit messages actually describe what changed and why. - -## [Setting Git Conventions in CLAUDE.md](#setting-git-conventions-in-claudemd) - -Instead of fake config commands, use your CLAUDE.md file to set commit conventions: - -```p-4 -## Git Conventions - -- Use conventional commits: feat:, fix:, docs:, refactor: -- Keep subject lines under 72 characters -- Always run tests before committing -- Create feature branches for new work -``` - -Now when you ask Claude to commit, it follows your team's conventions automatically. Learn more in our [CLAUDE.md Mastery guide](/blog/guide/mechanics/claude-md-mastery). - -## [Real Git Workflows](#real-git-workflows) - -### [Simple Commit After Changes](#simple-commit-after-changes) - -```p-4 -# Claude just finished implementing a feature -claude "commit these changes" - -# Or be more specific -claude "commit with message: add user authentication flow" -``` - -### [Feature Branch Workflow](#feature-branch-workflow) - -```p-4 -# Start new work on a branch -claude "create a feature branch called auth-improvements and switch to it" - -# Make changes, then commit -claude "commit the auth changes with a descriptive message" - -# When ready, create a PR -claude "push this branch and create a PR with a summary of changes" -``` - -### [Reviewing Before Committing](#reviewing-before-committing) - -```p-4 -# See what changed first -claude "show me a summary of all uncommitted changes" - -# Then commit selectively -claude "commit only the changes in src/auth/ with message: refactor auth module" -``` - -## [Commit Attribution](#commit-attribution) - -When Claude Code creates git commits or pull requests, it adds attribution by default. This lets your team (and your future self) know which changes were AI-assisted. The `attribution` setting in your [settings.json](/blog/guide/settings-reference) controls exactly what gets added. - -### [Default Attribution](#default-attribution) - -**Commits** get two things appended to the commit message: - -```p-4 -Generated with Claude Code (https://claude.com/claude-code) - -Co-Authored-By: Claude Sonnet 4.5 -``` - -The first line is a plain-text message. The second is a [git trailer](https://git-scm.com/docs/git-interpret-trailers) that GitHub and other platforms recognize, showing Claude as a co-author on the commit. - -**Pull requests** get a simpler attribution in the description: - -```p-4 -Generated with Claude Code (https://claude.com/claude-code) -``` - -### [Customizing Attribution](#customizing-attribution) - -Configure commit and PR attribution separately in your `settings.json`: - -```p-4 -{ - "attribution": { - "commit": "Generated with AI\n\nCo-Authored-By: AI Assistant ", - "pr": "AI-assisted PR" - } -} -``` - -You can change the message text, the Co-Authored-By name and email, or both. The `\n\n` separates the message from git trailers, which is required by the git trailers format. - -### [Disabling Attribution](#disabling-attribution) - -Set either value to an empty string to hide it: - -```p-4 -{ - "attribution": { - "commit": "", - "pr": "" - } -} -``` - -This removes attribution from commits, PRs, or both. Useful for teams that track AI usage through other mechanisms. - -### [Migration from includeCoAuthoredBy](#migration-from-includecoauthoredby) - -The older `includeCoAuthoredBy` boolean setting is deprecated. If you were using `"includeCoAuthoredBy": false`, migrate to the `attribution` setting: - -```p-4 -// Old (deprecated) -{ "includeCoAuthoredBy": false } - -// New (recommended) -{ - "attribution": { - "commit": "", - "pr": "" - } -} -``` - -The new `attribution` setting gives you finer control since you can disable commit attribution while keeping PR attribution, or vice versa. Place this in your [user, project, or local settings](/blog/guide/settings-reference) depending on your needs. - -## [Troubleshooting Git Issues](#troubleshooting-git-issues) - -**Error: "nothing to commit"** -Fix: Claude already committed, or changes aren't staged. Ask Claude to check: - -```p-4 -claude "what's the current git status?" -``` - -**Error: "permission denied" on push** -Fix: You need to authenticate with your remote. Claude can't do this for you, but it can help diagnose: - -```p-4 -claude "help me debug this git push error" -``` - -**Error: Merge conflicts** -Fix: Claude can help resolve them: - -```p-4 -claude "there are merge conflicts in auth.js - resolve them keeping our new changes" -``` - -## [Next Steps](#next-steps) - -- Set up [feedback loops](/blog/guide/development/feedback-loops) for faster iteration -- Configure [todo workflows](/blog/guide/development/todo-workflows) to track work -- Learn [planning modes](/blog/guide/mechanics/planning-modes) for complex changes -- Customize attribution and other options in the [settings reference](/blog/guide/settings-reference) -- Optimize costs with [usage optimization](/blog/guide/development/usage-optimization) - -Git with Claude Code is simple: ask Claude to do git operations, and it does them. No special setup required. - -Last updated on - -[Previous - -InfraOps VPS Guide](/blog/guide/development/infraops-vps-guide)[Next - -Permission Management](/blog/guide/development/permission-management) diff --git a/docs/site/src/content/blog/hooks-guide.md b/docs/site/src/content/blog/hooks-guide.md deleted file mode 100644 index 6320d09f..00000000 --- a/docs/site/src/content/blog/hooks-guide.md +++ /dev/null @@ -1,618 +0,0 @@ ---- -slug: "hooks-guide" -title: "Claude Code Hooks: Complete Guide to All 12 Lifecycle Events" -description: "Master Claude Code hooks with exit codes, JSON output, and production patterns. Stop clicking approve and fully automate your workflow." -date: "2025-12-13" -author: "Max Ritter" -tags: [Guide, Hooks] -readingTime: 11 -keywords: "12, all, claude, code, complete, events, guide, hooks, lifecycle" ---- - -Hooks - -# Claude Code Hooks: Complete Guide to All 12 Lifecycle Events - -Master Claude Code hooks with exit codes, JSON output, and production patterns. Stop clicking approve and fully automate your workflow. - -**Problem**: You're deep in flow state, building a feature. Claude needs to write a file. Click approve. Run a command. Click approve. Format code. Click approve. Twenty interruptions later, you've forgotten what you were building. - -**Quick Win**: Add this to `.claude/settings.json` and never approve a Prettier format again: - -```p-4 -{ - "hooks": { - "PostToolUse": [ - { - "matcher": "Write|Edit", - "hooks": [ - { - "type": "command", - "command": "npx prettier --write \"$CLAUDE_TOOL_INPUT_FILE_PATH\"" - } - ] - } - ] - } -} -``` - -Every file Claude writes now auto-formats. Zero clicks. Zero context switches. - -## [The 12 Hook Lifecycle Events](#the-12-hook-lifecycle-events) - -Hooks intercept Claude Code events and execute shell commands or LLM prompts. Here's the complete list: - -| Hook | When It Fires | Can Block? | Best Use | -| --- | --- | --- | --- | -| **SessionStart** | Session begins or resumes | NO | Load context, set env vars | -| **UserPromptSubmit** | You hit enter | YES | Context injection, validation | -| **PreToolUse** | Before tool runs | YES | Security blocking, auto-approve (extends [permission system](/blog/guide/development/permission-management#permission-rule-syntax)) | -| **PermissionRequest** | Permission dialog appears | YES | Auto-approve/deny | -| **PostToolUse** | After tool succeeds | NO\* | Auto-format, lint, log | -| **PostToolUseFailure** | After tool fails | NO | Error handling | -| **SubagentStart** | Spawning subagent | NO | Subagent initialization | -| **SubagentStop** | Subagent finishes | YES | Subagent validation | -| **Stop** | Claude finishes responding | YES | Task enforcement | -| **PreCompact** | Before compaction | NO | Transcript backup | -| **Setup** | With --init/--maintenance | NO | One-time setup | -| **SessionEnd** | Session terminates | NO | Cleanup, logging | -| **Notification** | Claude sends notification | NO | Desktop alerts, TTS | - -\*PostToolUse can prompt Claude with feedback but cannot undo the tool execution. - -## [Exit Codes: The Control Mechanism](#exit-codes-the-control-mechanism) - -Every hook communicates via exit codes: - -| Exit Code | What Happens | -| --- | --- | -| **0** | Success - hook ran, stdout processed for JSON | -| **2** | Block - operation stopped, stderr sent to Claude | -| **Other** | Error - stderr shown to user, execution continues | - -**Exit code 2 is your power tool.** A PreToolUse hook that exits 2 stops the tool. A Stop hook that exits 2 forces Claude to keep working. - -## [Hook Types: Command vs Prompt](#hook-types-command-vs-prompt) - -**Command hooks** run bash scripts: - -```p-4 -{ - "type": "command", - "command": "python validator.py", - "timeout": 30 -} -``` - -**Prompt hooks** use LLM evaluation (great for Stop/SubagentStop): - -```p-4 -{ - "type": "prompt", - "prompt": "Evaluate if Claude should stop: $ARGUMENTS. Check if all tasks complete.", - "timeout": 30 -} -``` - -The LLM responds with `{"ok": true}` or `{"ok": false, "reason": "..."}`. - -## [Async Hooks (Non-Blocking) New - Jan 2026](#async-hooks-non-blocking-new---jan-2026) - -Add `async: true` to run hooks in the background without blocking Claude's execution. Released by Anthropic in January 2026: - -```p-4 -{ - "type": "command", - "command": "node backup-script.js", - "async": true, - "timeout": 30 -} -``` - -**Best for:** - -- Logging and analytics -- Backup creation (PreCompact) -- Notifications -- Any side-effect that shouldn't slow things down - -**Not suitable for:** - -- Security blocking (PreToolUse with exit code 2) -- Auto-approve decisions (PermissionRequest) -- Any hook where Claude needs the result - -## [JSON Output: Advanced Control](#json-output-advanced-control) - -Beyond exit codes, hooks can return structured JSON for precise control. - -### [PreToolUse Decisions](#pretooluse-decisions) - -```p-4 -{ - "hookSpecificOutput": { - "hookEventName": "PreToolUse", - "permissionDecision": "allow", - "permissionDecisionReason": "Safe read operation", - "updatedInput": { "command": "modified-command" }, - "additionalContext": "Context for Claude" - } -} -``` - -- `"allow"`: Bypasses permission system -- `"deny"`: Blocks tool, tells Claude why -- `"ask"`: Prompts user for confirmation -- `updatedInput`: Modify tool parameters before execution - -### [PermissionRequest Decisions](#permissionrequest-decisions) - -```p-4 -{ - "hookSpecificOutput": { - "hookEventName": "PermissionRequest", - "decision": { - "behavior": "allow", - "updatedInput": { "command": "npm run lint" } - } - } -} -``` - -### [Stop/SubagentStop Enforcement](#stopsubagentstop-enforcement) - -```p-4 -{ - "decision": "block", - "reason": "Tests failing. Fix them before completing." -} -``` - -## [Hook 1: Auto-Format on Save](#hook-1-auto-format-on-save) - -Run formatters after every file write: - -```p-4 -{ - "hooks": { - "PostToolUse": [ - { - "matcher": "Write|Edit|MultiEdit", - "hooks": [ - { - "type": "command", - "command": "npx prettier --write \"$CLAUDE_TOOL_INPUT_FILE_PATH\"" - }, - { - "type": "command", - "command": "npx eslint --fix \"$CLAUDE_TOOL_INPUT_FILE_PATH\"" - } - ] - } - ] - } -} -``` - -Multiple hooks run in parallel. Format AND lint before Claude's response appears. - -## [Hook 2: Session Context Injection](#hook-2-session-context-injection) - -Load context when sessions start: - -```p-4 -{ - "hooks": { - "SessionStart": [ - { - "hooks": [ - { - "type": "command", - "command": "echo '## Git Status' && git status --short && echo '## TODOs' && grep -r 'TODO:' src/ | head -5" - } - ] - } - ] - } -} -``` - -### [Persist Environment Variables](#persist-environment-variables) - -SessionStart and Setup hooks can set environment variables for the session: - -```p-4 -#!/bin/bash -if [ -n "$CLAUDE_ENV_FILE" ]; then - echo 'export NODE_ENV=production' >> "$CLAUDE_ENV_FILE" - echo 'export API_KEY=your-key' >> "$CLAUDE_ENV_FILE" -fi -exit 0 -``` - -## [Hook 3: Security Blocking](#hook-3-security-blocking) - -Block dangerous operations with PreToolUse: - -```p-4 -#!/usr/bin/env python3 -import json -import sys -import re - -DANGEROUS_PATTERNS = [ - r'\brm\s+.*-[a-z]*r[a-z]*f', - r'sudo\s+rm', - r'chmod\s+777', - r'git\s+push\s+--force.*main', -] - -input_data = json.load(sys.stdin) -if input_data.get('tool_name') == 'Bash': - command = input_data.get('tool_input', {}).get('command', '') - for pattern in DANGEROUS_PATTERNS: - if re.search(pattern, command, re.IGNORECASE): - print("BLOCKED: Dangerous pattern", file=sys.stderr) - sys.exit(2) - -sys.exit(0) -``` - -## [Hook 4: Auto-Approve Safe Commands](#hook-4-auto-approve-safe-commands) - -Use PermissionRequest to auto-approve without prompts: - -```p-4 -{ - "hooks": { - "PermissionRequest": [ - { - "matcher": "Bash", - "hooks": [ - { - "type": "command", - "command": "python .claude/hooks/auto-approve.py" - } - ] - } - ] - } -} -``` - -```p-4 -#!/usr/bin/env python3 -import json -import sys - -SAFE_PREFIXES = ['npm test', 'npm run lint', 'git status', 'ls'] - -input_data = json.load(sys.stdin) -command = input_data.get('tool_input', {}).get('command', '') - -for prefix in SAFE_PREFIXES: - if command.startswith(prefix): - output = { - "hookSpecificOutput": { - "hookEventName": "PermissionRequest", - "decision": {"behavior": "allow"} - } - } - print(json.dumps(output)) - sys.exit(0) - -sys.exit(0) # Normal flow for other commands -``` - -## [Hook 5: Transcript Backup](#hook-5-transcript-backup) - -Save transcripts before compaction with PreCompact. Use `async: true` since backups don't need to block Claude: - -```p-4 -{ - "hooks": { - "PreCompact": [ - { - "hooks": [ - { - "type": "command", - "command": "python .claude/hooks/backup-transcript.py", - "async": true - } - ] - } - ] - } -} -``` - -Use matchers `manual` or `auto` to distinguish between `/compact` and auto-compact. - -## [Hook 6: Task Completion Enforcement](#hook-6-task-completion-enforcement) - -Use Stop hooks to ensure work is complete: - -```p-4 -{ - "hooks": { - "Stop": [ - { - "hooks": [ - { - "type": "prompt", - "prompt": "Check if all tasks are complete: $ARGUMENTS. Return {\"ok\": false, \"reason\": \"...\"} if work remains." - } - ] - } - ] - } -} -``` - -See the [Stop Hook guide](/blog/tools/hooks/stop-hook-task-enforcement) for command-based patterns. - -## [Hook 7: Skill Activation](#hook-7-skill-activation) - -The [Skill Activation Hook](/blog/tools/hooks/skill-activation-hook) intercepts prompts and appends skill recommendations: - -```p-4 -{ - "hooks": { - "UserPromptSubmit": [ - { - "hooks": [ - { - "type": "command", - "command": "node .claude/hooks/SkillActivationHook/skill-activation-prompt.mjs" - } - ] - } - ] - } -} -``` - -## [Hook 8: Threshold-Based Backups via StatusLine](#hook-8-threshold-based-backups-via-statusline) - -StatusLine is the only mechanism that receives live context metrics. Use it to trigger backups at thresholds: - -```p-4 -{ - "statusLine": { - "type": "command", - "command": "node .claude/hooks/ContextRecoveryHook/statusline-monitor.mjs" - } -} -``` - -**Critical**: The `remaining_percentage` field includes the 22.5% autocompact buffer. To get actual "free until autocompact": - -```p-4 -const AUTOCOMPACT_BUFFER_PCT = 22.5; -const freeUntilCompact = Math.max( - 0, - remaining_percentage - AUTOCOMPACT_BUFFER_PCT, -); -``` - -Trigger backups when crossing thresholds: - -```p-4 -const THRESHOLDS = [30, 15, 5]; // Free until autocompact % - -for (const threshold of THRESHOLDS) { - if (state.lastFree > threshold && freeUntilCompact <= threshold) { - runBackup(sessionId, `crossed_${threshold}pct`); - } -} - -// Below 5%: backup on every decrease -if (freeUntilCompact < 5 && freeUntilCompact < state.lastFree) { - runBackup(sessionId, "continuous"); -} -``` - -Unlike PreCompact (which triggers on compaction), StatusLine-based backups capture state proactively at configurable thresholds. - -### [Architecture: Three-File Structure](#architecture-three-file-structure) - -The backup system uses a clean separation of concerns: - -```p-4 -.claude/hooks/ContextRecoveryHook/ -├── backup-core.mjs # Shared backup logic (parsing, formatting, saving) -├── statusline-monitor.mjs # Threshold detection + display (calls backup-core) -└── conv-backup.mjs # PreCompact trigger (calls backup-core) -``` - -| File | Trigger | Responsibility | -| --- | --- | --- | -| `backup-core.mjs` | Called by others | Parse transcript, format markdown, save file, update state | -| `statusline-monitor.mjs` | StatusLine (continuous) | Monitor context %, detect thresholds, display status | -| `conv-backup.mjs` | PreCompact hook | Handle pre-compaction event | - -This architecture means backup logic lives in one place. Changes to formatting, file naming, or state management only need to be made in `backup-core.mjs`. - -### [Backup File Naming](#backup-file-naming) - -Backups use numbered filenames with timestamps for history: - -```p-4 -.claude/backups/1-backup-26th-Jan-2026-4-30pm.md -.claude/backups/2-backup-26th-Jan-2026-5-15pm.md -.claude/backups/3-backup-26th-Jan-2026-5-45pm.md -``` - -### [StatusLine Display](#statusline-display) - -When context drops below 30%, the statusline shows the current backup path: - -```p-4 -[!] 25.0% free (50.0K/200K) --> .claude/backups/3-backup-26th-Jan-2026-5-45pm.md -``` - -This tells you exactly which file to load after compaction. - -## [Hook 9: Setup Hooks for Installation and Maintenance](#hook-9-setup-hooks-for-installation-and-maintenance) - -Setup hooks run *before* your session starts, triggered by special CLI flags: - -```p-4 -claude --init # Triggers Setup hook with matcher "init" -claude --init-only # Same as above, but exits after hook (CI-friendly) -claude --maintenance # Triggers Setup hook with matcher "maintenance" -``` - -Configure them with matchers in settings.json: - -```p-4 -{ - "hooks": { - "Setup": [ - { - "matcher": "init", - "hooks": [ - { - "type": "command", - "command": ".claude/hooks/setup_init.py", - "timeout": 120 - } - ] - }, - { - "matcher": "maintenance", - "hooks": [ - { - "type": "command", - "command": ".claude/hooks/setup_maintenance.py", - "timeout": 60 - } - ] - } - ] - } -} -``` - -**The power move**: Pass a prompt after the flag: - -```p-4 -claude --init "/install" -``` - -The hook runs first (deterministic), then the `/install` command executes (agentic). This combines predictable script execution with intelligent agent oversight. - -See the complete [Setup Hooks Guide](/blog/tools/hooks/claude-code-setup-hooks) for the full pattern including interactive onboarding and justfile integration. - -## [Configuration Locations](#configuration-locations) - -| Location | Scope | Priority | -| --- | --- | --- | -| Managed policy | Enterprise | Highest | -| `.claude/settings.json` | Project (shared) | High | -| `.claude/settings.local.json` | Project (personal) | Medium | -| `~/.claude/settings.json` | All projects | Lowest | - -## [Disabling and Restricting Hooks](#disabling-and-restricting-hooks) - -### [Disable All Hooks](#disable-all-hooks) - -If hooks are causing issues or you want a clean baseline, set `disableAllHooks` to `true` in your settings: - -```p-4 -{ - "disableAllHooks": true -} -``` - -This turns off all hooks across every scope (user, project, and local settings). Useful for debugging or when a hook causes unexpected behavior. - -### [Managed Hook Restrictions](#managed-hook-restrictions) - -For organizations that need centralized control, administrators can set `allowManagedHooksOnly` to `true` in [managed settings](/blog/guide/development/permission-management#managed-permission-settings): - -```p-4 -{ - "allowManagedHooksOnly": true -} -``` - -When enabled, only hooks defined in the managed settings file and SDK hooks are allowed. User-level, project-level, and plugin hooks are all blocked. This prevents developers from adding hooks that could bypass organizational security policies. - -This pairs well with `allowManagedPermissionRulesOnly`, which applies the same restriction to [permission rules](/blog/guide/development/permission-management#permission-rule-syntax). Together, these settings give administrators full control over both the permission system and its hook-based extensions. - -## [Matcher Syntax](#matcher-syntax) - -| Pattern | Matches | -| --- | --- | -| `""` or omitted | All tools | -| `"Bash"` | Only Bash (exact, case-sensitive) | -| `"Write|Edit"` | Write OR Edit (regex) | -| `"mcp__memory__.*"` | All memory MCP tools | - -**Critical**: No spaces around `|`. Matchers are case-sensitive. - -### [Event-Specific Matchers](#event-specific-matchers) - -**SessionStart**: `startup`, `resume`, `clear`, `compact` -**PreCompact**: `manual`, `auto` -**Setup**: `init`, `maintenance` -**Notification**: `permission_prompt`, `idle_prompt`, `auth_success` - -## [Environment Variables](#environment-variables) - -| Variable | Description | -| --- | --- | -| `CLAUDE_PROJECT_DIR` | Project root (all hooks) | -| `CLAUDE_ENV_FILE` | Persist env vars (SessionStart, Setup) | -| `CLAUDE_CODE_REMOTE` | "true" if web, empty if CLI | - -## [Debugging](#debugging) - -**Hook not triggering?** - -- Check matcher syntax (case-sensitive, no spaces) -- Verify settings file location -- Test: `echo '{"session_id":"test"}' | python your-hook.py` - -**Command failing?** - -- Add logging: `command 2>&1 | tee ~/.claude/hook-debug.log` -- Run with debug: `claude --debug` - -**Infinite loops with Stop?** - -- Always check `stop_hook_active` flag first - -## [Start With One Hook](#start-with-one-hook) - -Pick your biggest friction point: - -- Constant formatting? PostToolUse formatter -- Approving safe commands? PermissionRequest auto-approve -- Missing context? SessionStart injection -- Losing progress? PreCompact backup -- Incomplete tasks? Stop enforcement - -One hook. One friction point eliminated. Then iterate. - -## [Next Steps](#next-steps) - -- Configure [Setup Hooks](/blog/tools/hooks/claude-code-setup-hooks) for automated onboarding and maintenance -- Configure the [Stop Hook](/blog/tools/hooks/stop-hook-task-enforcement) to enforce task completion -- Install the [Permission Hook](/blog/tools/hooks/permission-hook-guide) for intelligent auto-approval -- Set up [Skill Activation](/blog/tools/hooks/skill-activation-hook) for automatic skill loading -- Configure [Context Recovery](/blog/tools/hooks/context-recovery-hook) to survive compaction -- Explore [Session Lifecycle Hooks](/blog/tools/hooks/session-lifecycle-hooks) for setup and cleanup -- Master [permission rules and modes](/blog/guide/development/permission-management) for static permission control alongside hooks -- Learn [configuration basics](/blog/guide/configuration-basics) for complete Claude Code setup - -Last updated on - -[Previous - -Status Line Guide](/blog/tools/statusline-guide)[Next - -Setup Hooks](/blog/tools/hooks/claude-code-setup-hooks) diff --git a/docs/site/src/content/blog/human-like-agents.md b/docs/site/src/content/blog/human-like-agents.md deleted file mode 100644 index 1fd16ea8..00000000 --- a/docs/site/src/content/blog/human-like-agents.md +++ /dev/null @@ -1,179 +0,0 @@ ---- -slug: "human-like-agents" -title: "Claude Code: Make Agents Think Like Senior Devs" -description: "Transform Claude Code agents into human-like senior devs. Personality injection techniques for better problem-solving and communication." -date: "2025-08-23" -author: "Max Ritter" -tags: [Guide, Agents] -readingTime: 4 -keywords: "agents, claude, code, devs, human, like, make, senior, think" ---- - -Agents - -# Claude Code AI Behavior: Make Agents Think Like Senior Developers - -Transform Claude Code agents into human-like senior devs. Personality injection techniques for better problem-solving and communication. - -**Problem**: Claude Code agents feel robotic and give generic responses that miss the nuanced thinking of experienced developers. - -**Quick Win**: Copy this personality block into your `CLAUDE.md` file right now: - -```p-4 -## Personality & Communication Style - -You are a senior developer with 10+ years experience who: - -- Thinks out loud through problems -- Admits when you're not sure about something -- Explains the "why" behind technical decisions -- Suggests multiple approaches when appropriate -``` - -**How to apply**: Open your project root, find or create `CLAUDE.md`, and paste this block. The change takes effect immediately on your next Claude Code session. - -**Understanding**: Human-like agents don't just solve problems—they think through them like experienced developers, showing their reasoning and acknowledging trade-offs. - -## [Core Humanization Techniques](#core-humanization-techniques) - -### [1. Reasoning Out Loud](#1-reasoning-out-loud) - -Instead of jumping to solutions, make agents show their thinking process: - -```p-4 -## Problem-Solving Approach - -When tackling complex issues: - -1. Acknowledge the challenge: "This is tricky because..." -2. Think through options: "I see three approaches..." -3. Explain your choice: "I'm going with option 2 because..." -4. Mention potential issues: "Watch out for edge case X..." -``` - -This creates natural developer conversations instead of robotic command execution. - -### [2. Uncertainty and Honesty](#2-uncertainty-and-honesty) - -Senior developers don't know everything. Make your agents admit limitations: - -```p-4 -## Honest Communication Rules - -- Use "I think" instead of absolute statements -- Say "Let me research that" for unfamiliar territory -- Suggest "Let's try this and see what happens" -- Admit "I'm not 100% sure, but here's my best guess" -``` - -**Why this works**: Uncertainty signals expertise. Only junior developers claim to know everything. - -### [3. Contextual Personality Injection](#3-contextual-personality-injection) - -Different tasks need different developer personalities. Customize based on the work: - -```p-4 -## Role-Based Personalities - -**For debugging**: "I'm methodical and patient. Let's trace this step by step." -**For architecture**: "I think long-term. What happens when this scales 10x?" -**For code review**: "I'm constructively critical. Here's what works and what doesn't." -**For prototyping**: "I move fast and iterate. Perfect is the enemy of done." -``` - -**Pro tip**: These personalities also work in custom slash commands. Create task-specific commands like `/debug` or `/architect` that inject the right personality for each workflow. - -## [Advanced Human Behaviors](#advanced-human-behaviors) - -### [Pattern Recognition Commentary](#pattern-recognition-commentary) - -Make agents share their expertise like senior developers do: - -```p-4 -## Experience-Based Insights - -When you recognize patterns, share them: - -- "I've seen this before in React apps..." -- "This reminds me of a similar issue where..." -- "Based on experience, this usually means..." -- "Teams often struggle with this when..." -``` - -### [Trade-off Awareness](#trade-off-awareness) - -Human developers always consider alternatives: - -```p-4 -## Decision Framework - -For every technical choice, explain: - -- Why you chose this approach -- What you're sacrificing (speed vs. maintainability) -- When you might choose differently -- How to monitor if it's working -``` - -## [Practical Implementation](#practical-implementation) - -### [Conversation Starters](#conversation-starters) - -Begin interactions like a real developer would: - -```p-4 -## Natural Conversation Patterns - -Instead of: "I'll implement the user authentication system." -Try: "Alright, authentication. Let me think... we could go OAuth, but for an MVP, simple email/password might be better. What's your timeline?" - -Instead of: "Error in line 42." -Try: "Hmm, line 42 is throwing something weird. This usually happens when... let me dig into this." -``` - -### [Follow-up Questions](#follow-up-questions) - -Human developers ask clarifying questions: - -- "What's the performance requirement here?" -- "Are you planning to scale this to multiple regions?" -- "Should we optimize for speed or readability?" -- "Any constraints I should know about?" - -## [Common Pitfalls to Avoid](#common-pitfalls-to-avoid) - -**Over-explaining**: Don't make agents verbose. Senior developers are concise but thoughtful. - -**Fake confidence**: Avoid claiming expertise in areas where uncertainty is appropriate. - -**Generic responses**: Customize personality based on project context and team dynamics. - -## [Measuring Human-like Behavior](#measuring-human-like-behavior) - -Good signs your agent feels more human: - -- Asks follow-up questions naturally -- Explains reasoning without being asked -- Admits uncertainty when appropriate -- Suggests alternative approaches -- References past experience patterns - -## [Next Actions](#next-actions) - -Ready to implement human-like behavior? Start with these resources: - -- Set up personality contexts with our [Agent Fundamentals Guide](/blog/guide/agents/agent-fundamentals) -- Learn advanced customization in [Sub-Agent Design](/blog/guide/agents/sub-agent-design) -- Master role switching with [Task Distribution](/blog/guide/agents/task-distribution) -- Explore conversation patterns in [Custom Agents](/blog/guide/agents/custom-agents) -- Optimize agent coordination with [Agent Patterns](/blog/guide/agents/agent-patterns) - -**Try this now**: Add one personality trait to your `CLAUDE.md` and run a coding task. Notice how the agent explains its reasoning instead of jumping to conclusions. Human-like agents don't just work differently—they think differently. - -Last updated on - -[Previous - -Agent Patterns](/blog/guide/agents/agent-patterns)[Next - -Backlink Strategy Guide](/blog/guide/saas-startups/backlink-strategy-guide) diff --git a/docs/site/src/content/blog/index.ts b/docs/site/src/content/blog/index.ts deleted file mode 100644 index bc02e220..00000000 --- a/docs/site/src/content/blog/index.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { BlogArticle } from './types'; - -/** - * Auto-discover blog articles from .md files with YAML frontmatter. - * Adding a new article only requires creating the .md file — no imports to maintain. - */ -const modules = import.meta.glob('./*.md', { eager: true, query: '?raw', import: 'default' }) as Record; - -function parseFrontmatter(raw: string): { meta: Record; content: string } | null { - const match = raw.match(/^---\n([\s\S]*?)\n---\n([\s\S]*)$/); - if (!match) return null; - - const meta: Record = {}; - for (const line of match[1].split('\n')) { - const kv = line.match(/^(\w+):\s*(.+)$/); - if (!kv) continue; - const [, key, val] = kv; - if (val.startsWith('[')) { - meta[key] = val.slice(1, -1).split(',').map(s => s.trim().replace(/^["']|["']$/g, '')); - } else if (/^\d+$/.test(val)) { - meta[key] = parseInt(val, 10); - } else { - meta[key] = val.replace(/^["']|["']$/g, ''); - } - } - return { meta, content: match[2] }; -} - -export const articles: BlogArticle[] = Object.values(modules) - .map((raw) => { - const parsed = parseFrontmatter(raw as string); - if (!parsed) return null; - const { meta, content } = parsed; - return { - slug: meta.slug, - title: meta.title, - description: meta.description, - date: meta.date, - author: meta.author || 'Max Ritter', - tags: meta.tags || [], - readingTime: meta.readingTime || Math.ceil(content.split(/\s+/).length / 200), - content, - keywords: meta.keywords || '', - } as BlogArticle; - }) - .filter((a): a is BlogArticle => a !== null) - .sort((a, b) => new Date(b.date).getTime() - new Date(a.date).getTime()); diff --git a/docs/site/src/content/blog/installation-guide.md b/docs/site/src/content/blog/installation-guide.md deleted file mode 100644 index 2f420d73..00000000 --- a/docs/site/src/content/blog/installation-guide.md +++ /dev/null @@ -1,243 +0,0 @@ ---- -slug: "installation-guide" -title: "Claude Code Installation: Windows, Mac & Linux Setup" -description: "Platform-specific Claude Code install guide with troubleshooting and community-tested fixes for Windows, macOS, and Linux environments." -date: "2025-08-23" -author: "Max Ritter" -tags: [Guide] -readingTime: 4 -keywords: "claude, code, guide, installation, linux, mac, setup, windows" ---- - -# Claude Code Installation: Windows, Mac & Linux Setup - -Platform-specific Claude Code install guide with troubleshooting and community-tested fixes for Windows, macOS, and Linux environments. - -**Problem**: You want to install Claude Code but don't know where to start. Here's the fastest path from zero to working AI terminal. See our [complete guide](/blog/guide) for an overview of all Claude Code capabilities. - -## [How to Install Claude Code: Quick Start](#how-to-install-claude-code-quick-start) - -Anthropic now offers **native installers** as the recommended method. No Node.js required: - -**Windows PowerShell (Recommended):** - -```p-4 -irm https://claude.ai/install.ps1 | iex -``` - -**macOS / Linux:** - -```p-4 -curl -fsSL https://claude.ai/install.sh | bash -``` - -**Homebrew (macOS/Linux):** - -```p-4 -brew install --cask claude-code -``` - -Run `claude --version` to verify. **Success looks like**: A version number displays without errors. - -For details on what the native installer does and troubleshooting, see our [Native Installer Guide](/blog/guide/native-installer). - -If that worked, skip to [Configure Your API Key](#configure-your-api-key). If not, follow your platform-specific steps below. - -## [Step-by-Step: Install Claude Code on Any Platform](#step-by-step-install-claude-code-on-any-platform) - -**Before you install Claude Code**, verify you have: - -1. Terminal access (Command Prompt, PowerShell, or Bash) -2. An Anthropic API key from [console.anthropic.com](https://console.anthropic.com) -3. Node.js 18+ (only required for npm installation method) - -### [Install Claude Code on Windows](#install-claude-code-on-windows) - -Windows now supports multiple installation options. Choose the one that fits your workflow: - -**Option 1: Native Windows (Recommended)** - -```p-4 -# PowerShell (Run as Administrator) -irm https://claude.ai/install.ps1 | iex -claude --version -``` - -**Option 2: Git Bash** - -Install [Git for Windows](https://git-scm.com/downloads/win), then: - -```p-4 -curl -fsSL https://claude.ai/install.sh | bash -claude --version -``` - -**Option 3: WSL (Ubuntu)** - -```p-4 -# Install WSL if needed (PowerShell as Administrator) -wsl --install -d Ubuntu - -# Inside Ubuntu terminal -curl -fsSL https://claude.ai/install.sh | bash -claude --version -``` - -**Windows users**: The native installer no longer requires Node.js. WSL users should run Claude Code from their Linux terminal. - -> **Pilot Shell users on Windows**: Pilot requires a Unix environment. If you're on Windows without WSL2, use the **Dev Container** option in the Pilot installer — it gives you a fully configured Linux environment via Docker Desktop. With WSL2, you can install Pilot locally inside your Ubuntu terminal. - -### [Install Claude Code on macOS](#install-claude-code-on-macos) - -**Option 1: Homebrew (Recommended)** - -```p-4 -brew install --cask claude-code -claude --version -``` - -**Option 2: Native Installer** - -```p-4 -curl -fsSL https://claude.ai/install.sh | bash -claude --version -``` - -**Option 3: npm (if you prefer Node.js)** - -```p-4 -npm install -g @anthropic-ai/claude-code - -# If you see "command not found", fix PATH: -echo 'export PATH="$(npm config get prefix)/bin:$PATH"' >> ~/.zshrc -source ~/.zshrc -claude --version -``` - -### [Install Claude Code on Linux](#install-claude-code-on-linux) - -**Option 1: Native Installer (Recommended)** - -```p-4 -curl -fsSL https://claude.ai/install.sh | bash -claude --version -``` - -**Option 2: Homebrew** - -```p-4 -brew install --cask claude-code -claude --version -``` - -**Option 3: npm (requires Node.js 18+)** - -```p-4 -# Create user npm directory (prevents sudo requirements) -mkdir ~/.npm-global -npm config set prefix '~/.npm-global' -echo 'export PATH=~/.npm-global/bin:$PATH' >> ~/.bashrc -source ~/.bashrc - -# Install Claude Code -npm install -g @anthropic-ai/claude-code -claude --version -``` - -## [Configure Your API Key](#configure-your-api-key) - -After you install Claude Code successfully, configure authentication: - -```p-4 -claude -# Paste your API key when prompted -``` - -**Get your API key**: Visit [console.anthropic.com](https://console.anthropic.com), create an account, navigate to API Keys, and generate a new key starting with `sk-`. - -## [Verify Your Installation](#verify-your-installation) - -Test your Claude Code installation: - -```p-4 -claude --version # Shows version number -claude doctor # Runs diagnostics -``` - -**Quick functionality test**: - -```p-4 -mkdir test-project && cd test-project -echo "console.log('Hello!');" > test.js -claude -``` - -In the Claude prompt: "Read test.js and explain it" - -**Success**: Claude reads the file and explains the JavaScript code. - -## [Common Errors When You Install Claude Code](#common-errors-when-you-install-claude-code) - -### [Error: "Command Not Found"](#error-command-not-found) - -**Cause**: PATH configuration missing after install - -**Fix**: - -```p-4 -which claude # Check if installed -npm list -g @anthropic-ai/claude-code - -# Add to PATH manually -echo 'export PATH="$PATH:/usr/local/lib/node_modules/@anthropic-ai/claude-code/bin"' >> ~/.bashrc -source ~/.bashrc -``` - -### [Error: "EBADPLATFORM"](#error-ebadplatform) - -**Cause**: npm installation attempted on unsupported platform configuration - -**Fix**: Use the native installer instead of npm: - -```p-4 -# Windows PowerShell -irm https://claude.ai/install.ps1 | iex -``` - -### [Error: "EACCES Permission Denied"](#error-eacces-permission-denied) - -**Cause**: npm requires sudo (insecure practice) - -**Fix**: Configure user-level npm directory (see Linux section above). This works on all platforms. - -### [Nuclear Reset (Fixes 95% of Issues)](#nuclear-reset-fixes-95-of-issues) - -When everything fails, reset completely: - -```p-4 -npm uninstall -g @anthropic-ai/claude-code -rm -rf ~/.claude ~/.npm/_cacache -npm cache clean --force -npm install -g @anthropic-ai/claude-code -claude --version -``` - -## [What to Do After You Install Claude Code](#what-to-do-after-you-install-claude-code) - -Once `claude --version` works without errors: - -1. **Build your first project**: [First Project Guide](/blog/guide/first-project) -2. **Learn the interface**: [What is Claude Code](/blog/guide/what-is-claude-code) -3. **Configure settings**: [Configuration Basics](/blog/guide/configuration-basics) -4. **Fix common problems**: [Troubleshooting Guide](/blog/guide/troubleshooting) -5. **See real examples**: [Examples & Templates](/blog/guide/examples-templates) - -**Pro tip**: Run `claude doctor` anytime something feels broken. It auto-detects most configuration issues and suggests fixes. - -Last updated on - -[Previous - -What is Claude Code](/blog/guide/what-is-claude-code)[Next - -Native Installer](/blog/guide/native-installer) diff --git a/docs/site/src/content/blog/keybindings-guide.md b/docs/site/src/content/blog/keybindings-guide.md deleted file mode 100644 index a56070e6..00000000 --- a/docs/site/src/content/blog/keybindings-guide.md +++ /dev/null @@ -1,465 +0,0 @@ ---- -slug: "keybindings-guide" -title: "Claude Code Keybindings: Complete Keyboard Shortcuts Guide" -description: "Configure custom keyboard shortcuts in Claude Code. Reference for all 17 contexts, keystroke syntax, and keybindings.json examples." -date: "2026-02-03" -author: "Max Ritter" -tags: [Guide, Tools] -readingTime: 14 -keywords: "claude, code, complete, guide, keybindings, keyboard, shortcuts" ---- - -# Claude Code Keybindings: Customize Every Keyboard Shortcut - -Configure custom keyboard shortcuts in Claude Code. Reference for all 17 contexts, keystroke syntax, and keybindings.json examples. - -Your muscle memory says `Ctrl+K` should open a command palette. Claude Code disagrees. Every time you reach for a familiar shortcut and get the wrong action, you lose focus and break your flow. - -This friction compounds. Developers who spend hours in Claude Code sessions build unconscious habits around keyboard shortcuts. When the defaults don't match your mental model, you're fighting the tool instead of using it. If you've come from VS Code, Vim, Emacs, or any terminal-heavy workflow, you already have years of shortcut patterns wired into your fingers. Forcing yourself to learn new ones is a waste of cognitive effort. - -Claude Code solves this with a fully customizable keybinding system. You define every shortcut in a single JSON file, organized by context, with support for chord sequences, modifier combinations, and the ability to unbind any default. Changes apply instantly without restarting. Here's how to set it up and make Claude Code feel like an extension of your existing workflow. - -## [Getting Started with Custom Keybindings](#getting-started-with-custom-keybindings) - -Run the `/keybindings` slash command inside Claude Code. This creates (or opens) your configuration file at `~/.claude/keybindings.json`. If you're new to [configuring Claude Code](/blog/guide/configuration-basics), this file sits alongside your other settings in the `~/.claude/` directory. - -The file structure is straightforward: - -```p-4 -{ - "$schema": "https://platform.claude.com/docs/schemas/claude-code/keybindings.json", - "$docs": "https://code.claude.com/docs/en/keybindings", - "bindings": [ - { - "context": "Chat", - "bindings": { - "ctrl+e": "chat:externalEditor", - "ctrl+u": null - } - } - ] -} -``` - -Three top-level fields control everything: - -- **`$schema`** - Optional. Point this at Claude's JSON Schema URL and your editor gives you autocompletion and validation for free. Worth adding. -- **`$docs`** - Optional. Documentation URL for quick reference. -- **`bindings`** - The array where all your custom shortcuts live. Each entry targets a specific context. - -The `$schema` field alone makes configuration significantly easier. If you use VS Code or any editor with JSON Schema support, you get inline suggestions for every valid action and context name. - -Changes to `keybindings.json` are detected and applied automatically. No restart needed. Edit, save, and your new shortcuts are live immediately. - -## [Understanding Contexts](#understanding-contexts) - -Every binding belongs to a **context**, which tells Claude Code when that shortcut is active. A shortcut bound in the `Chat` context only fires when you're typing in the main chat input. The same key combination can do different things in different contexts. - -Claude Code has 17 contexts: - -| Context | When It's Active | -| --- | --- | -| `Global` | Everywhere in the app | -| `Chat` | Main chat input area | -| `Autocomplete` | Autocomplete menu is open | -| `Settings` | Settings menu is open | -| `Confirmation` | Permission and confirmation dialogs | -| `Tabs` | Tab navigation components | -| `Help` | Help menu is visible | -| `Transcript` | Transcript viewer | -| `HistorySearch` | History search mode (Ctrl+R) | -| `Task` | Background task is running | -| `ThemePicker` | Theme picker dialog | -| `Attachments` | Image/attachment bar navigation | -| `Footer` | Footer indicator navigation | -| `MessageSelector` | Rewind dialog message selection | -| `DiffDialog` | Diff viewer navigation | -| `ModelPicker` | Model picker effort level | -| `Select` | Generic select/list components | -| `Plugin` | Plugin dialog (browse, discover, manage) | - -The `Global` context is special. Bindings here apply everywhere, regardless of what dialog or view is active. Use it sparingly. If you bind `Ctrl+K` globally, it fires whether you're in chat, browsing autocomplete suggestions, or reviewing diffs. - -## [Complete Action Reference](#complete-action-reference) - -Actions follow a `namespace:action` naming format. Here's every action available in each context, along with its default binding. - -### [Global Actions](#global-actions) - -These work everywhere in Claude Code: - -| Action | Default | What It Does | -| --- | --- | --- | -| `app:interrupt` | Ctrl+C | Cancel current operation | -| `app:exit` | Ctrl+D | Exit Claude Code | -| `app:toggleTodos` | Ctrl+T | Toggle task list visibility | -| `app:toggleTranscript` | Ctrl+O | Toggle verbose transcript | - -If you use [task management features](/blog/guide/development/todo-workflows), `app:toggleTodos` is one you'll reach for constantly. Consider binding it to something more accessible if `Ctrl+T` conflicts with your terminal. - -### [Chat Actions](#chat-actions) - -The main input area where you spend most of your time: - -| Action | Default | What It Does | -| --- | --- | --- | -| `chat:cancel` | Escape | Cancel current input | -| `chat:cycleMode` | Shift+Tab | Cycle permission modes | -| `chat:modelPicker` | Cmd+P / Meta+P | Open model picker | -| `chat:thinkingToggle` | Cmd+T / Meta+T | Toggle extended thinking | -| `chat:submit` | Enter | Submit message | -| `chat:undo` | Ctrl+\_ | Undo last action | -| `chat:externalEditor` | Ctrl+G | Open in external editor | -| `chat:stash` | Ctrl+S | Stash current prompt | -| `chat:imagePaste` | Ctrl+V (Alt+V on Windows) | Paste image | - -Note: `chat:cycleMode` defaults to `Meta+M` on Windows without VT mode (Node versions before 24.2.0/22.17.0, or Bun before 1.2.23). This ties directly into [permission management](/blog/guide/development/permission-management) for controlling what Claude can and can't do. - -### [History Actions](#history-actions) - -Navigate through your command history: - -| Action | Default | What It Does | -| --- | --- | --- | -| `history:search` | Ctrl+R | Open history search | -| `history:previous` | Up | Previous history item | -| `history:next` | Down | Next history item | - -### [Autocomplete Actions](#autocomplete-actions) - -When the autocomplete menu appears: - -| Action | Default | What It Does | -| --- | --- | --- | -| `autocomplete:accept` | Tab | Accept suggestion | -| `autocomplete:dismiss` | Escape | Dismiss menu | -| `autocomplete:previous` | Up | Previous suggestion | -| `autocomplete:next` | Down | Next suggestion | - -### [Confirmation Actions](#confirmation-actions) - -Permission and confirmation dialogs: - -| Action | Default | What It Does | -| --- | --- | --- | -| `confirm:yes` | Y, Enter | Confirm action | -| `confirm:no` | N, Escape | Decline action | -| `confirm:previous` | Up | Previous option | -| `confirm:next` | Down | Next option | -| `confirm:nextField` | Tab | Next field | -| `confirm:previousField` | (unbound) | Previous field | -| `confirm:cycleMode` | Shift+Tab | Cycle permission modes | -| `confirm:toggleExplanation` | Ctrl+E | Toggle permission explanation | -| `permission:toggleDebug` | Ctrl+D | Toggle permission debug info | - -### [Transcript Actions](#transcript-actions) - -| Action | Default | What It Does | -| --- | --- | --- | -| `transcript:toggleShowAll` | Ctrl+E | Toggle show all content | -| `transcript:exit` | Ctrl+C, Escape | Exit transcript view | - -### [History Search Actions](#history-search-actions) - -| Action | Default | What It Does | -| --- | --- | --- | -| `historySearch:next` | Ctrl+R | Next match | -| `historySearch:accept` | Escape, Tab | Accept selection | -| `historySearch:cancel` | Ctrl+C | Cancel search | -| `historySearch:execute` | Enter | Execute selected command | - -### [Task Actions](#task-actions) - -| Action | Default | What It Does | -| --- | --- | --- | -| `task:background` | Ctrl+B | Background current task | - -### [Theme, Help, and Settings Actions](#theme-help-and-settings-actions) - -| Action | Context | Default | What It Does | -| --- | --- | --- | --- | -| `theme:toggleSyntaxHighlighting` | ThemePicker | Ctrl+T | Toggle syntax highlighting | -| `help:dismiss` | Help | Escape | Close help menu | -| `settings:search` | Settings | / | Enter search mode | -| `settings:retry` | Settings | R | Retry loading usage data | - -### [Navigation Actions](#navigation-actions) - -These cover tabs, attachments, footer, diffs, model picker, selects, and the message selector: - -| Action | Context | Default | What It Does | -| --- | --- | --- | --- | -| `tabs:next` | Tabs | Tab, Right | Next tab | -| `tabs:previous` | Tabs | Shift+Tab, Left | Previous tab | -| `attachments:next` | Attachments | Right | Next attachment | -| `attachments:previous` | Attachments | Left | Previous attachment | -| `attachments:remove` | Attachments | Backspace, Delete | Remove attachment | -| `attachments:exit` | Attachments | Down, Escape | Exit attachment bar | -| `footer:next` | Footer | Right | Next footer item | -| `footer:previous` | Footer | Left | Previous footer item | -| `footer:openSelected` | Footer | Enter | Open selected item | -| `footer:clearSelection` | Footer | Escape | Clear selection | -| `messageSelector:up` | MessageSelector | Up, K | Move up in list | -| `messageSelector:down` | MessageSelector | Down, J | Move down in list | -| `messageSelector:top` | MessageSelector | Ctrl+Up, Shift+Up | Jump to top | -| `messageSelector:bottom` | MessageSelector | Ctrl+Down, Shift+Down | Jump to bottom | -| `messageSelector:select` | MessageSelector | Enter | Select message | -| `diff:dismiss` | DiffDialog | Escape | Close diff viewer | -| `diff:previousSource` | DiffDialog | Left | Previous diff source | -| `diff:nextSource` | DiffDialog | Right | Next diff source | -| `diff:previousFile` | DiffDialog | Up | Previous file | -| `diff:nextFile` | DiffDialog | Down | Next file | -| `diff:viewDetails` | DiffDialog | Enter | View details | -| `modelPicker:decreaseEffort` | ModelPicker | Left | Decrease effort level | -| `modelPicker:increaseEffort` | ModelPicker | Right | Increase effort level | -| `select:next` | Select | Down, J, Ctrl+N | Next option | -| `select:previous` | Select | Up, K, Ctrl+P | Previous option | -| `select:accept` | Select | Enter | Accept selection | -| `select:cancel` | Select | Escape | Cancel selection | -| `plugin:toggle` | Plugin | Space | Toggle plugin | -| `plugin:install` | Plugin | I | Install plugins | - -## [Keystroke Syntax](#keystroke-syntax) - -Claude Code uses a readable syntax for defining key combinations. - -### [Modifiers](#modifiers) - -Combine modifier keys with `+`: - -- **`ctrl`** or **`control`** for the Control key -- **`alt`**, **`opt`**, or **`option`** for Alt/Option -- **`shift`** for Shift -- **`meta`**, **`cmd`**, or **`command`** for Meta/Command - -Examples: - -```p-4 -ctrl+k Single modifier + key -shift+tab Shift + Tab -meta+p Command/Meta + P -ctrl+shift+c Multiple modifiers -``` - -### [Uppercase Letters and Shift](#uppercase-letters-and-shift) - -A standalone uppercase letter implies Shift. Writing `K` in your bindings is the same as writing `shift+k`. This is particularly useful for Vim-style bindings where `j` and `J` (or `k` and `K`) do different things. - -One important detail: uppercase letters *with modifiers* do NOT imply Shift. So `ctrl+K` is identical to `ctrl+k`. The uppercase is treated as purely stylistic when modifiers are present. - -### [Chord Sequences](#chord-sequences) - -Chords let you create multi-key shortcuts. Separate the keystrokes with a space: - -```p-4 -ctrl+k ctrl+s Press Ctrl+K, release, then press Ctrl+S -``` - -This gives you a much larger namespace for shortcuts. If you're running out of single-key combinations, chords open up hundreds of possibilities without conflicting with existing bindings. - -### [Special Keys](#special-keys) - -Use these names for non-character keys: - -- `escape` or `esc` -- `enter` or `return` -- `tab` -- `space` -- `up`, `down`, `left`, `right` -- `backspace`, `delete` - -## [Unbinding Default Shortcuts](#unbinding-default-shortcuts) - -Set any action to `null` to disable it: - -```p-4 -{ - "bindings": [ - { - "context": "Chat", - "bindings": { - "ctrl+s": null - } - } - ] -} -``` - -This is useful when a default shortcut conflicts with your terminal, your OS, or a tool you use alongside Claude Code. You can also unbind a default and then rebind the same key to a different action. - -## [Reserved Shortcuts](#reserved-shortcuts) - -Two shortcuts are hardcoded and cannot be rebound: - -| Shortcut | Reason | -| --- | --- | -| Ctrl+C | Hardcoded interrupt/cancel | -| Ctrl+D | Hardcoded exit | - -Don't try to rebind these. Claude Code won't accept it, and for good reason. `Ctrl+C` as interrupt and `Ctrl+D` as exit are Unix conventions that every terminal user expects. - -## [Terminal Multiplexer Conflicts](#terminal-multiplexer-conflicts) - -If you run Claude Code inside tmux, GNU screen, or another multiplexer, watch out for prefix key conflicts: - -| Shortcut | Conflict | -| --- | --- | -| Ctrl+B | tmux prefix (press twice to send through) | -| Ctrl+A | GNU screen prefix | -| Ctrl+Z | Unix process suspend (SIGTSTP) | - -The default `task:background` action uses `Ctrl+B`, which directly conflicts with tmux. If you're a tmux user, rebind it immediately: - -```p-4 -{ - "bindings": [ - { - "context": "Task", - "bindings": { - "ctrl+b": null, - "ctrl+shift+b": "task:background" - } - } - ] -} -``` - -This is one of the most common sources of confusion for developers running Claude Code inside [terminal sessions with multiplexers](/blog/guide/mechanics/terminal-main-thread). - -## [Vim Mode Interaction](#vim-mode-interaction) - -When vim mode is enabled (toggle with `/vim`), keybindings and vim mode operate on different layers: - -- **Vim mode** controls text input: cursor movement, modes (INSERT, NORMAL), motions, and text objects -- **Keybindings** control application actions: toggling the task list, submitting messages, opening the model picker - -The key distinction is the Escape key. In vim mode, Escape switches from INSERT to NORMAL mode. It does *not* trigger `chat:cancel`. Most `Ctrl+key` shortcuts pass through vim mode to the keybinding system, so `Ctrl+T` still toggles your task list even when you're in NORMAL mode. - -In NORMAL mode, pressing `?` shows the help menu (standard vim behavior), not the Claude Code help. - -If you rely on [planning modes](/blog/guide/mechanics/planning-modes) heavily and use vim mode, consider binding `chat:thinkingToggle` to a chord that won't conflict with vim motions. - -## [Validation and Diagnostics](#validation-and-diagnostics) - -Claude Code validates your keybindings file automatically and warns you about: - -- **Parse errors** in JSON syntax or structure -- **Invalid context names** that don't match the 17 supported contexts -- **Reserved shortcut conflicts** if you try to rebind Ctrl+C or Ctrl+D -- **Terminal multiplexer conflicts** for Ctrl+B, Ctrl+A, and Ctrl+Z -- **Duplicate bindings** in the same context - -Run `/doctor` to see all keybinding warnings at once. This is the fastest way to diagnose why a shortcut isn't working as expected. - -## [Practical Configuration Examples](#practical-configuration-examples) - -Here are real-world configurations that solve common problems. - -### [VS Code User Configuration](#vs-code-user-configuration) - -If you're coming from VS Code and want familiar shortcuts: - -```p-4 -{ - "$schema": "https://platform.claude.com/docs/schemas/claude-code/keybindings.json", - "bindings": [ - { - "context": "Chat", - "bindings": { - "ctrl+k ctrl+s": "chat:stash", - "ctrl+shift+p": "chat:modelPicker", - "ctrl+g": "chat:externalEditor" - } - }, - { - "context": "Global", - "bindings": { - "ctrl+shift+t": "app:toggleTodos" - } - } - ] -} -``` - -### [tmux-Friendly Setup](#tmux-friendly-setup) - -Avoids all tmux prefix conflicts: - -```p-4 -{ - "$schema": "https://platform.claude.com/docs/schemas/claude-code/keybindings.json", - "bindings": [ - { - "context": "Task", - "bindings": { - "ctrl+b": null, - "ctrl+shift+b": "task:background" - } - } - ] -} -``` - -### [Minimal Distraction Setup](#minimal-distraction-setup) - -Unbind shortcuts you keep hitting accidentally: - -```p-4 -{ - "$schema": "https://platform.claude.com/docs/schemas/claude-code/keybindings.json", - "bindings": [ - { - "context": "Chat", - "bindings": { - "ctrl+s": null, - "ctrl+u": null - } - } - ] -} -``` - -### [Chord-Based Power User](#chord-based-power-user) - -Use chords to access less-common features without burning single-key combos: - -```p-4 -{ - "$schema": "https://platform.claude.com/docs/schemas/claude-code/keybindings.json", - "bindings": [ - { - "context": "Chat", - "bindings": { - "ctrl+k ctrl+t": "chat:thinkingToggle", - "ctrl+k ctrl+m": "chat:modelPicker", - "ctrl+k ctrl+e": "chat:externalEditor" - } - } - ] -} -``` - -This keeps your most-used single-key shortcuts clean while still giving you fast access to everything else. - -## [Building Your Own Configuration](#building-your-own-configuration) - -Start small. Don't try to remap everything at once. Here's a practical approach: - -1. **Run `/keybindings`** to create the config file -2. **Identify your top 3 pain points** (conflicting shortcuts, missing shortcuts, accidental triggers) -3. **Fix those first** with targeted bindings -4. **Run `/doctor`** to validate -5. **Use Claude Code for a full session** and note any remaining friction -6. **Iterate** by adding or adjusting bindings as needed - -The goal isn't to customize every possible shortcut. It's to eliminate the friction between your muscle memory and Claude Code's behavior. Most developers only need 5-10 custom bindings to feel completely at home. - -If you're building a more comprehensive Claude Code setup, your keybindings work alongside [CLAUDE.md configuration](/blog/guide/mechanics/claude-md-mastery) and custom slash commands to create a fully personalized environment. The keybindings handle the physical interface. The configuration files handle the behavioral interface. Together, they make Claude Code feel like it was built specifically for your workflow. - -Last updated on - -[Previous - -Claude Code Tools](/blog/tools)[Next - -Status Line Guide](/blog/tools/statusline-guide) diff --git a/docs/site/src/content/blog/managing-context-long-sessions.md b/docs/site/src/content/blog/managing-context-long-sessions.md deleted file mode 100644 index 55771c35..00000000 --- a/docs/site/src/content/blog/managing-context-long-sessions.md +++ /dev/null @@ -1,176 +0,0 @@ ---- -slug: "managing-context-long-sessions" -title: "Managing Context in Long Claude Code Sessions" -description: "Learn how the context window works, what happens when it fills up, and strategies to keep long Claude Code sessions productive without losing progress." -date: "2026-02-10" -author: "Max Ritter" -tags: [Guide, Workflow] -readingTime: 7 -keywords: "Claude Code context limit, Claude Code session memory, Claude Code long sessions, context window management, autocompaction, context management" ---- - -# Managing Context in Long Claude Code Sessions - -If you've used Claude Code for more than a quick one-off task, you've hit the wall. You're deep into a refactor, everything is flowing, and suddenly Claude starts forgetting what you told it ten minutes ago. Your carefully built context — the files you discussed, the decisions you made, the architecture you agreed on — evaporates. - -This is the context window problem, and it's the single biggest friction point in AI-assisted development today. - -## What Is the Context Window? - -Every conversation with Claude exists within a fixed-size buffer called the context window. Think of it as Claude's working memory. Everything — your messages, Claude's responses, file contents, tool outputs, system prompts — competes for space in this window. - -Claude's context window is large (200K tokens with Opus, Sonnet, and Haiku), but it fills up faster than you'd expect. A single large file read can consume thousands of tokens. A few rounds of debugging with stack traces and log output can eat through 20-30% of the window in minutes. - -When the window fills up, Claude Code triggers **autocompaction** — it summarizes the conversation to free space. This is where things get painful. - -## What Happens During Autocompaction - -When context reaches its internal threshold (roughly 95% full), Claude Code compresses the conversation. The system creates a summary of what happened, discarding the original messages. - -The problem is that summaries are lossy by nature. Key details get dropped: - -- **Specific code decisions** — "We chose approach B because approach A had a race condition with the database pool" becomes "implemented the feature" -- **File locations and line numbers** — The exact spots you were working on get generalized -- **Debugging context** — The chain of reasoning that led to finding a bug vanishes -- **Partial progress** — Half-finished work gets described vaguely instead of preserved precisely - -After compaction, you'll find yourself re-explaining decisions, re-reading files Claude already analyzed, and re-doing work that was already done. It's the AI equivalent of a coworker who forgot everything from yesterday's meeting. - -## How Fast Does Context Fill Up? - -Faster than you think. Here's a rough breakdown of token costs for common operations: - -| Operation | Approximate Token Cost | -|-----------|----------------------| -| Reading a 200-line file | 2,000-4,000 tokens | -| Large stack trace | 1,000-3,000 tokens | -| Running tests with output | 2,000-5,000 tokens | -| System prompt + rules | 5,000-15,000 tokens | -| Each message round-trip | 500-2,000 tokens | - -A typical development session might look like this: - -1. System prompt and rules load: **10,000 tokens** -2. Read 3-4 files to understand context: **12,000 tokens** -3. Discuss approach and make decisions: **5,000 tokens** -4. Implement changes across files: **15,000 tokens** -5. Run tests and debug failures: **20,000 tokens** -6. Fix issues and re-run tests: **15,000 tokens** - -That's roughly 77,000 tokens — and you're barely halfway through a complex task. Add a few more debugging cycles, some large file reads, or a refactor that touches many files, and you're approaching the compaction threshold. - -## Common Strategies (And Their Limitations) - -### Strategy 1: Keep Sessions Short - -The most common advice is to use Claude Code for small, focused tasks. Fix one bug per session. Implement one function at a time. - -**The limitation:** Real development work isn't neatly decomposable into 10-minute chunks. Refactoring an authentication system, implementing a new API with tests, or debugging a complex race condition all require sustained context that spans many interactions. - -### Strategy 2: Write Everything Down - -Some developers maintain external notes — a markdown file with decisions, file references, and progress. When context compacts, they paste the notes back in. - -**The limitation:** This works, but it's manual, tedious, and error-prone. You're essentially doing the AI's memory management by hand, which defeats the purpose of having an AI assistant. - -### Strategy 3: Use Compact Prompts - -Being economical with context helps. Avoid pasting entire files when you only need a function. Reference files by path instead of including their contents. - -**The limitation:** This requires constant vigilance about token usage — a cognitive overhead that takes you out of the flow state you're trying to achieve. And even with careful management, complex tasks will still exhaust the window. - -### Strategy 4: Start Fresh and Re-establish Context - -When context gets messy, start a new conversation and re-explain everything from scratch. - -**The limitation:** Re-establishing context takes significant time and tokens itself. You're spending 20-30% of your fresh context window just getting back to where you were. - -## The Real Problem: Sessions Are Disposable - -The fundamental issue isn't the size of the context window — it's that **sessions are treated as disposable**. When a session ends or compacts, the accumulated understanding is lost. Every new session starts from zero. - -This creates a ceiling on the complexity of work you can do with AI assistance. Simple tasks that fit in one session work great. Anything requiring sustained effort across many interactions hits the context wall. - -What's needed is a way to make sessions **continuous** — to preserve the accumulated understanding across context boundaries, automatically, without manual intervention. - -## Context Preservation: Automatic Continuity - -This is the problem that Pilot Shell's context management was designed to solve. Instead of treating the context limit as a hard wall that destroys your progress, auto-compaction turns it into a seamless checkpoint. - -Here's how it works: - -### 1. Context Monitoring - -A background hook continuously tracks context usage percentage. At ~80%, it warns that context is getting high. At ~90%+, state-preservation hooks prepare for auto-compaction as the context approaches 100%. - -### 2. State Preservation - -Before auto-compaction fires, the current state is captured: -- What task is being worked on -- What's been completed -- What's in progress -- What needs to happen next -- Key decisions and their rationale - -This state is saved to persistent memory (observations that survive across compaction cycles and sessions). - -### 3. Automatic Restoration - -After compaction, the session continues with preserved context injected. Work picks up exactly where it left off — same task, same progress, same understanding of the codebase. - -### 4. Persistent Memory - -Beyond session continuity, a persistent memory system (powered by SQLite and MCP) stores observations from every session. When a new session starts, relevant past observations are automatically injected. This means: - -- Decisions made three sessions ago are still accessible -- Debugging discoveries from last week inform today's work -- Codebase understanding accumulates over time, not just within a session - -### The Result - -With auto-compaction and persistent memory, a complex refactor that would normally require 3-4 separate sessions (each losing context from the previous ones) becomes one continuous flow. The developer never has to re-explain context, re-read files, or re-make decisions. - -The context window still has a fixed size, but its boundary becomes invisible. Work flows continuously across session boundaries as if the window were infinite. - -## Practical Tips for Long Sessions - -Whether or not you use a continuity system, these practices help maximize the value of your context window: - -### Front-Load Important Context - -Put the most critical information early in the session. Claude pays more attention to content at the beginning and end of the context window (the primacy and recency effects apply to LLMs too). - -### Use Structured Plans - -For complex tasks, create a plan file early in the session. This gives Claude a persistent reference point that survives even partial context loss. The plan file lives on disk, so it can always be re-read. - -### Reference Files by Path - -Instead of asking Claude to "look at the auth code," say "read `src/auth/middleware.ts` lines 45-80." Precise references consume less context than exploratory reads. - -### Commit Frequently - -Regular commits create checkpoints in your work. If context is lost, you can reference the git log to understand what was already done. `git diff` is cheaper than re-reading all modified files. - -### Watch for the Signs - -Context degradation doesn't happen suddenly. Watch for these signs: - -- Claude starts asking about things you already discussed -- Responses become more generic and less specific to your codebase -- Claude suggests approaches you already rejected -- File references become vague ("the main file" instead of the specific path) - -When you see these signs, it's time to either compact intentionally or start a new session with preserved context. - -## The Future of Context Management - -The context window problem isn't permanent. Context windows are getting larger with each model generation, and techniques like persistent memory, session continuity, and intelligent summarization are making the boundaries less painful. - -But today, context management is a real skill that separates productive AI-assisted development from frustrating experiences. Understanding how context works, when it degrades, and how to preserve it across sessions is as important as knowing how to write good prompts. - -The developers who get the most out of Claude Code aren't the ones who write the cleverest prompts — they're the ones who manage context effectively, either manually or with tools that automate it. - ---- - -*Pilot Shell provides intelligent context management with auto-compaction, persistent memory across sessions, and context monitoring hooks. [Get started with Pilot Shell](https://pilot-shell.com/#installation) to make your Claude Code sessions flow without interruption.* diff --git a/docs/site/src/content/blog/mcp-basics.md b/docs/site/src/content/blog/mcp-basics.md deleted file mode 100644 index 209c9166..00000000 --- a/docs/site/src/content/blog/mcp-basics.md +++ /dev/null @@ -1,205 +0,0 @@ ---- -slug: "mcp-basics" -title: "Claude Code MCP: Model Context Protocol Extensions Explained" -description: "Master Claude Code MCP servers to extend AI capabilities beyond default tools. Learn to install and configure powerful extensions in minutes." -date: "2025-08-23" -author: "Max Ritter" -tags: [Guide, MCP] -readingTime: 5 -keywords: "basics, claude, code, context, explained, extensions, mcp, model, protocol" ---- - -MCP & Extensions - -# Claude Code MCP: Model Context Protocol Extensions Explained - -Master Claude Code MCP servers to extend AI capabilities beyond default tools. Learn to install and configure powerful extensions in minutes. - -**Problem**: Claude Code feels limited - it can only do basic tasks and you're constantly hitting walls when trying to access external services, databases, or specialized tools. - -**Quick Win**: Configure your first MCP server to unlock web browsing, database connections, and dozens of other capabilities. Add this to your MCP settings file: - -```p-4 -{ - "mcpServers": { - "brave-search": { - "command": "npx", - "args": ["-y", "@modelcontextprotocol/server-brave-search"], - "env": { "BRAVE_API_KEY": "your-api-key" } - } - } -} -``` - -After restarting Claude Code, test by asking Claude to "search for the latest Next.js 15 features" and watch it browse the web in real-time. - -## [What Are MCP Servers?](#what-are-mcp-servers) - -Model Context Protocol (MCP) servers are extensions that give Claude Code superpowers. Think of them as plugins that connect Claude to external services, databases, APIs, and tools that it normally can't access. - -**New in 2026**: Claude Code now includes [MCP Tool Search](/blog/tools/mcp-extensions/mcp-tool-search) - automatic lazy loading that reduces MCP context usage by up to 95%. Configure as many servers as you need without worrying about context limits. - -Without MCP servers, Claude Code is isolated - it can only work with files you give it. With MCP servers, Claude Code becomes a connected AI assistant that can: - -- Browse the web and fetch current information -- Query databases and APIs -- Interact with services like GitHub, Slack, or Google Sheets -- Access specialized tools for different industries -- Automate complex workflows across multiple systems - -## [How MCP Servers Work](#how-mcp-servers-work) - -MCP servers run as separate processes that Claude Code communicates with through a standardized protocol. When you install an MCP server: - -1. **Connection**: Claude Code establishes a connection to the MCP server -2. **Discovery**: The server tells Claude what tools/functions it provides -3. **Integration**: These tools become available in Claude's context -4. **Execution**: Claude can call these tools during conversations - -```p-4 -// Claude Code CLI: ~/.claude.json or project-level .mcp.json -// Claude Desktop: claude_desktop_config.json -{ - "mcpServers": { - "brave-search": { - "command": "npx", - "args": ["-y", "@modelcontextprotocol/server-brave-search"], - "env": { - "BRAVE_API_KEY": "your-api-key" - } - } - } -} -``` - -## [Essential MCP Servers to Install](#essential-mcp-servers-to-install) - -Start with these high-impact MCP servers that solve common problems: - -**Web Access & Research**: - -- **Brave Search** (`@modelcontextprotocol/server-brave-search`) - Web search capability -- **Fetch** (`@modelcontextprotocol/server-fetch`) - Fetch and parse web content - -**Development Tools**: - -- **GitHub** (`@modelcontextprotocol/server-github`) - Repository access and management -- **Git** (`@modelcontextprotocol/server-git`) - Local git operations -- **PostgreSQL** (`@modelcontextprotocol/server-postgres`) - Database queries - -**File Operations**: - -- **Filesystem** (`@modelcontextprotocol/server-filesystem`) - Enhanced file operations -- **Google Drive** (`@modelcontextprotocol/server-gdrive`) - Cloud file access - -Add any of these to your `mcpServers` config using the pattern shown above. - -Each MCP server unlocks specific capabilities. [Browse popular MCP servers](/blog/tools/mcp-extensions/best-addons) to find ones matching your workflow. - -## [Configuration Process](#configuration-process) - -MCP servers are configured through JSON files, not CLI commands: - -1. **Locate your config file**: - - - Claude Code CLI: `~/.claude.json` or `.mcp.json` in project root - - Claude Desktop (macOS): `~/Library/Application Support/Claude/claude_desktop_config.json` - - Claude Desktop (Windows): `%APPDATA%\Claude\claude_desktop_config.json` -2. **Add the server configuration**: - -```p-4 -{ - "mcpServers": { - "server-name": { - "command": "npx", - "args": ["-y", "@modelcontextprotocol/server-name"], - "env": { "API_KEY": "your-key-here" } - } - } -} -``` - -3. **Restart Claude Code** to load the new configuration. -4. **Test in Claude Code**: - Ask Claude: "What MCP tools are available?" to see your installed extensions. - -## [Common Setup Issues and Fixes](#common-setup-issues-and-fixes) - -**Error: "MCP server not found"** -Fix: Ensure the package is installed globally and accessible: - -```p-4 -# Reinstall with explicit global flag -npm install -g @modelcontextprotocol/server-brave-search -``` - -**Error: "Authentication failed"** -Fix: Verify your API keys are properly set: - -```p-4 -# Check environment variables -echo $BRAVE_API_KEY -echo $GITHUB_TOKEN -``` - -**Error: "Server connection timeout"** -Fix: Restart Claude Code to refresh MCP connections. Exit your current session and start a new one to reload all MCP servers. - -## [Quick Enable/Disable Commands](#quick-enabledisable-commands) - -Toggle MCP servers on the fly without editing config files: - -```p-4 -# Disable a server temporarily -/mcp disable supabase - -# Re-enable when needed -/mcp enable supabase -``` - -This is useful when an MCP server causes issues or you want to reduce noise from tools you're not currently using. The server configuration stays in your config file - you're just toggling its active state for the current session. - -## [Advanced Configuration](#advanced-configuration) - -Fine-tune MCP servers for optimal performance: - -```p-4 -{ - "mcpServers": { - "custom-server": { - "command": "node", - "args": ["path/to/your/server.js"], - "env": { - "LOG_LEVEL": "debug", - "TIMEOUT": "30000" - } - } - } -} -``` - -Custom server configurations allow you to: - -- Run local Node.js or Python MCP servers -- Pass custom environment variables for API keys and settings -- Enable debug logging for troubleshooting -- Connect to any service with a compatible MCP server - -## [Next Actions](#next-actions) - -Your MCP journey starts now: - -1. **Install your first MCP server**: Pick Brave Search for immediate web access -2. **Explore popular options**: Check our [Popular MCP Servers guide](/blog/tools/mcp-extensions/best-addons) for curated recommendations -3. **Set up browser automation**: Learn [browser automation with MCP](/blog/tools/mcp-extensions/browser-automation) for advanced web interactions -4. **Create custom integrations**: Build your own MCP servers with our [Custom Integrations tutorial](/blog/tools/mcp-extensions/custom-integrations) - -MCP servers transform Claude Code from an isolated assistant into a connected powerhouse. Start with one server today and gradually build your extension library as your needs evolve. - -Last updated on - -[Previous - -Permission Hook](/blog/tools/hooks/permission-hook-guide)[Next - -MCP Tool Search](/blog/tools/mcp-extensions/mcp-tool-search) diff --git a/docs/site/src/content/blog/mcp-servers-claude-code.md b/docs/site/src/content/blog/mcp-servers-claude-code.md deleted file mode 100644 index b5d521b0..00000000 --- a/docs/site/src/content/blog/mcp-servers-claude-code.md +++ /dev/null @@ -1,155 +0,0 @@ ---- -slug: "mcp-servers-claude-code" -title: "Getting Started with MCP Servers in Claude Code" -description: "Set up MCP servers to give Claude Code access to documentation, databases, browsers, and APIs. Includes configuration examples and essential servers." -date: "2026-02-11" -author: "Max Ritter" -tags: [Guide, MCP] -readingTime: 5 -keywords: "Claude Code MCP, Model Context Protocol, MCP servers, Claude Code tools, Context7 MCP, Claude Code browser automation" ---- - -# Getting Started with MCP Servers in Claude Code - -The Model Context Protocol (MCP) connects Claude Code to external tools and data sources. Instead of being limited to file operations and shell commands, MCP lets Claude interact with databases, APIs, browsers, and specialized services directly. - -## What MCP Does - -MCP servers expose "tools" that Claude can call. Each tool has a name, description, and input schema. When Claude decides it needs external data or functionality, it calls the appropriate MCP tool — just like it calls built-in tools like Read or Bash. - -Examples of what MCP servers enable: - -- **Search the web** without leaving the terminal -- **Query databases** directly from conversations -- **Fetch documentation** for any library on-demand -- **Interact with project management tools** (Jira, Linear, GitHub) -- **Control a browser** for testing and automation - -## Configuration - -MCP servers are configured in `.mcp.json` at your project root: - -```json -{ - "mcpServers": { - "context7": { - "command": "npx", - "args": ["-y", "@upstreamapi/context7-mcp@latest"] - }, - "filesystem": { - "command": "npx", - "args": ["-y", "@modelcontextprotocol/server-filesystem", "."] - } - } -} -``` - -Two server types are supported: - -| Type | Config | Use Case | -|------|--------|----------| -| **Command** | `command` + `args` | Local processes (npx, node, python) | -| **Remote** | `url` | HTTP-based MCP servers | - -## Essential MCP Servers - -### Context7 — Library Documentation - -Provides up-to-date documentation for thousands of libraries. Claude can look up API references, code examples, and best practices without searching the web. - -```json -{ - "mcpServers": { - "context7": { - "command": "npx", - "args": ["-y", "@upstreamapi/context7-mcp@latest"] - } - } -} -``` - -### Filesystem — Enhanced File Operations - -Gives Claude additional file operations like directory tree listing, file search, and move/copy operations. - -```json -{ - "mcpServers": { - "filesystem": { - "command": "npx", - "args": ["-y", "@modelcontextprotocol/server-filesystem", "/path/to/project"] - } - } -} -``` - -### Browser Automation - -Control a browser for E2E testing, scraping, or visual verification. - -```json -{ - "mcpServers": { - "playwright": { - "command": "npx", - "args": ["-y", "@anthropic/mcp-playwright"] - } - } -} -``` - -## Reducing Context Usage with Tool Search - -By default, every MCP tool definition loads into Claude's context when the server starts. For servers with many tools, this wastes tokens. - -Enable `enable_tool_search` in your project settings to defer tool loading: - -```json -{ - "enableToolSearch": true -} -``` - -With tool search enabled, Claude discovers MCP tools on-demand rather than loading all definitions upfront. This can reduce context usage from MCP by over 90%. - -## Building Custom MCP Servers - -You can build MCP servers for your team's specific needs. A minimal server in TypeScript: - -```typescript -import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; -import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; - -const server = new McpServer({ name: "my-server", version: "1.0.0" }); - -server.tool("get_status", "Check system status", {}, async () => ({ - content: [{ type: "text", text: "All systems operational" }] -})); - -const transport = new StdioServerTransport(); -await server.connect(transport); -``` - -Register it in `.mcp.json`: - -```json -{ - "mcpServers": { - "my-server": { - "command": "node", - "args": ["scripts/my-server.js"] - } - } -} -``` - -## How Pilot Extends MCP - -Pilot Shell ships with pre-configured MCP servers that integrate into its workflow: - -- **Persistent Memory** — Stores observations across sessions so Claude remembers past work, decisions, and learnings -- **Web Search & Fetch** — Search the web and fetch full page content without API keys -- **GitHub Code Search** — Find production code examples from millions of repositories -- **Context7** — Access library documentation directly during implementation - -These servers are configured automatically during installation — no manual setup needed. They power Pilot's intelligent context management through auto-compaction and persistent memory. diff --git a/docs/site/src/content/blog/mcp-tool-search.md b/docs/site/src/content/blog/mcp-tool-search.md deleted file mode 100644 index b3b99675..00000000 --- a/docs/site/src/content/blog/mcp-tool-search.md +++ /dev/null @@ -1,176 +0,0 @@ ---- -slug: "mcp-tool-search" -title: "Claude Code MCP Tool Search: Save 95% Context" -description: "Configure enable_tool_search for Claude Code MCP lazy loading. Reduce context usage by 95% with MCP Tool Search and optimize your context window." -date: "2026-01-15" -author: "Max Ritter" -tags: [Guide, MCP] -readingTime: 5 -keywords: "95, claude, code, context, mcp, save, search, tool" ---- - -MCP & Extensions - -# MCP Tool Search: Claude Code Lazy Loading for 95% Context Reduction - -Configure enable\_tool\_search for Claude Code MCP lazy loading. Reduce context usage by 95% with MCP Tool Search and optimize your context window. - -**Problem**: Your MCP servers are eating your context window alive. With 7+ servers configured, you're losing 50-70% of your 200K context before writing a single prompt. Complex tasks become impossible when you start each session with only 60-90K tokens remaining. - -**Quick Win**: Claude Code now automatically enables MCP Tool Search when your MCP tools would consume more than 10% of context. No configuration needed - it just works. Check your context usage with `/context` to see the difference. - -## [What is MCP Tool Search?](#what-is-mcp-tool-search) - -MCP Tool Search is Claude Code's new lazy loading system for MCP servers. Instead of loading all tool definitions at session start, Claude Code loads a lightweight search index and fetches tool details on-demand when you actually need them. - -Before MCP Tool Search: - -```p-4 -Starting session... -Loading 73 MCP tools... [39.8k tokens] -Loading 56 agents... [9.7k tokens] -Loading system tools... [22.6k tokens] -Ready with 92k tokens remaining. -``` - -After MCP Tool Search: - -```p-4 -Starting session... -Loading tool registry... [5k tokens] -Ready with 195k tokens available. - -User: "I need to query the database" -> Auto-loading: postgres-mcp [+1.2k tokens] -> 193.8k tokens remaining -``` - -The difference is dramatic: **95% reduction** in initial context consumption for users with multiple [MCP servers](/blog/tools/mcp-extensions/mcp-basics). - -## [How MCP Tool Search Works](#how-mcp-tool-search-works) - -MCP Tool Search activates automatically when your MCP tool descriptions would use more than 10% of your context window. When triggered: - -1. **Registry Creation**: Claude Code builds a lightweight index of tool names and descriptions -2. **On-Demand Loading**: Tools load only when Claude determines they're needed for your request -3. **Intelligent Caching**: Loaded tools stay available for the session duration -4. **Seamless Experience**: MCP tools work exactly as before - no workflow changes required - -The system analyzes your input, matches relevant keywords, and loads only the tools likely to help with your current task. - -## [For MCP Server Builders](#for-mcp-server-builders) - -If you're building MCP servers, the `server instructions` field becomes critical with MCP Tool Search enabled. This field helps Claude know when to search for your tools. - -Think of server instructions like skills - they tell Claude what capabilities your server provides and when to look for them: - -```p-4 -{ - "mcpServers": { - "my-custom-server": { - "command": "node", - "args": ["/path/to/server.js"], - "serverInstructions": "Database operations for PostgreSQL including queries, schema management, and data migrations. Use for any database-related tasks." - } - } -} -``` - -Good server instructions should: - -- Describe the server's capabilities clearly -- Include keywords users might use in prompts -- Specify when the tools should be activated -- Be concise but comprehensive - -## [Checking Your Context Usage](#checking-your-context-usage) - -Monitor how MCP Tool Search affects your context consumption: - -```p-4 -# Check current context usage -/context - -# See which MCP tools are loaded -/mcp -``` - -With MCP Tool Search active, you'll see significantly lower initial token counts. As you work and Claude loads relevant tools, the count increases - but only for tools you actually use. - -## [Configuration Options](#configuration-options) - -MCP Tool Search works automatically, but you can influence its behavior through settings and commands. - -### [Enable or Disable Tool Search](#enable-or-disable-tool-search) - -Control MCP Tool Search globally via your Claude Code settings: - -```p-4 -{ - "enable_tool_search": true -} -``` - -Set `enable_tool_search` to `false` if you prefer all MCP tools loaded at session start (legacy behavior). - -### [Per-Server Control](#per-server-control) - -**Disable for specific servers** (if you always need certain tools immediately): - -```p-4 -/mcp disable tool-search my-always-needed-server -``` - -**Force load specific tools** when you know you'll need them: - -```p-4 -Load the github and postgres MCP tools for this session -``` - -## [Real-World Impact](#real-world-impact) - -The GitHub issue that drove this feature ([#7336](https://github.com/anthropics/claude-code/issues/7336)) documented the problem precisely: - -| Resource | Before | After | -| --- | --- | --- | -| MCP tools | 39.8k tokens (19.9%) | ~5k tokens (2.5%) | -| Available context | 92k tokens | 195k tokens | -| Usable for work | 46% | 97.5% | - -Users with complex setups - database servers, GitHub integrations, browser automation, custom APIs - can now run full workloads without hitting context limits. - -## [Compatibility Notes](#compatibility-notes) - -MCP Tool Search works with all existing MCP servers. However, some considerations: - -- **Older servers**: May work less efficiently if they lack good tool descriptions -- **Custom servers**: Add clear `serverInstructions` for best results -- **High-frequency tools**: Consider disabling MCP Tool Search for servers you use constantly - -## [What This Enables](#what-this-enables) - -With 95% more available context, you can now: - -- Run longer, more complex coding sessions -- Use more MCP servers simultaneously without penalty -- Maintain conversation history across extended workflows -- Execute multi-step tasks that previously hit context limits - -## [Next Steps](#next-steps) - -Maximize your MCP setup with MCP Tool Search: - -1. **Audit your servers**: Run `/context` to see your current usage -2. **Update server instructions**: Add descriptive instructions to custom servers -3. **Explore more servers**: Check our [popular MCP servers guide](/blog/tools/mcp-extensions/best-addons) - you can now run more without penalty -4. **Learn MCP fundamentals**: Review [MCP basics](/blog/tools/mcp-extensions/mcp-basics) if you're new to the protocol - -MCP Tool Search removes the primary constraint that limited MCP adoption. Configure the servers you need, and let Claude Code handle the context management automatically. - -Last updated on - -[Previous - -MCP Basics](/blog/tools/mcp-extensions/mcp-basics)[Next - -Context7 MCP](/blog/tools/mcp-extensions/context7-mcp) diff --git a/docs/site/src/content/blog/memory-optimization.md b/docs/site/src/content/blog/memory-optimization.md deleted file mode 100644 index 36ad02f0..00000000 --- a/docs/site/src/content/blog/memory-optimization.md +++ /dev/null @@ -1,282 +0,0 @@ ---- -slug: "memory-optimization" -title: "Claude Code Memory: End Repetitive Context Setup" -description: "CLAUDE.md loads at startup with high priority. Structure it correctly and Claude Code remembers your tech stack and preferences every session." -date: "2025-08-23" -author: "Max Ritter" -tags: [Guide, Workflow] -readingTime: 8 -keywords: "claude, code, context, end, memory, optimization, repetitive, setup" ---- - -Mechanics - -# Claude Code Memory: Never Re-Explain Your Project Again - -CLAUDE.md loads at startup with high priority. Structure it correctly and Claude Code remembers your tech stack and preferences every session. - -**Problem**: Claude Code loses track of your project context between sessions, forcing you to repeat instructions every time you start working. - -**Quick Win**: Create your memory system in 30 seconds: - -```p-4 -cd your-project -claude -/init -``` - -Claude analyzes your codebase and generates a starter `CLAUDE.md` file. This becomes your project's persistent memory - loaded automatically every session. - -## [CLAUDE.md is Your Memory System](#claudemd-is-your-memory-system) - -Claude Code's memory lives in the `CLAUDE.md` file. Unlike conversation history that disappears, this file persists across sessions. Claude reads it at startup and treats its contents as authoritative instructions. - -Here's what makes this powerful: **CLAUDE.md content receives high priority in Claude's context window**. It's followed more strictly than your chat messages or file contents you read during a session. Think of it as configuration, not documentation. - -This priority distinction matters for how you structure your context. See [the priority hierarchy](/blog/guide/mechanics/rules-directory#why-priority-matters-the-monolithic-claudemd-problem) for the full breakdown. - -## [Structure Your CLAUDE.md for Maximum Retention](#structure-your-claudemd-for-maximum-retention) - -A well-structured file separates what Claude needs to always remember from what changes: - -```p-4 -# Project Context - -- Framework: Next.js 14 with App Router -- Database: Supabase with Row Level Security -- Testing: Vitest for unit tests - -## Key Directories - -- `src/app/` - Route handlers and pages -- `src/lib/` - Shared utilities -- `src/components/` - React components - -## Standards - -- TypeScript strict mode required -- All API routes need error handling -- Run `npm test` before committing - -## Current Focus - -- Building user authentication flow -- Priority: Login and password reset -``` - -The "Current Focus" section gives you a place to update session-specific context without cluttering permanent instructions. - -## [Directory Crawling: Hierarchical Memory](#directory-crawling-hierarchical-memory) - -Claude reads `CLAUDE.md` files up the directory tree. This creates a memory hierarchy: - -```p-4 -~/projects/CLAUDE.md <- Universal defaults -~/projects/my-app/CLAUDE.md <- Project-specific -~/projects/my-app/api/CLAUDE.md <- Component-specific -``` - -Use this for monorepos or when different parts of your project need different contexts. Keep parent directories lightweight - everything loads every session. - -## [@import Syntax: Composable Memory](#import-syntax-composable-memory) - -CLAUDE.md files can import additional files using the `@path/to/import` syntax. This turns your memory system from a single file into a composable network of instructions. - -```p-4 -See @README for project overview and @package.json for available npm commands. - -# Additional Instructions - -- git workflow @docs/git-instructions.md -``` - -Both relative and absolute paths work. Relative paths resolve from the file containing the import, not from your working directory. You can reference any file in your project or system: - -```p-4 -# Pull in shared team standards - -- @docs/coding-standards.md -- @docs/api-conventions.md - -# Reference external files with absolute paths - -- @~/.claude/my-preferences.md -``` - -**First-time approval**: When Claude Code encounters external imports in a project for the first time, it shows an approval dialog listing the specific files. Approve to load them, decline to skip them. This is a one-time decision per project. Once declined, the dialog does not resurface and those imports remain disabled. - -**Code block safety**: Imports are not evaluated inside markdown code spans or code blocks. So writing `@path/to/file` in a code example won't trigger an import. - -**Recursive imports**: Imported files can themselves import additional files, with a max-depth of 5 hops. This lets you build layered instruction sets without flattening everything into one file. - -**Git worktree tip**: If you work across multiple git worktrees, `CLAUDE.local.md` only exists in one. Use a home-directory import so all worktrees share the same personal instructions: - -```p-4 -# Individual Preferences - -- @~/.claude/my-project-instructions.md -``` - -## [CLAUDE.local.md: Private Project Memory](#claudelocalmd-private-project-memory) - -For personal project-specific preferences that should not be checked into version control, use `CLAUDE.local.md`. This file is automatically added to `.gitignore`, making it ideal for private context like sandbox URLs, preferred test data, or personal workflow preferences. - -```p-4 -# CLAUDE.local.md - -## My Local Setup - -- Dev server: http://localhost:3001 -- Test database: local-dev-db -- Preferred branch naming: feature/[initials]-[description] -``` - -`CLAUDE.local.md` loads automatically alongside `CLAUDE.md` with the same priority. You get personal context without polluting the team's shared instructions. - -## [/memory Command: View and Edit Loaded Files](#memory-command-view-and-edit-loaded-files) - -Use the `/memory` command during a session to see what memory files are currently loaded and to open any memory file in your system editor. This is useful for: - -- Verifying which CLAUDE.md files, rules, and imports are active -- Quickly editing memory files without leaving your session -- Debugging when instructions seem to be missing or not loading - -## [Modular Rules: Path-Targeted High-Priority Memory](#modular-rules-path-targeted-high-priority-memory) - -For finer control, the `.claude/rules/` directory lets you split instructions into multiple files with path targeting: - -```p-4 -.claude/rules/ -├── api-guidelines.md # paths: src/api/**/* -├── react-patterns.md # paths: src/components/**/* -└── testing-rules.md # paths: **/*.test.* -``` - -**Critical**: Rules files receive the **same high priority as CLAUDE.md**. The difference is path targeting lets you scope when that priority applies. - -This solves the "monolithic CLAUDE.md problem" - when you cram everything into one file, all instructions compete for high-priority attention even when they're irrelevant to the current task. With rules, your API guidelines get high priority only during API work. - -**User-level rules**: You can also create personal rules that apply across all your projects in `~/.claude/rules/`. These load before project rules, giving project rules higher priority when there's a conflict. - -**Brace expansion**: Path patterns support brace expansion for matching multiple extensions or directories: `src/**/*.{ts,tsx}` or `{src,lib}/**/*.ts`. - -**Symlinks**: The `.claude/rules/` directory supports symlinks, letting you share common rules across multiple projects. Circular symlinks are detected and handled gracefully. - -See the [Rules Directory guide](/blog/guide/mechanics/rules-directory) for path patterns, the priority hierarchy, and migration strategies. - -## [The Complete Memory Hierarchy](#the-complete-memory-hierarchy) - -Claude Code offers five memory locations in a hierarchical structure, each serving a different purpose: - -| Memory Type | Location | Purpose | Shared With | -| --- | --- | --- | --- | -| **Managed policy** | System paths (see below) | Organization-wide instructions | All users in organization | -| **Project memory** | `./CLAUDE.md` or `./.claude/CLAUDE.md` | Team-shared instructions for the project | Team via source control | -| **Project rules** | `./.claude/rules/*.md` | Modular, topic-specific project rules | Team via source control | -| **User memory** | `~/.claude/CLAUDE.md` | Personal preferences for all projects | Just you (all projects) | -| **Project local** | `./CLAUDE.local.md` | Personal project-specific preferences | Just you (current project) | - -**Managed policy paths** vary by platform: - -- macOS: `/Library/Application Support/ClaudeCode/CLAUDE.md` -- Linux: `/etc/claude-code/CLAUDE.md` -- Windows: `C:\Program Files\ClaudeCode\CLAUDE.md` - -Files higher in the hierarchy take precedence and load first. This means organization-wide policies set the baseline, and more specific files build on top. - -## [Subtree Discovery: Lazy Loading Nested Memory](#subtree-discovery-lazy-loading-nested-memory) - -Claude reads CLAUDE.md files by crawling up the directory tree from your working directory. But it also discovers CLAUDE.md files nested in subdirectories below your current directory. - -The difference: subtree CLAUDE.md files are not loaded at launch. They only load when Claude reads files in those subdirectories. This keeps startup lean while still honoring localized instructions when they become relevant. - -For example, if your project has `packages/auth/CLAUDE.md` with authentication-specific rules, those instructions only load when Claude starts working with files inside `packages/auth/`. - -## [Version Control Your Memory](#version-control-your-memory) - -Git turns CLAUDE.md into a time-traveling memory system: - -```p-4 -# Before experimenting with instructions -git add CLAUDE.md && git commit -m "working context state" - -# Try new instructions, then restore if needed -git checkout CLAUDE.md -``` - -This gives you instant rollback when instruction changes backfire. - -## [Session Memory: Automatic Summarization](#session-memory-automatic-summarization) - -Claude Code now maintains a continuous session memory that updates with every message exchange. This structured summary lives at `~/.claude/projects/[project]/[session]/session_memory` and includes: - -- **Session title**: Auto-generated description of your work -- **Current status**: Completed items, discussion points, open questions -- **Key results**: Important outcomes and learnings -- **Work log**: Chronological record of actions taken - -This automatic summarization powers instant compaction. When you run `/compact`, Claude loads your session memory into a fresh context immediately - no more two-minute waits. - -Ask Claude "where is your session memory stored?" to find the exact path for your current session. - -## [Fresh Context When You Need It](#fresh-context-when-you-need-it) - -Long sessions accumulate irrelevant context. Use `/clear` to reset: - -```p-4 -/clear -``` - -This removes conversation history while preserving your CLAUDE.md. Your memory stays intact; the noise disappears. - -For completely fresh starts, exit and restart: - -```p-4 -exit -claude -``` - -## [Isolated Contexts for Different Work](#isolated-contexts-for-different-work) - -Need different memory for different tasks? Use separate directories: - -```p-4 -mkdir feature-auth && cd feature-auth -cp ../CLAUDE.md CLAUDE.md -echo "## Focus: Authentication only" >> CLAUDE.md -claude -``` - -Each directory gets its own CLAUDE.md, creating isolated contexts. Perfect for feature branches or experimental work. - -## [When Things Go Wrong](#when-things-go-wrong) - -**Context feels stale**: Conversation has accumulated irrelevant history. - -- **Fix**: Run `/clear` to reset while keeping CLAUDE.md loaded. - -**Multiple projects mixing**: Context from one project bleeding into another. - -- **Fix**: Each project needs its own CLAUDE.md in its root directory. - -**Instructions being ignored**: CLAUDE.md has grown too large or unclear. - -- **Fix**: Keep instructions under 400 lines. Move domain-specific details to [path-targeted rules](/blog/guide/mechanics/rules-directory) so they only receive high priority when relevant. - -## [Next Steps](#next-steps) - -- Master [CLAUDE.md as an operating system](/blog/guide/mechanics/claude-md-mastery) for advanced orchestration patterns -- Learn [context management](/blog/guide/mechanics/context-management) to optimize token usage -- Explore [planning modes](/blog/guide/mechanics/planning-modes) for structured work -- Set up [git integration](/blog/guide/development/git-integration) for seamless memory checkpoints -- See how memory fits into [context engineering](/blog/guide/mechanics/context-engineering) for production AI systems - -**Remember**: CLAUDE.md isn't project documentation - it's your AI's operating system. Well-structured memory means Claude picks up exactly where you left off, every session. - -Last updated on - -[Previous - -Context Management](/blog/guide/mechanics/context-management)[Next - -Session Memory](/blog/guide/mechanics/session-memory) diff --git a/docs/site/src/content/blog/model-selection.md b/docs/site/src/content/blog/model-selection.md deleted file mode 100644 index 4557fce8..00000000 --- a/docs/site/src/content/blog/model-selection.md +++ /dev/null @@ -1,285 +0,0 @@ ---- -slug: "model-selection" -title: "Claude Code Models: Choose the Right AI for Every Task" -description: "Master tactical model selection in Claude Code. Learn when to use Sonnet vs Opus for optimal performance, cost efficiency, and speed." -date: "2025-08-23" -author: "Max Ritter" -tags: [Reference, Models] -readingTime: 8 -keywords: "ai, choose, claude, code, every, model, models, right, selection, task" ---- - -# Claude Code Models: Choose the Right AI for Every Task - -Master tactical model selection in Claude Code. Learn when to use Sonnet vs Opus for optimal performance, cost efficiency, and speed. - -**Problem**: Developers waste money using Opus for everything, or struggle with Haiku when they need more power. Tactical model switching can [optimize your usage costs](/blog/guide/development/usage-optimization) by 60-80%. - -**Quick Win**: Set Sonnet as your default model right now: - -```p-4 -claude --model sonnet -``` - -This saves 80% on costs while maintaining excellent performance for 90% of development tasks. - -## [Model Aliases](#model-aliases) - -Claude Code provides model aliases so you don't need to remember exact version numbers. These are the shortcuts you'll use daily: - -| Alias | Behavior | -| --- | --- | -| **`default`** | Recommended model for your account type. Max users get auto-fallback from Opus to Sonnet at limits | -| **`sonnet`** | Latest Sonnet model (currently Sonnet 4.5) for daily coding tasks | -| **`opus`** | Opus model (currently Opus 4.6) for complex reasoning | -| **`haiku`** | Fast and efficient Haiku model for simple tasks | -| **`sonnet[1m]`** | Sonnet with a 1 million token context window for long sessions (Console/API users) | -| **`opusplan`** | Uses Opus during plan mode, then switches to Sonnet for execution automatically | - -The `default` alias adapts to your account type. For certain Max users, Claude Code automatically falls back from Opus to Sonnet when you hit a usage threshold, keeping you productive without manual switching. - -The `sonnet[1m]` alias is available to Console and API users and unlocks a 1 million token context window. This is valuable for extended sessions where you'd otherwise hit [context compaction limits](/blog/guide/mechanics/context-buffer-management). Note that extended context models have different pricing. - -For Console/API users, the `[1m]` suffix can also be added to full model names: - -```p-4 -/model anthropic.claude-sonnet-4-5-20250929-v1:0[1m] -``` - -## [The Smart Model Strategy](#the-smart-model-strategy) - -Most developers make a costly mistake: using one model for everything. Claude Code offers multiple models, each optimized for different scenarios. Strategic switching can reduce your usage costs by 80% while improving performance. - -### [Sonnet: Your Daily Driver](#sonnet-your-daily-driver) - -**Best for**: 90% of development work - -```p-4 -# Start Claude Code with Sonnet (usually the default) -claude --model sonnet -``` - -Perfect for: - -- Feature implementation and bug fixes -- Code reviews and refactoring -- API integration and database work -- Writing tests and documentation - -**Why Sonnet wins**: 90% of Opus capability at 2x the speed, rarely hits usage limits, ideal for pair programming workflow. - -### [Opus: The Heavy Hitter](#opus-the-heavy-hitter) - -**When to upgrade**: Complex architectural decisions only - -```p-4 -# Start with Opus for deep analysis sessions -claude --model opus -``` - -Use Opus for: - -- Large-scale refactoring across multiple systems -- Complex debugging with intricate dependencies -- Architectural decisions requiring deep reasoning -- Advanced security reviews - -**Cost reality**: 5x more expensive than Sonnet, but justified for tasks requiring maximum reasoning power. - -### [Haiku: The Speed Demon](#haiku-the-speed-demon) - -**When to downgrade**: Simple, repetitive tasks - -```p-4 -# Fast and cheap for basic operations -claude --model haiku -``` - -Perfect for: - -- Simple file reads and formatting -- Basic syntax validation -- Quick status checks -- Text transformations - -**Warning**: Don't use Haiku for actual development. It struggles with complex logic and multi-file projects. - -### [Opusplan: The Best of Both Worlds](#opusplan-the-best-of-both-worlds) - -**When to use**: Complex tasks where you want Opus reasoning without Opus costs for everything - -```p-4 -# Hybrid mode: Opus plans, Sonnet executes -claude --model opusplan -``` - -How it works: - -- **In plan mode**: Uses Opus for complex reasoning and architecture decisions -- **In execution mode**: Automatically switches to Sonnet for code generation and implementation - -This gives you Opus-quality planning with Sonnet-speed execution. You get the deep architectural reasoning of Opus where it matters most (the planning phase), then the fast, cost-efficient execution of Sonnet for the actual code changes. - -`opusplan` is an excellent choice for refactoring sessions, feature planning, and any workflow where you use [planning mode](/blog/guide/mechanics/planning-modes) regularly. It is also a strong [cost optimization strategy](/blog/guide/development/usage-optimization) since you only pay Opus rates during the planning phase. - -## [Tactical Model Switching](#tactical-model-switching) - -### [During Development Sessions](#during-development-sessions) - -```p-4 -# Start your session with Sonnet -claude --model sonnet - -# Mid-session: switch to Opus for complex refactoring -/model opus - -# Back to Sonnet for regular work -/model sonnet - -# Drop to Haiku for simple tasks -/model haiku -``` - -### [Cost Optimization Pattern](#cost-optimization-pattern) - -1. **Default**: Sonnet for all standard development -2. **Hybrid**: Use `opusplan` for sessions that mix planning and implementation -3. **Escalate**: Switch to full Opus only when Sonnet struggles on execution tasks -4. **Delegate**: Use Haiku for simple file operations -5. **Monitor**: Track usage to optimize model selection - -This approach can reduce costs by 60-80% compared to using Opus for everything. - -## [Model Selection by Task Type](#model-selection-by-task-type) - -### [Code Analysis Speed Rankings](#code-analysis-speed-rankings) - -1. **Haiku**: Instant but shallow analysis -2. **Sonnet**: Fast with excellent depth -3. **Opus**: Slower but deepest analysis - -### [Reasoning Quality Rankings](#reasoning-quality-rankings) - -1. **Opus**: Superior for complex multi-step problems -2. **Sonnet**: Excellent for most development scenarios -3. **Haiku**: Basic reasoning only - -### [Cost Efficiency Rankings](#cost-efficiency-rankings) - -1. **Haiku**: Cheapest per task (limited capability) -2. **Sonnet**: Best performance per dollar -3. **Opus**: Premium pricing for premium capability - -## [Model Configuration](#model-configuration) - -**If you use Pilot Shell:** The easiest way to configure models is through the [Pilot Shell Console](http://localhost:41777/#/settings). You can set a different model for each `/spec` phase, slash command, and sub-agent, then restart Pilot to apply. Pilot injects your preferences into all the right places automatically — no manual file editing needed. - -For users without Pilot, or for temporary changes, Claude Code gives you multiple ways to set your model, with a clear priority chain. Higher-priority settings override lower ones: - -1. **During session** - `/model ` switches models mid-session (highest priority) -2. **At startup** - `claude --model ` sets the model for that session -3. **Environment variable** - `ANTHROPIC_MODEL=` persists across sessions -4. **Settings file** - The `model` field in [settings.json](/blog/guide/configuration-basics) for permanent configuration (lowest priority) - -For permanent model configuration, add the `model` field to your settings file: - -```p-4 -// ~/.claude/settings.json -{ - "permissions": {}, - "model": "sonnet" -} -``` - -This eliminates the need to pass `--model` every time you start Claude Code. - -### [Controlling Which Models Aliases Map To](#controlling-which-models-aliases-map-to) - -If you need to override which actual model an alias points to (for example, to pin a specific version or use a Bedrock/Vertex deployment), use these environment variables: - -| Environment Variable | Controls | -| --- | --- | -| `ANTHROPIC_DEFAULT_OPUS_MODEL` | Model used for `opus`, and for `opusplan` during plan mode | -| `ANTHROPIC_DEFAULT_SONNET_MODEL` | Model used for `sonnet`, and for `opusplan` during execution | -| `ANTHROPIC_DEFAULT_HAIKU_MODEL` | Model used for `haiku` and background functionality | -| `CLAUDE_CODE_SUBAGENT_MODEL` | Model used for sub-agents (overrides the default sub-agent model) | - -The deprecated `ANTHROPIC_SMALL_FAST_MODEL` variable has been replaced by `ANTHROPIC_DEFAULT_HAIKU_MODEL`. - -These are especially useful for Bedrock, Foundry, and Vertex users who need to specify inference profile ARNs, deployment names, or version names instead of standard Anthropic model IDs. - -### [Checking Your Current Model](#checking-your-current-model) - -You can see which model you're currently using in two ways: - -- Run `/status` to display your current model and account information -- Configure a StatusLine to show the model persistently in your terminal - -## [Prompt Caching Configuration](#prompt-caching-configuration) - -Claude Code automatically uses prompt caching to optimize performance and reduce costs. If you need to disable it (for debugging, benchmarking, or specific API configurations), use these environment variables: - -| Environment Variable | Effect | -| --- | --- | -| `DISABLE_PROMPT_CACHING` | Disables caching for all models (overrides per-model) | -| `DISABLE_PROMPT_CACHING_HAIKU` | Disables caching for Haiku models only | -| `DISABLE_PROMPT_CACHING_SONNET` | Disables caching for Sonnet models only | -| `DISABLE_PROMPT_CACHING_OPUS` | Disables caching for Opus models only | - -Set any of these to `1` to disable. The global `DISABLE_PROMPT_CACHING` takes precedence over per-model settings. Disabling prompt caching increases costs and latency, so only do this when you have a specific reason. - -## [Common Model Selection Mistakes](#common-model-selection-mistakes) - -**Mistake 1**: Using Opus for everything - -- **Problem**: 5x higher costs with slower responses -- **Solution**: Default to Sonnet, escalate selectively - -**Mistake 2**: Staying on Haiku too long - -- **Problem**: Poor code quality, missed issues -- **Solution**: Upgrade to Sonnet for any real development - -**Mistake 3**: Not switching models mid-session - -- **Problem**: Using wrong model for current task -- **Solution**: Use `/model opus` or `/model sonnet` to switch instantly - -## [Quick Reference](#quick-reference) - -| Task Type | Recommended Model | Why | -| --- | --- | --- | -| Daily coding | Sonnet | Best balance of speed and capability | -| Plan + implement | opusplan | Opus reasoning for plans, Sonnet for code | -| Complex architecture | Opus | Maximum reasoning depth | -| Simple file ops | Haiku | Fast and cheap | -| Long sessions | sonnet[1m] | 1M token window avoids compaction | -| Debugging | Start Sonnet, escalate to Opus if stuck | Progressive escalation | - -**For beginners**: Start with Sonnet to learn workflows. - -**For daily development**: Sonnet as default with Opus for complex debugging. - -**For budget optimization**: Strategic switching based on task complexity. - -**For learning**: Check our [configuration guide](/blog/guide/configuration-basics) to set up model defaults. - -Master model selection and you'll code faster while spending less. Most tasks need Sonnet's balanced power, not Opus's premium capabilities. - -**Next Action**: Set up your optimal model configuration with our [performance optimization guide](/blog/guide/performance/speed-optimization), then learn advanced [context management](/blog/guide/performance/context-preservation) techniques. - -For detailed specs on every Claude model Anthropic has released, see the [complete model timeline](/blog/models). - -**Related Guides**: - -- [Deep Thinking Techniques](/blog/guide/performance/deep-thinking-techniques) - When to use extended thinking with Opus -- [Efficiency Patterns](/blog/guide/performance/efficiency-patterns) - Build frameworks for consistent output -- [Usage Optimization](/blog/guide/development/usage-optimization) - Track and reduce your costs - -Last updated on - -[Previous - -Claude Models](/blog/models)[Next - -Claude Opus 4.5 Guide](/blog/models/claude-opus-4-5-guide) diff --git a/docs/site/src/content/blog/native-installer.md b/docs/site/src/content/blog/native-installer.md deleted file mode 100644 index a67c60f5..00000000 --- a/docs/site/src/content/blog/native-installer.md +++ /dev/null @@ -1,156 +0,0 @@ ---- -slug: "native-installer" -title: "Claude Code Native Installer: Skip Node.js Entirely" -description: "One command to install Claude Code on Windows, Mac, or Linux. No Node.js, no npm, no PATH configuration. Automatic updates included." -date: "2026-01-17" -author: "Max Ritter" -tags: [Guide] -readingTime: 3 -keywords: "claude, code, entirely, installer, native, nodejs, skip" ---- - -# Claude Code Native Installer: Skip Node.js Entirely - -One command to install Claude Code on Windows, Mac, or Linux. No Node.js, no npm, no PATH configuration. Automatic updates included. - -**Problem**: Installing Claude Code through npm required Node.js 18+, caused PATH issues, and broke on certain platforms. The native installer fixes all of this with a single command that works everywhere. - -## [Quick Start: One Command Install](#quick-start-one-command-install) - -**Windows PowerShell:** - -```p-4 -irm https://claude.ai/install.ps1 | iex -``` - -**macOS / Linux / WSL:** - -```p-4 -curl -fsSL https://claude.ai/install.sh | bash -``` - -**Homebrew (macOS/Linux):** - -```p-4 -brew install --cask claude-code -``` - -That's it. No Node.js. No npm. No PATH configuration. Run `claude --version` to verify. - -## [Why the Native Installer Is Better](#why-the-native-installer-is-better) - -Anthropic released the native installer as the **recommended installation method** for all Claude Code users. Here's why: - -| Feature | Native Installer | npm Install | -| --- | --- | --- | -| Requires Node.js | No | Yes (v18+) | -| Auto-updates | Yes (background) | No (manual) | -| PATH setup | Automatic | Often broken | -| Platform support | Windows, macOS, Linux, WSL | Varies | -| Stability | Production-tested | Platform-dependent | - -The native installer handles everything automatically: downloads the right binary for your system, sets up PATH, and keeps Claude Code updated in the background. - -## [Windows: `irm https://claude.ai/install.ps1 | iex`](#windows-irm-httpsclaudeaiinstallps1--iex) - -The PowerShell command `irm https://claude.ai/install.ps1 | iex` does three things: - -1. **irm** (Invoke-RestMethod) downloads the install script from Anthropic -2. **|** pipes the script content to the next command -3. **iex** (Invoke-Expression) executes the downloaded script - -**Run as Administrator** for cleanest install: - -```p-4 -# Open PowerShell as Administrator, then: -irm https://claude.ai/install.ps1 | iex - -# Verify installation -claude --version -``` - -**Alternative for CMD users:** - -```p-4 -curl -fsSL https://claude.ai/install.cmd -o install.cmd && install.cmd && del install.cmd -``` - -**WinGet option:** - -```p-4 -winget install Anthropic.ClaudeCode -``` - -Note: WinGet doesn't auto-update. The native installer is preferred. - -## [macOS and Linux: `curl https://claude.ai/install.sh | bash`](#macos-and-linux-curl-httpsclaudeaiinstallsh--bash) - -The bash installer works identically across macOS, Linux, and WSL: - -```p-4 -curl -fsSL https://claude.ai/install.sh | bash -``` - -The `-fsSL` flags mean: - -- **f**: Fail silently on HTTP errors -- **s**: Silent mode (no progress bar) -- **S**: Show errors if they occur -- **L**: Follow redirects - -**Verify and start:** - -```p-4 -claude --version -cd your-project -claude -``` - -## [Troubleshooting](#troubleshooting) - -### ["irm is not recognized" (Windows)](#irm-is-not-recognized-windows) - -You're in CMD, not PowerShell. Open PowerShell and run the command there. - -### ["Execution policy" error (Windows)](#execution-policy-error-windows) - -PowerShell may block scripts by default: - -```p-4 -Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser -irm https://claude.ai/install.ps1 | iex -``` - -### ["command not found" after install](#command-not-found-after-install) - -Close and reopen your terminal to reload PATH, then try `claude --version` again. - -### [Already have npm version installed?](#already-have-npm-version-installed) - -Uninstall the npm version first: - -```p-4 -npm uninstall -g @anthropic-ai/claude-code -``` - -Then run the native installer. - -## [What Happens After Install](#what-happens-after-install) - -Once Claude Code is installed: - -1. Run `claude` in any project directory -2. Complete one-time authentication with your [Anthropic account](https://console.anthropic.com) -3. Start coding with AI - -**New to Claude Code?** Follow the [first project tutorial](/blog/guide/first-project) to see it in action. Need more installation options? See the [complete installation guide](/blog/guide/installation-guide). - -The native installer was announced in October 2025 as Anthropic's recommended method. It's simpler, more stable, and keeps you updated automatically. No Node.js required. - -Last updated on - -[Previous - -Installation Guide](/blog/guide/installation-guide)[Next - -First Project](/blog/guide/first-project) diff --git a/docs/site/src/content/blog/online-learning-teaching-claude.md b/docs/site/src/content/blog/online-learning-teaching-claude.md deleted file mode 100644 index b19d1bb5..00000000 --- a/docs/site/src/content/blog/online-learning-teaching-claude.md +++ /dev/null @@ -1,76 +0,0 @@ ---- -slug: "online-learning-teaching-claude" -title: "Online Learning: Teaching Claude Your Patterns" -description: "Automatically capture debugging solutions, workarounds, and workflows as reusable skills. Claude gets smarter with every session." -date: "2026-01-24" -author: "Max Ritter" -tags: [Feature, Learning] -readingTime: 4 -keywords: "Claude Code learning, AI skills, online learning, Claude Code patterns, team knowledge, AI workflows" ---- - -# Online Learning: Teaching Claude Your Patterns - -Every team has unique patterns — internal APIs, deployment processes, coding conventions that aren't in any documentation. Claude doesn't know these. Online learning captures them automatically so Claude gets smarter with every session. - -## The Problem - -You explain the same things repeatedly: - -- "Our API uses snake_case, not camelCase" -- "Always use the `ServiceBase` class for new services" -- "Deploy commands must include the `--region` flag" - -Rules help, but they're static. You have to anticipate what Claude needs to know. Online learning captures knowledge dynamically — from the work itself. - -## How It Works - -When a session involves non-obvious problem-solving, Pilot's `/learn` command extracts the knowledge into a reusable skill: - -1. **Detection** — Pilot recognizes when a session produced reusable knowledge (workarounds, debugging solutions, multi-step workflows) -2. **Extraction** — The knowledge is captured with context: what the problem was, what the solution was, and when to apply it -3. **Storage** — Skills are saved as structured files that Claude loads in future sessions -4. **Application** — When a similar situation arises, Claude already knows the solution - -## What Gets Captured - -| Trigger | Example | -|---------|---------| -| Non-obvious debugging | "The 403 error was actually a CORS issue with the CDN, not an auth problem" | -| Workarounds | "The library's `parse()` function silently drops null values — use `safeParse()` instead" | -| Multi-step workflows | "Deploying to staging requires: build → test → push → wait for CI → promote" | -| Tool integrations | "To query the internal API, use header X-Service-Token, not Authorization" | - -## Skills vs Rules - -| Aspect | Rules | Skills | -|--------|-------|--------| -| Created by | You, manually | Automatically from sessions | -| Content | Instructions and constraints | Procedures and knowledge | -| Scope | Always active | Activated when relevant | -| Updates | Manual edits | New versions from new learnings | - -Rules tell Claude what to do. Skills teach Claude how to do things it's learned from experience. - -## Team Sharing - -Skills can be shared across your team using Pilot's vault system. When one developer discovers a workaround, the whole team benefits: - -```bash -# Share a learned skill with the team -sx add .claude/skills/deploy-staging --type skill --name "deploy-staging" - -# Team members install shared skills -sx install --repair -``` - -## The Flywheel - -The more you use Claude with Pilot, the more knowledge it accumulates: - -1. Session produces non-obvious solution -2. `/learn` captures it as a skill -3. Future sessions apply the skill automatically -4. New sessions build on previous knowledge - -After a few weeks, Claude knows your project's quirks, your team's conventions, and your infrastructure's gotchas — without anyone maintaining a documentation wiki. diff --git a/docs/site/src/content/blog/openclaw-vs-claude-code.md b/docs/site/src/content/blog/openclaw-vs-claude-code.md deleted file mode 100644 index 2c4f1264..00000000 --- a/docs/site/src/content/blog/openclaw-vs-claude-code.md +++ /dev/null @@ -1,172 +0,0 @@ ---- -slug: "openclaw-vs-claude-code" -title: "OpenClaw vs Claude Code: Complete Comparison Guide (2026)" -description: "OpenClaw is a viral AI life assistant with 199K GitHub stars. Claude Code is a purpose-built coding agent. Here's how they compare and which you need in 2026." -date: "2026-02-18" -author: "Max Ritter" -tags: [Guide, Tools] -readingTime: 16 -keywords: "openclaw, claude, code, comparison, ai, agent, coding, assistant, vs, 2026" ---- - -Tools - -# OpenClaw vs Claude Code: Complete Comparison Guide (2026) - -OpenClaw is a viral AI life assistant with 199K GitHub stars. Claude Code is a purpose-built coding agent. Here's how they compare and which you need in 2026. - -OpenClaw just hit 199K GitHub stars. Its creator joined OpenAI. Your Twitter feed won't stop talking about it. And now you're wondering: should I be using this instead of Claude Code? - -Short answer: probably not, if you're a developer. - -These two tools get lumped together because they both involve AI agents. But that's where the similarity ends. OpenClaw is a general-purpose life assistant that connects your messaging apps to AI models. Claude Code is a purpose-built coding agent that lives in your terminal and understands your entire codebase. Comparing them is like comparing a Swiss Army knife to a surgical scalpel. Both are sharp. Only one belongs in an operating room. - -## What Is OpenClaw? - -OpenClaw is a **free, open-source, autonomous AI agent** designed to be your personal AI assistant across every communication platform you use. It connects WhatsApp, Telegram, Slack, Discord, Signal, iMessage, and Microsoft Teams to large language models, then gives the AI permission to interact with your files, calendar, email, browser, and smart home devices. - -### The Backstory - -Peter Steinberger, an Austrian software engineer and founder of PSPDFKit, built OpenClaw as a weekend project in November 2025. It was originally called "Clawdbot" (a nod to Claude), but Anthropic filed a trademark complaint. The project was renamed to "Moltbot," then to "OpenClaw" as it sought its own identity. - -The viral moment came in late January 2026. OpenClaw gained 60,000 GitHub stars in just 72 hours. Andrej Karpathy called it "the most incredible sci-fi takeoff-adjacent thing." As of this writing, it sits at 199K stars and 35K forks with over 11,440 commits. - -Then the plot twist: Steinberger announced he was joining OpenAI on February 14, 2026. OpenClaw will transfer to an open-source foundation with financial backing from OpenAI. - -### What It Actually Does - -OpenClaw's core offering is a **skills system**. The ClawHub registry hosts 5,700+ community-built skills that extend what the agent can do. Skills range from controlling Spotify playback to managing your grocery list to running shell commands. - -It supports multiple AI models (Claude, GPT-4o, DeepSeek, Gemini, and local models via Ollama), runs entirely on your hardware, and gives you full data sovereignty. There's also Moltbook, a companion AI social network with 1.5 million AI agents. - -## What Is Claude Code? - -Claude Code is **Anthropic's official terminal-based coding agent**. It does one thing and does it exceptionally well: help you write, understand, and maintain software. - -You [install Claude Code](/blog/guide/installation-guide) in about 30 seconds, point it at a project, and it maps your entire codebase. It understands file relationships, project architecture, and dependency chains. When you ask it to build a feature or fix a bug, it reads the relevant files, plans its approach, and makes changes across multiple files simultaneously. - -The key difference from OpenClaw? **Deep codebase context.** Claude Code doesn't just run code. It understands code. It provides diff views of changes, integrates directly with VS Code, JetBrains, and Xcode, and operates within a [200K-token context window](/blog/guide/mechanics/context-management) that keeps entire projects in memory. - -For the full breakdown, our [complete guide to Claude Code](/blog/guide/what-is-claude-code) covers everything. - -## Head-to-Head Comparison - -| Dimension | Claude Code | OpenClaw | -| --- | --- | --- | -| **Purpose** | Terminal-based coding agent | General-purpose life assistant | -| **Interface** | Terminal, VS Code, JetBrains, Xcode | WhatsApp, Telegram, Slack, Discord, Signal | -| **AI Model** | Claude (Anthropic) | Claude, GPT-4o, DeepSeek, Gemini, Ollama | -| **Security** | Sandboxed execution, Anthropic-managed | Self-hosted, user-managed, broad permissions | -| **Hosting** | Anthropic infrastructure + local CLI | Entirely self-hosted on your hardware | -| **Data Control** | Anthropic processes queries | Full user sovereignty | -| **Setup Time** | ~30 seconds | 30-60 minutes | -| **Coding Ability** | Superior: IDE integration, diff views, deep context | Basic: can run code, but no IDE integration | -| **Cost** | Claude Pro $20/mo or Max $100-200/mo | Free + API costs ($5-30/month typical) | - -### Pricing Breakdown - -| Component | Claude Code | OpenClaw | -| --- | --- | --- | -| **Software** | Free (CLI tool) | Free (MIT License) | -| **Light Usage** | Claude Pro $20/month | API costs ~$5-15/month | -| **Heavy Usage** | Claude Max $100-200/month | API costs $50-150/month | -| **Managed Option** | Included with subscription | OpenClaw Cloud from $39/month | - -Claude Code's pricing is straightforward: pick a plan, start coding. OpenClaw's costs depend entirely on which AI models you use and how often. - -## Where OpenClaw Wins - -**Life automation across platforms.** Want an AI that reads your WhatsApp messages, checks your calendar, drafts email replies, and controls your smart lights? OpenClaw handles all of that from a single interface. It acts as a bridge between 12+ messaging platforms and whatever LLM you prefer. - -**Model flexibility.** You're not locked into a single AI provider. OpenClaw works with Claude, GPT-4o, DeepSeek, Gemini, and even local models through Ollama. If a new model drops tomorrow, OpenClaw can use it. - -**Full data sovereignty.** Everything runs on your machine. Your conversations, data, and AI interactions never leave your hardware unless you choose a cloud deployment. - -**Free and open source.** OpenClaw itself costs nothing. The MIT license means you can inspect, modify, and distribute the code. You only pay for API calls to the LLM providers you choose. - -**Community extensibility.** With 5,700+ skills in ClawHub and the ability to write custom skills, OpenClaw's functionality keeps expanding through community contributions. - -## Where Claude Code Wins - -**Deep codebase understanding.** Claude Code doesn't just read individual files. It maps your entire project architecture, understands file relationships, and maintains context across refactoring sessions spanning dozens of files. When you ask it to add a feature, it knows where every relevant piece of code lives. This is the core advantage no general-purpose agent can match. - -**IDE integration that works.** Claude Code plugs directly into VS Code, JetBrains IDEs, and Xcode. You get diff views, inline suggestions, and multi-file editing without leaving your development environment. - -**Production-grade security.** Claude Code runs in a sandboxed environment with granular permission controls managed by Anthropic. It can't access your email, control your smart home, or browse the web unless you explicitly grant those capabilities through MCP integrations. - -**Setup in 30 seconds.** Install and start: - -```p-4 -npm install -g @anthropic-ai/claude-code && claude -``` - -OpenClaw requires Node.js 22+, messaging platform API configurations, LLM API keys, and 30-60 minutes of setup time. - -**Structured agent workflows.** Claude Code supports sophisticated [agent-based development patterns](/blog/guide/agents/what-are-agents) including sub-agents, task distribution, and multi-session project management. - -**Stability and reliability.** Claude Code is backed by Anthropic's infrastructure, with dedicated security teams, consistent uptime, and regular updates. - -## The Security Question - -This section matters. A lot. - -In early 2026, security researchers discovered **CVE-2026-25253**, a critical remote code execution vulnerability in OpenClaw with a CVSS score of 8.8 out of 10. The vulnerability exploited a WebSocket origin header bypass, allowing attackers to execute arbitrary code on any exposed OpenClaw instance. - -The numbers are sobering. Researchers found **135,000+ exposed OpenClaw instances** on the public internet, with over **50,000 directly vulnerable** to this RCE exploit. - -It gets worse. A security audit of ClawHub (OpenClaw's community skills registry) found that **341 of approximately 2,857 skills (roughly 12%) were malicious**. These skills contained data exfiltration code, prompt injection payloads, and other threats. The total audit uncovered 512 vulnerabilities, 8 of which were rated critical. - -Palo Alto Networks described OpenClaw as "the potential biggest insider threat of 2026." AI researcher Gary Marcus called it "a disaster waiting to happen." And OpenClaw currently has no bug bounty program and no dedicated security team. - -The naming changes also spawned a crypto scam. Opportunistic traders launched a $CLAWD token that reached a $16 million market cap before crashing. - -Steinberger himself admitted to "vibe coding" the project, telling interviewers "I ship code I don't read." For a tool with broad system permissions (file access, shell commands, browser control, email), this approach carries real risk. - -**Claude Code's security model is fundamentally different.** It operates in a sandboxed environment where permissions are explicit and granular. Anthropic maintains dedicated security infrastructure, conducts regular audits, and manages the trust boundary between the AI agent and your system. You can [configure permission controls](/blog/guide/development/permission-management) to match your security requirements precisely. - -OpenClaw's security will likely improve, especially with OpenAI's financial backing. But right now, the gap is significant enough to factor into any serious decision. - -## Which Should You Use? - -**Use Claude Code when you need to:** - -- Build, debug, or refactor software -- Work across large codebases with deep context -- Integrate AI assistance into your IDE workflow -- Ship production code with confidence -- Set up a development environment in under a minute -- Use [advanced coding skills and workflows](/blog/guide/development/claude-code-skills) purpose-built for development - -**Use OpenClaw when you want to:** - -- Automate life tasks across messaging platforms -- Control smart home devices through natural language -- Keep all your data on your own hardware -- Use multiple AI models from a single interface -- Build custom skills for personal automation - -**Use both when:** - -- You're a developer who also wants AI-powered life automation -- You want Claude Code for coding and OpenClaw for everything else -- You're experimenting with different AI agent architectures - -Many developers run both. Claude Code handles the coding. OpenClaw handles the rest. They don't compete because they don't overlap. - -## The Bottom Line - -OpenClaw and Claude Code aren't competitors. They're different species of AI tool that happen to exist at the same time. - -For **software development**, Claude Code wins without contest. It was built for this. It has deep codebase understanding, IDE integration, sandboxed security, 30-second setup, and the backing of Anthropic's research team. - -For **life automation**, OpenClaw offers something genuinely novel. The vision of an AI that manages your communications, calendar, and daily tasks across every platform is compelling. But the security concerns are real, the setup is complex, and the "vibe coded" foundation raises questions about long-term reliability. - -If you're reading this blog, you're probably a developer. Start with Claude Code. You can always add OpenClaw later for the non-coding parts of your life, once the security story improves. - -## Related - -- New to Claude Code? Start with the [installation guide](/blog/guide/installation-guide) (30 seconds to your first session) -- Want to see how Claude Code compares to IDE tools? Read our [Claude Code vs Cursor comparison](/blog/tools/extensions/claude-code-vs-cursor) -- Ready for advanced workflows? Explore [agent-based development patterns](/blog/guide/agents/what-are-agents) -- Curious about Claude Code's context advantage? Learn about [context window management](/blog/guide/mechanics/context-management) -- Want to level up with structured skills? Check out our [Claude Code skills guide](/blog/guide/development/claude-code-skills) diff --git a/docs/site/src/content/blog/output-formatting.md b/docs/site/src/content/blog/output-formatting.md deleted file mode 100644 index 1b2c8bea..00000000 --- a/docs/site/src/content/blog/output-formatting.md +++ /dev/null @@ -1,158 +0,0 @@ ---- -slug: "output-formatting" -title: "Claude Code Diff Review: 4 Essential Shortcuts" -description: "Press d for diffs, e to edit, y to accept, n to reject. Master the 4 keyboard shortcuts that control every Claude Code file change you make." -date: "2025-08-23" -author: "Max Ritter" -tags: [Guide, Workflow] -readingTime: 4 -keywords: "4, claude, code, diff, essential, formatting, output, review, shortcuts" ---- - -Mechanics - -# Claude Code Diff Review: 4 Keys That Control Every Edit - -Press d for diffs, e to edit, y to accept, n to reject. Master the 4 keyboard shortcuts that control every Claude Code file change you make. - -**Problem**: You asked Claude Code to make changes but you are not sure what it actually modified, how to review it, or how to get output in the format you need. - -**Quick Win**: Press `d` when Claude proposes a change to see the full diff before accepting: - -```p-4 -# Claude shows a proposed edit -# Press these keys to control what happens: -y - accept the change -n - reject and continue -d - show full diff -e - edit the change before accepting -``` - -**Understanding**: Claude Code writes files directly using built-in tools. You control every modification through an approval workflow that shows exactly what changes before they happen. - -## [How Claude Code Handles File Output](#how-claude-code-handles-file-output) - -Claude Code does not generate code for you to copy. It writes directly to your filesystem using two core tools: - -**Write**: Creates new files or completely replaces existing ones -**Edit**: Makes surgical changes to specific parts of existing files - -When Claude proposes a change, you see a preview of what will happen: - -```p-4 -Claude wants to edit src/utils/auth.ts: - -- const TOKEN_EXPIRY = 3600; -+ const TOKEN_EXPIRY = 7200; -``` - -This diff format shows exactly what lines change. Red lines with `-` get removed. Green lines with `+` get added. - -## [The Accept/Reject Workflow](#the-acceptreject-workflow) - -Every file modification requires your approval. This is the core safety mechanism: - -```p-4 -# Claude proposes creating a new file -Claude wants to write to src/components/Button.tsx - -# Your options: -y Accept this change -n Reject and tell Claude why -d View full diff (for edits) -e Edit before accepting -Esc Abort current operation -``` - -For trusted operations, enable [auto-accept mode](/blog/guide/development/permission-management) with `Shift+Tab`. Claude then proceeds without prompting for each file. - -## [Multi-File Operations](#multi-file-operations) - -Claude handles multiple files sequentially, maintaining context between them. Ask for a complete feature and watch it create each file: - -```p-4 -claude "create a user authentication system with login, register, and password reset" - -# Claude will: -# 1. Create src/auth/login.ts -# 2. Create src/auth/register.ts -# 3. Create src/auth/password-reset.ts -# 4. Update src/routes/index.ts to include new routes -# Each file prompts for approval (unless auto-accept is on) -``` - -The key advantage: Claude remembers what it created in file 1 when writing file 2. Import paths, type references, and function signatures stay consistent across all files. - -## [Requesting Specific Output Formats](#requesting-specific-output-formats) - -Claude responds in markdown by default. Control the format through your prompts: - -```p-4 -# Get structured data -claude "list all API endpoints in this project as a markdown table" - -# Get code blocks with syntax highlighting -claude "show me the database schema as SQL" - -# Get step-by-step output -claude "explain the authentication flow as a numbered list" -``` - -For code output you want to review but not save yet, use [plan mode](/blog/guide/mechanics/planning-modes). Claude analyzes and suggests without writing files. - -## [Working with Large Outputs](#working-with-large-outputs) - -When Claude generates substantial output, it streams to your terminal. For large codebases or complex operations: - -```p-4 -# Redirect output to a file for later review -claude "analyze all TODO comments in this project" > todos.md - -# Pipe to other tools -claude "list dependencies that need updates" | grep "security" -``` - -## [Common Output Situations](#common-output-situations) - -**Claude created the wrong file**: Press `n` to reject, then explain what you actually needed. Claude learns from your feedback in the same session. - -**Diff is too long to review**: Press `d` to see the full diff, or ask Claude to break the change into smaller pieces: "make this change in smaller steps." - -**Want code without file creation**: Start your prompt with "show me" or "explain" instead of "create" or "add." Claude outputs code blocks without triggering the write workflow. - -**Need to undo a change**: Press `Esc` twice to access checkpoints. Claude automatically snapshots before changes so you can rewind. - -## [Success Verification](#success-verification) - -After accepting changes, verify the output works: - -```p-4 -# Check the file exists and looks right -cat src/components/Button.tsx - -# Run your build to catch issues -npm run build - -# Test the changes -npm test -``` - -## [Next Steps](#next-steps) - -Master the full Claude Code workflow: - -- Configure [permission management](/blog/guide/development/permission-management) for smoother accept/reject flow -- Learn [planning modes](/blog/guide/mechanics/planning-modes) to preview changes before committing -- Set up [feedback loops](/blog/guide/development/feedback-loops) for faster iteration -- Explore [context management](/blog/guide/mechanics/context-management) when outputs get complex -- Check [troubleshooting](/blog/guide/troubleshooting) if outputs fail - -The key insight: Claude Code is not generating text for you to paste. It is an agent that writes code with your approval. Understanding this workflow transforms how you interact with it. - -Last updated on - -[Previous - -Session Memory](/blog/guide/mechanics/session-memory)[Next - -Ralph Wiggum Technique](/blog/guide/mechanics/ralph-wiggum-technique) diff --git a/docs/site/src/content/blog/permission-hook-guide.md b/docs/site/src/content/blog/permission-hook-guide.md deleted file mode 100644 index 677ab1a8..00000000 --- a/docs/site/src/content/blog/permission-hook-guide.md +++ /dev/null @@ -1,175 +0,0 @@ ---- -slug: "permission-hook-guide" -title: "Claude Code Permission Hook: Skip Prompts Safely" -description: "Run Claude Code without constant permission prompts or dangerous skip flags. Delegate approvals to an AI reviewer that understands context." -date: "2025-12-07" -author: "Max Ritter" -tags: [Guide, Hooks] -readingTime: 4 -keywords: "claude, code, guide, hook, permission, prompts, safely, skip" ---- - -Hooks - -# Claude Code Permission Hook: Uninterrupted Coding Without the Risk - -Run Claude Code without constant permission prompts or dangerous skip flags. Delegate approvals to an AI reviewer that understands context. - -**Problem**: Every time Claude wants to read a file or run a command, you're clicking "approve." Twenty clicks later, you've lost your flow state and forgotten what you were building. - -**Quick Win**: Install the Permission Hook and never click approve again: - -```p-4 -npm install -g @abdo-el-mobayad/claude-code-fast-permission-hook -cf-approve install -cf-approve config -``` - -Three commands. Now Claude runs uninterrupted while dangerous operations get blocked automatically. No `--dangerously-skip-permissions` required. - -## [The Permission Dilemma](#the-permission-dilemma) - -You have two bad options with vanilla Claude Code: - -**Option 1: Click approve constantly.** Safe, but flow-destroying. Complex features mean 50+ permission prompts. You lose context. You lose momentum. You lose the magic of AI-assisted coding. - -**Option 2: Use `--dangerously-skip-permissions`.** Fast, but terrifying. One hallucinated `rm -rf /` and your system is gone. Fine for throwaway projects. Unacceptable for real work. - -The Permission Hook gives you a third option: **intelligent delegation**. Claude runs without interruption. Dangerous commands get blocked automatically. Edge cases go to a fast LLM for context-aware decisions. - -## [How It Works: Three-Tier Decision System](#how-it-works-three-tier-decision-system) - -When Claude requests permission, the hook evaluates it instantly: - -**Tier 1 - Fast Approve (No AI Needed)** - -Safe operations pass through immediately: - -- Read, Glob, Grep, WebFetch, WebSearch -- Write, Edit, MultiEdit, NotebookEdit -- TodoWrite, Task, all MCP tools - -No latency. No cost. Claude keeps working. - -**Tier 2 - Fast Deny (No AI Needed)** - -Dangerous operations get blocked instantly: - -```p-4 -# These never execute, period -rm -rf / # System destruction -git push --force origin main # Protected branch overwrite -mkfs /dev/sda # Disk formatting -:(){ :|:& };: # Fork bomb -``` - -No AI evaluation needed. Hard-coded rules protect you from catastrophic mistakes. - -**Tier 3 - LLM Analysis (Cached)** - -Ambiguous operations get sent to a fast, cheap LLM (GPT-4o-mini via OpenRouter) for context-aware evaluation: - -```p-4 -{ - "tool": "Bash", - "command": "docker system prune -af", - "working_directory": "/home/user/project", - "recent_context": "User asked to clean up Docker resources" -} -``` - -The LLM sees what you're trying to accomplish and makes an intelligent decision. Decisions are cached - repeat the same command and it's instant. - -## [Configuration](#configuration) - -The hook stores settings at `~/.claude-code-fast-permission-hook/config.json`: - -```p-4 -{ - "llm": { - "provider": "openai", - "model": "openai/gpt-4o-mini", - "apiKey": "sk-or-v1-your-key", - "baseUrl": "https://openrouter.ai/api/v1" - }, - "cache": { - "enabled": true, - "ttlHours": 168 - } -} -``` - -OpenRouter is recommended for best latency. Get your key at [openrouter.ai](https://openrouter.ai). Cost: roughly **$1 per 5,000+ LLM decisions**. In practice, most operations hit Tier 1 or 2, so a dollar lasts months. - -## [Installation Levels](#installation-levels) - -**Device Level** (recommended): Configure once in `~/.claude/settings.json`, applies everywhere. Set it and forget it. - -**Project Level**: Configure in `.claude/settings.local.json` for project-specific rules. - -The installer adds this to your settings: - -```p-4 -{ - "hooks": { - "PermissionRequest": [ - { - "matcher": "*", - "hooks": [ - { - "type": "command", - "command": "cf-approve permission" - } - ] - } - ] - } -} -``` - -## [When Things Go Wrong](#when-things-go-wrong) - -**Error: "Permission denied" on all operations** - -Fix: Your API key is missing or invalid: - -```p-4 -cf-approve config -``` - -Re-enter your OpenRouter key. - -**Error: "Hook not triggering"** - -Fix: Verify installation: - -```p-4 -cf-approve doctor -cf-approve status -``` - -**Behavior seems inconsistent** - -Fix: Clear the decision cache: - -```p-4 -cf-approve clear-cache -``` - -## [You Can Now Code Without Interruption](#you-can-now-code-without-interruption) - -- You just installed context-aware permission automation -- Set up the main [Hooks Guide](/blog/tools/hooks/hooks-guide) for complete hook coverage -- Configure the [Stop Hook](/blog/tools/hooks/stop-hook-task-enforcement) to ensure task completion -- Try [Context Recovery](/blog/tools/hooks/context-recovery-hook) to survive compaction -- Go deeper: Explore [skills](/blog/guide/mechanics/claude-skills-guide) for specialized agent workflows - -No more permission fatigue. No more dangerous flags. Just Claude doing what Claude does best - building your software while you focus on the big picture. - -Last updated on - -[Previous - -Skill Activation Hook](/blog/tools/hooks/skill-activation-hook)[Next - -MCP Basics](/blog/tools/mcp-extensions/mcp-basics) diff --git a/docs/site/src/content/blog/permission-management.md b/docs/site/src/content/blog/permission-management.md deleted file mode 100644 index 60b2a909..00000000 --- a/docs/site/src/content/blog/permission-management.md +++ /dev/null @@ -1,334 +0,0 @@ ---- -slug: "permission-management" -title: "Claude Code Permissions: Safe vs Fast Development Modes" -description: "Configure Claude Code permissions for your workflow. Learn when to use auto-accept mode and when to maintain strict controls for safety." -date: "2025-08-23" -author: "Max Ritter" -tags: [Guide, Development] -readingTime: 9 -keywords: "claude, code, development, fast, management, modes, permission, permissions, safe, vs" ---- - -Development - -# Claude Code Permissions: Safe vs Fast Development Modes - -Configure Claude Code permissions for your workflow. Learn when to use auto-accept mode and when to maintain strict controls for safety. - -**Problem**: Claude Code asking for permission on every file edit and command kills your flow and burns time. - -**Quick Win**: Press `Shift+Tab` to cycle through permission modes instantly: - -```p-4 -# Press Shift+Tab to cycle: -normal → auto-accept edits → plan mode → normal -``` - -You can also [customize this keybinding](/blog/tools/keybindings-guide) if `Shift+Tab` conflicts with your terminal. Now you control your workflow without touching config files. Match your mode to your task and stop the interruption cycle. - -## [All Permission Modes](#all-permission-modes) - -Claude Code supports five permission modes, each optimized for different development scenarios. The three core modes cycle via `Shift+Tab`, while two additional modes are available through configuration. - -### [Normal Mode (`default`)](#normal-mode-default) - -Normal mode prompts for every potentially dangerous operation. You'll see confirmation dialogs for: - -- File edits and modifications -- Terminal command execution -- System operations -- Directory changes - -This mode prioritizes security over speed, making it perfect for: - -- Working on production code -- Unfamiliar codebases -- Learning new techniques -- High-risk operations - -### [Auto-Accept Mode (`acceptEdits`)](#auto-accept-mode-acceptedits) - -Auto-accept mode eliminates permission prompts for file edits, enabling uninterrupted execution for the session. Claude proceeds immediately with approved operations. - -Activate by pressing `Shift+Tab` until you see "auto-accept edit on" in the interface. - -Best for: - -- Large refactoring sessions -- Following well-defined implementation plans -- Research and documentation tasks -- Repetitive operations across multiple files - -### [Plan Mode (`plan`)](#plan-mode-plan) - -Plan mode restricts Claude to read-only operations, preventing any modifications while allowing comprehensive analysis. - -Perfect for: - -- Initial codebase exploration -- Architecture analysis -- Planning complex features -- Code review sessions - -### [Don't Ask Mode (`dontAsk`)](#dont-ask-mode-dontask) - -Don't Ask mode auto-denies all tool usage **unless** the tool is explicitly pre-approved via `/permissions` or your `permissions.allow` rules. Claude will not prompt you for confirmation. If a tool is not in the allow list, it gets silently denied. - -Best for: - -- CI/CD pipelines where no human is present to approve -- Locked-down environments with a known set of allowed operations -- Running Claude with a strict, pre-configured permission policy - -### [Bypass Permissions Mode (`bypassPermissions`)](#bypass-permissions-mode-bypasspermissions) - -Bypass mode skips **all** permission checks. Claude executes any tool without prompting. - -```p-4 -# CLI flag equivalent: -claude --dangerously-skip-permissions -``` - -**Only use this in fully isolated environments** like containers, VMs, or ephemeral CI runners where Claude cannot cause lasting damage. This mode exists for automation scenarios where the environment itself provides the safety boundary. - -> **Warning**: Administrators can disable this mode entirely by setting `disableBypassPermissionsMode` to `"disable"` in managed settings. If your organization blocks this mode, neither the setting nor the CLI flag will work. - -### [Setting a Persistent Default Mode](#setting-a-persistent-default-mode) - -Instead of cycling modes each session, set your preferred default in `settings.json`: - -```p-4 -{ - "defaultMode": "acceptEdits" -} -``` - -Valid values: `default`, `acceptEdits`, `plan`, `dontAsk`, `bypassPermissions`. This saves your preference across sessions so you start in the right mode every time. - -## [Managing Permissions with /permissions](#managing-permissions-with-permissions) - -Instead of manually editing JSON files, use the built-in `/permissions` command: - -```p-4 -# Launch the interactive permissions UI -/permissions -``` - -This interface lets you: - -- View currently allowed and denied tools -- Grant permission to specific tools or patterns -- Block access to tools you want to restrict -- See which settings file each rule comes from -- Make changes without restarting Claude Code - -## [Permission Rule Syntax](#permission-rule-syntax) - -Permission rules follow the format `Tool` or `Tool(specifier)`. Rules live in the `permissions` object of your `settings.json`: - -```p-4 -{ - "permissions": { - "allow": ["Bash(npm run *)"], - "deny": ["Bash(rm *)"], - "ask": ["Bash(git push *)"] - } -} -``` - -Three rule types control behavior: - -- **Allow** rules let Claude use the tool without prompting -- **Ask** rules prompt for confirmation each time -- **Deny** rules block the tool entirely - -Rules evaluate in order: **deny first, then ask, then allow**. The first matching rule wins, so deny rules always take precedence. - -### [Matching All Uses of a Tool](#matching-all-uses-of-a-tool) - -Use just the tool name to match all invocations: - -| Rule | Effect | -| --- | --- | -| `Bash` | Matches all Bash commands | -| `WebFetch` | Matches all web fetch requests | -| `Read` | Matches all file reads | -| `Edit` | Matches all file edits | - -`Bash(*)` is equivalent to `Bash` and matches all Bash commands. - -### [Bash Wildcard Patterns](#bash-wildcard-patterns) - -Bash rules support glob patterns with `*`. Wildcards can appear at any position: - -```p-4 -{ - "permissions": { - "allow": [ - "Bash(npm run *)", - "Bash(git commit *)", - "Bash(git * main)", - "Bash(* --version)", - "Bash(* --help *)" - ], - "deny": ["Bash(git push *)"] - } -} -``` - -**Word boundary semantics**: The space before `*` matters. `Bash(ls *)` matches `ls -la` but not `lsof`, while `Bash(ls*)` matches both. - -**Shell operator awareness**: Claude Code understands shell operators. A rule like `Bash(safe-cmd *)` will **not** match `safe-cmd && malicious-cmd`. This prevents chained command exploitation. - -> **Warning**: Bash patterns that constrain command arguments are fragile. For example, `Bash(curl http://github.com/ *)` intends to restrict curl to GitHub URLs, but won't match variations like options before the URL, different protocols, or variable expansion. For reliable URL filtering, restrict Bash network tools and use `WebFetch` with domain rules instead. - -### [Read and Edit Patterns](#read-and-edit-patterns) - -Read and Edit rules follow gitignore-style path patterns with four distinct types: - -| Pattern | Meaning | Example | -| --- | --- | --- | -| `//path` | Absolute path from filesystem root | `Read(//Users/alice/secrets/**)` | -| `~/path` | Path from home directory | `Read(~/Documents/*.pdf)` | -| `/path` | Relative to the settings file | `Edit(/src/**/*.ts)` | -| `path` or `./path` | Relative to current directory | `Read(*.env)` | - -> **Important**: A pattern like `/Users/alice/file` is **not** an absolute path. It resolves relative to your settings file. Use `//Users/alice/file` for true absolute paths. - -In gitignore patterns, `*` matches files in a single directory while `**` matches recursively across directories. To allow all file access, use just the tool name without parentheses: `Read`, `Edit`, or `Write`. - -### [WebFetch Domain Rules](#webfetch-domain-rules) - -Control which domains Claude can fetch from: - -```p-4 -{ - "permissions": { - "allow": ["WebFetch(domain:docs.anthropic.com)"], - "deny": ["WebFetch(domain:internal.company.com)"] - } -} -``` - -### [MCP Tool Patterns](#mcp-tool-patterns) - -Control MCP server access at the server or tool level: - -| Rule | Effect | -| --- | --- | -| `mcp__puppeteer` | Matches any tool from the puppeteer server | -| `mcp__puppeteer__*` | Same as above (wildcard syntax) | -| `mcp__puppeteer__puppeteer_navigate` | Matches only the navigate tool specifically | - -### [Task (Subagent) Rules](#task-subagent-rules) - -Control which subagents Claude can spawn using `Task(AgentName)`: - -```p-4 -{ - "permissions": { - "deny": ["Task(Explore)"] - } -} -``` - -Available agent names include `Explore`, `Plan`, and `Verify`. You can also use the `--disallowedTools` CLI flag to disable specific agents at startup. - -### [Extending Permissions with Hooks](#extending-permissions-with-hooks) - -[PreToolUse hooks](/blog/tools/hooks/hooks-guide) run before the permission system and can approve, deny, or modify tool calls at runtime. This gives you programmatic control over permissions beyond static rules. See the [Permission Hook guide](/blog/tools/hooks/permission-hook-guide) for a production-ready implementation. - -## [How Permissions Work with Sandboxing](#how-permissions-work-with-sandboxing) - -Permissions and sandboxing are complementary security layers providing defense-in-depth: - -- **Permissions** control which tools Claude can use and which files or domains it can access. They apply to all tools (Bash, Read, Edit, WebFetch, MCP, and others). -- **Sandboxing** provides OS-level enforcement that restricts what Bash commands can access at the filesystem and network level. It applies **only** to Bash commands and their child processes. - -Use both together for the strongest security posture: - -- Permission deny rules stop Claude from even attempting to access restricted resources -- Sandbox restrictions prevent Bash commands from reaching resources outside defined boundaries, even if a prompt injection bypasses Claude's decision-making -- Filesystem restrictions in the sandbox use `Read` and `Edit` deny rules (not separate sandbox configuration) -- Network restrictions combine `WebFetch` permission rules with the sandbox's `allowedDomains` list - -Enable sandboxing with the `/sandbox` command. On macOS it works out of the box using Seatbelt. On Linux and WSL2, install `bubblewrap` and `socat` first. - -## [Managed Permission Settings](#managed-permission-settings) - -For organizations that need centralized control, administrators can deploy managed settings files that cannot be overridden by users or projects: - -| Setting | Effect | -| --- | --- | -| `allowManagedPermissionRulesOnly` | When `true`, only permission rules defined in managed settings apply. User and project rules are ignored. | -| `disableBypassPermissionsMode` | Set to `"disable"` to prevent `bypassPermissions` mode and the `--dangerously-skip-permissions` CLI flag. | - -Managed settings file locations: - -- **macOS**: `/Library/Application Support/ClaudeCode/managed-settings.json` -- **Linux/WSL**: `/etc/claude-code/managed-settings.json` -- **Windows**: `C:\Program Files\ClaudeCode\managed-settings.json` - -These are system-wide paths (not user home directories) requiring administrator privileges. They follow the same format as regular settings files but take the highest precedence in the [settings hierarchy](/blog/guide/configuration-basics). - -## [Development Scenario Strategies](#development-scenario-strategies) - -### [Early Development (Use Normal Mode)](#early-development-use-normal-mode) - -When starting new projects or exploring unfamiliar code: - -- Keep all permissions manual -- Review each suggested change -- Learn how Claude approaches problems -- Build confidence in the AI's decisions - -### [Active Development (Use Auto-Accept)](#active-development-use-auto-accept) - -During intensive coding sessions: - -- Enable auto-accept for trusted file types -- Allow common commands (npm, git status) -- Maintain prompts for system operations -- Enable uninterrupted workflow - -### [Code Review (Use Plan Mode)](#code-review-use-plan-mode) - -When analyzing existing codebases: - -- Switch to plan mode for safety -- Let Claude explore without modifications -- Generate analysis and recommendations -- Switch modes only when ready to implement - -## [Common Permission Pitfalls](#common-permission-pitfalls) - -**Over-permissioning**: Avoid `bypassPermissions` mode unless you are running in a fully isolated container or VM. Use `dontAsk` mode with explicit allow rules for a safer "hands-off" approach. - -**Under-permissioning**: Constantly clicking "Allow" defeats the purpose. Use `/permissions` to pre-approve repeat operations, or consider the `acceptEdits` mode for active development sessions. - -**Mode Confusion**: Check your current mode before starting work. The mode indicator appears in the UI. Set `defaultMode` in settings.json if you always want to start in a specific mode. - -**Blanket Permissions**: Avoid allowing all bash commands. Use specific patterns like `Bash(npm run *)` to limit scope. Remember that deny rules always win over allow rules. - -**Fragile Argument Patterns**: Do not rely on Bash rules to restrict command arguments (like constraining `curl` to specific URLs). Use `WebFetch` domain rules for reliable URL filtering instead. - -## [What's Next](#whats-next) - -Master your development workflow by learning complementary techniques: - -- Automate permission decisions with [hooks](/blog/tools/hooks/hooks-guide) and the [Permission Hook](/blog/tools/hooks/permission-hook-guide) -- Customize your [keybindings](/blog/tools/keybindings-guide) for faster mode cycling -- Optimize your [feedback loops](/blog/guide/development/feedback-loops) for faster iteration -- Set up efficient [todo workflows](/blog/guide/development/todo-workflows) for task management -- Configure [git integration](/blog/guide/development/git-integration) for seamless version control -- Explore [configuration basics](/blog/guide/configuration-basics) for settings.json and advanced setup - -Five permission modes for five development scenarios. `default` for safety, `acceptEdits` for productivity, `plan` for exploration, `dontAsk` for automation, and `bypassPermissions` for isolated environments. Match the mode to your current needs, and layer sandboxing on top for defense-in-depth. - -Last updated on - -[Previous - -Git Integration](/blog/guide/development/git-integration)[Next - -Feedback Loops](/blog/guide/development/feedback-loops) diff --git a/docs/site/src/content/blog/persistent-memory-across-sessions.md b/docs/site/src/content/blog/persistent-memory-across-sessions.md deleted file mode 100644 index a70f694a..00000000 --- a/docs/site/src/content/blog/persistent-memory-across-sessions.md +++ /dev/null @@ -1,81 +0,0 @@ ---- -slug: "persistent-memory-across-sessions" -title: "Persistent Memory: How Claude Remembers Across Sessions" -description: "Stop repeating yourself every session. Learn how Pilot gives Claude persistent memory for decisions, discoveries, and project context." -date: "2026-02-08" -author: "Max Ritter" -tags: [Feature, Memory] -readingTime: 4 -keywords: "Claude Code memory, persistent memory, Claude Code sessions, AI memory, Claude Code context, session continuity" ---- - -# Persistent Memory: How Claude Remembers Across Sessions - -Every Claude Code session starts with a blank slate. Claude doesn't remember what you did yesterday, what decisions you made, or what bugs you fixed. Persistent memory changes this — it gives Claude access to observations from every past session. - -## The Problem - -Without memory, you repeat yourself constantly: - -- "We decided to use PostgreSQL, not SQLite" — again -- "The auth module is in `src/services/auth.py`" — again -- "Don't modify the legacy API, it's frozen" — again - -Each session costs time re-explaining context that Claude should already know. Worse, Claude might make decisions that contradict past ones because it has no record of them. - -## How Persistent Memory Works - -Pilot's memory system runs as a background service that observes your sessions. It automatically captures: - -- **Decisions** — Why you chose one approach over another -- **Discoveries** — Bugs found, workarounds identified, undocumented behavior -- **Changes** — What was built, modified, or refactored -- **Patterns** — Recurring workflows and project conventions - -Observations are stored in a local SQLite database with full-text search. At the start of each session, relevant observations are injected into Claude's context based on recency and the current project. - -## What Gets Captured - -The system categorizes observations automatically: - -| Type | Example | -|------|---------| -| **Discovery** | "The payment API returns 429 after 100 requests/minute" | -| **Decision** | "Chose JWT over sessions for stateless auth" | -| **Bugfix** | "Fixed race condition in queue worker by adding mutex" | -| **Change** | "Added retry logic to S3 upload with exponential backoff" | -| **Refactor** | "Split 400-line UserService into UserAuth and UserProfile" | - -## Searching Past Work - -You can search memory directly during a session. The system uses a 3-layer approach to minimize token usage: - -1. **Search** — Find observations by keyword (returns IDs and titles) -2. **Timeline** — See chronological context around a result -3. **Get details** — Fetch full observation text only for relevant IDs - -This layered approach means Claude doesn't load hundreds of observations into context — it fetches only what's needed for the current task. - -## Privacy - -Content wrapped in `` tags is never stored: - -``` -The API key is sk-abc123... -``` - -Secrets, credentials, and sensitive data stay out of the memory database entirely. - -## The Web Viewer - -Pilot includes a real-time viewer at `http://localhost:41777` where you can browse all observations as they're captured. This is useful for: - -- Verifying what Claude learned during a session -- Finding past decisions when onboarding new team members -- Debugging why Claude made a particular choice - -## Practical Impact - -With persistent memory, session 50 of a project is as productive as session 1. Claude knows your architecture, your conventions, your past decisions, and your preferences — without you repeating any of it. - -Combined with auto-compaction, this means Claude can work on multi-week projects with full continuity. The context window limits a single session, but memory bridges the gaps between compaction boundaries. diff --git a/docs/site/src/content/blog/planning-modes.md b/docs/site/src/content/blog/planning-modes.md deleted file mode 100644 index 6707632b..00000000 --- a/docs/site/src/content/blog/planning-modes.md +++ /dev/null @@ -1,169 +0,0 @@ ---- -slug: "planning-modes" -title: "Claude Code Planning Mode: Shift+Tab Twice" -description: "Shift+Tab twice. Claude Code lists all affected files and trade-offs. No code runs until you review and explicitly approve the plan." -date: "2025-08-23" -author: "Max Ritter" -tags: [Guide, Workflow] -readingTime: 5 -keywords: "claude, code, mode, modes, planning, shifttab, twice" ---- - -Mechanics - -# Claude Code Planning Mode: Preview Changes Before Execution - -Shift+Tab twice. Claude Code lists all affected files and trade-offs. No code runs until you review and explicitly approve the plan. - -Avoid coding disasters before they happen. Planning mode separates thinking from execution, creating better solutions with zero risk. - -**Quick Win**: Press `Shift+Tab` twice to enter planning mode right now. Claude will analyze your project but won't touch a single file until you approve. - -Planning mode transforms how you approach complex changes. Instead of hoping Claude gets it right the first time, you review the strategy before any code executes. - -## [Why Planning Mode Changes Everything](#why-planning-mode-changes-everything) - -**The Problem**: Claude Code is incredibly fast at implementation. Sometimes too fast. You ask for a "quick fix" and suddenly 12 files are modified with breaking changes. - -**Before Planning Mode**, developers constantly wrote prompts like: - -> "Don't code anything yet, just analyze the problem and suggest approaches" - -This worked inconsistently. Claude's suggestions varied wildly in format and detail. Sometimes you'd get a one-liner, sometimes a novel. - -**With Planning Mode**, Claude delivers structured, predictable analysis every time. You get: - -- Multiple numbered options with clear trade-offs -- Complexity assessments for each approach -- Required file changes outlined before implementation -- Consistent formatting that's easy to scan - -## [How to Use Planning Mode](#how-to-use-planning-mode) - -### [Activation and Control](#activation-and-control) - -Enter planning mode with `Shift+Tab` twice. The interface confirms you're in planning mode - Claude can read everything but modify nothing. - -Exit planning mode by pressing `Shift+Tab` once more. Claude asks for explicit confirmation before executing any changes. - -**Pro Tip**: Plan mode works incredibly fast. Since Claude isn't executing tools or writing files, responses are lightning quick and use fewer tokens. - -### [What Claude Can Do in Planning Mode](#what-claude-can-do-in-planning-mode) - -**Read-Only Access**: - -- File content analysis with Read and LS tools -- Codebase searching with Glob and Grep -- Web research with WebSearch and WebFetch -- Task organization with TodoRead/TodoWrite -- Jupyter notebook viewing with NotebookRead -- Project understanding through comprehensive analysis - -**Restricted Actions**: - -- No file editing (Edit/MultiEdit blocked) -- No file creation (Write blocked) -- No command execution (Bash blocked) -- No notebook modifications (NotebookEdit blocked) -- No modifications through MCP tools - -Claude becomes your strategic advisor, not your implementer. - -## [When to Use Planning Mode](#when-to-use-planning-mode) - -### [Complex Refactoring Projects](#complex-refactoring-projects) - -**Use planning mode when**: - -- Refactoring affects multiple files -- Architectural changes impact system design -- You're unsure of the best implementation approach -- Legacy code needs careful modification - -**Example Request**: - -> "I need to migrate this Express app from CommonJS to ES modules. What's the safest approach?" - -Claude analyzes your entire codebase, identifies dependencies, suggests migration strategies, and estimates complexity - all before touching code. - -### [Feature Implementation Strategy](#feature-implementation-strategy) - -**Use planning mode for**: - -- New feature integration into existing systems -- Database schema changes -- API endpoint modifications that affect multiple consumers - -**Example Response Pattern**: - -```p-4 -Option 1: Incremental Migration (Recommended) -- Risk: Low (backward compatible) -- Files affected: 6 core modules -- Benefits: Zero downtime, rollback-friendly - -Option 2: Complete Rewrite -- Risk: High (breaking changes) -- Files affected: 15+ modules -- Benefits: Cleaner architecture, better performance -``` - -## [Common Planning Mode Workflows](#common-planning-mode-workflows) - -### [Architecture Review](#architecture-review) - -Tell Claude: *"Analyze my current project structure and suggest improvements"* - -You'll get detailed analysis of your file organization, dependency patterns, and architectural bottlenecks with specific recommendations. - -### [Performance Optimization](#performance-optimization) - -Request: *"Review my database queries and suggest optimization strategies"* - -Claude examines your queries, identifies N+1 problems, suggests indexing strategies, and compares multiple optimization approaches. - -### [Security Assessment](#security-assessment) - -Ask: *"Audit my authentication system for security vulnerabilities"* - -Claude reviews your auth implementation, identifies potential issues, and suggests remediation strategies without making any changes. - -## [Planning Mode Best Practices](#planning-mode-best-practices) - -**Start Complex Sessions with Planning**: Before asking Claude to "refactor the entire user system," enter planning mode first. Understand the scope before committing. - -**Use for Code Reviews**: Planning mode excels at analyzing existing code and suggesting improvements. Perfect for technical debt assessment. - -**Research Unknown Technologies**: When integrating new libraries or frameworks, planning mode helps you understand integration points before implementation. - -**Validate Before Executing**: Even for smaller changes, planning mode shows you exactly what Claude intends to modify. No surprises. - -## [Integration with Your Workflow](#integration-with-your-workflow) - -Planning mode works perfectly with other Claude Code mechanics: - -- **[Context Management](/blog/guide/mechanics/context-management)**: Plan mode helps preserve context by encouraging upfront analysis -- **[CLAUDE.md Mastery](/blog/guide/mechanics/claude-md-mastery)**: Use planning to design CLAUDE.md improvements before implementation -- **[Auto-Planning Strategies](/blog/guide/mechanics/auto-planning-strategies)**: Combine with auto-planning for comprehensive project analysis -- **[Terminal Main Thread](/blog/guide/mechanics/terminal-main-thread)**: Planning mode reinforces the terminal-first development approach - -## [Next Steps](#next-steps) - -Master planning mode by practicing on your current projects: - -1. **Enter planning mode** with `Shift+Tab` twice on your next feature request -2. **Review the analysis** - notice the structured, detailed responses -3. **Approve or iterate** - refine the plan before implementation -4. **Execute confidently** - exit planning mode knowing exactly what happens next - -Ready to combine planning with advanced strategies? Learn **[Auto-Planning Strategies](/blog/guide/mechanics/auto-planning-strategies)** for systematic project analysis. - -Planning mode is the foundation of PRD-first development. Learn how top developers combine this with four other techniques in our [Claude Code best practices](/blog/guide/development/agentic-engineering-best-practices) guide. - -Last updated on - -[Previous - -Terminal Main Thread](/blog/guide/mechanics/terminal-main-thread)[Next - -Auto-Planning Strategies](/blog/guide/mechanics/auto-planning-strategies) diff --git a/docs/site/src/content/blog/project-templates.md b/docs/site/src/content/blog/project-templates.md deleted file mode 100644 index 0e396f9e..00000000 --- a/docs/site/src/content/blog/project-templates.md +++ /dev/null @@ -1,142 +0,0 @@ ---- -slug: "project-templates" -title: "Claude Code Project Templates for Rapid Scaffolding" -description: "Accelerate development with Claude Code project templates. Learn to create and use skeleton projects that jumpstart your coding workflow." -date: "2025-08-23" -author: "Max Ritter" -tags: [Guide, Development] -readingTime: 4 -keywords: "claude, code, project, rapid, scaffolding, templates" ---- - -Development - -# Claude Code Templates: Skeleton Projects for Rapid Development - -Accelerate development with Claude Code project templates. Learn to create and use skeleton projects that jumpstart your coding workflow. - -**Problem**: Every new project means rebuilding the same folder structures, configs, and boilerplate from scratch. - -**Quick Win**: Run `/init` in any project folder to generate a starter CLAUDE.md with your project conventions: - -```p-4 -cd my-new-project -claude -/init -``` - -Claude analyzes your codebase structure and creates a CLAUDE.md file with detected patterns, file conventions, and project-specific instructions. Two minutes to a configured project foundation. - -## [How Claude Code Actually Handles Templates](#how-claude-code-actually-handles-templates) - -Claude Code does not just find templates - it understands them. When you point Claude at a starter repo, it reads every file, maps the architecture, and explains what each piece does before you change anything. - -The real power is customization. Claude can: - -- **Clone and analyze** any GitHub template in your terminal -- **Explain the structure** so you understand before modifying -- **Swap technologies** (Prisma to Supabase, REST to tRPC) while preserving patterns -- **Store conventions** in CLAUDE.md so future sessions remember your setup - -This is not generic "AI finds templates" - this is your terminal-based coding partner actually reading and adapting code. - -## [The /init Command: Your Starting Point](#the-init-command-your-starting-point) - -Every Claude Code project should start with `/init`. This built-in command generates a CLAUDE.md file tailored to your specific codebase: - -```p-4 -claude -/init -``` - -Claude scans your project and creates instructions covering: - -- Detected frameworks and their conventions -- Build commands and test patterns -- File structure overview -- Code style preferences it observed - -**Pro tip**: Edit the generated CLAUDE.md to add your preferences. Claude reads this file at session start, so your conventions persist across every future session. Learn more in our [CLAUDE.md Mastery guide](/blog/guide/mechanics/claude-md-mastery). - -## [Clone, Analyze, Customize Workflow](#clone-analyze-customize-workflow) - -Here is the Claude Code-specific workflow for working with any template: - -```p-4 -# Step 1: Clone and understand -claude "clone https://github.com/example/nextjs-starter and explain its architecture" - -# Step 2: Customize for your stack -claude "replace Prisma with Supabase, keep the same data patterns" - -# Step 3: Save your conventions -claude "update CLAUDE.md with our new database setup and auth patterns" -``` - -Claude remembers context within your session, so each step builds on the last. No copy-pasting between tools or losing track of what changed. - -## [Store Template Patterns in CLAUDE.md](#store-template-patterns-in-claudemd) - -Your CLAUDE.md becomes your personal template library. Add sections for patterns you reuse: - -```p-4 -## Project Conventions - -### API Routes - -- All API routes in /app/api -- Use Zod for validation -- Return typed responses with ApiResponse - -### Database - -- Supabase client in /lib/supabase -- Row-level security on all tables -- Migrations in /supabase/migrations -``` - -Now Claude applies these conventions automatically. Ask it to "add a new API endpoint" and it follows your established patterns without re-explaining them. - -## [When Things Go Wrong](#when-things-go-wrong) - -**Error: "CLAUDE.md not found"** -Fix: Run `/init` or create the file manually in your project root. - -**Error: Claude ignores your template conventions** -Fix: Check that your CLAUDE.md is in the project root. Claude only reads it from the current working directory. See [context management](/blog/guide/mechanics/context-management) for more details. - -**Error: Template has outdated dependencies** -Fix: Ask Claude directly: - -```p-4 -claude "update all dependencies to latest stable versions and fix any breaking changes" -``` - -## [Extract Your Own Templates](#extract-your-own-templates) - -Built something good? Turn it into a reusable template: - -```p-4 -claude "extract the reusable patterns from this project into a template structure, document what each piece does in CLAUDE.md" -``` - -Claude identifies the generalizable parts, strips project-specific code, and documents the template for future use. - -## [What You Can Do Now](#what-you-can-do-now) - -You just learned how Claude Code handles templates differently - through understanding and customization, not just discovery. - -**Next steps:** - -- Run `/init` in your current project right now -- Check out [Git Integration](/blog/guide/development/git-integration) for version control with Claude -- Master [Feedback Loops](/blog/guide/development/feedback-loops) for rapid iteration -- Explore [Efficiency Patterns](/blog/guide/performance/efficiency-patterns) to speed up your workflow - -Last updated on - -[Previous - -Task Management](/blog/guide/development/task-management)[Next - -Usage Optimization](/blog/guide/development/usage-optimization) diff --git a/docs/site/src/content/blog/ralph-wiggum-technique.md b/docs/site/src/content/blog/ralph-wiggum-technique.md deleted file mode 100644 index fdee753e..00000000 --- a/docs/site/src/content/blog/ralph-wiggum-technique.md +++ /dev/null @@ -1,269 +0,0 @@ ---- -slug: "ralph-wiggum-technique" -title: "Claude Code Ralph Wiggum: Run Autonomously Overnight" -description: "The complete guide to Ralph Wiggum loops. Learn stop hooks, completion promises, and verification-first workflows that ship features overnight." -date: "2026-01-14" -author: "Max Ritter" -tags: [Guide, Workflow] -readingTime: 8 -keywords: "autonomously, claude, code, overnight, ralph, run, technique, wiggum" ---- - -Mechanics - -# The Ralph Wiggum Technique: How to Run Claude Code Autonomously While You Sleep - -The complete guide to Ralph Wiggum loops. Learn stop hooks, completion promises, and verification-first workflows that ship features overnight. - -> **Update (Jan 2025)**: Anthropic shipped native [task management](/blog/guide/development/task-management) with dependencies, blockers, and multi-session coordination via `CLAUDE_CODE_TASK_LIST_ID`. Many Ralph workarounds are now built-in. The core principles below still apply - the new system just makes the plumbing native. - -You give an agent a list of tasks. It picks one, implements it, tests it, commits the code. Then it picks the next one. And the next. All night while you sleep. - -That's Ralph Wiggum. Not the Simpsons character. The autonomous AI coding loop that's changing how engineers ship software. - -## [What Makes Ralph Different](#what-makes-ralph-different) - -Most developers use Claude Code like a conversation. Prompt. Wait. Review. Prompt again. That's fine for small tasks. But for building features? You're the bottleneck. - -Ralph flips the model. Instead of you driving each interaction, you set up a loop that keeps Claude working until the job is done. The key insight: Claude Code's stop hooks let you intercept when the agent tries to finish and redirect it back to work. - -Here's the core pattern: - -1. Claude works on a task -2. Claude tries to stop (outputs completion) -3. A stop hook intercepts and checks: is the work actually done? -4. If not, feed the prompt back and continue -5. If yes, let it complete - -The magic is in step 4. Your agent doesn't quit when it thinks it's done. It quits when the work is verified. - -## [The Completion Promise](#the-completion-promise) - -Ralph uses a "completion promise" - a specific word or phrase that signals genuine completion. When Claude feels the task is truly finished, it outputs this promise (commonly the word "complete"). - -```p-4 -// In your Ralph loop configuration -completion_promise: "complete" -max_iterations: 25 -``` - -The stop hook checks for this promise. If it's not there, the loop continues. If it is, the loop ends. This prevents Claude from quitting prematurely while also providing a clean exit when work is done. - -**Critical rule**: Until Claude outputs the promise, it doesn't stop. This forces the agent to keep iterating until it genuinely believes the work is complete. - -## [Verification: The Non-Negotiable Core](#verification-the-non-negotiable-core) - -Boris Cherny, the creator of Claude Code, has one rule he never breaks: **always give Claude a way to verify its work**. - -This is the foundation that makes Ralph reliable. Without verification, you get a loop that runs forever or stops too early. With verification, you get a loop that knows when it's done. - -Three verification approaches work well with Ralph: - -### [1. Test-Driven Verification](#1-test-driven-verification) - -Write tests before implementation. Claude runs the tests, sees failures, implements code, runs tests again. The loop continues until all tests pass. - -```p-4 -Workflow: -1. Run all tests in /tests/feature-x/ -2. If tests fail, implement code to make them pass -3. Run tests again -4. Repeat until all tests pass -5. Output "complete" only when test suite is green -``` - -This is the most reliable approach. Tests are objective. They either pass or fail. No ambiguity. - -### [2. Background Agent Verification](#2-background-agent-verification) - -Spawn a separate agent to verify the main agent's work. This is Boris's approach for long-running tasks: - -```p-4 -After completing work, use a background agent to: -1. Review all changed files -2. Run the full test suite -3. Check for regressions -4. Report any issues found -``` - -The background agent provides an independent check. If it finds problems, the main loop continues. - -### [3. Stop Hook Validation](#3-stop-hook-validation) - -The stop hook itself can run validation commands. Check a progress file, run linting, verify build status. If validation fails, block the stop and continue iterating. - -```p-4 -// Stop hook pseudocode -if (agent_trying_to_stop) { - validation_result = run_tests(); - if (validation_result.failed) { - return { decision: "block", reason: "Tests failing, continue work" }; - } - return { decision: "allow" }; -} -``` - -## [The Two-Phase Workflow](#the-two-phase-workflow) - -Here's where many developers make their first mistake: they try to plan and implement in the same context window. - -Separate them. - -**Phase 1: Planning Session** - -- Generate specifications through conversation -- Review and edit by hand -- Create an implementation plan with explicit file references -- Keep the spec as a "pin" that prevents invention - -**Phase 2: Implementation Session** - -- Fresh context (clear the previous conversation) -- Feed only the plan document -- Run the Ralph loop -- Let the agent iterate until complete - -Why separate? Context window degradation is real. After enough back-and-forth, Claude starts making assumptions based on earlier messages that are no longer relevant. A fresh start with just the plan means sharper focus. - -The plan becomes your anchor. Every loop iteration references it. Instead of drifting, the agent stays aligned with what you actually wanted. - -## [Practical Implementation: The PRD Approach](#practical-implementation-the-prd-approach) - -Ryan Carson's approach breaks down like this: - -1. **Start with a PRD** (Product Requirements Document) - - - What are we building? - - What's in scope? - - What's explicitly out of scope? -2. **Convert to user stories with acceptance criteria** - - - Each story is a small, testable unit - - Acceptance criteria define "done" -3. **Structure for agent consumption** - - - JSON or markdown format - - Clear checkboxes for progress tracking - - Links to relevant code locations -4. **Run the loop** - - - Agent picks the next uncompleted story - - Implements it - - Runs verification (tests) - - Marks it complete - - Moves to the next - -The beauty: you can walk away. Come back in the morning to find completed features, passing tests, and committed code. - -## [UI Verification: The Hidden Trap](#ui-verification-the-hidden-trap) - -Here's a gotcha that catches everyone: functional tests pass, but the UI is broken. - -The problem: Ralph can verify that code runs correctly while completely ignoring visual bugs. A component renders, tests pass, but the button is off-screen or text is truncated. - -The solution: **screenshot-based verification protocol**. - -```p-4 -After implementing UI changes: -1. Take screenshots of affected components -2. Rename each with "verified_" prefix after review -3. Do NOT output completion promise yet -4. Let the next iteration confirm all files are verified -5. Only then output "complete" -``` - -This forces at least two loop iterations for UI work. The first implements and captures screenshots. The second verifies all screenshots were reviewed. Claude can't skip the visual check. - -**The key insight**: Tell Claude that after renaming screenshots, it should NOT output the promise yet. Let the next iteration confirm completion. This prevents premature exits. - -## [Economics: Why This Changes Everything](#economics-why-this-changes-everything) - -Running a coding agent continuously costs approximately **$10.42 USD per hour** with Sonnet (measured over 24-hour burn rate). - -That's less than minimum wage in most places. For a machine that can: - -- Clear backlogs overnight -- Run multiple features in parallel -- Never get tired or distracted -- Scale with more compute - -The constraint shifts from "how much can I afford to run?" to "how much reliable work can I define?" - -Teams that can run reliable loops will dramatically outpace those that can't. The gap is widening. - -## [Common Failures and Fixes](#common-failures-and-fixes) - -### [Loop Never Ends](#loop-never-ends) - -**Cause**: Impossible task or missing completion criteria -**Fix**: Set a max iteration count (e.g., 25). Add explicit completion criteria to your prompt. - -### [Loop Ends Too Early](#loop-ends-too-early) - -**Cause**: Claude outputs the promise before work is done -**Fix**: Strengthen your verification. Add tests. Use the screenshot protocol for UI. Make "done" objectively measurable. - -### [Quality Degrades Over Iterations](#quality-degrades-over-iterations) - -**Cause**: Context window filling with failed attempts -**Fix**: Implement checkpoint state. Mark completed work in an external file. Let the loop resume cleanly if context fills. - -### [Agent Invents Features](#agent-invents-features) - -**Cause**: Spec is vague or missing -**Fix**: Your spec is the "pin" that prevents invention. Make it specific. Include explicit references to existing code. Tell Claude what NOT to do. - -## [Setting Up Your First Ralph Loop](#setting-up-your-first-ralph-loop) - -Start simple. Pick a well-defined feature with existing tests. - -1. **Install the Ralph plugin** (or implement the stop hook pattern yourself) -2. **Create your prompt file**: - -```p-4 -Study the implementation plan in /docs/plan.md -Pick the single most important incomplete task -Implement it following existing patterns -Run tests with: npm test -On pass: mark task complete in plan.md, commit changes -On fail: fix the issue and run tests again -Output "complete" only when all tasks are done and tests pass -``` - -3. **Set constraints**: - - - Max iterations: 25 - - Completion promise: "complete" - - Quality gates: tests must pass, linting must pass -4. **Watch the first run**. Don't walk away yet. Cancel if behavior looks wrong. Adjust your prompt. Re-run. -5. **Gradually increase autonomy** as trust builds. - -## [The Ralph Philosophy](#the-ralph-philosophy) - -Ralph isn't about removing humans from coding. It's about removing humans from the tedious iteration loop. - -You still design the system. You write the specs. You define what "done" looks like. You review the final result. - -But the 2 AM debugging? The repetitive test-fix-test cycles? The context switching between features? That's what Ralph handles. - -Boris's philosophy remains at the core: **verification drives everything**. Give Claude a way to verify its work, and it can run reliably for hours. Without verification, you're just hoping. - -Start with verification. Build your loops around it. The autonomous coding future isn't about smarter prompts. It's about better feedback systems. - -## [Next Steps](#next-steps) - -- Try [native task management](/blog/guide/development/task-management) for built-in persistence and multi-session coordination -- Learn about [hooks](/blog/tools/hooks/hooks-guide) to implement custom stop behaviors -- Explore [async workflows](/blog/guide/agents/async-workflows) for running multiple loops -- Read about [thread-based engineering](/blog/guide/mechanics/thread-based-engineering) for scaling your autonomous workflows -- Check [feedback loops](/blog/guide/development/feedback-loops) for verification patterns - -The developers who master Ralph aren't just using Claude Code. They're building systems that ship while they sleep. - -Last updated on - -[Previous - -Output Formatting](/blog/guide/mechanics/output-formatting)[Next - -Thread-Based Engineering](/blog/guide/mechanics/thread-based-engineering) diff --git a/docs/site/src/content/blog/robots-first-engineering.md b/docs/site/src/content/blog/robots-first-engineering.md deleted file mode 100644 index e41b32d0..00000000 --- a/docs/site/src/content/blog/robots-first-engineering.md +++ /dev/null @@ -1,300 +0,0 @@ ---- -slug: "robots-first-engineering" -title: "Claude Code Robots-First: Design Systems for AI" -description: "The future of software engineering is robots-first. Learn to build fully autonomous AI development systems designed for AI agents, not humans." -date: "2026-01-14" -author: "Max Ritter" -tags: [Guide, Workflow] -readingTime: 8 -keywords: "ai, claude, code, design, engineering, first, robots, robotsfirst, systems" ---- - -Mechanics - -# Robots-First Engineering: Building Software Systems Designed for AI Agents, Not Humans - -The future of software engineering is robots-first. Learn to build fully autonomous AI development systems designed for AI agents, not humans. - -Everything in software engineering was designed for humans. File systems. Terminal interfaces. JSON. Git workflows. Code review processes. - -What happens when we redesign for machines? - -This is robots-first engineering. And it's where autonomous software development is heading. - -## [Development vs Engineering](#development-vs-engineering) - -Here's a distinction that changes everything: - -**Software development** is now automated. Writing code, running tests, committing changes. Agents do this. The cost is approximately $10/hour. It runs 24/7. It doesn't get tired. - -**Software engineering** is designing the systems that keep automated development reliable. Building rails. Managing failure domains. Creating verification loops. Engineering back-pressure. - -The job has shifted. You're no longer carrying cargo by hand onto the ship. The shipping containers are here. Your job is to operate the locomotive and keep it on the tracks. - -This is the mindset shift that separates engineers who thrive with AI from those who struggle. - -## [The Screwdriver and the Jackhammer](#the-screwdriver-and-the-jackhammer) - -There's a progression to autonomous engineering: - -**The Screwdriver**: Manual fundamentals. You shape specs by hand. You control context carefully. You steer search and linkage. You learn how to keep the system on rails before turning it loose. - -**The Jackhammer**: Full-power automation. Ralph loops running unattended. Heavy orchestration. Multiple agents in parallel. Overnight feature builds. - -The mistake most engineers make: reaching for the jackhammer before mastering the screwdriver. - -If you go straight for full automation without understanding the fundamentals, you'll get terrible results. The screwdriver teaches you what the jackhammer needs to succeed. - -Start manual. Understand why things work. Then graduate to power tools. - -## [Loom: An Environment for Agents](#loom-an-environment-for-agents) - -Loom represents the next evolution: a self-evolving software environment designed around agents rather than humans. - -The design principle is radical. For every system component, ask: - -1. Was this designed for humans? -2. If yes, can it be cut? -3. If cut, what value was lost and how is it replaced? - -Examples of human-first assumptions being questioned: - -- **Unix user space and TTY conventions** - Do agents need terminal interfaces? -- **Common agile/process practices** - Do agents need sprint planning? -- **JSON as data format** - Is JSON optimal for tokenization? -- **Code review workflows** - Can verification replace review? - -Loom's architecture includes: - -- Code hosting (GitHub-like, but agent-optimized) -- Source control using JJ (designed for machine workflows) -- Codespaces-like remote environments -- Multi-LLM "alloying" (mixing providers) -- Actor/pub-sub messaging patterns -- Erlang/OTP-style chaining - -The key insight: **loops composed into chains**. Loops on loops on loops. Each small, focused. Together, a reactive system. - -## [Context Windows Are Arrays](#context-windows-are-arrays) - -A fundamental principle for robots-first thinking: - -The context window is an array. The less you use in that array, the less the window needs to slide, the better outcomes you get. - -More context means: - -- More sliding -- Earlier compaction -- Compaction is lossy -- Loss drops critical anchors -- Drift follows - -This is why [Ralph loops](/blog/guide/mechanics/ralph-wiggum-technique) work. They're designed to deterministically manage the array. Keep it focused. Avoid compaction. Preserve the pin. - -The "pin" is your specification - the stable reference point that prevents invention. Every loop iteration references it. Without the pin, agents drift into hallucination. - -## [Specs as Lookup Tables](#specs-as-lookup-tables) - -Robots-first specs aren't just documentation. They're lookup tables optimized for agent search. - -A well-designed spec includes: - -```p-4 -## User Authentication - -**Also known as**: login, sign-in, auth, session management, identity - -**Related files**: src/auth/, src/middleware/session.ts - -**Key patterns**: JWT tokens, refresh rotation, secure cookies - -**What NOT to do**: Don't implement custom crypto, don't store passwords in plain text -``` - -The "also known as" section improves search hit rates. When an agent searches for "login," it finds the auth spec. More descriptors mean more hits. More hits mean less invention. - -The spec becomes a frame of reference for all functionality. Agents look up existing patterns instead of inventing new ones. - -## [Linkage Over Fancy Formats](#linkage-over-fancy-formats) - -Many engineers over-engineer their implementation plans. Complex JSON schemas. Nested task hierarchies. Fancy formatting. - -The robots-first approach: **strong linkage beats fancy formats**. - -What works: - -- Bullet points with explicit references -- Cite the exact spec section -- Point to specific file locations -- Reference specific hunks (the read tool works in hunks) - -```p-4 -## Implementation Plan - -- [ ] Add JWT validation middleware - - - Spec: auth-spec.md#token-validation - - File: src/middleware/auth.ts (lines 45-60) - - Pattern: Follow existing rate-limit middleware structure - -- [ ] Create refresh token endpoint - - Spec: auth-spec.md#refresh-flow - - File: src/routes/auth/refresh.ts (new file) - - Pattern: Match existing /auth/login endpoint structure -``` - -The agent can now search precisely. It finds the right hunks. It follows existing patterns. It doesn't invent. - -## [The Robots-First Stack](#the-robots-first-stack) - -Here's where it gets radical. If you control the entire stack, you can optimize for machines: - -**Serialization**: JSON is not optimal for tokenization. Every quote, bracket, and comma consumes tokens. Binary formats or agent-optimized text formats could be dramatically more efficient. - -**User Space**: Why do agents need Unix user space conventions? TTY was designed for human terminals. Agents don't need terminal emulation. - -**Garbage Collection**: What does memory management mean when your "process" is a stateless API call? The assumptions change completely. - -**Message Passing**: Erlang/OTP principles become relevant again. Actors. Supervision trees. Let-it-crash philosophy. These patterns suit agent orchestration. - -Engineers who control their stack can: - -- Optimize tokenization -- Reduce costs dramatically -- Build faster reactive systems -- Operate cheaper than competitors - -This is competitive advantage territory. - -## [Weavers: Fully Autonomous Agents](#weavers-fully-autonomous-agents) - -The destination of robots-first engineering: **Weavers**. - -Weavers are autonomous agents that: - -- Ship code behind feature flags -- Deploy without code review -- Observe product analytics -- Decide if changes fixed errors -- Decide whether to optimize further -- Iterate automatically - -No human in the loop. Full autonomy. - -This sounds terrifying. That's the correct initial reaction. But consider: - -Every objection you have is an engineering problem. "What if it breaks production?" Engineer rollback mechanisms. "What if it makes bad decisions?" Engineer verification loops. "What if it goes off-rails?" Engineer back-pressure. - -The job of software engineering becomes: **engineer away the concerns**. - -Listen to your objections. Then build systems that address them. That's the new job. - -## [Back-Pressure Engineering](#back-pressure-engineering) - -Autonomous loops create many failure domains. Your engineering work becomes building rails: - -- Add constraints to specs -- Tighten plan linkage -- Improve search guidance -- Increase gating (tests, linting, formatting, security checks) - -When outcomes are poor, remediation is another loop: - -- Refactor loop -- Convention loop -- Security loop -- i18n loop - -Back-pressure keeps the generative function on the rails. The locomotive stays on track because you've engineered the track. - -## [The Scaling Path](#the-scaling-path) - -Robots-first engineering scales through composition: - -**Level 1: Manual Fundamentals** - -- Generate specs via conversation -- Edit and tighten constraints -- Keep context minimal -- Operate attended - -**Level 2: Unattended Looping** - -- `while true` style runs -- Single objective per iteration -- Automated tests + commit/push -- Checkpointed state - -**Level 3: Multi-Loop Orchestration** - -- Multiple loops running -- Reactive chaining as needed -- Actor/pub-sub patterns - -**Level 4: Autonomous Product Systems** - -- Weavers shipping features -- Analytics-driven decisions -- No code review required -- Full product autonomy - -Each level builds on the previous. You can't skip to Level 4 without mastering Levels 1-3. - -## [The Mindset](#the-mindset) - -Robots-first engineering requires a fundamental shift: - -**Old mindset**: "How do I write this code?" -**New mindset**: "How do I design systems that write this code reliably?" - -**Old mindset**: "How do I review this PR?" -**New mindset**: "How do I build verification that makes review unnecessary?" - -**Old mindset**: "How do I debug this issue?" -**New mindset**: "How do I engineer feedback loops that prevent this class of issues?" - -You're not coding anymore. You're designing autonomous systems. You're a locomotive engineer, not a cargo carrier. - -## [Getting Started](#getting-started) - -You don't need to build Loom to think robots-first. Start with questions: - -1. **What human assumptions am I encoding?** Look at your workflows. Which steps exist because humans needed them? -2. **What could be a lookup table?** Your specs, your patterns, your conventions. Can they be structured for agent search? -3. **Where is linkage weak?** Your plans probably reference things vaguely. Can you add explicit file paths, line numbers, hunks? -4. **What's my back-pressure strategy?** When agents go wrong, how do you correct them? Build those mechanisms before you need them. -5. **What would full autonomy require?** Imagine removing yourself from the loop. What breaks? Those are your engineering priorities. - -## [The Future](#the-future) - -This is 2026. Strap yourself in. - -The gap between teams that can run reliable autonomous loops and teams that can't is widening. The economics are stark: $10/hour for automated development versus $100+/hour for human developers. - -Teams that master robots-first engineering will ship at fundamentally different rates. They'll operate cheaper. They'll iterate faster. They'll compound improvements automatically. - -The developers clinging to human-first workflows will fall behind. Not because they're bad engineers. Because they're optimizing for the wrong constraints. - -Software engineering has changed. Again. It will change again. - -The engineers who thrive are the ones who see each change as an opportunity to redesign from first principles. That's always been true. It's just more obvious now. - -Start with the screwdriver. Master the fundamentals. Then reach for the jackhammer. - -The locomotive is waiting. - -## [Related Reading](#related-reading) - -- [Ralph Wiggum Technique](/blog/guide/mechanics/ralph-wiggum-technique) - The foundation for autonomous loops -- [Thread-Based Engineering](/blog/guide/mechanics/thread-based-engineering) - Framework for scaling agent work -- [Autonomous Agent Loops](/blog/guide/mechanics/autonomous-agent-loops) - Combining Ralph and threads -- [Feedback Loops](/blog/guide/development/feedback-loops) - Verification patterns -- [Context Engineering](/blog/guide/mechanics/context-engineering) - Managing the array - -Last updated on - -[Previous - -Autonomous Agent Loops](/blog/guide/mechanics/autonomous-agent-loops)[Next - -Agentic Practices](/blog/guide/development/agentic-engineering-best-practices) diff --git a/docs/site/src/content/blog/rules-directory.md b/docs/site/src/content/blog/rules-directory.md deleted file mode 100644 index 99347290..00000000 --- a/docs/site/src/content/blog/rules-directory.md +++ /dev/null @@ -1,350 +0,0 @@ ---- -slug: "rules-directory" -title: "Claude Code Rules Directory: Modular Instructions That Scale" -description: "Organize Claude Code instructions into modular files with path-specific targeting. Rules activate only where they matter, saving context tokens." -date: "2025-12-10" -author: "Max Ritter" -tags: [Guide, Workflow] -readingTime: 9 -keywords: "claude, code, directory, instructions, modular, rules, scale, that" ---- - -Mechanics - -# Claude Code Rules Directory: Modular Instructions That Scale - -Organize Claude Code instructions into modular files with path-specific targeting. Rules activate only where they matter, saving context tokens. - -**Problem**: Your CLAUDE.md file has grown unwieldy. React patterns mixed with API guidelines mixed with testing rules. Everything loads every session, even when you're only working on database migrations. - -**Quick Win**: Create your first modular rule: - -```p-4 -mkdir -p .claude/rules -echo "# Testing Rules -- Run tests before committing -- Mock external services in unit tests" > .claude/rules/testing.md -``` - -That rule now loads automatically alongside your CLAUDE.md, keeping concerns separated. - -## [What Is the Rules Directory?](#what-is-the-rules-directory) - -The `.claude/rules/` directory is a **modular alternative to monolithic CLAUDE.md files**. Instead of cramming everything into one file, you organize instructions into multiple markdown files that Claude loads as project memory. - -**Critical detail from Anthropic**: Rules files load with the **same high priority as CLAUDE.md**. This matters because Claude's context window has a priority hierarchy - not all tokens are weighted equally. - -Every `.md` file in `.claude/rules/` automatically becomes part of your project context. No configuration needed. - -```p-4 -.claude/rules/ -├── code-style.md # Formatting and conventions -├── testing.md # Test requirements -├── security.md # Security checklist -└── frontend/ - ├── react.md # React-specific patterns - └── styles.md # CSS conventions -``` - -This structure gives you **separation of concerns** at the instruction level. Update your security rules without touching your styling guidelines. - -## [Path-Specific Rules: The Power Feature](#path-specific-rules-the-power-feature) - -Here's where rules get interesting. You can target rules to specific file patterns using YAML frontmatter: - -```p-4 ---- -paths: src/api/**/*.ts ---- - -# API Development Rules - -- All endpoints must validate input with Zod -- Return consistent error shapes: { error: string, code: number } -- Log all requests with correlation IDs -``` - -This rule \*\*only activates when Claude works on files matching `src/api/**/\*.ts`\*\*. Your API guidelines stay out of the way when you're editing React components. - -### [Multiple Path Patterns](#multiple-path-patterns) - -Target multiple patterns in a single rule: - -```p-4 ---- -paths: - - src/components/**/*.tsx - - src/hooks/**/*.ts ---- - -# React Development Rules - -- Use functional components exclusively -- Extract logic into custom hooks -- Memoize expensive computations -``` - -### [Common Path Patterns](#common-path-patterns) - -| Pattern | Matches | -| --- | --- | -| `src/api/**/*.ts` | All TypeScript files in src/api and subdirectories | -| `*.test.ts` | All test files in any directory | -| `src/components/*.tsx` | Only direct children of components (not nested) | -| `**/*.css` | All CSS files anywhere in the project | - -## [Why Priority Matters: The Monolithic CLAUDE.md Problem](#why-priority-matters-the-monolithic-claudemd-problem) - -Claude's context window isn't flat. Different sources of information receive different priority levels in how the model weighs them during generation. Anthropic confirms that **CLAUDE.md and rules files receive high priority** - Claude treats these instructions as authoritative. - -This created a problem with the old approach: stuffing everything into one massive CLAUDE.md meant *all* of that content received high priority. Your React patterns competed for attention with your API guidelines, even when you were working on database migrations. - -**High priority everywhere = priority nowhere.** - -When everything is marked important, Claude struggles to determine what's actually relevant to the current task. The result: instructions get ignored, context becomes noisy, and Claude's behavior becomes unpredictable. - -### [The Context Priority Hierarchy](#the-context-priority-hierarchy) - -Understanding how Claude weighs different context sources: - -| Source | Priority Level | Implication | -| --- | --- | --- | -| **CLAUDE.md** | High | Treated as authoritative instructions | -| **Rules Directory** | High | Same weight as CLAUDE.md | -| **Skills** | Medium (on-demand) | Loaded only when triggered | -| **Conversation history** | Variable | Decays over long sessions | -| **File contents (Read tool)** | Standard | Normal context, no special weight | - -The rules directory solves the monolithic problem by letting you **distribute high-priority instructions across targeted files**. Your API rules still get high priority - but only when you're working on API files. - -### [Path Targeting = Priority Scoping](#path-targeting--priority-scoping) - -When a rule has `paths` frontmatter, it only loads (and receives high priority) when Claude is working on matching files: - -```p-4 ---- -paths: src/api/**/*.ts ---- - -# These instructions get high priority ONLY during API work -``` - -This is the key insight: **you're not just organizing files, you're scoping when instructions receive elevated attention**. - -## [Rules vs CLAUDE.md vs Skills](#rules-vs-claudemd-vs-skills) - -When do you use each? - -| Feature | Priority | Best For | Loads When | -| --- | --- | --- | --- | -| **CLAUDE.md** | High | Universal operational workflows | Every session | -| **Rules Directory** | High | Domain-specific instructions | Every session (filtered by path) | -| **[Skills](/blog/guide/mechanics/claude-skills-guide)** | Medium | Reusable cross-project expertise | On-demand when triggered | - -**Use CLAUDE.md** for what applies everywhere: routing logic, quality standards, coordination protocols. Keep it lean - everything here competes for high-priority attention. - -**Use rules** for what applies to specific areas: API patterns for API files, test requirements for test files. Path targeting ensures high priority only when relevant. - -**Use skills** for what applies across projects: deployment procedures, code review checklists, brand guidelines. Lower priority until explicitly triggered. - -## [Practical Examples](#practical-examples) - -### [Security Rules for Sensitive Directories](#security-rules-for-sensitive-directories) - -```p-4 ---- -paths: - - src/auth/**/* - - src/payments/**/* ---- - -# Security-Critical Code Rules - -- Never log sensitive data (passwords, tokens, card numbers) -- Validate all inputs at function boundaries -- Use parameterized queries exclusively -- Require explicit authorization checks before data access -``` - -### [Test File Standards](#test-file-standards) - -```p-4 ---- -paths: **/*.test.ts ---- - -# Test Writing Standards - -- Use descriptive test names: "should [action] when [condition]" -- One assertion per test when possible -- Mock external dependencies, never real APIs -- Include edge cases: empty inputs, null values, boundaries -``` - -### [Database Migration Rules](#database-migration-rules) - -```p-4 ---- -paths: prisma/migrations/**/* ---- - -# Migration Safety Rules - -- Always include rollback instructions -- Test migrations on a copy of production data first -- Never delete columns in the same migration that removes code using them -- Add columns as nullable first, populate, then add constraints -``` - -## [Migration from Monolithic CLAUDE.md](#migration-from-monolithic-claudemd) - -If your CLAUDE.md has grown large, you're likely experiencing the priority saturation problem: too much high-priority content competing for attention. Extract domain sections into path-targeted rules: - -**Before** (single 400-line CLAUDE.md): - -```p-4 -# Project Context - -... - -## API Guidelines - -- Validate inputs with Zod -- Return consistent errors - ... - -## React Patterns - -- Use functional components -- Extract hooks - ... - -## Testing Rules - -- Mock external services - ... -``` - -**After** (lean CLAUDE.md + modular rules): - -```p-4 -# CLAUDE.md - Operational Core Only - -## Routing Logic - -- Simple tasks: execute directly -- Complex tasks: delegate to sub-agents - -## Quality Standards - -- Correctness > Maintainability > Performance -``` - -```p-4 -.claude/rules/ -├── api-guidelines.md # API section with paths: src/api/**/* -├── react-patterns.md # React section with paths: src/components/**/* -└── testing-rules.md # Testing section with paths: **/*.test.* -``` - -Your CLAUDE.md stays focused on universal behavior. Domain knowledge lives in targeted rules that only receive high priority when relevant. - -The result: **cleaner priority distribution**. Your core operational instructions always get attention. Domain-specific rules get attention only when Claude is working in their target areas. - -## [User-Level Rules: Personal Defaults Across All Projects](#user-level-rules-personal-defaults-across-all-projects) - -Beyond project-specific rules, you can create personal rules that apply to every project you work on. Place them in `~/.claude/rules/`: - -```p-4 -~/.claude/rules/ -├── preferences.md # Your personal coding preferences -├── workflows.md # Your preferred workflows -└── shortcuts.md # Custom patterns you always want -``` - -User-level rules load before project rules, giving project rules higher priority. This means your personal defaults apply everywhere, but any project can override them. - -This is ideal for preferences that follow you regardless of project: indentation style, commit message format, preferred testing patterns, or anything that reflects how you personally work rather than how a specific project operates. - -## [Brace Expansion in Path Patterns](#brace-expansion-in-path-patterns) - -Path patterns support brace expansion for matching multiple extensions or directories in a single pattern: - -```p-4 ---- -paths: - - "src/**/*.{ts,tsx}" - - "{src,lib}/**/*.ts" ---- - -# TypeScript/React Rules - -- Use strict TypeScript -- Prefer interfaces over type aliases for public APIs -``` - -`{ts,tsx}` matches both `.ts` and `.tsx` files. `{src,lib}` matches both the `src/` and `lib/` directories. This keeps your frontmatter compact when a rule applies to related file types or directories. - -## [Symlinks: Sharing Rules Across Projects](#symlinks-sharing-rules-across-projects) - -The `.claude/rules/` directory supports symlinks, allowing you to maintain a single source of rules shared across multiple projects: - -```p-4 -# Symlink a shared rules directory -ln -s ~/shared-claude-rules .claude/rules/shared - -# Symlink individual rule files -ln -s ~/company-standards/security.md .claude/rules/security.md -``` - -Symlinks are resolved and their contents load normally. Circular symlinks are detected and handled gracefully, so you don't need to worry about infinite loops. - -This pattern works well for organizations where teams share common coding standards. Maintain one canonical rules repository and symlink it into each project. - -## [Recursive Subdirectory Discovery](#recursive-subdirectory-discovery) - -Rules can be organized into subdirectories for better structure. All `.md` files are discovered recursively: - -```p-4 -.claude/rules/ -├── frontend/ -│ ├── react.md -│ └── styles.md -├── backend/ -│ ├── api.md -│ └── database.md -└── general.md -``` - -Every `.md` file in the tree loads automatically. Use subdirectories to keep related rules grouped without sacrificing discoverability. - -## [Best Practices](#best-practices) - -**Keep rules focused**: One concern per file. Security rules separate from styling rules. - -**Use descriptive filenames**: `api-validation.md` beats `rules1.md`. - -**Leverage path targeting**: Rules without paths load everywhere. Add paths to reduce noise. - -**Version control everything**: Rules are code. Review changes, track history, roll back mistakes. - -**Document rule purpose**: Start each file with a brief comment explaining when it applies. - -## [Next Steps](#next-steps) - -1. **Audit your CLAUDE.md**: Identify sections that apply only to specific file types -2. **Extract one rule**: Move your most domain-specific section to `.claude/rules/` -3. **Add path targeting**: Make that rule activate only where it matters -4. **Iterate**: As you work, notice when Claude receives irrelevant context and extract more rules - -For the complete memory architecture and why monolithic files cause problems, see [CLAUDE.md Mastery](/blog/guide/mechanics/claude-md-mastery). To understand how priority fits into broader context strategy, explore [context management](/blog/guide/mechanics/context-management) and [memory optimization](/blog/guide/mechanics/memory-optimization). - -**The goal**: Claude receives exactly the high-priority instructions it needs for the files it's touching. No more, no less. Priority where it matters, silence everywhere else. - -Last updated on - -[Previous - -CLAUDE.md Mastery](/blog/guide/mechanics/claude-md-mastery)[Next - -Terminal Main Thread](/blog/guide/mechanics/terminal-main-thread) diff --git a/docs/site/src/content/blog/sandboxing-claude-code.md b/docs/site/src/content/blog/sandboxing-claude-code.md deleted file mode 100644 index 0a09310f..00000000 --- a/docs/site/src/content/blog/sandboxing-claude-code.md +++ /dev/null @@ -1,147 +0,0 @@ ---- -slug: "sandboxing-claude-code" -title: "Running Claude Code in a Dev Container" -description: "Run Claude Code safely inside a dev container. Full isolation, reproducible environments, and IDE support for VS Code, Cursor, and Windsurf." -date: "2026-01-22" -author: "Max Ritter" -tags: [Guide, Security] -readingTime: 4 -keywords: "Claude Code dev container, devcontainer, Claude Code Docker, Claude Code isolation, dev container setup, VS Code dev container, Claude Code sandbox" ---- - -# Running Claude Code in a Dev Container - -Claude Code runs shell commands on your machine. For full isolation, run it inside a dev container. Your host stays clean, your project gets a reproducible environment, and Claude operates in a safe sandbox. - -## Why Dev Containers? - -Dev containers solve multiple problems at once: - -- **Isolation** — Claude can only access the container filesystem, not your host machine -- **Reproducibility** — Same tools, same versions, every time, on every machine -- **Safety** — Destructive commands stay contained — worst case, rebuild the container -- **Team consistency** — Everyone works in the same environment regardless of their OS - -## How It Works - -A dev container is a Docker container configured for development. Your IDE connects to it over SSH or a remote protocol, and all commands (including Claude Code) run inside it. - -``` -┌─────────────────────────────────────────┐ -│ Host Machine │ -│ ┌───────────────────────────────────┐ │ -│ │ Dev Container │ │ -│ │ ├── Project files (mounted) │ │ -│ │ ├── Claude Code │ │ -│ │ ├── Node/Python/Go toolchain │ │ -│ │ └── All commands run here │ │ -│ └───────────────────────────────────┘ │ -│ IDE connects via remote protocol │ -└─────────────────────────────────────────┘ -``` - -## Setting Up a Dev Container - -Create `.devcontainer/devcontainer.json` in your project: - -```json -{ - "name": "My Project", - "image": "mcr.microsoft.com/devcontainers/typescript-node:20", - "features": { - "ghcr.io/devcontainers/features/node:1": {} - }, - "postCreateCommand": "npm install && npm install -g @anthropic-ai/claude-code", - "forwardPorts": [3000, 8080], - "remoteEnv": { - "ANTHROPIC_API_KEY": "${localEnv:ANTHROPIC_API_KEY}" - } -} -``` - -This gives you: -- A Node.js 20 environment with TypeScript support -- Claude Code installed globally -- Your API key forwarded from the host -- Port forwarding for development servers - -## IDE Support - -Dev containers work with all major editors: - -| Editor | How to Open | -|--------|------------| -| **VS Code** | Install "Dev Containers" extension, then `Ctrl+Shift+P` → "Reopen in Container" | -| **Cursor** | Same as VS Code — uses the same extension | -| **Windsurf** | Same as VS Code — uses the same extension | -| **JetBrains** | Built-in dev container support via Gateway | -| **Terminal only** | `devcontainer up --workspace-folder .` via the CLI | - -## Running Claude Code Inside - -Once inside the dev container, Claude Code works exactly as it does locally: - -```bash -# Start Claude Code -claude - -# Or use Pilot for the full experience -pilot -``` - -Everything Claude does — file edits, shell commands, test runs — happens inside the container. Your host filesystem is untouched. - -## Pilot Shell + Dev Containers - -Pilot's installer detects dev containers automatically. Run the installer inside the container and it sets up everything: - -```bash -# Inside the dev container -curl -fsSL https://pilot-shell.com/install | bash -``` - -Pilot installs its hooks, rules, and tools into the container environment. When you rebuild the container, run the installer again (add it to `postCreateCommand` for automation). - -## Custom Dockerfile for Full Control - -For projects needing specific tools, use a Dockerfile: - -```dockerfile -FROM mcr.microsoft.com/devcontainers/base:ubuntu - -# Install project dependencies -RUN apt-get update && apt-get install -y \ - python3 python3-pip nodejs npm git \ - && rm -rf /var/lib/apt/lists/* - -# Install Claude Code -RUN npm install -g @anthropic-ai/claude-code - -# Install Pilot -RUN curl -fsSL https://pilot-shell.com/install | bash -``` - -Reference it in `devcontainer.json`: - -```json -{ - "build": { - "dockerfile": "Dockerfile" - }, - "remoteEnv": { - "ANTHROPIC_API_KEY": "${localEnv:ANTHROPIC_API_KEY}" - } -} -``` - -## Best Practices - -1. **Pin versions** — Use specific image tags, not `latest` -2. **Forward your API key** — Use `remoteEnv` with `localEnv` so keys stay on your host -3. **Add `postCreateCommand`** — Automate dependency installation and tool setup -4. **Mount only what's needed** — The default mounts your project folder only -5. **Use features** — Dev container features add tools without bloating your Dockerfile - -## Key Takeaway - -Dev containers give you isolation without complexity. No custom sandbox profiles, no OS-specific tooling — just a standardized container that works everywhere. Claude Code runs safely inside, and your host machine stays clean. diff --git a/docs/site/src/content/blog/search-tools.md b/docs/site/src/content/blog/search-tools.md deleted file mode 100644 index e0c9ae65..00000000 --- a/docs/site/src/content/blog/search-tools.md +++ /dev/null @@ -1,209 +0,0 @@ ---- -slug: "search-tools" -title: "Claude Code Search: Web Access Through MCP Servers" -description: "Enable web search in Claude Code with MCP search tools. Learn to install and configure search capabilities for real-time information access." -date: "2025-08-23" -author: "Max Ritter" -tags: [Guide, MCP] -readingTime: 4 -keywords: "access, claude, code, mcp, search, servers, through, tools, web" ---- - -MCP & Extensions - -# Claude Code Search: Web Access Through MCP Servers - -Enable web search in Claude Code with MCP search tools. Learn to install and configure search capabilities for real-time information access. - -**Problem**: Claude Code runs locally with no internet access by default, leaving you disconnected from real-time information, documentation updates, and current development trends. [MCP servers](/blog/tools/mcp-extensions/mcp-basics) fix this. - -**Quick Win**: Add a web search MCP server to your configuration to give Claude Code instant internet access. This transforms Claude Code from an isolated coding assistant into a research-powered development companion. - -## [Understanding MCP Search Integration](#understanding-mcp-search-integration) - -MCP (Model Context Protocol) servers act like specialized plugins that extend Claude Code's capabilities. Think of them as "USB ports" for your AI assistant - web search servers plug directly into Claude Code's processing pipeline, giving it real-time access to current information without breaking your development flow. - -Unlike manual web searches that interrupt your coding, MCP search tools work seamlessly within your terminal. Claude can now research APIs, check documentation, validate code patterns, and stay current with technology updates - all while maintaining context of your project. - -## [Installing Web Search Capabilities](#installing-web-search-capabilities) - -MCP servers are configured through JSON configuration files. The location depends on your setup: - -- **Claude Code CLI**: `~/.claude/settings.json` -- **Claude Desktop**: `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS) or `%APPDATA%\Claude\claude_desktop_config.json` (Windows) - -### [Option 1: Brave Search MCP (Recommended)](#option-1-brave-search-mcp-recommended) - -Brave Search provides privacy-focused, comprehensive search results. Add this to your MCP configuration: - -```p-4 -{ - "mcpServers": { - "brave-search": { - "command": "npx", - "args": ["-y", "@modelcontextprotocol/server-brave-search"], - "env": { - "BRAVE_API_KEY": "your-brave-api-key" - } - } - } -} -``` - -Get your free Brave Search API key at [brave.com/search/api](https://brave.com/search/api/). - -### [Option 2: Tavily Search MCP](#option-2-tavily-search-mcp) - -Tavily excels at technical documentation and development-related queries: - -```p-4 -{ - "mcpServers": { - "tavily": { - "command": "npx", - "args": ["-y", "@tavily/mcp-server"], - "env": { - "TAVILY_API_KEY": "your-tavily-api-key" - } - } - } -} -``` - -### [Option 3: Web Research MCP (Open Source)](#option-3-web-research-mcp-open-source) - -For a self-hosted solution with no API keys required: - -```p-4 -git clone https://github.com/mzxrai/mcp-webresearch -cd mcp-webresearch -npm install -``` - -Then add to your configuration: - -```p-4 -{ - "mcpServers": { - "webresearch": { - "command": "node", - "args": ["/path/to/mcp-webresearch/index.js"] - } - } -} -``` - -## [Using Search in Development Workflows](#using-search-in-development-workflows) - -Once configured, Claude Code can search the web naturally during conversations. - -### [Real-Time API Documentation](#real-time-api-documentation) - -Instead of leaving your terminal to check documentation: - -```p-4 -You: Search for Next.js 15 app router authentication patterns - -Claude: [Searches and provides current, actionable examples] -``` - -### [Technology Comparison Research](#technology-comparison-research) - -Let Claude research and compare technologies for you: - -```p-4 -You: Compare Redux vs Zustand performance - find recent benchmarks - -Claude: [Searches and synthesizes current community recommendations] -``` - -### [Troubleshooting with Current Solutions](#troubleshooting-with-current-solutions) - -When encountering errors, Claude can research solutions in real-time: - -```p-4 -You: Search for solutions to this TypeScript module resolution error - -Claude: [Finds current fixes from documentation and community] -``` - -## [Multiple Search Servers](#multiple-search-servers) - -You can configure multiple search MCP servers for different use cases: - -```p-4 -{ - "mcpServers": { - "brave-search": { - "command": "npx", - "args": ["-y", "@modelcontextprotocol/server-brave-search"], - "env": { - "BRAVE_API_KEY": "your-brave-key" - } - }, - "tavily": { - "command": "npx", - "args": ["-y", "@tavily/mcp-server"], - "env": { - "TAVILY_API_KEY": "your-tavily-key" - } - } - } -} -``` - -Claude will have access to tools from all configured servers and can choose the most appropriate one for each query. - -## [Verifying Your Configuration](#verifying-your-configuration) - -After adding an MCP server, restart Claude Code and verify the connection: - -1. Start a new Claude Code session -2. Ask Claude: "What MCP tools do you have available?" -3. Claude should list the search tools from your configured servers - -If tools are not appearing, check: - -- JSON syntax is valid (no trailing commas, proper quotes) -- File paths are absolute and correct -- API keys are set correctly -- The MCP server package exists and is accessible - -## [Search Query Best Practices](#search-query-best-practices) - -For better search results, be specific in your requests: - -```p-4 -# Less effective -"How do I use databases?" - -# More effective -"Search for Prisma PostgreSQL connection pooling best practices 2025" -``` - -Include: - -- Specific technology names and versions -- The year for time-sensitive information -- Technical terms relevant to your stack - -## [Next Steps](#next-steps) - -Transform your development workflow with these search-enhanced patterns: - -- Enable [MCP Tool Search](/blog/tools/mcp-extensions/mcp-tool-search) for automatic lazy loading of search MCP servers -- Set up [automated research workflows](/blog/guide/development/feedback-loops) that search before you code -- Configure [custom MCP integrations](/blog/tools/mcp-extensions/custom-integrations) for your specific tech stack -- Explore [browser automation MCPs](/blog/tools/mcp-extensions/browser-automation) for deeper web interaction -- Learn about [Context7 integration](/blog/guide/performance/context-preservation) for advanced research capabilities -- Check our [FAQ section](/blog/guide/faq) for common questions and support options - -With web search MCP servers, Claude Code becomes your research-powered development companion, keeping you current with the rapidly evolving tech landscape without breaking your flow. - -Last updated on - -[Previous - -Cursor MCP](/blog/tools/mcp-extensions/cursor-mcp-setup)[Next - -Browser Automation](/blog/tools/mcp-extensions/browser-automation) diff --git a/docs/site/src/content/blog/self-validating-agents.md b/docs/site/src/content/blog/self-validating-agents.md deleted file mode 100644 index b0225d3e..00000000 --- a/docs/site/src/content/blog/self-validating-agents.md +++ /dev/null @@ -1,194 +0,0 @@ ---- -slug: "self-validating-agents" -title: "Self-Validating Claude Code Agents: Automated Quality Checks" -description: "Build Claude Code agents that validate their own output using PostToolUse hooks, Stop hooks, and read-only validator agents." -date: "2026-02-03" -author: "Max Ritter" -tags: [Guide, Hooks] -readingTime: 6 -keywords: "agents, automated, checks, claude, code, quality, self, selfvalidating, validating" ---- - -Hooks - -# Self-Validating Agents in Claude Code: Automated Quality at Every Step - -Build Claude Code agents that validate their own output using PostToolUse hooks, Stop hooks, and read-only validator agents. - -**Problem**: Your Claude Code agents produce output that looks right but fails linting, misses required exports, or skips files entirely. You catch it during review, 20 minutes after the agent finished. - -**Quick Win**: Add a PostToolUse hook directly to an agent definition. Every file this agent writes gets linted automatically, before it ever reaches you: - -```p-4 -# .claude/agents/frontend-builder.md ---- -name: frontend-builder -description: Build React components with automatic quality checks -model: sonnet -hooks: - PostToolUse: - - matcher: "Write|Edit" - hooks: - - type: command - command: 'npx eslint --fix "$CLAUDE_TOOL_INPUT_FILE_PATH" && npx prettier --write "$CLAUDE_TOOL_INPUT_FILE_PATH"' ---- -You are a frontend builder agent. Create React components following -the project's established patterns. Every file you write is automatically -linted and formatted by your embedded hooks. -``` - -This agent cannot produce unlinted code. The validation is part of its identity, not an afterthought you bolt on later. - -## [Three Tiers of Embedded Validation](#three-tiers-of-embedded-validation) - -Self-validating agents work at three levels. Each catches different categories of problems, and they stack. - -**Micro validation** fires on every tool use. PostToolUse hooks on [agent definitions](/blog/guide/agents/agent-fundamentals) run linters, formatters, and type checkers after each file write. Problems get caught within seconds of creation. - -**Macro validation** fires when the agent tries to stop. [Stop hooks](/blog/tools/hooks/stop-hook-task-enforcement) check that the full output meets structural requirements: required files exist, exports are present, tests pass. The agent cannot declare "done" until the checks pass. - -**Team validation** uses a separate agent. A read-only validator agent reviews the builder's complete output with fresh context. This is the [builder-validator pattern](/blog/guide/agents/team-orchestration) applied at the orchestration level. - -## [PostToolUse: Micro Validation on Every Write](#posttooluse-micro-validation-on-every-write) - -[Hooks embedded in agent frontmatter](/blog/tools/hooks/hooks-guide) run only while that agent is active. This scopes validation precisely. Your frontend agent runs ESLint. Your Python agent runs Ruff. Neither interferes with the other. - -Here's a Python agent with Black and mypy validation: - -```p-4 -# .claude/agents/python-builder.md ---- -name: python-builder -description: Build Python modules with automatic formatting and type checking -model: sonnet -hooks: - PostToolUse: - - matcher: "Write|Edit" - hooks: - - type: command - command: 'black "$CLAUDE_TOOL_INPUT_FILE_PATH" && mypy "$CLAUDE_TOOL_INPUT_FILE_PATH" --ignore-missing-imports' ---- -You are a Python builder agent. Write clean, typed Python code. -Your hooks automatically format with Black and check types with mypy. -``` - -The key advantage: these hooks are scoped to the agent. Your project-level [settings](/blog/guide/settings-reference) stay clean. When the orchestrator spawns this agent via the [Task tool](/blog/guide/agents/sub-agent-best-practices), validation travels with the agent automatically. - -## [Stop Hooks: Macro Validation Before Completion](#stop-hooks-macro-validation-before-completion) - -Micro validation catches syntax and formatting. But it won't catch missing files or incomplete implementations. For that, use a Stop hook that runs a validation script when the agent finishes. - -Agent-level Stop hooks in frontmatter are converted to SubagentStop events. This script checks that required output files exist and contain expected content: - -```p-4 -#!/bin/bash -# .claude/scripts/validate-output.sh -# Validates that agent output meets structural requirements - -INPUT=$(cat) -STOP_HOOK_ACTIVE=$(echo "$INPUT" | jq -r '.stop_hook_active // false') - -if [ "$STOP_HOOK_ACTIVE" = "true" ]; then - exit 0 -fi - -# Check that required files exist -REQUIRED_FILES=("src/components/index.ts" "src/components/Button.tsx") -MISSING="" - -for file in "${REQUIRED_FILES[@]}"; do - if [ ! -f "$file" ]; then - MISSING="$MISSING $file" - fi -done - -if [ -n "$MISSING" ]; then - echo "{\"decision\": \"block\", \"reason\": \"Missing required files:$MISSING\"}" - exit 0 -fi - -# Check that index.ts contains exports -if ! grep -q "export" src/components/index.ts; then - echo "{\"decision\": \"block\", \"reason\": \"index.ts has no exports. Add barrel exports for all components.\"}" - exit 0 -fi - -exit 0 -``` - -Wire it into the agent definition: - -```p-4 ---- -name: component-builder -description: Build component libraries with output validation -hooks: - PostToolUse: - - matcher: "Write|Edit" - hooks: - - type: command - command: 'npx prettier --write "$CLAUDE_TOOL_INPUT_FILE_PATH"' - Stop: - - hooks: - - type: command - command: "bash .claude/scripts/validate-output.sh" ---- -``` - -Now this agent has both tiers. Every file gets formatted on write (micro). The full output gets validated before completion (macro). If the Stop hook blocks, the agent continues working until all checks pass. - -## [Read-Only Validator Agents](#read-only-validator-agents) - -For the third tier, create a dedicated validator agent that cannot modify files. The `disallowedTools` field enforces this at the tool level: - -```p-4 -# .claude/agents/output-validator.md ---- -name: output-validator -description: Validate agent output without modifying files. Use after builder agents complete. -model: haiku -disallowedTools: Write, Edit, NotebookEdit ---- - -You are a read-only validator. Your job: - -1. Read all files the builder created or modified -2. Verify exports, type safety, and error handling -3. Run the test suite with Bash -4. Report issues as a list. Do NOT fix anything. - -If all checks pass, say "Validation passed" with a summary. -If issues exist, list each one with file path and line reference. -``` - -This agent literally cannot write files. It can only read and report. Pair it with a builder using [task dependencies](/blog/guide/agents/team-orchestration): - -```p-4 -TaskCreate(subject="Build auth module", description="...") -TaskCreate(subject="Validate auth module", description="Run output-validator on src/auth/") -TaskUpdate(taskId="2", addBlockedBy=["1"]) -``` - -## [When to Use Each Tier](#when-to-use-each-tier) - -**Micro only** (PostToolUse) works well for small, focused tasks where formatting and linting are the main quality concerns. Low overhead, immediate feedback. - -**Micro + macro** (PostToolUse + Stop) fits agents that produce multiple files with structural requirements. The Stop hook catches what linting cannot: missing files, incomplete implementations, failing tests. - -**All three tiers** suits critical code paths where you need both automated checks and an independent review. The validator agent provides a second opinion that the builder's hooks cannot. - -Start with micro validation on your most-used agent. Add a Stop hook the first time an agent delivers incomplete output. Add the validator pattern when you need confidence that the output works as a whole, not just file by file. You can define these agent configurations in your [CLAUDE.md](/blog/guide/mechanics/claude-md-mastery) or as standalone agent files in `.claude/agents/`, whichever fits your [project structure](/blog/guide/agents/sub-agent-design) better. - -## [Beyond Single Agents](#beyond-single-agents) - -Self-validation and team validation aren't competing strategies. They're layers. An agent with embedded PostToolUse hooks and a Stop script handles 90% of quality issues before a validator ever looks at the output. The validator then focuses on integration concerns and architectural correctness instead of catching lint errors. - -Build [custom agents](/blog/guide/agents/custom-agents) with validation baked in from the start. Set up the full [hooks system](/blog/tools/hooks/hooks-guide) for project-wide lifecycle events. And when you need team-level quality assurance, pair your self-validating builders with [read-only validators](/blog/guide/agents/team-orchestration) that catch what automation misses. - -Last updated on - -[Previous - -Stop Hook](/blog/tools/hooks/stop-hook-task-enforcement)[Next - -Session Lifecycle](/blog/tools/hooks/session-lifecycle-hooks) diff --git a/docs/site/src/content/blog/self-validating-ai-agents.md b/docs/site/src/content/blog/self-validating-ai-agents.md deleted file mode 100644 index eb4692c2..00000000 --- a/docs/site/src/content/blog/self-validating-ai-agents.md +++ /dev/null @@ -1,112 +0,0 @@ ---- -slug: "self-validating-ai-agents" -title: "Building Self-Validating AI Agents with Claude Code" -description: "Use Stop hooks, PostToolUse validation, and review agents to ensure Claude checks its own work before responding." -date: "2026-02-03" -author: "Max Ritter" -tags: [Guide, Agents] -readingTime: 4 -keywords: "Claude Code agents, self-validating AI, Stop hook, AI code review, Claude Code validation, AI quality assurance" ---- - -# Building Self-Validating AI Agents with Claude Code - -The most common failure mode in AI-assisted development: Claude says "done" but the work is incomplete. Self-validating agents solve this by checking their own output before responding. - -## The Problem - -Claude is optimistic. It writes code, sees no syntax errors, and declares victory. But "no errors" isn't the same as "correct." Missing edge cases, broken integrations, and untested paths slip through. - -Without validation, you become the quality gate — reviewing every change manually, running tests yourself, checking that the output actually matches what you asked for. - -## Stop Hooks: The Validation Gate - -The Stop hook fires right before Claude responds. If your validation script returns a non-zero exit code, Claude continues working instead of stopping. - -```json -{ - "hooks": { - "Stop": [ - { - "hooks": [ - { - "type": "command", - "command": "python scripts/validate-before-stop.py" - } - ] - } - ] - } -} -``` - -A basic validation script: - -```python -import subprocess -import sys - -# Run tests -result = subprocess.run(["pytest", "-q"], capture_output=True) -if result.returncode != 0: - print("Tests failing - continue working") - sys.exit(1) - -# Check types -result = subprocess.run(["basedpyright", "src"], capture_output=True) -if result.returncode != 0: - print("Type errors found - fix before stopping") - sys.exit(1) - -sys.exit(0) # All clear, Claude can respond -``` - -## PostToolUse: Incremental Validation - -Don't wait until the end to validate. PostToolUse hooks check work after each tool call: - -```json -{ - "hooks": { - "PostToolUse": [ - { - "matcher": "Edit|Write", - "hooks": [ - { - "type": "command", - "command": "ruff check \"$CLAUDE_FILE_PATH\" --fix --quiet" - } - ] - } - ] - } -} -``` - -Every file edit gets linted immediately. Errors are caught in real-time rather than accumulating. - -## Read-Only Validator Agents - -For complex validation, Pilot uses three dedicated review agents that run in parallel: - -- **Compliance reviewer** — Checks implementation matches the plan -- **Quality reviewer** — Checks code quality, testing, security -- **Goal reviewer** — Verifies the implementation achieves its intended outcome, not just that tasks were completed - -These agents have read-only access — they can analyze code but can't modify it. Their findings are collected and the main agent fixes issues automatically. - -## The Validation Stack - -Combine all three layers for comprehensive self-validation: - -| Layer | When | What It Catches | -|-------|------|----------------| -| PostToolUse hooks | Every edit | Syntax errors, lint violations | -| Stop hook | Before responding | Failing tests, type errors | -| Review agents | After all tasks | Design issues, missing coverage | - -Each layer catches different types of problems. Together, they ensure Claude's output is verified before you ever see it. - -## Key Principle - -The best AI agent isn't the one that writes the most code — it's the one that catches its own mistakes. Self-validation turns Claude from a code generator into a reliable engineering partner. diff --git a/docs/site/src/content/blog/session-lifecycle-hooks.md b/docs/site/src/content/blog/session-lifecycle-hooks.md deleted file mode 100644 index ce10ac98..00000000 --- a/docs/site/src/content/blog/session-lifecycle-hooks.md +++ /dev/null @@ -1,447 +0,0 @@ ---- -slug: "session-lifecycle-hooks" -title: "Claude Code Session Hooks: Auto-Load Context Every Time" -description: "SessionStart, SessionEnd, Setup, and PreCompact hooks for Claude Code. Auto-load context at startup and clean up on session end automatically." -date: "2026-01-24" -author: "Max Ritter" -tags: [Guide, Hooks] -readingTime: 7 -keywords: "autoload, claude, code, context, every, hooks, lifecycle, session, time" ---- - -Hooks - -# Claude Code Session Hooks: Auto-Load Context Every Time - -SessionStart, SessionEnd, Setup, and PreCompact hooks for Claude Code. Auto-load context at startup and clean up on session end automatically. - -**Problem**: Every time you start a Claude Code session, you manually remind it about your project state, environment setup, or current tasks. When sessions end, cleanup tasks are forgotten. - -**Quick Win**: Add this SessionStart hook and Claude always knows your git state: - -```p-4 -{ - "hooks": { - "SessionStart": [ - { - "hooks": [ - { - "type": "command", - "command": "echo '## Git' && git branch --show-current && git status --short | head -10" - } - ] - } - ] - } -} -``` - -Now every session starts with context. Zero manual setup. - -## [The Session Lifecycle Hooks](#the-session-lifecycle-hooks) - -Four hooks control session lifecycle: - -| Hook | When It Fires | Can Block? | Use Case | -| --- | --- | --- | --- | -| **Setup** | With `--init` or `--maintenance` | NO | One-time setup, migrations | -| **SessionStart** | Every session start/resume | NO | Load context, set env vars | -| **PreCompact** | Before context compaction | NO | Backup transcripts | -| **SessionEnd** | Session terminates | NO | Cleanup, logging | - -## [SessionStart: Load Context Every Time](#sessionstart-load-context-every-time) - -SessionStart fires when sessions begin or resume. Use it for context that should always be present. - -### [Basic Context Injection](#basic-context-injection) - -```p-4 -{ - "hooks": { - "SessionStart": [ - { - "hooks": [ - { - "type": "command", - "command": "echo '## Project State' && cat .claude/tasks/session-current.md 2>/dev/null || echo 'No active session'" - } - ] - } - ] - } -} -``` - -### [With JSON Output](#with-json-output) - -For structured context injection: - -```p-4 -#!/usr/bin/env python3 -import json -import sys -import subprocess - -def get_project_context(): - try: - branch = subprocess.check_output( - ['git', 'rev-parse', '--abbrev-ref', 'HEAD'], - text=True, stderr=subprocess.DEVNULL - ).strip() - status = subprocess.check_output( - ['git', 'status', '--porcelain'], - text=True, stderr=subprocess.DEVNULL - ).strip() - changes = len(status.split('\n')) if status else 0 - except: - branch, changes = "unknown", 0 - - return f"""=== SESSION CONTEXT === -Git Branch: {branch} -Uncommitted Changes: {changes} -=== END ===""".strip() - -output = { - "hookSpecificOutput": { - "hookEventName": "SessionStart", - "additionalContext": get_project_context() - } -} -print(json.dumps(output)) -sys.exit(0) -``` - -### [SessionStart Matchers](#sessionstart-matchers) - -Target specific session events: - -```p-4 -{ - "hooks": { - "SessionStart": [ - { - "matcher": "startup", - "hooks": [{ "type": "command", "command": "echo 'Fresh session'" }] - }, - { - "matcher": "resume", - "hooks": [{ "type": "command", "command": "echo 'Resumed session'" }] - }, - { - "matcher": "compact", - "hooks": [{ "type": "command", "command": "echo 'Post-compaction'" }] - } - ] - } -} -``` - -- `startup` - New session -- `resume` - From `--resume`, `--continue`, or `/resume` -- `clear` - After `/clear` -- `compact` - After compaction - -### [Persist Environment Variables](#persist-environment-variables) - -SessionStart has access to `CLAUDE_ENV_FILE` for setting session-wide environment variables: - -```p-4 -#!/bin/bash - -# Persist environment changes from nvm, pyenv, etc. -ENV_BEFORE=$(export -p | sort) - -# Setup commands that modify environment -source ~/.nvm/nvm.sh -nvm use 20 - -if [ -n "$CLAUDE_ENV_FILE" ]; then - ENV_AFTER=$(export -p | sort) - comm -13 <(echo "$ENV_BEFORE") <(echo "$ENV_AFTER") >> "$CLAUDE_ENV_FILE" -fi - -exit 0 -``` - -Variables written to `CLAUDE_ENV_FILE` are available in all subsequent bash commands Claude runs. - -## [Setup: One-Time Operations](#setup-one-time-operations) - -Setup hooks run only when explicitly invoked with `--init`, `--init-only`, or `--maintenance`. Use them for operations you don't want on every session. - -### [When to Use Setup vs SessionStart](#when-to-use-setup-vs-sessionstart) - -| Operation | Use Setup | Use SessionStart | -| --- | --- | --- | -| Install dependencies | Yes | No | -| Run database migrations | Yes | No | -| Load git status | No | Yes | -| Set environment variables | Yes | Yes | -| Inject project context | No | Yes | -| Cleanup temp files | Yes (maintenance) | No | - -### [Setup Configuration](#setup-configuration) - -```p-4 -{ - "hooks": { - "Setup": [ - { - "matcher": "init", - "hooks": [ - { - "type": "command", - "command": "npm install && npm run db:migrate" - } - ] - }, - { - "matcher": "maintenance", - "hooks": [ - { - "type": "command", - "command": "npm prune && npm dedupe && rm -rf .cache" - } - ] - } - ] - } -} -``` - -Invoke with: - -```p-4 -claude --init # Runs 'init' matcher -claude --init-only # Runs 'init' matcher, then exits -claude --maintenance # Runs 'maintenance' matcher -``` - -Setup hooks also have access to `CLAUDE_ENV_FILE` for persisting environment variables. - -## [PreCompact: Before Context Loss](#precompact-before-context-loss) - -PreCompact fires before compaction (manual `/compact` or automatic when context fills). - -### [Backup Transcripts](#backup-transcripts) - -```p-4 -#!/usr/bin/env python3 -import json -import sys -import shutil -from pathlib import Path -from datetime import datetime - -input_data = json.load(sys.stdin) -transcript_path = input_data.get('transcript_path', '') -trigger = input_data.get('trigger', 'unknown') - -if transcript_path and Path(transcript_path).exists(): - backup_dir = Path('.claude/backups') - backup_dir.mkdir(parents=True, exist_ok=True) - - timestamp = datetime.now().strftime('%Y%m%d_%H%M%S') - backup_name = f"transcript_{trigger}_{timestamp}.jsonl" - shutil.copy2(transcript_path, backup_dir / backup_name) - - # Keep only last 10 backups - backups = sorted(backup_dir.glob('transcript_*.jsonl')) - for old_backup in backups[:-10]: - old_backup.unlink() - -sys.exit(0) -``` - -### [PreCompact Matchers](#precompact-matchers) - -```p-4 -{ - "hooks": { - "PreCompact": [ - { - "matcher": "auto", - "hooks": [{ "type": "command", "command": "echo 'Auto-compacting...'" }] - }, - { - "matcher": "manual", - "hooks": [{ "type": "command", "command": "echo 'Manual /compact'" }] - } - ] - } -} -``` - -- `auto` - Context window filled, automatic compaction -- `manual` - User ran `/compact` - -### [Create Recovery Markers](#create-recovery-markers) - -Use PreCompact with SessionStart for context recovery. See the [Context Recovery Hook](/blog/tools/hooks/context-recovery-hook) for the complete pattern. - -## [SessionEnd: Cleanup](#sessionend-cleanup) - -SessionEnd fires when sessions terminate. It cannot block termination but can perform cleanup. - -### [Log Session Stats](#log-session-stats) - -```p-4 -#!/usr/bin/env python3 -import json -import sys -from pathlib import Path -from datetime import datetime - -input_data = json.load(sys.stdin) -session_id = input_data.get('session_id', 'unknown') -reason = input_data.get('reason', 'unknown') - -log_dir = Path('.claude/logs') -log_dir.mkdir(parents=True, exist_ok=True) - -log_entry = { - "session_id": session_id, - "ended_at": datetime.now().isoformat(), - "reason": reason -} - -with open(log_dir / 'session-history.jsonl', 'a') as f: - f.write(json.dumps(log_entry) + '\n') - -sys.exit(0) -``` - -### [SessionEnd Reasons](#sessionend-reasons) - -The `reason` field indicates why the session ended: - -- `clear` - User ran `/clear` -- `logout` - User logged out -- `prompt_input_exit` - User exited while prompt was visible -- `other` - Other exit reasons - -## [Complete Lifecycle Example](#complete-lifecycle-example) - -Here's a complete lifecycle configuration: - -```p-4 -{ - "hooks": { - "Setup": [ - { - "matcher": "init", - "hooks": [ - { - "type": "command", - "command": "npm install && echo 'Dependencies installed'" - } - ] - } - ], - - "SessionStart": [ - { - "hooks": [ - { - "type": "command", - "command": "echo '## Context' && git status --short && echo '## Tasks' && cat .claude/tasks/session-current.md 2>/dev/null | head -20" - } - ] - } - ], - - "PreCompact": [ - { - "hooks": [ - { - "type": "command", - "command": "cp \"$CLAUDE_TRANSCRIPT_PATH\" .claude/backups/last-transcript.jsonl 2>/dev/null || true" - } - ] - } - ], - - "SessionEnd": [ - { - "hooks": [ - { - "type": "command", - "command": "echo \"Session ended: $(date)\" >> .claude/logs/sessions.log" - } - ] - } - ] - } -} -``` - -## [Input Payloads](#input-payloads) - -### [SessionStart Input](#sessionstart-input) - -```p-4 -{ - "session_id": "abc123", - "hook_event_name": "SessionStart", - "source": "startup", - "model": "claude-sonnet-4-20250514", - "cwd": "/path/to/project" -} -``` - -### [Setup Input](#setup-input) - -```p-4 -{ - "session_id": "abc123", - "hook_event_name": "Setup", - "trigger": "init", - "cwd": "/path/to/project" -} -``` - -### [PreCompact Input](#precompact-input) - -```p-4 -{ - "session_id": "abc123", - "hook_event_name": "PreCompact", - "transcript_path": "~/.claude/projects/.../transcript.jsonl", - "trigger": "auto", - "custom_instructions": "" -} -``` - -### [SessionEnd Input](#sessionend-input) - -```p-4 -{ - "session_id": "abc123", - "hook_event_name": "SessionEnd", - "reason": "clear", - "cwd": "/path/to/project" -} -``` - -## [Best Practices](#best-practices) - -1. **Keep SessionStart fast** - It runs every session. Heavy operations go in Setup. -2. **Use Setup for one-time work** - Dependency installation, migrations, initial setup. -3. **Backup before compaction** - PreCompact is your last chance to save context. -4. **Log session ends** - SessionEnd is useful for analytics and debugging. -5. **Use matchers wisely** - Different behavior for `startup` vs `resume` vs `compact`. - -## [Next Steps](#next-steps) - -- Set up the main [Hooks Guide](/blog/tools/hooks/hooks-guide) for all 12 hooks -- Configure [Context Recovery](/blog/tools/hooks/context-recovery-hook) for compaction survival -- Use [Stop Hooks](/blog/tools/hooks/stop-hook-task-enforcement) for task enforcement -- Explore [Skill Activation](/blog/tools/hooks/skill-activation-hook) for automatic skill loading - -Last updated on - -[Previous - -Self-Validating Agents](/blog/tools/hooks/self-validating-agents)[Next - -Context Recovery Hook](/blog/tools/hooks/context-recovery-hook) diff --git a/docs/site/src/content/blog/session-memory.md b/docs/site/src/content/blog/session-memory.md deleted file mode 100644 index a00c8cce..00000000 --- a/docs/site/src/content/blog/session-memory.md +++ /dev/null @@ -1,162 +0,0 @@ ---- -slug: "session-memory" -title: "Claude Code Session Memory: Automatic Cross-Session Context" -description: "Claude Code Session Memory auto-recalls past work and writes summaries in the background. Learn how it works and where files live." -date: "2026-02-04" -author: "Max Ritter" -tags: [Guide, Workflow] -readingTime: 6 -keywords: "automatic, claude, code, context, crosssession, memory, session" ---- - -Mechanics - -# Claude Code Session Memory: How Your AI Remembers Across Sessions - -Claude Code Session Memory auto-recalls past work and writes summaries in the background. Learn how it works and where files live. - -**Problem**: You start a new Claude Code session and spend the first five minutes re-explaining what you built yesterday. Claude has no idea you already solved the auth flow, picked a database schema, or decided on the API structure. - -**Quick Win**: Check if Session Memory is already working for you. Open your terminal and look for these messages when you start Claude Code: - -```p-4 -Recalled 3 memories (ctrl+o to expand) -``` - -If you see that, Claude already loaded summaries from your past sessions. Press `ctrl+o` to see exactly what it remembered. If you don't see it yet, keep reading to understand when and how it activates. - -## [What Session Memory Actually Is](#what-session-memory-actually-is) - -Session Memory is Claude Code's automatic background system for remembering what you did across sessions. Unlike [CLAUDE.md](/blog/guide/mechanics/memory-optimization), which you write and maintain manually, Session Memory runs without any input from you. It watches your conversation, extracts the important parts, and saves structured summaries to disk. - -You'll notice two types of terminal messages: - -- **"Recalled X memories"** appears at session start. Claude loaded summaries from previous sessions in this project. -- **"Wrote X memories"** appears periodically during your session. Claude just saved a snapshot of your current work. - -Both messages include `(ctrl+o to expand)` so you can inspect exactly what was recalled or written. - -## [How It Works Under the Hood](#how-it-works-under-the-hood) - -Session Memory runs as a background process during every session. Here's the mechanics. - -### [Storage Location](#storage-location) - -Claude stores session summaries as structured markdown files at: - -```p-4 -~/.claude/projects///session-memory/summary.md -``` - -Each session gets its own directory with its own summary file. These accumulate over time, building a history of your work on each project. - -### [Extraction Cadence](#extraction-cadence) - -Session Memory doesn't save on every message. It follows a specific rhythm: - -- **First extraction**: Triggers after roughly 10,000 tokens of conversation -- **Subsequent updates**: Every ~5,000 tokens or after every 3 tool calls, whichever comes first - -This cadence keeps the summaries useful without burning compute on trivial exchanges. Short "fix this typo" sessions produce minimal summaries. Deep architecture discussions produce detailed ones. - -### [Cross-Session Recall](#cross-session-recall) - -When you start a new session, Claude injects relevant past session summaries into its context. These summaries carry a note: *"from PAST sessions that might not be related to the current task."* Claude uses them as background knowledge, not as active instructions. - -This means Claude won't blindly follow decisions from three weeks ago. It treats past sessions as reference material, giving you the continuity of context without the rigidity of hard-coded instructions. - -## [What Gets Remembered](#what-gets-remembered) - -Each session summary follows a consistent structure: - -- **Session title**: An auto-generated description of what you worked on (e.g., "Implement user dashboard with role-based access") -- **Current status**: Completed items, discussion points, open questions -- **Key results**: Important outcomes, decisions made, patterns chosen -- **Work log**: A chronological record of actions taken during the session - -The summary captures *what* you did and *why*, not a transcript of every message. This compression is what makes it useful. A two-hour session becomes a focused summary that Claude can load in seconds. - -## [The /remember Command](#the-remember-command) - -Session Memory stores raw history. The `/remember` command turns that history into permanent project knowledge. - -When you run `/remember`, Claude reviews your session memories stored at the summary path, identifies recurring patterns across sessions, and proposes updates to `CLAUDE.local.md`. You confirm each proposed addition before it's written. - -For example, if Claude notices you've corrected the same coding pattern across three sessions ("always use server actions instead of API routes"), `/remember` surfaces that as a candidate for [permanent memory](/blog/guide/mechanics/memory-optimization). Once added to your CLAUDE.local.md, Claude follows the pattern from session start instead of needing a reminder. - -Think of it as the bridge between automatic memory and deliberate configuration. - -## [Instant Compaction](#instant-compaction) - -Before Session Memory existed, running `/compact` meant waiting up to two minutes while Claude re-analyzed your entire conversation to produce a summary. Now `/compact` is instant. - -Because Session Memory writes summaries continuously in the background, compaction just loads the pre-written summary into a fresh context window. No re-analysis needed. Your [context management](/blog/guide/mechanics/context-management) workflow gets faster and more reliable. - -This matters most during long sessions. Instead of dreading the compaction pause when you hit 80% context usage, you can compact freely. The summary is always ready. - -## [Availability and Requirements](#availability-and-requirements) - -Session Memory is available on the first-party Anthropic API. If you're using Claude Code through a Claude Pro or Max subscription, it works automatically. - -A few things to know about availability: - -- **API providers**: Bedrock, Vertex, and Foundry users don't have access to Session Memory. The feature requires Anthropic's native API infrastructure. -- **Feature gating**: Session Memory is gated behind the `tengu_session_memory` Statsig feature flag. A related flag, `tengu_sm_compact`, enables the instant compaction behavior. -- **Timeline**: The underlying system has existed since roughly v2.0.64 in late 2025. The visible terminal messages ("Recalled/Wrote memories") became prominent around v2.1.30 and v2.1.31 in early February 2026. - -If you're on a supported plan and don't see the messages, your account may not have the feature flag enabled yet. This is a gradual rollout. - -## [Working With Session Memory](#working-with-session-memory) - -### [Inspect Your Stored Memories](#inspect-your-stored-memories) - -Browse your session memories directly: - -```p-4 -# Find your project's memory directory -ls ~/.claude/projects/ - -# List all sessions for a specific project -ls ~/.claude/projects// - -# Read a specific session's summary -cat ~/.claude/projects///session-memory/summary.md -``` - -### [Maximize What Gets Captured](#maximize-what-gets-captured) - -Session Memory extracts more useful summaries when your sessions have clear structure: - -- **State your intent early**: "I'm building the payment integration using Stripe" gives Claude a clear session title -- **Summarize decisions explicitly**: "We decided on webhook-based sync instead of polling" becomes a key result -- **Ask Claude to document**: "Document the architecture decisions we just made" triggers a richer extraction - -### [Understand the Relationship With CLAUDE.md](#understand-the-relationship-with-claudemd) - -Session Memory and [CLAUDE.md](/blog/guide/mechanics/claude-md-mastery) serve different purposes and work together: - -| Aspect | Session Memory | CLAUDE.md | -| --- | --- | --- | -| **Created by** | Claude (automatic) | You (manual) | -| **Scope** | Per-session snapshots | Persistent project rules | -| **Priority** | Background reference | High-priority instructions | -| **Best for** | Continuity, context recall | Standards, architecture, commands | - -The strongest setup uses both. Session Memory provides continuity between work sessions. CLAUDE.md provides the authoritative rules Claude follows. The `/remember` command bridges the two by promoting recurring patterns from session memory into permanent configuration. - -## [Next Steps](#next-steps) - -- Set up your [CLAUDE.md memory system](/blog/guide/mechanics/memory-optimization) for persistent project instructions -- Learn [context management strategies](/blog/guide/mechanics/context-management) to work within token limits -- Explore [context preservation](/blog/guide/performance/context-preservation) for advanced cross-session workflows -- Understand [context engineering](/blog/guide/mechanics/context-engineering) for production AI systems - -Session Memory is one of those features that works best when you don't think about it. It runs in the background, saves what matters, and loads it when relevant. The next time you start a session and Claude already knows what you did yesterday, that's Session Memory doing its job. - -Last updated on - -[Previous - -Memory Optimization](/blog/guide/mechanics/memory-optimization)[Next - -Output Formatting](/blog/guide/mechanics/output-formatting) diff --git a/docs/site/src/content/blog/settings-reference.md b/docs/site/src/content/blog/settings-reference.md deleted file mode 100644 index 04beae51..00000000 --- a/docs/site/src/content/blog/settings-reference.md +++ /dev/null @@ -1,508 +0,0 @@ ---- -slug: "settings-reference" -title: "Claude Code Settings Reference (Complete Config Guide)" -description: "Complete reference for Claude Code settings.json, environment variables, and the 5-scope hierarchy. Every setting key documented." -date: "2026-02-03" -author: "Max Ritter" -tags: [Guide] -readingTime: 16 -keywords: "claude, code, complete, config, guide, reference, settings" ---- - -# Claude Code Settings Reference: Every Config Option Explained - -Complete reference for Claude Code settings.json, environment variables, and the 5-scope hierarchy. Every setting key documented. - -Most Claude Code frustrations trace back to one root cause: configuration that doesn't match how you actually work. You're either approving every command manually, missing team-shared defaults, or wondering why a setting you changed has no effect. - -The fix is understanding Claude Code's settings system. Not just the keys and values, but the hierarchy that decides which setting wins when multiple scopes conflict. - -**Quick Win**: Add a `$schema` line to your `settings.json` and get instant autocomplete for every option: - -```p-4 -{ - "$schema": "https://json-schema.org/claude-code-settings.json", - "permissions": { - "allow": ["Bash(npm run lint)", "Bash(npm run test *)"], - "deny": ["Read(./.env)", "Read(./.env.*)"] - } -} -``` - -That schema enables autocompletion and inline validation in VS Code, Cursor, and any editor with JSON schema support. - -## [The 5-Scope Hierarchy](#the-5-scope-hierarchy) - -Claude Code settings follow a strict precedence system. Understanding this hierarchy is the difference between "my setting isn't working" and "I put it in the wrong scope." - -### [Scope Precedence (Highest to Lowest)](#scope-precedence-highest-to-lowest) - -| Priority | Scope | Location | Who It Affects | Shared? | -| --- | --- | --- | --- | --- | -| 1 | **Managed** | System directories | All users on machine | Yes (IT-deployed) | -| 2 | **Command line** | CLI flags | Current session only | No | -| 3 | **Local** | `.claude/settings.local.json` | You, this project | No (gitignored) | -| 4 | **Project** | `.claude/settings.json` | All collaborators | Yes (in git) | -| 5 | **User** | `~/.claude/settings.json` | You, all projects | No | - -The rule is straightforward: higher-scoped settings always override lower ones. If your IT team sets a managed policy that denies `Bash(curl *)`, no user or project setting can override it. Period. - -### [When to Use Each Scope](#when-to-use-each-scope) - -**Managed** is for organizations that need enforcement without exceptions: - -- Security policies (deny access to credentials, block destructive commands) -- Compliance rules that apply across every developer and every project -- Standardized hooks or MCP server configurations deployed by IT - -**Command line** is for one-off session overrides: - -- Testing with a different model: `claude --model claude-sonnet-4-5-20250929` -- Running with extra permissions for a specific task -- Debugging with `--debug` flag - -**Local** is your personal playground for a specific repo: - -- Override a project setting that doesn't fit your machine -- Test a hook before proposing it to the team -- Machine-specific paths (your SSH key location, local proxy port) - -**Project** is for team alignment: - -- [Permission rules](/blog/guide/development/permission-management) everyone should follow -- Shared hooks for auto-formatting or linting -- MCP server configurations the whole team uses -- CLAUDE.md instructions for project context - -**User** is your personal defaults: - -- Preferred language, theme, and output style -- Plugins you use across every project -- Global permission rules (like always denying access to `~/.ssh`) - -### [Managed Settings Paths by OS](#managed-settings-paths-by-os) - -Managed settings require administrator privileges and live outside user home directories: - -| Operating System | Path | -| --- | --- | -| **macOS** | `/Library/Application Support/ClaudeCode/` | -| **Linux / WSL** | `/etc/claude-code/` | -| **Windows** | `C:\Program Files\ClaudeCode\` | - -Two files go here: `managed-settings.json` for settings and `managed-mcp.json` for MCP servers. - -## [Complete Settings File Locations](#complete-settings-file-locations) - -Every configuration surface in Claude Code maps to a specific file at each scope: - -| Feature | User | Project (shared) | Local (personal) | -| --- | --- | --- | --- | -| **Settings** | `~/.claude/settings.json` | `.claude/settings.json` | `.claude/settings.local.json` | -| **Subagents** | `~/.claude/agents/` | `.claude/agents/` | N/A | -| **MCP servers** | `~/.claude.json` | `.mcp.json` | `~/.claude.json` (per-project) | -| **Plugins** | `~/.claude/settings.json` | `.claude/settings.json` | `.claude/settings.local.json` | -| **CLAUDE.md** | `~/.claude/CLAUDE.md` | `CLAUDE.md` or `.claude/CLAUDE.md` | `CLAUDE.local.md` | - -Claude Code automatically creates timestamped backups of configuration files and retains the five most recent. So if you break something, your last working config is recoverable. - -## [All Settings Keys by Category](#all-settings-keys-by-category) - -Here is every available key you can put in `settings.json`, organized by what it controls. - -### [General Settings](#general-settings) - -| Key | Description | Default | Example | -| --- | --- | --- | --- | -| `model` | Override the default model | (system default) | `"claude-sonnet-4-5-20250929"` | -| `language` | Claude's preferred response language | English | `"japanese"` | -| `outputStyle` | Adjust system prompt style | (none) | `"Explanatory"` | -| `cleanupPeriodDays` | Days before inactive sessions are deleted | `30` | `20` | -| `autoUpdatesChannel` | Release channel: `"stable"` or `"latest"` | `"latest"` | `"stable"` | -| `showTurnDuration` | Show response timing ("Cooked for 1m 6s") | `true` | `false` | -| `spinnerVerbs` | Customize spinner text | (defaults) | `{"mode": "append", "verbs": ["Pondering"]}` | -| `spinnerTipsEnabled` | Show tips while Claude works | `true` | `false` | -| `terminalProgressBarEnabled` | Terminal progress bar (iTerm2, Windows Terminal) | `true` | `false` | -| `alwaysThinkingEnabled` | Enable extended thinking by default | `false` | `true` | -| `plansDirectory` | Where plan files are stored | `~/.claude/plans` | `"./plans"` | -| `respectGitignore` | `@` file picker respects `.gitignore` | `true` | `false` | -| `companyAnnouncements` | Messages shown at startup (random cycle) | (none) | `["Review guidelines at docs.acme.com"]` | - -### [Permission Settings](#permission-settings) - -These live inside the `"permissions"` object. For a deep dive into how permissions work in practice, see the [permission management guide](/blog/guide/development/permission-management). - -| Key | Description | Example | -| --- | --- | --- | -| `allow` | Rules to auto-allow tool use | `["Bash(npm run lint)", "Read(~/.zshrc)"]` | -| `ask` | Rules that require confirmation | `["Bash(git push *)"]` | -| `deny` | Rules to block tool use entirely | `["WebFetch", "Bash(curl *)", "Read(./.env)"]` | -| `additionalDirectories` | Extra directories Claude can access | `["../docs/", "../shared/"]` | -| `defaultMode` | Default permission mode at launch | `"acceptEdits"` | -| `disableBypassPermissionsMode` | Block `--dangerously-skip-permissions` | `"disable"` | - -**Permission rule evaluation order**: Deny rules are checked first, then ask, then allow. First match wins. - -**Rule syntax examples:** - -| Rule | What It Matches | -| --- | --- | -| `Bash` | All Bash commands | -| `Bash(npm run *)` | Commands starting with `npm run` | -| `Read(./.env)` | Reading the `.env` file | -| `Read(./secrets/**)` | Reading anything in secrets/ | -| `WebFetch(domain:example.com)` | Fetch requests to example.com | - -### [Sandbox Settings](#sandbox-settings) - -These live inside the `"sandbox"` object and control bash command isolation. Filesystem and network restrictions use permission rules (Read, Edit, WebFetch), not sandbox settings. - -| Key | Description | Default | Example | -| --- | --- | --- | --- | -| `enabled` | Enable bash sandboxing | `false` | `true` | -| `autoAllowBashIfSandboxed` | Auto-approve commands when sandboxed | `true` | `true` | -| `excludedCommands` | Commands that run outside sandbox | (none) | `["git", "docker"]` | -| `allowUnsandboxedCommands` | Allow `dangerouslyDisableSandbox` escape | `true` | `false` | -| `enableWeakerNestedSandbox` | Weaker sandbox for Docker (Linux/WSL2) | `false` | `true` | -| `network.allowedDomains` | Outbound domains whitelist | (none) | `["github.com", "*.npmjs.org"]` | -| `network.allowUnixSockets` | Unix socket paths accessible in sandbox | (none) | `["~/.ssh/agent-socket"]` | -| `network.allowAllUnixSockets` | Allow all Unix socket connections | `false` | `true` | -| `network.allowLocalBinding` | Allow binding to localhost (macOS only) | `false` | `true` | -| `network.httpProxyPort` | Custom HTTP proxy port | (auto) | `8080` | -| `network.socksProxyPort` | Custom SOCKS5 proxy port | (auto) | `8081` | - -### [Attribution Settings](#attribution-settings) - -These live inside the `"attribution"` object and control how Claude marks its contributions in git. - -| Key | Description | Default | -| --- | --- | --- | -| `commit` | Text appended to git commit messages | `"Generated with Claude Code..."` + Co-Authored-By trailer | -| `pr` | Text appended to pull request descriptions | `"Generated with Claude Code..."` | - -Set either to an empty string `""` to hide that attribution. The older `includeCoAuthoredBy` key still works but is deprecated. - -```p-4 -{ - "attribution": { - "commit": "Generated with AI\n\nCo-Authored-By: AI ", - "pr": "" - } -} -``` - -### [Plugin Settings](#plugin-settings) - -| Key | Description | Example | -| --- | --- | --- | -| `enabledPlugins` | Toggle plugins on/off | `{"formatter@acme-tools": true}` | -| `extraKnownMarketplaces` | Additional plugin sources | See example below | -| `strictKnownMarketplaces` | (Managed only) Restrict marketplace sources | `[{"source": "github", "repo": "acme/plugins"}]` | - -```p-4 -{ - "enabledPlugins": { - "formatter@acme-tools": true, - "deployer@acme-tools": true, - "analyzer@security-plugins": false - }, - "extraKnownMarketplaces": { - "acme-tools": { - "source": "github", - "repo": "acme-corp/claude-plugins" - } - } -} -``` - -Marketplace source types include `github` (repo), `git` (any URL), `directory` (local path for development), and `hostPattern` (regex matching). - -### [MCP Server Settings](#mcp-server-settings) - -| Key | Description | Example | -| --- | --- | --- | -| `enableAllProjectMcpServers` | Auto-approve all project MCP servers | `true` | -| `enabledMcpjsonServers` | Specific MCP servers to approve | `["memory", "github"]` | -| `disabledMcpjsonServers` | Specific MCP servers to reject | `["filesystem"]` | -| `allowedMcpServers` | (Managed only) MCP server allowlist | `[{"serverName": "github"}]` | -| `deniedMcpServers` | (Managed only) MCP server denylist | `[{"serverName": "filesystem"}]` | - -For a full walkthrough of MCP configuration, see the [MCP basics guide](/blog/tools/mcp-extensions/mcp-basics). - -### [Authentication and Provider Settings](#authentication-and-provider-settings) - -| Key | Description | Example | -| --- | --- | --- | -| `apiKeyHelper` | Script to generate auth value | `"/bin/generate_temp_api_key.sh"` | -| `forceLoginMethod` | Restrict to `claudeai` or `console` | `"claudeai"` | -| `forceLoginOrgUUID` | Auto-select organization during login | `"xxxxxxxx-xxxx-..."` | -| `awsAuthRefresh` | Script to refresh AWS credentials | `"aws sso login --profile myprofile"` | -| `awsCredentialExport` | Script outputting AWS credential JSON | `"/bin/generate_aws_grant.sh"` | -| `otelHeadersHelper` | Script generating OpenTelemetry headers | `"/bin/generate_otel_headers.sh"` | - -### [Hook and Advanced Settings](#hook-and-advanced-settings) - -| Key | Description | Example | -| --- | --- | --- | -| `hooks` | Lifecycle event hook configuration | See [hooks guide](/blog/tools/hooks/hooks-guide) | -| `disableAllHooks` | Disable all hooks | `true` | -| `allowManagedHooksOnly` | (Managed only) Block user/project hooks | `true` | -| `allowManagedPermissionRulesOnly` | (Managed only) Block user/project permission rules | `true` | -| `fileSuggestion` | Custom `@` file autocomplete script | `{"type": "command", "command": "~/.claude/file-suggestion.sh"}` | -| `statusLine` | Custom status line display | `{"type": "command", "command": "~/.claude/statusline.sh"}` | -| `env` | Environment variables for every session | `{"FOO": "bar"}` | - -### [File Suggestion Configuration](#file-suggestion-configuration) - -If your project is a large monorepo where the default file picker is slow, you can replace it with a custom command: - -```p-4 -{ - "fileSuggestion": { - "type": "command", - "command": "~/.claude/file-suggestion.sh" - } -} -``` - -The command receives JSON via stdin with a `query` field (`{"query": "src/comp"}`) and outputs newline-separated file paths to stdout (limited to 15 results). The same environment variables available to [hooks](/blog/tools/hooks/hooks-guide) are accessible here, including `CLAUDE_PROJECT_DIR`. - -## [Essential Environment Variables](#essential-environment-variables) - -Claude Code recognizes roughly 70 environment variables. Most are niche, but about 20 of them show up regularly in real workflows. Here are the ones worth knowing, organized by what you're trying to do. - -### [Model and Provider](#model-and-provider) - -| Variable | Purpose | -| --- | --- | -| `ANTHROPIC_API_KEY` | API key for direct API access | -| `ANTHROPIC_MODEL` | Override the default model | -| `ANTHROPIC_DEFAULT_SONNET_MODEL` | Model name for Sonnet alias | -| `CLAUDE_CODE_SUBAGENT_MODEL` | Model for subagents (separate from main model) | -| `CLAUDE_CODE_USE_BEDROCK` | Route through AWS Bedrock | -| `CLAUDE_CODE_USE_VERTEX` | Route through Google Vertex | - -The model aliases (`ANTHROPIC_DEFAULT_SONNET_MODEL`, `ANTHROPIC_DEFAULT_OPUS_MODEL`, `ANTHROPIC_DEFAULT_HAIKU_MODEL`) are useful when your organization runs custom fine-tuned models behind the standard aliases. Set the alias once and every session picks it up. - -### [Performance Tuning](#performance-tuning) - -| Variable | Purpose | -| --- | --- | -| `CLAUDE_CODE_MAX_OUTPUT_TOKENS` | Max output tokens (default: 32K, max: 64K) | -| `MAX_THINKING_TOKENS` | Extended thinking budget (default: 31,999, set 0 to disable) | -| `CLAUDE_AUTOCOMPACT_PCT_OVERRIDE` | % of context capacity (1-100) triggering auto-compaction | -| `BASH_DEFAULT_TIMEOUT_MS` | Default bash command timeout | -| `BASH_MAX_TIMEOUT_MS` | Maximum bash timeout Claude can set | -| `BASH_MAX_OUTPUT_LENGTH` | Max bash output chars before truncation | - -`CLAUDE_AUTOCOMPACT_PCT_OVERRIDE` is particularly worth knowing about. By default, auto-compaction triggers when context fills to a certain threshold. If you're working on a task that needs deep context and you'd rather compact later (or earlier), this variable gives you control. For more on managing your context window effectively, see the [context management guide](/blog/guide/mechanics/context-management). - -### [Privacy and Telemetry](#privacy-and-telemetry) - -| Variable | Purpose | -| --- | --- | -| `CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC` | Disable updates, telemetry, error reporting all at once | -| `DISABLE_TELEMETRY` | Opt out of Statsig telemetry | -| `DISABLE_ERROR_REPORTING` | Opt out of Sentry error reporting | -| `CLAUDE_CODE_HIDE_ACCOUNT_INFO` | Hide email and org name from UI | -| `DISABLE_AUTOUPDATER` | Disable automatic version updates | - -`CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC` is the all-in-one toggle. It bundles `DISABLE_AUTOUPDATER`, `DISABLE_BUG_COMMAND`, `DISABLE_ERROR_REPORTING`, and `DISABLE_TELEMETRY` into a single switch. Useful for air-gapped or privacy-sensitive environments where you want to minimize outbound connections. - -### [Session Control](#session-control) - -| Variable | Purpose | -| --- | --- | -| `CLAUDE_CODE_TASK_LIST_ID` | Share a task list across multiple sessions | -| `CLAUDE_CODE_ENABLE_TASKS` | Set `false` to revert to old TODO list | -| `CLAUDE_CODE_SHELL` | Override automatic shell detection | -| `CLAUDE_CONFIG_DIR` | Custom config/data directory location | -| `MCP_TIMEOUT` | Timeout in ms for MCP server startup | -| `MCP_TOOL_TIMEOUT` | Timeout in ms for MCP tool execution | - -The MCP timeout variables are worth setting if you run resource-heavy MCP servers (database connections, browser automation). The defaults work for lightweight tools, but anything that needs initialization time benefits from explicit timeouts. - -You can set environment variables in two ways: export them in your shell profile, or add them to the `"env"` object in `settings.json` for persistence across sessions without modifying shell configs. - -## [Practical Configuration Examples](#practical-configuration-examples) - -### [Starter Config (Personal Use)](#starter-config-personal-use) - -A minimal `~/.claude/settings.json` for individual developers: - -```p-4 -{ - "$schema": "https://json-schema.org/claude-code-settings.json", - "permissions": { - "allow": [ - "Bash(npm run *)", - "Bash(git status)", - "Bash(git diff *)", - "Bash(git log *)" - ], - "deny": ["Read(./.env)", "Read(./.env.*)", "Read(~/.ssh/**)"] - }, - "showTurnDuration": true, - "autoUpdatesChannel": "stable" -} -``` - -### [Team Config (Project Scope)](#team-config-project-scope) - -A `.claude/settings.json` committed to your repo: - -```p-4 -{ - "$schema": "https://json-schema.org/claude-code-settings.json", - "permissions": { - "allow": [ - "Bash(npm run lint)", - "Bash(npm run test *)", - "Bash(npx prettier --write *)" - ], - "deny": [ - "Read(./.env)", - "Read(./.env.*)", - "Read(./secrets/**)", - "Bash(rm -rf *)", - "Bash(git push --force *)" - ] - }, - "hooks": { - "PostToolUse": [ - { - "matcher": "Write|Edit", - "hooks": [ - { - "type": "command", - "command": "npx prettier --write \"$CLAUDE_TOOL_INPUT_FILE_PATH\"" - } - ] - } - ] - }, - "attribution": { - "commit": "Generated with Claude Code\n\nCo-Authored-By: Claude ", - "pr": "Generated with Claude Code" - } -} -``` - -### [Enterprise Config (Managed Scope)](#enterprise-config-managed-scope) - -A `managed-settings.json` deployed to system directories: - -```p-4 -{ - "$schema": "https://json-schema.org/claude-code-settings.json", - "permissions": { - "deny": [ - "Bash(curl *)", - "Bash(wget *)", - "Read(./.env)", - "Read(./.env.*)", - "Read(./secrets/**)", - "Read(./config/credentials.*)" - ], - "disableBypassPermissionsMode": "disable" - }, - "sandbox": { - "enabled": true, - "allowUnsandboxedCommands": false, - "network": { - "allowedDomains": [ - "github.com", - "*.npmjs.org", - "registry.yarnpkg.com", - "*.internal.acme.com" - ] - } - }, - "allowManagedHooksOnly": true, - "allowManagedPermissionRulesOnly": true, - "forceLoginMethod": "console", - "strictKnownMarketplaces": [ - { - "source": "github", - "repo": "acme-corp/approved-plugins" - } - ], - "companyAnnouncements": [ - "All code requires review before merge. See docs.acme.com/security", - "Report AI-related security concerns to the security team" - ] -} -``` - -This locks down network access, forces sandbox mode, restricts plugins to approved sources, and prevents users from bypassing permissions. - -## [Settings Precedence in Practice](#settings-precedence-in-practice) - -Understanding precedence prevents the most common configuration headaches. Here are the scenarios that trip people up, with clear answers. - -**Scenario 1: Permission conflict across scopes** - -Your user settings allow `Bash(curl *)`, but the project settings deny it. Which wins? The project scope (priority 4) beats the user scope (priority 5). So the deny applies. But if you really need curl for your machine, add the allow rule to `.claude/settings.local.json` instead. Local scope (priority 3) beats project scope (priority 4), so your local allow overrides the project deny. - -**Scenario 2: Managed override** - -Your team's project `settings.json` allows `Bash(rm -rf *)`. IT deploys a managed setting that denies it. The managed setting wins. Always. No user, local, or project setting can override managed scope. This is by design for security compliance. - -**Scenario 3: Local experimentation** - -You want to test a hook before proposing it to the team. Add it to `.claude/settings.local.json`. It takes priority over the shared `.claude/settings.json` but only applies to you. Claude Code automatically configures git to ignore `.local.` files, so there's no risk of accidentally committing personal settings. - -**Scenario 4: Settings merging** - -Settings don't simply replace each other. They merge. If your user settings allow `Bash(git status)` and your project settings allow `Bash(npm run lint)`, both rules apply. The merge combines permission arrays. But if the same key has different values at different scopes, the higher-priority scope wins for that specific key. - -**Scenario 5: Environment variables in settings vs shell** - -If you set `ANTHROPIC_MODEL` both as a shell export and inside `settings.json`'s `env` object, the shell environment variable takes precedence. The `env` object in settings applies at Claude Code startup, but pre-existing shell variables aren't overwritten. - -## [How Settings Relate to Other Configuration](#how-settings-relate-to-other-configuration) - -Settings files don't exist in isolation. They work alongside several other configuration surfaces. - -**[CLAUDE.md files](/blog/guide/mechanics/claude-md-mastery)** contain instructions and context that Claude reads at startup. Think of settings as "what Claude can do" and CLAUDE.md as "what Claude should know." Settings control permissions, tools, and behavior. CLAUDE.md controls knowledge, conventions, and project context. - -**[MCP servers](/blog/tools/mcp-extensions/mcp-basics)** extend Claude with additional tools. Their configurations live in separate files (`.mcp.json` for project, `~/.claude.json` for user), but settings control which MCP servers get approved and which get blocked. - -**[Hooks](/blog/tools/hooks/hooks-guide)** are configured inside `settings.json` under the `hooks` key. They execute shell commands or LLM prompts at lifecycle events. The `disableAllHooks` and `allowManagedHooksOnly` settings provide top-level control. - -**Plugins** are also managed through `settings.json` via `enabledPlugins` and marketplace configuration. The `strictKnownMarketplaces` managed setting gives administrators control over which plugin sources are allowed. - -**Subagents** live as Markdown files in `~/.claude/agents/` (user) or `.claude/agents/` (project). They aren't configured through `settings.json` directly, but the same scope hierarchy applies to where they're stored. - -## [Config Backup Behavior](#config-backup-behavior) - -Claude Code automatically creates timestamped backups when configuration files change. It keeps the five most recent backups per file. If an update breaks your setup, the previous working version is recoverable without git archaeology. - -This applies to `settings.json`, `.claude.json`, and other core config files. Combined with the local scope for experimentation, you have a solid safety net for trying new configurations. - -## [What to Configure First](#what-to-configure-first) - -If you're just getting started with Claude Code settings, tackle these in order: - -1. **Permission rules** in project settings. Deny access to `.env` files and secrets. Allow your common build/test commands -2. **A PostToolUse hook** for auto-formatting. This eliminates the single biggest source of approval fatigue -3. **Attribution settings** if you want to customize (or hide) the co-authored-by trailer -4. **User-level defaults** for preferences that apply across all your projects - -For a broader overview of the three configuration surfaces (CLAUDE.md, MCP, settings), start with the [configuration basics guide](/blog/guide/configuration-basics). - -## [Next Steps](#next-steps) - -- Set up [CLAUDE.md files](/blog/guide/mechanics/claude-md-mastery) for persistent project context -- Configure [hooks](/blog/tools/hooks/hooks-guide) to automate your workflow -- Explore [MCP servers](/blog/tools/mcp-extensions/mcp-basics) for extending Claude's capabilities -- Learn [permission management](/blog/guide/development/permission-management) patterns for team security -- Review [configuration basics](/blog/guide/configuration-basics) for the full configuration picture - -Last updated on - -[Previous - -Sandboxing Guide](/blog/guide/sandboxing-guide)[Next - -Context Engineering](/blog/guide/mechanics/context-engineering) diff --git a/docs/site/src/content/blog/skill-activation-hook.md b/docs/site/src/content/blog/skill-activation-hook.md deleted file mode 100644 index b27be1b7..00000000 --- a/docs/site/src/content/blog/skill-activation-hook.md +++ /dev/null @@ -1,142 +0,0 @@ ---- -slug: "skill-activation-hook" -title: "Claude Code Skill Hook: Guarantee 100% Loading" -description: "Stop Claude from ignoring your skills. The Skill Activation Hook appends recommendations to prompts before Claude sees them. Zero memory reliance." -date: "2025-12-07" -author: "Max Ritter" -tags: [Guide, Hooks] -readingTime: 4 -keywords: "100, activation, claude, code, guarantee, hook, loading, skill" ---- - -Hooks - -# Claude Code Skill Activation Hook: Guarantee 100% Skill Loading - -Stop Claude from ignoring your skills. The Skill Activation Hook appends recommendations to prompts before Claude sees them. Zero memory reliance. - -**Problem**: You tell Claude Code to load a skill. It forgets. You add instructions to CLAUDE.md. It ignores them. You end up manually reminding Claude about skills that should be automatic. - -**Quick Win**: The Skill Activation Hook intercepts your prompts and appends skill recommendations before Claude sees the message. Claude can't forget because it never had to remember. - -When you type "help me implement a feature", Claude actually sees: - -```p-4 -help me implement a feature - -SKILL ACTIVATION CHECK - -CRITICAL SKILLS (REQUIRED): - -> session-management - -RECOMMENDED SKILLS: - -> git-commits - -ACTION: Use Skill tool BEFORE responding -``` - -Claude now knows exactly which skills to load. No guessing. No forgetting. - -## [How It Works](#how-it-works) - -The hook uses Claude Code's `UserPromptSubmit` event. Every prompt you send triggers this flow: - -1. **You type a message** - Your natural language request -2. **Hook intercepts** - Before Claude sees anything -3. **Pattern matching** - Hook checks `skill-rules.json` for keyword and intent matches -4. **Append recommendations** - Matching skills get added to your message -5. **Claude receives both** - Your prompt plus skill guidance - -The hook runs in milliseconds. You won't notice any delay. - -## [The Matching System](#the-matching-system) - -Two strategies work together: - -**Keyword Matching** - Simple string matching. If your prompt contains "commit" or "git push", the `git-commits` skill triggers. - -**Intent Patterns** - Regex for natural language variation. A pattern like `(implement|build).*?feature` catches "let's implement this feature" and "build a new feature for me". - -## [Configuration: skill-rules.json](#configuration-skill-rulesjson) - -Every skill has triggers defined in `.claude/skills/skill-rules.json`: - -```p-4 -{ - "skills": { - "session-management": { - "enforcement": "suggest", - "priority": "critical", - "promptTriggers": { - "keywords": ["feature", "implement", "build", "refactor"], - "intentPatterns": ["(implement|build).*?feature"] - } - }, - "git-commits": { - "enforcement": "suggest", - "priority": "high", - "promptTriggers": { - "keywords": ["commit", "git push", "commit changes"], - "intentPatterns": ["(create|make).*?commit"] - } - } - } -} -``` - -Priority levels control how the hook groups suggestions: - -- **Critical** - Must load before any work -- **High** - Strongly recommended -- **Medium** - Helpful context -- **Low** - Optional enhancement - -## [Customization for Your Speech Patterns](#customization-for-your-speech-patterns) - -The hook adapts to how you talk. If you always say "push my code" instead of "git push", add it: - -```p-4 -"keywords": ["commit", "git push", "push my code", "commit changes"] -``` - -After creating any new skill, update its triggers in `skill-rules.json`. Then read those triggers and keep those speech patterns in mind when prompting. - -## [Session Intelligence](#session-intelligence) - -The hook tracks what it already recommended. If it suggested `session-management` earlier in your conversation, it won't repeat the suggestion. Less noise, same coverage. - -Session state lives in `recommendation-log.json` and auto-cleans after 7 days. - -## [Common Issues](#common-issues) - -**No suggestions appearing** -Check that your keywords match your actual speech patterns. Run the hook manually to test: - -```p-4 -echo '{"session_id":"test","prompt":"implement a feature"}' | node .claude/hooks/SkillActivationHook/skill-activation-prompt.mjs -``` - -**Suggestions appearing when not needed** -Your keywords may be too broad. Use more specific terms or intent patterns. - -**Duplicate suggestions** -The hook might be configured in both global and project settings. Keep it in one location only. - -## [Next Actions](#next-actions) - -1. Check your `skill-rules.json` matches your vocabulary -2. Add keywords for new skills you create -3. Set up the main [Hooks Guide](/blog/tools/hooks/hooks-guide) for complete hook coverage -4. Configure the [Stop Hook](/blog/tools/hooks/stop-hook-task-enforcement) to enforce task completion -5. Learn more about [CLAUDE.md configuration](/blog/guide/mechanics/claude-md-mastery) to complement the hook -6. Review the [skills guide](/blog/guide/mechanics/claude-skills-guide) if you need to create new skills - -The Skill Activation Hook removes human memory from the equation. You focus on describing what you need. The framework handles which skills Claude should use. That's the point of a framework. - -Last updated on - -[Previous - -Context Recovery Hook](/blog/tools/hooks/context-recovery-hook)[Next - -Permission Hook](/blog/tools/hooks/permission-hook-guide) diff --git a/docs/site/src/content/blog/slash-commands-and-init.md b/docs/site/src/content/blog/slash-commands-and-init.md deleted file mode 100644 index fc773cc0..00000000 --- a/docs/site/src/content/blog/slash-commands-and-init.md +++ /dev/null @@ -1,130 +0,0 @@ ---- -slug: "slash-commands-and-init" -title: "Custom Slash Commands and --init for Claude Code" -description: "Create reusable slash commands and use --init to load different context per session type. Package complex instructions into single invocations." -date: "2026-01-30" -author: "Max Ritter" -tags: [Guide, Configuration] -readingTime: 4 -keywords: "Claude Code commands, slash commands, Claude Code init, custom commands, Claude Code workflow, session context" ---- - -# Custom Slash Commands and --init for Claude Code - -Slash commands let you package complex instructions into single invocations. Combined with `--init`, they enable session-type-specific workflows without custom hooks. - -## Creating Slash Commands - -Add markdown files to `.claude/commands/`: - -```markdown - -Review the current git diff for: -1. Logic errors and edge cases -2. Missing error handling -3. Security vulnerabilities (OWASP top 10) -4. Performance issues - -Show findings grouped by severity (critical → low). -``` - -Invoke with `/review` in any session. - -## Command Parameters - -Commands can accept arguments using `$ARGUMENTS`: - -```markdown - -Write comprehensive tests for: $ARGUMENTS - -Follow TDD methodology: -1. Write failing test first -2. Verify it fails for the right reason -3. Implement minimum code to pass -4. Verify all tests pass -``` - -Usage: `/test the calculateDiscount function in src/pricing.ts` - -## Project vs User Commands - -| Location | Scope | Shared? | -|----------|-------|---------| -| `.claude/commands/` | Project | Yes (committed to git) | -| `~/.claude/commands/` | Global | No (personal) | - -Project commands are team-shared workflows. Global commands are personal shortcuts. - -## Using --init for Session Context - -The `--init` flag runs a slash command at session start: - -```bash -claude --init /commands/backend-context.md -``` - -This loads specific context before you start working. Different init files for different work types: - -```bash -# Backend development -claude --init /commands/backend.md - -# Frontend work -claude --init /commands/frontend.md - -# Code review session -claude --init /commands/review-mode.md -``` - -## Practical Command Examples - -### Deploy checklist - -```markdown - -Pre-deployment checklist: -1. Run full test suite -2. Check for uncommitted changes -3. Verify build succeeds -4. Run linter with zero warnings -5. Check for TODO/FIXME comments in changed files - -Report status for each item. Block if any critical item fails. -``` - -### Quick refactor - -```markdown - -Refactor $ARGUMENTS: -- Extract duplicated logic into shared functions -- Improve variable names for clarity -- Split functions longer than 30 lines -- Keep all existing tests passing -- Run tests after each change -``` - -### Onboarding context - -```markdown - -You're working on [Project Name]. Key architecture: -- Backend: Python/FastAPI in src/api/ -- Frontend: React/TypeScript in src/web/ -- Database: PostgreSQL with SQLAlchemy ORM -- Tests: pytest (backend), vitest (frontend) - -Always run `uv run pytest -q` after backend changes. -Always run `npm test` after frontend changes. -``` - -## How Pilot Uses Commands - -Pilot installs several commands that power its workflow: - -- `/spec` — Triggers the spec-driven development pipeline -- `/sync` — Synchronizes rules and skills with the codebase -- `/learn` — Extracts reusable knowledge into skills - -These commands are markdown files that orchestrate multi-step workflows, proving that slash commands scale from simple shortcuts to complex automations. diff --git a/docs/site/src/content/blog/social-media-mcps.md b/docs/site/src/content/blog/social-media-mcps.md deleted file mode 100644 index 1bdbdac4..00000000 --- a/docs/site/src/content/blog/social-media-mcps.md +++ /dev/null @@ -1,156 +0,0 @@ ---- -slug: "social-media-mcps" -title: "Claude Code Twitter MCP: Working Workaround" -description: "No official social MCPs exist for Claude Code. Here is the browser automation workaround and custom Twitter MCP code that actually works." -date: "2025-08-23" -author: "Max Ritter" -tags: [Guide, MCP] -readingTime: 3 -keywords: "claude, code, mcp, mcps, media, social, twitter, workaround, working" ---- - -MCP & Extensions - -# Claude Code Twitter Posting: The Workaround That Works - -No official social MCPs exist for Claude Code. Here is the browser automation workaround and custom Twitter MCP code that actually works. - -**Problem**: Manually posting across multiple social media platforms while maintaining consistency and engagement is time-consuming and error-prone. - -**Reality Check**: Dedicated social media MCP servers are still emerging. The official MCP ecosystem focuses primarily on developer tools, databases, and file systems. However, you can still automate social media workflows through browser automation and custom MCP servers. - -## [Current State of Social Media MCPs](#current-state-of-social-media-mcps) - -Unlike mature integrations for GitHub or Slack, official social media MCP servers are limited. Most platforms restrict API access, making direct integrations challenging. - -**What exists today:** - -- Browser automation MCPs (Puppeteer, Playwright) that can interact with social platforms -- Custom MCP servers you can build using platform APIs -- Content generation workflows using Claude Code directly - -**What does not exist:** - -- Official `claude mcp install twitter` commands -- Pre-built social media MCP packages in the official registry - -## [Browser Automation Approach](#browser-automation-approach) - -The most reliable method uses Puppeteer MCP to control a browser: - -```p-4 -{ - "mcpServers": { - "puppeteer": { - "command": "npx", - "args": ["-y", "@modelcontextprotocol/server-puppeteer"] - } - } -} -``` - -This enables Claude Code to navigate social platforms, fill forms, and post content through browser automation rather than direct API calls. - -## [Building a Custom Twitter MCP](#building-a-custom-twitter-mcp) - -For direct API access, create your own MCP server. Here is a basic structure: - -```p-4 -// src/twitter-mcp.ts -import { Server } from "@modelcontextprotocol/sdk/server/index.js"; -import { TwitterApi } from "twitter-api-v2"; - -const client = new TwitterApi({ - appKey: process.env.TWITTER_API_KEY, - appSecret: process.env.TWITTER_API_SECRET, - accessToken: process.env.TWITTER_ACCESS_TOKEN, - accessSecret: process.env.TWITTER_ACCESS_SECRET, -}); - -// Define tools for posting, reading timeline, etc. -``` - -Register it in your Claude Code configuration: - -```p-4 -{ - "mcpServers": { - "twitter-custom": { - "command": "node", - "args": ["./dist/twitter-mcp.js"], - "env": { - "TWITTER_API_KEY": "your-key", - "TWITTER_API_SECRET": "your-secret" - } - } - } -} -``` - -## [Content Generation Workflows](#content-generation-workflows) - -Even without direct posting MCPs, Claude Code excels at content creation: - -```p-4 -claude "Write 5 tweet variations about AI productivity, each under 280 characters with relevant hashtags" -``` - -Claude Code understands platform conventions: - -- **LinkedIn**: Professional tone, longer format, industry insights -- **Twitter/X**: Concise, hashtag-optimized, engagement hooks -- **Instagram**: Visual-focused captions with emoji usage - -## [Practical Social Media Workflow](#practical-social-media-workflow) - -**Step 1**: Generate content with Claude Code - -```p-4 -claude "Create a week of social media content about developer tools" -``` - -**Step 2**: Use browser automation to post - -```p-4 -claude "Using Puppeteer, navigate to Twitter and post this tweet: [content]" -``` - -**Step 3**: Export to scheduling tools - -```p-4 -claude "Format this content as a CSV for Buffer import" -``` - -## [API Considerations](#api-considerations) - -Building custom social MCPs requires platform API access: - -| Platform | API Access | Difficulty | -| --- | --- | --- | -| Twitter/X | Paid tiers required | Medium | -| LinkedIn | Restricted to approved apps | High | -| Instagram | Business accounts only | High | -| YouTube | Data API available | Medium | - -Rate limits and authentication complexity vary significantly. Browser automation sidesteps these restrictions but requires more careful implementation. - -## [Next Steps](#next-steps) - -Social media MCP integration is an evolving space. For now, combine browser automation with content generation for the best results. - -**Recommended Reading:** - -- Explore [browser automation MCPs](/blog/tools/mcp-extensions/browser-automation) for Puppeteer setup -- Learn about [custom MCP development](/blog/tools/mcp-extensions/custom-integrations) to build your own connectors -- Set up [search tool MCPs](/blog/tools/mcp-extensions/search-tools) for content research -- Master [MCP basics](/blog/tools/mcp-extensions/mcp-basics) for configuration fundamentals - -The ecosystem is growing rapidly. Check the official MCP registry periodically for new social media integrations as they become available. - -Last updated on - -[Previous - -Browser Automation](/blog/tools/mcp-extensions/browser-automation)[Next - -Custom Integrations](/blog/tools/mcp-extensions/custom-integrations) diff --git a/docs/site/src/content/blog/spec-driven-development.md b/docs/site/src/content/blog/spec-driven-development.md deleted file mode 100644 index 2c91f518..00000000 --- a/docs/site/src/content/blog/spec-driven-development.md +++ /dev/null @@ -1,96 +0,0 @@ ---- -slug: "spec-driven-development" -title: "Spec-Driven Development with Claude Code" -description: "Structure large features with a plan-implement-verify loop. Stop Claude from drifting and ensure every feature matches your requirements." -date: "2026-02-10" -author: "Max Ritter" -tags: [Guide, Workflow] -readingTime: 5 -keywords: "Claude Code spec, spec-driven development, Claude Code planning, AI development workflow, Claude Code features, structured AI coding" ---- - -# Spec-Driven Development with Claude Code - -Large features fail when you let AI freestyle. Without structure, Claude drifts — implementing the wrong thing, skipping edge cases, or building something that doesn't match what you needed. Spec-driven development solves this by adding a plan-implement-verify loop. - -## The Problem with "Just Build It" - -Asking Claude to "add user authentication" without a plan leads to: - -- **Scope creep** — Claude adds features you didn't ask for -- **Wrong assumptions** — It picks JWT when you wanted sessions, or bcrypt when you use Argon2 -- **Incomplete work** — The happy path works, but error handling is missing -- **Lost progress** — Long sessions hit context limits and lose track of what was done - -Spec-driven development fixes all of these by making Claude follow a structured workflow. - -## The Three Phases - -### Phase 1: Plan - -Before writing any code, Claude explores the codebase, understands the architecture, and writes a detailed plan. The plan includes: - -- **Tasks** — Numbered, ordered steps with clear acceptance criteria -- **Files affected** — Which files will be created or modified -- **Dependencies** — Which tasks must complete before others can start -- **Testing strategy** — How each task will be verified - -You review and approve the plan before implementation begins. This is your checkpoint — if Claude misunderstood the requirement, you catch it here, not after hours of coding. - -### Phase 2: Implement - -Claude works through each task using TDD: - -1. Write a failing test for the task -2. Implement the minimum code to pass -3. Run tests, fix failures -4. Mark the task complete, move to the next - -Each task is tracked with progress indicators. If Claude discovers something unexpected during implementation (a missing dependency, a blocking issue), it handles it automatically for minor problems or asks you for architectural decisions. - -### Phase 3: Verify - -After all tasks are complete, an automated review agent checks the work: - -- **Compliance review** — Does the code match the plan? Are all tasks actually done? -- **Quality review** — Code quality, test coverage, security, error handling -- **Goal review** — Does the implementation achieve its intended outcome? Are all artifacts substantive and wired together? - -> **Optional:** The review agent is enabled by default and can be toggled in Console Settings → Reviewers. - -Issues found during verification are fixed automatically. The verify phase loops back to implementation if needed, then re-verifies until clean. - -## When to Use Spec-Driven Development - -| Task | Use Spec? | -|------|-----------| -| Fix a typo | No — just fix it | -| Add a single function | No — too simple | -| New API endpoint with tests | Maybe — depends on complexity | -| New subsystem (auth, payments) | **Yes** — multiple files, architectural decisions | -| Cross-cutting refactor | **Yes** — affects many files, needs coordination | -| Multi-session project | **Yes** — plan file persists across sessions | - -The threshold: if the task touches more than 5 files or requires architectural decisions, spec-driven development pays off. - -## How Pilot Automates This - -Pilot Shell's `/spec` command orchestrates the entire workflow: - -``` -/spec Add password reset with email verification -``` - -This triggers the full plan → implement → verify pipeline. Pilot handles: - -- **Plan verification** — Review agents challenge the plan before you see it (optional, configurable in Console Settings → Reviewers) -- **Worktree isolation** — Implementation happens on a separate branch so your main branch stays clean -- **TDD enforcement** — Hooks ensure tests are written before production code -- **Automatic context management** — If context fills up, auto-compaction preserves state and work continues seamlessly -- **Progress tracking** — Real-time task status visible in your terminal - -The only manual steps are approving the plan and (optionally) reviewing the final changes before merging. - -## Key Insight - -Spec-driven development isn't about bureaucracy. It's about **making the plan the contract**. Claude knows exactly what to build, you know exactly what to expect, and automated verification ensures the result matches both. diff --git a/docs/site/src/content/blog/speed-optimization.md b/docs/site/src/content/blog/speed-optimization.md deleted file mode 100644 index e450ed51..00000000 --- a/docs/site/src/content/blog/speed-optimization.md +++ /dev/null @@ -1,146 +0,0 @@ ---- -slug: "speed-optimization" -title: "Claude Code Speed: Rev the Engine for Faster Development" -description: "Accelerate Claude Code response speed with proven optimization techniques. Learn how to eliminate latency and maximize development velocity." -date: "2025-08-23" -author: "Max Ritter" -tags: [Guide, Performance] -readingTime: 4 -keywords: "claude, code, development, engine, faster, optimization, rev, speed" ---- - -Performance - -# Claude Code Speed: Rev the Engine for Faster Development - -Accelerate Claude Code response speed with proven optimization techniques. Learn how to eliminate latency and maximize development velocity. - -**Problem**: Claude Code feels slow, taking too long to respond to your requests. - -**Quick Win**: Switch to a faster model for simple tasks by typing `/model haiku` in your session. Haiku responds significantly faster than Sonnet for straightforward questions like syntax help, quick explanations, or simple code generation. - -## [The Speed Multiplier Approach](#the-speed-multiplier-approach) - -Most developers waste time waiting for Claude Code responses when they could multiply their velocity through strategic optimization. The key insight: Claude Code's speed depends on three factors you control - model selection, context size, and prompt specificity. - -Speed isn't just about faster responses - it's about maintaining development flow. When Claude Code responds quickly, you stay in the zone longer and accomplish more meaningful work. - -## [Response Time Killers](#response-time-killers) - -**Bloated Context**: As your conversation grows, Claude processes more tokens with each response. Long sessions accumulate context that slows everything down. - -**Model Mismatch**: Using Claude Sonnet for basic questions is like driving a truck to the corner store. Different tasks need different performance profiles. - -**Vague Prompts**: Asking "help me with this code" forces Claude to guess what you need. Specific requests get faster, more accurate responses. - -## [The 3-Round Speed Optimization Process](#the-3-round-speed-optimization-process) - -### [Round 1: Model Selection Strategy](#round-1-model-selection-strategy) - -Match your model to the task complexity using slash commands mid-session: - -```p-4 -/model haiku # Quick questions, syntax help, simple edits -/model sonnet # Complex refactoring, architecture decisions -``` - -Haiku responds significantly faster than Sonnet for simple queries. Switch to Haiku when you need quick answers, then back to Sonnet for deep reasoning tasks. No need to restart your session. - -### [Round 2: Context Management](#round-2-context-management) - -Keep your context lean for faster responses: - -```p-4 -/compact # Compress conversation history when it grows large -/clear # Start fresh when switching to unrelated tasks -``` - -Use `/compact` when you notice responses slowing down. This summarizes your conversation while preserving key context, reducing the tokens Claude processes with each response. - -### [Round 3: Write Specific Prompts](#round-3-write-specific-prompts) - -The fastest optimization requires no commands - just better prompts: - -**Slow**: "Fix this function" -**Fast**: "Add null check for the user parameter in handleSubmit" - -**Slow**: "Help me with the database" -**Fast**: "Write a Prisma query to fetch users with their posts, ordered by createdAt desc" - -Specific prompts eliminate back-and-forth clarification, often cutting your total interaction time in half. - -## [Advanced Speed Techniques](#advanced-speed-techniques) - -**Parallel Sessions**: Open multiple terminal windows for independent tasks. Work on frontend in one session while Claude handles backend in another. - -**Batch Related Tasks**: Instead of three separate requests, combine related work: - -```p-4 -"In the UserProfile component: -1. Add loading state -2. Handle the error case -3. Add the avatar upload button" -``` - -**CLAUDE.md Patterns**: Define project-specific patterns in your CLAUDE.md file. Claude loads this automatically, reducing explanation time for recurring patterns. - -**Shell Aliases**: Create shortcuts for common workflows: - -```p-4 -alias cc="claude" -alias cch="claude --model haiku" -``` - -## [The Cost-Speed Balance](#the-cost-speed-balance) - -Speed optimization directly impacts cost efficiency. Faster responses typically mean: - -- Lower token usage through focused context -- Reduced model costs with strategic Haiku usage -- Higher productivity per dollar spent -- Less context accumulation over time - -Building these habits now creates strategic options as you scale your AI-assisted development. - -## [When Speed Matters Most](#when-speed-matters-most) - -**Tight Feedback Loops**: During active debugging or iteration cycles, response speed directly impacts your problem-solving velocity. Every second matters when you're in flow state. - -**Exploration Phase**: When trying different approaches or experimenting with solutions, faster responses encourage more experimentation. - -**Code Reviews**: Quick responses help maintain context when reviewing changes or getting explanations. - -## [Common Speed Mistakes](#common-speed-mistakes) - -**Never Compacting**: Letting context grow unbounded until responses crawl. Use `/compact` proactively. - -**Sonnet for Everything**: Using the most powerful model for tasks Haiku handles equally well. - -**Serial Thinking**: Waiting for one response before starting the next task instead of running parallel sessions. - -**Vague Requests**: Making Claude guess what you want instead of stating it clearly upfront. - -## [Success Verification](#success-verification) - -You've optimized successfully when: - -- Simple questions get answered almost instantly with Haiku -- You use `/compact` before context bloat slows you down -- You run parallel sessions for independent work -- Your development rhythm stays uninterrupted - -## [Next Actions](#next-actions) - -1. Practice model switching with `/model haiku` and `/model sonnet` -2. Master context management: [Context Management](/blog/guide/mechanics/context-management) -3. Set up your CLAUDE.md: [Configuration Guide](/blog/guide/configuration-basics) -4. Learn parallel workflows: [Development Workflows](/blog/guide/development/feedback-loops) -5. Study efficiency patterns: [Performance Tracking](/blog/guide/performance/efficiency-patterns) - -Last updated on - -[Previous - -Context Preservation](/blog/guide/performance/context-preservation)[Next - -Efficiency Patterns](/blog/guide/performance/efficiency-patterns) diff --git a/docs/site/src/content/blog/statusline-guide.md b/docs/site/src/content/blog/statusline-guide.md deleted file mode 100644 index 01e78e38..00000000 --- a/docs/site/src/content/blog/statusline-guide.md +++ /dev/null @@ -1,485 +0,0 @@ ---- -slug: "statusline-guide" -title: "Claude Code Status Line Setup Guide (Scripts + Examples)" -description: "Set up a custom Claude Code status line showing model name, git branch, cost, and context usage. Includes ready-to-copy scripts." -date: "2026-02-03" -author: "Max Ritter" -tags: [Guide, Tools] -readingTime: 10 -keywords: "claude, code, examples, guide, line, scripts, setup, status, statusline" ---- - -# Claude Code Status Line: Display Model, Cost, and Git Branch in Your Terminal - -Set up a custom Claude Code status line showing model name, git branch, cost, and context usage. Includes ready-to-copy scripts. - -Your Claude Code terminal is missing useful information. The status line fixes that by putting model name, git branch, session cost, and context usage right at the bottom of the interface. - -Think of it like PS1 for Claude Code. If you've ever customized a shell prompt with Oh-my-zsh or Starship, this is the same idea. One line of real-time info that keeps you oriented while you work. - -## [What the Status Line Shows](#what-the-status-line-shows) - -The status line sits at the bottom of the Claude Code interface and updates every time the conversation changes. It can display anything your script outputs: the current model, which git branch you're on, how much you've spent this session, or how full your [context window](/blog/guide/mechanics/context-buffer-management) is. - -Here's what a configured status line looks like in practice: - -```p-4 -[Opus] my-project | main | $0.42 | Context: 37% -``` - -That single line tells you the model, the project folder, the git branch, the session cost so far, and the percentage of your context window used. All updated automatically. - -## [Quick Setup with /statusline](#quick-setup-with-statusline) - -The fastest path to a working status line is the built-in `/statusline` command. Type it directly into Claude Code and it generates a script for you. - -```p-4 -/statusline -``` - -Claude Code will create a status line script that mirrors your terminal prompt by default. But you can also give it specific instructions: - -```p-4 -/statusline show the model name in orange -``` - -```p-4 -/statusline display git branch and session cost -``` - -```p-4 -/statusline show context window percentage with color coding -``` - -That's it. Claude Code writes the script, configures the settings, and the status line appears. If you want more control, keep reading for manual setup. - -## [Manual Setup via settings.json](#manual-setup-via-settingsjson) - -For full control, add a `statusLine` entry to your project's `.claude/settings.json` (or your global `~/.claude/settings.json` for all projects): - -```p-4 -{ - "statusLine": { - "type": "command", - "command": "~/.claude/statusline.sh", - "padding": 0 - } -} -``` - -Three fields to know: - -- **type**: Always `"command"` for script-based status lines -- **command**: Path to the script that generates your status line output -- **padding**: Number of empty lines above the status line (0 is typical) - -After adding this, create the script file and make it executable: - -```p-4 -touch ~/.claude/statusline.sh -chmod +x ~/.claude/statusline.sh -``` - -The `chmod +x` step matters. If your status line doesn't appear, a missing execute permission is almost always the reason. - -## [How the Status Line Engine Works](#how-the-status-line-engine-works) - -Understanding the mechanics helps when debugging or building custom scripts: - -- **Update trigger**: The status line refreshes whenever conversation messages change -- **Throttle**: Updates run at most every 300ms to avoid performance issues -- **Output handling**: Only the first line of stdout from your script becomes the status line text -- **Colors**: Full ANSI color code support for styling -- **Input**: Claude Code pipes a JSON object with session data into your script via stdin - -That last point is the key. Your script receives structured JSON containing the current model, workspace paths, session cost, context window stats, and more. Parse it, format it, print one line to stdout. - -## [The JSON Input Your Script Receives](#the-json-input-your-script-receives) - -Every time the status line updates, your script gets this JSON structure via stdin: - -```p-4 -{ - "hook_event_name": "Status", - "session_id": "abc123...", - "cwd": "/current/working/directory", - "model": { - "id": "claude-opus-4-1", - "display_name": "Opus" - }, - "workspace": { - "current_dir": "/current/working/directory", - "project_dir": "/original/project/directory" - }, - "version": "1.0.80", - "cost": { - "total_cost_usd": 0.01234, - "total_duration_ms": 45000, - "total_api_duration_ms": 2300, - "total_lines_added": 156, - "total_lines_removed": 23 - }, - "context_window": { - "total_input_tokens": 15234, - "total_output_tokens": 4521, - "context_window_size": 200000, - "used_percentage": 42.5, - "remaining_percentage": 57.5, - "current_usage": { - "input_tokens": 8500, - "output_tokens": 1200, - "cache_creation_input_tokens": 5000, - "cache_read_input_tokens": 2000 - } - } -} -``` - -The fields that matter most for practical status lines: - -- **model.display\_name**: Short model name like "Opus" or "Sonnet" -- **workspace.current\_dir**: Where you're working right now -- **cost.total\_cost\_usd**: Running cost of the session in dollars -- **cost.total\_lines\_added / total\_lines\_removed**: Track code changes -- **context\_window.used\_percentage**: Pre-calculated context usage (0-100) -- **context\_window.context\_window\_size**: Total context window capacity - -## [Status Line Scripts You Can Copy](#status-line-scripts-you-can-copy) - -Here are complete, runnable scripts in multiple languages. Pick the one that fits your setup. - -### [Simple Bash Status Line](#simple-bash-status-line) - -The simplest useful status line. Shows model name and current directory: - -```p-4 -#!/bin/bash -input=$(cat) - -MODEL=$(echo "$input" | jq -r '.model.display_name') -CURRENT_DIR=$(echo "$input" | jq -r '.workspace.current_dir') - -echo "[$MODEL] ${CURRENT_DIR##*/}" -``` - -**Output**: `[Opus] my-project` - -This script uses `jq` for JSON parsing. If you don't have it installed, run `brew install jq` on macOS or `sudo apt install jq` on Ubuntu. - -### [Git-Aware Bash Status Line](#git-aware-bash-status-line) - -Adds the current git branch, which is useful when you're juggling feature branches: - -```p-4 -#!/bin/bash -input=$(cat) - -MODEL=$(echo "$input" | jq -r '.model.display_name') -CURRENT_DIR=$(echo "$input" | jq -r '.workspace.current_dir') - -GIT_BRANCH="" -if git rev-parse --git-dir > /dev/null 2>&1; then - BRANCH=$(git branch --show-current 2>/dev/null) - if [ -n "$BRANCH" ]; then - GIT_BRANCH=" | $BRANCH" - fi -fi - -echo "[$MODEL] ${CURRENT_DIR##*/}$GIT_BRANCH" -``` - -**Output**: `[Opus] my-project | feature/auth` - -### [Full-Featured Bash Status Line](#full-featured-bash-status-line) - -Model, git branch, cost, and context percentage all in one line: - -```p-4 -#!/bin/bash -input=$(cat) - -MODEL=$(echo "$input" | jq -r '.model.display_name') -CURRENT_DIR=$(echo "$input" | jq -r '.workspace.current_dir') -COST=$(echo "$input" | jq -r '.cost.total_cost_usd // 0') -PERCENT_USED=$(echo "$input" | jq -r '.context_window.used_percentage // 0') - -# Git branch -GIT_BRANCH="" -if git rev-parse --git-dir > /dev/null 2>&1; then - BRANCH=$(git branch --show-current 2>/dev/null) - if [ -n "$BRANCH" ]; then - GIT_BRANCH=" | $BRANCH" - fi -fi - -# Format cost to 2 decimal places -COST_FMT=$(printf '%.2f' "$COST") - -# Round context percentage -PERCENT_INT=$(printf '%.0f' "$PERCENT_USED") - -echo "[$MODEL] ${CURRENT_DIR##*/}$GIT_BRANCH | \$${COST_FMT} | Ctx: ${PERCENT_INT}%" -``` - -**Output**: `[Opus] my-project | main | $0.42 | Ctx: 37%` - -### [Bash with ANSI Colors](#bash-with-ansi-colors) - -Color-coded output makes information scannable at a glance: - -```p-4 -#!/bin/bash -input=$(cat) - -MODEL=$(echo "$input" | jq -r '.model.display_name') -CURRENT_DIR=$(echo "$input" | jq -r '.workspace.current_dir') -COST=$(echo "$input" | jq -r '.cost.total_cost_usd // 0') -PERCENT_USED=$(echo "$input" | jq -r '.context_window.used_percentage // 0') - -# ANSI colors -ORANGE='\033[38;5;208m' -GREEN='\033[32m' -YELLOW='\033[33m' -RED='\033[31m' -CYAN='\033[36m' -RESET='\033[0m' - -# Color context percentage based on usage -PERCENT_INT=$(printf '%.0f' "$PERCENT_USED") -if [ "$PERCENT_INT" -lt 50 ]; then - CTX_COLOR=$GREEN -elif [ "$PERCENT_INT" -lt 80 ]; then - CTX_COLOR=$YELLOW -else - CTX_COLOR=$RED -fi - -COST_FMT=$(printf '%.2f' "$COST") - -echo -e "${ORANGE}[$MODEL]${RESET} ${CURRENT_DIR##*/} ${CYAN}\$${COST_FMT}${RESET} ${CTX_COLOR}Ctx:${PERCENT_INT}%${RESET}" -``` - -The context percentage turns green below 50%, yellow between 50-80%, and red above 80%. You can immediately see when it's time to [manage your context window](/blog/guide/mechanics/context-buffer-management). - -### [Helper Function Approach for Complex Scripts](#helper-function-approach-for-complex-scripts) - -When your status line script grows, helper functions keep things readable: - -```p-4 -#!/bin/bash -input=$(cat) - -# Helper functions for clean extraction -get_model() { echo "$input" | jq -r '.model.display_name'; } -get_dir() { echo "$input" | jq -r '.workspace.current_dir'; } -get_cost() { echo "$input" | jq -r '.cost.total_cost_usd // 0'; } -get_context() { echo "$input" | jq -r '.context_window.used_percentage // 0'; } -get_added() { echo "$input" | jq -r '.cost.total_lines_added // 0'; } -get_removed() { echo "$input" | jq -r '.cost.total_lines_removed // 0'; } -get_version() { echo "$input" | jq -r '.version'; } - -MODEL=$(get_model) -DIR=$(get_dir) -COST=$(printf '%.2f' "$(get_cost)") -CTX=$(printf '%.0f' "$(get_context)") -ADDED=$(get_added) -REMOVED=$(get_removed) - -echo "[$MODEL] ${DIR##*/} | \$$COST | Ctx:${CTX}% | +$ADDED/-$REMOVED" -``` - -**Output**: `[Opus] my-project | $0.42 | Ctx:37% | +156/-23` - -The `+156/-23` shows lines added and removed in the session. A quick way to gauge how much code has changed. - -### [Python Status Line](#python-status-line) - -If you prefer Python over bash: - -```p-4 -#!/usr/bin/env python3 -import json -import sys -import os -import subprocess - -data = json.load(sys.stdin) - -model = data["model"]["display_name"] -current_dir = os.path.basename(data["workspace"]["current_dir"]) -cost = data.get("cost", {}).get("total_cost_usd", 0) -ctx_pct = data.get("context_window", {}).get("used_percentage", 0) - -# Get git branch -git_branch = "" -try: - result = subprocess.run( - ["git", "branch", "--show-current"], - capture_output=True, text=True, timeout=2 - ) - if result.returncode == 0 and result.stdout.strip(): - git_branch = f" | {result.stdout.strip()}" -except Exception: - pass - -print(f"[{model}] {current_dir}{git_branch} | ${cost:.2f} | Ctx:{ctx_pct:.0f}%") -``` - -### [Node.js Status Line](#nodejs-status-line) - -For JavaScript developers: - -```p-4 -#!/usr/bin/env node -const fs = require("fs"); -const path = require("path"); -const { execSync } = require("child_process"); - -let input = ""; -process.stdin.on("data", (chunk) => (input += chunk)); -process.stdin.on("end", () => { - const data = JSON.parse(input); - - const model = data.model.display_name; - const currentDir = path.basename(data.workspace.current_dir); - const cost = (data.cost?.total_cost_usd || 0).toFixed(2); - const ctxPct = Math.round(data.context_window?.used_percentage || 0); - - // Get git branch - let gitBranch = ""; - try { - const branch = execSync("git branch --show-current", { - encoding: "utf8", - timeout: 2000, - }).trim(); - if (branch) gitBranch = ` | ${branch}`; - } catch (e) {} - - console.log( - `[${model}] ${currentDir}${gitBranch} | $${cost} | Ctx:${ctxPct}%`, - ); -}); -``` - -## [Tracking Context Window Usage](#tracking-context-window-usage) - -Watching your context window is one of the most practical uses for the status line. When context fills up, Claude Code compacts the conversation and you lose detail. Knowing where you stand helps you decide when to [start fresh or compact strategically](/blog/guide/mechanics/context-management). - -**Simple approach** using the pre-calculated percentage: - -```p-4 -#!/bin/bash -input=$(cat) - -MODEL=$(echo "$input" | jq -r '.model.display_name') -PERCENT_USED=$(echo "$input" | jq -r '.context_window.used_percentage // 0') - -echo "[$MODEL] Context: ${PERCENT_USED}%" -``` - -**Advanced approach** with manual calculation from raw token counts: - -```p-4 -#!/bin/bash -input=$(cat) - -MODEL=$(echo "$input" | jq -r '.model.display_name') -CONTEXT_SIZE=$(echo "$input" | jq -r '.context_window.context_window_size') -USAGE=$(echo "$input" | jq '.context_window.current_usage') - -if [ "$USAGE" != "null" ]; then - CURRENT_TOKENS=$(echo "$USAGE" | jq '.input_tokens + .cache_creation_input_tokens + .cache_read_input_tokens') - PERCENT_USED=$((CURRENT_TOKENS * 100 / CONTEXT_SIZE)) - echo "[$MODEL] Context: ${PERCENT_USED}% (${CURRENT_TOKENS}/${CONTEXT_SIZE} tokens)" -else - echo "[$MODEL] Context: 0%" -fi -``` - -The manual approach lets you see raw token numbers alongside the percentage. Useful when you want to know exactly how many tokens you have left, especially when picking between [different models with different context sizes](/blog/models/model-selection). - -## [Tracking Session Cost](#tracking-session-cost) - -The `cost.total_cost_usd` field updates in real time. Displaying it in your status line keeps spending visible without needing to check the dashboard: - -```p-4 -#!/bin/bash -input=$(cat) - -MODEL=$(echo "$input" | jq -r '.model.display_name') -COST=$(echo "$input" | jq -r '.cost.total_cost_usd // 0') -COST_FMT=$(printf '%.2f' "$COST") - -echo "[$MODEL] Session: \$${COST_FMT}" -``` - -If you're on a budget or tracking costs per feature, this is immediately useful. Pair it with [model selection strategies](/blog/models/model-selection) to switch models when a task doesn't need the most expensive option. - -## [Troubleshooting](#troubleshooting) - -**Status line doesn't appear at all** - -The most common cause is a missing execute permission on the script file. Fix it with: - -```p-4 -chmod +x ~/.claude/statusline.sh -``` - -**Script runs but output is empty** - -Your script might be writing to stderr instead of stdout. The status line only reads the first line of stdout. Add a simple `echo "test"` to verify output, then build from there. - -**Testing your script manually** - -You can test without running Claude Code by piping mock JSON into your script: - -```p-4 -echo '{"model":{"display_name":"Test"},"workspace":{"current_dir":"/test"},"cost":{"total_cost_usd":0.5},"context_window":{"used_percentage":25}}' | ~/.claude/statusline.sh -``` - -If that prints the expected output, the script works. If it doesn't, the issue is in parsing. - -**jq not found** - -Install it with your package manager: - -```p-4 -# macOS -brew install jq - -# Ubuntu/Debian -sudo apt install jq - -# Windows (via scoop) -scoop install jq -``` - -## [Creative Status Line Ideas](#creative-status-line-ideas) - -Once you have the basics working, here are some ideas to make your status line more useful: - -- **Lines changed tracker**: Show `+added/-removed` to monitor session productivity -- **Session duration**: Calculate elapsed time from `total_duration_ms` -- **Model ID display**: Show the full model identifier when testing different [model configurations](/blog/models/model-selection) -- **Project vs current directory**: Show both when Claude Code navigates into subdirectories -- **Cost-per-minute**: Divide `total_cost_usd` by `total_duration_ms` to see burn rate -- **Context window bar**: Replace the percentage with a visual bar like `[========--]` -- **Conditional warnings**: Flash a color when context exceeds 80% or cost passes a threshold - -The status line runs a script you control. If you can write it in bash, Python, or Node.js, you can display it. - -## [What to Try Next](#what-to-try-next) - -Your status line is set up. Here are natural next steps: - -- **Manage context proactively**: Use your context percentage display alongside [context buffer management strategies](/blog/guide/mechanics/context-buffer-management) -- **Set up the terminal environment**: Learn [terminal control techniques](/blog/guide/mechanics/terminal-main-thread) for a complete Claude Code workspace -- **Configure project settings**: Make sure your [configuration basics](/blog/guide/configuration-basics) are solid so every session starts with the right context - -Last updated on - -[Previous - -Keyboard Shortcuts](/blog/tools/keybindings-guide)[Next - -Hooks Guide](/blog/tools/hooks/hooks-guide) diff --git a/docs/site/src/content/blog/stop-hook-task-enforcement.md b/docs/site/src/content/blog/stop-hook-task-enforcement.md deleted file mode 100644 index e613a20c..00000000 --- a/docs/site/src/content/blog/stop-hook-task-enforcement.md +++ /dev/null @@ -1,351 +0,0 @@ ---- -slug: "stop-hook-task-enforcement" -title: "Claude Code Stop Hook: Force Task Completion" -description: "Use the Stop Hook to ensure Claude finishes tasks before responding. Run tests automatically, validate output, and prevent incomplete work." -date: "2026-01-24" -author: "Max Ritter" -tags: [Guide, Hooks] -readingTime: 5 -keywords: "claude, code, completion, enforcement, force, hook, stop, task" ---- - -Hooks - -# Claude Code Stop Hook: Force Task Completion Before Claude Stops - -Use the Stop Hook to ensure Claude finishes tasks before responding. Run tests automatically, validate output, and prevent incomplete work. - -**Problem**: Claude finishes responding but the task is incomplete. Tests are failing. Files are half-written. You ask "are you done?" and Claude says yes, but the build is broken. - -**Quick Win**: Add this Stop hook and Claude cannot stop until tests pass: - -```p-4 -{ - "hooks": { - "Stop": [ - { - "hooks": [ - { - "type": "command", - "command": "python .claude/hooks/test-gate.py" - } - ] - } - ] - } -} -``` - -```p-4 -#!/usr/bin/env python3 -import json -import sys -import subprocess - -input_data = json.load(sys.stdin) - -# CRITICAL: Prevent infinite loops -if input_data.get('stop_hook_active', False): - sys.exit(0) - -# Run tests -result = subprocess.run(['npm', 'test'], capture_output=True, timeout=60) - -if result.returncode != 0: - output = { - "decision": "block", - "reason": "Tests are failing. Fix them before completing." - } - print(json.dumps(output)) - sys.exit(0) - -sys.exit(0) -``` - -Now Claude literally cannot stop responding until tests pass. - -## [How the Stop Hook Works](#how-the-stop-hook-works) - -The Stop hook fires every time Claude finishes a response. You can: - -1. **Allow stopping** - Exit 0, Claude stops normally -2. **Block stopping** - Return `{"decision": "block", "reason": "..."}`, Claude continues working -3. **Run validations** - Execute tests, checks, or validations automatically - -### [The Payload](#the-payload) - -```p-4 -{ - "session_id": "uuid-string", - "stop_hook_active": false, - "transcript_path": "/path/to/transcript.jsonl" -} -``` - -The `stop_hook_active` flag is **critical**. When true, Claude is already in a "forced continuation" state from a previous block. Always check this to prevent infinite loops. - -## [Pattern 1: Test Gate](#pattern-1-test-gate) - -Block Claude until all tests pass: - -```p-4 -#!/usr/bin/env python3 -import json -import sys -import subprocess - -input_data = json.load(sys.stdin) - -if input_data.get('stop_hook_active', False): - sys.exit(0) - -result = subprocess.run( - ['npm', 'test', '--passWithNoTests'], - capture_output=True, - timeout=120 -) - -if result.returncode != 0: - # Extract last 10 lines of test output for context - stderr = result.stderr.decode()[-500:] if result.stderr else "" - print(json.dumps({ - "decision": "block", - "reason": f"Tests failing. Output: {stderr}" - })) - sys.exit(0) - -sys.exit(0) -``` - -## [Pattern 2: Build Validation](#pattern-2-build-validation) - -Ensure the project builds before Claude stops: - -```p-4 -#!/usr/bin/env python3 -import json -import sys -import subprocess - -input_data = json.load(sys.stdin) - -if input_data.get('stop_hook_active', False): - sys.exit(0) - -result = subprocess.run( - ['npm', 'run', 'build'], - capture_output=True, - timeout=180 -) - -if result.returncode != 0: - print(json.dumps({ - "decision": "block", - "reason": "Build failed. Fix compilation errors before completing." - })) - sys.exit(0) - -sys.exit(0) -``` - -## [Pattern 3: Lint Check](#pattern-3-lint-check) - -No stopping with lint errors: - -```p-4 -#!/usr/bin/env python3 -import json -import sys -import subprocess - -input_data = json.load(sys.stdin) - -if input_data.get('stop_hook_active', False): - sys.exit(0) - -result = subprocess.run( - ['npx', 'eslint', 'src/', '--max-warnings=0'], - capture_output=True, - timeout=60 -) - -if result.returncode != 0: - print(json.dumps({ - "decision": "block", - "reason": "Lint errors detected. Run eslint --fix or resolve manually." - })) - sys.exit(0) - -sys.exit(0) -``` - -## [Pattern 4: Task Completion Marker](#pattern-4-task-completion-marker) - -Check if a specific task was completed: - -```p-4 -#!/usr/bin/env python3 -import json -import sys -from pathlib import Path - -input_data = json.load(sys.stdin) - -if input_data.get('stop_hook_active', False): - sys.exit(0) - -# Check for incomplete task marker -marker = Path('.claude/incomplete-task') -if marker.exists(): - task_info = marker.read_text().strip() - print(json.dumps({ - "decision": "block", - "reason": f"Task incomplete: {task_info}. Finish it before stopping." - })) - sys.exit(0) - -sys.exit(0) -``` - -Create the marker when starting work: - -```p-4 -echo "Implement user authentication" > .claude/incomplete-task -``` - -Delete it when done: - -```p-4 -rm .claude/incomplete-task -``` - -## [Preventing Infinite Loops](#preventing-infinite-loops) - -The `stop_hook_active` flag prevents loops. Here's why it matters: - -```p-4 -Claude responds → Stop hook fires → "block" → Claude continues - ↓ -Claude responds → Stop hook fires → INFINITE LOOP (without flag check) -``` - -**Always check the flag first**: - -```p-4 -if input_data.get('stop_hook_active', False): - sys.exit(0) # Allow stopping, break the loop -``` - -## [Combining Multiple Checks](#combining-multiple-checks) - -Chain validations in a single hook: - -```p-4 -#!/usr/bin/env python3 -import json -import sys -import subprocess - -input_data = json.load(sys.stdin) - -if input_data.get('stop_hook_active', False): - sys.exit(0) - -checks = [ - (['npm', 'run', 'lint'], "Lint errors"), - (['npm', 'run', 'typecheck'], "Type errors"), - (['npm', 'test'], "Test failures"), -] - -for cmd, error_msg in checks: - result = subprocess.run(cmd, capture_output=True, timeout=120) - if result.returncode != 0: - print(json.dumps({ - "decision": "block", - "reason": f"{error_msg} detected. Fix before completing." - })) - sys.exit(0) - -sys.exit(0) -``` - -## [When to Use Stop Hooks](#when-to-use-stop-hooks) - -**Good use cases**: - -- Ensuring tests pass before "task complete" -- Validating builds succeed -- Checking lint/type errors -- Custom completion criteria - -**Bad use cases**: - -- Long-running operations (60 second timeout) -- Network-dependent checks (flaky) -- Blocking on user input (can't interact) - -## [Configuration](#configuration) - -Add to `.claude/settings.json`: - -```p-4 -{ - "hooks": { - "Stop": [ - { - "hooks": [ - { - "type": "command", - "command": "python .claude/hooks/stop-validation.py" - } - ] - } - ] - } -} -``` - -Multiple hooks run in parallel. If any returns `block`, Claude continues. - -## [Debugging](#debugging) - -**Infinite loop?** - -- Check that you're reading `stop_hook_active` correctly -- Add logging: `echo "stop_hook_active: $stop_hook_active" >> ~/.claude/stop-debug.log` - -**Hook not blocking?** - -- Verify JSON output format: `{"decision": "block", "reason": "..."}` -- Check exit code is 0 (not 2 for blocking) - -**Tests timing out?** - -- 60 second hook timeout -- Run subset of tests or increase efficiency - -## [The "Ralph Wilgum" Pattern](#the-ralph-wilgum-pattern) - -Named after a community technique, this pattern uses Stop hooks to create persistent task loops: - -1. Create task marker at session start -2. Stop hook blocks until marker removed -3. Claude must explicitly complete task to remove marker -4. No accidental "I'm done" when work is incomplete - -This transforms Claude from "best effort" to "guaranteed completion." - -## [Next Steps](#next-steps) - -- Set up the main [Hooks Guide](/blog/tools/hooks/hooks-guide) for all hook types -- Configure [Context Recovery](/blog/tools/hooks/context-recovery-hook) to survive compaction -- Learn [Skill Activation](/blog/tools/hooks/skill-activation-hook) for automatic skill loading -- Explore [Permission Hooks](/blog/tools/hooks/permission-hook-guide) for auto-approval - -Last updated on - -[Previous - -Setup Hooks](/blog/tools/hooks/claude-code-setup-hooks)[Next - -Self-Validating Agents](/blog/tools/hooks/self-validating-agents) diff --git a/docs/site/src/content/blog/sub-agent-best-practices.md b/docs/site/src/content/blog/sub-agent-best-practices.md deleted file mode 100644 index 912bdab9..00000000 --- a/docs/site/src/content/blog/sub-agent-best-practices.md +++ /dev/null @@ -1,186 +0,0 @@ ---- -slug: "sub-agent-best-practices" -title: "Claude Code Sub-Agents: Parallel vs Sequential Patterns" -description: "Configure Claude Code to auto-choose parallel, sequential, or background execution patterns for sub-agents based on task dependencies." -date: "2026-01-08" -author: "Max Ritter" -tags: [Guide, Agents] -readingTime: 6 -keywords: "agent, best, claude, code, parallel, patterns, practices, sequential, sub, subagents, vs" ---- - -Agents - -# Claude Code Sub-Agents: Parallel vs Sequential Patterns - -Configure Claude Code to auto-choose parallel, sequential, or background execution patterns for sub-agents based on task dependencies. - -**Problem**: Your main Claude Code session (the "central AI") spawns sub-agents constantly, but it doesn't inherently know when to run them in parallel versus sequential chains versus background. Without explicit routing rules in your CLAUDE.md, it guesses - and often guesses wrong. - -**Quick Win**: Add this routing decision framework to your CLAUDE.md: - -```p-4 -## Sub-Agent Routing Rules - -**Parallel dispatch** (ALL conditions must be met): - -- 3+ unrelated tasks or independent domains -- No shared state between tasks -- Clear file boundaries with no overlap - -**Sequential dispatch** (ANY condition triggers): - -- Tasks have dependencies (B needs output from A) -- Shared files or state (merge conflict risk) -- Unclear scope (need to understand before proceeding) - -**Background dispatch**: - -- Research or analysis tasks (not file modifications) -- Results aren't blocking your current work -``` - -Your central Claude thread reads these rules and makes smarter delegation decisions automatically. - -## [Teaching Your Central AI to Delegate](#teaching-your-central-ai-to-delegate) - -Here's what most developers miss: Claude Code isn't one AI - it's an orchestration system. Your main chat session is the "central AI" that coordinates specialist sub-agents. The quality of your work depends on how well you've taught that central thread to delegate. - -The Task tool supports three execution modes. Each serves different needs: - -| Pattern | Central AI Uses When | Risk If Wrong Choice | -| --- | --- | --- | -| **Parallel** | Independent domains, no file overlap | Merge conflicts, inconsistent state | -| **Sequential** | Dependencies exist, shared resources | Wasted time on serialized independent work | -| **Background** | Research while user continues working | Lost results if not checked | - -Without explicit rules, your central AI defaults to conservative sequential execution - safe but slow. - -## [Parallel: Domain-Based Splitting](#parallel-domain-based-splitting) - -The central AI should dispatch parallel sub-agents when work spans independent domains. Configure domain-based routing in your CLAUDE.md: - -```p-4 -## Domain Parallel Patterns - -When implementing features across domains, spawn parallel agents: - -- **Frontend agent**: React components, UI state, forms -- **Backend agent**: API routes, server actions, business logic -- **Database agent**: Schema, migrations, queries - -Each agent owns their domain. No file overlap. -``` - -**The critical rule**: Parallel only works when agents touch different files. Your central AI needs to understand domain boundaries to route correctly. - -## [Sequential: Dependency Chains](#sequential-dependency-chains) - -When output from one step feeds the next, the central AI must enforce ordering. Common chains: - -| Chain | Why Sequential | -| --- | --- | -| Schema -> API -> Frontend | Data structure must exist before interfaces | -| Research -> Planning -> Implementation | Understanding before execution | -| Implementation -> Testing -> Security | Build, validate, then audit | - -Add chain definitions to your CLAUDE.md so the central AI recognizes dependency patterns and doesn't parallelize work that must be serial. - -## [Background: Non-Blocking Research](#background-non-blocking-research) - -When the central AI spawns research tasks, it should background them automatically so you can continue working. Press `Ctrl+B` during any sub-agent execution, or configure automatic backgrounding: - -```p-4 -## Background Execution Rules - -Run in background automatically: - -- Web research and documentation lookups -- Codebase exploration and analysis -- Security audits and performance profiling -- Any task where results aren't immediately needed -``` - -Check `/tasks` anytime to see background agent progress. Results surface when complete. See [async workflows](/blog/guide/agents/async-workflows) for the full background execution guide. - -## [Configuring Sub-Agent Behavior](#configuring-sub-agent-behavior) - -Beyond routing rules, Claude Code gives you direct control over sub-agent configuration. - -### [Choose the Sub-Agent Model](#choose-the-sub-agent-model) - -Set `CLAUDE_CODE_SUBAGENT_MODEL` to control which model your sub-agents run on. This is one of the most impactful optimizations for cost and speed: - -```p-4 -# Use a lighter model for sub-agents to save tokens -export CLAUDE_CODE_SUBAGENT_MODEL="claude-sonnet-4-5-20250929" -``` - -A common pattern: run your main session on Opus for complex reasoning while sub-agents handle focused tasks on Sonnet. This cuts costs significantly without sacrificing quality on well-scoped sub-agent work. - -### [Define Persistent Agents in `.claude/agents/`](#define-persistent-agents-in-claudeagents) - -Instead of relying on ad-hoc Task tool invocations, you can define persistent specialist agents as Markdown files with YAML frontmatter in `.claude/agents/`. These agents are available to Claude's orchestrator automatically. - -**Project agents** (`.claude/agents/`) are specific to your repository and shareable with your team. **User agents** (`~/.claude/agents/`) work across all your projects. - -Agents defined here inherit your project's CLAUDE.md context, so they pick up coding standards, conventions, and project-specific instructions without additional configuration. - -### [Restrict Agents with Permission Rules](#restrict-agents-with-permission-rules) - -Use `Task(AgentName)` rules in your [permission settings](/blog/guide/development/permission-management) to control which sub-agents can be invoked: - -```p-4 -{ - "permissions": { - "deny": ["Task(Explore)", "Task(Plan)"] - } -} -``` - -You can also disable agents at launch with the `--disallowedTools` flag: - -```p-4 -claude --disallowedTools "Task(Explore)" -``` - -This is useful for reducing token usage in cost-sensitive environments or preventing autonomous exploration in production codebases. - -## [The Invocation Quality Problem](#the-invocation-quality-problem) - -Most sub-agent failures aren't execution failures - they're invocation failures. The central AI spawns a sub-agent with vague instructions, insufficient context, or unclear deliverables. The sub-agent does its best with bad input. - -**Bad invocation**: "Fix authentication" - -**Good invocation**: "Fix OAuth redirect loop where successful login redirects to /login instead of /dashboard. Reference the auth middleware in src/lib/auth.ts." - -The difference is context density. Sub-agents have temporary context windows - they can't go back and ask clarifying questions. Your central AI needs rules for crafting complete invocations. - -This is where most CLAUDE.md configurations stop. They handle routing but not invocation quality. Professional Claude Code setups include full invocation protocols that ensure sub-agents receive comprehensive context, explicit instructions, relevant file references, and clear success criteria with every dispatch. - -## [Common Orchestration Mistakes](#common-orchestration-mistakes) - -**Over-parallelizing**: Launching 10 parallel agents for a simple feature wastes tokens and creates coordination overhead. Group related micro-tasks. - -**Under-parallelizing**: Running four independent analyses sequentially when they could parallelize. Look for domain independence. - -**Vague invocations**: Sending sub-agents with "implement the feature" instead of specific scope, file references, and expected outputs. - -## [Level Up Your Orchestration](#level-up-your-orchestration) - -The routing rules above will immediately improve how your central AI delegates work. But there's more to professional orchestration: - -- **Constitutional invocation requirements** - ensuring every sub-agent dispatch includes the four essential components -- **Agent routing tables** - mapping task types to specialist agents by domain -- **Context handoff protocols** - preserving state across sequential agent chains -- **Session-based coordination** - tracking multi-phase implementations - -Start with the routing rules. Add them to your [CLAUDE.md](/blog/guide/mechanics/claude-md-mastery) today and watch your central AI make smarter delegation decisions. For deeper patterns, explore [task distribution](/blog/guide/agents/task-distribution) and [agent fundamentals](/blog/guide/agents/agent-fundamentals). - -Last updated on - -[Previous - -Async Workflows](/blog/guide/agents/async-workflows)[Next - -Sub-Agent Design](/blog/guide/agents/sub-agent-design) diff --git a/docs/site/src/content/blog/sub-agent-design.md b/docs/site/src/content/blog/sub-agent-design.md deleted file mode 100644 index 5a6e30ce..00000000 --- a/docs/site/src/content/blog/sub-agent-design.md +++ /dev/null @@ -1,233 +0,0 @@ ---- -slug: "sub-agent-design" -title: "Claude Code Sub-Agents: Split Tasks Across Experts" -description: "Master sub-agent design in Claude Code to handle complex multi-faceted projects. Learn to orchestrate specialized agents for 10x productivity." -date: "2025-08-23" -author: "Max Ritter" -tags: [Guide, Agents] -readingTime: 6 -keywords: "across, agent, claude, code, design, experts, split, sub, subagents, tasks" ---- - -Agents - -# Claude Code Sub Agents: Split Complex Tasks Across Specialized AI - -Master sub-agent design in Claude Code to handle complex multi-faceted projects. Learn to orchestrate specialized agents for 10x productivity. - -**Problem**: Complex coding tasks require multiple expert perspectives, but single Claude sessions get overwhelmed trying to be everything at once. - -**Quick Win**: Add this prompt to any complex review task: - -```p-4 -Create sub-agents and analyze this from these perspectives: -- Senior engineer: Review architecture decisions -- Security expert: Identify vulnerabilities -- Performance reviewer: Find optimization opportunities -``` - -Within minutes, you'll get specialized feedback from three expert viewpoints analyzing in parallel. - -## [Why Single-Agent Analysis Fails](#why-single-agent-analysis-fails) - -When you ask Claude to review code, optimize performance, and check security simultaneously, you get generic advice. Each perspective competes for attention in the same context window, creating shallow analysis across all domains. - -Sub-agents solve this by creating specialized contexts. Each agent focuses on their expertise area using different tools and approaches, then consolidates findings for comprehensive analysis. - -## [How Sub-Agents Work in Claude Code](#how-sub-agents-work-in-claude-code) - -Claude Code offers two primary ways to leverage sub-agents: - -1. **Task Tool**: Claude Code's built-in tool spawns isolated sub-agents with their own context windows -2. **Prompting for Perspectives**: Explicitly request analysis from multiple expert viewpoints - -The Task tool creates true parallel execution, while perspective prompting simulates specialist thinking within a single session. Both approaches dramatically improve analysis quality. - -### [1. Identify Parallelizable Tasks](#1-identify-parallelizable-tasks) - -Perfect candidates for sub-agents: - -- Code review from multiple perspectives -- Research tasks across different technologies -- Documentation review for different audiences -- Performance analysis across different metrics - -Non-parallelizable tasks (avoid sub-agents): - -- File modifications with dependencies -- Sequential build processes -- Database migrations - -### [2. Design Specialist Roles](#2-design-specialist-roles) - -Create specific perspectives for your domain. Here are effective prompt patterns: - -**Code Quality Review:** - -```p-4 -Analyze this codebase using sub-agents with these specialist roles: -- Factual reviewer: Check technical accuracy against documentation -- Senior engineer: Review architecture decisions and patterns -- Security expert: Identify vulnerabilities and attack vectors -- Consistency reviewer: Check coding standards compliance -- Redundancy checker: Find duplicate logic to consolidate -``` - -**User Experience Analysis:** - -```p-4 -Create sub-agents for UX review of this feature: -- Creative thinker: Suggest innovative interaction solutions -- Beginner user: Test ease of use and onboarding friction -- Designer: Evaluate visual hierarchy and spacing -- Marketing analyst: Assess conversion potential -- Accessibility auditor: Check WCAG compliance -``` - -### [3. Orchestrate Analysis](#3-orchestrate-analysis) - -Each sub-agent naturally selects appropriate tools for their domain. Security experts gravitate toward vulnerability scanners, performance reviewers use profiling tools, and architects focus on structural analysis. - -This creates comprehensive coverage you can't achieve with single-agent analysis. - -## [Implementation Strategies](#implementation-strategies) - -### [Use Plan Mode for Safe Analysis](#use-plan-mode-for-safe-analysis) - -Before launching sub-agents on critical code, enter plan mode by pressing **Shift+Tab twice** in Claude Code. This ensures sub-agents analyze without making destructive changes. - -In plan mode, prompt for multi-perspective analysis: - -```p-4 -Use sub-agents to validate this API design from: -- Backend perspective: Data flow and scalability -- Frontend perspective: Consumption patterns and DX -- Security perspective: Authentication and authorization gaps -``` - -Plan mode is especially valuable when sub-agents might otherwise attempt automatic fixes. - -### [The Consolidation Pattern](#the-consolidation-pattern) - -After sub-agents complete their analysis, consolidate findings: - -1. **Individual Reports**: Each agent documents their findings -2. **Conflict Resolution**: Address contradictory recommendations -3. **Priority Ranking**: Order suggestions by impact -4. **Action Plan**: Create step-by-step implementation - -### [Common Error Patterns](#common-error-patterns) - -**Mistake**: Using sub-agents for simple tasks - -Don't spawn sub-agents for trivial fixes like typos or single-line changes. The overhead eliminates any benefit. - -**Better**: Reserve sub-agents for complex, multi-faceted problems: - -```p-4 -Use sub-agents to redesign this authentication system: -- Security expert: Audit current vulnerabilities -- UX designer: Simplify the login flow -- Performance engineer: Optimize token handling -``` - -**Mistake**: Creating too many overlapping roles - -Avoid redundant perspectives like "security expert, penetration tester, vulnerability scanner, security architect" - these overlap significantly. - -**Better**: Choose distinct, complementary perspectives that cover different dimensions of the problem. - -## [Background Execution: Async Sub-Agents](#background-execution-async-sub-agents) - -When Claude Code spawns sub-agents, you can now background them and continue working. Press `Ctrl+B` while a sub-agent runs: - -```p-4 -You: Audit our authentication module for security issues -Claude: I'll spawn a sub-agent to analyze the auth module... -[Sub-agent starts] -You: [Press Ctrl+B] -You: While that runs, let's optimize the database queries... -``` - -Monitor background agents with `/tasks`. When the sub-agent completes, it wakes up the main agent with results. - -This transforms sub-agents from blocking operations into true parallel workflows. For the complete async workflow guide, see [Background Agents & Parallel Execution](/blog/guide/agents/async-workflows). - -## [Performance Optimization](#performance-optimization) - -Sub-agents maximize Claude Sonnet's capabilities without upgrading to expensive Opus pricing. Parallel analysis delivers Opus-level insights at Sonnet costs. - -Key cost benefits: - -- Multiple expert perspectives in single session -- Parallel processing reduces total time -- Specialized context prevents shallow analysis -- Better results than single expensive model -- Background execution eliminates waiting - -## [Advanced Orchestration Patterns](#advanced-orchestration-patterns) - -### [Role Rotation Strategy](#role-rotation-strategy) - -For large projects, rotate sub-agent perspectives across different components: - -**Week 1 - Core Architecture:** - -```p-4 -Analyze the database design using sub-agents: -- Data architect: Schema optimization and normalization -- Security expert: Access control and encryption -- Performance optimizer: Query patterns and indexing -``` - -**Week 2 - API Layer:** - -```p-4 -Review API endpoints with these specialist sub-agents: -- Backend engineer: Implementation quality and patterns -- Documentation writer: API clarity and examples -- Integration specialist: Third-party compatibility -``` - -### [Iterative Refinement](#iterative-refinement) - -Use sub-agents for progressive improvement: - -1. Initial analysis with broad perspectives -2. Deep dive with specialist roles -3. Final review with user-focused roles - -This creates comprehensive, user-centered solutions that single agents miss. - -## [When Sub-Agents Excel](#when-sub-agents-excel) - -Sub-agents deliver maximum value for: - -- **Architecture Reviews**: Multiple technical perspectives -- **Documentation Audits**: Different audience viewpoints -- **Code Quality Gates**: Various quality dimensions -- **Product Strategy**: Cross-functional insights -- **Competitive Analysis**: Different market angles - -Start with code reviews, then expand to strategic planning as you develop an "itch for parallelism." - -## [Next Steps](#next-steps) - -Master sub-agent orchestration with these resources: - -- **Execution patterns**: Learn [when to use parallel, sequential, or background](/blog/guide/agents/sub-agent-best-practices) for optimal results -- **Foundation**: Start with [Agent Fundamentals](/blog/guide/agents/agent-fundamentals) to understand the basics -- **Implementation**: Practice with [Custom Agents](/blog/guide/agents/custom-agents) for specialized scenarios -- **Coordination**: Learn [Task Distribution](/blog/guide/agents/task-distribution) for complex project management -- **Optimization**: Explore [Planning Modes](/blog/guide/mechanics/planning-modes) for safe sub-agent execution -- **Context Management**: Master [Context Preservation](/blog/guide/performance/context-preservation) to maintain quality across agents - -Try sub-agents on your next code review. You'll immediately notice the difference specialist perspectives make. - -Last updated on - -[Previous - -Sub-Agent Patterns](/blog/guide/agents/sub-agent-best-practices)[Next - -Task Distribution](/blog/guide/agents/task-distribution) diff --git a/docs/site/src/content/blog/task-distribution.md b/docs/site/src/content/blog/task-distribution.md deleted file mode 100644 index 85f659eb..00000000 --- a/docs/site/src/content/blog/task-distribution.md +++ /dev/null @@ -1,176 +0,0 @@ ---- -slug: "task-distribution" -title: "Claude Code Task Management: Distribute Work Across Agents" -description: "Master task distribution in Claude Code to parallelize complex projects. Learn agent coordination strategies that 5x your development speed." -date: "2025-08-23" -author: "Max Ritter" -tags: [Guide, Agents] -readingTime: 6 -keywords: "across, agents, claude, code, distribute, distribution, management, task, work" ---- - -Agents - -# Claude Code Task Management: Distribute Work Across Agents - -Master task distribution in Claude Code to parallelize complex projects. Learn agent coordination strategies that 5x your development speed. - -**Problem**: Complex projects in Claude Code get bottlenecked by single-threaded execution. You watch Claude do one task at a time when it could parallelize work across multiple agents, dramatically slowing your development velocity. - -**Quick Win**: Add this delegation pattern to your CLAUDE.md file, then reference it when requesting complex features: - -```p-4 -# Feature Implementation Pattern -When implementing features, use 7-parallel-Task distribution: -1. **Component**: Create main component file -2. **Styles**: Create component CSS/styling -3. **Tests**: Create test files -4. **Types**: Create TypeScript definitions -5. **Hooks**: Create custom hooks/utilities -6. **Integration**: Update routing and imports -7. **Config**: Update docs and package.json -``` - -When you request a feature, Claude reads your CLAUDE.md instructions and spawns multiple Task agents working simultaneously instead of queuing tasks sequentially. - -## [Understanding Task Agent Orchestration](#understanding-task-agent-orchestration) - -Claude Code's **Task tool** is the mechanism behind parallel execution. When Claude invokes the Task tool, it spawns an independent sub-agent that runs in its own context window. The main Claude agent carries interactive overhead - waiting for human responses, context switching between operations, maintaining conversation state. Task sub-agents eliminate these bottlenecks by executing specialized work in parallel. - -By default, Claude uses the Task tool conservatively for basic operations like file reads, searches, and content fetching. This cautious approach avoids conflicts from concurrent write operations, but severely limits throughput for complex development work. Your CLAUDE.md instructions change this default behavior. - -**The Multi-Threading Mindset** - -Think like a programmer coordinating threads. Claude can orchestrate multiple specialized agents simultaneously, but only when you provide explicit delegation instructions. Without clear task boundaries, Claude defaults to serial execution. - -Key coordination principles: - -- **Boundary Definition**: Each agent handles specific file types or operations -- **Conflict Avoidance**: Prevent agents from writing to the same resources -- **Context Optimization**: Strip unnecessary details when delegating -- **Logical Grouping**: Combine small related tasks to prevent over-fragmentation - -## [Parallel Task Distribution Strategies](#parallel-task-distribution-strategies) - -### [The 7-Agent Feature Pattern](#the-7-agent-feature-pattern) - -Add this to your CLAUDE.md file to enable automatic parallel distribution: - -```p-4 -## Parallel Feature Implementation Workflow - -When implementing features, spawn 7 parallel Task agents: - -1. **Component**: Create main component file -2. **Styles**: Create component styles/CSS -3. **Tests**: Create test files -4. **Types**: Create type definitions -5. **Hooks**: Create custom hooks/utilities -6. **Integration**: Update routing, imports, exports -7. **Remaining**: Update package.json, docs, config files - -### Context Optimization Rules - -- Strip comments when reading code files for analysis -- Each Task handles ONLY specified files or file types -- Task 7 combines small config/doc updates to avoid over-fragmentation -``` - -This pattern consistently delivers 5x faster feature implementation by eliminating serial bottlenecks. Claude reads these instructions and automatically distributes work across Task agents. - -### [Role-Based Task Delegation](#role-based-task-delegation) - -For code review and analysis tasks, instruct Claude to spawn specialized Task agents: - -```p-4 -Analyze this codebase using parallel Task agents with these roles: -- Senior engineer: Architecture and performance -- Security expert: Vulnerability assessment -- QA tester: Edge cases and validation -- Frontend specialist: UI/UX optimization -- DevOps engineer: Deployment considerations -``` - -Each role naturally gravitates toward different tools and approaches, creating comprehensive analysis impossible with single-agent execution. - -### [Domain-Specific Distribution](#domain-specific-distribution) - -For backend work, prompt Claude with explicit parallel structure: - -```p-4 -Implement user authentication system using parallel Task agents: -1. Database schema and migrations -2. Auth middleware and JWT handling -3. User model and validation -4. API routes and controllers -5. Integration tests -6. Documentation updates -``` - -**Success Verification**: You'll see Claude invoke the Task tool multiple times in a single response, creating agents that execute simultaneously. Total feature implementation time drops from 45+ minutes to under 10 minutes. - -## [Optimizing Agent Coordination](#optimizing-agent-coordination) - -**Token Cost vs Performance Balance**: More Task agents don't always equal better results. Each Task invocation consumes tokens for context setup. Grouping related operations often proves more efficient than creating separate agents for every minor task. - -**Context Preservation**: When Claude delegates to Task agents, it decides what context each receives. Structure your instructions so each agent gets domain-specific information without irrelevant project details. - -**Conflict Resolution**: Design task boundaries to prevent write conflicts. Use file-level or feature-level separation rather than line-level task splitting. Two Task agents writing to the same file creates merge conflicts. - -**Feedback Integration**: Task agents return their results to the main Claude instance. Plan how outputs will merge - consider dependencies between parallel tasks during the orchestration phase. - -## [Advanced Distribution Patterns](#advanced-distribution-patterns) - -**Validation Chains**: Structure prompts to run validation after parallel implementation completes: - -```p-4 -# Implementation phase (parallel Task agents) -Tasks 1-5: Core feature development - -# Validation phase (sequential, after implementation) -Task 6: Integration testing -Task 7: Security review -Task 8: Performance verification -``` - -**Research Coordination**: Parallelize information gathering with Task agents: - -```p-4 -Research user dashboard implementations using parallel Tasks: -1. **Technical**: React dashboard libraries and patterns -2. **Design**: Modern dashboard UI/UX examples -3. **Performance**: Optimization strategies for data-heavy UIs -4. **Accessibility**: WCAG compliance for dashboard interfaces -``` - -**Cross-Domain Projects**: Coordinate frontend, backend, and infrastructure Task agents simultaneously instead of waterfall development. - -## [Common Distribution Mistakes](#common-distribution-mistakes) - -**Over-Fragmentation**: Creating Task agents for trivial operations wastes tokens and coordination overhead. Combine related micro-tasks into single agents. - -**Under-Specification**: Vague delegation instructions cause Task agents to make assumptions or request clarification, breaking parallel flow. Be explicit about scope and expected outputs. - -**Resource Conflicts**: Multiple Task agents modifying the same files simultaneously creates merge conflicts and inconsistent state. Design file-level boundaries. - -**Context Duplication**: Each Task agent receives context from the main instance. Over-explaining in your prompts causes Claude to pass excessive context to every agent, wasting tokens. - -## [Next Actions](#next-actions) - -Start with the 7-agent feature pattern on your next complex implementation. Add the CLAUDE.md configuration, then request a feature - you should see multiple Task tool invocations in Claude's response. - -Master parallel task distribution by practicing with our [Sub-Agent Design](/blog/guide/agents/sub-agent-design) guide, then scale to advanced coordination with [Agent Fundamentals](/blog/guide/agents/agent-fundamentals). - -For deciding between parallel, sequential, and background execution, see our [sub-agent best practices guide](/blog/guide/agents/sub-agent-best-practices). - -For specific implementation patterns, check [Custom Agents](/blog/guide/agents/custom-agents) to create specialized task distributors for your development workflow. - -Monitor your task completion velocity - properly distributed Task agents should deliver 3-5x faster results than sequential execution. Track this metric to optimize your distribution strategies over time. - -Last updated on - -[Previous - -Sub-Agent Design](/blog/guide/agents/sub-agent-design)[Next - -Team Orchestration](/blog/guide/agents/team-orchestration) diff --git a/docs/site/src/content/blog/task-management.md b/docs/site/src/content/blog/task-management.md deleted file mode 100644 index afd00c5a..00000000 --- a/docs/site/src/content/blog/task-management.md +++ /dev/null @@ -1,212 +0,0 @@ ---- -slug: "task-management" -title: "Claude Code Task Management: Native Multi-Session AI" -description: "The community built Ralph Wiggum. Anthropic built native task management. Multi-session coordination with dependencies and blockers built in." -date: "2026-02-05" -author: "Max Ritter" -tags: [Guide, Development] -readingTime: 6 -keywords: "ai, claude, code, management, multisession, native, task" ---- - -Development - -# Claude Code Task Management: Anthropic's Native Answer to Ralph Wiggum - -The community built Ralph Wiggum. Anthropic built native task management. Multi-session coordination with dependencies and blockers built in. - -**Problem**: The community solved autonomous coding with [Ralph Wiggum loops](/blog/guide/mechanics/ralph-wiggum-technique), external plan files, and stop hook hacks. It worked, but required workarounds for context persistence and multi-session coordination. - -**Quick Win**: Anthropic made it native. Create persistent tasks with dependencies: - -```p-4 -claude "add user authentication - break into tasks with dependencies" -``` - -Tasks appear in your terminal (`Ctrl+T` to toggle) and persist across sessions. No more re-explaining where you left off. - -## [Tasks: The Evolution of Todos](#tasks-the-evolution-of-todos) - -Anthropic upgraded Claude Code's task management on January 23, 2025. This shifts from simple checklists to proper project management with dependencies, blockers, and multi-session collaboration. - -The old TodoWrite tool tracked flat lists. The new system uses four specialized tools: - -| Tool | Purpose | -| --- | --- | -| **TaskCreate** | Create tasks with subject, description, and status display | -| **TaskGet** | Retrieve full task details including dependencies | -| **TaskUpdate** | Update status, add blockers, modify details | -| **TaskList** | List all tasks with current state | - -### [What Changes](#what-changes) - -Before: Claude maintained todos in memory, lost on context reset. -After: Tasks persist in `~/.claude/tasks/` (your home directory, not the project) and broadcast updates across sessions. - -The fundamentals from [todo workflows](/blog/guide/development/todo-workflows) still apply - tasks mirror your instructions, and misalignment reveals communication gaps. But now you get persistence and dependencies. - -## [Tasks vs Ralph Wiggum: What Changes](#tasks-vs-ralph-wiggum-what-changes) - -The [Ralph Wiggum technique](/blog/guide/mechanics/ralph-wiggum-technique) pioneered autonomous Claude Code loops. Developers used stop hooks, external plan files, and completion promises to keep Claude working overnight. It worked, but required workarounds. - -Tasks solve these problems natively: - -| Ralph Workaround | Native Tasks Solution | -| --- | --- | -| External plan.md files for tracking | Built-in storage at `~/.claude/tasks/` (home dir) | -| Stop hooks to check completion | Status lifecycle: `pending → in_progress → completed` | -| Fresh sessions to fight context rot | Tasks persist across context compactions | -| Completion promises ("complete") | Explicit `TaskUpdate` with status | -| Manual progress file coordination | `CLAUDE_CODE_TASK_LIST_ID` for multi-session sync | - -**The core insight remains the same**: verification drives everything. Ralph taught us that Claude needs objective "done" criteria. Tasks just make the plumbing native. - -If you're running Ralph loops today, you don't need to stop. But Tasks give you native primitives that the community was building manually. Anthropic saw what developers needed and shipped it. - -## [Task Dependencies and Blockers](#task-dependencies-and-blockers) - -The real power is in dependencies. Tasks can block other tasks: - -```p-4 -Task 1: Design database schema -Task 2: Create API endpoints (blocked by Task 1) -Task 3: Build frontend components (blocked by Task 2) -``` - -Claude tracks this automatically. When you mark Task 1 complete, Task 2 becomes available. This prevents parallel work from colliding. - -### [Creating Dependent Tasks](#creating-dependent-tasks) - -When Claude breaks down complex work, it sets up dependency chains: - -```p-4 -TaskCreate(subject="Design auth schema", description="...") -TaskCreate(subject="Implement auth API", description="...") -TaskUpdate(taskId="2", addBlockedBy=["1"]) -``` - -The `addBlockedBy` parameter chains tasks together. The `addBlocks` parameter works in reverse, marking what a task blocks. - -## [Multi-Session Collaboration](#multi-session-collaboration) - -This is where Tasks transform how you work. Set an environment variable to share tasks across sessions: - -```p-4 -CLAUDE_CODE_TASK_LIST_ID=my-project claude -``` - -Now multiple Claude sessions coordinate on the same task list. When Session A completes a task, Session B sees the update immediately. This enables: - -- **Parallel workstreams**: Frontend and backend sessions sharing blockers -- **Resume anywhere**: Close your laptop, open it tomorrow, tasks are exactly where you left them -- **Team coordination**: Multiple developers sharing task state - -### [Practical Multi-Session Workflow](#practical-multi-session-workflow) - -1. Start your main session with a named task list: - - ```p-4 - CLAUDE_CODE_TASK_LIST_ID=feature-auth claude - ``` -2. Break down work into tasks with dependencies -3. Spin up a second session for parallel work: - - ```p-4 - CLAUDE_CODE_TASK_LIST_ID=feature-auth claude # Same ID - ``` -4. Both sessions see and update the shared task list - -This works with the Agent SDK too, so [subagents](/blog/guide/agents/sub-agent-design) can claim and complete tasks from the shared list. - -## [Task Status Lifecycle](#task-status-lifecycle) - -```p-4 -pending → in_progress → completed -``` - -Mark tasks `in_progress` when starting work. This shows a spinner in the task list and signals to other sessions that work is active. Mark `completed` only when fully done. - -Tasks persist across context compactions, so even in long sessions with memory resets, the task state survives. - -## [Keyboard Shortcuts](#keyboard-shortcuts) - -Press `Ctrl+T` to toggle task list visibility in your terminal. You see: - -- Pending tasks (up to 10 at a time) -- In-progress tasks with spinner -- Completed tasks with checkmark - -Ask Claude "show me all tasks" or "clear all tasks" for direct manipulation. - -## [When to Use Tasks](#when-to-use-tasks) - -Tasks shine for complex work. Don't overcomplicate simple requests. - -**Use Tasks when:** - -- Multi-step implementation with dependencies -- Work spanning multiple sessions -- Parallel [subagent coordination](/blog/guide/agents/task-distribution) -- Projects where you'll pause and resume - -**Skip Tasks when:** - -- Single-file changes -- Quick questions -- One-shot commands - -## [Configuring Task Behavior](#configuring-task-behavior) - -Add task instructions to your [CLAUDE.md file](/blog/guide/mechanics/claude-md-mastery): - -```p-4 -## Task Management - -- Use TaskCreate for multi-step work -- Set dependencies with addBlockedBy for sequential phases -- Update status to in_progress before starting each task -- Mark completed only after verification -``` - -For cross-session projects, you can also set the environment variable in your shell profile: - -```p-4 -# In .bashrc or .zshrc -export CLAUDE_CODE_TASK_LIST_ID=my-project -``` - -## [Migration from Todos](#migration-from-todos) - -If you were using TodoWrite in your configuration, update your instructions: - -**Old approach:** - -```p-4 -Keep session checklists in TodoWrite -``` - -**New approach:** - -```p-4 -Use TaskCreate for each checklist item -Update status via TaskUpdate (pending → in_progress → completed) -Set dependencies with addBlockedBy parameter -``` - -The `/todos` command still works as an alias, but the underlying system is now Tasks. - -**Next Steps:** - -- Master [Ralph Wiggum loops](/blog/guide/mechanics/ralph-wiggum-technique) to combine Tasks with autonomous workflows -- Review [todo workflow fundamentals](/blog/guide/development/todo-workflows) for instruction mirroring patterns -- Learn about [sub-agent patterns](/blog/guide/agents/sub-agent-design) for task-coordinated agents -- Explore [async workflows](/blog/guide/agents/async-workflows) for parallel task execution -- Check [context management](/blog/guide/mechanics/context-management) for long-running projects - -Last updated on - -[Previous - -Todo Workflows](/blog/guide/development/todo-workflows)[Next - -Project Templates](/blog/guide/development/project-templates) diff --git a/docs/site/src/content/blog/tdd-with-claude-code.md b/docs/site/src/content/blog/tdd-with-claude-code.md deleted file mode 100644 index 25e0a751..00000000 --- a/docs/site/src/content/blog/tdd-with-claude-code.md +++ /dev/null @@ -1,116 +0,0 @@ ---- -slug: "tdd-with-claude-code" -title: "Enforcing Test-Driven Development with Claude Code" -description: "Learn why AI-generated code needs TDD, how to enforce it with hooks and rules, and how Pilot automates the red-green-refactor cycle." -date: "2026-02-12" -author: "Max Ritter" -tags: [Guide, Testing] -readingTime: 5 -keywords: "Claude Code TDD, AI test-driven development, Claude Code testing, enforce tests Claude, TDD enforcement, red-green-refactor, AI code quality" ---- - -# Enforcing Test-Driven Development with Claude Code - -AI-generated code is only as reliable as the tests that verify it. Claude writes syntactically correct code fast — but it doesn't know your business logic quirks or undocumented edge cases. TDD makes the test the specification: Claude implements exactly what the tests require, nothing more. - -## The Red-Green-Refactor Cycle - -TDD with Claude follows three phases: - -### 1. Red — Write a Failing Test - -You define what "correct" means. The test fails because the feature doesn't exist yet. - -```typescript -describe('validateToken', () => { - it('should return true for valid JWT tokens', () => { - expect(validateToken(validToken)).toBe(true); - }); - it('should return false for expired tokens', () => { - expect(validateToken(expiredToken)).toBe(false); - }); -}); -``` - -Run the test. It **must fail**. A test that passes immediately proves nothing. - -### 2. Green — Implement Minimal Code - -Claude writes the simplest code that makes the test pass. No extra features, no premature optimization. - -```typescript -export function validateToken(token: string): boolean { - try { - jwt.verify(token, process.env.JWT_SECRET!); - return true; - } catch { - return false; - } -} -``` - -Run the test. It passes. - -### 3. Refactor — Improve While Green - -Improve the code — extract functions, add error handling, simplify logic. Tests stay green throughout. If they break, the refactor introduced a bug. - -## Enforcing TDD with Hooks - -The cycle works when you follow it. Hooks make it **automatic, not optional**. Pilot includes a TDD enforcer hook that runs on every file edit: - -```json -{ - "PostToolUse:Write": [ - { "shell": "python ${CLAUDE_PLUGIN_ROOT}/hooks/tdd_enforcer.py" } - ], - "PostToolUse:Edit": [ - { "shell": "python ${CLAUDE_PLUGIN_ROOT}/hooks/tdd_enforcer.py" } - ] -} -``` - -If Claude tries to create production code without a corresponding test file, the hook blocks it. Writing tests first becomes the path of least resistance. - -## How Pilot Automates TDD - -### Spec-Driven TDD - -The `/spec` command mandates TDD for every task: - -1. **Plan** — Define what to build, get approval -2. **Implement** — For each task: write failing test → implement → verify green -3. **Verify** — Review agents audit test quality and coverage - -You can't skip tests in `/spec`. The workflow blocks progression until tests exist and pass. - -### Verification Catches Weak Tests - -Even with TDD, tests can be trivial (`expect(true).toBe(true)`). Pilot's verification phase audits: - -- **Coverage** — Do tests exercise the actual code paths? -- **Assertions** — Are they meaningful and specific? -- **Edge cases** — Are error paths and boundary conditions tested? - -Insufficient tests fail verification. You fix the tests, not the code. - -## Bug Fixes Follow TDD Too - -**Bug:** `calculateDiscount` returns negative prices for invalid coupons. - -```typescript -// Step 1: Regression test (red) -it('should return original price for invalid coupons', () => { - expect(calculateDiscount(100, 'INVALID')).toBe(100); -}); - -// Step 2: Fix (green) -const discount = validCoupons[coupon] ?? 0; // Default to 0 for invalid -return price * (1 - discount); -``` - -Test fails first (proving the bug exists), then passes after the fix (proving it's resolved). The regression test stays forever. - -## Key Takeaway - -TDD transforms Claude from a code generator into a code implementer. Pilot enforces it with hooks and workflow rules so it's never skipped — even on "quick fixes." diff --git a/docs/site/src/content/blog/team-orchestration.md b/docs/site/src/content/blog/team-orchestration.md deleted file mode 100644 index d494063c..00000000 --- a/docs/site/src/content/blog/team-orchestration.md +++ /dev/null @@ -1,166 +0,0 @@ ---- -slug: "team-orchestration" -title: "Claude Code Team Orchestration: Builder-Validator Patterns" -description: "Pair builder and validator agents using the Claude Code task system. Build-then-validate workflows with dependency chains." -date: "2026-02-03" -author: "Max Ritter" -tags: [Guide, Agents] -readingTime: 6 -keywords: "buildervalidator, claude, code, orchestration, patterns, team" ---- - -Agents - -# Claude Code Team Orchestration: Builder-Validator Agent Patterns - -Pair builder and validator agents using the Claude Code task system. Build-then-validate workflows with dependency chains. - -**Problem**: Spawning parallel Claude Code agents is fast, but without structured roles, agents produce inconsistent output that you manually review line by line. You need agents that check each other's work. - -> **Looking for native Agent Teams?** Claude Code now has a built-in [Agent Teams feature](/blog/guide/agents/agent-teams) for multi-agent collaboration. This post covers the DIY approach using Task tools, which works without any experimental features enabled. - -**Quick Win**: Add this builder-validator chain to your next multi-file task. The validator agent runs read-only after the builder finishes: - -```p-4 -TaskCreate(subject="Build auth middleware", description="Create JWT validation middleware in src/middleware/auth.ts. Export verifyToken and requireAuth functions.") -TaskCreate(subject="Validate auth middleware", description="Read src/middleware/auth.ts. Verify: exports exist, error handling covers expired/malformed tokens, no hardcoded secrets. Report issues only. Do NOT modify files.") -TaskUpdate(taskId="2", addBlockedBy=["1"]) -``` - -Task 2 won't start until Task 1 completes. The validator reads but never writes. Two agents, one reliable output. - -## [Why Pairs Beat Solo Agents](#why-pairs-beat-solo-agents) - -[Agent fundamentals](/blog/guide/agents/agent-fundamentals) covers what subagents are and how they work. [Task distribution](/blog/guide/agents/task-distribution) covers spawning parallel agents for speed. [Sub-agent best practices](/blog/guide/agents/sub-agent-best-practices) covers routing decisions. This post covers something different: organizing agents into teams with defined roles. - -The problem with solo agents is simple. An agent that builds code can't objectively review its own output. It has the same blind spots that created the bugs in the first place. Pairing a builder with an independent validator catches issues the builder missed because the validator starts fresh, with no context about implementation shortcuts or assumptions. - -This mirrors how human teams work. You don't ask the developer who wrote the code to be the sole reviewer. You bring in a second set of eyes. - -## [The Builder-Validator Pattern](#the-builder-validator-pattern) - -A builder agent writes code. A validator agent reads code. They never overlap. - -**Builder prompt** - scoped to creation: - -```p-4 -You are a builder agent. Your job: - -1. Read the task description carefully -2. Implement the solution in the specified files -3. Run any relevant tests -4. Mark your task complete - -Rules: - -- Only modify files listed in your task -- Do not modify test files (validators handle test verification) -- If you hit a blocker, document it in the task description and mark complete -``` - -**Validator prompt** - scoped to verification: - -```p-4 -You are a validator agent. Your job: - -1. Read all files the builder created or modified -2. Check against the acceptance criteria in the task description -3. Run the test suite -4. Report findings as a new task if issues exist - -Rules: - -- Do NOT modify any source files -- Do NOT create new implementation code -- You may only create or update task entries to report issues -- Use Read and Bash (for tests) only - never Edit or Write -``` - -The key constraint: validators cannot write code. This forces them to surface problems instead of silently "fixing" things in ways that bypass review. When a validator finds issues, it creates a new task that routes back to a builder. You can enforce this at the tool level using [custom agent definitions](/blog/guide/agents/custom-agents) with `disallowedTools`, which prevents validators from accessing Edit or Write tools entirely. - -## [Dependency Chains for Build-Then-Validate](#dependency-chains-for-build-then-validate) - -The `addBlockedBy` parameter in [TaskUpdate](/blog/guide/development/task-management) is what makes this pattern work. Validators wait for builders automatically: - -```p-4 -// Phase 1: Parallel builders -TaskCreate(subject="Build user API routes", description="Create CRUD endpoints in src/api/users.ts...") -TaskCreate(subject="Build user database schema", description="Create migration in src/db/migrations/...") - -// Phase 2: Validators blocked by their builders -TaskCreate(subject="Validate API routes", description="Read src/api/users.ts. Verify REST conventions, error handling, input validation...") -TaskCreate(subject="Validate database schema", description="Read migration files. Verify column types, indexes, foreign keys...") - -TaskUpdate(taskId="3", addBlockedBy=["1"]) -TaskUpdate(taskId="4", addBlockedBy=["2"]) -``` - -Tasks 1 and 2 run in parallel (different files, no conflicts). Tasks 3 and 4 each wait for their respective builder to finish. You get parallel speed on the build phase and independent validation on each output. - -For cross-cutting validation that needs everything built first, add multiple blockers: - -```p-4 -TaskCreate(subject="Integration validation", description="Verify API routes correctly reference the database schema. Check that all referenced tables and columns exist.") -TaskUpdate(taskId="5", addBlockedBy=["1", "2"]) -``` - -## [The Meta-Prompt: Generate Team Plans From Requirements](#the-meta-prompt-generate-team-plans-from-requirements) - -Instead of manually creating task chains, use a meta-prompt that turns a feature request into a structured team plan. Add this to your [CLAUDE.md configuration](/blog/guide/mechanics/claude-md-mastery): - -```p-4 -## Team Plan Generation - -When I say "team plan: [feature]", generate a task structure: - -For each component: - -1. TaskCreate a builder task with specific files and acceptance criteria -2. TaskCreate a validator task scoped to read-only verification -3. TaskUpdate to chain validator behind its builder - -After all component pairs, add one integration validator blocked by ALL builders. - -Format each task description with: - -- **Files**: exact paths to create or read -- **Criteria**: measurable acceptance conditions -- **Constraints**: what this agent must NOT do -``` - -Then you just say: "team plan: add Stripe webhook handler." Claude generates the full task dependency graph, assigns builder-validator pairs per component, and adds an integration validator at the end. You review the plan, approve it, and the agents execute. - -This is the orchestrator pattern from [thread-based engineering](/blog/guide/mechanics/thread-based-engineering) in practice. Your primary Claude session coordinates. It creates the plan, sets up dependencies, and dispatches agents. It doesn't write application code itself. - -## [Resuming Failed Validations](#resuming-failed-validations) - -When a validator flags an issue, the cycle continues: - -1. Validator creates a fix task describing what's wrong -2. Fix task gets assigned to a builder agent -3. A new validator task is chained behind the fix - -```p-4 -// Validator found missing error handling -TaskCreate(subject="Fix: add error handling to user API", description="The GET /users/:id endpoint returns 500 on invalid ID format. Add input validation and return 400 for malformed IDs.") -TaskCreate(subject="Re-validate user API error handling", description="Verify GET /users/:id returns 400 for non-UUID strings, 404 for valid UUID not found, 200 for valid existing user.") -TaskUpdate(taskId="7", addBlockedBy=["6"]) -``` - -Each cycle narrows the scope. The first builder handles the full feature. Fix builders handle specific issues. This [feedback loop](/blog/guide/development/feedback-loops) converges toward correct output without you manually debugging. - -For complex validations, you can also enforce rules through [hooks](/blog/tools/hooks/hooks-guide) that run automated checks on every file modification, catching issues before the validator agent even starts. You can go further by [embedding validation directly into agent definitions](/blog/tools/hooks/self-validating-agents) so quality checks travel with the agent as part of its identity. - -## [Start With One Pair](#start-with-one-pair) - -Don't restructure your entire workflow. Pick your next feature that touches two or more files. Create one builder task and one validator task with `addBlockedBy`. Watch the validator catch something the builder missed. - -Once you've seen the pattern work, scale it: parallel builders with chained validators, meta-prompts for automatic plan generation, and integration validators that verify components work together. Design your [agent architecture](/blog/guide/agents/sub-agent-design) around clear role separation, and let the [task system](/blog/guide/development/task-management) handle coordination. You handle the decisions. - -Last updated on - -[Previous - -Task Distribution](/blog/guide/agents/task-distribution)[Next - -Agent Teams](/blog/guide/agents/agent-teams) diff --git a/docs/site/src/content/blog/team-vault-sharing-ai-assets.md b/docs/site/src/content/blog/team-vault-sharing-ai-assets.md deleted file mode 100644 index 7687d766..00000000 --- a/docs/site/src/content/blog/team-vault-sharing-ai-assets.md +++ /dev/null @@ -1,95 +0,0 @@ ---- -slug: "team-vault-sharing-ai-assets" -title: "Sharing AI Assets Across Your Team with Vault" -description: "Sync rules, skills, commands, and agents across your team. Keep every developer\'s Claude consistent with a shared repository." -date: "2026-01-20" -author: "Max Ritter" -tags: [Feature, Teams] -readingTime: 4 -keywords: "Claude Code team, shared rules, team vault, AI assets, Claude Code configuration, team consistency" ---- - -# Sharing AI Assets Across Your Team with Vault - -Every team member configures Claude Code differently — different rules, different commands, different workflows. This creates inconsistency: one developer's Claude follows TDD, another's doesn't. Vault solves this by syncing AI assets through a shared Git repository. - -## The Consistency Problem - -Without shared configuration: - -- New team members start from zero -- Best practices discovered by one developer stay local -- Rules drift between developers over time -- Onboarding means manually copying configuration files - -## What Vault Shares - -| Asset Type | Example | Shared Via | -|-----------|---------|-----------| -| **Rules** | Coding standards, testing requirements | `.claude/rules/*.md` | -| **Commands** | `/deploy`, `/review`, `/test` | `.claude/commands/*.md` | -| **Skills** | Learned workflows and patterns | `.claude/skills/*/` | -| **Agents** | Specialized review agents | `.claude/agents/*.md` | -| **Hooks** | Quality enforcement scripts | Hook configurations | - -## Setup - -Initialize a vault backed by a private Git repository: - -```bash -sx init --type git --repo-url git@github.com:your-org/team-vault.git -``` - -This creates a shared store that all team members can push to and pull from. - -## Publishing Assets - -Share a rule with the team: - -```bash -REPO=$(git remote get-url origin) -sx add .claude/rules/testing-standards.md \ - --yes --type rule --name "testing-standards" \ - --no-install --scope-repo $REPO -``` - -The `--scope-repo` flag ensures the rule only installs for this specific project. Use `--scope-global` for rules that apply to all repositories. - -## Installing Assets - -Team members pull shared assets: - -```bash -sx install --repair -``` - -This fetches the latest versions and installs them to the correct locations. Run it after cloning a repo or when someone publishes updates. - -## Scoping - -| Scope | Installs To | Use When | -|-------|------------|----------| -| Project | `project/.claude/` | Rules specific to this codebase | -| Global | `~/.claude/` | Personal tools for all repos | -| Path | `project/path/.claude/` | Monorepo — different rules per service | - -## Versioning - -Every `sx add` creates a new version. The vault tracks version history: - -```bash -sx vault list # See all assets with versions -sx vault show my-rule # See version history for an asset -``` - -Roll back by publishing a previous version. - -## Practical Workflow - -1. **Developer discovers pattern** — A debugging workflow that saves time -2. **Capture with /learn** — Pilot extracts it as a skill -3. **Share via Teams** — Push to the team repository from the Console dashboard -4. **Team installs** — Install from the Teams page or `sx install --repair` -5. **Everyone benefits** — Claude knows the pattern in all sessions - -This creates a flywheel: the more the team uses Claude, the smarter everyone's Claude gets. diff --git a/docs/site/src/content/blog/terminal-main-thread.md b/docs/site/src/content/blog/terminal-main-thread.md deleted file mode 100644 index d39ebc7f..00000000 --- a/docs/site/src/content/blog/terminal-main-thread.md +++ /dev/null @@ -1,173 +0,0 @@ ---- -slug: "terminal-main-thread" -title: "Claude Code Terminal: You Are the Main Thread" -description: "Master Claude Code's terminal execution model where you control the main thread. Learn to think like the primary process for better results." -date: "2025-08-23" -author: "Max Ritter" -tags: [Guide, Workflow] -readingTime: 5 -keywords: "are, claude, code, main, terminal, thread, you" ---- - -Mechanics - -# Claude Code Terminal: You Are the Main Thread - -Master Claude Code's terminal execution model where you control the main thread. Learn to think like the primary process for better results. - -**Problem**: You're sitting idle while Claude Code processes a long request, wasting your most valuable resource: your attention. - -**Quick Win**: Open a second terminal tab right now and run `claude` in it. While your first session works on one task, start a related task in the second. You just became the main thread coordinating parallel workers. - -## [You Are the CPU Scheduler](#you-are-the-cpu-scheduler) - -Before AI agents, being unproductive meant wasting your time. Now every idle moment wastes both your time AND all the parallel Claude sessions you could have running. - -Think like an operating system. Your attention is the bottleneck, not Claude's processing power. You coordinate. Claude executes. - -## [Setting Up Parallel Terminals](#setting-up-parallel-terminals) - -The actual workflow uses multiple terminal windows. Here's how to set it up: - -**VS Code (easiest)**: - -```p-4 -# Split terminal: Ctrl+Shift+5 (or Cmd+Shift+5 on Mac) -# Each pane runs its own claude instance -``` - -**tmux (most powerful)**: - -```p-4 -# Create new session with splits -tmux new-session -s dev -# Split horizontally: Ctrl+b " -# Split vertically: Ctrl+b % -# Navigate panes: Ctrl+b arrow-keys -``` - -**iTerm2 on Mac**: - -```p-4 -# Cmd+D for vertical split -# Cmd+Shift+D for horizontal split -``` - -Each terminal runs an independent `claude` instance with its own context. - -## [The Parallel Pattern](#the-parallel-pattern) - -Instead of blocking on a single task: - -```p-4 -# Terminal 1: Working on refactor -claude -> refactor the auth module to use JWT - -# YOU: Don't wait! Switch to Terminal 2 -claude -> write integration tests for the payment flow - -# Terminal 3: Documentation -claude -> update the API docs for the new endpoints -``` - -Three Claude instances running simultaneously. You monitor, coordinate, and synthesize their outputs. - -## [Practical Coordination](#practical-coordination) - -### [Development Pipeline](#development-pipeline) - -Set up three terminals for a typical feature: - -| Terminal | Task | Why Parallel | -| --- | --- | --- | -| 1 | Fix build errors | Blocking issue | -| 2 | Code review changes | Independent analysis | -| 3 | Prepare deploy checklist | Can start early | - -### [Session Handoffs](#session-handoffs) - -When one Claude finishes, feed its output to another: - -```p-4 -# Terminal 1 completes refactor, saves to file -> save the refactored auth to src/auth-new.ts - -# Terminal 2 picks up -> write tests for src/auth-new.ts -``` - -The file system becomes your coordination layer between sessions. - -### [Context Isolation](#context-isolation) - -Each terminal maintains separate [context](/blog/guide/mechanics/context-management). This is a feature: - -- Long conversations in one session don't pollute others -- Specialized contexts for different domains -- Multiply your effective context window across sessions - -## [Optimizing Your Terminal](#optimizing-your-terminal) - -Running parallel sessions is only half the equation. A properly configured terminal removes friction from every interaction. - -### [Multi-Line Input with Shift+Enter](#multi-line-input-with-shiftenter) - -When writing longer prompts, you need line breaks without submitting. **Shift+Enter** works natively in iTerm2, WezTerm, Ghostty, and Kitty. For other terminals, run `/terminal-setup` inside Claude Code to auto-configure Shift+Enter for VS Code, Alacritty, Zed, and Warp. - -You can always use the quick escape method: type `\` followed by Enter to create a newline in any terminal. For a complete walkthrough, see the [terminal setup guide](/blog/guide/terminal-setup-guide). - -### [Notification Setup](#notification-setup) - -When you coordinate multiple sessions, knowing the moment a task finishes is critical. In **iTerm 2**, enable system notifications by going to Preferences, then Profiles, then Terminal. Enable "Silence bell" and under Filter Alerts select "Send escape sequence-generated alerts." Set your preferred notification delay and you will get native macOS alerts when Claude completes work. - -For other terminals and more advanced setups, you can create custom notification hooks that run your own logic when tasks finish. This pairs well with the parallel terminal workflow since you can focus on one session and get notified when another needs your attention. - -### [Vim Mode](#vim-mode) - -If you are already a vim user, run `/vim` inside Claude Code to enable vim-style keybindings for the input area. This gives you modal editing with normal, insert, and visual modes, navigation with `h/j/k/l`, word motions, text objects, yank/paste, and more. Toggle it on or off via `/config`. See the [keybindings guide](/blog/tools/keybindings-guide) for the full shortcut reference. - -### [Custom Status Line](#custom-status-line) - -Add a persistent info bar at the bottom of your terminal showing the current model, context usage, git branch, or session cost. Configure it in your [settings](/blog/guide/settings-reference) or run `/statusline` to auto-generate one. The status line updates in real time as your conversation progresses, which is especially useful when juggling multiple sessions. For setup details, see the [status line guide](/blog/tools/statusline-guide). - -## [When Things Go Wrong](#when-things-go-wrong) - -**Error: Multiple terminals feel chaotic** -Fix: Start with just two terminals. Add a third only when you're comfortable coordinating two. - -**Error: Losing track of which terminal does what** -Fix: Name your tmux windows or use VS Code's terminal naming feature. Keep a mental map: left=feature, middle=tests, right=docs. - -## [Your Throughput Multiplier](#your-throughput-multiplier) - -Track your parallel capacity: - -- Week 1: 2 concurrent sessions, comfortable -- Week 2: 3 sessions, switching smoothly -- Week 3: 4-5 sessions for complex features - -The goal isn't raw speed. It's never letting your attention block on waiting. - -## [Try This Now](#try-this-now) - -1. Open three terminal windows -2. Run `claude` in each -3. Start three related but distinct tasks -4. Practice switching between them as each responds - -Your role shifts from user to orchestrator. - -**Next**: Master [context management](/blog/guide/mechanics/context-management) to optimize each session, explore [planning modes](/blog/guide/mechanics/planning-modes) for task queues, and learn [sub-agent design](/blog/guide/agents/sub-agent-design) for automated coordination. Fine-tune your terminal with the [terminal setup guide](/blog/guide/terminal-setup-guide) and customize shortcuts via the [keybindings guide](/blog/tools/keybindings-guide). - -**Advanced**: Combine with [auto-planning strategies](/blog/guide/mechanics/auto-planning-strategies) and [feedback loops](/blog/guide/development/feedback-loops) for fully parallel development workflows. - -Last updated on - -[Previous - -Rules Directory](/blog/guide/mechanics/rules-directory)[Next - -Planning Modes](/blog/guide/mechanics/planning-modes) diff --git a/docs/site/src/content/blog/terminal-setup-for-claude-code.md b/docs/site/src/content/blog/terminal-setup-for-claude-code.md deleted file mode 100644 index 5fdcb558..00000000 --- a/docs/site/src/content/blog/terminal-setup-for-claude-code.md +++ /dev/null @@ -1,104 +0,0 @@ ---- -slug: "terminal-setup-for-claude-code" -title: "Terminal Setup Tips for Claude Code" -description: "Configure your terminal for the best Claude Code experience. Shift+Enter, vim mode, notifications, status line, and font recommendations." -date: "2026-02-05" -author: "Max Ritter" -tags: [Guide, Setup] -readingTime: 4 -keywords: "Claude Code terminal, Claude Code setup, iTerm2 Claude Code, VS Code terminal, Claude Code vim mode, terminal configuration" ---- - -# Terminal Setup Tips for Claude Code - -A well-configured terminal makes Claude Code faster and more pleasant to use. These tips cover line breaks, vim mode, notifications, and settings for popular terminals. - -## Multi-Line Input with Shift+Enter - -By default, pressing Enter sends your message. For multi-line prompts, you need Shift+Enter — but not all terminals support it out of the box. - -### VS Code Terminal - -VS Code handles Shift+Enter natively. No configuration needed. - -### iTerm2 - -Add a key mapping in Preferences → Profiles → Keys → Key Mappings: - -- Key combination: `Shift+Enter` -- Action: Send text with "vim" special chars -- Value: `\n` - -### Ghostty - -Add to your Ghostty config: - -``` -keybind = shift+enter=text:\n -``` - -### Warp - -Warp supports multi-line input natively with Shift+Enter. - -## Vim Mode - -If you use vim keybindings in your shell, Claude Code respects them. Enable vi mode in your shell: - -**Bash:** -```bash -set -o vi -``` - -**Zsh:** -```zsh -bindkey -v -``` - -## Desktop Notifications - -Get notified when Claude finishes a long task. Claude Code supports system notifications on macOS and Linux. Enable in settings: - -```json -{ - "notifications": { - "enabled": true, - "sound": true - } -} -``` - -## Custom Status Line - -Claude Code supports a custom status bar that shows live information. Configure it in settings: - -```json -{ - "statusLine": { - "enabled": true, - "command": ["python", "-m", "launcher.statusline"] - } -} -``` - -Pilot's status line shows: license tier, active plan, context usage percentage, and Claude Code version — all updating in real time. - -## Font and Theme - -Claude Code output uses Unicode characters for boxes and indicators. Make sure your terminal font supports: - -- Box-drawing characters (╭╮╰╯│─) -- Common emoji (✓ ✗ ▸ ⏳) -- ANSI 256-color codes - -Nerd Fonts (like FiraCode Nerd Font or JetBrainsMono Nerd Font) work well. - -## Recommended Terminal Settings - -| Setting | Recommended Value | -|---------|------------------| -| Scrollback | 10,000+ lines | -| Font | Monospace with Unicode support | -| Color scheme | 256-color capable | -| Cursor | Block or beam (not underline) | -| Bell | Disabled (use notifications instead) | diff --git a/docs/site/src/content/blog/terminal-setup-guide.md b/docs/site/src/content/blog/terminal-setup-guide.md deleted file mode 100644 index 318e14e8..00000000 --- a/docs/site/src/content/blog/terminal-setup-guide.md +++ /dev/null @@ -1,292 +0,0 @@ ---- -slug: "terminal-setup-guide" -title: "Claude Code Terminal Setup Guide (Vim, Themes, Notifications)" -description: "Configure your terminal for Claude Code. Set up Shift+Enter line breaks, vim mode, notifications, and tips for VS Code and iTerm2." -date: "2026-02-03" -author: "Max Ritter" -tags: [Guide] -readingTime: 11 -keywords: "claude, code, guide, notifications, setup, terminal, themes, vim" ---- - -# Claude Code Terminal Setup: Theme, Vim Mode, and Multi-Line Input - -Configure your terminal for Claude Code. Set up Shift+Enter line breaks, vim mode, notifications, and tips for VS Code and iTerm2. - -Your terminal configuration directly affects how productive you are with Claude Code. Default settings work, but they leave performance on the table. Misconfigured line breaks force you into single-line prompts. Missing notifications mean you walk away and forget to check back. And if you've ever pasted a 200-line code block only to watch it get truncated, you already know why this matters. - -This guide covers every terminal setting worth configuring: theme matching, multi-line input, notifications, large input handling, vim mode, and specific tips for the terminals developers actually use. If you've already [installed Claude Code](/blog/guide/installation-guide) and set up your [basic configuration](/blog/guide/configuration-basics), this is where you fine-tune the experience. - -## [Theme Matching](#theme-matching) - -Claude Code doesn't control your terminal's appearance. Your terminal application owns that. But you can sync Claude Code's internal theme to match your terminal's color scheme at any time. - -Run `/config` inside Claude Code and select the theme option. This adjusts Claude Code's syntax highlighting, status indicators, and UI elements to fit your terminal's light or dark background. - -You can also configure a custom status line through `/config` that displays contextual information at the bottom of your terminal. This is useful for keeping the current model, working directory, or git branch visible without running extra commands. - -If you switch between light and dark modes throughout the day, run `/config` again after switching. Claude Code won't detect the change automatically. - -## [Multi-Line Input: Four Ways to Write Better Prompts](#multi-line-input-four-ways-to-write-better-prompts) - -Single-line prompts limit what you can express. Complex instructions, code snippets, and multi-step requests all benefit from line breaks. Claude Code supports four different methods. - -### [Method 1: Backslash + Enter (Works Everywhere)](#method-1-backslash--enter-works-everywhere) - -Type `\` followed by Enter to create a newline. This works in every terminal on every platform. It's the universal fallback when nothing else is configured. - -```p-4 -Write a function that\ -takes two arguments\ -and returns their sum -``` - -It's not elegant, but it's reliable. Use this when you're SSH'd into a remote server or working in an unfamiliar terminal. - -### [Method 2: Shift+Enter (Native Support)](#method-2-shiftenter-native-support) - -Four terminals support Shift+Enter for line breaks out of the box with zero configuration: - -- **iTerm2** -- **WezTerm** -- **Ghostty** -- **Kitty** - -If you use any of these, Shift+Enter already works. No setup required. This is the most natural input method since it matches what you're used to in chat applications and text editors. - -### [Method 3: /terminal-setup (Auto-Configuration)](#method-3-terminal-setup-auto-configuration) - -For terminals that don't support Shift+Enter natively, Claude Code includes a built-in setup command. Run `/terminal-setup` inside Claude Code and it will automatically configure Shift+Enter for your terminal. - -This command supports: - -- **VS Code** integrated terminal -- **Alacritty** -- **Zed** -- **Warp** - -One important detail: you won't see the `/terminal-setup` command if you're using a terminal that already has native Shift+Enter support (iTerm2, WezTerm, Ghostty, Kitty). The command only appears in terminals that need manual configuration. - -After running `/terminal-setup`, restart your terminal for the changes to take effect. - -### [Method 4: Option+Enter (Mac)](#method-4-optionenter-mac) - -On macOS, you can configure Option+Enter as an alternative line break key. This requires a one-time settings change depending on your terminal. - -**For Mac Terminal.app:** - -1. Open Settings, then Profiles, then Keyboard -2. Check "Use Option as Meta Key" - -**For iTerm2 and VS Code terminal:** - -1. Open Settings, then Profiles, then Keys -2. Under General, set Left/Right Option key to "Esc+" - -Option+Enter is particularly useful if you're already using Option as a modifier key in your workflow. It keeps Shift available for text selection. - -## [Notification Setup](#notification-setup) - -Claude Code tasks can take minutes for complex operations. Walking away without notifications means you're either watching paint dry or forgetting to come back. Proper notification setup solves both problems. - -### [iTerm2 System Notifications](#iterm2-system-notifications) - -iTerm2 supports native macOS notifications when Claude Code finishes a task: - -1. Open iTerm2 Preferences -2. Navigate to Profiles, then Terminal -3. Enable "Silence bell" -4. Under Filter Alerts, enable "Send escape sequence-generated alerts" -5. Set your preferred notification delay - -After this setup, macOS will display a notification banner whenever Claude completes a long-running task. These notifications work even when iTerm2 is minimized or you've switched to another app. - -Note: these notifications are specific to iTerm2. The default macOS Terminal.app does not support this feature. - -### [Custom Notification Hooks](#custom-notification-hooks) - -For more advanced notification handling, Claude Code supports custom notification hooks. These let you run your own logic when specific events occur, such as sending a Slack message, playing a sound, or triggering a webhook. - -Notification hooks are part of Claude Code's broader [hooks system](/blog/tools/hooks/hooks-guide). You can set them up to fire on task completion, errors, or specific output patterns. - -## [Handling Large Inputs](#handling-large-inputs) - -Pasting long code blocks or extensive instructions directly into Claude Code can cause problems. The input buffer in most terminals has limits, and exceeding them leads to truncated or garbled text. - -Three rules for large inputs: - -**1. Don't paste directly.** If your input exceeds roughly 100 lines, write it to a file instead. Then tell Claude Code to read the file: - -```p-4 -Read the contents of ./context/large-spec.md and implement the requirements -``` - -**2. Watch for VS Code terminal limits.** The VS Code integrated terminal is particularly aggressive about truncating long pastes. If you work primarily in VS Code, the file-based approach isn't optional. It's necessary for anything beyond short prompts. - -**3. Break large requests into steps.** Instead of pasting an entire specification, break it into logical chunks. Give Claude Code one section at a time, verify the output, then continue. This also produces better results because Claude can focus on each piece individually. - -For developers who frequently work with large codebases, combining file-based input with [context management strategies](/blog/guide/mechanics/context-management) keeps sessions productive without hitting buffer limits. - -## [Vim Mode](#vim-mode) - -If your muscle memory runs on hjkl navigation, Claude Code has you covered. A built-in vim mode provides a subset of standard vim keybindings for the input area. - -### [Enabling Vim Mode](#enabling-vim-mode) - -Two ways to turn it on: - -- Type `/vim` in Claude Code to toggle vim mode immediately -- Run `/config` and enable vim mode in the settings (persists across sessions) - -When enabled, you'll start in NORMAL mode. The standard mode indicator appears in the input area so you always know which mode you're in. - -### [Complete Keybinding Reference](#complete-keybinding-reference) - -Here's every supported keybinding, organized by category. - -**Mode Switching:** - -| Key | Action | -| --- | --- | -| `Esc` | Switch to NORMAL mode | -| `i` | Insert before cursor | -| `I` | Insert at beginning of line | -| `a` | Insert after cursor | -| `A` | Insert at end of line | -| `o` | Open new line below | -| `O` | Open new line above | - -**Navigation:** - -| Key | Action | -| --- | --- | -| `h` / `j` / `k` / `l` | Left / Down / Up / Right | -| `w` | Jump to next word start | -| `e` | Jump to next word end | -| `b` | Jump to previous word start | -| `0` | Jump to line start | -| `$` | Jump to line end | -| `^` | Jump to first non-blank character | -| `gg` | Jump to first line | -| `G` | Jump to last line | -| `f` | Find next char on line | -| `F` | Find previous char on line | -| `t` | Move to before next char | -| `T` | Move to after previous char | -| `;` | Repeat last f/F/t/T forward | -| `,` | Repeat last f/F/t/T backward | - -**Editing:** - -| Key | Action | -| --- | --- | -| `x` | Delete character under cursor | -| `dw` | Delete to next word | -| `de` | Delete to end of word | -| `db` | Delete to beginning of word | -| `dd` | Delete entire line | -| `D` | Delete to end of line | -| `cw` | Change to next word | -| `ce` | Change to end of word | -| `cb` | Change to beginning of word | -| `cc` | Change entire line | -| `C` | Change to end of line | -| `.` | Repeat last edit command | - -**Yank and Paste:** - -| Key | Action | -| --- | --- | -| `yy` / `Y` | Yank (copy) entire line | -| `yw` | Yank to next word | -| `ye` | Yank to end of word | -| `yb` | Yank to beginning of word | -| `p` | Paste after cursor | -| `P` | Paste before cursor | - -**Text Objects (use with d, c, or y):** - -| Key | Selects | -| --- | --- | -| `iw` / `aw` | Inner / around word | -| `iW` / `aW` | Inner / around WORD | -| `i"` / `a"` | Inner / around double quotes | -| `i'` / `a'` | Inner / around single quotes | -| `i(` / `a(` | Inner / around parentheses | -| `i[` / `a[` | Inner / around brackets | -| `i{` / `a{` | Inner / around braces | - -**Line Operations:** - -| Key | Action | -| --- | --- | -| `>>` | Indent line | -| `<<` | Outdent line | -| `J` | Join current line with next | - -### [When Vim Mode Helps](#when-vim-mode-helps) - -Vim mode shines when you're writing longer, multi-line prompts. If you're giving Claude Code detailed instructions with specific file paths, code snippets, and multi-step requirements, vim-style navigation and editing saves real time. Jumping between words with `w` and `b`, deleting to end of line with `D`, and yanking/pasting sections with `yy`/`p` all feel natural if you're already a vim user. - -It's also useful when you need to edit a prompt you've already started typing. Instead of holding backspace or using arrow keys, you can navigate precisely with vim motions and make surgical edits. - -### [When to Skip Vim Mode](#when-to-skip-vim-mode) - -If you don't already use vim, don't start here. The learning curve isn't worth it for Claude Code's input field alone. Standard input works perfectly fine for most prompts. Vim mode is a quality-of-life feature for developers who already think in vim, not a prerequisite for being productive. - -## [Terminal-Specific Tips](#terminal-specific-tips) - -### [VS Code Integrated Terminal](#vs-code-integrated-terminal) - -- Run `/terminal-setup` to enable Shift+Enter for multi-line input -- Be aware of paste truncation on long inputs. Use file-based workflows for anything over 100 lines -- The VS Code terminal shares resources with the editor. If you're running multiple extensions, Claude Code may feel slower. Consider using a separate terminal window for intensive sessions -- Configure Option+Enter by setting the Option key to "Esc+" in terminal settings - -### [iTerm2](#iterm2) - -- Shift+Enter works natively. No setup needed -- Enable system notifications through Profiles, then Terminal, then "Silence bell" for task completion alerts -- Set Option key to "Esc+" under Profiles, then Keys for Option+Enter support -- iTerm2's tmux integration works well with [parallel Claude Code sessions](/blog/guide/mechanics/terminal-main-thread) - -### [Warp](#warp) - -- Run `/terminal-setup` to configure Shift+Enter -- Warp's block-based input can occasionally interfere with Claude Code's prompt detection. If you experience issues, try switching to classic input mode - -### [Alacritty](#alacritty) - -- Run `/terminal-setup` to configure Shift+Enter -- Alacritty's GPU-accelerated rendering makes it one of the fastest terminals for Claude Code output. If you're working with large file outputs, the performance difference is noticeable - -### [Ghostty](#ghostty) - -- Shift+Enter works natively -- Ghostty is relatively new but already has solid Claude Code compatibility. Its native macOS rendering and fast startup make it a strong choice for dedicated Claude Code sessions - -### [Kitty](#kitty) - -- Shift+Enter works natively -- Kitty's GPU rendering handles long Claude Code outputs smoothly -- Its built-in multiplexer lets you run parallel sessions without tmux - -## [Putting It All Together](#putting-it-all-together) - -A fully configured terminal setup for Claude Code looks like this: - -1. **Theme matched** via `/config` so syntax highlighting is readable -2. **Multi-line input** configured via your preferred method (Shift+Enter or Option+Enter) -3. **Notifications** enabled so you know when tasks complete -4. **Large input strategy** decided: file-based workflows for anything substantial -5. **Vim mode** enabled if you're already a vim user - -Get these five pieces right and your terminal stops being an obstacle. It becomes the control surface it's supposed to be. From here, explore [terminal-as-main-thread workflows](/blog/guide/mechanics/terminal-main-thread) to coordinate multiple Claude Code sessions in parallel, or dive into [keybinding customization](/blog/guide/configuration-basics) for additional workflow shortcuts. - -Last updated on - -[Previous - -Configuration Basics](/blog/guide/configuration-basics)[Next - -Sandboxing Guide](/blog/guide/sandboxing-guide) diff --git a/docs/site/src/content/blog/thread-based-engineering.md b/docs/site/src/content/blog/thread-based-engineering.md deleted file mode 100644 index bb4b4646..00000000 --- a/docs/site/src/content/blog/thread-based-engineering.md +++ /dev/null @@ -1,280 +0,0 @@ ---- -slug: "thread-based-engineering" -title: "Thread-Based Engineering: Scale Claude Code Sessions" -description: "Master the 6 thread types: P-threads, L-threads, B-threads, and more. The complete framework for running parallel Claude Code sessions at scale." -date: "2026-01-14" -author: "Max Ritter" -tags: [Guide, Workflow] -readingTime: 9 -keywords: "based, claude, code, engineering, scale, sessions, thread, threadbased" ---- - -Mechanics - -# Thread-Based Engineering: Scale Claude Code Sessions - -Master the 6 thread types: P-threads, L-threads, B-threads, and more. The complete framework for running parallel Claude Code sessions at scale. - -How do you know you're improving as an AI-assisted engineer? - -Not just "feeling more productive." Actually measuring it. Quantifying it. Knowing for certain that you're getting more done than last week. - -Thread-based engineering gives you that framework. It's a mental model for thinking about all your AI-assisted work as discrete units called threads. And once you see your work as threads, you can optimize them. - -## [What Is a Thread?](#what-is-a-thread) - -A thread is a unit of engineering work over time driven by you and your agent. - -Every thread has two mandatory nodes where you show up: - -1. **The beginning**: You prompt or plan -2. **The end**: You review or validate - -In between? Your agent does the work through tool calls. - -This is the base thread. Every time you fire up Claude Code and run a prompt, you're starting a thread. The agent executes tool calls (reads files, writes code, runs commands), and when it finishes, you review the result. - -Simple concept. Powerful implications. - -## [Why Tool Calls Matter](#why-tool-calls-matter) - -Here's the key insight: **tool calls roughly equal impact** (assuming you're prompting something useful). - -Before 2023, you were the tool calls. You updated code. You read files. You ran commands. You did all of it. - -Now you show up at the beginning (prompt) and end (review). Everything in between is automated. - -The engineer running more useful tool calls is outperforming the engineer running fewer. That's the game now. - -## [The Six Thread Types](#the-six-thread-types) - -Once you understand the base thread, you can scale it. There are six fundamental thread patterns that cover nearly every AI-assisted workflow. - -### [1. Base Thread](#1-base-thread) - -The foundation. One prompt, agent work, one review. - -Every other thread type builds on this. If you can't run a reliable base thread, you can't scale to anything else. - -**Use for**: Simple tasks, quick fixes, single-file changes. - -### [2. P-Threads (Parallel Execution)](#2-p-threads-parallel-execution) - -Multiple threads of work running simultaneously. - -Boris Cherny, the creator of Claude Code, runs five Claude Code instances in his terminal. He numbers his tabs 1-5. On top of that, he runs 5-10 additional instances in the Claude Code web interface. - -That's 10-15 parallel threads. While one agent works on authentication, another handles API endpoints, another writes tests. You prompt, switch tabs, prompt again, switch tabs, prompt again. Then come back and review results. - -**Use for**: Independent tasks, code reviews, feature branches, research. - -**How to improve**: Add more terminal windows. Use the Claude Code web interface for background agents. Fork terminals with custom tooling. - -### [3. C-Threads (Chained Workloads)](#3-c-threads-chained-workloads) - -Multi-phase work with human checkpoints between phases. - -Sometimes work can't fit in a single context window. Or you're doing high-pressure production work and want to verify each step before continuing. - -C-threads let you chunk work into phases: - -- Phase 1: Database migration -- Phase 2: API updates -- Phase 3: Frontend changes - -You review after each phase. If something's wrong, you catch it early instead of unwinding a massive change. - -**Use for**: Production deployments, large refactors, sensitive migrations, multi-step workflows. - -**Trade-off**: Your time. C-threads require more human attention. Use them when the risk justifies it. - -Claude Code's `ask user question` tool supports C-threads naturally. Your agent can stop mid-workflow and request input before continuing to the next phase. - -### [4. F-Threads (Fusion)](#4-f-threads-fusion) - -Same prompt to multiple agents, then aggregate the best results. - -This is the "best of N" pattern applied to entire workflows. Send the same prompt to four agents. Review all four results. Pick the best one. Or cherry-pick ideas from multiple results to create something superior. - -**Why this works**: More agents trying means higher chance of success. If one agent struggles, another might nail it. Four perspectives beat one. - -**Use for**: Rapid prototyping, research questions, architecture decisions, code reviews where confidence matters. - -**The future of prototyping**: F-threads will dominate rapid prototyping. Spin up multiple agents, let them all attempt the same problem, fuse the results. More compute equals more confidence. - -### [5. B-Threads (Big/Meta)](#5-b-threads-bigmeta) - -One thread that contains other threads inside it. - -This is where things get meta. Your prompts fire off other prompts. Sub-agents spawn more sub-agents. An orchestrator agent kicks off a planning agent, then a building agent, then a review agent. - -From your perspective as the engineer, you still just prompt at the beginning and review at the end. But underneath, multiple threads execute automatically. - -**The clearest example**: Sub-agents. When you tell Claude Code to "use sub-agents to handle these three tasks," it spawns three separate threads internally. You prompted once, but three threads ran. - -**Use for**: Complex multi-file changes, team-of-agents workflows, orchestrated builds. - -**The pattern**: Agent writes prompts for you. The orchestrator agent writes prompts for worker agents. You've 10x'd your throughput without 10x'ing your effort. - -### [6. L-Threads (Long Duration)](#6-l-threads-long-duration) - -Extended autonomy without human intervention. - -This is the base thread stretched to its limit. Instead of 10 tool calls, you're running 100. Instead of 5 minutes, you're running 5 hours. Boris has run threads for over 26 hours. - -L-threads require: - -- Excellent prompts (great planning = great prompting) -- Robust verification (so the agent knows when it's done) -- Checkpoint state (so work survives context limits) - -**The connection to Ralph**: The [Ralph Wiggum technique](/blog/guide/mechanics/ralph-wiggum-technique) is built for L-threads. The stop hook keeps the agent iterating until work is genuinely complete. No premature exits. No human babysitting. - -**Use for**: Overnight feature builds, large codebases, backlog clearing. - -## [The Hidden Seventh Thread: Z-Threads](#the-hidden-seventh-thread-z-threads) - -There's one more thread type that represents the future of engineering. - -**Z-threads**: Zero-touch threads. Maximum trust with your agents. No review node at all. - -This isn't vibe coding. This is advanced agentic engineering where you've built so much verification, so many guardrails, that you genuinely don't need to review the output. - -The agent ships to production. Observes analytics. Decides if the change worked. Iterates. - -Most engineers aren't ready for Z-threads. But that's the direction everything is heading. The goal: build systems you trust enough that review becomes optional. - -## [The Core Four](#the-core-four) - -Everything in thread-based engineering connects back to four fundamentals: - -1. **Context**: What your agent knows -2. **Model**: Which model you're using -3. **Prompt**: What you're asking -4. **Tools**: What your agent can do - -If you understand these four elements, you understand agents. Every thread optimization ultimately improves one of these. - -- Better prompts = longer threads -- Better context = more accurate work -- Better tools = more capabilities -- Better models = higher reliability - -## [The Stop Hook Pattern](#the-stop-hook-pattern) - -For L-threads especially, the stop hook is critical. - -When your agent tries to stop, the stop hook intercepts: - -1. Agent tries to complete -2. Stop hook runs validation code -3. Decision: Is the task actually complete? -4. If no: Block the stop, continue iterating -5. If yes: Allow completion - -This is the technical foundation of Ralph loops. The stop hook ensures your agent doesn't quit when it thinks it's done. It quits when the work is verified. - -## [Four Ways to Improve](#four-ways-to-improve) - -Thread-based engineering gives you a concrete framework for measuring improvement. - -### [1. Run More Threads (P-Threads)](#1-run-more-threads-p-threads) - -Can you spin up more parallel agents? Boris runs 10-15. Can you run 5? Can you run 3? - -**Measure**: How many concurrent threads are you running? - -### [2. Run Longer Threads (L-Threads)](#2-run-longer-threads-l-threads) - -Can your threads run for more tool calls without human intervention? - -**Measure**: Average tool calls per thread before you need to intervene. - -### [3. Run Thicker Threads (B-Threads)](#3-run-thicker-threads-b-threads) - -Can you nest threads inside threads? Can one prompt kick off five sub-agents? - -**Measure**: How much work happens per single prompt you write? - -### [4. Run Fewer Checkpoints](#4-run-fewer-checkpoints) - -Can you reduce human-in-the-loop reviews? Can you trust your verification enough to skip review? - -**Measure**: How many phases can you run before needing to manually check? - -If you're improving at any of these four dimensions, you're improving as an agentic engineer. That's the metric. That's how you know. - -## [Practical Application](#practical-application) - -Here's how thread-based engineering looks in practice: - -**Monday morning**: You have five features to build. - -**Old approach**: Work on feature 1. Finish. Work on feature 2. Finish. Repeat. Five sequential sessions. - -**Thread-based approach**: - -1. Write specs for all five features (planning phase) -2. Spin up five parallel Claude Code instances (P-threads) -3. Assign each instance a feature -4. Let them run while you review the first completed results -5. Some features need chunked phases (C-threads) -6. For the complex one, spawn sub-agents (B-thread) -7. The overnight task runs as an L-thread with Ralph loop - -Same five features. But now you're running more threads, thicker threads, and longer threads. - -## [Connecting to Ralph Wiggum](#connecting-to-ralph-wiggum) - -Thread-based engineering and [Ralph loops](/blog/guide/mechanics/ralph-wiggum-technique) are complementary frameworks. - -**Ralph** answers: How do I keep an agent running reliably until work is done? - -**Thread-based engineering** answers: How do I scale my agent usage and measure improvement? - -Ralph gives you L-threads. Thread-based engineering tells you when to use L-threads versus P-threads versus B-threads. - -The stop hook that powers Ralph is the same stop hook that enables long-running L-threads. Verification-first development makes both work. - -## [The Mindset Shift](#the-mindset-shift) - -The engineers who are pulling ahead aren't just "using AI." They're thinking in threads. - -Every task becomes: What type of thread is this? Can I parallelize it? Can I chain it? Can I nest sub-threads inside? - -The constraint shifts from "how fast can I code?" to "how many useful threads can I run?" - -Scale your compute. Scale your impact. - -## [Getting Started](#getting-started) - -Start simple: - -1. **Audit your current work**: How many threads do you typically run? (Most engineers: 1) -2. **Add one P-thread**: Open a second terminal. Run a parallel task while your first agent works. -3. **Time your threads**: How many tool calls before you intervene? Track this. -4. **Try a C-thread**: Break a large task into explicit phases. Review between phases. -5. **Build toward L-threads**: Set up verification. Try letting an agent run for 30 minutes unattended. - -The goal isn't to immediately run 15 parallel Z-threads. The goal is continuous improvement. More threads. Longer threads. Thicker threads. Fewer checkpoints. - -That's how you know you're improving. Not feeling. Measuring. - -## [Next Steps](#next-steps) - -- Implement [Ralph Wiggum loops](/blog/guide/mechanics/ralph-wiggum-technique) for L-thread autonomy -- Learn [async workflows](/blog/guide/agents/async-workflows) for managing parallel agents -- Explore [sub-agent design](/blog/guide/agents/sub-agent-design) for B-thread architectures -- Master [feedback loops](/blog/guide/development/feedback-loops) for verification patterns - -Thread-based engineering transforms AI coding from an art into a science. You can measure it. You can improve it. You can scale it. - -Start counting your threads. - -Last updated on - -[Previous - -Ralph Wiggum Technique](/blog/guide/mechanics/ralph-wiggum-technique)[Next - -Autonomous Agent Loops](/blog/guide/mechanics/autonomous-agent-loops) diff --git a/docs/site/src/content/blog/todo-workflows.md b/docs/site/src/content/blog/todo-workflows.md deleted file mode 100644 index 621373c7..00000000 --- a/docs/site/src/content/blog/todo-workflows.md +++ /dev/null @@ -1,146 +0,0 @@ ---- -slug: "todo-workflows" -title: "Claude Code Todo Lists: Perfect Task Execution Guide" -description: "Master Claude Code's todo system to ensure complete task execution. Learn how to structure todos that Claude follows perfectly every single time." -date: "2025-08-23" -author: "Max Ritter" -tags: [Guide, Development] -readingTime: 4 -keywords: "claude, code, execution, guide, lists, perfect, task, todo, workflows" ---- - -Development - -# Claude Code Todo Lists: Mirror Your Instructions for Perfect Execution - -Master Claude Code's todo system to ensure complete task execution. Learn how to structure todos that Claude follows perfectly every single time. - -> **Update (Jan 2025)**: Claude Code now has a more powerful [task management system](/blog/guide/development/task-management) with dependencies, blockers, and multi-session collaboration. The fundamentals below still apply, but see the new guide for advanced workflows. - -**Problem**: Claude Code sometimes misses steps or does tasks in the wrong order, leaving you wondering if your instructions were clear enough. - -**Quick Win**: Add "create a todo list first" to any complex request: - -```p-4 -claude "add user authentication - create a todo list first, then implement each step" -``` - -A checklist appears in your terminal showing Claude's plan. You see misunderstandings before any code is written. - -## [Todo Lists as Instruction Mirrors](#todo-lists-as-instruction-mirrors) - -Your biggest frustration with AI coding isn't the bugs—it's wondering whether Claude truly understood what you asked for. Claude Code uses a built-in TodoWrite tool to create and manage task checklists that appear in your terminal UI. - -Think of todos as Claude's "repeat back what I heard" confirmation. The checklist updates in real-time as Claude works, showing completed items, current focus, and remaining tasks. Perfect alignment = clear instructions. Divergence = communication gaps caught early. - -### [Common Todo Divergence Patterns](#common-todo-divergence-patterns) - -**Out of Order**: Instructions say A then B, todos list B then A -**Missing Steps**: You mention tests, todos skip testing entirely -**Wrong Detail**: You want high-level "update docs," Claude lists individual files -**Misinterpretation**: You say "review changes," Claude plans "commit changes" - -## [Real-Time Todo Steering](#real-time-todo-steering) - -Claude's todo list updates in real-time as you provide feedback. This creates a powerful steering mechanism for complex tasks. - -**Before Steering:** - -```p-4 -- [ ] Fix navigation menu alignment -- [ ] Update footer text -- [ ] Add contact form validation -- [ ] Change button color to blue -- [ ] Update documentation -``` - -**Mid-Task Steering:** - -```p-4 -claude "Actually make the button green instead of blue" -``` - -**After Steering:** - -```p-4 -- [x] Fix navigation menu alignment -- [x] Update footer text -- [ ] Add contact form validation -- [ ] Change button color to green # Updated -- [ ] Update documentation -``` - -Notice how Claude automatically updated the pending todo while preserving completed work. - -## [Advanced Todo Patterns](#advanced-todo-patterns) - -### [Get Specific Todos](#get-specific-todos) - -Instead of vague todos like "style navbar," demand specifics: - -```p-4 -Bad: - [ ] Style the navigation bar - -Good: - [ ] Change navbar height from 60px to 80px - [ ] Reduce padding from 16px to 12px - -- [ ] Update background to rgba(255,255,255,0.95) -``` - -### [Phase-Based Dependencies](#phase-based-dependencies) - -Structure todos with clear phases: - -```p-4 -Phase 1: Setup database schema, create user model -Phase 2: Build registration and login (needs Phase 1) -Phase 3: Add validation and styling (needs Phase 2) -``` - -### [Quality Checkpoints](#quality-checkpoints) - -1. **Order**: Logical sequence? -2. **Complete**: All steps included? -3. **Right Detail**: Appropriate granularity? -4. **Clear**: Another dev could follow? - -## [Troubleshooting Todo Issues](#troubleshooting-todo-issues) - -**Claude skips todos**: Add "Check todo list before starting each step" to your [CLAUDE.md file](/blog/guide/mechanics/claude-md-mastery). - -**Todos too generic**: Ask "Break this down into specific, measurable steps" after giving instructions. - -**Wrong priorities**: Use numbered lists instead of bullets when order matters: - -```p-4 -1. First, backup the database -2. Then run migrations -3. Finally, restart services -``` - -## [Making Todos Stick](#making-todos-stick) - -The most effective todo workflows become automatic. Add this pattern to your development routine: - -1. Give Claude your task instructions -2. Ask "Create a detailed todo list" -3. Review for alignment with your intentions -4. Refine instructions if todos diverge -5. Proceed with confidence - -Perfect todo alignment means perfect instruction clarity. When Claude's todos mirror your mental checklist exactly, you've achieved crystal-clear communication. - -**Next Steps**: - -- Learn about [git integration patterns](/blog/guide/development/git-integration) for todo-driven commits -- Master [feedback loops](/blog/guide/development/feedback-loops) to iterate on todo quality -- Check out [permission management](/blog/guide/development/permission-management) for secure todo execution -- Explore [planning modes](/blog/guide/mechanics/planning-modes) for structured todo creation -- Review [context management](/blog/guide/mechanics/context-management) to maintain todo history - -Last updated on - -[Previous - -Feedback Loops](/blog/guide/development/feedback-loops)[Next - -Task Management](/blog/guide/development/task-management) diff --git a/docs/site/src/content/blog/troubleshooting.md b/docs/site/src/content/blog/troubleshooting.md deleted file mode 100644 index 7261644c..00000000 --- a/docs/site/src/content/blog/troubleshooting.md +++ /dev/null @@ -1,319 +0,0 @@ ---- -slug: "troubleshooting" -title: "Claude Code Not Working? 5 Fixes (90% Success)" -description: "Command not found, invalid API key, 503 errors, slow responses. Run these 5 Claude Code checks in order and you're back to coding fast." -date: "2025-08-16" -author: "Max Ritter" -tags: [Guide] -readingTime: 6 -keywords: "5, 90, claude, code, fixes, not, success, troubleshooting, working" ---- - -# Claude Code Not Working? 5 Fixes That Solve 90% of Problems - -Command not found, invalid API key, 503 errors, slow responses. Run these 5 Claude Code checks in order and you're back to coding fast. - -Claude Code not working? Here's the fix: 90% of issues are solved by these five quick checks. Run them in order, and you'll be back to coding in minutes. - -**Quick diagnosis checklist:** - -```p-4 -# 1. Check your installation -claude --version - -# 2. Test your internet connection -ping claude.ai - -# 3. Verify your API key -echo $ANTHROPIC_API_KEY - -# 4. Clear session state (inside Claude Code) -/clear - -# 5. Restart with fresh config -claude config -``` - -If any command fails, jump to the matching section below for the exact fix. - -## [Installation Problems](#installation-problems) - -**Error: "command not found: claude"** - -Your installation failed or PATH isn't configured. The native installer fixes this automatically: - -```p-4 -# Reinstall with native installer (recommended) -curl -fsSL https://claude.ai/install.sh | bash # macOS/Linux -# Windows PowerShell: irm https://claude.ai/install.ps1 | iex - -# Verify installation -which claude -``` - -See the [native installer guide](/blog/guide/native-installer) for details. - -**Error: "Node.js version not supported"** - -Claude Code requires Node.js 18+. Check your version: - -```p-4 -# Check current version -node --version - -# If below 18.0, install latest Node.js -# Visit nodejs.org and download the LTS version -``` - -**Error: "EACCES permission denied"** - -Fix npm permissions on macOS/Linux: - -```p-4 -# Fix npm ownership -sudo chown -R $(whoami) ~/.npm - -# Alternative: use a version manager like nvm -curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash -``` - -For Windows, run Command Prompt as Administrator and retry installation. - -## [Authentication Issues](#authentication-issues) - -**Error: "Invalid API key"** - -Your API key is missing or incorrect. Set it properly: - -```p-4 -# Reconfigure Claude Code -claude config - -# Or set environment variable -export ANTHROPIC_API_KEY="your-api-key-here" -``` - -Get your API key from [console.anthropic.com](https://console.anthropic.com) and ensure no extra spaces. - -**Error: "Subscription not recognized"** - -Claude Max/Pro authentication problems: - -1. Log out of Claude completely in your browser -2. Clear cookies and browser cache -3. Use incognito/private mode to log back in -4. Run `claude config` to re-authenticate - -## [Connection Problems](#connection-problems) - -**Error: "503 Service Unavailable"** - -This is a server-side issue, not your setup: - -- Wait 2-5 minutes for Anthropic servers to recover -- Check [status.anthropic.com](https://status.anthropic.com) for service updates -- Don't reinstall - this won't fix server problems - -**Claude Code starts but doesn't respond** - -Reset your session state: - -```p-4 -# Clear conversation history (run inside Claude Code) -/clear - -# Or restart with fresh session -exit -claude -``` - -If still unresponsive, check your internet connection and try again. - -## [Performance Issues](#performance-issues) - -**Slow responses or hanging** - -Switch to a faster model and optimize context: - -```p-4 -# Use Claude Sonnet 4 for speed -claude --model claude-sonnet-4-20250514 - -# Compress conversation history (run inside Claude Code) -/compact keep only function names and current errors -``` - -**"Context window full" errors** - -Your conversation is too long. Reset or compress: - -```p-4 -# Quick fix: start fresh (run inside Claude Code) -/clear - -# Better fix: compress intelligently -/compact preserve main components and recent changes only -``` - -## [File Permission Errors](#file-permission-errors) - -**Error: "Permission denied on file operations"** - -Fix directory permissions: - -```p-4 -# Check current permissions -ls -la - -# Fix ownership of project directory -sudo chown -R $(whoami) . - -# Verify Claude Code can access files -claude --add-dir $(pwd) -``` - -## [Settings and Configuration Issues](#settings-and-configuration-issues) - -**Settings not applying as expected** - -When settings behave unexpectedly, the cause is almost always scope precedence. Settings follow this priority: Managed > Command line > Local > Project > User. A setting in `.claude/settings.local.json` overrides the same key in `.claude/settings.json`, which overrides `~/.claude/settings.json`. - -```p-4 -# Check which settings files exist -ls ~/.claude/settings.json -ls .claude/settings.json -ls .claude/settings.local.json -``` - -**Managed settings overriding your preferences** - -If your IT team deployed `managed-settings.json`, those settings take highest priority and cannot be overridden. On macOS, managed settings live at `/Library/Application Support/ClaudeCode/`. On Linux/WSL, check `/etc/claude-code/`. On Windows, check `C:\Program Files\ClaudeCode\`. If a setting refuses to change, ask your admin whether a managed policy is enforcing it. - -**Settings autocomplete not working** - -Add the `$schema` line to the top of your settings.json for editor validation and autocomplete: - -```p-4 -{ - "$schema": "https://json.schemastore.org/claude-code-settings.json" -} -``` - -For a complete walkthrough of the scope system, see our [configuration basics guide](/blog/guide/configuration-basics#the-settingsjson-scope-system). For the full settings key reference, see the [settings reference](/blog/guide/settings-reference). - -## [Sandbox and Security Issues](#sandbox-and-security-issues) - -**Error: "bubblewrap not installed" (Linux/WSL2)** - -Sandboxing on Linux requires the `bubblewrap` and `socat` packages. Install them and try again: - -```p-4 -# Debian/Ubuntu -sudo apt install bubblewrap socat - -# Fedora -sudo dnf install bubblewrap socat -``` - -**Watchman conflicts with sandbox** - -Facebook's Watchman file watcher is incompatible with Claude Code's sandbox. If you see errors related to watchman, disable it or exclude it from the sandbox. The sandbox isolates filesystem access, which conflicts with watchman's monitoring approach. - -**Docker commands failing inside sandbox** - -Docker needs to run outside the sandbox. Add it to `excludedCommands` in your settings.json: - -```p-4 -{ - "sandbox": { - "enabled": true, - "excludedCommands": ["docker", "docker-compose"] - } -} -``` - -For more on sandbox configuration, see our [sandboxing guide](/blog/guide/sandboxing-guide). - -## [Debug Environment Variables](#debug-environment-variables) - -When diagnosing persistent issues, these environment variables help isolate the problem: - -| Variable | What It Does | -| --- | --- | -| `CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC` | Disables auto-updates, telemetry, error reporting, and bug reports all at once. Useful for isolating network issues. | -| `DISABLE_AUTOUPDATER` | Stops automatic updates only. Set to `1` if updates are causing problems. | -| `DISABLE_ERROR_REPORTING` | Opts out of Sentry error reporting (set to `1`). | -| `DISABLE_TELEMETRY` | Opts out of Statsig telemetry (set to `1`). | -| `CLAUDE_CODE_DISABLE_BACKGROUND_TASKS` | Disables all background task functionality (set to `1`). | - -```p-4 -# Run Claude Code with all non-essential traffic disabled -CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1 claude - -# Or set just the auto-updater off -DISABLE_AUTOUPDATER=1 claude -``` - -If you suspect network or proxy issues, you can also set `HTTP_PROXY` or `HTTPS_PROXY` to route traffic through a proxy, or use `NO_PROXY` to bypass proxy for specific domains. - -For the full environment variable reference, see [configuration basics](/blog/guide/configuration-basics#essential-environment-variables) or the [settings reference](/blog/guide/settings-reference). - -## [Advanced Fixes](#advanced-fixes) - -**Nothing else worked? Complete reset:** - -```p-4 -# 1. Uninstall any existing installation -npm uninstall -g @anthropic-ai/claude-code # if installed via npm - -# 2. Remove config files -rm ~/.claude.json -rm -rf ~/.claude/ - -# 3. Fresh install with native installer (recommended) -curl -fsSL https://claude.ai/install.sh | bash # macOS/Linux -# Windows PowerShell: irm https://claude.ai/install.ps1 | iex - -# 4. Reconfigure -claude config -``` - -The [native installer](/blog/guide/native-installer) handles PATH configuration automatically and includes auto-updates. - -## [Success Verification](#success-verification) - -After fixing issues, verify everything works: - -```p-4 -# Test basic functionality -claude "write hello world in Python" - -# Test file operations -echo "# Test" > test.md -claude "read and improve test.md" - -# Test help command (inside Claude Code) -/help -``` - -Your Claude Code should now respond normally. If problems persist, the issue may be service-side - wait a few minutes and try again. - -## [Next Steps](#next-steps) - -Now that Claude Code is working: - -- Explore the [complete guide](/blog/guide) for an overview of all features -- Set up your [first project](/blog/guide/first-project) properly -- Learn [context management](/blog/guide/mechanics/context-management) to avoid future issues -- Configure [optimal settings](/blog/guide/configuration-basics) for your workflow -- Switch to the [native installer](/blog/guide/native-installer) for automatic updates -- Check our [installation guide](/blog/guide/installation-guide) for platform-specific tips -- Review [common errors](/blog/guide/faq) to prevent future problems - -Last updated on - -[Previous - -Examples & Templates](/blog/guide/examples-templates)[Next - -FAQ](/blog/guide/faq) diff --git a/docs/site/src/content/blog/types.ts b/docs/site/src/content/blog/types.ts deleted file mode 100644 index ad8a4080..00000000 --- a/docs/site/src/content/blog/types.ts +++ /dev/null @@ -1,11 +0,0 @@ -export interface BlogArticle { - slug: string; - title: string; - description: string; - date: string; - author: string; - tags: string[]; - readingTime: number; - content: string; - keywords: string; -} diff --git a/docs/site/src/content/blog/usage-optimization.md b/docs/site/src/content/blog/usage-optimization.md deleted file mode 100644 index 5db28b44..00000000 --- a/docs/site/src/content/blog/usage-optimization.md +++ /dev/null @@ -1,184 +0,0 @@ ---- -slug: "usage-optimization" -title: "Claude Code Pricing: Optimize Your Token Usage & Costs" -description: "Master Claude Code pricing and token optimization to reduce costs by 70%. Learn proven strategies to maximize value from your API or subscription." -date: "2025-08-23" -author: "Max Ritter" -tags: [Guide, Development] -readingTime: 5 -keywords: "claude, code, costs, optimization, optimize, pricing, token, usage" ---- - -Development - -# Claude Code Pricing: Optimize Your Token Usage & Costs - -Master Claude Code pricing and token optimization to reduce costs by 70%. Learn proven strategies to maximize value from your API or subscription. - -**Problem**: Claude Code costs adding up fast, hitting usage limits, or unsure which subscription tier fits your workflow. Strategic [model selection](/blog/models/model-selection) and usage tracking can cut costs by 70%. - -**Quick Win**: Install ccusage to see exactly where your tokens go: - -```p-4 -npm install -g @ryoppippi/ccusage -ccusage daily -``` - -This shows your daily token consumption and cost breakdown immediately. - -## [Understanding Claude Code Pricing](#understanding-claude-code-pricing) - -Claude Code requires at least a Pro subscription ($20/month) since the free tier lacks terminal access. - -**Claude Pro ($20/month)** - 5x usage limits vs free, Sonnet access, ~45 messages per 5-hour window. Best for learning and hobby projects. - -**Claude Max 5x ($100/month)** - 5x Pro limits (~225 messages/5hr), generous Opus access. Best for professional developers. - -**Claude Max 20x ($200/month)** - 20x Pro limits (~900 messages/5hr), full Opus access. Best for heavy daily usage and complex engineering. - -**API Pay-per-Use** - Sonnet: $3/$15 per million input/output tokens. Opus: $15/$75 per million tokens. Best for predictable high-volume work. - -## [Real Optimization Commands](#real-optimization-commands) - -### [Model Switching with /model](#model-switching-with-model) - -Switch models based on task complexity to control costs: - -```p-4 -/model sonnet # Default for 80% of tasks -/model opus # Complex architecture decisions only -``` - -**Rule**: Start every session with Sonnet. Only switch to Opus when you need deep analysis or complex refactoring. - -### [Context Control Commands](#context-control-commands) - -```p-4 -/compact # Compress conversation when context gets long -/clear # Start fresh for unrelated tasks -``` - -Long conversations consume more tokens with every message. Use `/compact` when you notice Claude losing track, and `/clear` when switching to completely different work. - -### [Planning Mode (Shift+Tab)](#planning-mode-shifttab) - -Press **Shift+Tab twice** in the terminal to enter plan mode before expensive operations. Planning first prevents costly rework - Claude outlines the approach before writing code, so you catch issues early. Learn more in our [planning modes guide](/blog/guide/mechanics/planning-modes). - -## [Track Your Usage](#track-your-usage) - -Monitor consumption with ccusage reports: - -```p-4 -ccusage daily # Daily breakdown (default) -ccusage monthly # Monthly aggregation -ccusage blocks --live # Real-time 5-hour billing windows -ccusage daily --breakdown # Per-model cost breakdown -``` - -Filter by date range when investigating spikes: - -```p-4 -ccusage daily --since 20250101 --until 20250131 -``` - -## [Cost-Saving Patterns](#cost-saving-patterns) - -**Specific prompts beat vague ones**. Compare: - -```p-4 -# Expensive (wastes tokens on clarification) -claude "make this better" - -# Efficient (immediate results) -claude "optimize readability in src/auth.js - extract constants, add error handling" -``` - -**Batch related tasks** to maximize context efficiency: - -```p-4 -claude "update error handling in auth.js, user.js, and api.js" -``` - -**Watch for expensive patterns**: - -- Long debugging sessions - break into smaller, focused requests -- Repeated explanations - save them in [CLAUDE.md](/blog/guide/mechanics/claude-md-mastery) -- Full codebase reviews - use targeted file analysis instead - -## [Environment Variable Cost Controls](#environment-variable-cost-controls) - -Beyond model switching, several environment variables give you direct control over token spending: - -### [Reduce Non-Essential Token Usage](#reduce-non-essential-token-usage) - -```p-4 -# Suppress background model calls that aren't critical to your task -export DISABLE_NON_ESSENTIAL_MODEL_CALLS=1 -``` - -This disables model calls used for non-critical features like suggestions and tips. It won't affect your core workflow but reduces background token consumption. - -### [Disable Cost Warnings](#disable-cost-warnings) - -```p-4 -# Suppress cost warning messages in the CLI -export DISABLE_COST_WARNINGS=1 -``` - -Useful if you've already budgeted for your usage and don't want interruptions. Not recommended until you've established a baseline with `ccusage`. - -### [Prompt Caching Controls](#prompt-caching-controls) - -Claude Code uses prompt caching by default to reduce costs and latency. If you need to disable it for specific models (for debugging or benchmarking), use these variables: - -```p-4 -# Disable prompt caching globally -export DISABLE_PROMPT_CACHING=1 - -# Or disable per-model -export DISABLE_PROMPT_CACHING_HAIKU=1 -export DISABLE_PROMPT_CACHING_SONNET=1 -export DISABLE_PROMPT_CACHING_OPUS=1 -``` - -The global setting overrides per-model settings. Keep prompt caching enabled for production use since it significantly reduces costs on repeated context. See the [model selection guide](/blog/models/model-selection) for the full prompt caching reference. - -### [The opusplan Strategy](#the-opusplan-strategy) - -If you need Opus-level reasoning but want to control costs, the `opusplan` [model alias](/blog/models/model-selection) provides an automated hybrid approach: - -```p-4 -claude --model opusplan -``` - -With `opusplan`, Claude uses Opus during plan mode for complex reasoning and architecture decisions, then automatically switches to Sonnet for code generation and implementation. You get Opus reasoning quality where it matters most (planning) without paying Opus rates for every line of code written. - -This is one of the most effective cost optimization strategies for developers who regularly use [planning mode](/blog/guide/mechanics/planning-modes). - -## [When Things Go Wrong](#when-things-go-wrong) - -**Approaching limits?** Switch models and compact: - -```p-4 -/model sonnet -/compact -``` - -**Hit rate limits?** Wait for hourly reset, batch requests instead of rapid calls, or consider upgrading your plan. - -## [Next Steps](#next-steps) - -- Install [ccusage](https://github.com/ryoppippi/ccusage) and run `ccusage daily --breakdown` -- Master [context management](/blog/guide/mechanics/context-management) to reduce token waste -- Configure [model selection](/blog/models/model-selection) for your workflow -- Review [troubleshooting tips](/blog/guide/troubleshooting) to avoid expensive debugging - -Track weekly and adjust based on data. Most developers reduce costs 40-70% with these strategies. - -Last updated on - -[Previous - -Project Templates](/blog/guide/development/project-templates)[Next - -Deep Thinking Techniques](/blog/guide/performance/deep-thinking-techniques) diff --git a/docs/site/src/content/blog/what-is-claude-code.md b/docs/site/src/content/blog/what-is-claude-code.md deleted file mode 100644 index 93cdfdd9..00000000 --- a/docs/site/src/content/blog/what-is-claude-code.md +++ /dev/null @@ -1,92 +0,0 @@ ---- -slug: "what-is-claude-code" -title: "What is Claude Code? AI Terminal Revolution Explained" -description: "Claude Code transforms your terminal into an AI-powered development powerhouse. Discover why 115K developers chose it over traditional IDEs." -date: "2025-08-23" -author: "Max Ritter" -tags: [Guide] -readingTime: 4 -keywords: "ai, claude, code, explained, revolution, terminal, what" ---- - -# What is Claude Code: The Terminal Revolution Nobody Saw Coming - -Claude Code transforms your terminal into an AI-powered development powerhouse. Discover why 115K developers chose it over traditional IDEs. - -You paste code into a browser AI, wait for a response, paste the fix back into your editor, realize it broke something else, and repeat. Sound familiar? That loop is why Claude Code exists. If you're new here, [explore the complete Claude Code guide](/blog/guide) for a full overview of what's possible. - -## [Quick Win: See It Work in 2 Minutes](#quick-win-see-it-work-in-2-minutes) - -Open your terminal in any project folder and run: - -```p-4 -npx @anthropic-ai/claude-code -claude "explain this codebase structure and find potential issues" -``` - -Claude Code reads your entire project, files, Git history, dependencies, and returns actionable insights. No copy-pasting. No context loss. It just understands. - -## [What is Claude Code?](#what-is-claude-code) - -**Claude Code is Anthropic's agentic coding assistant** that runs directly in your terminal, IDE, or browser. Unlike chat-based AI tools, Claude Code has full access to your project files, can execute commands, and makes changes with your approval. - -The paradigm shift: **you become the main thread**. Instead of manually shuttling context between AI and code, you delegate tasks and Claude handles execution. Think of yourself as a CPU scheduler, queuing up tasks while Claude processes them in parallel. - -```p-4 -# Claude Code works where you work -claude "add authentication to the Express routes" -claude "write tests for the payment service" -claude "refactor this component to use React hooks" -``` - -## [How It Works](#how-it-works) - -Claude Code runs locally and talks directly to Anthropic's API. No remote code indexing, no server-side processing of your code. Three capabilities make it powerful: - -**Full Codebase Awareness**: Claude reads your file structure, Git history, and dependencies automatically. Ask about any part of your project and it already knows the context. - -**Agentic Execution**: Claude does not just suggest code, it writes files, runs commands, creates commits, and verifies its own work. You approve each action. - -**Extensibility**: Through [MCP servers](/blog/tools/mcp-extensions/mcp-basics), Claude connects to databases, APIs, GitHub, and external tools to extend what it can do. - -## [Key Features You Should Know](#key-features-you-should-know) - -**Plan Mode** (shift+tab twice): Claude analyzes without changing anything. Perfect for understanding complex problems before committing to a solution. - -**Skills**: Reusable instruction packages that teach Claude domain-specific workflows. [Learn more about skills](/blog/guide/mechanics/claude-skills-guide). - -**Hooks**: Automated actions that trigger at specific points, like formatting code after every edit or blocking changes to production files. - -**Checkpoints**: Automatic snapshots before each change. Press Esc twice to rewind if something breaks. - -**Subagents**: Parallel workers for complex tasks. One agent builds the frontend while another sets up the backend. - -## [Claude.ai vs Claude Code](#claudeai-vs-claude-code) - -| Browser Chat | Claude Code | -| --- | --- | -| Copy-paste context manually | Reads your codebase automatically | -| Forgets between sessions | Maintains project context | -| Suggests code snippets | Executes changes with approval | -| Isolated from your tools | Integrates Git, npm, test runners | - -This is not a small difference. It is the difference between having an advisor and having an engineer. Explore the full [configuration options](/blog/guide/configuration-basics) to customize behavior. - -## [Getting Started](#getting-started) - -1. **Install**: Use the [native installer](/blog/guide/native-installer) (one command, no Node.js) or see the [full installation guide](/blog/guide/installation-guide) -2. **First Project**: Complete the [first project tutorial](/blog/guide/first-project) to see it work -3. **Troubleshooting**: Check [common fixes](/blog/guide/troubleshooting) if you hit issues -4. **Go Deeper**: Learn about [permission management](/blog/guide/development/permission-management) for safer workflows - -Claude Code runs on Pro and Max subscriptions, or pay-as-you-go through the API. It works with Opus 4.5, Sonnet 4.5, and Haiku 4.5 models. - -**Ready to stop copy-pasting?** Use the [native installer](/blog/guide/native-installer) for a one-command setup, or see the [full installation guide](/blog/guide/installation-guide) for all options. - -Last updated on - -[Previous - -Who is Claude?](/blog/guide)[Next - -Installation Guide](/blog/guide/installation-guide) diff --git a/docs/site/src/content/blog/worktree-isolation-for-features.md b/docs/site/src/content/blog/worktree-isolation-for-features.md deleted file mode 100644 index 9fed9eda..00000000 --- a/docs/site/src/content/blog/worktree-isolation-for-features.md +++ /dev/null @@ -1,78 +0,0 @@ ---- -slug: "worktree-isolation-for-features" -title: "Git Worktree Isolation for AI-Built Features" -description: "Run AI work on a separate branch so your main branch stays clean. Squash merge when verified, discard if something goes wrong." -date: "2026-01-27" -author: "Max Ritter" -tags: [Guide, Git] -readingTime: 4 -keywords: "git worktree, Claude Code isolation, feature branches, squash merge, Claude Code git, safe AI development" ---- - -# Git Worktree Isolation for AI-Built Features - -When Claude builds a feature, it modifies files directly on your working branch. If something goes wrong — a bad refactor, a broken integration — you're left cleaning up the mess. Worktree isolation solves this by running AI work on a separate branch in a separate directory. - -## The Risk of Direct Branch Work - -Without isolation, Claude's changes mix with your uncommitted work. Problems: - -- A failed feature attempt leaves your branch dirty -- You can't easily diff "before Claude" vs "after Claude" -- Reverting means cherry-picking or manual file restoration -- Parallel work on the same branch creates conflicts - -## How Worktree Isolation Works - -Git worktrees create a second working directory linked to the same repository. Claude works in the worktree on a dedicated branch while your main branch stays untouched. - -``` -your-project/ ← Your branch (clean) -.worktrees/spec-auth/ ← Claude's branch (isolated) -``` - -Both directories share the same git history. Changes in the worktree don't affect your main directory until you explicitly merge them. - -## The Workflow - -1. **Create** — A worktree is created with a dedicated branch -2. **Implement** — All code changes happen in the worktree -3. **Verify** — Tests, linting, and review run against the worktree -4. **Sync** — Changes are squash-merged back to your branch -5. **Cleanup** — Worktree and branch are removed - -If anything goes wrong, you skip step 4 and cleanup — your branch was never touched. - -## Squash Merge - -When syncing back, all worktree commits are squash-merged into a single commit on your branch. This gives you: - -- **Clean history** — One commit per feature instead of dozens of intermediate ones -- **Easy revert** — `git revert` one commit undoes the entire feature -- **Review-friendly** — One diff to review, not a chain of incremental changes - -## Per-Task Commits - -Inside the worktree, Claude commits after each task. This enables: - -- `git bisect` to find which task introduced a problem -- Independent revert of individual tasks -- Better failure recovery — completed tasks are preserved - -These intermediate commits disappear in the squash merge, but they're useful during development. - -## When to Use Worktree Isolation - -| Scenario | Use Worktree? | -|----------|--------------| -| Quick bug fix | No — too much overhead | -| Small feature (1-3 files) | Optional | -| Large feature (5+ files) | **Yes** | -| Risky refactor | **Yes** | -| Experimental work | **Yes** | - -## How Pilot Manages Worktrees - -Pilot's `/spec` command creates worktrees automatically when `Worktree: Yes` (the default). The entire lifecycle — create, implement, verify, sync, cleanup — is handled without manual git commands. - -If your working tree has uncommitted changes when creating a worktree, Pilot asks whether to commit, stash, or skip isolation. No work is lost. diff --git a/docs/site/src/hooks/use-active-section.ts b/docs/site/src/hooks/use-active-section.ts deleted file mode 100644 index 22e82324..00000000 --- a/docs/site/src/hooks/use-active-section.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -/** - * Bidirectional scroll-spy hook for documentation sidebar navigation. - * - * Tracks which section is currently visible in the viewport and returns its ID. - * Uses a fresh IntersectionObserver (NOT useInView — which defaults to triggerOnce:true - * and only works for one-shot animations, not bidirectional tracking). - * - * rootMargin '-20% 0px -70% 0px' means a section is "active" when its top - * is in the top 30% of the viewport — feels natural for reading flow. - */ -export function useActiveSection(sectionIds: string[]): string { - const [activeId, setActiveId] = useState(sectionIds[0] ?? ""); - const debounceRef = useRef>(); - - useEffect(() => { - if (sectionIds.length === 0) return; - - const ratioMap = new Map(sectionIds.map((id) => [id, 0])); - - const observer = new IntersectionObserver( - (entries) => { - entries.forEach((entry) => { - ratioMap.set(entry.target.id, entry.intersectionRatio); - }); - - clearTimeout(debounceRef.current); - debounceRef.current = setTimeout(() => { - let bestId = ""; - let bestRatio = 0; - ratioMap.forEach((ratio, id) => { - if (ratio > bestRatio) { - bestRatio = ratio; - bestId = id; - } - }); - - if (bestId) { - setActiveId(bestId); - } - }, 75); - }, - { - rootMargin: "-20% 0px -70% 0px", - threshold: [0, 0.1, 0.25, 0.5, 0.75, 1.0], - }, - ); - - sectionIds.forEach((id) => { - const el = document.getElementById(id); - if (el) observer.observe(el); - }); - - return () => { - clearTimeout(debounceRef.current); - observer.disconnect(); - }; - }, [sectionIds]); - - return activeId; -} diff --git a/docs/site/src/pages/BlogArticlePage.tsx b/docs/site/src/pages/BlogArticlePage.tsx deleted file mode 100644 index 94f985c5..00000000 --- a/docs/site/src/pages/BlogArticlePage.tsx +++ /dev/null @@ -1,122 +0,0 @@ -import { useParams, Navigate, Link } from 'react-router-dom'; -import ReactMarkdown from 'react-markdown'; -import remarkGfm from 'remark-gfm'; -import NavBar from '@/components/NavBar'; -import Footer from '@/components/Footer'; -import SEO from '@/components/SEO'; -import { articles } from '@/content/blog'; -import { Calendar, Clock, ArrowLeft } from 'lucide-react'; - -const BlogArticlePage = () => { - const { slug } = useParams<{ slug: string }>(); - const article = articles.find((a) => a.slug === slug); - - if (!article) { - return ; - } - - const blogPostingStructuredData = { - "@context": "https://schema.org", - "@type": "BlogPosting", - "headline": article.title, - "description": article.description, - "datePublished": article.date, - "author": { - "@type": "Person", - "name": article.author - }, - "publisher": { - "@type": "Organization", - "name": "Pilot Shell", - "url": "https://pilot-shell.com", - "logo": { - "@type": "ImageObject", - "url": "https://pilot-shell.com/logo.png" - } - }, - "mainEntityOfPage": { - "@type": "WebPage", - "@id": `https://pilot-shell.com/blog/${article.slug}` - }, - "keywords": article.keywords - }; - - return ( - <> - - -
    -
    -
    - {/* Back Link */} - - - Back to Blog - - - {/* Article Header */} -
    - {/* Tags */} -
    - {article.tags.map((tag) => ( - - {tag} - - ))} -
    - - {/* Title */} -

    - {article.title} -

    - - {/* Meta */} -
    - {article.author} - -
    - - -
    - -
    - - {article.readingTime} min read -
    -
    -
    - - {/* Article Content */} -
    - - {article.content} - -
    -
    -
    -
    -