Addresses review feedback on #576:
- convert.sh: feed the base64 payload to jq via --rawfile (temp file) instead
of --arg, so inputs larger than ~96KB no longer hit the OS per-argument
limit (MAX_ARG_STRLEN). Verified with a 164KB input (219KB base64).
- convert.sh: reject absolute and home-relative (~) user-supplied output paths
in addition to traversal, since OUT is written with curl -o. The auto-derived
default still works for absolute inputs (validation only applies to an
explicit output arg).
- docs: add file-conversion to docs/plugins.md (Utilities, now 5) and bump the
plugin count 84 -> 85 (83 local + 2 external) across README.md, AGENTS.md,
ARCHITECTURE.md, docs/architecture.md, docs/plugins.md, docs/usage.md.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- .claude-plugin/marketplace.json: revert incidental unicode-escape
normalizations on unrelated plugin entries; keep only the file-conversion
entry (ensure_ascii to match the registry's existing \uXXXX style).
- .cursor-plugin/** + .agents/: regenerated via `make generate-all` instead
of hand-editing the generated artifacts (make validate: OK, 5 harnesses).
- convert.sh: validate target format (alnum only) and reject '..' in the
output path (was a path-traversal risk on `curl -o $OUT`); build the
JSON-RPC payload with jq so arbitrary filenames are escaped safely (quotes,
backslashes, newlines, control chars), with a strict-sanitization fallback
when jq is absent.