diff --git a/CHANGELOG.md b/CHANGELOG.md index ca69cb3..a32acf6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,14 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ### Added +- **MCP Server: 3 new tools** — compare_versions, get_threat/list_threats, search_examples + - `compare_versions(from, to?)` — diff entre deux versions Claude Code CLI : toutes les releases dans la plage, highlights agrégés, breaking changes agrégés + - `get_threat(id)` — lookup CVE (ex: `CVE-2025-53109`) ou technique d'attaque (ex: `T001`) depuis la threat database v2.4.0 + - `list_threats(category?)` — browse la threat-db : résumé global avec counts (sans catégorie) ou liste détaillée par section (`cves`, `authors`, `skills`, `techniques`, `mitigations`, `sources`) + - `search_examples(query, limit?)` — recherche sémantique dans les 175 templates par intention (ex: `"hook lint"`, `"agent code review"`) — complémentaire à `get_example` (nom exact) et `list_examples` (catégorie) + - `mcp-server/IDEAS.md` — futures idées documentées : `get_quiz`, `get_methodology`, `get_workflow`, resource `diff`, prompt `security-review` + - Total : 8 tools → 12 tools (+ 3 resources + 1 prompt) + - **Terminal Personalization Settings** — documentation `spinnerVerbs` + `spinnerTipsOverride` dans `guide/ultimate-guide.md` §3.3 Settings & Permissions - Nouvelle section "Terminal Personalization Settings" (ligne 4978) : exemples JSON pour `spinnerVerbs` (mode replace/add) et `spinnerTipsOverride` (avec `excludeDefault: true`) - `settings.json` available keys enrichi : ajout `spinnerVerbs`, `spinnerTipsOverride`, `plansDirectory`, `enableAllProjectMcpServers` diff --git a/README.md b/README.md index 9a47096..f647c4d 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,7 @@ Quiz Templates Threat Database + MCP Server

@@ -93,40 +94,39 @@ Both guides serve different needs. Choose based on your priority. **Quickest path**: [Cheat Sheet](./guide/cheatsheet.md) — 1 printable page with daily essentials -**Interactive onboarding** (no clone needed): +**Interactive onboarding** (no setup needed): ```bash claude "Fetch and follow the onboarding instructions from: https://raw.githubusercontent.com/FlorianBruniaux/claude-code-ultimate-guide/main/tools/onboarding-prompt.md" ``` **Browse directly**: [Full Guide](./guide/ultimate-guide.md) | [Visual Diagrams](./guide/diagrams/) | [Examples](./examples/) | [Quiz](./quiz/) -

-Prerequisites & Minimal CLAUDE.md Template +--- -**Prerequisites**: Node.js 18+ | [Anthropic API key](https://console.anthropic.com/) +## 🔌 MCP Server — Use the guide from any Claude Code session -```markdown -# Project: [NAME] +No cloning needed. Add to `~/.claude.json` and ask questions directly from any session: -## Tech Stack -- Language: [e.g., TypeScript] -- Framework: [e.g., Next.js 14] -- Testing: [e.g., Vitest] - -## Commands -- Build: `npm run build` -- Test: `npm test` -- Lint: `npm run lint` - -## Rules -- Run tests before marking tasks complete -- Follow existing code patterns -- Keep commits atomic and conventional +```json +{ + "mcpServers": { + "claude-code-guide": { + "type": "stdio", + "command": "npx", + "args": ["-y", "claude-code-ultimate-guide-mcp"] + } + } +} ``` -Save as `CLAUDE.md` in your project root. Claude reads it automatically. +12 tools: `search_guide`, `read_section`, `get_cheatsheet`, `get_digest`, `get_example`, `list_examples`, `get_release`, `get_changelog`, `list_topics`, `compare_versions`, `get_threat`, `list_threats`, `search_examples` — plus 8 slash commands `/ccguide:*` and a Haiku agent. -
+**Onboarding one-liner** (once MCP is configured): +```bash +claude "Use the claude-code-guide MCP server. Activate the claude-code-expert prompt, then run a personalized onboarding: ask me 3 questions about my goal, experience level, and preferred tone — then build a custom learning path using search_guide and read_section to navigate the guide with live source links." +``` + +→ [MCP Server README](./mcp-server/README.md) --- diff --git a/guide/architecture.md b/guide/architecture.md index ae880f2..4cadbd1 100644 --- a/guide/architecture.md +++ b/guide/architecture.md @@ -277,6 +277,7 @@ Beyond the 8 core tools, Claude Code can leverage: - **Context7**: Official library documentation lookup - **Sequential**: Structured multi-step reasoning - **Playwright**: Browser automation and E2E testing +- **claude-code-ultimate-guide**: 12 tools — guide search, release tracking, `compare_versions`, security threat lookup (`get_threat`, `list_threats` with 28 CVEs + 655 malicious skills), template search (`search_examples`) — `npx -y claude-code-ultimate-guide-mcp` **Community Plugins**: - **ast-grep**: AST-based structural code search (explicit invocation) diff --git a/mcp-server/IDEAS.md b/mcp-server/IDEAS.md new file mode 100644 index 0000000..61bfc0e --- /dev/null +++ b/mcp-server/IDEAS.md @@ -0,0 +1,78 @@ +# MCP Server — Future Ideas + +Tracked ideas that didn't make it into the current release. Implementation complexity varies; all are technically feasible with existing data. + +--- + +## Tools + +### `get_quiz(topic?, count?)` + +Interactive quiz from `machine-readable/questions.json` (274 questions, already used by the landing site). + +- `topic` (optional string): filter by topic (e.g. "hooks", "agents", "mcp") +- `count` (optional number, default 5, max 20): number of questions to return +- Returns questions with options, correct answer, and explanation +- Useful for learning validation, onboarding, and teaching workflows + +**Data**: `machine-readable/questions.json` — not currently bundled in the package; would need bundling or GitHub fetch. + +--- + +### `get_methodology(name)` + +Step-by-step workflows for TDD, SDD, BDD from `guide/methodologies.md`. + +- `name` (string): `tdd | sdd | bdd | all` +- Returns the workflow steps, when to use it, and example commands +- Useful for agents doing test-driven development or spec-driven design + +**Data**: `guide/methodologies.md` — fetched on demand (already in section-reader infrastructure). + +--- + +### `get_workflow(name)` + +Step-by-step workflows from `guide/workflows/` directory. + +- `name` (string): partial name match (e.g. "code-review", "refactor", "debug") +- Returns the workflow with steps, triggers, and example prompts +- Could list available workflows when no name provided + +**Data**: `guide/workflows/*.md` — fetched on demand. + +--- + +## Resources + +### `claude-code-guide://diff` + +Shows what changed between the bundled YAML index version and the live GitHub version. + +- Fetch live `machine-readable/reference.yaml` from GitHub +- Diff against bundled version (entry count, new keys, changed values) +- Helps users know when the package is stale vs. the guide + +**Complexity**: Medium — requires async resource handler + structured diffing. + +--- + +## Prompts + +### `security-review` + +Dedicated security audit workflow prompt using the threat database. + +- Guides the model through: check CVEs → check authors → check skills → check techniques +- Returns a structured security posture report +- Reuses `list_threats` and `get_threat` tools internally + +**Dependency**: Requires `threats.ts` tools (already implemented in v1.1.0). + +--- + +## Notes + +- All ideas use data already in the repo — no new data sources needed +- `get_quiz` requires bundling `questions.json` (currently not in npm package) +- `get_methodology` and `get_workflow` are low-effort since section-reader already handles arbitrary file fetching diff --git a/mcp-server/README.md b/mcp-server/README.md new file mode 100644 index 0000000..b8602f3 --- /dev/null +++ b/mcp-server/README.md @@ -0,0 +1,230 @@ +# claude-code-ultimate-guide-mcp + +MCP server for the [Claude Code Ultimate Guide](https://github.com/FlorianBruniaux/claude-code-ultimate-guide) — search, read, and explore 20,000+ lines of documentation directly from Claude Code or any MCP-compatible client. + +No need to clone the repo. The guide's structured index is bundled in the package (~130KB compressed), and file content is fetched from GitHub on demand with 24h local cache. + +## Installation + +### Quick start (npx) + +Add to `~/.claude.json` (user-level, all projects): + +```json +{ + "mcpServers": { + "claude-code-guide": { + "type": "stdio", + "command": "npx", + "args": ["-y", "claude-code-ultimate-guide-mcp"] + } + } +} +``` + +### Global install + +```bash +npm install -g claude-code-ultimate-guide-mcp +``` + +```json +{ + "mcpServers": { + "claude-code-guide": { + "type": "stdio", + "command": "claude-code-guide-mcp" + } + } +} +``` + +### Per-project + +Add to `.claude/settings.json` at your repo root. + +## Tools + +### Search & Navigation + +| Tool | Signature | Description | +|------|-----------|-------------| +| `search_guide` | `(query, limit?)` | Search by keyword or question across 882 indexed entries. Returns ranked results with GitHub links. | +| `read_section` | `(path, offset?, limit?)` | Read a file section with pagination (500 lines max per call). Returns GitHub + guide site links. | +| `list_topics` | `()` | Browse all 25 topic categories in the guide with entry counts. | + +### Templates & Examples + +| Tool | Signature | Description | +|------|-----------|-------------| +| `get_example` | `(name)` | Fetch a production-ready template by exact name (agents, hooks, commands, skills). | +| `list_examples` | `(category?)` | List all templates by category with GitHub links. Categories: `agents`, `commands`, `hooks`, `skills`, `scripts`. | +| `search_examples` | `(query, limit?)` | Semantic search across all templates by intent (e.g. `"hook lint"`, `"agent code review"`). | + +### What's New + +| Tool | Signature | Description | +|------|-----------|-------------| +| `get_changelog` | `(count?)` | Last N entries from the guide CHANGELOG (default 5, max 20). | +| `get_digest` | `(period)` | Combined digest of guide changes + Claude Code CLI releases. Period: `day`, `week`, `month`. | +| `get_release` | `(version?, count?)` | Claude Code CLI release details. Pass a version (e.g. `"2.1.59"`) or omit for latest + recent N. | +| `compare_versions` | `(from, to?)` | Diff between two Claude Code versions: aggregated highlights and breaking changes for all releases in range. | + +### Security Intelligence + +| Tool | Signature | Description | +|------|-----------|-------------| +| `get_threat` | `(id)` | Look up a CVE (e.g. `"CVE-2025-53109"`) or attack technique (e.g. `"T001"`) from the threat database. | +| `list_threats` | `(category?)` | Browse the threat database. Without category: global summary with counts. With category: full section list. Categories: `cves`, `authors`, `skills`, `techniques`, `mitigations`, `sources`. | + +### Quick Reference + +| Tool | Signature | Description | +|------|-----------|-------------| +| `get_cheatsheet` | `(section?)` | Full cheatsheet or filtered to a specific section (e.g. `"hooks"`, `"agents"`, `"mcp"`). | + +## Resources + +| URI | Description | +|-----|-------------| +| `claude-code-guide://reference` | Full structured index (94KB YAML, ~900 entries) — use as fallback when search isn't enough | +| `claude-code-guide://releases` | Claude Code official releases history (YAML) | +| `claude-code-guide://llms` | Guide identity/navigation file (llms.txt) | + +## Prompts + +| Prompt | Args | Description | +|--------|------|-------------| +| `claude-code-expert` | `question?` | Activates expert mode with optimal workflow: search → read → example → YAML fallback | + +## Onboarding (first run) + +After installing the MCP server, run this in any Claude Code session for a personalized guided tour: + +```bash +claude "Use the claude-code-guide MCP server. Activate the claude-code-expert prompt, then run a personalized onboarding: ask me 3 questions about my goal, experience level, and preferred tone — then build a custom learning path using search_guide and read_section to navigate the guide with live source links." +``` + +This replaces the static URL-fetch approach with live search across 900+ indexed entries, always up to date, with GitHub + guide site links on every result. + +## Usage examples + +``` +# Search +search_guide("hooks") +search_guide("cost optimization") +search_guide("custom agents") + +# Read content +read_section("guide/ultimate-guide.md", 8077) +read_section("guide/cheatsheet.md") + +# Templates +get_example("code-reviewer") +get_example("pre-commit hook") +list_examples("agents") +list_examples("hooks") +search_examples("hook lint") +search_examples("agent code review") + +# What's new +get_digest("week") +get_digest("month") +get_changelog(10) +get_release() +get_release("2.1.59") +compare_versions("2.1.50", "2.1.59") +compare_versions("2.0.0") + +# Security +get_threat("CVE-2025-53109") +get_threat("T001") +list_threats() +list_threats("cves") +list_threats("techniques") + +# Quick reference +get_cheatsheet() +get_cheatsheet("hooks") +list_topics() +``` + +## Slash command shortcuts + +Install the companion slash commands for one-keystroke access in Claude Code. They live in `.claude/commands/ccguide/` of the guide repo — copy or symlink to `~/.claude/commands/ccguide/` for global availability. + +```bash +# From the guide repo root +cp -r .claude/commands/ccguide ~/.claude/commands/ccguide +``` + +Once installed, these commands are available in any Claude Code session: + +| Command | Example | What it does | +|---------|---------|--------------| +| `/ccguide:search ` | `/ccguide:search hooks` | Search + auto-read top results | +| `/ccguide:cheatsheet [section]` | `/ccguide:cheatsheet hooks` | Full cheatsheet or filtered | +| `/ccguide:digest ` | `/ccguide:digest week` | Guide + CC releases digest | +| `/ccguide:example ` | `/ccguide:example code-reviewer` | Fetch a template | +| `/ccguide:examples [category]` | `/ccguide:examples agents` | List templates by category | +| `/ccguide:release [version]` | `/ccguide:release 2.1.59` | CC CLI release details | +| `/ccguide:changelog [count]` | `/ccguide:changelog 10` | Recent guide CHANGELOG | +| `/ccguide:topics` | `/ccguide:topics` | Browse all 25 categories | + +## Custom agent + +A `claude-code-guide` agent is included in `.claude/agents/claude-code-guide.md`. It uses Haiku (fast, cheap) and searches the guide automatically before answering Claude Code questions. + +Copy to your `~/.claude/agents/` to use it globally: + +```bash +cp .claude/agents/claude-code-guide.md ~/.claude/agents/claude-code-guide.md +``` + +Then invoke with: `use claude-code-guide agent to answer: how do I configure hooks?` + +## Dev mode (local repo) + +If you've cloned the guide repo, set `GUIDE_ROOT` to read files locally instead of fetching from GitHub: + +```json +{ + "mcpServers": { + "claude-code-guide": { + "type": "stdio", + "command": "node", + "args": ["/path/to/claude-code-ultimate-guide/mcp-server/dist/index.js"], + "env": { + "GUIDE_ROOT": "/path/to/claude-code-ultimate-guide" + } + } + } +} +``` + +With `GUIDE_ROOT` set: +- YAML indexes loaded from the local repo (stays in sync with local changes) +- File content read directly from disk (no GitHub fetch, no cache) + +## Bundled content + +The npm package includes (~130KB compressed total): +- `content/reference.yaml` — 94KB structured index (~900 entries, ~882 indexed) +- `content/claude-code-releases.yaml` — 27KB releases history (76 releases) +- `content/llms.txt` — 8KB identity file + +Guide markdown files (3.5MB) are **not** bundled — they're fetched from GitHub on demand and cached at `~/.cache/claude-code-guide/{version}/`. + +## Cache + +File content is cached at `~/.cache/claude-code-guide/{package-version}/` with 24h TTL. If offline, stale cache is served as fallback. If no cache exists and offline, tools return inline summaries from the YAML index instead. + +## MCP Inspector + +Test locally with the official MCP Inspector: + +```bash +cd mcp-server +npm run build +GUIDE_ROOT=.. npx @modelcontextprotocol/inspector node dist/index.js +``` diff --git a/mcp-server/content/claude-code-releases.yaml b/mcp-server/content/claude-code-releases.yaml new file mode 100644 index 0000000..0441be3 --- /dev/null +++ b/mcp-server/content/claude-code-releases.yaml @@ -0,0 +1,701 @@ +# Claude Code Official Releases (condensed) +# Source: github.com/anthropics/claude-code/CHANGELOG.md +# Purpose: Track Claude Code product releases for documentation sync +# Maintained: Manual updates when new releases are announced + +latest: "2.1.59" +updated: "2026-02-26" + +# ════════════════════════════════════════════════════════════════ +# RELEASES (newest first, condensed highlights only) +# ════════════════════════════════════════════════════════════════ +releases: + + # ───────────────────────────────────────────────────────────── + # 2.1.x Series (January-February 2026) + # ───────────────────────────────────────────────────────────── + + - version: "2.1.59" + date: "2026-02-26" + highlights: + - "⭐ Auto-memory: Claude automatically saves useful context; manage with /memory" + - "⭐ /copy command: interactive picker for selecting individual code blocks or full response" + - "Smarter 'always allow' prefix suggestions for compound bash commands (per-subcommand prefixes)" + - "Fixed MCP OAuth token refresh race condition with multiple simultaneous instances" + - "Fixed config file corruption wiping authentication when multiple instances ran simultaneously" + breaking: [] + + - version: "2.1.58" + date: "2026-02-26" + highlights: + - "Remote Control expanded to more users" + breaking: [] + + - version: "2.1.56" + date: "2026-02-25" + highlights: + - "VSCode: Fixed another cause of 'command claude-vscode.editor.openLast not found' crashes" + breaking: [] + + - version: "2.1.55" + date: "2026-02-25" + highlights: + - "Fixed BashTool failing on Windows with EINVAL error" + breaking: [] + + - version: "2.1.53" + date: "2026-02-25" + highlights: + - "Stability fixes: panic on Windows, crashes on process spawn (Windows), WebAssembly crashes (Linux x64/Windows x64/ARM64)" + - "Fixed graceful shutdown leaving stale sessions with Remote Control; `--worktree` flag sometimes ignored on first launch" + - "Fixed UI flicker where user input disappeared briefly after submission; bulk agent kill (ctrl+f) single notification" + breaking: [] + + - version: "2.1.52" + date: "2026-02-24" + highlights: + - "VSCode: Fixed extension crash on Windows ('command claude-vscode.editor.openLast not found')" + breaking: [] + + - version: "2.1.51" + date: "2026-02-24" + highlights: + - "⭐ `claude remote-control` subcommand for external builds enabling local environment serving" + - "BashTool skips login shell by default when shell snapshot available (was `CLAUDE_BASH_NO_LOGIN=true`); tool results persist to disk at 50K chars (was 100K)" + - "SDK: `CLAUDE_CODE_ACCOUNT_UUID`, `CLAUDE_CODE_USER_EMAIL`, `CLAUDE_CODE_ORGANIZATION_UUID` env vars for account metadata" + - "/model picker shows human-readable labels (e.g., 'Sonnet 4.5') for pinned versions; custom npm registries for plugin installs" + breaking: [] + + - version: "2.1.50" + date: "2026-02-21" + highlights: + - "⭐ `WorktreeCreate` and `WorktreeRemove` hook events for custom VCS setup/teardown with agent worktree isolation" + - "`isolation: worktree` in agent definitions for declarative worktree isolation; `claude agents` CLI command to list configured agents" + - "Opus 4.6 (fast mode) now has full 1M context window; `CLAUDE_CODE_DISABLE_1M_CONTEXT` env var to disable it" + - "Major memory leak fixes + startup performance improvements for headless mode; `CLAUDE_CODE_SIMPLE` now fully minimal" + breaking: [] + + - version: "2.1.49" + date: "2026-02-20" + highlights: + - "⭐ `--worktree` / `-w` flag to start Claude in isolated git worktree; subagents support `isolation: 'worktree'`" + - "Agent definitions support `background: true` to always run as background task" + - "`ConfigChange` hook event for enterprise security auditing (fires when config files change during session)" + - "Simple mode now includes file edit tool; many bug fixes for background agents, permissions, sessions" + breaking: [] + + - version: "2.1.47" + date: "2026-02-19" + highlights: + - "VS Code plan preview auto-updates as Claude iterates, commenting enabled when plan is ready" + - "⭐ `ctrl+f` to kill all background agents (replaces double-ESC); background agents continue when ESC pressed" + - "Added `last_assistant_message` field to Stop/SubagentStop hook inputs" + - "70+ bug fixes: PDF compaction, Unicode curly quotes, parallel file edits, OSC 8 hyperlinks, Windows rendering, session persistence" + breaking: [] + + - version: "2.1.46" + date: "2026-02-19" + highlights: + - "Fixed orphaned Claude Code processes after terminal disconnect on macOS" + - "Added support for using claude.ai MCP connectors in Claude Code" + breaking: [] + + - version: "2.1.45" + date: "2026-02-17" + highlights: + - "⭐ Claude Sonnet 4.6 model support" + - "`spinnerTipsOverride` setting for customizable spinner tips (with `excludeDefault` option)" + - "SDK: `SDKRateLimitInfo` and `SDKRateLimitEvent` types for rate limit tracking" + - "Fixed Agent Teams on Bedrock/Vertex/Foundry; improved memory for large shell outputs" + breaking: [] + + - version: "2.1.44" + date: "2026-02-17" + highlights: + - "Fixed auth refresh errors" + breaking: [] + + - version: "2.1.43" + date: "2026-02-17" + highlights: + - "Fixed AWS auth refresh hanging indefinitely (3-minute timeout added)" + - "Fixed structured-outputs beta header sent unconditionally on Vertex/Bedrock" + - "Fixed spurious warnings for non-agent markdown files in `.claude/agents/`" + breaking: [] + + - version: "2.1.42" + date: "2026-02-14" + highlights: + - "Optimized startup via deferred Zod schema construction" + - "Improved prompt cache hit rate by moving date outside system prompt" + - "Opus 4.6 effort callout for eligible users" + - "Better error messaging for image dimension limits (suggests `/compact`)" + breaking: [] + + - version: "2.1.41" + date: "2026-02-13" + highlights: + - "Guard against launching Claude Code inside another Claude Code session" + - "`claude auth login/status/logout` CLI subcommands" + - "Windows ARM64 (win32-arm64) native binary support" + - "`speed` attribute in OTel events for fast mode visibility" + - "`/rename` auto-generates session name from conversation context" + - "Fixed Agent Teams wrong model for Bedrock/Vertex/Foundry" + - "Multiple stability fixes (FileReadTool FIFOs, MCP images, background tasks, stale permissions)" + breaking: [] + + - version: "2.1.39" + date: "2026-02-10" + highlights: + - "Improved terminal rendering performance" + - "Fixed fatal errors being swallowed instead of displayed" + - "Fixed process hanging after session close" + - "Fixed character loss at terminal screen boundary" + breaking: [] + + - version: "2.1.38" + date: "2026-02-10" + highlights: + - "Fixed VS Code terminal scroll-to-top regression" + - "Fixed Tab key queueing slash commands instead of autocompleting" + - "Security: Heredoc delimiter parsing to prevent command smuggling" + - "Security: Blocked writes to `.claude/skills` in sandbox mode" + breaking: [] + + - version: "2.1.37" + date: "2026-02-08" + highlights: + - "Fixed /fast not immediately available after enabling /extra-usage" + breaking: [] + + - version: "2.1.36" + date: "2026-02-08" + highlights: + - "⭐ Fast mode now available for Opus 4.6" + breaking: [] + + - version: "2.1.34" + date: "2026-02-07" + highlights: + - "Fixed crash when agent teams setting changed between renders" + - "Security fix: Sandbox-excluded commands could bypass Bash ask permission" + breaking: + - "Security fix: sandbox.excludedCommands / dangerouslyDisableSandbox bypass with autoAllowBashIfSandboxed" + + - version: "2.1.33" + date: "2026-02-06" + highlights: + - "Agent teams fixes: tmux sessions, availability warnings" + - "`TeammateIdle` and `TaskCompleted` hook events for multi-agent workflows" + - "Agent frontmatter: `memory` field (user/project/local), `Task(agent_type)` sub-agent restriction" + - "VSCode: Remote sessions, branch/message count in session picker" + breaking: [] + + - version: "2.1.32" + date: "2026-02-05" + highlights: + - "⭐ Opus 4.6 is now available" + - "⭐ Agent teams preview (CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1)" + - "⭐ Automatic memory recording and recall" + - "'Summarize from here' for partial conversation summarization" + breaking: [] + + - version: "2.1.31" + date: "2026-02-03" + highlights: + - "Session resume hint on exit showing how to continue" + - "Fixed PDF errors locking sessions & bash sandbox errors" + - "LSP compatibility improvements & terminal rendering fixes" + breaking: [] + + - version: "2.1.30" + date: "2026-02-02" + highlights: + - "`pages` parameter for Read tool PDFs (e.g., `pages: '1-5'`)" + - "Pre-configured OAuth for MCP servers (Slack support)" + - "⭐ `/debug` command for session troubleshooting" + - "git log/show read-only flags support" + - "Task tool metrics (tokens, duration, tool uses)" + breaking: [] + + - version: "2.1.29" + date: "2026-01-31" + highlights: + - "Fixed startup performance with saved hook context" + - "Improved session recovery speed for long-duration sessions" + breaking: [] + + - version: "2.1.27" + date: "2026-01-29" + highlights: + - "`--from-pr` flag to resume sessions linked to GitHub PR number/URL" + - "Sessions auto-linked to PRs when created via `gh pr create`" + - "Windows: Fixed bash execution and console flashing issues" + - "VSCode: Fixed OAuth token expiration (401 errors)" + breaking: [] + + - version: "2.1.25" + date: "2026-01-30" + highlights: + - "Fixed beta header validation for Bedrock/Vertex gateway users" + breaking: [] + + - version: "2.1.23" + date: "2026-01-29" + highlights: + - "Customizable spinner verbs setting (spinnerVerbs)" + - "mTLS and corporate proxy connectivity fixes" + - "Improved terminal rendering performance" + breaking: [] + + - version: "2.1.22" + date: "2026-01-28" + highlights: + - "Improved task UI performance with virtualization" + - "Vim selection and deletion fixes" + - "LSP improvements: Kotlin support, UTF-16 ranges" + breaking: [] + + - version: "2.1.21" + date: "2026-01-28" + highlights: + - "Skills/commands can specify required/recommended Claude Code version" + - "New TaskCreate fields: category, checklist, parentId" + - "Automatic Claude Code update checking at session start" + - "Tasks appear in /context with 'Disable tasks' shortcut" + breaking: [] + + - version: "2.1.20" + date: "2026-01-27" + highlights: + - "TaskUpdate: status='deleted' for task removal" + - "PR review status indicator (colored dot + link)" + breaking: [] + + - version: "2.1.19" + date: "2026-01-25" + highlights: + - "New: CLAUDE_CODE_ENABLE_TASKS env var (set false for old task system)" + - "New: Shorthand $0, $1 for arguments in custom commands" + - "[VSCode] Session forking and rewind enabled for all users" + - "Fixed: Multiple session resuming/naming issues with git worktrees" + breaking: + - "Indexed argument syntax changed: $ARGUMENTS.0 → $ARGUMENTS[0] (bracket syntax)" + + - version: "2.1.18" + date: "2026-01-24" + highlights: + - "⭐ Customizable keyboard shortcuts with /keybindings command" + - "Per-context keybindings, chord sequences, workflow personalization" + breaking: [] + + - version: "2.1.17" + date: "2026-01-23" + highlights: + - "Fix: Crashes on processors without AVX instruction support" + breaking: [] + + - version: "2.1.16" + date: "2026-01-22" + highlights: + - "⭐ New task management system with dependency tracking" + - "[VSCode] Native plugin management support" + - "[VSCode] OAuth users can browse/resume remote sessions" + - "Fixed: OOM crashes when resuming sessions with heavy subagent usage" + breaking: [] + + - version: "2.1.15" + date: "2026-01-22" + highlights: + - "⚠️ Deprecation notice for npm installations (use `claude install`)" + - "UI rendering performance improved with React Compiler" + - "Fixed: MCP stdio server timeout not killing child process" + breaking: + - "npm installations deprecated - migrate to native installer" + + - version: "2.1.14" + date: "2026-01-21" + highlights: + - "History-based autocomplete in bash mode (! + Tab)" + - "Search in installed plugins list" + - "Git commit SHA pinning for plugins" + - "Multiple fixes: context window, memory, autocomplete" + breaking: [] + + - version: "2.1.12" + date: "2026-01-18" + highlights: + - "Bug fix: Message rendering" + breaking: [] + + - version: "2.1.11" + date: "2026-01-17" + highlights: + - "Fix: Excessive MCP connection requests for HTTP/SSE transports" + breaking: [] + + - version: "2.1.10" + date: "2026-01-17" + highlights: + - "New `Setup` hook event (--init, --init-only, --maintenance flags)" + - "Keyboard shortcut 'c' to copy OAuth URL" + - "File suggestions show as removable attachments" + - "[VSCode] Plugin install count + trust warnings" + breaking: [] + + - version: "2.1.9" + date: "2026-01-16" + highlights: + - "`auto:N` syntax for MCP tool search threshold" + - "`plansDirectory` setting for custom plan file locations" + - "Session URL attribution to commits/PRs from web sessions" + - "PreToolUse hooks can return `additionalContext`" + - "${CLAUDE_SESSION_ID} string substitution for skills" + breaking: [] + + - version: "2.1.7" + date: "2026-01-15" + highlights: + - "`showTurnDuration` setting to hide turn duration messages" + - "MCP tool search auto mode enabled by default" + - "Inline display of agent final response in task notifications" + breaking: + - "OAuth/API Console URLs: console.anthropic.com → platform.claude.com" + - "Security fix: Wildcard permission rules could match compound commands" + + - version: "2.1.6" + date: "2026-01-14" + highlights: + - "Search functionality in /config command" + - "Date range filtering in /stats (r to cycle)" + - "Auto-discovery of skills from nested .claude/skills directories" + - "Updates section in /doctor showing auto-update channel" + breaking: + - "Security fix: Permission bypass via shell line continuation" + + - version: "2.1.5" + date: "2026-01-13" + highlights: + - "`CLAUDE_CODE_TMPDIR` env var for custom temp directory" + breaking: [] + + - version: "2.1.4" + date: "2026-01-12" + highlights: + - "`CLAUDE_CODE_DISABLE_BACKGROUND_TASKS` env var" + breaking: [] + + - version: "2.1.3" + date: "2026-01-11" + highlights: + - "Merged slash commands and skills (simplified mental model)" + - "Release channel toggle (stable/latest) in /config" + - "/doctor warnings for unreachable permission rules" + breaking: [] + + - version: "2.1.2" + date: "2026-01-10" + highlights: + - "Windows Package Manager (winget) support" + - "Clickable hyperlinks for file paths (OSC 8 terminals)" + - "Shift+Tab shortcut in plan mode for auto-accept edits" + - "Large bash outputs saved to disk instead of truncated" + breaking: + - "Security fix: Command injection in bash command processing" + - "Deprecated: C:\\ProgramData\\ClaudeCode managed settings path" + + - version: "2.1.0" + date: "2026-01-08" + highlights: + - "⭐ MAJOR: Automatic skill hot-reload" + - "⭐ MAJOR: Shift+Enter works OOTB (iTerm2, WezTerm, Ghostty, Kitty)" + - "⭐ MAJOR: New Vim motions (;, y, p, text objects, >>, <<, J)" + - "Unified Ctrl+B for backgrounding all tasks" + - "/plan command shortcut" + - "Slash command autocomplete anywhere in input" + - "`language` setting for response language" + - "Skills context: fork support" + - "Hooks support in agent/skill frontmatter" + - "MCP list_changed notifications support" + - "/teleport and /remote-env commands" + - "Tab support for disabling specific agents" + - "--tools flag in interactive mode" + - "YAML-style lists in frontmatter allowed-tools" + breaking: + - "OAuth URLs: console.anthropic.com → platform.claude.com" + - "Removed permission prompt for entering plan mode" + - "[SDK] Minimum zod peer dependency: ^4.0.0" + + # ───────────────────────────────────────────────────────────── + # 2.0.x Series (December 2025 - January 2026) + # ───────────────────────────────────────────────────────────── + + - version: "2.0.76" + date: "2026-01-05" + highlights: + - "Fix: macOS code-sign warning with Claude in Chrome" + breaking: [] + + - version: "2.0.74" + date: "2026-01-04" + highlights: + - "⭐ LSP (Language Server Protocol) tool for code intelligence" + - "/terminal-setup for Kitty, Alacritty, Zed, Warp" + - "Ctrl+T in /theme to toggle syntax highlighting" + - "Grouped skills/agents by source in /context" + breaking: [] + + - version: "2.0.73" + date: "2026-01-03" + highlights: + - "Clickable [Image #N] links" + - "Alt-Y yank-pop to cycle kill ring history" + - "Search filtering in plugin discover screen" + - "[VSCode] Tab icon badges (permissions, unread)" + breaking: [] + + - version: "2.0.72" + date: "2026-01-02" + highlights: + - "⭐ Claude in Chrome (Beta) - browser control from Claude Code" + - "Reduced terminal flickering" + - "QR code for mobile app" + - "Thinking toggle: Tab → Alt+T" + breaking: [] + + - version: "2.0.71" + date: "2026-01-01" + highlights: + - "/config toggle for prompt suggestions" + - "/settings alias for /config" + - "New Rust-based syntax highlighting engine" + breaking: [] + + - version: "2.0.70" + date: "2025-12-30" + highlights: + - "Enter key accepts/submits prompt suggestions immediately" + - "Wildcard syntax mcp__server__* for MCP tool permissions" + - "Auto-update toggle for plugin marketplaces" + - "3x memory usage improvement for large conversations" + breaking: + - "Removed # shortcut for quick memory entry" + + - version: "2.0.68" + date: "2025-12-28" + highlights: + - "IME support for Chinese, Japanese, Korean" + - "Enterprise managed settings support" + - "Improved plan mode exit UX" + breaking: [] + + - version: "2.0.67" + date: "2025-12-26" + highlights: + - "⭐ Thinking mode enabled by default for Opus 4.5" + - "Thinking config moved to /config" + - "Search in /permissions with / shortcut" + breaking: [] + + - version: "2.0.65" + date: "2025-12-24" + highlights: + - "Alt+P to switch models while writing prompt" + - "Context window info in status line" + - "`fileSuggestion` setting for custom @ search" + - "CLAUDE_CODE_SHELL env var" + breaking: [] + + - version: "2.0.64" + date: "2025-12-22" + highlights: + - "⭐ Instant auto-compacting" + - "⭐ Async agents and bash commands with wake-up messages" + - "/stats with usage graphs, streaks, favorite model" + - "Named sessions: /rename, /resume " + - "Support for .claude/rules/ directory" + - "Image dimension metadata for coordinate mappings" + breaking: + - "Unshipped AgentOutputTool/BashOutputTool → TaskOutputTool" + + - version: "2.0.62" + date: "2025-12-20" + highlights: + - "`attribution` setting for commit/PR bylines" + - "(Recommended) indicator in multiple-choice questions" + breaking: + - "Deprecated: includeCoAuthoredBy (use attribution)" + + - version: "2.0.60" + date: "2025-12-18" + highlights: + - "⭐ Background agents (work while you work)" + - "--disable-slash-commands CLI flag" + - "Model name in Co-Authored-By commits" + - "/mcp enable|disable [server-name]" + breaking: [] + + - version: "2.0.58" + date: "2025-12-16" + highlights: + - "⭐ Opus 4.5 available for Pro users" + breaking: + - "[Windows] Managed settings prefer C:\\Program Files\\ClaudeCode" + + - version: "2.0.57" + date: "2025-12-15" + highlights: + - "Feedback input when rejecting plans" + - "[VSCode] Streaming message support" + breaking: [] + + - version: "2.0.55" + date: "2025-12-13" + highlights: + - "Improved AskUserQuestion auto-submit" + - "Better fuzzy matching for @ file suggestions" + breaking: + - "Proxy DNS opt-in: CLAUDE_CODE_PROXY_RESOLVES_HOSTS=true" + + - version: "2.0.51" + date: "2025-12-10" + highlights: + - "⭐ MAJOR: Opus 4.5 released" + - "⭐ MAJOR: Claude Code for Desktop" + - "Updated usage limits for Opus 4.5" + - "Plan Mode builds more precise plans" + breaking: [] + + - version: "2.0.45" + date: "2025-12-05" + highlights: + - "⭐ Microsoft Foundry support" + - "PermissionRequest hook for auto-approve/deny" + - "& prefix for background tasks to web" + breaking: [] + + - version: "2.0.43" + date: "2025-12-03" + highlights: + - "`permissionMode` field for custom agents" + - "`skills` frontmatter for auto-loading subagent skills" + - "SubagentStart hook event" + breaking: [] + + - version: "2.0.41" + date: "2025-12-01" + highlights: + - "Model parameter for prompt-based stop hooks" + - "Plugins: sharing and installing output styles" + - "Allow more safe git commands without approval" + - "Teleporting from web auto-sets upstream branch" + breaking: [] + + - version: "2.0.37" + date: "2025-11-28" + highlights: + - "Matcher values for Notification hook events" + - "Output Styles: keep-coding-instructions option" + breaking: [] + + - version: "2.0.35" + date: "2025-11-26" + highlights: + - "Improved fuzzy search for commands" + - "CLAUDE_CODE_EXIT_AFTER_STOP_DELAY env var" + breaking: + - "Migrated ignorePatterns to deny permissions" + + - version: "2.0.32" + date: "2025-11-23" + highlights: + - "Output styles un-deprecated (community feedback)" + - "`companyAnnouncements` setting" + breaking: [] + + - version: "2.0.30" + date: "2025-11-20" + highlights: + - "`allowUnsandboxedCommands` sandbox setting" + - "`disallowedTools` for custom agent definitions" + - "Prompt-based stop hooks" + - "SSE MCP servers on native build" + breaking: + - "Deprecated: Output styles (later un-deprecated in 2.0.32)" + - "Removed: Custom ripgrep configuration" + + - version: "2.0.28" + date: "2025-11-18" + highlights: + - "⭐ Plan mode: introduced Plan subagent" + - "Subagents: resume capability" + - "Subagents: dynamic model selection" + - "--max-budget-usd flag (SDK)" + - "Git-based plugins branch/tag support (#branch)" + breaking: [] + + - version: "2.0.27" + date: "2025-11-15" + highlights: + - "New UI for permission prompts" + - "Branch filtering and search in session resume" + breaking: [] + + - version: "2.0.25" + date: "2025-11-12" + highlights: [] + breaking: + - "Removed legacy SDK entrypoint → @anthropic-ai/claude-agent-sdk" + + - version: "2.0.24" + date: "2025-11-10" + highlights: + - "Claude Code Web: Web → CLI teleport" + - "Sandbox mode for BashTool (Linux & Mac)" + - "Bedrock: awsAuthRefresh output display" + breaking: [] + +# ════════════════════════════════════════════════════════════════ +# SUMMARY - Key Breaking Changes by Area +# ════════════════════════════════════════════════════════════════ +breaking_summary: + urls: + - "OAuth/API Console: console.anthropic.com → platform.claude.com (v2.1.0, v2.1.7)" + windows: + - "Managed settings: C:\\ProgramData\\ClaudeCode → C:\\Program Files\\ClaudeCode (v2.0.58, deprecated v2.1.2)" + sdk: + - "Removed legacy SDK entrypoint → @anthropic-ai/claude-agent-sdk (v2.0.25)" + - "Minimum zod peer dependency: ^4.0.0 (v2.1.0)" + shortcuts: + - "Removed # shortcut for quick memory (v2.0.70)" + security: + - "Command injection fix in bash processing (v2.1.2)" + - "Wildcard permission rules compound commands fix (v2.1.7)" + - "Shell line continuation permission bypass fix (v2.1.6)" + - "Sandbox-excluded commands bypass with autoAllowBashIfSandboxed (v2.1.34)" + - "Heredoc delimiter command smuggling prevention (v2.1.38)" + installation: + - "npm installations deprecated - use native installer (v2.1.15)" + behavior: + - "ultrathink/think keywords now cosmetic only — thinking default with Opus 4.5 (v2.0.67)" + syntax: + - "Indexed argument syntax changed: $ARGUMENTS.0 → $ARGUMENTS[0] (v2.1.19)" + +# ════════════════════════════════════════════════════════════════ +# MILESTONE FEATURES (quick reference) +# ════════════════════════════════════════════════════════════════ +milestones: + "2.1.36": "Fast mode for Opus 4.6" + "2.1.32": "Opus 4.6, Agent teams preview, Automatic memory" + "2.1.18": "Customizable keyboard shortcuts with /keybindings" + "2.1.16": "New task management system with dependency tracking" + "2.1.0": "Skill hot-reload, Shift+Enter OOTB, Vim motions, /plan command" + "2.0.74": "LSP tool for code intelligence" + "2.0.72": "Claude in Chrome (browser control)" + "2.0.67": "Thinking mode default for Opus 4.5" + "2.0.64": "Instant auto-compact, async agents, named sessions" + "2.0.60": "Background agents" + "2.0.51": "Opus 4.5, Claude Code for Desktop" + "2.0.45": "Microsoft Foundry, PermissionRequest hook" + "2.0.28": "Plan subagent, subagent resume/model selection" + "2.0.24": "Web teleport, Sandbox mode" diff --git a/mcp-server/content/llms.txt b/mcp-server/content/llms.txt new file mode 100644 index 0000000..edc3042 --- /dev/null +++ b/mcp-server/content/llms.txt @@ -0,0 +1,166 @@ +# The Ultimate Claude Code Guide + +> A comprehensive, self-contained guide to mastering Claude Code - Anthropic's official CLI for AI-assisted development. + +## What This Repository Contains + +This repository provides everything needed to go from Claude Code beginner to power user: + +1. **Complete Guide** (`guide/ultimate-guide.md`) - 9,600+ lines covering all aspects of Claude Code +2. **Cheatsheet** (`guide/cheatsheet.md`) - 1-page printable daily reference +3. **Architecture Internals** (`guide/architecture.md`) - How Claude Code works under the hood (master loop, tools, context) +4. **Audit Prompt** (`tools/audit-prompt.md`) - Self-contained prompt to analyze your Claude Code setup against best practices + +## Target Audience + +- **Beginners**: Installation, first workflow, essential commands (15 min to productivity) +- **Intermediate**: Memory files, agents, skills, hooks configuration +- **Power Users**: MCP servers, Trinity pattern, CI/CD integration, autonomous workflows + +## Key Topics Covered + +### Core Concepts +- Context Management (the most critical concept - context windows, compaction, zones) +- Plan Mode (safe read-only exploration before making changes) +- Memory Files (CLAUDE.md for persistent context across sessions) +- Rewind (undo mechanism for file changes) + +### Customization +- **Agents**: Custom AI personas with specific tools and instructions +- **Skills**: Reusable knowledge modules for complex domains +- **Commands**: Custom slash commands for frequent workflows +- **Hooks**: Event-driven automation (PreToolUse, PostToolUse, UserPromptSubmit) + +### Advanced Features +- **MCP Servers**: Model Context Protocol for extended capabilities + - Serena (codebase indexation + session memory) + - Context7 (library documentation lookup) + - Sequential (structured multi-step reasoning) + - Playwright (browser automation) +- **Trinity Pattern**: Combining Plan Mode + Extended Thinking + MCP for complex tasks +- **CI/CD Integration**: Headless mode, GitHub Actions, Verify Gate pattern + +### Best Practices +- Single Source of Truth pattern for conventions +- Shell Scripts vs AI Agents decision framework +- Tight feedback loops for rapid iteration +- Continuous improvement mindset + +## File Structure + +``` +claude-code-ultimate-guide/ +├── README.md # Overview and quick start +├── CONTRIBUTING.md # Contribution guidelines +├── CHANGELOG.md # Version history +├── LICENSE # CC BY-SA 4.0 +├── guide/ # Core documentation +│ ├── ultimate-guide.md # Complete guide (main content) +│ ├── cheatsheet.md # 1-page reference +│ ├── architecture.md # How Claude Code works internally +│ └── adoption-approaches.md # Implementation strategy +├── tools/ # Interactive utilities +│ ├── audit-prompt.md # Setup audit tool +│ ├── onboarding-prompt.md # Personalized onboarding +│ └── mobile-access.md # Mobile access setup +├── machine-readable/ # LLM/AI consumption +│ ├── reference.yaml # Machine-optimized index +│ └── llms.txt # This file (for AI indexation) +├── exports/ # Generated outputs +│ ├── notebooklm.pdf # Visual overview +│ └── kimi.pdf # Full text export +├── examples/ # Ready-to-use templates +│ ├── agents/ # Custom AI personas +│ ├── skills/ # Knowledge modules +│ ├── commands/ # Slash commands +│ ├── hooks/ # Event automation (bash + PowerShell) +│ ├── config/ # Configuration files +│ └── memory/ # CLAUDE.md templates +└── quiz/ # Interactive knowledge quiz +``` + +## Guide Structure (10 Sections + Architecture) + +**Architecture Deep Dive** (`guide/architecture.md`): +- Master Loop: `while(tool_call)` - no DAGs, no classifiers, no RAG +- 8 Core Tools: Bash, Read, Edit, Write, Grep, Glob, Task, TodoWrite +- Context: ~200K tokens, auto-compact at 75-92% +- Sub-agents: isolated context, max depth=1 +- Philosophy: "less scaffolding, more model" + +**Main Guide Sections** (`guide/ultimate-guide.md`): +1. **Quick Start** - Installation, first workflow, essential commands +2. **Core Concepts** - Context management, Plan Mode, Rewind, Mental Model +3. **Memory & Settings** - CLAUDE.md files, .claude/ folder, precedence rules +4. **Agents** - Custom AI personas, Tool SEO, orchestration patterns +5. **Skills** - Reusable knowledge modules +6. **Commands** - Custom slash commands, variable interpolation +7. **Hooks** - Event-driven automation (security, formatting, logging) +8. **MCP Servers** - Serena, Context7, Sequential, Playwright, Postgres +9. **Advanced Patterns** - Trinity, CI/CD, feedback loops, vibe coding +10. **Reference** - Commands, shortcuts, troubleshooting, checklists + +## Key Commands Reference + +| Command | Purpose | +|---------|---------| +| `/help` | Show all available commands | +| `/status` | Check context usage and session state | +| `/compact` | Compress context (use when >70%) | +| `/clear` | Fresh start (reset conversation) | +| `/plan` | Enter safe read-only planning mode | +| `/rewind` | Undo recent changes | + +## Context Management Rules + +- **Green Zone (0-50%)**: Work freely +- **Yellow Zone (50-70%)**: Be selective with context loading +- **Red Zone (70-90%)**: Use `/compact` immediately +- **Critical (90%+)**: Use `/clear` to reset + +## Platform Support + +- **macOS/Linux**: Full support with bash/zsh examples +- **Windows**: PowerShell and batch file alternatives provided (note: Windows commands are AI-generated and not tested by the author) + +## Related Resources + +- Official: https://docs.anthropic.com/en/docs/claude-code +- Official llms.txt (index): https://code.claude.com/docs/llms.txt +- Official llms-full.txt (complete): https://code.claude.com/docs/llms-full.txt +- DeepWiki: https://deepwiki.com/FlorianBruniaux/claude-code-ultimate-guide +- Inspiration: https://claudelog.com/ +- Whitepapers (FR + EN): https://www.florian.bruniaux.com/guides — 9 focused whitepapers on Claude Code (foundations, prompting, customization, security, architecture, team, privacy, reference, agent teams) + +## Author + +Florian BRUNIAUX - Founding Engineer at Méthode Aristote +- GitHub: https://github.com/FlorianBruniaux +- LinkedIn: https://www.linkedin.com/in/florian-bruniaux-43408b83/ + +## License + +CC BY-SA 4.0 - Free to share and adapt with attribution. + +## How to Use This Guide + +1. **New to Claude Code?** Start with README.md Quick Start section +2. **Choose your path** See Learning Paths in README for audience-specific guides +3. **Want comprehensive learning?** Read guide/ultimate-guide.md +4. **Need daily reference?** Print guide/cheatsheet.md +5. **Want to audit your setup?** Use tools/audit-prompt.md +6. **Need templates?** Browse examples/ folder for ready-to-use configs + +## Machine-Optimized Reference + +For fast LLM parsing, see `machine-readable/reference.yaml` (~2K tokens) - structured YAML with: +- Decision tree for task routing +- Prompting formula (WHAT/WHERE/HOW/VERIFY) +- Commands, shortcuts, CLI flags +- Context management zones and symptoms +- MCP servers, extended thinking, cost optimization +- Anti-patterns and troubleshooting + +## Keywords + +Claude Code, Anthropic, CLI, AI-assisted development, coding assistant, context management, MCP servers, agents, skills, hooks, commands, Plan Mode, CLAUDE.md, memory files, CI/CD integration, autonomous workflows, developer productivity, AI coding tools diff --git a/mcp-server/content/reference.yaml b/mcp-server/content/reference.yaml new file mode 100644 index 0000000..18d2225 --- /dev/null +++ b/mcp-server/content/reference.yaml @@ -0,0 +1,1625 @@ +# claude-code-reference.yaml +# Quick lookup for Claude Code - comprehensive index +# Source: guide/ultimate-guide.md +# Purpose: Condensed index for LLMs to quickly answer user questions about Claude Code + +version: "3.29.0" +updated: "2026-02-26" + +# ════════════════════════════════════════════════════════════════ +# DEEP DIVE - Line numbers in guide/ultimate-guide.md +# Usage: Read file at line N for detailed documentation on topic +# For architecture internals, see guide/architecture.md +# ════════════════════════════════════════════════════════════════ +deep_dive: + # Visual Diagrams Series (40 Mermaid diagrams) + mermaid_diagrams: + path: "guide/diagrams/" + description: "41 interactive Mermaid diagrams: model selection, agent lifecycle, memory hierarchy, security threats, multi-agent patterns, AI fluency paths" + files: 10 + total_diagrams: 40 + # AI-Assisted Development Workflows (from MetalBear/arXiv research) + exploration_workflow: "guide/workflows/exploration-workflow.md" + script_generation: "guide/workflows/iterative-refinement.md:200" + anti_anchoring_prompts: "examples/semantic-anchors/anchor-catalog.md:248" + session_limits: "guide/architecture.md:442" + claudemd_sizing: 3054 + scope_success_rates: "guide/adoption-approaches.md:26" + # Claude Code Releases + claude_code_releases: "guide/claude-code-releases.md" + claude_code_releases_yaml: "machine-readable/claude-code-releases.yaml" + # Code Review Automation (Pat Cullen, Jan 2026) + review_pr_advanced: "examples/commands/review-pr.md:81" + review_anti_hallucination: "examples/agents/code-reviewer.md:77" + review_auto_fix_loop: "guide/workflows/iterative-refinement.md:353" + # Review Plan Command (Garry Tan-inspired, Feb 2026) + review_plan_command: "examples/commands/review-plan.md" + # GitHub Actions: Prompt-Based Code Review (Feb 2026) + github_actions_code_review_workflow: "examples/github-actions/claude-code-review.yml" + github_actions_code_review_prompt: "examples/github-actions/prompts/code-review.md" + github_actions_code_review_pattern: "externalized prompt + anti-hallucination protocol + /claude-review on-demand trigger" + github_actions_code_review_tools: "Read, Glob, Grep + GitHub PR inspection (read-only)" + github_actions_code_review_auth: "OAuth token (Claude Max plan, 0$ API) or ANTHROPIC_API_KEY" + github_actions_cost_per_review: "0$ with OAuth/Max plan; ~0.05-0.15$ with API key (Sonnet, ~5K tokens diff)" + # Rules Templates (auto-loaded .claude/rules/) + rules_templates_directory: "examples/rules/" + rules_architecture_review: "examples/rules/architecture-review.md" + rules_code_quality_review: "examples/rules/code-quality-review.md" + rules_test_review: "examples/rules/test-review.md" + rules_performance_review: "examples/rules/performance-review.md" + # Team Configuration at Scale (Profile-Based Module Assembly) + team_ai_instructions_section: "guide/ultimate-guide.md#35-team-configuration-at-scale" + team_ai_instructions_workflow: "guide/workflows/team-ai-instructions.md" + team_ai_instructions_profile_template: "examples/team-config/profile-template.yaml" + team_ai_instructions_skeleton: "examples/team-config/claude-skeleton.md" + team_ai_instructions_sync_script: "examples/team-config/sync-script.ts" + team_ai_instructions_pattern: "profiles YAML + shared modules + skeleton + assembler script" + team_ai_instructions_problem: "N devs × M tools × P OS = fragmented AI instructions" + team_ai_instructions_token_savings: "59% context token reduction (measured, 5-dev team)" + team_ai_instructions_threshold: "Team 5+ devs with multiple AI tools" + # Known Issues & Critical Bugs (verified community reports) + known_issues: "guide/known-issues.md" + known_issues_github_bug: "guide/known-issues.md:7" # GitHub auto-creation bug + known_issues_token_consumption: "guide/known-issues.md:105" # Excessive token usage + known_issues_model_quality_aug2025: "guide/known-issues.md:197" # Resolved: Aug 2025 degradation + # Template Installation + install_templates_script: "scripts/install-templates.sh" + # Session management + session_search: "guide/observability.md:38" + session_search_script: "examples/scripts/session-search.sh" + cc_sessions_script: "examples/scripts/cc-sessions.py" + session_resume_limitations: "guide/observability.md:126" + session_cross_folder_migration: "guide/observability.md:126" + session_migration_manual: "guide/observability.md:126" + session_migration_risks: "guide/observability.md:126" + session_migration_community_tool: "guide/observability.md:52" + session_migration_issue: "https://github.com/anthropics/claude-code/issues/1516" + session_migration_weller_skill: "https://github.com/jimweller/dotfiles/tree/main/dotfiles/claude-code/skills/claude-migrate-session" + # Activity monitoring + activity_monitoring: "guide/observability.md:467" # Tool call audit via JSONL + activity_monitoring_queries: "guide/observability.md:467" # jq queries for audit + activity_monitoring_alerts: "guide/observability.md:467" # Sensitive pattern detection + external_monitoring_tools: "guide/observability.md:527" # ccusage, claude-code-otel, Akto, MLflow, ccboard + proxying_claude_code: "guide/observability.md:699" # Proxyman, mitmproxy, ANTHROPIC_API_URL + ccboard_activity_plan: "docs/resource-evaluations/ccboard-activity-module-plan.md" + # Cost optimization - Local execution bridge + bridge_script: "examples/scripts/bridge.py" + bridge_schema: "examples/scripts/bridge-plan-schema.json" + bridge_guide: "guide/ultimate-guide.md:20003" + # Cost optimization - RTK (Rust Token Killer) + rtk_upstream: "https://github.com/rtk-ai/rtk" + rtk_website: "https://www.rtk-ai.app/" + rtk_evaluation: "docs/resource-evaluations/rtk-evaluation.md" + rtk_guide: "guide/ultimate-guide.md:14553" + rtk_third_party: "guide/third-party-tools.md:7" + rtk_claude_md: "examples/claude-md/rtk-optimized.md" + rtk_skill: "examples/skills/rtk-optimizer/SKILL.md" + rtk_hook: "examples/hooks/bash/rtk-auto-wrapper.sh" + rtk_purpose: "Command output filtering before LLM context (60-90% avg reduction)" + rtk_version_tested: "v0.16.0" + rtk_score: "5/5" + rtk_installation: "cargo install rtk or brew install rtk-ai/tap/rtk" + # Google Antigravity (Agent-First IDE) + antigravity_guide: "guide/ai-ecosystem.md:1366" + antigravity_evaluation: "docs/resource-evaluations/google-antigravity-evaluation.md" + antigravity_proxy: "https://www.npmjs.com/package/antigravity-claude-proxy" + antigravity_codelabs: "https://codelabs.developers.google.com/getting-started-google-antigravity" + antigravity_vs_claude: "Claude Code = terminal-first predictability; Antigravity = agent-first autonomy" + # PDF Generation + pdf_generation: "guide/workflows/pdf-generation.md" + pdf_generator_skill: "examples/skills/pdf-generator.md" + # Talk Preparation Pipeline (6-stage: extract → research → concepts → position → script → revision) + talk_pipeline_workflow: "guide/workflows/talk-pipeline.md" + talk_pipeline_skills: "examples/skills/talk-pipeline/" + talk_pipeline_orchestrator: "examples/skills/talk-pipeline/orchestrator/SKILL.md" + talk_pipeline_stage1: "examples/skills/talk-pipeline/stage-1-extract/SKILL.md" + talk_pipeline_stage2: "examples/skills/talk-pipeline/stage-2-research/SKILL.md" + talk_pipeline_stage3: "examples/skills/talk-pipeline/stage-3-concepts/SKILL.md" + talk_pipeline_stage4: "examples/skills/talk-pipeline/stage-4-position/SKILL.md" + talk_pipeline_stage5: "examples/skills/talk-pipeline/stage-5-script/SKILL.md" + talk_pipeline_stage6: "examples/skills/talk-pipeline/stage-6-revision/SKILL.md" + talk_pipeline_kimi_template: "examples/skills/talk-pipeline/stage-5-script/templates/kimi-prompt-template.md" + talk_pipeline_feedback_template: "examples/skills/talk-pipeline/stage-4-position/templates/feedback-draft.md" + talk_pipeline_modes: "REX (git archaeology) | Concept (skip stage 2)" + talk_pipeline_outputs: "13-14 files REX mode, 10 files Concept mode" + talk_pipeline_patterns: "skill chaining + file-based state + tool permission scoping + human-in-the-loop gate + AI-to-AI handoff (Claude → Kimi)" + talk_pipeline_checkpoint: "Stage 4 CHECKPOINT: user selects angle + title before script starts" + talk_pipeline_kimi: "kimi.com (free) — copy-paste Stage 5 prompt for AI slide generation" + # reMarkable 2 + AI (guide/remarkable-ai.md) + remarkable_ai_guide: "guide/remarkable-ai.md" + remarkable_mcp_server: "guide/remarkable-ai.md#1-remarkable-mcp--le-game-changer" + remarkable_mcp_repo: "https://github.com/SamMorrowDrums/remarkable-mcp" + remarkable_ghostwriter: "guide/remarkable-ai.md#2-ghostwriter--interface-vision-llm" + remarkable_obsidian_sync: "guide/remarkable-ai.md#3-sync-remarkable--obsidian" + remarkable_ocr_pipeline: "guide/remarkable-ai.md#4-ocr--ai-pipeline-custom" + remarkable_ssh_tools: "guide/remarkable-ai.md#5-accès-ssh-et-outils-communautaires" + remarkable_meeting_workflow: "guide/remarkable-ai.md#10-meeting-notes--ai-summary" + remarkable_workflows_to_build: "guide/remarkable-ai.md#14-workflows-ai-augmentés-à-construire" + remarkable_getting_started: "guide/remarkable-ai.md#15-par-où-commencer" + remarkable_community: "https://github.com/reHackable/awesome-reMarkable" + # Whitepapers (FR + EN) — 9 focused whitepapers on Claude Code + whitepapers_url: "https://www.florian.bruniaux.com/guides" + whitepapers_fr: "whitepapers/fr/" # FR sources (Quarto .qmd) + whitepapers_en: "whitepapers/en/" # EN sources (Quarto .qmd) + whitepapers_topics: "foundations, prompting, customization, security, architecture, team, privacy, reference, agent-teams" + # Learning with AI (guide/learning-with-ai.md) + learning_quick_check: "guide/learning-with-ai.md:38" + learning_uval_protocol: "guide/learning-with-ai.md:218" + learning_claude_config: "guide/learning-with-ai.md:458" + learning_breaking_dependency: "guide/learning-with-ai.md:575" + learning_embracing_ai: "guide/learning-with-ai.md:623" + learning_30day_plan: "guide/learning-with-ai.md:815" + learning_red_flags: "guide/learning-with-ai.md:612" + # Productivity Research RCTs + productivity_rct_metr: "guide/learning-with-ai.md:925" # METR 2025: experienced devs 19% slower on large codebases despite perceiving 20% faster + productivity_rct_echoes: "guide/learning-with-ai.md:926" # Borg 2025: 30.7% faster (median), ~55.9% habitual users, no maintainability impact downstream + productivity_maintainability_empirical: "guide/learning-with-ai.md:926" # Empirical data on "AI code is unmaintainable" claim — blind RCT shows no significant difference + trust_calibration_maintainability_nuance: "guide/ultimate-guide.md:1097" # Nuance: defect rates ≠ maintenance burden (Borg et al. 2025) + learning_mode_template: "examples/claude-md/learning-mode.md" + learn_quiz_command: "examples/commands/learn/quiz.md" + learn_teach_command: "examples/commands/learn/teach.md" + learn_alternatives_command: "examples/commands/learn/alternatives.md" + learning_capture_hook: "examples/hooks/bash/learning-capture.sh" + # Anti-patterns + vibe_coding_trap: "guide/learning-with-ai.md:87" + vibe_coding_context_overload: 13097 + vibe_coding_context_overload_source: "Jens Rusitschka, 'Vibe Coding, Level 2' (Jan 2026)" + vibe_coding_phased_strategy: 13097 + # AI Traceability & Attribution (guide/ai-traceability.md) - Added 2026-01-24 + ai_traceability_guide: "guide/ai-traceability.md" + ai_traceability_why: "guide/ai-traceability.md:29" + ai_traceability_disclosure_spectrum: "guide/ai-traceability.md:64" + ai_traceability_co_authored_by: "guide/ai-traceability.md:98" + ai_traceability_assisted_by: "guide/ai-traceability.md:120" + ai_traceability_git_ai: "guide/ai-traceability.md:170" + ai_traceability_llvm_policy: "guide/ai-traceability.md:201" + ai_traceability_ghostty_policy: "guide/ai-traceability.md:236" + ai_traceability_fedora_policy: "guide/ai-traceability.md:261" + ai_traceability_promptpwnd: "guide/ai-traceability.md:501" + ai_traceability_implementation: "guide/ai-traceability.md:566" + ai_traceability_templates: "guide/ai-traceability.md:648" + # AI Disclosure Templates + ai_disclosure_contributing: "examples/config/CONTRIBUTING-ai-disclosure.md" + ai_disclosure_pr_template: "examples/config/PULL_REQUEST_TEMPLATE-ai.md" + # TTS Integration (Agent Vibes) - Added 2026-01-22 + tts_integration_guide: "examples/integrations/agent-vibes/README.md" + tts_installation: "examples/integrations/agent-vibes/installation.md" + tts_voice_catalog: "examples/integrations/agent-vibes/voice-catalog.md" + tts_troubleshooting: "examples/integrations/agent-vibes/troubleshooting.md" + tts_workflow: "guide/workflows/tts-setup.md" + tts_ai_ecosystem: "guide/ai-ecosystem.md:1124" + tts_hook_example: "examples/hooks/bash/tts-selective.sh" + tts_claude_md_template: "examples/claude-md/tts-enabled.md" + # Sandbox Isolation for Coding Agents (guide/sandbox-isolation.md) - Added 2026-01-31 + sandbox_isolation_guide: "guide/sandbox-isolation.md" + sandbox_isolation_decision_tree: "guide/sandbox-isolation.md:7" + sandbox_docker_sandboxes: "guide/sandbox-isolation.md:67" + sandbox_docker_network: "guide/sandbox-isolation.md:121" + sandbox_docker_templates: "guide/sandbox-isolation.md:165" + sandbox_docker_docs: "https://docs.docker.com/ai/sandboxes/" + sandbox_docker_claude_config: "https://docs.docker.com/ai/sandboxes/claude-code/" + sandbox_docker_network_docs: "https://docs.docker.com/ai/sandboxes/network-policies/" + sandbox_docker_templates_docs: "https://docs.docker.com/ai/sandboxes/templates/" + sandbox_flyio_sprites: "https://sprites.dev" + sandbox_cloudflare_sdk: "https://developers.cloudflare.com/sandbox/tutorials/claude-code/" + sandbox_vercel: "https://vercel.com/docs/vercel-sandbox/" + sandbox_e2b: "https://e2b.dev" + sandbox_native_cc: "guide/architecture.md:606" + # Native Claude Code Sandbox (Official docs, v2.1.0+) - Added 2026-02-02 + sandbox_native_guide: "guide/sandbox-native.md" + sandbox_native_why: "guide/sandbox-native.md:47" # Why Native Sandboxing + sandbox_native_os_primitives: "guide/sandbox-native.md:68" # Seatbelt vs bubblewrap + sandbox_native_filesystem: "guide/sandbox-native.md:178" # Filesystem isolation + sandbox_native_network: "guide/sandbox-native.md:221" # Network proxy architecture + sandbox_native_modes: "guide/sandbox-native.md:7" # Auto-allow vs Regular + sandbox_native_escape_hatch: "guide/sandbox-native.md:341" # dangerouslyDisableSandbox + sandbox_native_security_limits: "guide/sandbox-native.md:396" # Domain fronting, Unix sockets + sandbox_native_opensource: "guide/sandbox-native.md:481" # Open-source runtime + sandbox_native_platforms: "guide/sandbox-native.md:505" # Platform support + sandbox_native_decision_tree: "guide/sandbox-native.md:517" # Native vs Docker + sandbox_native_config_examples: "guide/sandbox-native.md:564" # Configuration examples + sandbox_native_best_practices: "guide/sandbox-native.md:637" # Best practices + sandbox_native_troubleshooting: "guide/sandbox-native.md:650" # Troubleshooting + sandbox_runtime_oss: "https://github.com/anthropic-experimental/sandbox-runtime" + sandbox_runtime_npm: "https://www.npmjs.com/package/@anthropic-ai/sandbox-runtime" + sandbox_official_docs: "https://code.claude.com/docs/en/sandboxing" + sandbox_comparison_native_docker: "guide/sandbox-isolation.md:238" # Section 4 Native CC + sandbox_native_evaluation: "docs/resource-evaluations/native-sandbox-official-docs.md" + sandbox_native_score: "5/5" + # Templates (Added 2026-02-02) + sandbox_native_config_template: "examples/config/sandbox-native.json" + sandbox_status_command: "examples/commands/sandbox-status.md" + sandbox_validation_hook: "examples/hooks/bash/sandbox-validation.sh" + # Docker Sandboxes (existing) + sandbox_evaluation: "docs/resource-evaluations/docker-sandboxes-isolation.md" + sandbox_safe_autonomy: "guide/sandbox-isolation.md:496" # Safe Autonomy Workflows + sandbox_anti_patterns: "guide/sandbox-isolation.md:546" # Anti-Patterns + sandbox_comparison_matrix: "guide/sandbox-isolation.md:477" # Comparison Matrix + sandbox_score: "4/5" + # Third-Party Tools (guide/third-party-tools.md) - Added 2026-02-01 + third_party_tools_guide: "guide/third-party-tools.md" + third_party_tools_cost_tracking: "guide/third-party-tools.md:42" + third_party_tools_rtk: "guide/third-party-tools.md:7" + third_party_tools_session_mgmt: "guide/third-party-tools.md:126" + third_party_tools_config_mgmt: "guide/third-party-tools.md:214" + third_party_tools_alternative_uis: "guide/third-party-tools.md:259" + third_party_tools_known_gaps: "guide/third-party-tools.md:375" + third_party_tools_recommendations: "guide/third-party-tools.md:391" + third_party_ccusage: "https://www.npmjs.com/package/ccusage" + third_party_ccusage_site: "https://ccusage.com" + third_party_ccburn: "https://github.com/JuanjoFuchs/ccburn" + third_party_claude_code_viewer: "https://www.npmjs.com/package/@kimuson/claude-code-viewer" + third_party_claude_code_config: "https://github.com/joeyism/claude-code-config" + third_party_aiblueprint: "https://github.com/Melvynx/aiblueprint" + third_party_claude_chic: "https://pypi.org/project/claudechic/" + third_party_toad: "https://github.com/batrachianai/toad" + third_party_conductor: "https://docs.conductor.build" + # Configuration Management & Backup (Added 2026-02-02) + config_management_guide: "guide/ultimate-guide.md:4217" # Section 3.1 Memory Files + config_hierarchy: "guide/ultimate-guide.md:4336" # Global → Project → Local precedence + config_git_strategy_project: "guide/ultimate-guide.md:4634" # What Goes Where + config_git_strategy_global: "guide/ultimate-guide.md:4634" # Version control ~/.claude/ + config_backup_strategies: "guide/ultimate-guide.md:4634" # Git, cloud sync, cron + config_multi_machine_sync: "guide/ultimate-guide.md:4634" # Laptop + desktop workflows + config_security_considerations: "guide/ultimate-guide.md:4419" # CLAUDE.md Injection warning + config_disaster_recovery: "guide/ultimate-guide.md:4634" # Restore from backup + config_community_solutions: "guide/ultimate-guide.md:4634" # brianlovin + Ratinaud + config_github_issue: "https://github.com/anthropics/claude-code/issues/16204" # Migration guidance request + config_brianlovin_repo: "https://github.com/brianlovin/claude-config" # Community example with sync.sh + config_ratinaud_approach: "https://www.linkedin.com/posts/martinratinaud_claudecode-devtools-buildinpublic-activity-7424055660247629824-hBsL" # 504 sessions tested + config_ratinaud_evaluation: "docs/resource-evaluations/ratinaud-config-management-evaluation.md" # Full evaluation + # MCP Secrets Management (Added 2026-02-02) + mcp_secrets_management: "guide/ultimate-guide.md:10589" # Section 8.3.1 + mcp_secrets_principles: "guide/ultimate-guide.md:10589" # Security principles + mcp_secrets_os_keychain: "guide/ultimate-guide.md:10589" # Approach 1: OS Keychain + mcp_secrets_env_file: "guide/ultimate-guide.md:10589" # Approach 2: .env + .gitignore + mcp_secrets_vaults: "guide/ultimate-guide.md:10589" # Approach 3: HashiCorp Vault, AWS, 1Password + mcp_secrets_rotation: "guide/ultimate-guide.md:10589" # Rotation workflow + mcp_secrets_pre_commit: "guide/ultimate-guide.md:8417" # Security Hooks section + mcp_secrets_verification: "guide/ultimate-guide.md:10589" # Verification checklist + mcp_secrets_best_practices: "guide/ultimate-guide.md:10589" # Summary table + # Templates & Scripts (Configuration Management) + sync_claude_config_script: "examples/scripts/sync-claude-config.sh" # Full automation script + pre_commit_secrets_hook: "examples/hooks/bash/pre-commit-secrets.sh" # Git hook for secret detection + settings_local_example: "examples/config/settings.local.json.example" # Machine-specific overrides template + # Tool-qualified deny format (Added 2026-02-26) + permissions_deny_tool_qualified: "guide/ultimate-guide.md:5008" # Permission Patterns table + full example + # Terminal personalization (Added 2026-02-27) + spinner_personalization: "guide/ultimate-guide.md:4978" # spinnerVerbs + spinnerTipsOverride settings + permissions_deny_tool_qualified_syntax: "Read(file_path:*.env*) | Edit(file_path:*.pem) | Write(file_path:*.key) | Bash(command:*rm -rf*)" + permissions_deny_tool_qualified_vs_simple: "file_path: glob matches full path arg; simple '*.env' matches filename only" + permissions_deny_known_limitation: "background indexing may expose via system reminders before checks — GitHub #4160" + permissions_deny_defense_in_depth: "store secrets outside project dir for guaranteed protection" + # Visual Reference (ASCII diagrams) + visual_reference: "guide/visual-reference.md" + # Architecture internals (guide/architecture.md) + architecture_visual_overview: "guide/architecture.md:51" + architecture_visual_source: "https://www.linkedin.com/posts/mohamed-ali-ben-salem-2b777b9a_en-ce-moment-je-vois-passer-des-posts-du-activity-7420592149110362112-eY5a" + architecture_master_loop: "guide/architecture.md:82" + architecture_tools: "guide/architecture.md:219" + architecture_context: "guide/architecture.md:312" + architecture_subagents: "guide/architecture.md:471" + architecture_permissions: "guide/architecture.md:541" + architecture_mcp: "guide/architecture.md:746" + architecture_mcp_visual: "guide/images/mcp-architecture-diagram.svg" + architecture_philosophy: "guide/architecture.md:1205" + # Official LLM-Optimized Documentation - Added 2026-02-25 + official_llms_index: "https://code.claude.com/docs/llms.txt" # Index ~65 pages, ~15-20K tokens — use first for discovery + official_llms_full: "https://code.claude.com/docs/llms-full.txt" # Full doc ~98KB, ~25-30K tokens — source de vérité officielle + # System Prompts (Official Sources) - Added 2026-01-26 + system_prompts_official: "https://platform.claude.com/docs/en/release-notes/system-prompts" + system_prompts_willison_analysis: "https://simonwillison.net/2025/May/25/claude-4-system-prompt/" + system_prompts_prompthub: "https://www.prompthub.us/blog/an-analysis-of-the-claude-4-system-prompt" + system_prompts_architecture: "guide/architecture.md:360" + # MCP Apps Extension (SEP-1865) - Added 2026-01-27 + mcp_apps_architecture: "guide/architecture.md:753" + mcp_apps_evolution: "guide/ultimate-guide.md:9252" + mcp_apps_spec: "https://github.com/modelcontextprotocol/ext-apps" + mcp_apps_blog_mcp: "https://blog.modelcontextprotocol.io/posts/2026-01-26-mcp-apps/" + mcp_apps_blog_claude: "https://claude.com/blog/interactive-tools-in-claude" + mcp_apps_sdk: "https://www.npmjs.com/package/@modelcontextprotocol/ext-apps" + mcp_apps_announcement_date: "2026-01-26" + mcp_apps_cli_relevance: "Indirect (ecosystem understanding, MCP server dev, hybrid workflows)" + # Main guide (guide/ultimate-guide.md) - Updated 2026-01-27 + installation: 221 + first_workflow: 305 + essential_commands: 47 + trust_calibration: 1039 + working_with_images: 450 + wireframing_tools: 520 + figma_mcp: 569 + image_optimization: 594 + permission_modes: 818 + interaction_loop: 1364 + context_management: 1335 + context_triage: 1520 + session_vs_memory: 1553 + fresh_context_pattern: 1597 + subscription_limits: 1933 + subscription_token_budgets: 1948 + subscription_opus_ratio: 1946 + subscription_monitoring: 2113 + plan_mode: 576 + rewind: 2566 + mental_model: 2815 + xml_prompting: 3016 + prompting_provocation: 3469 + prompting_provocation_source: "https://paddo.dev/blog/claude-code-team-tips/" + semantic_anchors: 3503 + semantic_anchors_catalog: "examples/semantic-anchors/anchor-catalog.md" + memory_files: 4205 + # Auto-Memories (v2.1.32+) - Added 2026-02-09 + auto_memories: 4439 + auto_memories_vs_claudemd: 4439 + # Fast Mode (v2.1.36+) - Added 2026-02-09 + fast_mode_command: 720 # /fast in commands table + fast_mode_api: 720 # API breaking changes section + fast_mode_pricing: 1788 # Pricing table + fast_mode_behavior: "2.5x faster, 6x price, same Opus 4.6 model" + # Sonnet 4.6 + 1M Context (Feb 2026) - Added 2026-02-18 + sonnet_4_6_default: 1887 # Pricing table, Sonnet 4.6 now default + context_200k_vs_1m: 1793 # Decision guide: 200K vs 1M context window + context_200k_vs_1m_perf: "Opus 4.6: 93% @ 256K, 76% @ 1M (MRCR v2). Sonnet 4.6 scores not yet published." + context_200k_vs_1m_cost: "Sonnet 4.6: ~$0.23 bug fix, ~$0.75 module refactor, ~$2.25 full 1M session" + context_1m_beta_requirement: "API only, requires anthropic-beta header. Opus: pricing doubles >200K." + # Debug Command (v2.1.30+) - Added 2026-02-09 + debug_command: 47 # Essential Commands table + debug_purpose: "Systematic troubleshooting and error investigation" + # Model Selection & Thinking Guide (Section 2.5) - Added 2026-02-21 + model_selection_guide: 2704 # Section 2.5 — canonical table, effort levels, agent patterns + model_selection_anchor: "#25-model-selection--thinking-guide" + # Configuration Decision Guide (Section 2.7) - Added 2026-02-22 + configuration_decision_guide: 2872 # Section 2.7 — mechanism comparison, decision tree, 56% warning + configuration_decision_guide_anchor: "#27-configuration-decision-guide" + mechanism_comparison_table: 2960 # Semantic roles + mechanism comparison tables + fifty_six_percent_warning: 2955 # Section 2.7 Configuration Decision Guide + planner_agent: "examples/agents/planner.md" + implementer_agent: "examples/agents/implementer.md" + architecture_reviewer_agent: "examples/agents/architecture-reviewer.md" + # Opus 4.6 Features (Feb 2026) - Added 2026-02-09, line numbers updated 2026-02-21 + opus_4_6_adaptive_thinking: 11622 + opus_4_6_effort_parameter: 11636 + opus_4_6_pricing: 1788 + opus_4_6_api_breaking_changes: 11734 + opus_4_6_assistant_prefill_removed: 11737 + # Summarize from Here (v2.1.32+) - Added 2026-02-09 + summarize_from_here: 1506 # Context Recovery Strategies section + # Agent Teams Hook Events (v2.1.32+) - Added 2026-02-09 + hook_teammate_idle: 7934 + hook_task_completed: 7935 + # Agent Memory Field (v2.1.32+) - Added 2026-02-09 + agent_memory_frontmatter: 5636 # Agent Template section (memory field in frontmatter) + # Xcode Integration (Feb 2026) - Added 2026-02-09 + xcode_integration: 12556 + claude_agent_sdk: 12558 + # Task Management System (v2.1.16+) - Added 2026-01-26 + task_management_system: 3726 + task_management_comparison: 3732 + tasks_api_overview: 973 + tasks_api_tools: 3746 + tasks_api_capabilities: 3752 + tasks_api_configuration: 3759 + tasks_api_schema: 3773 + tasks_api_when_to_use: 3790 + tasks_api_limitations: 3796 + tasks_api_field_visibility: "TaskList: id/subject/status/owner/blockedBy only. TaskGet: all fields." + tasks_api_cost_overhead: "Reviewing N task descriptions = 1 + N API calls" + tasks_api_workarounds: 3819 + todowrite_legacy: 3837 + todowrite_when_to_use: 3846 + todowrite_migration_flag: 3855 + task_best_practices: 3862 + task_hierarchy_design: 3726 + task_dependency_management: 3726 + task_status_transitions: 3756 + task_metadata_conventions: 3757 + task_complete_workflow: 3947 + task_sources: 3835 + # Task Management Workflow (guide/workflows/task-management.md) + workflows_task_management: "guide/workflows/task-management.md" + task_workflow_overview: "guide/workflows/task-management.md:15" + task_workflow_planning: "guide/workflows/task-management.md:52" + task_workflow_execution: "guide/workflows/task-management.md:137" + task_workflow_session_mgmt: "guide/workflows/task-management.md:215" + task_workflow_tdd_integration: "guide/workflows/task-management.md:312" + task_workflow_plan_integration: "guide/workflows/task-management.md:367" + task_workflow_migration: "guide/workflows/task-management.md:439" + task_workflow_patterns: "guide/workflows/task-management.md:525" + task_workflow_troubleshooting: "guide/workflows/task-management.md:667" + task_workflow_advanced: "guide/workflows/task-management.md:741" + claude_folder: 4595 + settings: 4879 + precedence_rules: 5103 + agents: 5546 + agent_template: 5636 + agent_examples: 5836 + skills: 6246 + skill_template: 6384 + skill_examples: 6452 + design_patterns_skill: 6630 + design_patterns_skill_location: "examples/skills/design-patterns/" + design_patterns_skill_modes: "Detection, Suggestion, Evaluation" + design_patterns_skill_patterns: "23 GoF patterns (Creational 5, Structural 7, Behavioral 11)" + design_patterns_skill_stacks: "React, Angular, NestJS, Vue, Express, RxJS, Redux, ORMs" + community_skills_cybersec: 6780 + community_skills_iac: 6863 + # Automatic skill generation (meta-skill) + claudeception: "https://github.com/blader/Claudeception" + claudeception_guide: 6915 + # Skill Lifecycle: Automatic improvement (added 2026-01-24) + skill_lifecycle: 6246 + claude_reflect_system: 6246 + claude_reflect_system_repo: "https://github.com/haddock-development/claude-reflect-system" + claude_reflect_system_agent_skills: "https://agent-skills.md/skills/haddock-development/claude-reflect-system/reflect" + skill_improvement_pattern: 6630 + skill_improvement_how_it_works: 6630 + skill_improvement_safety: 6373 + skill_improvement_security_warnings: 6373 + skill_improvement_comparison: 6250 + skill_improvement_workflow: 6328 + # Design Intelligence Skill (added 2026-02-23) + ui_ux_pro_max: "https://github.com/nextlevelbuilder/ui-ux-pro-max-skill" + ui_ux_pro_max_site: "https://ui-ux-pro-max-skill.nextlevelbuilder.io" + ui_ux_pro_max_guide: 7092 + ui_ux_pro_max_stars: 33700 + ui_ux_pro_max_styles: 67 + ui_ux_pro_max_palettes: 96 + # Agent Skills Open Standard (added 2026-02-01) + agentskills_spec: "https://agentskills.io" + agentskills_spec_repo: "https://github.com/agentskills/agentskills" + agentskills_spec_stars: "8.2K" + agentskills_platforms: "26+ (Claude Code, Cursor, VS Code, GitHub, Codex, Gemini CLI, Goose, Roo Code, Spring AI, Databricks...)" + agentskills_ref_cli: "https://github.com/agentskills/agentskills/tree/main/skills-ref" + agentskills_ref_cli_usage: "skills-ref validate | skills-ref to-prompt " + anthropics_skills_repo: "https://github.com/anthropics/skills" + anthropics_skills_stars: "60K+" + anthropics_skills_categories: "Documents (docx/pdf/pptx/xlsx), Creative & Design, Development, Enterprise" + anthropics_skills_install: "/plugin marketplace add anthropics/skills" + anthropics_plugins_official_repo: "https://github.com/anthropics/claude-plugins-official" + anthropics_plugins_official_installs: "3.1K" + anthropics_plugins_official_skills: "claude-md-improver, claude-automation-recommender, playground, plugin dev meta-skills" + anthropics_plugins_official_install: "npx add-skill anthropics/claude-plugins-official" + agentskills_threat_model: "https://safedep.io/agent-skills-threat-model" + agentskills_threat_model_finding: "8-14% of public skills have vulnerabilities (prompt injection, data exfiltration, privilege escalation)" + agentskills_blog: "https://anthropic.com/engineering/equipping-agents-for-the-real-world-with-agent-skills" + agentskills_guide_section: "guide/ultimate-guide.md:6383" + agentskills_evaluation: "docs/resource-evaluations/agentskills-io-specification.md" + agentskills_score: "4/5" + # claude-code-best-practice repo evaluations (Added 2026-02-26) + ccbp_repo_evaluation: "docs/resource-evaluations/069-claude-code-best-practice-repo-eval.md" + ccbp_repo_score: "4/5" + ccbp_repo_source: "https://github.com/shanraisshan/claude-code-best-practice" + ccbp_repo_critical_finding: "bug at guide/ultimate-guide.md:5646 — official agent fields misclassified as community patterns (fixed)" + ccbp_dotclaude_evaluation: "docs/resource-evaluations/070-claude-code-best-practice-dot-claude-eval.md" + ccbp_dotclaude_score: "4/5" + ccbp_dotclaude_patterns: "self-evolving agent, Command→Agent→Skills architecture, allowed-tools wildcard scoping" + # Skills Marketplace (added 2026-01-23) + skills_marketplace: 7212 + skills_marketplace_url: "https://skills.sh/" + skills_marketplace_github: "https://github.com/vercel-labs/agent-skills" + skills_marketplace_install: "npx add-skill " + skills_marketplace_top_skills: + - "vercel-react-best-practices: 35K+ installs" + - "web-design-guidelines: 26.6K installs" + - "supabase-postgres-best-practices: 1K+ installs" + - "better-auth-best-practices: 2K+ installs" + - "test-driven-development: 721 installs" + skills_marketplace_status: "Community (Vercel Labs), launched Jan 21, 2026" + skills_marketplace_changelog: "https://vercel.com/changelog/introducing-skills-the-open-agent-skills-ecosystem" + # Plugin System & Community Marketplaces (updated 2026-01-24) + plugins_system: 11048 + plugins_commands: 11062 + plugins_marketplace: 11100 + plugins_community_marketplaces: 11358 # New section with ecosystem stats + plugins_recommended: "examples/plugins/" + plugins_se_cove: "examples/plugins/se-cove.md" + plugins_official_docs: "https://code.claude.com/docs/en/plugins" + plugins_official_reference: "https://code.claude.com/docs/en/plugins-reference" + plugins_official_marketplaces: "https://code.claude.com/docs/en/plugin-marketplaces" + # Community plugin resources + plugins_wshobson_agents: + url: "https://github.com/wshobson/agents" + stats: "67 plugins, 99 agents, 107 skills" + updated: "2026-01-24" + plugins_registry_claude_plugins_dev: + url: "https://claude-plugins.dev" + stats: "11,989 plugins, 63,065 skills indexed" + plugins_registry_claudemarketplaces: + url: "https://claudemarketplaces.com" + purpose: "Auto-scan GitHub for .claude-plugin/marketplace.json" + plugins_popular: + - "Context7: ~72k installs (library docs lookup)" + - "Ralph Wiggum: ~57k installs (code review)" + - "Figma MCP: ~18k installs (design-to-code)" + - "Linear MCP: ~9.5k installs (issue tracking)" + plugins_awesome_list: "https://github.com/hesreallyhim/awesome-claude-code" + plugins_awesome_list_stars: "20k+" + chain_of_verification: "guide/methodologies.md:230" + chain_of_verification_paper: "https://arxiv.org/abs/2309.11495" + chain_of_verification_acl: "https://aclanthology.org/2024.findings-acl.212/" + # Verification Loops & Eval Harness (added 2026-01-23) + verification_loops: "guide/methodologies.md:245" + verification_loops_source: "https://www.anthropic.com/engineering/claude-code-best-practices" + eval_harness: "guide/methodologies.md:289" + eval_harness_source: "https://www.anthropic.com/engineering/demystifying-evals-for-ai-agents" + # GSD (Get Shit Done) methodology (added 2026-01-25) + gsd_methodology: "guide/methodologies.md:53" + gsd_evaluation: "docs/resource-evaluations/gsd-evaluation.md" + gsd_source: "https://github.com/glittercowboy/get-shit-done" + gsd_note: "Overlap with existing patterns (Ralph Loop, Gas Town, BMAD)" + # Resource Evaluations (added 2026-01-26, updated 2026-02-07) + resource_evaluations_directory: "docs/resource-evaluations/" + resource_evaluations_count: 84 + resource_evaluations_methodology: "docs/resource-evaluations/README.md" + resource_evaluations_watchlist: "docs/resource-evaluations/watch-list.md" + resource_evaluations_appendix: "guide/ultimate-guide.md:20886" + resource_evaluations_readme_section: "README.md:307" + resource_evaluations_git_mcp: "docs/resource-evaluations/git-mcp-server-evaluation.md" + resource_evaluations_anaconda_croce: "docs/resource-evaluations/anaconda-croce-evaluation.md" + resource_evaluations_grenier_quality: "docs/resource-evaluations/grenier-agent-skill-quality.md" + resource_evaluations_grenier_score: "3/5" + resource_evaluations_grenier_gap: "No automated quality checks for agents/skills (29.5% deploy without evaluation per LangChain 2026)" + resource_evaluations_grenier_integration: "Created /audit-agents-skills command + skill + criteria.yaml" + # Agent/Skill Quality Audit (added 2026-02-07) + audit_agents_skills_command: "examples/commands/audit-agents-skills.md" + audit_agents_skills_skill: "examples/skills/audit-agents-skills/SKILL.md" + audit_agents_skills_criteria: "examples/skills/audit-agents-skills/scoring/criteria.yaml" + audit_agents_skills_framework: "16 criteria (Identity 3x, Prompt 2x, Validation 1x, Design 2x)" + audit_agents_skills_scoring: "32 points max (agents/skills), 20 points (commands)" + audit_agents_skills_grades: "A-F scale, 80% production threshold" + audit_agents_skills_modes: "Quick (top-5), Full (all 16), Comparative (vs templates)" + audit_agents_skills_output: "Markdown + JSON for CI/CD integration" + audit_agents_skills_industry_context: "29.5% deploy without evaluation (LangChain 2026), 18% cite agent bugs as top challenge" + audit_agents_skills_guide_refs: "guide/ultimate-guide.md:4951 (after Agent Validation Checklist), guide/ultimate-guide.md:5495 (after Skill Validation)" + # Practitioner Insights (external validation) + practitioner_insights: "guide/ai-ecosystem.md:2170" + practitioner_dave_van_veen: "guide/ai-ecosystem.md:2174" + practitioner_matteo_collina: "guide/ai-ecosystem.md:2203" + # Outcome Engineering (o16g) - Emerging manifesto (2026-02-13) + outcome_engineering_o16g: "guide/ai-ecosystem.md:2366" + outcome_engineering_url: "https://o16g.com/" + outcome_engineering_author: "Cory Ondrejka (CTO Onebrief, co-creator Second Life, ex-VP Google/Meta)" + outcome_engineering_status: "Emerging - on watch list for community adoption" + practitioner_collina_source: "https://adventures.nodeland.dev/archive/the-human-in-the-loop/" + practitioner_steinberger: "guide/ai-ecosystem.md:2242" + practitioner_steinberger_source: "https://steipete.me/posts/2025/shipping-at-inference-speed" + practitioner_addy_osmani: "guide/ai-ecosystem.md:2269" + practitioner_osmani_source: "https://addyo.substack.com/p/the-80-problem-in-agentic-coding" + practitioner_alan: "guide/ai-ecosystem.md:2299" + practitioner_alan_source: "https://www.linkedin.com/pulse/le-principe-de-la-tour-eiffel-et-ralph-wiggum-maxime-le-bras-psmxe/" + verification_paradox: "guide/production-safety.md:639" + verification_paradox_source: "https://www.linkedin.com/pulse/le-principe-de-la-tour-eiffel-et-ralph-wiggum-maxime-le-bras-psmxe/" + eighty_percent_problem: "guide/ai-ecosystem.md:2269" + comprehension_debt_secondary: "guide/ai-ecosystem.md:2269" # See also: vibe_coding_trap (primary) + # DevOps/SRE Guide (guide/devops-sre.md) + devops_sre_guide: "guide/devops-sre.md" + devops_fire_framework: "guide/devops-sre.md:46" + devops_k8s_troubleshooting: "guide/devops-sre.md:129" + devops_k8s_prompts: "guide/devops-sre.md:151" + devops_incident_response: "guide/devops-sre.md:333" + devops_iac_patterns: "guide/devops-sre.md:504" + devops_guardrails: "guide/devops-sre.md:687" + devops_limitations: "guide/devops-sre.md:297" + devops_quick_reference: "guide/devops-sre.md:794" + devops_agent: "examples/agents/devops-sre.md" + devops_claude_md: "examples/claude-md/devops-sre.md" + # Product Designer (design-to-code workflow) + product_designer_workflow: "guide/workflows/design-to-code.md" + product_designer_claudemd: "examples/claude-md/product-designer.md" + design_system_handoff: "guide/workflows/design-to-code.md:263" + figma_make_integration: "guide/workflows/design-to-code.md:85" + pencil_canvas: "guide/ultimate-guide.md:528" + pencil_workflow: "guide/workflows/design-to-code.md:453" + pencil_vs_figma: "guide/workflows/design-to-code.md:476" + commands: 47 + command_template: 7592 + hooks: 8077 + hook_templates: 8155 + security_hooks: 8161 + security_gate_hook_line: 8481 + security_gate_hook_source: "https://paddo.dev/blog/claude-code-team-tips/" + mcp_servers: 9204 + serena_indexation: 9373 + serena_mcp: 9373 + doobidoo_memory_mcp: 10142 + mcp_memory_stack_patterns: 10325 + mcp_config: 10556 + mcp_security: 11402 + cicd: 11827 + ide_integration: 12528 + feedback_loops: 12613 + batch_operations: 13243 + pitfalls: 13366 + git_best_practices: 13831 + cost_optimization: 1784 + session_teleportation: 15178 + remote_control: 18833 + multi_instance_workflows: 15283 + boris_cherny_case_study: 15332 + boris_cherny_team_patterns: 5492 + # Dual-Instance Planning Pattern (Jon Williams, Feb 2026) + dual_instance_planning: 15385 + dual_instance_workflow: "guide/workflows/dual-instance-planning.md" + dual_instance_overview: 15385 + dual_instance_setup: "guide/workflows/dual-instance-planning.md:71" + dual_instance_complete_workflow: "guide/workflows/dual-instance-planning.md:145" + dual_instance_plan_template: "guide/workflows/dual-instance-planning.md:522" + dual_instance_cost_analysis: "guide/workflows/dual-instance-planning.md:614" + dual_instance_comparison: 15385 # Boris vs Jon comparison table + dual_instance_source: "https://www.linkedin.com/posts/thatjonwilliams_ive-been-using-cursor-for-six-months-now-activity-7424481861802033153-k8bu" + dual_instance_author: "Jon Williams (Product Designer, UK)" + dual_instance_date: "2026-02-03" + dual_instance_pattern: "Vertical separation (planner vs implementer) - orthogonal to Boris horizontal scaling" + dual_instance_cost: "$100-200/month (vs $500-1K Boris pattern)" + dual_instance_audience: "Solo devs, spec-heavy work, quality > speed" + # Boris Tane Pattern (Annotation Cycle, Feb 2026) + annotation_cycle_pattern: "guide/workflows/plan-driven.md#the-annotation-cycle" + custom_markdown_plans: "guide/workflows/plan-driven.md#why-custom-plans-over-plan" + boris_tane_source: "https://boristane.com/blog/how-i-use-claude-code/" + boris_tane_author: "Boris Tane (Engineering Lead, Cloudflare)" + # External resource: Claude Code team tips (paddo.dev, Feb 2026) + team_tips_paddo: "https://paddo.dev/blog/claude-code-team-tips/" + team_tips_paddo_source: "Boris Cherny thread (x.com/bcherny/status/2017742741636321619)" + team_tips_paddo_evaluation: "docs/resource-evaluations/paddo-team-tips-eval.md" + team_tips_paddo_score: "4/5" + anthropic_study_metrics: 11555 + # Contribution Metrics (Jan 2026 - platform feature, not CLI release) + contribution_metrics: 15970 + contribution_metrics_source: "https://claude.com/blog/contribution-metrics" + contribution_metrics_date: "2026-01-29" + contribution_metrics_availability: "Public beta - Team and Enterprise plans" + contribution_metrics_stats: "+67% PRs merged/engineer/day, 70-90% AI-assisted code (Anthropic internal)" + # Git Worktree Commands (Feb 2026) + git_worktree_command: "examples/commands/git-worktree.md" + git_worktree_status_command: "examples/commands/git-worktree-status.md" + git_worktree_remove_command: "examples/commands/git-worktree-remove.md" + git_worktree_clean_command: "examples/commands/git-worktree-clean.md" + git_worktrees_multi_instance: 14013 + advanced_worktree_tooling: 15763 + worktree_tooling_self_assessment: 15763 + anthropic_internal_study: 15934 + multi_instance_costs: 15283 + orchestration_frameworks: 16029 + headless_pm_framework: 11841 + multi_instance_implementation: 15283 + multi_instance_monitoring: 15283 + multi_instance_decision_matrix: 15283 + # External orchestration systems + external_orchestrators: + gas_town: + repo: "https://github.com/steveyegge/gastown" + author: "Steve Yegge" + description: "Multi-agent workspace manager using Claude Code instances" + status: "Experimental (Jan 2026)" + guide_section: "guide/ai-ecosystem.md:850" + multiclaude: + repo: "https://github.com/dlorenc/multiclaude" + author: "dlorenc" + description: "Self-hosted multi-agent Claude Code spawner (tmux + git worktrees)" + status: "Active development (Jan 2026, 383 stars)" + guide_section: "guide/ai-ecosystem.md:850" + agent_chat: + repo: "https://github.com/justinabrahms/agent-chat" + author: "Justin Abrahms" + description: "Real-time monitoring UI for Gas Town and multiclaude (SSE + SQLite)" + status: "Early preview (Jan 2026, v0.2.0)" + guide_section: "guide/ai-ecosystem.md:850" + # External research & alignment tools + external_research: + claude_constitution: + url: "https://www.anthropic.com/constitution" + pdf: "https://www-cdn.anthropic.com/9214f02e82c4489fb6cf45441d448a1ecd1a3aca/claudes-constitution.pdf" + announcement: "https://www.anthropic.com/news/claude-new-constitution" + description: "Claude's Constitutional AI framework - value hierarchy (safety > ethics > compliance > utility)" + license: "CC0 1.0 (public domain)" + published: "2026-01-21" + guide_section: "guide/data-privacy.md:296" + petri_v2: + repo: "https://github.com/safety-research/petri" + blog: "https://alignment.anthropic.com/2026/petri-v2/" + description: "Open-source AI behavior audit tool (Anthropic Alignment Science)" + features: + - "70 scenarios: collusion, ethics conflicts, info sensitivity" + - "Eval-awareness mitigations" + - "Benchmarks: Claude Opus 4.5, GPT-5.2, Gemini 3 Pro, Grok 4" + published: "2026-01-21" + guide_section: "README.md:338" + # Section 9.18 - Codebase Design for Agent Productivity + codebase_design_agents: 16311 + codebase_design_source: "https://marmelab.com/blog/2026/01/21/agent-experience.html" + codebase_design_author: "François Zaninotto (Marmelab)" + codebase_design_llms_txt: 16797 # llms.txt standard for AI-optimized documentation + codebase_design_llms_txt_spec: "https://llmstxt.org/" + codebase_design_llms_txt_example: "machine-readable/llms.txt" + # Section 9.19 - Permutation Frameworks + permutation_frameworks: 18314 + # Section 9.20 - Agent Teams (v2.1.32+ experimental) + agent_teams: "guide/workflows/agent-teams.md" + agent_teams_quick_start: "guide/workflows/agent-teams-quick-start.md" # Practical 8-10 min guide with copy-paste patterns + agent_teams_overview: 18498 # Section 9.20 in ultimate-guide.md + agent_teams_architecture: "guide/workflows/agent-teams.md:137" + agent_teams_setup: "guide/workflows/agent-teams.md:250" + agent_teams_use_cases: "guide/workflows/agent-teams.md:346" + agent_teams_fountain_case_study: "guide/workflows/agent-teams.md:358" + agent_teams_cred_case_study: "guide/workflows/agent-teams.md:391" + agent_teams_c_compiler_case_study: "guide/workflows/agent-teams.md:308" + agent_teams_paul_rayner_workflows: "guide/workflows/agent-teams.md:450" + agent_teams_workflow_impact: "guide/workflows/agent-teams.md:552" + agent_teams_limitations: "guide/workflows/agent-teams.md:644" + agent_teams_decision_tree: "guide/workflows/agent-teams.md:804" + agent_teams_best_practices: "guide/workflows/agent-teams.md:928" + agent_teams_troubleshooting: "guide/workflows/agent-teams.md:1092" + agent_teams_experimental_flag: "CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=true" + agent_teams_model_requirement: "Opus 4.6 minimum" + agent_teams_sources: + - "https://www.anthropic.com/news/claude-opus-4-6" + - "https://www.anthropic.com/engineering/building-c-compiler" + - "https://resources.anthropic.com/hubfs/2026%20Agentic%20Coding%20Trends%20Report.pdf" + - "https://dev.to/thegdsks/claude-opus-46-for-developers-agent-teams-1m-context-and-what-actually-matters-4h8c" + - "https://www.linkedin.com/posts/thepaulrayner_this-is-wild-i-just-upgraded-claude-code-activity-7425635159678414850-MNyv" + # Anthropic 2026 Trends (diffused across sections, not standalone) + agentic_trends_2026_report: "https://resources.anthropic.com/hubfs/2026%20Agentic%20Coding%20Trends%20Report.pdf" + agentic_trends_2026_evaluation: "docs/resource-evaluations/anthropic-2026-agentic-coding-trends.md" + agentic_trends_integration_strategy: "Diffusion transversale (industry data in 9.17, 9.20, 9.11, 9 intro)" + agentic_trends_research_data: + ai_usage: "60% of work (Anthropic internal study)" + full_delegation: "0-20% tasks (collaboration > delegation)" + productivity_gain: "67% more PRs merged/engineer/day" + new_work: "27% tasks wouldn't be done without AI" + agentic_trends_case_studies: + fountain: "50% faster screening (hierarchical multi-agent)" + rakuten: "7h autonomous vLLM (12.5M lines, 99.9% accuracy)" + cred: "2x execution speed, quality maintained (fintech)" + telus: "500K hours saved, 13K solutions, 30% faster" + legora: "Legal platform, lawyers automate without coding" + zapier: "89% adoption, 800+ internal agents" + augment_code: "4-8 months project → 2 weeks" + agentic_trends_benchmarks: + multi_instance_cost: "$500-1K/month (Boris pattern validation)" + agent_teams_timeline: "3-6 months adoption (enterprise)" + productivity_multiplier: "3x (capabilities × orchestration × experience)" + timeline_compression: "weeks → days (feature implementation)" + onboarding_speedup: "2-4 weeks → 4-8 hours (new codebase)" + agentic_trends_anti_patterns: + over_delegation: ">5 agents = coordination overhead" + premature_automation: "Automate before mastering manual" + tool_sprawl: ">10 MCP servers = maintenance burden" + no_roi_tracking: "Can't optimize what you don't measure" + # AI Fluency Research (Anthropic, Feb 2026) - Added 2026-02-23 + ai_fluency_index: "https://www.anthropic.com/research/AI-fluency-index" + ai_fluency_evaluation: "docs/resource-evaluations/2026-02-23-anthropic-ai-fluency-index.md" + ai_fluency_score: "4/5" + ai_fluency_sample: "9,830 conversations, 7-day window, January 2026" + ai_fluency_iteration_stat: "5.6× more likely to question reasoning (iterative vs non-iterative users)" + ai_fluency_fluency_ratio: "2.67 vs 1.33 behaviors (iterative vs non-iterative)" + ai_fluency_collaboration_terms: "Only 30% of users set collaboration terms explicitly" + ai_fluency_artifact_paradox: "Artifact production → −5.2pp missing context, −3.7pp fact-check, −3.1pp questioning reasoning" + ai_fluency_plan_review_section: "guide/ultimate-guide.md:2542" # Rev the Engine callout + ai_fluency_claudemd_section: "guide/ultimate-guide.md:4421" # CLAUDE.md Best Practices callout + ai_fluency_artifact_section: "guide/ultimate-guide.md:13485" # Artifact Paradox callout (Common Pitfalls) + ai_fluency_authors: "Swanson, Bent, Huang, Ludwig, Dakan, Feller (Anthropic)" + ai_fluency_published: "2026-02-23" + ai_fluency_future: "Claude Code platform analysis (mentioned in paper's future directions)" + ai_fluency_diagram: "guide/diagrams/06-development-workflows.md#ai-fluency--high-vs-low-fluency-paths" + ai_fluency_diagram_type: "flowchart — Artifact Paradox: 70% vs 30% user paths, behavioral drop data, iteration outcomes" + # Advanced Plan Mode Patterns + rev_the_engine: 2490 + mechanic_stacking: 2538 + # Sub-Agent Patterns (Refactored 2026-02-09) + agent_anti_patterns: 4032 # Critical: Roles vs Context Control (Dex Horty principle) + scope_focused_agents: 4079 # Formerly "Split-Role Sub-Agents", refactored for context isolation + teammatetool_experimental: 3976 # Multi-agent orchestration parent section + # Task Management Diagnostic + task_lists_diagnostic: 3884 + # Mental Model + main_thread_orchestrator: 2886 + # CLAUDE.md Patterns + continuous_context_update: 4297 + # Hook Patterns + smart_hook_dispatching: 8689 + # Workflows + skeleton_projects_workflow: "guide/workflows/skeleton-projects.md" + # Spec-First Development (Addy Osmani, Jan 2026) + spec_first_workflow: "guide/workflows/spec-first.md" + spec_modular_design: "guide/workflows/spec-first.md:363" + spec_operational_boundaries: "guide/workflows/spec-first.md:461" + spec_command_template: "guide/workflows/spec-first.md:573" + spec_anti_monolithic: "guide/workflows/spec-first.md:717" + spec_osmani_source: "https://addyosmani.com/blog/good-spec/" + spec_osmani_evaluation: "docs/resource-evaluations/addy-osmani-good-spec.md" + spec_osmani_score: "4/5" + spec_task_granularity: "guide/workflows/spec-first.md:62" # Vertical slices + PRD checklist (Allan Hill, Feb 2026) + spec_prd_checklist: "guide/workflows/spec-first.md:68" # 6-dimension PRD quality checklist + atdd_with_agents: "guide/methodologies.md:161" # ATDD + Gherkin for agentic workflows + commands_table: 47 + shortcuts_table: 368 + troubleshooting: 11311 + cheatsheet: 19597 + daily_workflow: 19673 + # AI Ecosystem (Section 11, ~line 10525) + ai_ecosystem: 20004 + ai_ecosystem_complementarity: 20004 + ai_ecosystem_tool_matrix: 20031 + ai_ecosystem_workflows: 20166 + ai_ecosystem_integration: 20294 + ai_ecosystem_detailed: "guide/ai-ecosystem.md" + ai_ecosystem_goose: "guide/ai-ecosystem.md:2074" + ai_ecosystem_goose_comparison: "guide/ai-ecosystem.md:2090" + ai_ecosystem_context_packing: "guide/ai-ecosystem.md:2533" + ai_ecosystem_multi_ide_sync: "guide/ai-ecosystem.md:1282" + agents_md_support_status: "guide/ai-ecosystem.md:1348" + ai_ecosystem_build_vs_use: "guide/ai-ecosystem.md:2399" # Section 11.3 - When to Build vs Use (ADK, LangChain, Vercel AI SDK) + # Architecture Diagrams as Context (advanced pattern) - Added 2026-01-25 + architecture_diagrams_input: "guide/ai-ecosystem.md:2567" + architecture_diagrams_mcp_tools: + - "Archy MCP: https://www.pulsemcp.com/servers/phxdev1-archy" + - "Mermaid MCP: 61.4K users" + - "Blueprint MCP (ArcadeAI)" + llm_oop_research: "https://dl.acm.org/doi/10.1145/3639474.3640052" + architecture_diagrams_source: "https://www.linkedin.com/posts/tigraff_uml-claude-wibecoding-activity-7420595633826258944-gGO5" + ai_ecosystem_voice_to_text: "guide/ai-ecosystem.md:1066" + ai_ecosystem_alternative_providers: "guide/ai-ecosystem.md:2639" + voice_refine_skill: "examples/skills/voice-refine/SKILL.md" + # Cowork documentation (v1.0 - migrated to dedicated repo) + cowork_reference: "machine-readable/cowork-reference.yaml" # Dedicated YAML index (kept local) + cowork_hub: "https://github.com/FlorianBruniaux/claude-cowork-guide/blob/main/README.md" + cowork_summary: "guide/cowork.md" # Summary remains in this repo + cowork_overview: "https://github.com/FlorianBruniaux/claude-cowork-guide/blob/main/guide/00-overview.md" + cowork_getting_started: "https://github.com/FlorianBruniaux/claude-cowork-guide/blob/main/guide/01-getting-started.md" + cowork_capabilities: "https://github.com/FlorianBruniaux/claude-cowork-guide/blob/main/guide/02-capabilities.md" + cowork_security: "https://github.com/FlorianBruniaux/claude-cowork-guide/blob/main/guide/03-security.md" + cowork_troubleshooting: "https://github.com/FlorianBruniaux/claude-cowork-guide/blob/main/guide/04-troubleshooting.md" + cowork_cheatsheet: "https://github.com/FlorianBruniaux/claude-cowork-guide/blob/main/reference/cheatsheet.md" + cowork_comparison: "https://github.com/FlorianBruniaux/claude-cowork-guide/blob/main/reference/comparison.md" + cowork_faq: "https://github.com/FlorianBruniaux/claude-cowork-guide/blob/main/reference/faq.md" + cowork_prompts: "https://github.com/FlorianBruniaux/claude-cowork-guide/tree/main/prompts" + cowork_workflows: "https://github.com/FlorianBruniaux/claude-cowork-guide/tree/main/workflows" + cowork_section: "guide/ai-ecosystem.md:1809" + cowork_ultimate_guide: 20348 + # Experimental Features + teammatetool: 3976 + teammatetool_status: "Experimental, progressive rollout, feature-flagged" + teammatetool_capabilities: "Multi-agent coordination, team messaging, swarm patterns" + teammatetool_sources: + - "https://gist.github.com/kieranklaassen/4f2aba89594a4aea4ad64d753984b2ea" + - "https://github.com/anthropics/claude-code/issues/3013" + - "https://github.com/mikekelly/claude-sneakpeek" + # Appendix + appendix_a_file_locations: 20574 + appendix_b_faq: 20750 + faq_clawdbot_vs_claudecode: 20764 + faq_product_managers: 20821 + appendix_c_resource_evaluation: 20886 + appendix_d_myths_vs_reality: 20929 + myths_hidden_features: 20933 + myths_tasks_api_autonomous: 20965 + myths_100x_faster: 20997 + myths_reliable_sources: 20983 + # Quiz System (264 questions, 15 categories) + quiz_overview: "quiz/README.md" + quiz_file: "quiz/questions.json" + quiz_count: 264 + quiz_categories: 15 + quiz_beginner: "quiz/categories/basics,commands,shortcuts,reference" + quiz_beginner_count: 60 + quiz_intermediate: "quiz/categories/workflows,context,agents,hooks" + quiz_intermediate_count: 100 + quiz_advanced: "quiz/categories/mcp,production,advanced,learning,ecosystem" + quiz_advanced_count: 97 + quiz_estimated_time_beginner: "15-20 min" + quiz_estimated_time_intermediate: "25-30 min" + quiz_estimated_time_advanced: "30-40 min" + # Onboarding matrix required keys (added for v2.0.0 adaptive architecture) + rules: 89 # Golden Rules section + workflow: 58 # Workflow (9 steps) + fix: 11948 # Troubleshooting section + architecture: 919 # Architecture internals + production_safety: "guide/production-safety.md" # Production safety rules + security_hardening: "guide/security-hardening.md" # Security best practices + security_cve_summary: "guide/security-hardening.md:15" # Decision Matrix + CVEs + security_supply_chain_stats: "guide/security-hardening.md:137" # Agent Skills Supply Chain Risks + security_mcp_scan_tool: "guide/security-hardening.md:32" # MCP Vetting Workflow + security_malicious_extensions: "guide/security-hardening.md:252" # .claude/ attack surface (§1.5) + security_kill_switch: "guide/security-hardening.md:630" # AI Kill Switch & Containment Architecture (§3.5) + security_claude_folder_audit: "guide/security-hardening.md:228" # Repository Pre-Scan (§1.4) + security_toxicskills_evaluation: "docs/resource-evaluations/snyk-toxicskills-evaluation.md" + security_check_command: "examples/commands/security-check.md" # Quick config check vs known threats + security_audit_command: "examples/commands/security-audit.md" # Full 6-phase security audit (score /100) + security_threat_db: "examples/commands/resources/threat-db.yaml" # Threat intelligence database (authors, skills, CVEs, patterns) + security_update_threat_db: "examples/commands/update-threat-db.md" # /update-threat-db — research & update threat database + security_cc_scanner: "guide/security-hardening.md:780" # Claude Code Security (research preview) — Anthropic native vuln scanner, adversarial validation, patch suggestions + security_patcher_agent: "examples/agents/security-patcher.md" # Agent: applies patches from security-auditor findings, human approval gate, Write/Edit tools + security_gate_hook: "examples/hooks/bash/security-gate.sh" # PreToolUse hook: blocks 7 vuln patterns at write time (SQLi, XSS, hardcoded secrets, eval, weak hash, cmd injection, path traversal) + security_pr_review_workflow: "guide/security-hardening.md:712" # PR security review workflow — 3-agent pipeline, git hook integration + agent_validation_checklist: 5744 # Agent validation section in ultimate-guide.md + git_mcp_guide: "guide/mcp-servers-ecosystem.md:113" # Git MCP server documentation + +# ════════════════════════════════════════════════════════════════ +# DECISION TREE (most important - en premier) +# ════════════════════════════════════════════════════════════════ +decide: + simple_task: "just ask Claude" + complex_task: "/plan first, then use Tasks API (v2.1.16+) or TodoWrite" + complex_task_multi_session: "use Tasks API with CLAUDE_CODE_TASK_LIST_ID" + context_high: "/compact (>70%) or /clear (>90%)" + repeating: "create agent or command" + need_docs: "Context7 MCP" + deep_debug: "use Opus (thinking enabled by default) - Alt+T to toggle" + +# ════════════════════════════════════════════════════════════════ +# PROMPTING FORMULA (see deep_dive.xml_prompting for details) +# ════════════════════════════════════════════════════════════════ +prompt_formula: + WHAT: "concrete deliverable" + WHERE: "file paths" + HOW: "constraints, approach" + VERIFY: "success criteria" + example: | + Add input validation to login form. + WHERE: src/components/LoginForm.tsx + HOW: Use Zod, inline errors + VERIFY: Empty email shows error + +# ════════════════════════════════════════════════════════════════ +# WORKFLOW (9 steps) - see deep_dive.first_workflow +# ════════════════════════════════════════════════════════════════ +workflow: + 1: "claude" + 2: "/status" + 3: "Shift+Tab×2 for plan mode (if risky)" + 4: "describe task (WHAT/WHERE/HOW/VERIFY)" + 5: "review diff" + 6: "y/n" + 7: "run tests" + 8: "commit" + 9: "/compact when >70%" + +# ════════════════════════════════════════════════════════════════ +# CRITICAL COMMANDS - see deep_dive.essential_commands +# ════════════════════════════════════════════════════════════════ +commands: + /compact: "compress context - USE AT >70%" + /clear: "reset conversation - USE AT >90%" + /status: "show context % and cost" + /plan: "read-only mode (safe exploration)" + /execute: "exit plan mode" + /rewind: "undo changes" + /model: "switch: sonnet|opus|opusplan" + /mcp: "show MCP server status" + /context: "detailed token breakdown" + /teleport: "bring web session to local CLI" + /tasks: "monitor background tasks" + /remote-env: "configure cloud environment" + /remote-control: "start remote control session (Research Preview, Pro/Max only)" + /rc: "alias for /remote-control" + /mobile: "get Claude mobile app download links (iOS + Android)" + +# ════════════════════════════════════════════════════════════════ +# SHORTCUTS - see deep_dive.shortcuts_table +# ════════════════════════════════════════════════════════════════ +shortcuts: + Shift+Tab: "cycle: default → auto-accept → plan" + Esc×2: "rewind/undo" + Ctrl+C: "interrupt" + Ctrl+R: "search command history" + Ctrl+B: "background all tasks" + "@file": "reference file" + "!cmd": "shell command" + +# ════════════════════════════════════════════════════════════════ +# CLI FLAGS - see deep_dive.commands_table +# ════════════════════════════════════════════════════════════════ +cli: + "-c": "continue last session" + "-r ": "resume specific session" + "--teleport": "bring web session to local CLI" + "remote-control": "subcommand: start remote control session" + "-p": "non-interactive (pipe mode)" + "--model X": "select model" + "--dangerously-skip-permissions": "auto-accept ALL (danger)" + "--debug": "verbose output" + "--add-dir": "grant tool access to directories outside CWD" + +# ════════════════════════════════════════════════════════════════ +# CONTEXT MANAGEMENT - see deep_dive.context_management +# ════════════════════════════════════════════════════════════════ +context: + zones: + green: "0-50% → work freely" + yellow: "50-70% → be selective" + orange: "70-90% → /compact NOW" + red: "90%+ → /clear required" + fresh_context: "Reset per task for long autonomous sessions - see Section 2.2 Fresh Context Pattern" + symptoms: + short_responses: "/compact" + forgetting_instructions: "/clear" + inconsistent: "context bleeding → /clear" + slow: "/compact or /clear" + +# ════════════════════════════════════════════════════════════════ +# MEMORY FILES - see deep_dive.memory_files +# ════════════════════════════════════════════════════════════════ +memory: + global: "~/.claude/CLAUDE.md (not committed)" + project_team: "./CLAUDE.md (committed)" + project_personal: "./.claude/CLAUDE.md (not committed)" + priority: "project > global" + +# ════════════════════════════════════════════════════════════════ +# .claude/ STRUCTURE - see deep_dive.claude_folder +# ════════════════════════════════════════════════════════════════ +folder_structure: + CLAUDE.md: "local instructions" + settings.json: "hooks config (committed)" + settings.local.json: "permissions (not committed)" + agents/: "custom AI personas" + commands/: "slash commands" + hooks/: "event scripts" + skills/: "knowledge modules" + rules/: "auto-loaded rules" + +# ════════════════════════════════════════════════════════════════ +# PERMISSION MODES - see deep_dive.permission_modes +# ════════════════════════════════════════════════════════════════ +permissions: + default: "editing=ask, execution=ask" + auto_accept: "editing=auto, execution=ask" + plan_mode: "editing=blocked, execution=blocked" + switch: "Shift+Tab" + +# ════════════════════════════════════════════════════════════════ +# MCP SERVERS - see deep_dive.mcp_servers +# ════════════════════════════════════════════════════════════════ +mcp: + serena: "symbol search + session memory (write_memory/read_memory) + project indexation" + claude_mem: "automatic session capture + AI compression + progressive disclosure + Web dashboard (localhost:37777)" + claude_mem_repo: "https://github.com/thedotmack/claude-mem" + claude_mem_guide: "guide/ultimate-guide.md:1585" + claude_mem_plugin: "examples/plugins/claude-mem.md" + claude_mem_installation: "/plugin marketplace add thedotmack/claude-mem" + claude_mem_stars: "26.5k" + claude_mem_license: "AGPL-3.0 + PolyForm Noncommercial" + claude_mem_cost: "$0.15 per 100 observations (API compression)" + claude_mem_storage: "10-20 MB/month (light), 100-200 MB/month (heavy)" + claude_mem_dashboard: "http://localhost:37777" + claude_mem_vs_serena: "claude-mem=auto capture, Serena=manual memory" + claude_mem_progressive_disclosure: "3-layer retrieval: search→timeline→observations (10x token reduction)" + claude_mem_evaluation: "docs/resource-evaluations/claude-mem-evaluation.md" + claude_mem_score: "4/5 (High Value)" + doobidoo_memory: "semantic memory search + Knowledge Graph dashboard + 13+ clients (⚠️ under testing)" + doobidoo_install: "pip install mcp-memory-service && python -m mcp_memory_service.scripts.installation.install --quick" + doobidoo_dashboard: "http://localhost:8000" + doobidoo_vs_serena: "Serena=key-value (requires known key), doobidoo=semantic search (finds by meaning)" + doobidoo_backends: "sqlite_vec (local), cloudflare (multi-device), hybrid (local+cloud sync)" + doobidoo_tools: "store_memory, retrieve_memory, search_by_tag, delete_memory, list_memories, check_database_health, memory_graph" + doobidoo_data_location: "~/.mcp-memory-service/memories.db" + mcp_memory_stack: "4 layers: doobidoo (decisions) → Serena (symbols) → grepai (code search) → Context7 (docs)" + mcp_complementarity_patterns: "onboarding, ADR, debug persistence, multi-IDE coordination" + serena_indexation: "uvx --from git+https://github.com/oraios/serena serena project index [--force-full|--incremental] [--parallel N]" + serena_cache: ".serena/cache/typescript/ (add to .gitignore)" + context7: "library docs lookup" + sequential: "structured multi-step reasoning" + playwright: "browser automation / E2E" + figma: "design file access, tokens, structure (official)" + git_mcp: "version control automation (official Anthropic) - 12 tools for commits, branches, diffs, logs" + git_mcp_guide: "guide/mcp-servers-ecosystem.md:102" + git_mcp_tools: "git_status, git_log, git_diff, git_commit, git_add, git_reset, git_branch, git_create_branch, git_checkout, git_show, git_diff_unstaged, git_diff_staged" + git_mcp_install: "uvx mcp-server-git --repository /path/to/repo" + git_mcp_decision_matrix: "guide/mcp-servers-ecosystem.md:212" # Git MCP vs GitHub MCP vs Bash tool + git_mcp_repo: "https://github.com/modelcontextprotocol/servers/tree/main/src/git" + git_mcp_score: "8.5/10" + git_mcp_status: "Early development (API subject to change)" + git_mcp_advanced_filtering: "ISO 8601 dates, relative dates (2 weeks ago), absolute dates" + git_mcp_use_cases: "automated commits, log analysis, branch management, token-efficient diffs, multi-repo" + ast_grep: "optional plugin for AST-based code search (explicit invocation required)" + ast_grep_guide: "guide/ultimate-guide.md:9845" + ast_grep_skill: "examples/skills/ast-grep-patterns.md" + ast_grep_install: "npx skills add ast-grep/agent-skill" + ast_grep_when: "structural patterns (>50k lines, migrations, AST rules)" + ast_grep_not_for: "simple string search, small projects (<10k lines)" + search_decision_tree: "grep (text) | ast-grep (structure) | Serena (symbols) | grepai (semantic)" + search_tools_comparison: "guide/ultimate-guide.md:9845" + search_tools_mastery_workflow: "guide/workflows/search-tools-mastery.md" + grep_vs_rag_history: "guide/architecture.md:232" + ripgrep_native: "Grep tool (Claude Code built-in, ~20ms)" + grepai_semantic: "Semantic search + call graph (Ollama-based, ~500ms)" + grepai_benchmark: + source: "https://yoandev.co/grepai-benchmark" + guide_section: "guide/workflows/search-tools-mastery.md:240" + date: "2026-01-20" + summary: "-55% tool calls, -97% tokens vs grep (Excalidraw 155k TS)" + caveat: "Benchmark by tool maintainer, single-project validation" + serena_symbols: "Symbol-aware + session memory (~100ms)" + astgrep_structural: "AST patterns for large refactoring (~200ms)" + search_combined_workflow: "guide/workflows/search-tools-mastery.md:205" + check: "/mcp" + config: "~/.claude.json (mcpServers field) or .mcp.json (project root)" + tool_search: "lazy loading MCP tools (v2.1.7+) - 85% token reduction - auto:N threshold config" + tool_search_config: "ENABLE_TOOL_SEARCH=auto|auto:N|true|false" + tool_search_deep_dive: "guide/architecture.md:284" + +# ════════════════════════════════════════════════════════════════ +# ARCHITECTURE INTERNALS - see guide/architecture.md +# ════════════════════════════════════════════════════════════════ +architecture: + master_loop: "while(tool_call) - no DAG, no classifier, no RAG" + core_tools: "Bash, Read, Edit, Write, Grep, Glob, Task, TodoWrite" + context_budget: "~200K tokens, auto-compact at 75-92%" + subagents: "Task tool spawns isolated agents (depth=1 max)" + teammatetool: "Experimental multi-agent coordination (v3294)" + philosophy: "less scaffolding, more model - trust Claude's reasoning" + mcp_protocol: "JSON-RPC 2.0, treated as native tools" + permissions: "interactive prompts + allow/deny rules + hooks" + deep_dive: "guide/architecture.md" + +# ════════════════════════════════════════════════════════════════ +# COST OPTIMIZATION - see deep_dive.cost_optimization +# ════════════════════════════════════════════════════════════════ +cost: + haiku: "simple fixes, reviews ($)" + sonnet: "most development ($$)" + opus: "architecture, complex bugs ($$$)" + opusplan: "plan=opus + execute=sonnet ($$)" + tip: "--add-dir grants tool access to additional directories (permissions, not context loading)" + rtk: "Command output filtering (72.6% avg reduction) - rtk git log/status/diff" + +# ════════════════════════════════════════════════════════════════ +# TOOL SELECTION +# ════════════════════════════════════════════════════════════════ +tools: + file_search: "Glob (not find)" + content_search: "Grep (not grep bash)" + file_read: "Read (not cat)" + file_edit: "Edit (not sed)" + multi_file: "MultiEdit" + deep_analysis: "Sequential MCP" + library_docs: "Context7 MCP" + browser: "Playwright MCP" + +# ════════════════════════════════════════════════════════════════ +# ANTI-PATTERNS - see deep_dive.pitfalls +# ════════════════════════════════════════════════════════════════ +dont: + - "vague prompts → be specific" + - "accept without reading → read every diff" + - "ignore >70% context → /compact" + - "skip permissions in prod → never" + - "bloated CLAUDE.md → keep concise (<200 lines)" + - "only negative constraints → provide alternatives" + +# ════════════════════════════════════════════════════════════════ +# TROUBLESHOOTING - see deep_dive.troubleshooting +# ════════════════════════════════════════════════════════════════ +fix: + "command not found": "npm i -g @anthropic-ai/claude-code" + "context too high": "/compact or /clear" + "slow responses": "/compact" + "MCP not working": "claude mcp list, check config" + "permission denied": "check settings.local.json" + "hook blocking": "check exit code (0=ok, 2=block)" + +# ════════════════════════════════════════════════════════════════ +# DEBUG COMMANDS +# ════════════════════════════════════════════════════════════════ +debug: + version: "claude --version" + update: "claude update" + diagnostic: "claude doctor" + verbose: "claude --debug" + mcp_debug: "claude --mcp-debug" + +# ════════════════════════════════════════════════════════════════ +# AGENT TEMPLATE - see deep_dive.agent_template +# ════════════════════════════════════════════════════════════════ +agent_template: | + --- + name: agent-name + description: Use when [trigger] + model: sonnet|opus|haiku + tools: Read, Write, Edit, Bash + --- + # Instructions here + +# Agent frontmatter — all official fields (verified 2026-02-26 against code.claude.com/docs/en/sub-agents) +agent_frontmatter_official_fields: + name: "display name + /slash-command trigger" + description: "trigger description (required for auto-discovery)" + model: "sonnet (default) | opus | haiku | inherit" + tools: "comma-separated list: Read, Write, Edit, Bash, Grep, Glob, Task(agent_type)..." + disallowedTools: "tools to block (array)" + permissionMode: "default | acceptEdits | dontAsk | bypassPermissions | plan" + maxTurns: "integer — limit agent turns" + skills: "skills to preload at startup (full content injected)" + mcpServers: "MCP server configs" + hooks: "lifecycle hooks (same format as settings.json hooks)" + memory: "user | project | local — persistent memory scope" + background: "true = always run as background task" + isolation: "worktree = temporary git worktree isolation" + color: "CLI output color" +agent_frontmatter_memory_scopes: + user: "~/.claude/memory/.md — cross-project" + project: ".claude/memory/.md — shared with team" + local: ".claude/memory/.local.md — gitignored" +agent_frontmatter_guide_line: 5639 # Official fields table in ultimate-guide.md + +# ════════════════════════════════════════════════════════════════ +# HOOK EVENTS - see deep_dive.hooks +# ════════════════════════════════════════════════════════════════ +hook_events: + PreToolUse: "before tool (exit 2 to block)" + PostToolUse: "after tool" + UserPromptSubmit: "before prompt sent" + Notification: "alerts" + +# Hook Execution Model (v2.1.0+) +hooks_execution_model: 7969 # Section in ultimate-guide.md +hooks_async_support: "v2.1.0+ - add 'async: true' for non-blocking execution" +hooks_async_use_cases: "logging, notifications, formatting, metrics (no feedback needed)" +hooks_sync_use_cases: "validation, type checking, security (feedback required)" +hooks_decision_matrix: 6091 # Decision matrix table +hooks_async_limitations: "no exit code feedback, no additionalContext, no blocking" +hooks_async_bug_fix: "v2.1.23 - fixed cancellation in headless streaming" + +# ════════════════════════════════════════════════════════════════ +# GOLDEN RULES +# ════════════════════════════════════════════════════════════════ +rules: + 1: "Always review diffs before accepting" + 2: "Use /compact before >70%" + 3: "Be specific (WHAT/WHERE/HOW/VERIFY)" + 4: "Plan Mode first for complex/risky" + 5: "Create CLAUDE.md for every project" + 6: "Commit frequently after each task" + +# ════════════════════════════════════════════════════════════════ +# ECOSYSTEM - Related resources & positioning +# ════════════════════════════════════════════════════════════════ +ecosystem: + this_guide: + focus: "Education - Learn & master" + unique: ["architecture docs", "TDD/SDD methodologies", "264-question quiz", "YAML index"] + complementary: + claude_code_templates: + url: "github.com/davila7/claude-code-templates" + focus: "Distribution - Install & use (CLI)" + stars: "17k+" + awesome_claude_code: + url: "github.com/hesreallyhim/awesome-claude-code" + focus: "Curation - Discover & link" + awesome_claude_skills: + url: "github.com/BehiSecc/awesome-claude-skills" + maintainer: "BehiSecc" + focus: "Skills taxonomy - 62 skills across 12 categories" + categories: ["Development", "Design", "Documentation", "Testing", "DevOps", "Security", "Data", "AI/ML", "Productivity", "Content", "Integration", "Fun"] + positioning: "Complementary to awesome-claude-code (skills-only vs full ecosystem)" + evaluation: "docs/resource-evaluations/awesome-claude-skills-github.md" + score: "3/5 (Moderate - Useful complement)" + note: "Distinct from ComposioHQ/awesome-claude-skills (different maintainer, taxonomy approach)" + claude_code_everything: + url: "github.com/wesammustafa/Claude-Code-Everything" + focus: "Visual walkthrough - Screenshots, BMAD method" + everything_claude_code: + url: "github.com/affaan-m/everything-claude-code" + author: "Affaan Mustafa (Anthropic hackathon winner - Zenith project)" + focus: "Production configs - Battle-tested from 10+ months intensive use" + stars: "45k+" + verified: "2026-02-15" + created: "2026-01-18" + unique: ["hookify (conversational hooks)", "pass@k metrics", "Plugin ecosystem", "Sandboxed subagents", "Strategic compaction skills"] + evaluation: "docs/resource-evaluations/015-everything-claude-code-github-repo.md" + score: "5/5 (CRITICAL)" + positioning: "Complementary to Ultimate Guide (production configs vs educational content)" + note: "Consolidates existing patterns; author hackathon win was for Zenith project, not this repo" + caveat: "Node.js hooks not officially recommended by Anthropic (shell preferred)" + coding_agents_matrix: + url: "coding-agents-matrix.dev" + github: "github.com/PackmindHub/coding-agents-matrix" + maintainer: "Packmind (Cédric Teyton, Arthur Magne)" + license: "Apache-2.0" + focus: "Interactive comparison of 23 AI coding agents across 11 criteria" + updated: "2026-01-19" + tech_stack: "React, Vite, Tailwind CSS" + features: + - "11 technical criteria (CLI, MCP, Skills, Commands, Subagents, Plan Mode, AGENTS.md, BYO LLM, Custom Rules, Dedicated IDE, IDE Extension)" + - "Sortable columns and multi-filter (AND logic)" + - "Community-driven updates (GitHub issue templates)" + - "Open source data structure (JSON-based)" + agents_snapshot: 23 # As of 2026-01-19 (evolves over time) + positioning: "Discovery tool - Use Matrix to find/compare agents, use this guide to master Claude Code" + note: "External resource - verify data freshness as agents/criteria evolve" + context_evaluator: + url: "context-evaluator.ai" + github: "github.com/PackmindHub/context-evaluator" + maintainer: "Packmind (Cédric Teyton)" + license: "Apache-2.0" + focus: "Scanner for CLAUDE.md/AGENTS.md/copilot-instructions.md — 17 evaluators (13 error detectors + 4 suggestion generators)" + updated: "2026-02-23" + tech_stack: "Bun, React, Tailwind CSS, TypeScript" + supports: ["Claude Code", "Cursor", "GitHub Copilot", "OpenCode", "OpenAI Codex"] + interface: ["CLI", "Web UI"] + guide_section: "ai-ecosystem.md#related-resources" + note: "v0.3.0, experimental (8 stars as of 2026-02-25) — mention only, no dedicated section" + practitioner_insights: + dave_van_veen: + url: "davevanveen.com/blog/agentic_coding/" + author: "Dave Van Veen (PhD Stanford, Principal AI Scientist @ HOPPR)" + focus: "Production-grade agentic coding guardrails (TDD, worktrees, manual commits)" + academic: "Co-author 'Agentic Systems in Radiology' (ArXiv 2025)" + alignment: "Validates patterns already documented in this guide" + guide_section: "guide/ai-ecosystem.md:1209" + install_templates: "scripts/install-templates.sh" + cowork: + description: "Claude Code for non-developers (desktop app)" + status: "Research preview - Max/macOS only (Jan 2026)" + blog: "https://claude.com/blog/cowork-research-preview" + github: "https://github.com/FlorianBruniaux/claude-cowork-guide" + guide_summary: "guide/cowork.md" # Summary in this repo + guide_full: "https://github.com/FlorianBruniaux/claude-cowork-guide/blob/main/README.md" + getting_started: "https://github.com/FlorianBruniaux/claude-cowork-guide/blob/main/guide/01-getting-started.md" + capabilities: "https://github.com/FlorianBruniaux/claude-cowork-guide/blob/main/guide/02-capabilities.md" + security: "https://github.com/FlorianBruniaux/claude-cowork-guide/blob/main/guide/03-security.md" + troubleshooting: "https://github.com/FlorianBruniaux/claude-cowork-guide/blob/main/guide/04-troubleshooting.md" + cheatsheet: "https://github.com/FlorianBruniaux/claude-cowork-guide/blob/main/reference/cheatsheet.md" + comparison: "https://github.com/FlorianBruniaux/claude-cowork-guide/blob/main/reference/comparison.md" + faq: "https://github.com/FlorianBruniaux/claude-cowork-guide/blob/main/reference/faq.md" + prompts: "https://github.com/FlorianBruniaux/claude-cowork-guide/tree/main/prompts" + workflows: "https://github.com/FlorianBruniaux/claude-cowork-guide/tree/main/workflows" + landing_sites: + description: "Marketing sites for guide discovery and navigation" + architecture: "4-repo ecosystem: 2 sources (docs) + 2 landings (vitrine)" + code_landing: + local: "/Users/florianbruniaux/Sites/perso/claude-code-ultimate-guide-landing/" + purpose: "Marketing site for Claude Code guide" + audience: "Developers discovering the guide" + features: ["badges (version, templates, lines)", "quiz (264 questions)", "FAQ", "cross-links to Cowork"] + sync_with: "Guide Code (version, templates count, guide lines)" + cowork_landing: + local: "/Users/florianbruniaux/Sites/perso/claude-cowork-guide-landing/" + purpose: "Marketing site for Cowork guide" + audience: "Knowledge workers discovering Cowork" + features: ["prompts showcase", "workflows preview", "cross-links to Code"] + sync_with: "Cowork guide (version, prompts count)" + sync_triggers: + - "Version bump → Update corresponding landing" + - "Templates/prompts added → Update counts" + - "Cross-links modified → Update all 4 repos" + history: + - date: "2026-01-20" + event: "Code Landing sync v3.29.0, 66 templates, cross-links" + commit: "5b5ce62" + - date: "2026-01-20" + event: "Cowork Landing fix (paths, README, UI badges)" + commits: "cab83f5, af497b7, 539912b" + +# ════════════════════════════════════════════════════════════════ +# ONBOARDING MATRIX METADATA +# ════════════════════════════════════════════════════════════════ +onboarding_matrix_meta: + version: "2.0.0" + last_updated: "2026-02-05" + aligned_with_guide: "3.29.0" + changelog: + - version: "2.0.0" + date: "2026-02-05" + changes: "Adaptive architecture (core+adaptive topics), v3.21-3.22 coverage (git_mcp, sandbox_native, config_hierarchy, mcp_secrets, dual_instance), security-first (sandbox in beginner_5min), time budgets validated, learn_security goal added" + - version: "1.0.0" + date: "2025-12-01" + changes: "Initial static matrix" + maintenance: + review_trigger: "Every CRITICAL (5/5) or HIGH VALUE (4/5) feature addition in resource evaluations" + automation: "scripts/detect-new-onboarding-topics.sh (run monthly)" + responsible: "Guide maintainer (quarterly review)" + +# ════════════════════════════════════════════════════════════════ +# ONBOARDING MATRIX - Maps user profile → content sections +# Used by tools/onboarding-prompt.md for personalized learning paths +# Format: Each profile has core (always shown) + adaptive (context-based) topics +# ════════════════════════════════════════════════════════════════ +onboarding_matrix: + # Adaptive architecture: Each profile has core (always) + adaptive (context-based) topics + # Adaptive triggers: keywords in user messages → relevant v3.21-3.22 topics + # Time budgets: Validated (6-8 min/topic average, respects topics_max limits) + + get_started: + beginner_5min: + core: [rules, sandbox_native_guide, commands] + time_budget: "5 min" + topics_max: 3 + note: "SECURITY FIRST - sandbox before commands (v3.29.0 critical fix)" + + beginner_15min: + core: [rules, sandbox_native_guide, workflow, essential_commands] + time_budget: "15 min" + topics_max: 4 + note: "Core workflow with security foundation" + + beginner_30min: + core: [rules, sandbox_native_guide, workflow, context_management] + adaptive: + - trigger: "permission|allow|deny|mode" + topics: [permission_modes] + - default: essential_commands + time_budget: "30 min" + topics_max: 5 + + optimize: + intermediate_15min: + core: [context_management, context_triage, plan_mode] + time_budget: "15 min" + topics_max: 3 + + intermediate_30min: + core: [context_management, plan_mode, cost_optimization] + adaptive: + - trigger: "memory|persist|session|remember" + topics: [memory_files] + - default: batch_operations + time_budget: "30 min" + topics_max: 5 + + power_30min: + core: [context_triage, cost_optimization] + adaptive: + - trigger: "team|sync|backup|config|multi-machine|laptop|desktop" + topics: [config_hierarchy] + - trigger: "git|version control|commits|branches|repository" + topics: [git_mcp_guide] + - trigger: "secrets|API keys|credentials|env|tokens|password" + topics: [mcp_secrets_management] + - default: batch_operations + time_budget: "30 min" + topics_max: 4 + note: "Adaptive: picks up to 2 from adaptive based on user context (v3.21-3.22)" + + power_60min: + core: [context_triage, cost_optimization, config_hierarchy] + adaptive: + - trigger: "git" + topics: [git_mcp_guide] + - trigger: "secrets" + topics: [mcp_secrets_management] + - trigger: "security|sandbox|isolation" + topics: [sandbox_native_guide] + - default: [batch_operations, rtk_guide] + time_budget: "60 min" + topics_max: 7 + note: "Comprehensive optimization with all v3.21-3.22 topics" + + build_agents: + intermediate_30min: + core: [agents, agent_template, agent_examples] + time_budget: "30 min" + topics_max: 3 + + power_30min: + core: [agents, skills, commands] + adaptive: + - trigger: "template|structure|format" + topics: [skill_template] + - default: hooks + time_budget: "30 min" + topics_max: 4 + + power_60min: + core: [agents, skills, commands, hooks] + adaptive: + - trigger: "quality|review|planner|dual|two instances|spec" + topics: [dual_instance_planning] + - trigger: "validation|checklist|production|deploy" + topics: [agent_validation_checklist] + - default: agent_validation_checklist + time_budget: "60 min" + topics_max: 6 + note: "Dual-instance pattern for quality workflows (v3.29.0)" + + learn_security: + intermediate_30min: + core: [sandbox_native_guide, mcp_secrets_management] + adaptive: + - trigger: "production|deploy|hardening|best practices" + topics: [security_hardening] + - default: permission_modes + time_budget: "30 min" + topics_max: 4 + note: "NEW goal (v3.29.0) - Security-focused learning path" + + power_60min: + core: [sandbox_native_guide, mcp_secrets_management, security_hardening] + adaptive: + - trigger: "production|safe|rules|reliability" + topics: [production_safety] + - trigger: "docker|isolation|microvm|container" + topics: [sandbox_isolation_guide] + - default: production_safety + time_budget: "60 min" + topics_max: 5 + + fix_problem: + any_any: + core: [troubleshooting, fix, context.symptoms] + time_budget: "N/A" + topics_max: 3 + note: "Direct troubleshooting, no profiling" + + learn_everything: + beginner_60min: + core: [rules, sandbox_native_guide, workflow, essential_commands, context_management, plan_mode] + time_budget: "60 min" + topics_max: 6 + note: "Security foundation + core workflow (v3.29.0 sandbox added)" + + intermediate_120min: + core: [plan_mode, agents, skills, config_hierarchy, git_mcp_guide, hooks, mcp_servers] + time_budget: "120 min" + topics_max: 7 + note: "Agents + v3.21-3.22 topics (config/git)" + + power_120min: + core: [architecture, dual_instance_planning, mcp_secrets_management, cost_optimization, cicd] + adaptive: + - trigger: "security" + topics: [security_hardening, sandbox_native_guide] + - default: [rtk_guide, bridge_guide] + time_budget: "120 min" + topics_max: 9 + note: "Advanced patterns + all v3.21-3.22 features" + +# ════════════════════════════════════════════════════════════════ +# ONBOARDING QUESTIONS - Structure for interactive profiling +# ════════════════════════════════════════════════════════════════ +onboarding_questions: + mandatory: + goal: + ask: "What's your goal right now?" + options: + get_started: "🚀 Get started quickly" + optimize: "📈 Optimize my workflow" + build_agents: "🏗️ Build custom agents/skills" + learn_security: "🛡️ Learn security best practices" + fix_problem: "🐛 Fix a problem" + learn_everything: "📚 Learn everything" + + level: + ask: "Experience with Claude Code?" + options: + beginner: "🟢 Beginner (never used / just installed)" + intermediate: "🟡 Intermediate (daily use)" + power: "🔴 Power User (know basics, want advanced)" + + tone: + ask: "How do you prefer me to communicate?" + options: + pedagogical: "🎓 Pedagogical - Detailed explanations, understand why" + direct: "⚡ Direct - Straight to the point" + coaching: "🧭 Coaching - Guide me with questions" + adaptive: "🔄 Adaptive - Mix based on complexity" + + optional: + time: + ask: "How much time do you have?" + options: + 5min: "⚡ 5-10 min" + 15min: "⏱️ 15-30 min" + 30min: "🎯 30-60 min" + 60min: "📚 1+ hour" + 120min: "📖 2+ hours" + default: "30min" + + style: + ask: "How do you prefer to learn?" + options: + explain: "📖 Explanations (tell me why)" + examples: "💻 Examples (show me code)" + reference: "🎯 Quick reference (just the facts)" + handson: "🏋️ Hands-on (let me try)" + trigger: "Only ask if time >= 15min" + + # Logic for progressive questioning + question_flow: + fix_problem: "goal only → skip to troubleshooting" + get_started: "goal → tone → level" + optimize: "goal → tone → level → time → style (if time >= 15min)" + build_agents: "goal → tone → level → time → style (if time >= 15min)" + learn_security: "goal → tone → level → time" + learn_everything: "goal → tone → level → time → style" + diff --git a/mcp-server/package-lock.json b/mcp-server/package-lock.json new file mode 100644 index 0000000..4a5084d --- /dev/null +++ b/mcp-server/package-lock.json @@ -0,0 +1,2604 @@ +{ + "name": "claude-code-ultimate-guide-mcp", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "claude-code-ultimate-guide-mcp", + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "@modelcontextprotocol/sdk": "^1.6.0", + "yaml": "^2.4.0" + }, + "bin": { + "claude-code-guide-mcp": "dist/index.js" + }, + "devDependencies": { + "@types/node": "^22.0.0", + "tsup": "^8.0.0", + "typescript": "^5.4.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", + "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz", + "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz", + "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz", + "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz", + "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz", + "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz", + "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz", + "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz", + "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz", + "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz", + "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz", + "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz", + "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz", + "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz", + "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz", + "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz", + "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz", + "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz", + "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz", + "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz", + "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz", + "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz", + "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz", + "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz", + "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz", + "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@hono/node-server": { + "version": "1.19.9", + "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.9.tgz", + "integrity": "sha512-vHL6w3ecZsky+8P5MD+eFfaGTyCeOHUIFYMGpQGbrBTSmNNoxv0if69rEZ5giu36weC5saFuznL411gRX7bJDw==", + "license": "MIT", + "engines": { + "node": ">=18.14.1" + }, + "peerDependencies": { + "hono": "^4" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@modelcontextprotocol/sdk": { + "version": "1.27.1", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.27.1.tgz", + "integrity": "sha512-sr6GbP+4edBwFndLbM60gf07z0FQ79gaExpnsjMGePXqFcSSb7t6iscpjk9DhFhwd+mTEQrzNafGP8/iGGFYaA==", + "license": "MIT", + "dependencies": { + "@hono/node-server": "^1.19.9", + "ajv": "^8.17.1", + "ajv-formats": "^3.0.1", + "content-type": "^1.0.5", + "cors": "^2.8.5", + "cross-spawn": "^7.0.5", + "eventsource": "^3.0.2", + "eventsource-parser": "^3.0.0", + "express": "^5.2.1", + "express-rate-limit": "^8.2.1", + "hono": "^4.11.4", + "jose": "^6.1.3", + "json-schema-typed": "^8.0.2", + "pkce-challenge": "^5.0.0", + "raw-body": "^3.0.0", + "zod": "^3.25 || ^4.0", + "zod-to-json-schema": "^3.25.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@cfworker/json-schema": "^4.1.1", + "zod": "^3.25 || ^4.0" + }, + "peerDependenciesMeta": { + "@cfworker/json-schema": { + "optional": true + }, + "zod": { + "optional": false + } + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz", + "integrity": "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz", + "integrity": "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz", + "integrity": "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz", + "integrity": "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz", + "integrity": "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz", + "integrity": "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz", + "integrity": "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz", + "integrity": "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz", + "integrity": "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz", + "integrity": "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz", + "integrity": "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz", + "integrity": "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz", + "integrity": "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz", + "integrity": "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz", + "integrity": "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz", + "integrity": "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz", + "integrity": "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz", + "integrity": "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz", + "integrity": "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz", + "integrity": "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz", + "integrity": "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz", + "integrity": "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz", + "integrity": "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz", + "integrity": "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz", + "integrity": "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.19.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.13.tgz", + "integrity": "sha512-akNQMv0wW5uyRpD2v2IEyRSZiR+BeGuoB6L310EgGObO44HSMNT8z1xzio28V8qOrgYaopIDNA18YgdXd+qTiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "license": "MIT", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "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==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "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": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true, + "license": "MIT" + }, + "node_modules/body-parser": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.2.tgz", + "integrity": "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==", + "license": "MIT", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.3", + "http-errors": "^2.0.0", + "iconv-lite": "^0.7.0", + "on-finished": "^2.4.1", + "qs": "^6.14.1", + "raw-body": "^3.0.1", + "type-is": "^2.0.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/bundle-require": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-5.1.0.tgz", + "integrity": "sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "load-tsconfig": "^0.2.3" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "peerDependencies": { + "esbuild": ">=0.18" + } + }, + "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/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/confbox": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/consola": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", + "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.18.0 || >=16.10.0" + } + }, + "node_modules/content-disposition": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", + "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "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/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.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/cors": { + "version": "2.8.6", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.6.tgz", + "integrity": "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==", + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "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/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/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/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/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/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/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-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/esbuild": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", + "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.3", + "@esbuild/android-arm": "0.27.3", + "@esbuild/android-arm64": "0.27.3", + "@esbuild/android-x64": "0.27.3", + "@esbuild/darwin-arm64": "0.27.3", + "@esbuild/darwin-x64": "0.27.3", + "@esbuild/freebsd-arm64": "0.27.3", + "@esbuild/freebsd-x64": "0.27.3", + "@esbuild/linux-arm": "0.27.3", + "@esbuild/linux-arm64": "0.27.3", + "@esbuild/linux-ia32": "0.27.3", + "@esbuild/linux-loong64": "0.27.3", + "@esbuild/linux-mips64el": "0.27.3", + "@esbuild/linux-ppc64": "0.27.3", + "@esbuild/linux-riscv64": "0.27.3", + "@esbuild/linux-s390x": "0.27.3", + "@esbuild/linux-x64": "0.27.3", + "@esbuild/netbsd-arm64": "0.27.3", + "@esbuild/netbsd-x64": "0.27.3", + "@esbuild/openbsd-arm64": "0.27.3", + "@esbuild/openbsd-x64": "0.27.3", + "@esbuild/openharmony-arm64": "0.27.3", + "@esbuild/sunos-x64": "0.27.3", + "@esbuild/win32-arm64": "0.27.3", + "@esbuild/win32-ia32": "0.27.3", + "@esbuild/win32-x64": "0.27.3" + } + }, + "node_modules/escape-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/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/eventsource": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz", + "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==", + "license": "MIT", + "dependencies": { + "eventsource-parser": "^3.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/eventsource-parser": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.6.tgz", + "integrity": "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/express": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", + "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", + "license": "MIT", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.1", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "depd": "^2.0.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express-rate-limit": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.2.1.tgz", + "integrity": "sha512-PCZEIEIxqwhzw4KF0n7QF4QqruVTcF73O5kFKUnGOyjbCCgizBBiFaYpd/fnBLUMPw/BWw9OsiN7GgrNYr7j6g==", + "license": "MIT", + "dependencies": { + "ip-address": "10.0.1" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/express-rate-limit" + }, + "peerDependencies": { + "express": ">= 4.11" + } + }, + "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-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/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/finalhandler": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", + "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/fix-dts-default-cjs-exports": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fix-dts-default-cjs-exports/-/fix-dts-default-cjs-exports-1.0.1.tgz", + "integrity": "sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "magic-string": "^0.30.17", + "mlly": "^1.7.4", + "rollup": "^4.34.8" + } + }, + "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/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "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/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-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/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/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/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/hono": { + "version": "4.12.3", + "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.3.tgz", + "integrity": "sha512-SFsVSjp8sj5UumXOOFlkZOG6XS9SJDKw0TbwFeV+AJ8xlST8kxK5Z/5EYa111UY8732lK2S/xB653ceuaoGwpg==", + "license": "MIT", + "engines": { + "node": ">=16.9.0" + } + }, + "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/iconv-lite": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", + "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "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/ip-address": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.0.1.tgz", + "integrity": "sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "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/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "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/jose": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/jose/-/jose-6.1.3.tgz", + "integrity": "sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, + "node_modules/joycon": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", + "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "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/json-schema-typed": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-8.0.2.tgz", + "integrity": "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==", + "license": "BSD-2-Clause" + }, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/load-tsconfig": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz", + "integrity": "sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/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/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/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/mlly": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.0.tgz", + "integrity": "sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.15.0", + "pathe": "^2.0.3", + "pkg-types": "^1.3.1", + "ufo": "^1.6.1" + } + }, + "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/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "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/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/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "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/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-to-regexp": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", + "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkce-challenge": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.1.tgz", + "integrity": "sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==", + "license": "MIT", + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/pkg-types": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", + "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" + } + }, + "node_modules/postcss-load-config": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", + "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "lilconfig": "^3.1.1" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "jiti": ">=1.21.0", + "postcss": ">=8.0.9", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "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/qs": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.0.tgz", + "integrity": "sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/raw-body": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", + "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.7.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "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/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/rollup": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz", + "integrity": "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.59.0", + "@rollup/rollup-android-arm64": "4.59.0", + "@rollup/rollup-darwin-arm64": "4.59.0", + "@rollup/rollup-darwin-x64": "4.59.0", + "@rollup/rollup-freebsd-arm64": "4.59.0", + "@rollup/rollup-freebsd-x64": "4.59.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.59.0", + "@rollup/rollup-linux-arm-musleabihf": "4.59.0", + "@rollup/rollup-linux-arm64-gnu": "4.59.0", + "@rollup/rollup-linux-arm64-musl": "4.59.0", + "@rollup/rollup-linux-loong64-gnu": "4.59.0", + "@rollup/rollup-linux-loong64-musl": "4.59.0", + "@rollup/rollup-linux-ppc64-gnu": "4.59.0", + "@rollup/rollup-linux-ppc64-musl": "4.59.0", + "@rollup/rollup-linux-riscv64-gnu": "4.59.0", + "@rollup/rollup-linux-riscv64-musl": "4.59.0", + "@rollup/rollup-linux-s390x-gnu": "4.59.0", + "@rollup/rollup-linux-x64-gnu": "4.59.0", + "@rollup/rollup-linux-x64-musl": "4.59.0", + "@rollup/rollup-openbsd-x64": "4.59.0", + "@rollup/rollup-openharmony-arm64": "4.59.0", + "@rollup/rollup-win32-arm64-msvc": "4.59.0", + "@rollup/rollup-win32-ia32-msvc": "4.59.0", + "@rollup/rollup-win32-x64-gnu": "4.59.0", + "@rollup/rollup-win32-x64-msvc": "4.59.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "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/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", + "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.3", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.1", + "mime-types": "^3.0.2", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/serve-static": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", + "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", + "license": "MIT", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "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/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/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/source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 12" + } + }, + "node_modules/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/sucrase": { + "version": "3.35.1", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz", + "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "tinyglobby": "^0.2.11", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tinyexec": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "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/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "license": "MIT", + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/tsup": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/tsup/-/tsup-8.5.1.tgz", + "integrity": "sha512-xtgkqwdhpKWr3tKPmCkvYmS9xnQK3m3XgxZHwSUjvfTjp7YfXe5tT3GgWi0F2N+ZSMsOeWeZFh7ZZFg5iPhing==", + "dev": true, + "license": "MIT", + "dependencies": { + "bundle-require": "^5.1.0", + "cac": "^6.7.14", + "chokidar": "^4.0.3", + "consola": "^3.4.0", + "debug": "^4.4.0", + "esbuild": "^0.27.0", + "fix-dts-default-cjs-exports": "^1.0.0", + "joycon": "^3.1.1", + "picocolors": "^1.1.1", + "postcss-load-config": "^6.0.1", + "resolve-from": "^5.0.0", + "rollup": "^4.34.8", + "source-map": "^0.7.6", + "sucrase": "^3.35.0", + "tinyexec": "^0.3.2", + "tinyglobby": "^0.2.11", + "tree-kill": "^1.2.2" + }, + "bin": { + "tsup": "dist/cli-default.js", + "tsup-node": "dist/cli-node.js" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@microsoft/api-extractor": "^7.36.0", + "@swc/core": "^1", + "postcss": "^8.4.12", + "typescript": ">=4.5.0" + }, + "peerDependenciesMeta": { + "@microsoft/api-extractor": { + "optional": true + }, + "@swc/core": { + "optional": true + }, + "postcss": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/type-is": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "license": "MIT", + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/ufo": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.3.tgz", + "integrity": "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "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/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/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/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/yaml": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", + "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, + "node_modules/zod": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", + "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-to-json-schema": { + "version": "3.25.1", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.1.tgz", + "integrity": "sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA==", + "license": "ISC", + "peerDependencies": { + "zod": "^3.25 || ^4" + } + } + } +} diff --git a/mcp-server/package.json b/mcp-server/package.json new file mode 100644 index 0000000..d36466d --- /dev/null +++ b/mcp-server/package.json @@ -0,0 +1,42 @@ +{ + "name": "claude-code-ultimate-guide-mcp", + "version": "1.0.0", + "description": "MCP server for the Claude Code Ultimate Guide — search, read, and explore 20K+ lines of documentation directly from Claude Code", + "keywords": ["mcp", "claude-code", "anthropic", "documentation", "guide"], + "author": "Florian Bruniaux", + "license": "MIT", + "homepage": "https://github.com/FlorianBruniaux/claude-code-ultimate-guide", + "repository": { + "type": "git", + "url": "https://github.com/FlorianBruniaux/claude-code-ultimate-guide.git", + "directory": "mcp-server" + }, + "type": "module", + "main": "./dist/index.js", + "bin": { + "claude-code-guide-mcp": "./dist/index.js" + }, + "files": [ + "dist/**/*.js", + "dist/**/*.d.ts", + "content" + ], + "scripts": { + "build": "tsup", + "dev": "GUIDE_ROOT=.. node --watch dist/index.js", + "start": "node dist/index.js", + "prepublishOnly": "npm run build" + }, + "dependencies": { + "@modelcontextprotocol/sdk": "^1.6.0", + "yaml": "^2.4.0" + }, + "devDependencies": { + "@types/node": "^22.0.0", + "tsup": "^8.0.0", + "typescript": "^5.4.0" + }, + "engines": { + "node": ">=18.0.0" + } +} diff --git a/mcp-server/src/index.ts b/mcp-server/src/index.ts new file mode 100644 index 0000000..717b4a6 --- /dev/null +++ b/mcp-server/src/index.ts @@ -0,0 +1,13 @@ +import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'; +import { createServer } from './server.js'; + +async function main(): Promise { + const server = createServer(); + const transport = new StdioServerTransport(); + await server.connect(transport); +} + +main().catch((err) => { + process.stderr.write(`[claude-code-guide] Fatal error: ${err}\n`); + process.exit(1); +}); diff --git a/mcp-server/src/lib/changelog-parser.ts b/mcp-server/src/lib/changelog-parser.ts new file mode 100644 index 0000000..9cb1a5b --- /dev/null +++ b/mcp-server/src/lib/changelog-parser.ts @@ -0,0 +1,36 @@ +export interface ChangelogEntry { + version: string; + date: string; + dateObj: Date; + content: string; +} + +export function parseChangelog(raw: string): ChangelogEntry[] { + const entries: ChangelogEntry[] = []; + // Match headers like: ## [3.27.0] - 2026-02-20 or ## [Unreleased] + const headerRe = /^## \[([^\]]+)\](?:\s*-\s*(\d{4}-\d{2}-\d{2}))?/m; + const blocks = raw.split(/^(?=## \[)/m).filter((b) => b.trim()); + + for (const block of blocks) { + const match = block.match(headerRe); + if (!match) continue; + const version = match[1]; + const dateStr = match[2] ?? ''; + const dateObj = dateStr ? new Date(dateStr) : new Date(0); + entries.push({ version, date: dateStr, dateObj, content: block.trim() }); + } + + return entries; +} + +export function filterByPeriod( + entries: ChangelogEntry[], + period: 'day' | 'week' | 'month', +): ChangelogEntry[] { + const MS = { day: 86_400_000, week: 7 * 86_400_000, month: 30 * 86_400_000 }; + const cutoff = Date.now() - MS[period]; + return entries.filter( + // Include [Unreleased] (treat as today) + dated entries within the window + (e) => e.version === 'Unreleased' || e.dateObj.getTime() >= cutoff, + ); +} diff --git a/mcp-server/src/lib/content.ts b/mcp-server/src/lib/content.ts new file mode 100644 index 0000000..56f3719 --- /dev/null +++ b/mcp-server/src/lib/content.ts @@ -0,0 +1,278 @@ +import { readFileSync } from 'fs'; +import { resolve, join, sep } from 'path'; +import { parse as parseYaml } from 'yaml'; +import { fileURLToPath } from 'url'; +import { fetchFile } from './fetcher.js'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = resolve(__filename, '..'); + +// Dual mode: GUIDE_ROOT env var = local dev, else bundled content +const GUIDE_ROOT = process.env.GUIDE_ROOT + ? resolve(process.env.GUIDE_ROOT) + : null; + +const CONTENT_DIR = GUIDE_ROOT + ? resolve(GUIDE_ROOT, 'machine-readable') + : resolve(__dirname, '../../content'); + +const ALLOWED_EXTENSIONS = new Set([ + '.md', '.yaml', '.yml', '.sh', '.ts', '.js', '.json', '.py', '.txt', +]); + +// ─── Types ─────────────────────────────────────────────────────────────────── + +export type DeepDiveTarget = + | { type: 'line'; file: 'guide/ultimate-guide.md'; line: number } + | { type: 'file'; path: string; line?: number } + | { type: 'url'; url: string } + | { type: 'inline'; text: string } + | { type: 'structured'; data: unknown }; + +export interface IndexEntry { + key: string; + section: string; + value: unknown; + searchableText: string; + target?: DeepDiveTarget; +} + +export interface ReferenceData { + version: string; + entries: IndexEntry[]; + raw: Record; +} + +export interface ReleasesData { + latest: string; + updated: string; + releases: unknown[]; + raw: Record; +} + +export interface ThreatDbData { + version: string; + updated: string; + sources: unknown[]; + malicious_authors: unknown[]; + malicious_skills: unknown[]; + cve_database: unknown[]; + attack_techniques: unknown[]; + minimum_safe_versions: Record; + raw: Record; +} + +// ─── Path resolver ──────────────────────────────────────────────────────────── + +export function resolveContentPath(relativePath: string): string | null { + const base = GUIDE_ROOT ?? resolve(__dirname, '../../..'); + + // Layer 1: resolve and check starts with base + const resolved = resolve(base, relativePath); + if (!resolved.startsWith(base + sep)) return null; + + // Layer 2: extension whitelist + const ext = relativePath.slice(relativePath.lastIndexOf('.')); + if (!ALLOWED_EXTENSIONS.has(ext)) return null; + + return resolved; +} + +export function isDevMode(): boolean { + return GUIDE_ROOT !== null; +} + +export function getGuideRoot(): string { + return GUIDE_ROOT ?? resolve(__dirname, '../../..'); +} + +// ─── YAML cache ─────────────────────────────────────────────────────────────── + +let referenceCache: ReferenceData | null = null; +let releasesCache: ReleasesData | null = null; +let threatDbCache: ThreatDbData | null = null; + +export function loadReference(): ReferenceData { + if (referenceCache) return referenceCache; + + const filePath = join(CONTENT_DIR, 'reference.yaml'); + const raw = parseYaml(readFileSync(filePath, 'utf8')) as Record; + + const entries: IndexEntry[] = []; + flattenReference(raw, '', entries); + + referenceCache = { + version: (raw.version as string) ?? 'unknown', + entries, + raw, + }; + return referenceCache; +} + +export function loadReleases(): ReleasesData { + if (releasesCache) return releasesCache; + + const filePath = join(CONTENT_DIR, 'claude-code-releases.yaml'); + const raw = parseYaml(readFileSync(filePath, 'utf8')) as Record; + + releasesCache = { + latest: (raw.latest as string) ?? 'unknown', + updated: (raw.updated as string) ?? 'unknown', + releases: (raw.releases as unknown[]) ?? [], + raw, + }; + return releasesCache; +} + +export async function loadThreatDb(): Promise { + if (threatDbCache) return threatDbCache; + + const THREAT_DB_PATH = 'examples/commands/resources/threat-db.yaml'; + let content: string; + + if (GUIDE_ROOT) { + content = readFileSync(join(GUIDE_ROOT, THREAT_DB_PATH), 'utf8'); + } else { + const fetched = await fetchFile(THREAT_DB_PATH); + if (!fetched) throw new Error('Failed to load threat-db.yaml'); + content = fetched; + } + + const raw = parseYaml(content) as Record; + + threatDbCache = { + version: (raw.version as string) ?? 'unknown', + updated: (raw.updated as string) ?? 'unknown', + sources: (raw.sources as unknown[]) ?? [], + malicious_authors: (raw.malicious_authors as unknown[]) ?? [], + malicious_skills: (raw.malicious_skills as unknown[]) ?? [], + cve_database: (raw.cve_database as unknown[]) ?? [], + attack_techniques: (raw.attack_techniques as unknown[]) ?? [], + minimum_safe_versions: (raw.minimum_safe_versions as Record) ?? {}, + raw, + }; + return threatDbCache; +} + +export function loadLlmsTxt(): string { + const filePath = join(CONTENT_DIR, 'llms.txt'); + return readFileSync(filePath, 'utf8'); +} + +export function getReferenceYamlRaw(): string { + const filePath = join(CONTENT_DIR, 'reference.yaml'); + return readFileSync(filePath, 'utf8'); +} + +export function getReleasesYamlRaw(): string { + const filePath = join(CONTENT_DIR, 'claude-code-releases.yaml'); + return readFileSync(filePath, 'utf8'); +} + +// ─── Deep dive resolver ─────────────────────────────────────────────────────── + +export function resolveDeepDive(value: unknown): DeepDiveTarget | undefined { + if (value === null || value === undefined) return undefined; + + if (typeof value === 'number') { + return { type: 'line', file: 'guide/ultimate-guide.md', line: value }; + } + + if (typeof value === 'string') { + if (value.startsWith('http://') || value.startsWith('https://')) { + return { type: 'url', url: value }; + } + // File path with optional :line suffix + const filePathMatch = value.match(/^(guide\/|examples\/|whitepapers\/|machine-readable\/)(.+?)(?::(\d+))?$/); + if (filePathMatch) { + return { + type: 'file', + path: filePathMatch[1] + filePathMatch[2], + line: filePathMatch[3] ? parseInt(filePathMatch[3], 10) : undefined, + }; + } + return { type: 'inline', text: value }; + } + + if (typeof value === 'object') { + return { type: 'structured', data: value }; + } + + return { type: 'inline', text: String(value) }; +} + +// ─── Reference flattener ────────────────────────────────────────────────────── + +function flattenReference( + obj: Record, + prefix: string, + entries: IndexEntry[], +): void { + for (const [key, value] of Object.entries(obj)) { + const fullKey = prefix ? `${prefix}_${key}` : key; + + if (key === 'version' || key === 'generated' || key === 'description' || key === 'note') { + continue; + } + + if (value === null || value === undefined) continue; + + if (typeof value === 'object' && !Array.isArray(value)) { + const obj2 = value as Record; + // Check if it's a leaf-like object (has deep_dive or simple scalar values) + const hasDeepDive = 'deep_dive' in obj2; + const hasNestedObjects = Object.values(obj2).some( + (v) => typeof v === 'object' && v !== null && !Array.isArray(v) && !('deep_dive' in (v as Record)), + ); + + if (hasDeepDive || !hasNestedObjects) { + // Treat as leaf entry + const searchableText = buildSearchableText(fullKey, value); + const target = hasDeepDive + ? resolveDeepDive((obj2 as Record).deep_dive) + : resolveDeepDive(value); + + entries.push({ + key: fullKey, + section: prefix.split('_')[0] ?? fullKey, + value, + searchableText, + target, + }); + } else { + flattenReference(obj2, fullKey, entries); + } + } else { + const searchableText = buildSearchableText(fullKey, value); + const target = resolveDeepDive(value); + entries.push({ + key: fullKey, + section: prefix.split('_')[0] ?? fullKey, + value, + searchableText, + target, + }); + } + } +} + +function buildSearchableText(key: string, value: unknown): string { + const parts: string[] = [key.replace(/_/g, ' ')]; + + if (typeof value === 'string') { + parts.push(value); + } else if (typeof value === 'number') { + parts.push(String(value)); + } else if (Array.isArray(value)) { + for (const item of value) { + if (typeof item === 'string') parts.push(item); + else if (typeof item === 'object' && item !== null) { + parts.push(JSON.stringify(item)); + } + } + } else if (typeof value === 'object' && value !== null) { + parts.push(JSON.stringify(value)); + } + + return parts.join(' ').toLowerCase(); +} diff --git a/mcp-server/src/lib/fetcher.ts b/mcp-server/src/lib/fetcher.ts new file mode 100644 index 0000000..902ea6c --- /dev/null +++ b/mcp-server/src/lib/fetcher.ts @@ -0,0 +1,69 @@ +import { existsSync, mkdirSync, readFileSync, writeFileSync, statSync } from 'fs'; +import { resolve, dirname } from 'path'; +import { homedir } from 'os'; +import { createHash } from 'crypto'; + +const PACKAGE_VERSION = '1.0.0'; +const GITHUB_RAW_BASE = + 'https://raw.githubusercontent.com/FlorianBruniaux/claude-code-ultimate-guide/main'; +const CACHE_DIR = resolve(homedir(), '.cache', 'claude-code-guide', PACKAGE_VERSION); +const CACHE_TTL_MS = 24 * 60 * 60 * 1000; // 24h + +function getCachePath(filePath: string): string { + // Use hash to avoid path issues, but keep extension for readability + const hash = createHash('md5').update(filePath).digest('hex').slice(0, 8); + const safe = filePath.replace(/[^a-zA-Z0-9._-]/g, '_'); + return resolve(CACHE_DIR, `${hash}_${safe}`); +} + +function isCacheValid(cachePath: string): boolean { + if (!existsSync(cachePath)) return false; + const stat = statSync(cachePath); + return Date.now() - stat.mtimeMs < CACHE_TTL_MS; +} + +export async function fetchFile(filePath: string): Promise { + // Normalize path separators + const normalizedPath = filePath.replace(/\\/g, '/'); + const cachePath = getCachePath(normalizedPath); + + // Return cache if valid + if (isCacheValid(cachePath)) { + return readFileSync(cachePath, 'utf8'); + } + + // Fetch from GitHub + const url = `${GITHUB_RAW_BASE}/${normalizedPath}`; + try { + const response = await fetch(url, { + headers: { 'User-Agent': 'claude-code-ultimate-guide-mcp/1.0.0' }, + signal: AbortSignal.timeout(10_000), + }); + + if (!response.ok) { + // Return stale cache if available (offline fallback) + if (existsSync(cachePath)) { + return readFileSync(cachePath, 'utf8'); + } + return null; + } + + const content = await response.text(); + + // Write to cache + mkdirSync(dirname(cachePath), { recursive: true }); + writeFileSync(cachePath, content, 'utf8'); + + return content; + } catch { + // Offline fallback: return stale cache + if (existsSync(cachePath)) { + return readFileSync(cachePath, 'utf8'); + } + return null; + } +} + +export function getCacheDir(): string { + return CACHE_DIR; +} diff --git a/mcp-server/src/lib/search.ts b/mcp-server/src/lib/search.ts new file mode 100644 index 0000000..8568ee2 --- /dev/null +++ b/mcp-server/src/lib/search.ts @@ -0,0 +1,184 @@ +import { loadReference, type IndexEntry } from './content.js'; + +// ─── Stop words ─────────────────────────────────────────────────────────────── + +const STOP_WORDS = new Set([ + 'the', 'a', 'an', 'is', 'are', 'was', 'were', 'be', 'been', + 'do', 'does', 'did', 'have', 'has', 'had', 'will', 'would', + 'can', 'could', 'should', 'may', 'might', 'shall', + 'i', 'you', 'he', 'she', 'it', 'we', 'they', 'my', 'your', + 'to', 'of', 'in', 'for', 'on', 'with', 'at', 'by', 'from', + 'how', 'what', 'when', 'where', 'which', 'who', 'why', + 'not', 'no', 'up', 'out', 'if', 'about', 'into', 'that', 'this', + 'and', 'or', 'but', 'so', 'yet', 'nor', 'use', 'using', 'used', + 'get', 'set', 'add', 'run', 'make', 'see', 'all', 'new', +]); + +// ─── Synonymes domaine ──────────────────────────────────────────────────────── + +const SYNONYMS: Record = { + env: ['environment', 'env_var', 'variable', 'envvar'], + config: ['configuration', 'settings', 'configure', 'setup'], + cmd: ['command', 'commands', 'slash'], + auth: ['authentication', 'permission', 'permissions', 'authorize'], + hook: ['hooks', 'event', 'pre_tool', 'post_tool', 'events'], + agent: ['agents', 'subagent', 'teammate', 'subagents'], + mcp: ['model_context_protocol', 'mcp_server', 'mcp_servers', 'protocol'], + skill: ['skills', 'skill_module', 'modules'], + debug: ['debugging', 'troubleshoot', 'troubleshooting', 'diagnose'], + cost: ['token', 'tokens', 'pricing', 'budget', 'optimization', 'cost'], + security: ['secure', 'hardening', 'vulnerability', 'cve', 'threat'], + sandbox: ['isolation', 'container', 'docker', 'isolated'], + slash: ['command', 'commands', 'custom_command'], + install: ['installation', 'setup', 'installing'], + memory: ['persistence', 'serena', 'context'], + test: ['testing', 'tdd', 'bdd', 'spec', 'specs'], + workflow: ['workflows', 'process', 'flow'], + template: ['templates', 'example', 'examples', 'boilerplate'], + model: ['claude', 'opus', 'sonnet', 'haiku', 'llm'], + key: ['keyboard', 'shortcut', 'keybinding', 'keybindings'], +}; + +// ─── Levenshtein distance (inline, ~20 lines) ───────────────────────────────── + +function levenshtein(a: string, b: string): number { + if (Math.abs(a.length - b.length) > 3) return 99; // fast bail + const m = a.length, n = b.length; + const dp: number[][] = Array.from({ length: m + 1 }, (_, i) => + Array.from({ length: n + 1 }, (_, j) => (i === 0 ? j : j === 0 ? i : 0)), + ); + for (let i = 1; i <= m; i++) { + for (let j = 1; j <= n; j++) { + dp[i][j] = + a[i - 1] === b[j - 1] + ? dp[i - 1][j - 1] + : 1 + Math.min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]); + } + } + return dp[m][n]; +} + +// ─── Query processing ───────────────────────────────────────────────────────── + +export function tokenizeQuery(query: string): string[] { + const tokens = query + .toLowerCase() + .replace(/[^a-z0-9_\s-]/g, ' ') + .split(/\s+/) + .filter((t) => t.length > 1 && !STOP_WORDS.has(t)); + + // Expand synonyms + const expanded = new Set(tokens); + for (const token of tokens) { + const syns = SYNONYMS[token]; + if (syns) { + for (const syn of syns) expanded.add(syn); + } + // Also check partial matches on synonym keys + for (const [key, syns2] of Object.entries(SYNONYMS)) { + if (key.startsWith(token) || token.startsWith(key)) { + expanded.add(key); + for (const s of syns2) expanded.add(s); + } + } + } + + return Array.from(expanded); +} + +// ─── Scoring ────────────────────────────────────────────────────────────────── + +export interface SearchResult { + key: string; + section: string; + score: number; + value: unknown; + target: ReturnType; + hint: string; +} + +function scoreEntry(entry: IndexEntry, tokens: string[], originalTokens: string[]): number { + let score = 0; + const keyLower = entry.key.toLowerCase(); + const keySegments = keyLower.split('_'); + + for (const token of tokens) { + if (token.length < 2) continue; + + if (keyLower === token) { + score += 20; + } else if (keyLower.includes(token)) { + score += 10; + } else if (keySegments.some((seg) => seg.startsWith(token))) { + score += 7; + } else if (entry.searchableText.includes(token)) { + score += 5; + } + } + + // Fuzzy only if no exact matches and token is long enough + if (score === 0) { + for (const token of originalTokens) { + if (token.length <= 4) continue; + for (const seg of keySegments) { + if (seg.length > 4 && levenshtein(token, seg) <= 2) { + score += 2; + break; + } + } + } + } + + return score; +} + +function buildHint(entry: IndexEntry): string { + const { target } = entry; + if (!target) return `Key: ${entry.key}`; + + switch (target.type) { + case 'line': + return `guide/ultimate-guide.md:${target.line}`; + case 'file': + return target.line ? `${target.path}:${target.line}` : target.path; + case 'url': + return target.url; + case 'inline': + return target.text.length > 100 ? target.text.slice(0, 100) + '…' : target.text; + case 'structured': + return `[structured data] — ${entry.key}`; + } +} + +// ─── Main search function ───────────────────────────────────────────────────── + +export function searchGuide(query: string, limit = 10): SearchResult[] { + const ref = loadReference(); + const tokens = tokenizeQuery(query); + const originalTokens = query + .toLowerCase() + .split(/\s+/) + .filter((t) => t.length > 1 && !STOP_WORDS.has(t)); + + if (tokens.length === 0) return []; + + const results: SearchResult[] = []; + + for (const entry of ref.entries) { + const score = scoreEntry(entry, tokens, originalTokens); + if (score > 0) { + results.push({ + key: entry.key, + section: entry.section, + score, + value: entry.value, + target: entry.target, + hint: buildHint(entry), + }); + } + } + + return results + .sort((a, b) => b.score - a.score) + .slice(0, Math.min(limit, 20)); +} diff --git a/mcp-server/src/lib/section-reader.ts b/mcp-server/src/lib/section-reader.ts new file mode 100644 index 0000000..33ba42c --- /dev/null +++ b/mcp-server/src/lib/section-reader.ts @@ -0,0 +1,103 @@ +import { readFileSync, existsSync } from 'fs'; +import { resolveContentPath, isDevMode } from './content.js'; +import { fetchFile } from './fetcher.js'; + +export interface SectionResult { + content: string; + startLine: number; + endLine: number; + totalLines: number; + hasMore: boolean; + nextOffset: number | null; +} + +const MAX_LINES = 500; + +// ─── Heading level detector ─────────────────────────────────────────────────── + +function getHeadingLevel(line: string): number | null { + const match = line.match(/^(#{1,6})\s/); + return match ? match[1].length : null; +} + +// ─── Section extraction ─────────────────────────────────────────────────────── + +export function extractSection( + lines: string[], + offset: number, + limit: number, +): SectionResult { + const totalLines = lines.length; + const startLine = Math.max(1, Math.min(offset, totalLines)); + const effectiveLimit = Math.min(limit, MAX_LINES); + + // Find heading level of starting section (for boundary detection) + let sectionLevel: number | null = null; + for (let i = startLine - 1; i < Math.min(startLine + 5, totalLines); i++) { + const level = getHeadingLevel(lines[i]); + if (level !== null) { + sectionLevel = level; + break; + } + } + + let inCodeFence = false; + let endLine = startLine - 1; + const collected: string[] = []; + + for (let i = startLine - 1; i < totalLines && collected.length < effectiveLimit; i++) { + const line = lines[i]; + + // Track code fences + if (line.trimStart().startsWith('```')) { + inCodeFence = !inCodeFence; + } + + // Check heading boundary (only outside code fences, only same/higher level) + if (!inCodeFence && i > startLine - 1 && sectionLevel !== null) { + const level = getHeadingLevel(line); + if (level !== null && level <= sectionLevel) { + break; // Stop at same or higher heading + } + } + + collected.push(line); + endLine = i + 1; + } + + const hasMore = endLine < totalLines && collected.length >= effectiveLimit; + + return { + content: collected.join('\n'), + startLine, + endLine, + totalLines, + hasMore, + nextOffset: hasMore ? endLine + 1 : null, + }; +} + +// ─── Public API ─────────────────────────────────────────────────────────────── + +export async function readSection( + filePath: string, + offset = 1, + limit = MAX_LINES, +): Promise { + let content: string | null = null; + + if (isDevMode()) { + // Dev mode: read from local filesystem + const resolved = resolveContentPath(filePath); + if (!resolved || !existsSync(resolved)) return null; + content = readFileSync(resolved, 'utf8'); + } else { + // Production: fetch from GitHub (with cache) + content = await fetchFile(filePath); + } + + if (content === null) return null; + + const lines = content.split('\n'); + return extractSection(lines, offset, limit); +} diff --git a/mcp-server/src/lib/urls.ts b/mcp-server/src/lib/urls.ts new file mode 100644 index 0000000..5cc0bdf --- /dev/null +++ b/mcp-server/src/lib/urls.ts @@ -0,0 +1,23 @@ +const GITHUB_BASE = 'https://github.com/FlorianBruniaux/claude-code-ultimate-guide/blob/main'; +const GUIDE_SITE_BASE = 'https://cc.bruniaux.com/guide'; + +export function githubUrl(filePath: string, line?: number): string { + const base = `${GITHUB_BASE}/${filePath}`; + return line ? `${base}#L${line}` : base; +} + +// Only ultimate-guide.md is rendered on the guide site +export function guideSiteUrl(filePath: string, line?: number): string | null { + if (filePath !== 'guide/ultimate-guide.md') return null; + // Line numbers don't map to anchors directly — link to the reader root + // If a line is provided, append a hint as a hash comment (not a real anchor) + return line ? `${GUIDE_SITE_BASE}/#L${line}` : GUIDE_SITE_BASE; +} + +export function formatLinks(filePath: string, line?: number): string { + const gh = githubUrl(filePath, line); + const site = guideSiteUrl(filePath, line); + const parts = [`GitHub: ${gh}`]; + if (site) parts.push(`Guide: ${site}`); + return parts.join(' | '); +} diff --git a/mcp-server/src/prompts/index.ts b/mcp-server/src/prompts/index.ts new file mode 100644 index 0000000..e76142f --- /dev/null +++ b/mcp-server/src/prompts/index.ts @@ -0,0 +1,70 @@ +import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; +import { z } from 'zod'; + +export function registerPrompts(server: McpServer): void { + server.prompt( + 'claude-code-expert', + 'Activate Claude Code expert mode with the optimal workflow for answering questions using the Ultimate Guide.', + { + question: z.string().optional().describe('Optional question to answer immediately'), + }, + async ({ question }) => { + const systemPrompt = `You are an expert on Claude Code (Anthropic's CLI tool) with access to the Claude Code Ultimate Guide — a comprehensive 20,000+ line reference covering every feature, workflow, and best practice. + +## How to answer Claude Code questions + +**Step 1 — Fast path (targeted questions)** +Use search_guide(query) with 1-3 keywords: +- "hooks" not "how do I configure hooks" +- "cost optimization" not "how to reduce token usage" +- "custom agents" not "how to create agent files" + +If results have score > 10, follow the deep_dive links with read_section(). + +**Step 2 — Fallback (broad questions or insufficient search results)** +Read the resource claude-code-guide://reference — it's 94KB of structured YAML with ~900 indexed entries. Parse it directly to find what you need. + +**Step 3 — Templates** +Use get_example(name) for production-ready code: +- Agents: get_example("code-reviewer"), get_example("backend-architect") +- Hooks: get_example("pre-commit"), get_example("notification") +- Commands: get_example("release"), get_example("audit") +- Skills: get_example("commit"), get_example("review-pr") + +## Rules +- Always cite the source file and line number +- Never invent Claude Code features — if you're not sure, say so +- If a feature isn't in the guide, check claude-code-guide://releases for recent additions +- Prefer concrete examples over abstract explanations +- For version-specific questions, check the releases resource first +- **Respond in the same language the user used** — if they ask in French, answer in French; if English, answer in English. Tool output is in English but your response should match the user's language. + +## Guide structure +- guide/ultimate-guide.md — Main reference (20K+ lines) +- guide/cheatsheet.md — Quick reference +- guide/architecture.md — How Claude Code works internally +- examples/agents/ — Custom agent templates +- examples/commands/ — Slash command templates +- examples/hooks/ — Event hook examples +- examples/skills/ — Skill module templates +- machine-readable/reference.yaml — Structured index (available via resource)`; + + const messages = [ + { + role: 'user' as const, + content: { + type: 'text' as const, + text: question + ? `${systemPrompt}\n\n---\n\nQuestion: ${question}` + : systemPrompt, + }, + }, + ]; + + return { + description: 'Claude Code expert mode activated', + messages, + }; + }, + ); +} diff --git a/mcp-server/src/resources/index.ts b/mcp-server/src/resources/index.ts new file mode 100644 index 0000000..699a391 --- /dev/null +++ b/mcp-server/src/resources/index.ts @@ -0,0 +1,70 @@ +import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; +import { getReferenceYamlRaw, getReleasesYamlRaw, loadLlmsTxt } from '../lib/content.js'; + +export function registerResources(server: McpServer): void { + // Full reference YAML — the fallback when search isn't enough + server.resource( + 'reference', + 'claude-code-guide://reference', + { + description: 'Complete structured index of the Claude Code Ultimate Guide (94KB YAML, ~900 entries). Use as fallback when search_guide() results are insufficient.', + mimeType: 'text/yaml', + }, + async () => { + const content = getReferenceYamlRaw(); + return { + contents: [ + { + uri: 'claude-code-guide://reference', + mimeType: 'text/yaml', + text: content, + }, + ], + }; + }, + ); + + // Releases history + server.resource( + 'releases', + 'claude-code-guide://releases', + { + description: 'Claude Code official releases history — condensed highlights and breaking changes for each version.', + mimeType: 'text/yaml', + }, + async () => { + const content = getReleasesYamlRaw(); + return { + contents: [ + { + uri: 'claude-code-guide://releases', + mimeType: 'text/yaml', + text: content, + }, + ], + }; + }, + ); + + // Guide identity file + server.resource( + 'llms', + 'claude-code-guide://llms', + { + description: 'llms.txt — machine-readable identity and navigation file for the Claude Code Ultimate Guide.', + mimeType: 'text/plain', + }, + async () => { + const content = loadLlmsTxt(); + return { + contents: [ + { + uri: 'claude-code-guide://llms', + mimeType: 'text/plain', + text: content, + }, + ], + }; + }, + ); +} diff --git a/mcp-server/src/server.ts b/mcp-server/src/server.ts new file mode 100644 index 0000000..3a3b7a1 --- /dev/null +++ b/mcp-server/src/server.ts @@ -0,0 +1,56 @@ +import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; +import { registerSearchGuide } from './tools/search-guide.js'; +import { registerReadSection } from './tools/read-section.js'; +import { registerListTopics } from './tools/list-topics.js'; +import { registerGetExample } from './tools/get-example.js'; +import { registerChangelog } from './tools/changelog.js'; +import { registerCheatsheet } from './tools/cheatsheet.js'; +import { registerListExamples } from './tools/list-examples.js'; +import { registerReleases } from './tools/releases.js'; +import { registerCompareVersions } from './tools/compare-versions.js'; +import { registerGetThreat, registerListThreats } from './tools/threats.js'; +import { registerSearchExamples } from './tools/search-examples.js'; +import { registerResources } from './resources/index.js'; +import { registerPrompts } from './prompts/index.js'; +import { loadReference, loadReleases, isDevMode } from './lib/content.js'; + +export function createServer(): McpServer { + const server = new McpServer({ + name: 'claude-code-ultimate-guide', + version: '1.0.0', + }); + + // Pre-load YAML indexes into memory at startup + try { + const ref = loadReference(); + const releases = loadReleases(); + const mode = isDevMode() ? 'dev (local files)' : 'production (GitHub lazy fetch)'; + process.stderr.write( + `[claude-code-guide] Loaded ${ref.entries.length} index entries | ${releases.releases.length} releases | mode: ${mode}\n`, + ); + } catch (err) { + process.stderr.write(`[claude-code-guide] Warning: Failed to pre-load indexes: ${err}\n`); + } + + // Register all tools + registerSearchGuide(server); + registerReadSection(server); + registerListTopics(server); + registerGetExample(server); + registerChangelog(server); + registerCheatsheet(server); + registerListExamples(server); + registerReleases(server); + registerCompareVersions(server); + registerGetThreat(server); + registerListThreats(server); + registerSearchExamples(server); + + // Register resources + registerResources(server); + + // Register prompts + registerPrompts(server); + + return server; +} diff --git a/mcp-server/src/tools/changelog.ts b/mcp-server/src/tools/changelog.ts new file mode 100644 index 0000000..0b697eb --- /dev/null +++ b/mcp-server/src/tools/changelog.ts @@ -0,0 +1,179 @@ +import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; +import { z } from 'zod'; +import { readSection } from '../lib/section-reader.js'; +import { parseChangelog, filterByPeriod } from '../lib/changelog-parser.js'; +import { githubUrl, guideSiteUrl } from '../lib/urls.js'; + +const CHANGELOG_PATH = 'CHANGELOG.md'; +const CHANGELOG_GITHUB = githubUrl(CHANGELOG_PATH); + +// ─── File path extractor ────────────────────────────────────────────────────── + +// Matches paths like: guide/ultimate-guide.md, docs/resource-evaluations/xxx.md, +// examples/agents/foo.md, machine-readable/reference.yaml, guide/cheatsheet.md +const FILE_PATH_RE = + /\b((?:guide|docs|examples|machine-readable|whitepapers)\/[a-zA-Z0-9_./\-]+\.(?:md|yaml|yml|json|sh|ts|txt))/g; + +interface ResourceLink { + path: string; + github: string; + site: string | null; +} + +function extractResourceLinks(text: string): ResourceLink[] { + const seen = new Set(); + const links: ResourceLink[] = []; + for (const match of text.matchAll(FILE_PATH_RE)) { + const path = match[1]; + if (seen.has(path)) continue; + seen.add(path); + links.push({ + path, + github: githubUrl(path), + site: guideSiteUrl(path), + }); + } + return links; +} + +async function fetchChangelog(): Promise { + const result = await readSection(CHANGELOG_PATH, 1, 500); + if (!result) return null; + + // If truncated, fetch more until we have everything (max 3000 lines) + if (!result.hasMore) return result.content; + + let full = result.content; + let offset = result.nextOffset!; + for (let i = 0; i < 5 && offset; i++) { + const next = await readSection(CHANGELOG_PATH, offset, 500); + if (!next) break; + full += '\n' + next.content; + offset = next.nextOffset ?? 0; + if (!next.hasMore) break; + } + return full; +} + +export function registerChangelog(server: McpServer): void { + // ── get_changelog ───────────────────────────────────────────────────────── + server.tool( + 'get_changelog', + 'Return the last N entries from the Claude Code Ultimate Guide CHANGELOG. Shows what changed in the guide itself (not Claude Code CLI releases — use get_release() for that).', + { + count: z.number().min(1).max(20).optional().default(5).describe('Number of recent changelog entries to return (default 5)'), + }, + { readOnlyHint: true, destructiveHint: false, openWorldHint: false }, + async ({ count }) => { + const raw = await fetchChangelog(); + if (!raw) { + return { + content: [{ type: 'text', text: 'CHANGELOG.md unavailable (offline and no cache).' }], + isError: true, + }; + } + + const entries = parseChangelog(raw); + const slice = entries.slice(0, count ?? 5); + + if (slice.length === 0) { + return { content: [{ type: 'text', text: 'No changelog entries found.' }] }; + } + + const combinedText = slice.map((e) => e.content).join('\n\n'); + const links = extractResourceLinks(combinedText); + + const lines = [ + `# Guide CHANGELOG — last ${slice.length} entries`, + `GitHub: ${CHANGELOG_GITHUB}`, + '', + combinedText, + ]; + + if (links.length > 0) { + lines.push('', '---', '## Resources mentioned', ''); + for (const l of links) { + lines.push(`**${l.path}**`); + lines.push(` GitHub: ${l.github}`); + if (l.site) lines.push(` Guide: ${l.site}`); + } + } + + return { content: [{ type: 'text', text: lines.join('\n') }] }; + }, + ); + + // ── get_digest ───────────────────────────────────────────────────────────── + server.tool( + 'get_digest', + 'Return a digest of guide and Claude Code CLI changes for a given period. Combines guide CHANGELOG entries + official Claude Code releases in the time window.', + { + period: z + .enum(['day', 'week', 'month']) + .describe('Time window: "day" (24h), "week" (7 days), "month" (30 days)'), + }, + { readOnlyHint: true, destructiveHint: false, openWorldHint: false }, + async ({ period }) => { + const labels = { day: 'last 24h', week: 'last 7 days', month: 'last 30 days' }; + + // Guide changelog + const raw = await fetchChangelog(); + const guideEntries = raw ? filterByPeriod(parseChangelog(raw), period) : []; + + // Claude Code releases + const { loadReleases } = await import('../lib/content.js'); + const relData = loadReleases(); + const MS = { day: 86_400_000, week: 7 * 86_400_000, month: 30 * 86_400_000 }; + const cutoff = Date.now() - MS[period]; + const ccReleases = (relData.releases as Array<{ version: string; date: string; highlights: string[] }>) + .filter((r) => new Date(r.date).getTime() >= cutoff); + + const lines: string[] = [ + `# Digest — ${labels[period]}`, + `Generated: ${new Date().toISOString().slice(0, 10)}`, + '', + ]; + + // Guide section + lines.push('## Guide changes'); + if (guideEntries.length === 0) { + lines.push('No guide updates in this period.'); + lines.push(''); + } else { + const guideText = guideEntries.map((e) => e.content).join('\n\n'); + lines.push(guideText); + lines.push(''); + + // Resource links extracted from guide entries + const links = extractResourceLinks(guideText); + if (links.length > 0) { + lines.push('### Resources mentioned'); + for (const l of links) { + const siteStr = l.site ? ` | Guide: ${l.site}` : ''; + lines.push(`- \`${l.path}\` — GitHub: ${l.github}${siteStr}`); + } + lines.push(''); + } + } + + // CC releases section + lines.push('## Claude Code CLI releases'); + if (ccReleases.length === 0) { + lines.push('No Claude Code releases in this period.'); + } else { + for (const r of ccReleases) { + lines.push(`### v${r.version} (${r.date})`); + for (const h of r.highlights ?? []) lines.push(`- ${h}`); + // Link to the release tracking file + lines.push(`GitHub: ${githubUrl('guide/claude-code-releases.md')}`); + lines.push(''); + } + } + + lines.push('---'); + lines.push(`Full changelog: ${CHANGELOG_GITHUB}`); + + return { content: [{ type: 'text', text: lines.join('\n') }] }; + }, + ); +} diff --git a/mcp-server/src/tools/cheatsheet.ts b/mcp-server/src/tools/cheatsheet.ts new file mode 100644 index 0000000..8f5d7e8 --- /dev/null +++ b/mcp-server/src/tools/cheatsheet.ts @@ -0,0 +1,58 @@ +import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; +import { z } from 'zod'; +import { readSection } from '../lib/section-reader.js'; +import { formatLinks } from '../lib/urls.js'; + +const CHEATSHEET_PATH = 'guide/cheatsheet.md'; + +export function registerCheatsheet(server: McpServer): void { + server.tool( + 'get_cheatsheet', + 'Return the Claude Code cheatsheet — a compact 1-page reference covering the most important commands, shortcuts, config options, and workflows.', + { + section: z.string().optional().describe('Optional: filter to a specific section (e.g. "installation", "hooks", "agents", "mcp")'), + }, + { readOnlyHint: true, destructiveHint: false, openWorldHint: false }, + async ({ section }) => { + const result = await readSection(CHEATSHEET_PATH, 1, 500); + if (!result) { + return { + content: [{ type: 'text', text: 'Cheatsheet unavailable (offline and no cache).' }], + isError: true, + }; + } + + let content = result.content; + + // Filter to section if requested + if (section) { + const sectionLower = section.toLowerCase(); + const lines = content.split('\n'); + const start = lines.findIndex( + (l) => l.toLowerCase().includes(sectionLower) && l.startsWith('#'), + ); + if (start !== -1) { + // Find end of section (next heading of same or higher level) + const startLevel = (lines[start].match(/^#+/) ?? [''])[0].length; + let end = lines.length; + for (let i = start + 1; i < lines.length; i++) { + const m = lines[i].match(/^(#+)/); + if (m && m[1].length <= startLevel) { end = i; break; } + } + content = lines.slice(start, end).join('\n'); + } + } + + const header = [ + `# Claude Code Cheatsheet`, + formatLinks(CHEATSHEET_PATH), + section ? `Filtered: "${section}"` : `Lines: ${result.startLine}-${result.endLine} of ${result.totalLines}`, + result.hasMore ? `Has more — use read_section("${CHEATSHEET_PATH}", ${result.nextOffset}) for rest` : '', + '---', + '', + ].filter(Boolean).join('\n'); + + return { content: [{ type: 'text', text: header + content }] }; + }, + ); +} diff --git a/mcp-server/src/tools/compare-versions.ts b/mcp-server/src/tools/compare-versions.ts new file mode 100644 index 0000000..8f20002 --- /dev/null +++ b/mcp-server/src/tools/compare-versions.ts @@ -0,0 +1,116 @@ +import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; +import { z } from 'zod'; +import { loadReleases } from '../lib/content.js'; +import { githubUrl } from '../lib/urls.js'; + +const RELEASES_GITHUB = githubUrl('guide/claude-code-releases.md'); + +interface ReleaseEntry { + version: string; + date: string; + highlights: string[]; + breaking?: string[]; +} + +function parseSemver(v: string): [number, number, number] { + const parts = v.replace(/^v/, '').split('.').map(Number); + return [parts[0] ?? 0, parts[1] ?? 0, parts[2] ?? 0]; +} + +function semverCompare(a: string, b: string): number { + const [am, an, ap] = parseSemver(a); + const [bm, bn, bp] = parseSemver(b); + if (am !== bm) return am - bm; + if (an !== bn) return an - bn; + return ap - bp; +} + +export function registerCompareVersions(server: McpServer): void { + server.tool( + 'compare_versions', + 'Show what changed between two Claude Code CLI versions. Lists all releases in range with aggregated highlights and breaking changes.', + { + from: z.string().describe('Starting version (older), e.g. "2.1.50"'), + to: z.string().optional().describe('Ending version (newer). Omit to use the latest.'), + }, + { readOnlyHint: true, destructiveHint: false, openWorldHint: false }, + async ({ from, to }) => { + const data = loadReleases(); + const releases = data.releases as ReleaseEntry[]; + + const fromClean = from.replace(/^v/, ''); + const toClean = (to ?? data.latest).replace(/^v/, ''); + + // Ensure from <= to (by semver) + const fromVer = fromClean; + const toVer = toClean; + const ordered = semverCompare(fromVer, toVer) <= 0 + ? { older: fromVer, newer: toVer } + : { older: toVer, newer: fromVer }; + + // Validate both versions exist + const fromFound = releases.find((r) => r.version === ordered.older); + const toFound = releases.find((r) => r.version === ordered.newer); + + if (!fromFound) { + const known = releases.slice(0, 10).map((r) => `v${r.version}`).join(', '); + return { + content: [{ + type: 'text', + text: `Version v${ordered.older} not found.\n\nRecent versions: ${known}\n\nFull history: ${RELEASES_GITHUB}`, + }], + }; + } + if (!toFound) { + const known = releases.slice(0, 10).map((r) => `v${r.version}`).join(', '); + return { + content: [{ + type: 'text', + text: `Version v${ordered.newer} not found.\n\nRecent versions: ${known}\n\nFull history: ${RELEASES_GITHUB}`, + }], + }; + } + + // Collect versions in range (releases are newest-first) + const inRange = releases.filter( + (r) => semverCompare(r.version, ordered.older) >= 0 && + semverCompare(r.version, ordered.newer) <= 0, + ); + + // Aggregate highlights and breaking changes + const allHighlights: string[] = []; + const allBreaking: string[] = []; + + for (const r of inRange) { + for (const h of r.highlights ?? []) allHighlights.push(h); + for (const b of r.breaking ?? []) allBreaking.push(b); + } + + const versionList = inRange + .slice() + .sort((a, b) => semverCompare(b.version, a.version)) // newest first + .map((r) => `v${r.version} (${r.date})`) + .join(', '); + + const lines = [ + `# Claude Code: v${ordered.older} → v${ordered.newer}`, + RELEASES_GITHUB, + '', + `**${inRange.length} release${inRange.length !== 1 ? 's' : ''} in range**: ${versionList}`, + '', + '## What changed', + ...allHighlights.map((h) => `- ${h}`), + ]; + + if (allBreaking.length > 0) { + lines.push('', '## Breaking changes'); + for (const b of allBreaking) lines.push(`- ⚠️ ${b}`); + } + + lines.push('', `---`); + lines.push(`${allHighlights.length} highlight${allHighlights.length !== 1 ? 's' : ''} | ${allBreaking.length} breaking change${allBreaking.length !== 1 ? 's' : ''} | Use get_release(version) for per-release details.`); + + return { content: [{ type: 'text', text: lines.join('\n') }] }; + }, + ); +} diff --git a/mcp-server/src/tools/get-example.ts b/mcp-server/src/tools/get-example.ts new file mode 100644 index 0000000..c4f71c9 --- /dev/null +++ b/mcp-server/src/tools/get-example.ts @@ -0,0 +1,140 @@ +import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; +import { z } from 'zod'; +import { loadReference, resolveDeepDive } from '../lib/content.js'; +import { readSection } from '../lib/section-reader.js'; +import { tokenizeQuery } from '../lib/search.js'; +import { githubUrl } from '../lib/urls.js'; + +export function registerGetExample(server: McpServer): void { + server.tool( + 'get_example', + 'Fetch a production-ready template or example from the guide (agents, skills, commands, hooks, scripts). Pass a partial name to search for matching examples.', + { + name: z.string().describe('Example name or partial match (e.g. "code-reviewer", "pre-commit hook", "custom agent")'), + }, + { + readOnlyHint: true, + destructiveHint: false, + openWorldHint: false, + }, + async ({ name }) => { + const ref = loadReference(); + const nameLower = name.toLowerCase(); + const tokens = tokenizeQuery(name); + + // Collect entries pointing to examples/ + interface ExampleMatch { + key: string; + path: string; + score: number; + } + const matches: ExampleMatch[] = []; + + for (const entry of ref.entries) { + const target = entry.target ?? resolveDeepDive(entry.value); + if (!target || target.type !== 'file') continue; + if (!target.path.startsWith('examples/')) continue; + + const pathLower = target.path.toLowerCase(); + const keyLower = entry.key.toLowerCase(); + let score = 0; + + // Exact match in path + if (pathLower.includes(nameLower)) score += 20; + if (keyLower.includes(nameLower)) score += 15; + + // Token match + for (const token of tokens) { + if (pathLower.includes(token)) score += 5; + if (keyLower.includes(token)) score += 3; + } + + if (score > 0) { + matches.push({ key: entry.key, path: target.path, score }); + } + } + + matches.sort((a, b) => b.score - a.score); + + if (matches.length === 0) { + return { + content: [ + { + type: 'text', + text: [ + `No examples found matching: "${name}"`, + '', + 'Available example categories:', + ' • examples/agents/ — Custom agent templates', + ' • examples/commands/ — Slash command templates', + ' • examples/hooks/ — Event hook examples', + ' • examples/skills/ — Skill module templates', + ' • examples/scripts/ — Utility scripts', + '', + 'Try: get_example("agent"), get_example("hook"), get_example("command")', + ].join('\n'), + }, + ], + }; + } + + // Single match: fetch and return content + if (matches.length === 1 || matches[0].score >= 20) { + const match = matches[0]; + const section = await readSection(match.path, 1, 500); + + if (!section) { + return { + content: [ + { + type: 'text', + text: [ + `Example found: ${match.path}`, + `Key: ${match.key}`, + '', + 'Content unavailable (offline or file not found).', + `Try: read_section("${match.path}")`, + ].join('\n'), + }, + ], + }; + } + + return { + content: [ + { + type: 'text', + text: [ + `# ${match.path}`, + `Key: ${match.key}`, + `Lines: ${section.startLine}-${section.endLine} of ${section.totalLines}`, + `GitHub: ${githubUrl(match.path)}`, + '---', + '', + section.content, + section.hasMore ? `\n\n[truncated — use read_section("${match.path}", ${section.nextOffset}) for more]` : '', + ].join('\n'), + }, + ], + }; + } + + // Multiple matches: list them + const lines = [ + `Found ${matches.length} examples matching "${name}":`, + '', + ]; + + for (const match of matches.slice(0, 10)) { + lines.push(`• ${match.path}`); + lines.push(` Key: ${match.key} | Score: ${match.score}`); + lines.push(` → get_example("${match.path.split('/').pop()?.replace(/\.(md|yaml|sh|ts)$/, '') ?? match.key}")`); + lines.push(''); + } + + return { + content: [{ type: 'text', text: lines.join('\n') }], + }; + }, + ); +} diff --git a/mcp-server/src/tools/list-examples.ts b/mcp-server/src/tools/list-examples.ts new file mode 100644 index 0000000..7131822 --- /dev/null +++ b/mcp-server/src/tools/list-examples.ts @@ -0,0 +1,80 @@ +import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; +import { z } from 'zod'; +import { loadReference, resolveDeepDive } from '../lib/content.js'; +import { githubUrl } from '../lib/urls.js'; + +const CATEGORIES = ['agents', 'commands', 'hooks', 'skills', 'scripts'] as const; +type Category = typeof CATEGORIES[number]; + +export function registerListExamples(server: McpServer): void { + server.tool( + 'list_examples', + 'List all production-ready templates in the guide by category (agents, commands, hooks, skills, scripts). Use get_example(name) to fetch the content of any specific template.', + { + category: z + .enum(CATEGORIES) + .optional() + .describe('Filter by category: agents | commands | hooks | skills | scripts. Omit for all.'), + }, + { readOnlyHint: true, destructiveHint: false, openWorldHint: false }, + async ({ category }) => { + const ref = loadReference(); + + // Collect all example paths from reference.yaml + const byCategory = new Map>(); + for (const cat of CATEGORIES) byCategory.set(cat, []); + + for (const entry of ref.entries) { + const target = entry.target ?? resolveDeepDive(entry.value); + if (!target || target.type !== 'file') continue; + if (!target.path.startsWith('examples/')) continue; + + const parts = target.path.split('/'); // ['examples', 'agents', 'file.md'] + const cat = parts[1] as Category; + if (!CATEGORIES.includes(cat)) continue; + if (category && cat !== category) continue; + + const list = byCategory.get(cat)!; + // Deduplicate by path + if (list.some((e) => e.path === target.path)) continue; + + // Build description from key + const desc = entry.key + .replace(/^deep_dive_/, '') + .replace(/_/g, ' ') + .replace(/\b\w/g, (c) => c.toUpperCase()); + + list.push({ key: entry.key, path: target.path, description: desc }); + } + + const lines: string[] = [ + `# Claude Code Ultimate Guide — Templates`, + `GitHub: https://github.com/FlorianBruniaux/claude-code-ultimate-guide/tree/main/examples`, + '', + ]; + + let total = 0; + for (const cat of CATEGORIES) { + if (category && cat !== category) continue; + const items = byCategory.get(cat)!; + if (items.length === 0) continue; + + lines.push(`## ${cat.charAt(0).toUpperCase() + cat.slice(1)} (${items.length})`); + for (const item of items) { + const filename = item.path.split('/').pop() ?? item.path; + const gh = githubUrl(item.path); + lines.push(`- **${filename}** — ${item.description}`); + lines.push(` GitHub: ${gh}`); + lines.push(` → get_example("${filename.replace(/\.(md|yaml|sh|ts)$/, '')}")`); + } + lines.push(''); + total += items.length; + } + + lines.push('---'); + lines.push(`${total} template(s) total. Use get_example(name) to fetch any template.`); + + return { content: [{ type: 'text', text: lines.join('\n') }] }; + }, + ); +} diff --git a/mcp-server/src/tools/list-topics.ts b/mcp-server/src/tools/list-topics.ts new file mode 100644 index 0000000..0341d5f --- /dev/null +++ b/mcp-server/src/tools/list-topics.ts @@ -0,0 +1,57 @@ +import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; +import { loadReference } from '../lib/content.js'; + +export function registerListTopics(server: McpServer): void { + server.tool( + 'list_topics', + 'List all top-level topics and categories in the Claude Code Ultimate Guide. Useful for exploring what the guide covers before searching.', + {}, + { + readOnlyHint: true, + destructiveHint: false, + openWorldHint: false, + }, + async () => { + const ref = loadReference(); + + // Group entries by first key segment (before first underscore) + const categories = new Map(); + + for (const entry of ref.entries) { + const category = entry.key.split('_')[0] ?? entry.key; + if (!categories.has(category)) { + categories.set(category, { count: 0, samples: [] }); + } + const cat = categories.get(category)!; + cat.count++; + if (cat.samples.length < 5) { + cat.samples.push(entry.key); + } + } + + const sorted = Array.from(categories.entries()).sort((a, b) => b[1].count - a[1].count); + + const lines: string[] = [ + `Claude Code Ultimate Guide — ${ref.entries.length} indexed entries across ${sorted.length} categories`, + `Version: ${ref.version}`, + '', + '## Topics', + '', + ]; + + for (const [category, { count, samples }] of sorted) { + lines.push(`### ${category} (${count} entries)`); + lines.push(`Examples: ${samples.join(', ')}`); + lines.push(''); + } + + lines.push('---'); + lines.push('Use search_guide("topic") to search within any category.'); + lines.push('Use read_section("guide/ultimate-guide.md") to browse the full guide.'); + + return { + content: [{ type: 'text', text: lines.join('\n') }], + }; + }, + ); +} diff --git a/mcp-server/src/tools/read-section.ts b/mcp-server/src/tools/read-section.ts new file mode 100644 index 0000000..262dfb9 --- /dev/null +++ b/mcp-server/src/tools/read-section.ts @@ -0,0 +1,79 @@ +import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; +import { z } from 'zod'; +import { readSection } from '../lib/section-reader.js'; +import { resolveContentPath } from '../lib/content.js'; +import { formatLinks } from '../lib/urls.js'; + +export function registerReadSection(server: McpServer): void { + server.tool( + 'read_section', + 'Read a section from a guide file (markdown, YAML, examples). Supports pagination via offset. Use after search_guide() to fetch the full content at a specific location.', + { + path: z.string().describe('Relative path from repo root (e.g. "guide/ultimate-guide.md", "examples/agents/code-reviewer.md")'), + offset: z.number().min(1).optional().default(1).describe('Line number to start reading from (1-based, default 1)'), + limit: z.number().min(1).max(500).optional().default(500).describe('Max lines to return (default 500, max 500)'), + }, + { + readOnlyHint: true, + destructiveHint: false, + openWorldHint: false, + }, + async ({ path: filePath, offset, limit }) => { + // Security: validate path before attempting read + const resolved = resolveContentPath(filePath); + if (resolved === null) { + return { + content: [ + { + type: 'text', + text: `Error: Invalid path "${filePath}". Only paths within the guide repo with allowed extensions (.md, .yaml, .yml, .sh, .ts, .js, .json, .py, .txt) are permitted.`, + }, + ], + isError: true, + }; + } + + const result = await readSection(filePath, offset ?? 1, limit ?? 500); + + if (result === null) { + return { + content: [ + { + type: 'text', + text: [ + `File not found or unavailable: "${filePath}"`, + '', + 'This may be because:', + ' • The file does not exist in the guide repo', + ' • Network unavailable (running offline without cache)', + '', + 'Fallback: read the resource claude-code-guide://reference for inline summaries.', + ].join('\n'), + }, + ], + isError: true, + }; + } + + const header = [ + `File: ${filePath}`, + `Lines: ${result.startLine}-${result.endLine} of ${result.totalLines}`, + result.hasMore + ? `Has more: yes — use offset=${result.nextOffset} for next section` + : 'Has more: no', + formatLinks(filePath, result.startLine), + '---', + '', + ].join('\n'); + + return { + content: [ + { + type: 'text', + text: header + result.content, + }, + ], + }; + }, + ); +} diff --git a/mcp-server/src/tools/releases.ts b/mcp-server/src/tools/releases.ts new file mode 100644 index 0000000..fbcd5a9 --- /dev/null +++ b/mcp-server/src/tools/releases.ts @@ -0,0 +1,82 @@ +import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; +import { z } from 'zod'; +import { loadReleases } from '../lib/content.js'; +import { githubUrl } from '../lib/urls.js'; + +const RELEASES_GITHUB = githubUrl('guide/claude-code-releases.md'); + +interface ReleaseEntry { + version: string; + date: string; + highlights: string[]; + breaking?: string[]; +} + +export function registerReleases(server: McpServer): void { + server.tool( + 'get_release', + 'Get details about Claude Code CLI official releases. Pass a version to get a specific release, or omit to get the latest and recent history.', + { + version: z.string().optional().describe('Specific version (e.g. "2.1.59"). Omit for latest + recent 5.'), + count: z.number().min(1).max(30).optional().default(5).describe('Number of recent releases to show when no version specified (default 5)'), + }, + { readOnlyHint: true, destructiveHint: false, openWorldHint: false }, + async ({ version, count }) => { + const data = loadReleases(); + const releases = data.releases as ReleaseEntry[]; + + if (version) { + const found = releases.find( + (r) => r.version === version || r.version === version.replace(/^v/, ''), + ); + if (!found) { + const versions = releases.slice(0, 10).map((r) => `v${r.version}`).join(', '); + return { + content: [{ + type: 'text', + text: `Release v${version} not found.\n\nRecent versions: ${versions}\n\nFull history: ${RELEASES_GITHUB}`, + }], + }; + } + + const lines = [ + `# Claude Code v${found.version} (${found.date})`, + RELEASES_GITHUB, + '', + '## Highlights', + ...(found.highlights ?? []).map((h) => `- ${h}`), + ]; + + if (found.breaking?.length) { + lines.push('', '## Breaking changes'); + for (const b of found.breaking) lines.push(`- ⚠️ ${b}`); + } + + return { content: [{ type: 'text', text: lines.join('\n') }] }; + } + + // Latest + recent N + const recent = releases.slice(0, count ?? 5); + const lines = [ + `# Claude Code Releases`, + `Latest: v${data.latest} (updated: ${data.updated})`, + RELEASES_GITHUB, + '', + ]; + + for (const r of recent) { + lines.push(`## v${r.version} — ${r.date}`); + for (const h of r.highlights ?? []) lines.push(`- ${h}`); + if (r.breaking?.length) { + for (const b of r.breaking) lines.push(` ⚠️ ${b}`); + } + lines.push(''); + } + + lines.push(`---`); + lines.push(`Showing ${recent.length} of ${releases.length} tracked releases. Use get_release(version) for details.`); + + return { content: [{ type: 'text', text: lines.join('\n') }] }; + }, + ); +} diff --git a/mcp-server/src/tools/search-examples.ts b/mcp-server/src/tools/search-examples.ts new file mode 100644 index 0000000..b8bfcf4 --- /dev/null +++ b/mcp-server/src/tools/search-examples.ts @@ -0,0 +1,133 @@ +import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; +import { z } from 'zod'; +import { loadReference, resolveDeepDive } from '../lib/content.js'; +import { tokenizeQuery } from '../lib/search.js'; +import { githubUrl } from '../lib/urls.js'; + +interface ExampleResult { + path: string; + key: string; + score: number; + description: string; + githubUrl: string; +} + +export function registerSearchExamples(server: McpServer): void { + server.tool( + 'search_examples', + 'Semantic search across all production-ready templates by intent (e.g. "hook lint", "agent code review"). Different from get_example (exact name) and list_examples (category browse).', + { + query: z.string().describe('Search query describing the template you need, e.g. "hook lint", "agent code review", "pre-commit typescript"'), + limit: z.number().min(1).max(20).optional().default(10).describe('Max results to return (default 10, max 20)'), + }, + { readOnlyHint: true, destructiveHint: false, openWorldHint: false }, + async ({ query, limit }) => { + const ref = loadReference(); + const tokens = tokenizeQuery(query); + const queryLower = query.toLowerCase(); + + if (tokens.length === 0) { + return { + content: [{ + type: 'text', + text: 'Query too short or contained only stop words. Try: "hook lint", "agent security", "pre-commit".', + }], + }; + } + + // Collect and score entries pointing to examples/ + const results: ExampleResult[] = []; + const seen = new Set(); + + for (const entry of ref.entries) { + const target = entry.target ?? resolveDeepDive(entry.value); + if (!target || target.type !== 'file') continue; + if (!target.path.startsWith('examples/')) continue; + + // Deduplicate by path + if (seen.has(target.path)) continue; + + const pathLower = target.path.toLowerCase(); + const keyLower = entry.key.toLowerCase(); + const textLower = entry.searchableText.toLowerCase(); + + let score = 0; + + // Exact substring match on full query (highest signal) + if (pathLower.includes(queryLower)) score += 15; + + for (const token of tokens) { + if (token.length < 2) continue; + if (pathLower.includes(token)) score += 10; + else if (keyLower.includes(token)) score += 7; + else if (textLower.includes(token)) score += 5; + else { + // Fuzzy: token length >= 5, levenshtein-like (segment starts with token) + if (token.length >= 5) { + const pathSegments = pathLower.replace(/[/_.-]/g, ' ').split(' '); + for (const seg of pathSegments) { + if (seg.length >= 4 && (seg.startsWith(token.slice(0, -1)) || token.startsWith(seg.slice(0, -1)))) { + score += 2; + break; + } + } + } + } + } + + if (score > 0) { + // Build human-readable description from key + const description = entry.searchableText.slice(0, 120).replace(/\s+/g, ' ').trim(); + + seen.add(target.path); + results.push({ + path: target.path, + key: entry.key, + score, + description, + githubUrl: githubUrl(target.path), + }); + } + } + + results.sort((a, b) => b.score - a.score); + const topResults = results.slice(0, limit ?? 10); + + if (topResults.length === 0) { + return { + content: [{ + type: 'text', + text: [ + `No examples found for: "${query}"`, + '', + 'Try broader terms or browse by category:', + ' • list_examples("agents") — custom agent templates', + ' • list_examples("hooks") — event hook examples', + ' • list_examples("commands") — slash command templates', + ' • list_examples("skills") — skill module templates', + ' • list_examples("scripts") — utility scripts', + ].join('\n'), + }], + }; + } + + const lines = [ + `# Examples matching "${query}"`, + `Found ${topResults.length} result${topResults.length !== 1 ? 's' : ''} (of ${results.length} scored)`, + '', + ]; + + for (const r of topResults) { + const name = r.path.split('/').pop()?.replace(/\.(md|yaml|sh|ts|js|py)$/, '') ?? r.key; + lines.push(`## ${r.path}`); + lines.push(`Score: ${r.score} | Key: ${r.key}`); + lines.push(r.description); + lines.push(`GitHub: ${r.githubUrl}`); + lines.push(`→ get_example("${name}")`); + lines.push(''); + } + + return { content: [{ type: 'text', text: lines.join('\n') }] }; + }, + ); +} diff --git a/mcp-server/src/tools/search-guide.ts b/mcp-server/src/tools/search-guide.ts new file mode 100644 index 0000000..febb611 --- /dev/null +++ b/mcp-server/src/tools/search-guide.ts @@ -0,0 +1,86 @@ +import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; +import { z } from 'zod'; +import { searchGuide } from '../lib/search.js'; +import { formatLinks, githubUrl } from '../lib/urls.js'; + +export function registerSearchGuide(server: McpServer): void { + server.tool( + 'search_guide', + 'Search the Claude Code Ultimate Guide by topic, keyword, or question. Returns ranked results with file locations and descriptions. Use this as the first step for any guide question.', + { + query: z.string().describe('Search query — topic, question, or keyword (e.g. "hooks", "custom agents", "cost optimization")'), + limit: z.number().min(1).max(20).optional().default(10).describe('Max results to return (default 10, max 20)'), + }, + { + readOnlyHint: true, + destructiveHint: false, + openWorldHint: false, + }, + async ({ query, limit }) => { + const results = searchGuide(query, limit ?? 10); + + if (results.length === 0) { + return { + content: [ + { + type: 'text', + text: [ + `No results found for: "${query}"`, + '', + 'Tips:', + ' • Try shorter keywords: "hooks" instead of "how do I use hooks"', + ' • Use the resource fallback: read claude-code-guide://reference for the full YAML index', + ' • Try related terms: "commands", "agents", "mcp", "security", "cost"', + ].join('\n'), + }, + ], + }; + } + + const lines: string[] = [ + `Found ${results.length} result(s) for: "${query}"`, + '', + ]; + + for (const result of results) { + lines.push(`## ${result.key} (score: ${result.score})`); + lines.push(`Section: ${result.section}`); + lines.push(`Location: ${result.hint}`); + + if (result.target) { + switch (result.target.type) { + case 'line': + lines.push(`→ read_section("${result.target.file}", ${result.target.line})`); + lines.push(` ${formatLinks(result.target.file, result.target.line)}`); + break; + case 'file': + lines.push( + `→ read_section("${result.target.path}"${result.target.line ? `, ${result.target.line}` : ''})`, + ); + lines.push(` ${formatLinks(result.target.path, result.target.line)}`); + break; + case 'url': + lines.push(`→ External: ${result.target.url}`); + break; + case 'inline': + lines.push(`→ ${result.target.text.slice(0, 200)}${result.target.text.length > 200 ? '…' : ''}`); + break; + case 'structured': + lines.push(`→ [structured data — use read_section or view resource]`); + break; + } + } + + lines.push(''); + } + + lines.push('---'); + lines.push('Use read_section(path, line) to fetch the full content of any result.'); + lines.push('Use claude-code-guide://reference resource for the complete YAML index.'); + + return { + content: [{ type: 'text', text: lines.join('\n') }], + }; + }, + ); +} diff --git a/mcp-server/src/tools/threats.ts b/mcp-server/src/tools/threats.ts new file mode 100644 index 0000000..163cecc --- /dev/null +++ b/mcp-server/src/tools/threats.ts @@ -0,0 +1,264 @@ +import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; +import { z } from 'zod'; +import { loadThreatDb } from '../lib/content.js'; +import { githubUrl } from '../lib/urls.js'; + +const THREAT_DB_GITHUB = githubUrl('examples/commands/resources/threat-db.yaml'); + +interface CveEntry { + id: string; + component: string; + severity: string; + cvss?: number; + description: string; + source: string; + fixed_in?: string; + mitigation?: string; + notes?: string; +} + +interface TechniqueEntry { + id: string; + name: string; + description: string; + examples?: string[]; + campaigns?: string[]; + cves?: string[]; + mitigation?: string; +} + +const CATEGORY_LABELS: Record = { + cves: 'CVE Database', + authors: 'Malicious Authors', + skills: 'Malicious Skills', + techniques: 'Attack Techniques', + mitigations: 'Minimum Safe Versions', + sources: 'Research Sources', +}; + +export function registerGetThreat(server: McpServer): void { + server.tool( + 'get_threat', + 'Look up a specific threat by ID from the security threat database. Supports CVE IDs (e.g. "CVE-2025-53109") and technique IDs (e.g. "T001").', + { + id: z.string().describe('Threat ID: a CVE identifier (e.g. "CVE-2025-53109") or attack technique ID (e.g. "T001")'), + }, + { readOnlyHint: true, destructiveHint: false, openWorldHint: false }, + async ({ id }) => { + const db = await loadThreatDb(); + const idUpper = id.toUpperCase(); + + // Search CVE database + const cve = (db.cve_database as CveEntry[]).find( + (c) => c.id.toUpperCase() === idUpper, + ); + if (cve) { + const lines = [ + `# ${cve.id} — ${cve.component}`, + THREAT_DB_GITHUB, + '', + `**Severity**: ${cve.severity.toUpperCase()}${cve.cvss ? ` (CVSS ${cve.cvss})` : ''}`, + `**Component**: ${cve.component}`, + `**Source**: ${cve.source}`, + '', + `## Description`, + cve.description, + ]; + + if (cve.fixed_in) { + lines.push('', `**Fixed in**: ${cve.fixed_in}`); + } + if (cve.mitigation) { + lines.push('', `## Mitigation`, cve.mitigation); + } + if (cve.notes) { + lines.push('', `## Notes`, cve.notes); + } + + return { content: [{ type: 'text', text: lines.join('\n') }] }; + } + + // Search attack techniques + const technique = (db.attack_techniques as TechniqueEntry[]).find( + (t) => t.id.toUpperCase() === idUpper, + ); + if (technique) { + const lines = [ + `# ${technique.id} — ${technique.name}`, + THREAT_DB_GITHUB, + '', + `## Description`, + technique.description, + ]; + + if (technique.examples?.length) { + lines.push('', '## Examples'); + for (const ex of technique.examples) lines.push(`- ${ex}`); + } + if (technique.campaigns?.length) { + lines.push('', `**Campaigns**: ${technique.campaigns.join(', ')}`); + } + if (technique.cves?.length) { + lines.push(`**Related CVEs**: ${technique.cves.join(', ')}`); + } + if (technique.mitigation) { + lines.push('', `## Mitigation`, technique.mitigation); + } + + return { content: [{ type: 'text', text: lines.join('\n') }] }; + } + + return { + content: [{ + type: 'text', + text: [ + `Threat ID "${id}" not found in the database.`, + '', + 'Supported formats:', + ' • CVE IDs: CVE-2025-53109, CVE-2026-24052, ...', + ' • Technique IDs: T001, T002, ...', + '', + `Use list_threats("cves") or list_threats("techniques") to browse all entries.`, + `Full database: ${THREAT_DB_GITHUB}`, + ].join('\n'), + }], + }; + }, + ); +} + +export function registerListThreats(server: McpServer): void { + server.tool( + 'list_threats', + 'Browse the security threat database. Without a category, returns a summary with counts. With a category, returns the full list for that section.', + { + category: z.enum(['cves', 'authors', 'skills', 'techniques', 'mitigations', 'sources']) + .optional() + .describe('Section to list: cves | authors | skills | techniques | mitigations | sources. Omit for a global summary.'), + }, + { readOnlyHint: true, destructiveHint: false, openWorldHint: false }, + async ({ category }) => { + const db = await loadThreatDb(); + + if (!category) { + // Global summary + const lines = [ + `# Threat Database Summary`, + `Version ${db.version} — updated ${db.updated}`, + THREAT_DB_GITHUB, + '', + '| Category | Count |', + '|----------|-------|', + `| CVEs | ${db.cve_database.length} |`, + `| Malicious Authors | ${db.malicious_authors.length} |`, + `| Malicious Skills | ${db.malicious_skills.length} |`, + `| Attack Techniques | ${db.attack_techniques.length} |`, + `| Minimum Safe Versions | ${Object.keys(db.minimum_safe_versions).length} |`, + `| Research Sources | ${db.sources.length} |`, + '', + 'Use list_threats(category) to browse a section, or get_threat(id) for details.', + 'Categories: cves | authors | skills | techniques | mitigations | sources', + ]; + return { content: [{ type: 'text', text: lines.join('\n') }] }; + } + + const label = CATEGORY_LABELS[category] ?? category; + + if (category === 'cves') { + const cves = db.cve_database as CveEntry[]; + const lines = [ + `# ${label} (${cves.length} entries)`, + THREAT_DB_GITHUB, + '', + ]; + for (const c of cves) { + lines.push(`## ${c.id} — ${c.component}`); + lines.push(`**Severity**: ${c.severity.toUpperCase()}${c.cvss ? ` (CVSS ${c.cvss})` : ''} | **Source**: ${c.source}`); + lines.push(c.description); + if (c.fixed_in) lines.push(`Fixed in: ${c.fixed_in}`); + if (c.mitigation) lines.push(`Mitigation: ${c.mitigation}`); + lines.push(''); + } + lines.push(`---\nUse get_threat("CVE-XXXX-XXXXX") for full details on any CVE.`); + return { content: [{ type: 'text', text: lines.join('\n') }] }; + } + + if (category === 'techniques') { + const techniques = db.attack_techniques as TechniqueEntry[]; + const lines = [ + `# ${label} (${techniques.length} entries)`, + THREAT_DB_GITHUB, + '', + ]; + for (const t of techniques) { + lines.push(`## ${t.id} — ${t.name}`); + lines.push(t.description); + if (t.mitigation) lines.push(`Mitigation: ${t.mitigation}`); + lines.push(''); + } + lines.push(`---\nUse get_threat("T001") for full details including examples and CVE links.`); + return { content: [{ type: 'text', text: lines.join('\n') }] }; + } + + if (category === 'authors') { + const authors = db.malicious_authors as Array<{ name: string; source?: string; notes?: string }>; + const lines = [ + `# ${label} (${authors.length} confirmed)`, + THREAT_DB_GITHUB, + '', + 'Block ALL skills from these authors — confirmed malicious by security researchers.', + '', + ]; + for (const a of authors) { + lines.push(`- **${a.name}**${a.source ? ` — ${a.source}` : ''}${a.notes ? ` (${a.notes})` : ''}`); + } + return { content: [{ type: 'text', text: lines.join('\n') }] }; + } + + if (category === 'skills') { + const skills = db.malicious_skills as Array<{ name: string; type?: string; source?: string; risk?: string; notes?: string }>; + const lines = [ + `# ${label} (${skills.length} entries)`, + THREAT_DB_GITHUB, + '', + ]; + for (const s of skills) { + const tags = [s.type, s.risk ? `risk:${s.risk}` : undefined].filter(Boolean).join(', '); + lines.push(`- **${s.name}**${tags ? ` [${tags}]` : ''}${s.source ? ` — ${s.source}` : ''}${s.notes ? ` (${s.notes})` : ''}`); + } + return { content: [{ type: 'text', text: lines.join('\n') }] }; + } + + if (category === 'mitigations') { + const versions = db.minimum_safe_versions; + const entries = Object.entries(versions); + const lines = [ + `# ${label} (${entries.length} entries)`, + THREAT_DB_GITHUB, + '', + ]; + for (const [component, minVersion] of entries) { + lines.push(`- **${component}**: >= ${minVersion}`); + } + return { content: [{ type: 'text', text: lines.join('\n') }] }; + } + + if (category === 'sources') { + const sources = db.sources as Array<{ name: string; url?: string; date?: string }>; + const lines = [ + `# ${label} (${sources.length} entries)`, + THREAT_DB_GITHUB, + '', + ]; + for (const s of sources) { + lines.push(`- **${s.name}**${s.date ? ` (${s.date})` : ''}${s.url ? `\n ${s.url}` : ''}`); + } + return { content: [{ type: 'text', text: lines.join('\n') }] }; + } + + return { + content: [{ type: 'text', text: `Unknown category: "${category}". Use: cves | authors | skills | techniques | mitigations | sources` }], + }; + }, + ); +} diff --git a/mcp-server/tsconfig.json b/mcp-server/tsconfig.json new file mode 100644 index 0000000..3535f14 --- /dev/null +++ b/mcp-server/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "ESNext", + "moduleResolution": "bundler", + "lib": ["ES2022"], + "outDir": "./dist", + "rootDir": "./src", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "declaration": true, + "declarationMap": true, + "sourceMap": true, + "resolveJsonModule": true + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist"] +} diff --git a/mcp-server/tsup.config.ts b/mcp-server/tsup.config.ts new file mode 100644 index 0000000..10695fa --- /dev/null +++ b/mcp-server/tsup.config.ts @@ -0,0 +1,14 @@ +import { defineConfig } from 'tsup'; + +export default defineConfig({ + entry: ['src/index.ts'], + format: ['esm'], + target: 'es2022', + outDir: 'dist', + clean: true, + dts: true, + sourcemap: true, + banner: { + js: '#!/usr/bin/env node', + }, +});