claude.ai's plugin directory treats the folder it follows as the whole
plugin. Pointed at `main`, it first refused the repo outright
(`export-ignore`, then Git LFS filters), and once validation ran it held
14 findings for review: workflows, the lockfile, binaries, and 3,161
files.
## Changes
1. **`main` passes the directory's hard checks.**
- No `export-ignore`, and no Git LFS: `.gitattributes`, `.lfsconfig` and
the LFS hooks are gone, along with the 15 LFS files (the README GIFs,
`models/thang010146`, `models/drawings/DXF/imported`).
- New guard: `check-builds.sh --tree-only`, run by the always-on Version
Check (adds 0.1 s), rejects rewriting or archive-changing attributes and
any tracked file of 5 MiB or more.
2. **Directory findings fixed:**
- added `.claude-plugin/icon.png` (the C logo, the same as Codex);
- reworded the "pass / fail" table cell that the credential scan read as
a call to the `pass` password manager;
- removed `apps/web/pnpm-workspace.yaml`.
3. **New `claude-plugin` branch for the directory to follow.**
- Publish Release commits the plugin alone onto it on each release:
manifest, icon, `skills/`, `LICENSE`, and the README with its outside
links pinned to the release commit.
- That's 104 files, and `claude plugin validate` passes them with no
warnings.
- The tree is checked on every PR (`test_claude_plugin_branch.py`) and
again before each release's irreversible steps.
- Pushes are fast-forward only, and a release whose plugin didn't change
adds no commit.
4. **Root `CLAUDE.md` removed.** It only imported `AGENTS.md`, which
Claude Code reads on its own since v2.1.277.
## After merge
The next release creates `claude-plugin`. Then set **Branch or tag** to
`claude-plugin` in the developer portal.
## Verified
- The global policy suite passes (162 tests), and the tree check passes.
- CI was green on the previous head.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>