v2.2.0
[2.2.0] — 2026-04-18
The install-parity and hardening release. Bundle-aware installs reach every platform (not just Claude Code's native marketplace), hook scripts get a ShellCheck-clean CI gate, and a JSON-injection bug in the plan-execution edit log is fixed.
Added
- Bundle-aware
install.sh. New flags--bundle NAME,--skills a,b,c, and--list-bundlesbring Codex / Antigravity / manual installs to parity with Claude's plugin marketplace.--bundleaccepts short (process-protocols) and long (etyb-process-protocols) forms. Default behaviour (no flag) is unchanged — every skill on disk is installed. - Bundle generator (
scripts/generate-bundles.py). Reads.claude-plugin/marketplace.jsonand emitsbundles/<plugin>.txtsoinstall.shstays dependency-free.--checkmode is wired into CI to enforce that generated manifests never drift from the marketplace definition. - CI workflow (
.github/workflows/ci.yml). ShellCheck across every.shwith no severity exclusions, hook regression tests, bundle drift check, and installer tests — all on every PR and push to main. - Regression test for the hook JSON-injection fix (
tests/hooks/test-post-edit-log-json-escaping.sh). Firespost-edit-log.shwith hostile payloads and asserts the log stays well-formed. - Installer tests (
tests/install/test-install-flags.sh). Happy paths for each new flag, all three error paths, and one real non-dry-run install to confirm bundles copy exactly the expected directories.
Fixed
- Log injection in
post-edit-log.sh. The hook previously splatted file paths, task IDs, and plan names straight into a JSON heredoc. A filename containing a quote, backslash, or newline corruptededit-log.jsonlor let an attacker forge log entries. Fields are now JSON-escaped before write. Flagged as High Risk by Gen on skills.sh; Socket and Snyk had passed. pre-commit-review-check.shfailed to parse. Twoifblocks were closed withdoneinstead offi. Withset -euo pipefailat the top the script errored on every invocation — meaning the pre-commit review reminder never fired since it shipped.- Silent glob shadowing in
pre-edit-check.sh. Earlier glob patterns in the config-file skip list (*.config.*,*.mod,*.sum) shadowed later explicit entries (jest.config.*,vitest.config.*,go.mod,go.sum). Collapsed into a single arm that reflects real coverage. - Unquoted pattern expansion in
post-edit-log.sh's${FILE_PATH#$PROJECT_ROOT/}— stripping failed when the path contained glob metacharacters. - Version drift.
.claude-plugin/marketplace.jsonand.claude-plugin/plugin.jsonhad been stuck at2.0.0through the2.1.0release; skill counts said "31" in two places and "30" elsewhere. All version fields now trackVERSIONand all skill counts read30.
Changed
- Docs updated. README and
docs/installation.mddocument the new--bundle,--skills,--list-bundlesflags and list the four bundles (full,process-protocols,core-team,verticals) with skill counts. install-codex-runtime.shcleanup. Dropped an unusedFORCEvariable;--forceeffect is carried byON_CONFLICT="replace"alone.