Skip to content

v2.5.0

Latest

Choose a tag to compare

@karlkfi karlkfi released this 03 Aug 17:27

Production-target guard rails for Claude Code Bash commands.

Note

The guard itself did not change this release. scripts/bash-prod-guard.py and hooks/hooks.json are byte-identical to v2.4.1 — verified by diff at both tags, not asserted from memory. Every change below is in the optional /prod-guard:friction-report command.

Highlights

The friction report now flags a stale install. prod-guard installs from a third-party marketplace, and Claude Code auto-updates official Anthropic marketplaces only — so the version you installed stays pinned until you act. For a guard plugin that pin has teeth: a stale classifier is missing later false-negative fixes, not just conveniences. The report is where you already look when the guard annoys you, so it is where the lag now shows:

⚠  prod-guard 1.1.0 installed, 2.4.1 available in the local marketplace clone.

That is not a hypothetical version pair. The author's own machine ran 1.1.0 while the repo shipped 2.x, a full major version behind, missing the shell-variable-expansion classifier and more.

Important

The comparison is local-only, so no warning means "no lag against the clone you have" — not "up to date". It reads the marketplace clone on disk, never GitHub. If it has been a while, run claude plugin marketplace update prod-guard first, then re-run the report.

A 23k all-guard count no longer reads as 23k prod-guard prompts. Under --plugin all the header still said "prod-guard decisions analyzed" while the total spanned every guard installed. The label now follows the scope actually counted — all-guard for all, the guard's own name otherwise — in both the totals header and the no-results line.

Upgrading

No action required, and nothing to re-vet. No hook decision, verb table, or covered tool moved, so a config you tuned against v2.4.1 behaves identically here.

claude plugin marketplace update prod-guard
claude plugin update prod-guard@prod-guard

Restart to apply. Both commands work headlessly and share Claude Desktop's plugin state, so they update a Desktop install too. Better still, set autoUpdate for the marketplace once and stop doing this by hand — see Keeping it updated, which is also what the new warning links you to.

Everything since v2.4.1

Two product changes. Both land in scripts/friction-report.py.

New features (1)

  • Warn when the installed plugin lags the local marketplace clone by @karlkfi in #34 (Q13)

Fixes (1)

  • Name the reported scope in the friction report header by @karlkfi in #33 (Q14)

New configuration (1)

Nothing here is required; it defaults to the previous behaviour.

  • --plugins-dir (default ~/.claude/plugins) — points the staleness check at a different plugins directory. Exists mostly so the end-to-end tests never touch a developer's real ~/.claude/plugins.

Validation

410 tests pass, up from 389 at v2.4.1 — all 21 new ones covering the staleness check and the scope label. Stdlib unittest, no third-party dependencies, run on Python 3.10 through 3.13 in CI:

python3 -m unittest discover tests

The staleness check degrades rather than breaks: a missing, unreadable, or unparseable manifest produces no warning instead of a traceback, and it is skipped entirely under --plugin all, where there is no single plugin to check.

Privacy

Still no telemetry, no network calls, and nothing written to disk. The friction report reads two more local files than it did at v2.4.1 — ~/.claude/plugins/installed_plugins.json and known_marketplaces.json — plus the marketplace clone's own plugin.json, taking only version strings and the clone path. All three are state Claude Code already persists locally.

PRIVACY.md is updated to say so. Nothing leaves your machine.

Full changelog: v2.4.1...v2.5.0