claude-code-plugins
AGENTS.md6 starsChanged 11 days agoMITView on GitHub
One directory per plugin, listed in .claude-plugin/marketplace.json. Do not reinvent plugin patterns. Delegate: New plugin: add its marketplace.json entry and its README.md table row by hand; no check catches their absence. A plugin's version and description live in its plugin.json alone. Agents never bump a version or write a CHANGELOG.md section: scripts/release.ts does both at release time. A behaviour change to a plugin is done once the field-test skill has played it in a live session, red on the base…
Where files are headingNew AGENTS.md files have more rules about keeping secrets out of the code, and fewer about code style.
Of the AGENTS.md files we read, the 31,774 first seen in the last six months, against the older ones: the kind of rule that gained most share, and the kind that lost most. About files like this in general, not this one, and an estimate, since a kind is a pattern in the words.
In this repository9 other files it gives its agents.
- atlas/AGENTS.mdAGENTS.md
- vellum/AGENTS.mdAGENTS.md
- atlas/CLAUDE.mdCLAUDE.md
- CLAUDE.mdCLAUDE.md
- vellum/CLAUDE.mdCLAUDE.md
- field-testSkill
- landSkill
- leads-gateSkill
- leads-scanSkill
The file
We split this AGENTS.md into the rules it gives an agent
2 rules. About 0 are common, 2 are distinctive, and 0 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈2
Distinctive · estimate
This author's own choices. Worth a look.
0
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 7
Do not reinvent plugin patterns.
- Distinctive: line 82
Before any push or release: follow Repo operations.
≈ “Common” is an estimate: at least 1 in 5 of the 40,246 AGENTS.md files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Claude Code Plugin Marketplace
One directory per plugin, listed in .claude-plugin/marketplace.json.
Plugin Work
Do not reinvent plugin patterns. Delegate:
/plugin-dev:create-pluginand theplugin-devskills (structure, skills, hooks, agents, settings) to build or modify a pluginplugin-dev:plugin-validatoragent to validate oneclaude-code-guideagent for Claude Code behavior questions- Live doc search: the
claude-code-docsMCP server (user scope, https://code.claude.com/docs/mcp) - Official docs, the fallback when those are not installed: https://code.claude.com/docs/en/plugins
New plugin: add its marketplace.json entry and its README.md table row by hand; no check catches their absence. A plugin's version and description live in its plugin.json alone.
Agents never bump a version or write a CHANGELOG.md section: scripts/release.ts does both at release time.
A behaviour change to a plugin is done once the field-test skill has played it in a live session, red on the base and green on the change; a label, text or doc change needs none.
For plugin tests, permissions and the catalog lifecycle, start at Plugin testing and open only the page for the task. The vellum and atlas plugins carry their own AGENTS.md; vellum's .claude/rules/ have paths: relative to vellum/.
Commands
bun test --parallel # every suite outside dot directories and `archive/`
bun test --parallel ./.claude/hooks/*.test.ts # the repo's own hooks; `bun test` skips them
bun ./scripts/gates/run-gates.ts # CI's `validate` gates for what the change reaches (`--all`: everything)
bun ./scripts/gates/affected.ts print # what the change reaches since origin/dev; `test` runs those suites
bun ./scripts/land.ts <branch> # land a branch on dev; run once in the background, its last line says what to do next
bun ./scripts/landing/tier.ts # this branch's review tier, low or human; `--history`, `--eval` calibrate it
bun run --cwd vellum e2e # vellum's browser suite; Chromium once per machine: `bun run --cwd vellum e2e:install`.claude/github-flow.json names the validate, tier, verdict and land commands that the github-flow skills and their workers run here.
vellum/, pinpoint/ and atlas/ carry package.json + bun.lock: bun install --cwd <plugin> --frozen-lockfile before their tests or their server.
pre-commit and pre-push run the gates; CI runs them all (Local checks and CI).
Code Standards
| Layer | Language | Boundary |
| Logic | TypeScript on Bun | Parsing, branching, state. Comes with tests. |
| Glue | bash | Wiring only. Stop at ~150 lines, or at the first jq that builds data; past either it is logic. |
- Extensions are mandatory:
.ts,.tsx,.sh. The gates select files by extension, so a script named without one is checked by nothing. - Plugins are self-contained. No import crosses a plugin boundary, or reaches into
scripts/or.claude/. - File, path and process code goes through the platform helpers:
tools/platform/fromscripts/and.claude/, the directory's own copy elsewhere. - Ship sources, never compiled binaries.
bunis the runtime.
Method
- A change of behaviour or of a data model, once a first version was delivered, is proposed before it is coded.
- One writer per worktree.
- In an agent worktree, a Bash call runs one simple command: no
&∨chain, pipe,$(…), heredoc, loop or leadingcd, and plaingit, notgit -C. Claude Code's worktree-isolation guard refuses a command it cannot verify stays inside the worktree. Read, Write, Edit and Grep, or a script file run as one command, do the rest. - A step that code can decide is done by the script or the hook, not asked of Claude: an instruction can go unfollowed. A skill, a message or an error tells Claude what to do only when no code can decide it.
- A commit message says what the code does and why, the reason in words; how the change came about and how it was checked go in the pull request, or nowhere on the inline lane.
Non-Obvious Directories
scripts/- the repo's own tooling, one directory per concern (gates/,landing/,releasing/,ci/,headless/,sessions/,reports/),lib/for the helpers that belong to none.land.tsandrelease.tsstay at the root, and no directory is namedrelease/: the agent-hooks guard readsscripts/land.tsandscripts/releaseby convention (agent-hooks/guard/repo.ts,guard/argv.ts,guard/mentions.ts).archive/- retired plugins, not in the marketplace.tools/oxlint/anti-slop/- vendored lint plugin. Do not edit; re-run the upstream installer (see its README).tools/platform/- the file, path and process helpers; edit here, thenbun ./scripts/gates/sync-platform.ts --write; never edit a copy.tools/oxlint/local/- the repo's own lint plugin, edited here; registered beside anti-slop inoxlint.config.ts.
Branching
dev is the working trunk; main is the release channel consumers install from, moved only by the human, by fast-forward. History is linear everywhere: no merge commits, server-enforced. Every commit carries the user's signature: the remote refuses an unsigned one, so never pass -c commit.gpgsign=false. origin/dev is the source of truth; a local dev goes stale each time someone else lands.
Claude Code's built-in "Commit or push only when the user asks" does not hold here: agents commit and push to dev (inline lane) and to their own feature/|fix/ branches without asking, and land a branch with bun ./scripts/land.ts <branch>; main is the human's release, and a hook refuses every agent push to it.
Two lanes; the agent judges by scope, the user can override:
- Inline — one concern, small diff: commit directly on
dev. A commit that touches the e2e paths (listed inscripts/gates/check-e2e-green.ts) goes through a branch instead: the pre-push hook lets it reachdevonly once its SHA has a greene2erun, and that run needs a pushed branch. - Branch — several concerns, big work (large feature, large skill), or parallel agents:
feature/|fix/branch, pushed, PR targetingdev. During a feature the branch ignoresdev; rebase mid-feature only to pick up a commit the feature needs, or to defuse a real conflict.
Review: one agent review of each branch, before github-flow:pr publishes it; on a branch that touches the profile.review.risky paths of .claude/agent-hooks.jsonc, land.ts requires its verdict. The change sets the tier: a tier:low pull request lands through its worker once green, a tier:human one waits until the human types /land <n>. The inline lane stays outside the tier, at its author's judgement, so the loop's Low escapes does not cover all of dev. The human reviews contracts and tests at the end of a chantier and before each release. A finding gives the input, the output observed and the cause.
Before any push or release: follow Repo operations; landing is remote-first.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

