diff --git a/DELEGATE-PLAN.md b/DELEGATE-PLAN.md new file mode 100644 index 0000000..9ddfc06 --- /dev/null +++ b/DELEGATE-PLAN.md @@ -0,0 +1,82 @@ +# DELEGATE-PLAN — v0.5.7 QA green + +**Repo:** `/Users/macbookair/Documents/Visual Studio Code/MCP/gate-mcp` +**Done when:** `npm test` exit 0 AND `node dist/main.js doctor --strict` pass +**No commit** unless user asks. + +## Repro (2026-10-12) + +| Command | Result | +|---------|--------| +| `npm test` | 47 passed, 2 failed | + +### Failures + +1. **Test 34 — AlgoTrading SMC** — `handleGraphQuery` with `projectRoot: algoSmc` while `GATE_PROJECT_ROOT` = gate-mcp → boundary error. +2. **Test 42 — cachePartition** — `mkdtemp` `/var/...` vs canonical `/private/var/...`. + +## Tasks + +| ID | Owner | Scope | Fix | Status | +|----|-------|-------|-----|--------| +| T1 | implementer (`b8ab98b6`) | `src/test.ts` | Temp set `GATE_PROJECT_ROOT=algoSmc` for Test 34, restore in `finally` | [x] verified | +| T2 | implementer (`b8ab98b6`) | `src/test.ts`, `scripts/qa-multi-repo-proof.mjs` | Compare `cachePartition` to `canonicalizePath` / `realpathSync.native`; qa assert added as regression guard | [x] verified | +| T3 | parent (orchestrator) | — | `npm run build`, `npm run test:unit`, `npm test`, `doctor --strict` | [x] verified | + +## Verification (orchestrator, 2026-10-12 08:12, Node 22.21.1) + +| Command | Exit | Result | +|---------|------|--------| +| `npm run build` | 0 | tsc clean | +| `npm run test:unit` | 0 | 49 passed, 0 failed | +| `npm test` | 0 | unit 49/0 + qa-multi-repo pass + adversarial `failedCount: 0` | +| `node dist/main.js doctor --strict` | 0 | 10/10 PASS, `ok: true` | + +Re-verified after moving fixes onto branch `fix/qa-057` from `origin/main` (8547e2e): build 0, `npm test` 0, same counts. + +Review notes: Test 34 fix is test-side (product boundary refusal is intended security behavior). Test 34 only runs on machines with the AlgoTrading SMC checkout; skips elsewhere. + +## Acceptance + +```bash +npm run build +npm run test:unit +npm test +node dist/main.js doctor --strict +``` + +## Out of scope + +- graphify node-count drift warnings +- EPIPE on MCP stdio after test suite (non-failing noise) + +--- + +# Next — end-user docs (done) + React demo (plan only) + +Constraints: Gate stays standalone; graphify is a separate tool, no bundling. +Ask the user before any graphify integration or caveman-in-code change. + +## D1 — README end-user docs [x] + +- `What Gate compresses — and what it does not` (tool results only; not prompts, built-in Read, or model output; meaning of `Savings: n/a`). +- `Reading gate_session_stats` — persistent-cache fields vs process-wide fields, `measurement_scope`, `billingScope`, honest example. +- `Pin Node in mcp.json` — absolute `node` + `dist/main.js` paths; `NODE_MODULE_VERSION` symptom; verify with `doctor --strict`. +- Known limitations: code generation, native SQLite rows. + +## P1 — React demo script: full read vs compress (PLAN ONLY — do not build until user says) + +Goal: reproducible, honest before/after numbers for marketing, from one command. + +| Step | Detail | +|------|--------| +| Fixture | Pin a public React repo at a fixed commit (e.g. a mid-size Vite + React app), cloned to a temp dir — not vendored | +| Task | Fixed "work loop": 8–12 files a real agent touches for one feature (component, hook, context, API client, test) | +| Baseline | Raw file bytes + BPE tokens (same counter as `tokenCounter.ts`) for each file | +| Gate | Spawn `dist/main.js` over MCP stdio; call `gate_compress_file` `signature` per file, then a second pass to show dedup hits; finish with `gate_session_stats` | +| Output | `demo/react-demo-result.json` + Markdown table: file, raw tokens, Gate tokens, %, `expanded` flag | +| Honesty | Label `billingScope: tool_payload_only`; include files where Gate expands or saves ~0; show that edits still need a `full` read | + +Files: `scripts/demo-react-compare.mjs` (new), `package.json` script `demo:react`, README "Benchmarks" link. +Acceptance: deterministic numbers on two runs; no network after clone; runs on Node 20 and 22. +Risks: picking a repo that flatters Gate — choose before seeing numbers; signature-only views are not enough to edit code, so the demo must say so. diff --git a/README.md b/README.md index 7a3a741..87778e1 100644 --- a/README.md +++ b/README.md @@ -134,6 +134,31 @@ Architecture detail: [`ARCHITECTURE.md`](ARCHITECTURE.md). `gate_help` with `tool: "recommended_stack"` is the agent-facing playbook. + + +### What Gate compresses — and what it does not + +Gate only shrinks **results of Gate tool calls**. It is a tool your agent +chooses to call, not a filter on the whole conversation. + +| Gate reduces | Gate does **not** touch | +|---|---| +| `tools/list` schema size (catalog mode) | Your prompts and chat history | +| File views returned by `gate_compress_file` | The editor's built-in `Read` / `Grep` / terminal output | +| Graph answers from `gate_graph_query` | Rules, system prompt, attached files | +| Re-reads of unchanged files (SQLite dedup) | Model output — generated code and replies | +| JSON passed to `gate_clean_response` | Other MCP servers (unless routed through the opt-in proxy) | +| Images passed to `gate_optimize_image` | Your provider bill — see `billingScope` below | + +What this means in practice: + +- If the agent never calls a Gate tool, savings are **zero**. Add a rule + telling your agent to use `gate_compress_file` before full reads. +- An agent footer such as `Savings: n/a` means no Gate compression ran that + turn. It does not mean Gate is broken. Run `gate_init` to confirm health. +- Gate cannot shrink code generation. Smaller input context leaves more room + for output, but the output itself is the model's. + --- @@ -157,10 +182,10 @@ npm exec --yes --strict-allow-scripts \ --package=@gatemcp/cli -- gatemcp ``` -Package: `@gatemcp/cli` · binary: `gatemcp` · current: **0.5.7**. +Package: `@gatemcp/cli` · binary: `gatemcp` · current: **0.5.8**. Then wire your IDE (Cursor snippet below). Run **`gate_init`** once per workspace. -Doctor: `npx --package=@gatemcp/cli@0.5.7 gatemcp doctor /abs/path/to/repo --strict`. +Doctor: `npx --package=@gatemcp/cli@0.5.8 gatemcp doctor /abs/path/to/repo --strict`.
Install from source @@ -201,6 +226,54 @@ narrow (never widen).
+ + +
+Pin Node in mcp.json — fixes SQLite NODE_MODULE_VERSION errors + +`better-sqlite3` is a native module. It is compiled for the Node version that +ran `npm install`. Your IDE may launch MCP servers with a **different** Node +(nvm, Homebrew, Volta, or a GUI app `PATH` without your shell profile). + +Symptoms: + +- Server fails to start, or `gate_init` / `gate_session_stats` shows `persistentCache: false` +- Log line like `was compiled against a different Node.js version using NODE_MODULE_VERSION 127. This version of Node.js requires NODE_MODULE_VERSION 137` + +Fix: point the IDE at the **same** Node binary that installed Gate. In the +terminal where you installed it: + +```bash +which node # e.g. /Users/you/.nvm/versions/node/v22.21.1/bin/node +echo "$(npm root -g)/@gatemcp/cli/dist/main.js" +``` + +Then use both absolute paths: + +```json +{ + "mcpServers": { + "gatemcp": { + "command": "/Users/you/.nvm/versions/node/v22.21.1/bin/node", + "args": ["/Users/you/.nvm/versions/node/v22.21.1/lib/node_modules/@gatemcp/cli/dist/main.js"], + "env": { + "GATE_PROJECT_ROOT": "/absolute/path/to/your/repo" + } + } + } +} +``` + +Verify with the same Node: +`/path/to/node /path/to/dist/main.js doctor /absolute/path/to/your/repo --strict` — +`cache_access` must say `SQLite write/reopen probe passed`. + +If you switch Node versions later, reinstall Gate under the new version (or +keep the pin). Avoid `GATE_ALLOW_MEMORY_CACHE=1` as a fix — it hides the +problem and turns off persistent dedup. + +
+
Claude Code / Windsurf / Antigravity / VS Code / Codex @@ -218,7 +291,7 @@ narrow (never widen). codex plugin marketplace add Dukeabaddon/Gate-MCP && codex plugin add gatemcp@dukeabaddon-gate-mcp ``` -Restart the thread after install. Plugin pins `@gatemcp/cli@0.5.7`. +Restart the thread after install. Plugin pins `@gatemcp/cli@0.5.8`.
@@ -257,12 +330,46 @@ savings stay `0`. | `billingScope` | `"tool_payload_only"` — **not** Cursor billed tokens | | `expanded: true` | Output grew; `savingsPercent` forced to `0` | -`gate_session_stats` mixes path-filtered persistent cache totals with -process-wide counters for the MCP instance. See prior release notes for the -exact field split. - + + +### Reading `gate_session_stats` + +The result has two groups of numbers with **different scopes**. Do not add +them together. + +**Persistent cache** — stored in SQLite, survives IDE restarts, filtered by `projectRoot`: + +| Field | Meaning | +|---|---| +| `persistentCache` | `true` = SQLite. `false` = in-memory fallback; run `gatemcp doctor --strict` (often a [Node pin](#pin-node-for-sqlite) issue) | +| `cachePartition` | Canonical `GATE_PROJECT_ROOT` the DB belongs to (macOS shows `/private/var` for `/var`) | +| `projectRoot` | Path filter applied to the totals below | +| `totalEntries` | Files cached under that path | +| `totalHits` | Times an unchanged file was served from cache | +| `totalTokensSaved` | Cumulative raw-file tokens minus cached-view tokens on those hits | +| `topEntries` | Top 10 files by activity | + +**This MCP process** — reset when the server restarts, counts every repo the process served: + +| Field | Meaning | +|---|---| +| `files_considered` / `files_compressed` | Files Gate read / returned a smaller view for | +| `input_bytes` / `output_bytes` | Raw file bytes in vs tool-result bytes out | +| `estimated_tokens_before` / `estimated_tokens_after` | Same, as BPE token estimates | +| `cache_hits` | Dedup hits in this process | +| `elapsed_ms` / `session_elapsed_ms` | Gate processing time / server uptime | + +Labels on every result: + +- `measurement_scope: "serialized_tool_result_excluding_mcp_envelope"` — what was measured. +- `billingScope: "tool_payload_only"` — **not** your Cursor / provider bill. Your bill also includes prompts, history, rules, other tools, and model output. + +Example from one real session: `estimated_tokens_before: 6622`, +`estimated_tokens_after: 666` → Gate tool results were ~90% smaller than the +raw files. That is the honest claim; it is not "90% off your bill". +
Multi-repo / one global MCP @@ -385,7 +492,7 @@ With gatemcp (agent actually calls Gate): ## By the numbers -- **`@gatemcp/cli@0.5.7`** on npm — binary `gatemcp` +- **`@gatemcp/cli@0.5.8`** on npm — binary `gatemcp` - **Catalog-first** tool surface (schema anti-bloat) - **12** tools (6 hot-path in catalog + long tail via `gate_invoke`) - **20+** languages via tree-sitter / regex fallback @@ -454,7 +561,9 @@ Codex: remove the plugin from the Codex UI / plugin list. Source installs: `npm | Area | Behavior | |------|----------| -| **Opt-in only** | Zero savings if the agent never calls Gate | +| **Opt-in only** | Zero savings if the agent never calls Gate — see [what Gate compresses](#what-gate-compresses) | +| **Code generation** | Model output is never compressed; Gate only shrinks tool results | +| **Native SQLite** | IDE must run the same Node that installed Gate — see [Pin Node](#pin-node-for-sqlite) | | **gate graph vs graphify** | Different graphs; use `graphify_*` for communities | | **Graph savings %** | Symbol queries use a modeled baseline; `graphify_map` baselines the report file | | **Cursor MCP name** | May appear as `user-gatemcp` | @@ -491,6 +600,22 @@ Node **20** and **22–26** (Node 21 unsupported by required better-sqlite3). ## Changelog
+v0.5.8 — dependency security fixes, end-user docs + +**Security.** `sharp` 0.35.3 → 0.35.5 (libheif / librsvg advisories). Lockfile +refresh clears transitive advisories in `proxy-addr`, `ip-address`, `fast-uri`, +`hono`, and `qs`. `npm audit --omit=dev` reports 0. + +**Docs.** [What Gate compresses](#what-gate-compresses), +[reading `gate_session_stats`](#reading-gate-session-stats), and +[pinning Node for SQLite](#pin-node-for-sqlite). + +**QA.** macOS `/var` vs `/private/var` canonical-path fixes in test scripts. +No tool behavior changes. + +
+ +
v0.5.7 — catalog mode, required SQLite, symbol HTML **Schema budget.** Default `GATE_TOOL_MODE=catalog` lists six core tools plus diff --git a/docs/AGENT-HARNESS.md b/docs/AGENT-HARNESS.md new file mode 100644 index 0000000..a3316ca --- /dev/null +++ b/docs/AGENT-HARNESS.md @@ -0,0 +1,141 @@ +# Gate MCP — agent harness (proof-based loops) + +**Audience:** Cursor/Codex agent working **in this repo** with an **orchestrator** parent. +**Rule:** Do not claim “done” until **commands below pass** or you document a **blocked** external dependency with evidence. + +--- + +## 1. North-star goal + +Make Gate MCP **measurably** reduce agent context cost **without** fake savings, broken cache partitions, or silent SQLite fallback — while staying honest in `gate_session_stats` (`measurement_scope`). + +Success = green `npm run qa` (or agreed subset) + `gatemcp doctor --strict` + MCP acceptance + reproducible demo (React `ReactFiberWorkLoop.js` compress vs full read). + +--- + +## 2. Orchestrator responsibilities (parent chat) + +The **orchestrator** does **not** implement large diffs inline when 3+ files or failing QA. + +| Step | Action | +|------|--------| +| Plan | Write `DELEGATE-PLAN.md` at repo root with tasks, owners, acceptance commands | +| Spawn | `delegate-implementer` (Composer 2.5 standard) for code; `delegate-explore` for read-only; `delegate-research` (Grok) max 1× per goal | +| Brief | Every subagent prompt includes: repo path, files in scope, **do not touch**, AC command output required | +| Verify | Reject worker if no command output, no diff, or “done” without test line | +| Integrate | Parent runs `npm test` / `test:mcp` after each merge slice | +| Stop | Only when AC green or user accepts **blocked** with issue link | + +**Forbidden:** marking todos complete before tests run; inventing `savingsPercent`; shipping with `expanded: true` reported as win. + +--- + +## 3. Worker proof requirements + +Every implementation task must return: + +```markdown +## Result +- Status: pass | fail | blocked +- Changed files: … +- Commands: (copy/paste exit code + last 20 lines) +- Tests: which script proved it +- Blockers: … +``` + +### Minimum proof ladder (run in order) + +| Level | Command | When | +|-------|---------|------| +| L1 | `npm run build` | After any TS change | +| L2 | `npm run test:unit` | Default per PR slice | +| L3 | `npm test` | Before “feature complete” (includes qa-multi-repo + adversarial) | +| L4 | `npm run test:mcp` | Catalog mode / `gate_invoke` / tool list changes | +| L5 | `npm run test:doctor` | Cache / `GATE_PROJECT_ROOT` / SQLite changes | +| L6 | `npm run qa` | Release candidate only | + +Use **Jest/Playwright/Selenium** only if you add them to this repo; today proof is **Node regression scripts** in `scripts/` and `dist/*-regression.js` — prefer extending those over new frameworks unless orchestrator approves. + +--- + +## 4. QA status (v0.5.7) + +**2026-10-12:** `npm test` → **49 passed, 0 failed**; `doctor --strict` → PASS. + +Fixed (test/QA only — production already canonicalized roots): + +- `src/test.ts` — Test 34 temp `GATE_PROJECT_ROOT` for AlgoTrading SMC; Test 42 canonical partition paths. +- `scripts/qa-multi-repo-proof.mjs` — `cachePartition` compared via `fs.realpathSync.native`. + +Committed on branch `fix/qa-057` (based on `origin/main` 8547e2e, which already contains v0.5.7). Re-verified on that base: build 0, `npm test` 0 (49/0, multi-repo QA pass, adversarial `failedCount: 0`), `doctor --strict` PASS. Not published — npm still `0.5.7`. See `DELEGATE-PLAN.md`. + +--- + +## 5. Session scan (what users actually hit) + +From Cursor transcripts under `Users-macbookair-Documents-Visual-Studio-Code-MCP-gate-mcp`: + +| Session theme | User need | Harness task | +|---------------|-----------|--------------| +| `90aaa126` (large) | Ship repo, graphify, multi-language, demo, docs | Keep `qa` green; demo script in README | +| `7a7b7a61`, `9278e3be` | **Before/after** token demo on React work loop | Automate `scripts/` compare full read vs `gate_compress_file signature` | +| `79c7d291` | GitHub badges, license, demo prompts | Docs only — no fake metrics | +| **elite-kommo-bots** (this chat) | `Savings: n/a`, `persistentCache: false`, skipped stack | Docs: footer semantics; example `mcp.json` env block | + +Cross-project usage (not Gate repo): AlgoTrading, n8n-voice-memo, Drawbridge — use **per-repo** `GATE_PROJECT_ROOT`, not `~`. + +--- + +## 6. Dogfood config (Aaron’s machine) + +After upgrade, **restart Cursor** so MCP reloads. + +Recommended `mcpServers.gatemcp.env` (per machine): + +```json +{ + "GATE_PROJECT_ROOT": "/Users/macbookair/Documents/Visual Studio Code/MCP/gate-mcp", + "GATE_CACHE_DB": "/Users/macbookair/Documents/Visual Studio Code/MCP/gate-mcp/.gate-mcp/cache.db" +} +``` + +Switch `GATE_PROJECT_ROOT` when opening **elite-kommo-bots** or **elite-translations-tracker** (or pass `projectRoot` on every `gate_init`). + +**v0.5.7:** `toolMode=catalog` — long-tail tools via `gate_invoke`; acceptance in `npm run test:mcp`. + +**Cursor Node ABI:** If MCP errors with `NODE_MODULE_VERSION 127` vs `137`, pin MCP to the same Node that built `better-sqlite3` (e.g. nvm `node` + `dist/main.js` in `mcp.json`, not bare `gatemcp` under Cursor’s bundled Node). Restart Cursor after upgrade. + +--- + +## 7. Agent loop template (paste into orchestrator chat) + +```text +Goal: +Repo: /Users/macbookair/Documents/Visual Studio Code/MCP/gate-mcp +Done when: npm test exits 0 AND gatemcp doctor --strict passes +Plan: DELEGATE-PLAN.md +Workers: delegate-implementer only unless research blocked twice +After each worker: parent runs npm run test:unit +Do not commit unless user asks +``` + +--- + +## 8. What “no other way” means + +Stop only if: + +- Upstream dependency broken (npm, native SQLite) — show `doctor --json` failure +- User explicitly cancels +- Issue requires design decision — list options, default recommendation, **no code** + +Otherwise: shrink scope, add test, loop. + +--- + +## 9. Related docs + +- `ARCHITECTURE.md` — compression pipeline +- `README.md` — install + changelog +- Cursor skill: `~/.cursor/skills/gatemcp-workflow/SKILL.md` +- Cursor skill: `~/.cursor/skills/delegate/SKILL.md` diff --git a/package-lock.json b/package-lock.json index 5b1d0c7..a0f1c2b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,19 +1,19 @@ { "name": "@gatemcp/cli", - "version": "0.5.7", + "version": "0.5.8", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@gatemcp/cli", - "version": "0.5.7", + "version": "0.5.8", "license": "MIT", "dependencies": { "@modelcontextprotocol/sdk": "^1.12.1", "better-sqlite3": "12.10.0", "gpt-tokenizer": "^2.8.1", "jimp": "^1.6.0", - "sharp": "0.35.3", + "sharp": "0.35.5", "tesseract.js": "5.1.1", "tree-sitter": "0.21.1", "tree-sitter-javascript": "0.23.1", @@ -30,7 +30,7 @@ "typescript": "^5.7.0" }, "engines": { - "node": ">=20.0.0 <27" + "node": "^20.0.0 || >=22.0.0 <27" }, "optionalDependencies": { "tree-sitter-bash": "0.23.3", @@ -95,9 +95,9 @@ } }, "node_modules/@img/sharp-darwin-arm64": { - "version": "0.35.3", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.35.3.tgz", - "integrity": "sha512-RMnFX7YQsMoh7lWfcM4NEHHymBX/rLuKNPVM84XE9ONPcaSCDgE7CHIHpSgPcO2xcRthgBy1HfNO319mwhIAkg==", + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.35.5.tgz", + "integrity": "sha512-QRUlFQ0WxvdWyqqG/WtI3iupfD5rBzmCHXSdPsY91sAtVtTo7Q4cb6zOccZ3gqEqkr0f1As1ehLqmEpDsRf+lg==", "cpu": [ "arm64" ], @@ -113,13 +113,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-darwin-arm64": "1.3.2" + "@img/sharp-libvips-darwin-arm64": "1.3.4" } }, "node_modules/@img/sharp-darwin-x64": { - "version": "0.35.3", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.35.3.tgz", - "integrity": "sha512-Xo+5uFBtLN0BKqieTxiFzFPQAUlBbbH5iBKyRX/z1JrbnYsHTfKJnUfL8+p2TPXr1pXqao4eeL4Rl144uDpK9w==", + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.35.5.tgz", + "integrity": "sha512-+BR255RhDlpygUpOc/Jdt1nT6DQ3XG/ERo5wbcdOf5Q320dKtPCKPLR1LJs9VGXRaMa8l1uUa0tkCNOXiAxZUw==", "cpu": [ "x64" ], @@ -135,20 +135,20 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-darwin-x64": "1.3.2" + "@img/sharp-libvips-darwin-x64": "1.3.4" } }, "node_modules/@img/sharp-freebsd-wasm32": { - "version": "0.35.3", - "resolved": "https://registry.npmjs.org/@img/sharp-freebsd-wasm32/-/sharp-freebsd-wasm32-0.35.3.tgz", - "integrity": "sha512-lUxcqWIj2wMQ9BrwNjngcr1gWUr5xgaGThBRqPPalIC2n67Cqj1uPh8NnA/ZhAg8hUbKl+kVHKwgUIwe6ZYPrg==", + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-freebsd-wasm32/-/sharp-freebsd-wasm32-0.35.5.tgz", + "integrity": "sha512-Y/z91nEZ4uIBX5X3nfTovjU9lHNKFYbL2lpHCLVNmXQK03VIZvXBBt0KxbPGp2SdGSF+2mQU4e+hQaWOt86iAw==", "license": "Apache-2.0", "optional": true, "os": [ "freebsd" ], "dependencies": { - "@img/sharp-wasm32": "0.35.3" + "@img/sharp-wasm32": "0.35.5" }, "engines": { "node": ">=20.9.0" @@ -158,9 +158,9 @@ } }, "node_modules/@img/sharp-libvips-darwin-arm64": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.3.2.tgz", - "integrity": "sha512-9J6ypZFpQBj4YnePGoq/S38w6nz+vqg5WZLrLGY4YuSemdMq47GMLBPO42MzwdGwpg/agZ7xzZcFHa48xlywfg==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.3.4.tgz", + "integrity": "sha512-5R89nBYiRdUlSWJxPhO+GVtaXzXSxKnRu/xqMn3KTA3L9EB9Oy/P+Nn2f2vlhPuUdy/Zusb2DarbyTpGCfEDuw==", "cpu": [ "arm64" ], @@ -174,9 +174,9 @@ } }, "node_modules/@img/sharp-libvips-darwin-x64": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.3.2.tgz", - "integrity": "sha512-m2pW1n6cns9VaubNwsZ+c3CRYjxNQWgJ5gPlnL1nbBcpkBvFm6SCFN5o0psFHI8w9n11NKhFkeEDns98tiqbEw==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.3.4.tgz", + "integrity": "sha512-iR2OKH80yi0U+dUplyh3/xdpFvps6YkCwsXenIJxqxR1v9o+xtKTGbS9H7cps+2Vxjc8B1j96p75NmTGjIhtpQ==", "cpu": [ "x64" ], @@ -190,15 +190,12 @@ } }, "node_modules/@img/sharp-libvips-linux-arm": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.3.2.tgz", - "integrity": "sha512-1eMLzy92I4J6rmi4mAT8yC3HxOtniyGELlzGbNMLLeqe052ahFQ0h6LFq+lh5DsDIdYViIDst08abvSbcEdLXQ==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.3.4.tgz", + "integrity": "sha512-LmRtTsOHuvM2+wlO2Db37dx5MiZhB0FvSunciw48YjdOkZz9KAiRbm8ujeMOA1INqmei5NapFxYEK1D1ZSidmw==", "cpu": [ "arm" ], - "libc": [ - "glibc" - ], "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -209,15 +206,12 @@ } }, "node_modules/@img/sharp-libvips-linux-arm64": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.3.2.tgz", - "integrity": "sha512-dqVSFynCox4C/J8kT16V7SIFAns0IjgLwkvYT7p8LQVmJ5OS5b6tI9IGflxTeuBS//zXeFIUbwt5dwxyZ17cnA==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.3.4.tgz", + "integrity": "sha512-Y3dgX/6lE2QhQb+Gxy0WZxfg9MEm/JBjamZpS2IklP7xIQoKN4hzAm7KcMVGtaVDt3neE9OKBC7vAfonA/Lr1A==", "cpu": [ "arm64" ], - "libc": [ - "glibc" - ], "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -228,15 +222,12 @@ } }, "node_modules/@img/sharp-libvips-linux-ppc64": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.3.2.tgz", - "integrity": "sha512-3z0NHDxD6n5I9gc05U1eW1AyRm+Gznzq3naMrthPNqE6oYykcogW0l/jfpJdjYnuNl8R7yI9pNbE1XiUeyq0Aw==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.3.4.tgz", + "integrity": "sha512-Le6boB8Tai0Nis+gIxIpKx68UDVVIqdR8Tin5Yf1z2LJJQLDJvCDRqRu+jC2qCoD+eIomonmOwB4smBRxfVpYQ==", "cpu": [ "ppc64" ], - "libc": [ - "glibc" - ], "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -247,15 +238,12 @@ } }, "node_modules/@img/sharp-libvips-linux-riscv64": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.3.2.tgz", - "integrity": "sha512-bsb4rI+NldGOsXuej2r8OdSS8+zXDVaCWxyWrcv6kneTOlgAHtZABRzBBCwdsPiD90J4myNJuHpg6kA20ImW/w==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.3.4.tgz", + "integrity": "sha512-aHkkIEHPRdQEegJN20MLmGtxYD9R2wQr3Cwpddnu5+YKMt6Uzax7S9h5gpZTo8wyrGuZSlfQ63OevL5mTyOC7Q==", "cpu": [ "riscv64" ], - "libc": [ - "glibc" - ], "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -266,15 +254,12 @@ } }, "node_modules/@img/sharp-libvips-linux-s390x": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.3.2.tgz", - "integrity": "sha512-/ABshyj8gCpyIrNXnHn4LorDJ0HHm1VhXPBlxZ8zAtfVPAaSafXPGn+sUSIRiwaSBy0mmFjSjiXI5mkcwdChKQ==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.3.4.tgz", + "integrity": "sha512-ra/mB6MikESDUO7Yg+Mi95bFBb9GsObURuhnOv3OqknjGe9sZrG8tCe9q0xSIGrtLgvgw0gKnFWcK4blSgQOuQ==", "cpu": [ "s390x" ], - "libc": [ - "glibc" - ], "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -285,15 +270,12 @@ } }, "node_modules/@img/sharp-libvips-linux-x64": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.3.2.tgz", - "integrity": "sha512-ITPEtgffGJ0S6G9dRyw/366tJQqFRcHWPHhC+Stpg3Z8AEMrDrTr2lhdz4f/Y/HMbRh//7Z5mBzEpVdi62Oc3w==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.3.4.tgz", + "integrity": "sha512-GJ//SSXbnwSDes02umB3nDJLFcQzw8a18V8fyhqr6tV515tOEMdImjjxj1AoafMRz56F3PHgftnj1QEKSU1zkw==", "cpu": [ "x64" ], - "libc": [ - "glibc" - ], "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -304,15 +286,12 @@ } }, "node_modules/@img/sharp-libvips-linuxmusl-arm64": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.3.2.tgz", - "integrity": "sha512-zE9EdiUzUmg5mDT5a1rk5fYJ6GWPloTwWBYDS14naqHsL+EaMpDj1AWnpLgh3u0YCORv2Tt50wrcrpYqkP97Kw==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.3.4.tgz", + "integrity": "sha512-hvulFwtjUcagsis6BBxHwGFwWoNZjgYmULGVrZcyfNbjA8hKILbRxGg15/7w5HDyXHXUos/j6baAWqnCyQ2DWA==", "cpu": [ "arm64" ], - "libc": [ - "musl" - ], "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -323,15 +302,12 @@ } }, "node_modules/@img/sharp-libvips-linuxmusl-x64": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.3.2.tgz", - "integrity": "sha512-m0lrLiUt+lBYnCFr8qV/65yMR4E/c7/wf78I5eKTdkEakFAlZ9QlzEM3QIhhAwVeUhLAHLcCq7a7Vszq/oFNZQ==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.3.4.tgz", + "integrity": "sha512-6zXKeE/p39I1AmA3cJG35eyBGNqNddLnUXjhwBnsGjFPWqf5VKkDBEqaEkPDoTEtkxwi2vv8Tcr2mDyP4So7Fg==", "cpu": [ "x64" ], - "libc": [ - "musl" - ], "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -342,15 +318,12 @@ } }, "node_modules/@img/sharp-linux-arm": { - "version": "0.35.3", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.35.3.tgz", - "integrity": "sha512-affVWCTLooy8TSxbDx2qkzuDeaWLNVBA+P//FNBirHsXpP2fuBhk5AuboYUnrDnzoXes8GFjpTx0SBFOCRg+FA==", + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.35.5.tgz", + "integrity": "sha512-LEaXK2WdXVK5ykcw0buWyPMsmLLL2vpHLD6yrNSW+JGEL3BZPA4tpKN6iaMc4AxTTAoaX/sU1rOL51lcIz48ZQ==", "cpu": [ "arm" ], - "libc": [ - "glibc" - ], "license": "Apache-2.0", "optional": true, "os": [ @@ -363,19 +336,16 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-arm": "1.3.2" + "@img/sharp-libvips-linux-arm": "1.3.4" } }, "node_modules/@img/sharp-linux-arm64": { - "version": "0.35.3", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.35.3.tgz", - "integrity": "sha512-QgKDspHPnrU+GQ55XPhGwyhC8acLVOOSyAvo1oVfFmrIXLkDNmGWzAfDZ4xK8oSA1qBQrALcHX0G5UZni/SuFQ==", + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.35.5.tgz", + "integrity": "sha512-LYVx5JTsOM2CBzmxreh+nl64/3H6Xb09iSLknqH47z2T2DFFxDeFLP5y4dJwe6H7uGQlHPyEEtIqyo3DYsRwdQ==", "cpu": [ "arm64" ], - "libc": [ - "glibc" - ], "license": "Apache-2.0", "optional": true, "os": [ @@ -388,19 +358,16 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-arm64": "1.3.2" + "@img/sharp-libvips-linux-arm64": "1.3.4" } }, "node_modules/@img/sharp-linux-ppc64": { - "version": "0.35.3", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.35.3.tgz", - "integrity": "sha512-sMd8rDxmpLOwv/7N44klFjOD5DUO7FLdjiXDI0hoxYaf7Ar262dQIEkosE98bps+5HPLtp/EvNqeqQtOycP/IA==", + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.35.5.tgz", + "integrity": "sha512-QVxAAq8evVRI9ia2vqgwrmWucn5Dfv+JdWzj75pD8omHLPSP7f8p20O8jxzjCcuCEQEOtYOZUmX1hkiZ0kdevA==", "cpu": [ "ppc64" ], - "libc": [ - "glibc" - ], "license": "Apache-2.0", "optional": true, "os": [ @@ -413,19 +380,16 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-ppc64": "1.3.2" + "@img/sharp-libvips-linux-ppc64": "1.3.4" } }, "node_modules/@img/sharp-linux-riscv64": { - "version": "0.35.3", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.35.3.tgz", - "integrity": "sha512-0Eob78yjlYPfL5vMNWAW55l3R9Y6BQS/gOfe0ZcP9mEz9ohhKSt4im1hayiknXgf8AWrFqMvJcKIdmLmEe7yeQ==", + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.35.5.tgz", + "integrity": "sha512-LtdreXguaavKODPIfzJ4kffx7UNt1omwtK0rch4EBbbSTXPnxWmYSayXdLJw0fJzQ97kHt1gL/yh4tvU+nCyRQ==", "cpu": [ "riscv64" ], - "libc": [ - "glibc" - ], "license": "Apache-2.0", "optional": true, "os": [ @@ -438,19 +402,16 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-riscv64": "1.3.2" + "@img/sharp-libvips-linux-riscv64": "1.3.4" } }, "node_modules/@img/sharp-linux-s390x": { - "version": "0.35.3", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.35.3.tgz", - "integrity": "sha512-KgAxQ0DxpNOq1rG2t5cgTgShJFGSuU7XO45cqC+1NVOuZnP6tlgZRuSYOfNupGkHID0o3cJOsw4DVeJpMovcGw==", + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.35.5.tgz", + "integrity": "sha512-UZasTOFiYzotTsGOCu42BfUzP6Tu6Do/947iRm1RsLKvlllxwGcn4RN27LibGWceix4Y+Pmw3jsnTcCQIgWjqA==", "cpu": [ "s390x" ], - "libc": [ - "glibc" - ], "license": "Apache-2.0", "optional": true, "os": [ @@ -463,19 +424,16 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-s390x": "1.3.2" + "@img/sharp-libvips-linux-s390x": "1.3.4" } }, "node_modules/@img/sharp-linux-x64": { - "version": "0.35.3", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.35.3.tgz", - "integrity": "sha512-8pqvxubL2PGdhlPy6GLqzDYMUjyRmKAwKHYKixpdJYBUK7PJ0C029XdsnpFIdgRZG68fZiGdHVWcKPvtiPB4cA==", + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.35.5.tgz", + "integrity": "sha512-SxFtLTeJInhAA9Q836kux2vZNeOBQEx658qvbboZScr0wIARym3IcGmW7KpVD5sbVg0Ojy+udFQdayYIZyoNog==", "cpu": [ "x64" ], - "libc": [ - "glibc" - ], "license": "Apache-2.0", "optional": true, "os": [ @@ -488,19 +446,16 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-x64": "1.3.2" + "@img/sharp-libvips-linux-x64": "1.3.4" } }, "node_modules/@img/sharp-linuxmusl-arm64": { - "version": "0.35.3", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.35.3.tgz", - "integrity": "sha512-Vz0iQjzzcSX3HCbfwFfCSG/9SCIqyO0mH2sXyiHaAYfBk0cRsCWXRyQYX0ovCK/PAQBbTzQ0dsPQHh5MAFL59w==", + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.35.5.tgz", + "integrity": "sha512-9HbMclmI1zlNkFRs3z9/eBtDjfD0sGlrX1z6b1qwmiFY5ElDLh4BC0LPBdVp7z1DXFiKlIcznf+ZlsuZzLxQqg==", "cpu": [ "arm64" ], - "libc": [ - "musl" - ], "license": "Apache-2.0", "optional": true, "os": [ @@ -513,19 +468,16 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-arm64": "1.3.2" + "@img/sharp-libvips-linuxmusl-arm64": "1.3.4" } }, "node_modules/@img/sharp-linuxmusl-x64": { - "version": "0.35.3", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.35.3.tgz", - "integrity": "sha512-6O1NPKcDVj9QEdg7Hx549EX8U0rp6yXQERqru6yRN7fGBn32UvIRJUlWnk+8xDCiG76hXVBbX82NZ/ZKr0euIg==", + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.35.5.tgz", + "integrity": "sha512-4KOphqB035HrVdqLZfCgMzzERrQkkzOwRhl4OAkRO1YCldbaFjySXMaK534Mo0V+LndnlJk+sbUyLeU0ULyD1A==", "cpu": [ "x64" ], - "libc": [ - "musl" - ], "license": "Apache-2.0", "optional": true, "os": [ @@ -538,17 +490,17 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-x64": "1.3.2" + "@img/sharp-libvips-linuxmusl-x64": "1.3.4" } }, "node_modules/@img/sharp-wasm32": { - "version": "0.35.3", - "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.35.3.tgz", - "integrity": "sha512-cZ0XkcYGpHZkqW6iCkqTcmUC0CD9DhD5d/qeZlZkfRBn6GnHniZXLUo5+9xw8Iv76YE6LQFN9YNBlKREcCG76w==", + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.35.5.tgz", + "integrity": "sha512-Ptsga1su4tQx+LLF1ECS9U6nz5kmrXKo6XVbtR48Ke3ZRxxgaWBu7IDtEe1quo8hiupwm6WFqxVlXaSf7IINGQ==", "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", "optional": true, "dependencies": { - "@emnapi/runtime": "^1.11.1" + "@emnapi/runtime": "^1.11.3" }, "engines": { "node": ">=20.9.0" @@ -558,16 +510,16 @@ } }, "node_modules/@img/sharp-webcontainers-wasm32": { - "version": "0.35.3", - "resolved": "https://registry.npmjs.org/@img/sharp-webcontainers-wasm32/-/sharp-webcontainers-wasm32-0.35.3.tgz", - "integrity": "sha512-2rnq7bX3NzeR2T4YWgz8qiG4h3TSdMe+vN1iQXpJleSJ3SM5zQ8Fy2SyyXAWlbxpEZ2Y+Z4u1BePgJEYbSy80Q==", + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-webcontainers-wasm32/-/sharp-webcontainers-wasm32-0.35.5.tgz", + "integrity": "sha512-hfhF/FmoQyTUkA0bIKFOtw536BQSeBMe6BF6QyWlrPxT754+TFLaZ7sKKTfvvM0yJgKgaYTwnFCIZ/GuDw5SUA==", "cpu": [ "wasm32" ], "license": "Apache-2.0", "optional": true, "dependencies": { - "@img/sharp-wasm32": "0.35.3" + "@img/sharp-wasm32": "0.35.5" }, "engines": { "node": ">=20.9.0" @@ -577,9 +529,9 @@ } }, "node_modules/@img/sharp-win32-arm64": { - "version": "0.35.3", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.35.3.tgz", - "integrity": "sha512-4bPwFdMbeC4JQ8L8LOyWp6nsHcboP5fxkp6iPOXz2Vg49R42TuMs2whkJ5OAP4/Ul035qOzy0AecOF9VOscn4w==", + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.35.5.tgz", + "integrity": "sha512-X4t7g+7ZA5DKblCBEXGjUqqemj4vczING/5viFwAL8h4N3qYeyjwdCvRLHi4EdOUI+2Z7UFlp1VM+p/AuEtm6Q==", "cpu": [ "arm64" ], @@ -596,9 +548,9 @@ } }, "node_modules/@img/sharp-win32-ia32": { - "version": "0.35.3", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.35.3.tgz", - "integrity": "sha512-r53mXsBN6lFUDiST764SvgwUdHAqM4rPAiDzAmf4fLoB6X/rkfyTrLCg6+g17wJJiCmB3JYgHuUldCWUIRFSXw==", + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.35.5.tgz", + "integrity": "sha512-5Zm82LoBc43nhwNybZlG7Y1KO//Zhsn306fQl29ZOuStHLGTo3BWL83q3cznX0poxSAMuYL1On/BHBxkBeKr6A==", "cpu": [ "ia32" ], @@ -615,9 +567,9 @@ } }, "node_modules/@img/sharp-win32-x64": { - "version": "0.35.3", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.35.3.tgz", - "integrity": "sha512-D4y1vNeZrIIJCN+uHaWVtH86B+aCrdMYYjicy9pXHvbGZeGYLLSd3wdVuC37FxVXlU1ARsk84eKWfWMXGYEqvA==", + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.35.5.tgz", + "integrity": "sha512-x76eH0vEiHlcMQu8Y8IenntaACtddpT6W0wmXtWrnKcnKI7ME5DdgqhAD6SEWOEl1v2zDvkZDhFA9KnURwpfqg==", "cpu": [ "x64" ], @@ -1046,12 +998,12 @@ } }, "node_modules/@modelcontextprotocol/sdk": { - "version": "1.29.0", - "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.29.0.tgz", - "integrity": "sha512-zo37mZA9hJWpULgkRpowewez1y6ML5GsXJPY8FI0tBBCd77HEvza4jDqRKOXgHNn867PVGCyTdzqpz0izu5ZjQ==", + "version": "1.32.1", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.32.1.tgz", + "integrity": "sha512-2DdE+SJDtzLEEWzY1ZjY7Q+VcPhcV1KisD3zI4u0XZyktsjHum1mwbMI+JaulUBi2OZk+KJAi2uPXzxichPkdw==", "license": "MIT", "dependencies": { - "@hono/node-server": "^1.19.9", + "@hono/node-server": "^1.19.9 || ^2.0.5", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", @@ -1361,9 +1313,9 @@ "license": "ISC" }, "node_modules/content-disposition": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.1.0.tgz", - "integrity": "sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-2.0.1.tgz", + "integrity": "sha512-e+H0ZXHSWYrENhQzw1LPuP4oF5MzVKmDU6d3hxlvaPEYLLg62MxtQNPRx4SYSuYJSBUgnQIG4HIN2tEtNv7Dog==", "license": "MIT", "engines": { "node": ">=18" @@ -1609,15 +1561,15 @@ } }, "node_modules/express": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", - "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/express/-/express-5.3.0.tgz", + "integrity": "sha512-qCqy1xSoaugxOD4IVHb1ZWdkvCF2W3aE2okKouWj8VwJ+ztskSiXoBnCSJqfKT+cVPJhuJqe9YLbY425+Zh00g==", "license": "MIT", "dependencies": { "accepts": "^2.0.0", - "body-parser": "^2.2.1", - "content-disposition": "^1.0.0", - "content-type": "^1.0.5", + "body-parser": "^2.3.0", + "content-disposition": "^2.0.1", + "content-type": "^2.0.0", "cookie": "^0.7.1", "cookie-signature": "^1.2.1", "debug": "^4.4.0", @@ -1633,14 +1585,14 @@ "on-finished": "^2.4.1", "once": "^1.4.0", "parseurl": "^1.3.3", - "proxy-addr": "^2.0.7", - "qs": "^6.14.0", + "proxy-addr": "^2.0.8", + "qs": "^6.16.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", + "type-is": "^2.1.0", "vary": "^1.1.2" }, "engines": { @@ -1669,6 +1621,19 @@ "express": ">= 4.11" } }, + "node_modules/express/node_modules/content-type": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.1.0.tgz", + "integrity": "sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -1676,9 +1641,9 @@ "license": "MIT" }, "node_modules/fast-uri": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.4.tgz", - "integrity": "sha512-8JnbkQ4juDyvYs4mgFGQqg4yCYtFDtUtmp2QIQq11ZZe5CFQ5wcqm1rqDgAh/QdMySuBnPzMUiJUNZG5N/AiQw==", + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.8.tgz", + "integrity": "sha512-GZMtZUTNRpOVIECoXwLNZS5xUGE+mVNbTB8h/7Rwh2TFWcBQiPzTgyZi05BF9UMZKkLJv8XBRJTlU7zg8+ZfMg==", "funding": [ { "type": "github", @@ -1865,9 +1830,9 @@ } }, "node_modules/hono": { - "version": "4.12.30", - "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.30.tgz", - "integrity": "sha512-emn+JoJjrN9YTpRDS5it/UI2SO9BAE37T6I3d963RxcZ81G9A4pr2SZTEiiaiKbzx+NKRg5BZ89fCL7gCJCUog==", + "version": "4.13.13", + "resolved": "https://registry.npmjs.org/hono/-/hono-4.13.13.tgz", + "integrity": "sha512-CQ46U0ZkAGmbT/4UxdzzGJpacP2IeKgY4a5/tOI9AABbpOMfK739wfDXmv1usCk+3RkKj1hQy4/fjhiwa2xlrA==", "license": "MIT", "engines": { "node": ">=16.9.0" @@ -1963,9 +1928,9 @@ "license": "ISC" }, "node_modules/ip-address": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.2.0.tgz", - "integrity": "sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA==", + "version": "10.7.4", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.7.4.tgz", + "integrity": "sha512-DWBMKyeM25D70nrIiTkgQth59/G+naKOTep6huF9j+GmeK3DMD60Zvxg5d5qQnz+38AHgou6ean2LECX+lrKDg==", "license": "MIT", "engines": { "node": ">= 12" @@ -2423,9 +2388,9 @@ } }, "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==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.8.tgz", + "integrity": "sha512-5nnx0yGyVUcY6t9RnWcARWtwT9F1D8O9rt08htPvnd49W1IgZtmLkhu9WfMzQj1cFxjHIO6connUNVW5k7AVyQ==", "license": "MIT", "dependencies": { "forwarded": "0.2.0", @@ -2433,6 +2398,10 @@ }, "engines": { "node": ">= 0.10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/pump": { @@ -2446,9 +2415,9 @@ } }, "node_modules/qs": { - "version": "6.15.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.3.tgz", - "integrity": "sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==", + "version": "6.16.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.16.0.tgz", + "integrity": "sha512-h6fhOIaRrID2CbEY2fqs+7t+UXZo+MLAnU5gRIq85uFtdiUPCdsApMlHhXogKVM4HM2DVbIjGNTTYH2OcmP1vA==", "license": "BSD-3-Clause", "dependencies": { "es-define-property": "^1.0.1", @@ -2644,9 +2613,9 @@ "license": "ISC" }, "node_modules/sharp": { - "version": "0.35.3", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.35.3.tgz", - "integrity": "sha512-ej0zVHuZGHCiABXcNxeYhpRnPNPAcvbG8RMdBAhDAxLKkCRVSpK3Iyu7qbqw3JMzoj0REeM6f3tJLtVwl0023Q==", + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.35.5.tgz", + "integrity": "sha512-Ywn4OnzGukp7CDMrp08RQ50YKmuwG47brZgIVPTvBaaAfQlRlygrRqSrxdCiL9M+LlzLBiJ68IR1QqvzHyjC7g==", "license": "Apache-2.0", "dependencies": { "@img/colour": "^1.1.0", @@ -2660,31 +2629,31 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-darwin-arm64": "0.35.3", - "@img/sharp-darwin-x64": "0.35.3", - "@img/sharp-freebsd-wasm32": "0.35.3", - "@img/sharp-libvips-darwin-arm64": "1.3.2", - "@img/sharp-libvips-darwin-x64": "1.3.2", - "@img/sharp-libvips-linux-arm": "1.3.2", - "@img/sharp-libvips-linux-arm64": "1.3.2", - "@img/sharp-libvips-linux-ppc64": "1.3.2", - "@img/sharp-libvips-linux-riscv64": "1.3.2", - "@img/sharp-libvips-linux-s390x": "1.3.2", - "@img/sharp-libvips-linux-x64": "1.3.2", - "@img/sharp-libvips-linuxmusl-arm64": "1.3.2", - "@img/sharp-libvips-linuxmusl-x64": "1.3.2", - "@img/sharp-linux-arm": "0.35.3", - "@img/sharp-linux-arm64": "0.35.3", - "@img/sharp-linux-ppc64": "0.35.3", - "@img/sharp-linux-riscv64": "0.35.3", - "@img/sharp-linux-s390x": "0.35.3", - "@img/sharp-linux-x64": "0.35.3", - "@img/sharp-linuxmusl-arm64": "0.35.3", - "@img/sharp-linuxmusl-x64": "0.35.3", - "@img/sharp-webcontainers-wasm32": "0.35.3", - "@img/sharp-win32-arm64": "0.35.3", - "@img/sharp-win32-ia32": "0.35.3", - "@img/sharp-win32-x64": "0.35.3" + "@img/sharp-darwin-arm64": "0.35.5", + "@img/sharp-darwin-x64": "0.35.5", + "@img/sharp-freebsd-wasm32": "0.35.5", + "@img/sharp-libvips-darwin-arm64": "1.3.4", + "@img/sharp-libvips-darwin-x64": "1.3.4", + "@img/sharp-libvips-linux-arm": "1.3.4", + "@img/sharp-libvips-linux-arm64": "1.3.4", + "@img/sharp-libvips-linux-ppc64": "1.3.4", + "@img/sharp-libvips-linux-riscv64": "1.3.4", + "@img/sharp-libvips-linux-s390x": "1.3.4", + "@img/sharp-libvips-linux-x64": "1.3.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.3.4", + "@img/sharp-libvips-linuxmusl-x64": "1.3.4", + "@img/sharp-linux-arm": "0.35.5", + "@img/sharp-linux-arm64": "0.35.5", + "@img/sharp-linux-ppc64": "0.35.5", + "@img/sharp-linux-riscv64": "0.35.5", + "@img/sharp-linux-s390x": "0.35.5", + "@img/sharp-linux-x64": "0.35.5", + "@img/sharp-linuxmusl-arm64": "0.35.5", + "@img/sharp-linuxmusl-x64": "0.35.5", + "@img/sharp-webcontainers-wasm32": "0.35.5", + "@img/sharp-win32-arm64": "0.35.5", + "@img/sharp-win32-ia32": "0.35.5", + "@img/sharp-win32-x64": "0.35.5" }, "peerDependenciesMeta": { "@types/node": { diff --git a/package.json b/package.json index 9fd0796..f6be72d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@gatemcp/cli", - "version": "0.5.7", + "version": "0.5.8", "description": "Local context compression and repository navigation for MCP clients, with per-result measurements, multi-language AST views, graphs, TOON, and OCR.", "type": "module", "main": "dist/main.js", @@ -85,7 +85,7 @@ "@modelcontextprotocol/sdk": "^1.12.1", "gpt-tokenizer": "^2.8.1", "jimp": "^1.6.0", - "sharp": "0.35.3", + "sharp": "0.35.5", "tesseract.js": "5.1.1", "tree-sitter": "0.21.1", "tree-sitter-javascript": "0.23.1", @@ -144,11 +144,11 @@ "tree-sitter-yaml@0.5.0": true, "tree-sitter-cli@0.23.2": true, "tree-sitter-c@0.23.2": true, - "sharp@0.35.3": true + "sharp@0.35.5": true }, "overrides": { - "hono": "4.12.30", - "qs": "6.15.3", + "hono": "4.13.13", + "qs": "6.16.0", "tree-sitter-c": "0.23.2", "tree-sitter-cli": "0.23.2", "@hono/node-server": "2.0.11" diff --git a/plugins/gatemcp/.codex-plugin/plugin.json b/plugins/gatemcp/.codex-plugin/plugin.json index e3b7314..5a30bc4 100644 --- a/plugins/gatemcp/.codex-plugin/plugin.json +++ b/plugins/gatemcp/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "gatemcp", - "version": "0.5.7+codex.20260725095358", + "version": "0.5.8+codex.20261012002917", "description": "Local MCP context compression, repository graph navigation, and measurable token savings for Codex.", "author": { "name": "Gate MCP contributors", diff --git a/plugins/gatemcp/.mcp.json b/plugins/gatemcp/.mcp.json index 3ec20d7..4da8e79 100644 --- a/plugins/gatemcp/.mcp.json +++ b/plugins/gatemcp/.mcp.json @@ -7,7 +7,7 @@ "--yes", "--strict-allow-scripts", "--allow-scripts=better-sqlite3,sharp,tesseract.js,tree-sitter,tree-sitter-bash,tree-sitter-c,tree-sitter-c-sharp,tree-sitter-cli,tree-sitter-cpp,tree-sitter-css,tree-sitter-go,tree-sitter-html,tree-sitter-java,tree-sitter-javascript,tree-sitter-json,tree-sitter-kotlin,tree-sitter-php,tree-sitter-python,tree-sitter-ruby,tree-sitter-rust,tree-sitter-svelte,tree-sitter-swift,tree-sitter-typescript,tree-sitter-vue,tree-sitter-yaml", - "--package=@gatemcp/cli@0.5.7", + "--package=@gatemcp/cli@0.5.8", "--", "gatemcp" ] diff --git a/scripts/qa-consumer-html-install.mjs b/scripts/qa-consumer-html-install.mjs index 1dd66fe..75558e4 100644 --- a/scripts/qa-consumer-html-install.mjs +++ b/scripts/qa-consumer-html-install.mjs @@ -1,12 +1,12 @@ #!/usr/bin/env node /** - * Consumer install proof: pack (or fetch) @gatemcp/cli@0.5.7 and exercise it + * Consumer install proof: pack (or fetch) @gatemcp/cli@0.5.8 and exercise it * against the HTML/CSS/JS fixture as a fresh project — not the Gate source tree. * * Usage: * node scripts/qa-consumer-html-install.mjs - * GATE_CONSUMER_PACKAGE=@gatemcp/cli@0.5.7 node scripts/qa-consumer-html-install.mjs - * GATE_CONSUMER_PACKAGE=file:./gatemcp-cli-0.5.7.tgz node ... + * GATE_CONSUMER_PACKAGE=@gatemcp/cli@0.5.8 node scripts/qa-consumer-html-install.mjs + * GATE_CONSUMER_PACKAGE=file:./gatemcp-cli-0.5.8.tgz node ... */ import assert from "node:assert/strict"; @@ -29,7 +29,7 @@ fs.cpSync(fixtureSrc, projectRoot, { recursive: true }); const cacheDb = path.join(projectRoot, ".gate-mcp", "cache.db"); fs.mkdirSync(path.dirname(cacheDb), { recursive: true }); -const expectedVersion = "0.5.7"; +const expectedVersion = "0.5.8"; let packageSpec = process.env.GATE_CONSUMER_PACKAGE?.trim(); function run(cmd, args, opts = {}) { diff --git a/scripts/qa-multi-repo-proof.mjs b/scripts/qa-multi-repo-proof.mjs index 46fc162..e305b99 100644 --- a/scripts/qa-multi-repo-proof.mjs +++ b/scripts/qa-multi-repo-proof.mjs @@ -218,6 +218,11 @@ try { ); assert.equal(statsOk.billingScope, "tool_payload_only"); assert.ok(statsOk.cachePartition, "missing cachePartition"); + assert.equal( + statsOk.cachePartition, + fs.realpathSync.native(parent), + "cachePartition must match canonical GATE_PROJECT_ROOT (/var vs /private/var)" + ); const statsEmpty = toolBody( await send("tools/call", { diff --git a/scripts/test-mcp-acceptance.mjs b/scripts/test-mcp-acceptance.mjs index 7c48076..a2d9068 100644 --- a/scripts/test-mcp-acceptance.mjs +++ b/scripts/test-mcp-acceptance.mjs @@ -11,7 +11,9 @@ const repositoryRoot = path.resolve(import.meta.dirname, ".."); const { countTextTokens } = await import( path.join(repositoryRoot, "dist/lib/tokenCounter.js") ); -const fixtureRoot = fs.mkdtempSync(path.join(os.tmpdir(), "gatemcp-acceptance-")); +const fixtureRoot = fs.realpathSync.native( + fs.mkdtempSync(path.join(os.tmpdir(), "gatemcp-acceptance-")), +); const cachePath = path.join(fixtureRoot, ".gate-mcp", "acceptance-cache.db"); fs.mkdirSync(path.dirname(cachePath), { recursive: true }); diff --git a/src/test.ts b/src/test.ts index ca88dac..c4c7ed5 100644 --- a/src/test.ts +++ b/src/test.ts @@ -32,6 +32,7 @@ import { isMemoryPersistent, _resetMemoryDbForTests, } from "./lib/memoryDb.js"; +import { canonicalizePath } from "./lib/pathGuard.js"; const DIVIDER = "═".repeat(60); const PASS = "✅"; @@ -1091,7 +1092,9 @@ async function runTests(): Promise { const algoSmc = "/Users/macbookair/Documents/Visual Studio Code/Python/AlgoTrading/crypto/strategies/active/smc"; if (fs.existsSync(path.join(algoSmc, "graphify-out/GRAPH_REPORT.md"))) { console.error(`\n${INFO} Test 34: AlgoTrading SMC graphify_search OrderManager`); + const prevAlgoRoot = process.env.GATE_PROJECT_ROOT; try { + process.env.GATE_PROJECT_ROOT = algoSmc; const result = await handleGraphQuery({ projectRoot: algoSmc, query: "OrderManager", @@ -1107,6 +1110,9 @@ async function runTests(): Promise { } catch (err) { console.error(` ${FAIL} Error: ${err}`); failed++; + } finally { + if (prevAlgoRoot === undefined) delete process.env.GATE_PROJECT_ROOT; + else process.env.GATE_PROJECT_ROOT = prevAlgoRoot; } } else { console.error(`\n${INFO} Test 34: skipped (AlgoTrading SMC graph not on this machine)`); @@ -1280,7 +1286,7 @@ async function runTests(): Promise { !config.args .find((arg) => arg.startsWith("--allow-scripts=")) ?.includes("better-sqlite3") || - !config.args.includes("--package=@gatemcp/cli@0.5.7") || + !config.args.includes("--package=@gatemcp/cli@0.5.8") || config.args.slice(-2).join(" ") !== "-- gatemcp" ) { throw new Error("plugin server command is not an explicit pinned npm exec"); @@ -1406,9 +1412,10 @@ async function runTests(): Promise { if (statsScoped.billingScope !== "tool_payload_only") { throw new Error("session_stats missing billingScope"); } - if (statsScoped.cachePartition !== tmpParent) { + const expectedPartition = canonicalizePath(tmpParent); + if (statsScoped.cachePartition !== expectedPartition) { throw new Error( - `cachePartition should be GATE_PROJECT_ROOT (${tmpParent}), got ${statsScoped.cachePartition}` + `cachePartition should be GATE_PROJECT_ROOT (${expectedPartition}), got ${statsScoped.cachePartition}` ); } const statsWrong = await handleSessionStats({ projectRoot: lockedRoot }); @@ -1710,8 +1717,8 @@ async function runTests(): Promise { if (init.toolMode !== "catalog" && init.toolMode !== "full") { throw new Error(`unexpected toolMode ${init.toolMode}`); } - if (init.version !== "0.5.7") { - throw new Error(`expected version 0.5.7 got ${init.version}`); + if (init.version !== "0.5.8") { + throw new Error(`expected version 0.5.8 got ${init.version}`); } console.error(` ${PASS} toolMode=${init.toolMode} version=${init.version}`); passed++; diff --git a/src/tools/help.ts b/src/tools/help.ts index 0785a0e..b9c37ed 100644 --- a/src/tools/help.ts +++ b/src/tools/help.ts @@ -359,7 +359,7 @@ export async function handleHelp(args: HelpInput): Promise { // Directory mode — list all tools with one-line descriptions if (!tool || tool === "all" || tool === "directory") { const directory = [ - "# gatemcp Tool Directory (v0.5.7)", + "# gatemcp Tool Directory (v0.5.8)", "", "| Tool | Purpose |", "|---|---|", diff --git a/src/version.ts b/src/version.ts index 7d66752..5f0396e 100644 --- a/src/version.ts +++ b/src/version.ts @@ -1,2 +1,2 @@ /** Single source for gatemcp release version (MCP server + tools). */ -export const GATEMCP_VERSION = "0.5.7"; +export const GATEMCP_VERSION = "0.5.8";