Releases: eralpozcan/vision-squeezer
Releases · eralpozcan/vision-squeezer
Release list
v0.6.1
Added
- OpenCode, Gemini CLI, and Kimi CLI installer support.
npx vision-squeezer install --client <opencode|gemini|kimi>now covers three more MCP clients:- OpenCode —
opencode mcp addis interactive-only (no flags), so the installer writes the MCP entry directly intoopencode.json(global~/.config/opencode/opencode.jsonor project-root). Nolocalscope. - Gemini CLI —
gemini mcp add --scope X vision-squeezer -- npx -y vision-squeezer@<version>. Nolocalscope (user/projectonly, writessettings.json). - Kimi CLI —
kimi mcp add vision-squeezer -- npx -y vision-squeezer@<version>. No scope flag at all — always writes the single global~/.kimi/mcp.json.
- OpenCode —
v0.6.0
Added
- PyPI distribution. The Python bindings (
pip install vision-squeezer) now publish to PyPI on everyv*tag viapython.yml, using GitHub Trusted Publishing (OIDC) — no API token. Wheels for linux x86_64/aarch64, macOS arm64, Windows x64, plus an sdist.
Changed
- MCP registry publish is now automated.
release.ymlsubmitsserver.jsonto registry.modelcontextprotocol.io viamcp-publisher+ GitHub OIDC, replacing the manual step that previously left the manifest stale.
v0.5.0
Added
optimize_image_batchMCP tool — optimize up to 64 images in a single tool call. Each entry takes the same arguments asoptimize_image; the response is a per-imageresultsarray. A failing image yields an{ "ok": false, "error": ... }entry without aborting the batch. Eliminates per-image round-trips when an agent processes galleries or document sets.
Security
- Bounded image decode (decompression-bomb / OOM guard).
decode_base64_imagenow caps base64 input length and decodes throughimage::Limits(max 16384px per dimension, 100 MP, RGBA allocation ceiling). A crafted, tiny-on-disk image declaring enormous dimensions can no longer exhaust memory on the MCP server. Covers bothoptimize_imageandsandbox_execute, which share this decode path. (OWASP A03/A05.)
v0.4.0
Added
- Three new provider targets for token estimation and dimension snapping:
llama,qwen,deepseek(CLI--model, MCPtarget_model).- Llama 3.2 / 3.3 Vision (Mllama) — 560×560 tiles, aspect-ratio canvas capped at 4 tiles, ~1601 tokens/tile. Source:
transformersMllamaVisionConfig. (Llama 4's native-multimodal vision encoder is a different scheme and is not modeled.) - Qwen2-VL / 2.5-VL / 3-VL — 28px effective grid (14px patch × 2×2 merge),
tokens = (W/28)·(H/28)bounded to[4, 16384]. Source:qwen_vl_utils.smart_resize. - DeepSeek-VL2 — SigLIP-SO400M-384 + 2× pixel-shuffle (14×14 = 196 tokens/tile), anyres
(m·384, n·384)canvas withm·n ≤ 9; exact token layout210 (global) + 1 (separator) + (nh·14)·(nw·14 + 1). Source: DeepSeek-VL2 paper §2 (arXiv:2412.10302, 13 Dec 2024) + reference processor. Open-weights; the win is local-inference context, not API billing.
- Llama 3.2 / 3.3 Vision (Mllama) — 560×560 tiles, aspect-ratio canvas capped at 4 tiles, ~1601 tokens/tile. Source:
- Documentation site rebuilt on Nuxt UI + Nuxt Content (multi-page, auto sitemap / llms.txt / OG images). New per-provider pages with exact formulas, cited primary sources, verification dates, and proportional savings tables.
Notes
- Formula constants were verified against primary sources (model configs, reference tokenizer code, technical reports) on 2026-06-11. Hosted-API per-tile billing can differ from a model's own token footprint — treat absolute numbers as indicative and the tile/patch counts as authoritative.
v0.3.5
Fixed
postinstall.jsno longer overwrites skills with stale inline content. Pre-0.3.5 versions hardcoded the SKILL.md text as JS string literals insideinstallSkills(), so everynpm install/npx -y vision-squeezerclobbered~/.claude/skills/vision-*/SKILL.mdwith the v0.3.0-era wording — including the false "Status: ✅ Using npx — always latest, no action needed" line that masked broken installs across the entire 0.3.x debugging session. The function now reads from the bundledplugins/vision-squeezer-mcp/skills/<name>/SKILL.mdfiles shipped in the npm tarball, so both install paths (npm + Claude Code plugin marketplace) share one on-disk source of truth.plugins/vision-squeezer-mcp/.mcp.jsonis now version-pinned. The plugin marketplace registration wasnpx -y vision-squeezer(unpinned), so users who installed via/plugin install vision-squeezer-mcp@vision-squeezergot the same npx cache-freeze bug the installer was already protecting against on its own path. Now reads["-y", "vision-squeezer@<VERSION>"]. The release invariants inCLAUDE.mdrequire this file to be bumped in lockstep withpackage.json.vision-doctor+vision-upgradeMCP probes now run withcwd=$HOME. When the probe ran from the user's current shell cwd and the user happened to be inside thevision-squeezerproject directory (whosepackage.jsonisname: vision-squeezer),npxdetected the local package, skipped the install step, and the probe false-negatived withsh: vision-squeezer: command not found. Pinning the subprocess cwd to$HOMEguarantees a neutral resolution context.
Changed
CLAUDE.mdrelease invariants expanded to document the.mcp.jsonpinning rule (with agrepinvariant for verification), the probe-cwd requirement, and the prohibition on inline SKILL.md content inpostinstall.js. These all come from concrete bugs hit in 0.3.0–0.3.4.
v0.3.4
Changed
- Plugin marketplace consolidated to a single plugin. Previously the marketplace listed four separate plugins:
vision-squeezer-mcpfor the MCP server and three standalone plugins (vision-doctor,vision-upgrade,vision-stats) for the skills. End users had to run four/plugin installcommands to get the full experience, and most stopped after the first — they then saw stale skill output (the marketplace cache was fresh, but the un-installed skills were shadowed by older user-level copies). The four plugin entries are now collapsed into onevision-squeezer-mcpplugin that bundles the MCP server and all three skills./plugin install vision-squeezer-mcp@vision-squeezeris now the complete install. - The three skill directories moved from
skills/<name>/(repo root) toplugins/vision-squeezer-mcp/skills/<name>/so they ship inside the plugin's source directory.
Breaking
- Users who previously installed any of
vision-doctor@vision-squeezer,vision-upgrade@vision-squeezer, orvision-stats@vision-squeezeras standalone plugins will see them disappear from the marketplace after/plugin marketplace update vision-squeezer. The same skills are now reachable by installing (or updating)vision-squeezer-mcp@vision-squeezer. Cleanup:/plugin remove vision-doctor@vision-squeezer /plugin remove vision-upgrade@vision-squeezer /plugin remove vision-stats@vision-squeezer /plugin update vision-squeezer-mcp@vision-squeezer - Older user-level skill copies at
~/.claude/skills/vision-{doctor,upgrade,stats}/will shadow the bundled versions. Delete them after upgrading:rm -rf ~/.claude/skills/vision-doctor ~/.claude/skills/vision-upgrade ~/.claude/skills/vision-stats.
v0.3.3
Fixed
- npm tarball trimmed from 29 MB → 16 kB. The consolidated
publishjob in 0.3.2 downloaded GitHub Release artifacts intoartifacts/anddist/before invokingnpm publish, so npm packed the platform binaries (and a stale bundled macOS binary) into the npm tarball..gitignoreis not always honored by npm pack — add an explicitfilesallowlist inpackage.jsonlisting onlybin/install.js,bin/run.js, andpostinstall.js. The runtime binary is still downloaded bypostinstall.jsfrom the GitHub Release on install. vision-squeezer installnow pins the MCP version. Old:claude mcp add vision-squeezer -- npx -y vision-squeezer. New:claude mcp add vision-squeezer -- npx -y vision-squeezer@<PKG_VERSION>. Without the@versionsuffix, npm's~/.npm/_npxcache freezes users on whatever tarball was first resolved — multiple "MCP failed to connect" reports trace back to this. The pinned version busts the cache on every upgrade.
Changed
vision-upgradeskill rewritten for self-healing recovery. Now flushes~/.npm/_npx, re-registers the MCP with the latest pinned version, and runs a realinitializeprobe against the registered command.--forcemode wipes the cache and re-registers across all scopes. Replaces the previous version which falsely claimed npx users were "always on latest" (true before pinning, no longer true after).vision-doctorskill rewritten for accurate, actionable diagnostics. Distinguishescargo/npm-global/npx-pinned/npx-unpinnedinstall modes, parses the pinned version out of the MCP registration, and actively probes the registered command via a JSON-RPCinitializerequest (portablepython3timeout — macOS has no GNUtimeout). Failures surface the captured stderr verbatim and end with a one-line fix:vision-upgradeorvision-upgrade --force.CLAUDE.mdrestructured: behavioral guidelines (Think Before Coding / Simplicity / Surgical Changes / Goal-Driven Execution) up top, project context (commands, architecture, release invariants, installer contract) below.
v0.3.2
Fixed
- Release pipeline:
cargo publishno longer trips on the dirty working tree — when the three publish jobs were collapsed into one runner in 0.3.1, thedownload-artifactstep leftartifacts/anddist/as untracked files in the checkout.cargo publishrefuses to run against a dirty git tree, so the crates.io step failed and the subsequentnpm publishstep never ran (both registries stayed pinned at 0.3.0 even though the GitHub Release for v0.3.1 was created). Reordered the steps socargo publishruns first against a clean tree, then artifacts are downloaded for the GitHub Release + npm publish. Also added/artifacts/and/dist/to.gitignoreas belt-and-suspenders in case the step order is ever shuffled.
Note
- crates.io and npm have a 0.3.1 gap; both go from 0.3.0 → 0.3.2. The GitHub Release for v0.3.1 (binaries only) remains. No functional changes between 0.3.1 and 0.3.2 — this is purely a release-pipeline fix.
v0.3.1
Changed
release.ymlcollapsed three jobs into one —release,publish-crates, andpublish-npmpreviously ran on three separate runners. Each step is sub-minute work, so two of those runners were paying the ~30s boot cost for nothing. They're now sequential steps in a singlepublishjob (saves ~1 minute of wall-clock per tag and avoids the multi-runner artifact-download dance).python.ymlno longer auto-builds on tags — PyPI publishing is still commented out in this file, so every tag was producing five sets of wheels that nothing consumed. Switched the trigger toworkflow_dispatchonly; re-enable the tag trigger once PyPI publishing is wired up.
v0.3.0
Fixed
- MCP: notifications no longer get a response —
notifications/initialized(and any other JSON-RPC notification) is now correctly handled as a notification per the spec. Previously the server required anidfield on every request, which caused notifications to fail parsing and emit a spuriousparse errorreply. Some clients interpreted that as a protocol failure, leading to ~30s connect timeouts on cold start.
Added
npx vision-squeezer install— interactive installer that prompts for the target CLI (Claude Code / Codex / Qwen), install method (plugin/mcp-add), and install scope (user/local/project), then runs the matching command. Use--client/--method/--scope/--yesflags for non-interactive setups.vision-squeezer-mcpClaude Code plugin — bundles the MCP server config so users can install everything in one shot via/plugin install vision-squeezer-mcp@vision-squeezer. No manualclaude mcp addrequired. Lives underplugins/vision-squeezer-mcp/and is listed in.claude-plugin/marketplace.json.
Changed
- README install section — leads with the plugin marketplace one-liner; documents the three
mcp addscopes (user,local,project) explicitly instead of defaulting silently tolocal. - Plugin marketplace versions synced to crate/npm version (0.1.9 → 0.3.0).
- CI cost reductions —
ci.ymlmergedtest+lintinto a singlecheckjob (saves one runner spin-up per push), addedpaths-ignorefor docs/markdown changes, and addedconcurrency.cancel-in-progressso superseded PR pushes are killed.release.ymlandpython.ymlgot the sameconcurrencyblock to cancel re-tagged builds. Artifact retention dropped from the 90-day default to 7–14 days.python.ymltrimmed Python interpreters from3.8..3.13to3.10..3.13(3.8/3.9 are EOL) and dropped the Intel-macOS target (macos-latestis arm64 only — Intel would be billed at 10× the Linux rate).