foundry
AGENTS.md4 starsChanged 10 days agoMITView on GitHub
Foundry is the marketplace that lists the Foreman, Hush and Razor plugins for Claude Code and Codex. The plugins are Git submodules pinned by commit; this repository holds the two catalogs, the release procedure, the README contract the plugins share, the brand kit their images come from and the benchmark harness that measures them. Foreman and Razor also run on Antigravity, which has no catalog: its users install a plugin directory from a Foundry clone, which checks the plugin out…
- Reads credentials
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,542 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 repository5 other files it gives its agents.
- CLAUDE.mdCLAUDE.md
- brandSkill
- cut-releaseSkill
- brandSkill
- cut-releaseSkill
The file
We split this AGENTS.md into the rules it gives an agent
8 rules. About 0 are common, 6 are distinctive, and 2 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈6
Distinctive · estimate
This author's own choices. Worth a look.
2
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 16
Before changing a catalog or cutting a release, read the release procedure.
- Distinctive: line 17
Before changing a plugin or flint, read its own AGENTS.md.
- Distinctive: line 18
Before editing or reviewing a plugin README, read the README contract.
- Very specific: line 19
Before adding or removing Antigravity in a skill's compatibility line, read the Antigravity skills record.
- Distinctive: line 20
Before changing any banner, icon, host card, Ember scene or evidence graphic, read the brand guide.
- Distinctive: line 21
Before writing or changing a mod (a hooks module that draws in Claude Code), read the native-look rules.
- Very specific: line 22
Before changing benchmarks/ or starting a run, read the benchmarks README.
- Distinctive: line 33
Run from the repository root unless a row names another directory.
≈ “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
Foundry
Foundry is the marketplace that lists the Foreman, Hush and Razor plugins for Claude Code and
Codex. The plugins are Git submodules pinned by commit; this repository holds the two catalogs,
the release procedure, the README contract the plugins share, the brand kit their images come
from and the benchmark harness that measures them. Foreman and Razor also run on Antigravity,
which has no catalog: its users install a plugin directory from a Foundry clone, which checks the
plugin out at its pinned commit, and Antigravity reads that plugin's own root plugin.json and
hooks.json. Nothing is installed here except one package in benchmarks/, the Agent SDK that
live --sdk runs need, and the only build is the artwork under brand/. The plugins run their
hooks and tests with Node.js 22 or later and Git; Foreman needs Git 2.25 or later.
Start here
- For installation and the plugin table, read README.md.
- Before changing a catalog or cutting a release, read the release procedure.
- Before changing a plugin or flint, read its own
AGENTS.md; each submodule is a separate repository with its own rules, tests and changelog. - Before editing or reviewing a plugin README, read the README contract.
- Before adding or removing Antigravity in a skill's
compatibilityline, read the Antigravity skills record. - Before changing any banner, icon, host card, Ember scene or evidence graphic, read the brand guide.
- Before writing or changing a mod (a hooks module that draws in Claude Code), read the native-look rules.
- Before changing
benchmarks/or starting a run, read the benchmarks README; a live run starts paid model sessions. - To add, pick, correct or close roadmap work, use Foreman (
/foreman:foreman). Foundry'sROADMAP.jsonland.foreman/are local and ignored; read the pitfall on old commits before any checkout.
Rules that outrank everything
- A catalog entry never carries a version. The version lives in the plugin's manifests, and a release moves only
source.shaand the gitlink. - A plugin listed in both catalogs pins the same
maincommit in both. Hush ships for Claude Code only and stays out of the Codex catalog. Antigravity needs no catalog entry; a plugin that ships for it carries a rootplugin.jsonwith the same version as its other manifests. - Plugin source changes happen in the plugin's repository on a topic branch, never as loose edits on the pinned checkout.
Commands
Run from the repository root unless a row names another directory.
| Command | Purpose | Cost |
claude plugin validate . | Validate the Claude Code catalog | Local |
agy plugin validate foreman or agy plugin validate razor | Validate a plugin's Antigravity package | Local; needs the Antigravity CLI |
node --test tests/*.test.js from foreman/, hush/ or razor/ | One plugin's suite | Local temporary fixtures; razor's suite fails under the system temp directory. Foreman's suite takes about 300 s; narrow it with --test-name-pattern |
| The pin check in cut-release step 4 | Pins, gitlinks and manifest versions agree | Local Git reads in each plugin. It reads catalogs and gitlinks from the checkout it runs in and plugin history from the Foundry root it is given; from a worktree, pass the Foundry root |
node scripts/check-shared-copies.js, node --test scripts/check-shared-copies.test.js | The plugins' hand-copied files, listed in cut-release step 4, agree at their pins, and flint's output-styles/hush.md matches Hush's at the commit flint's README names, minus the plugin-only parts flint's AGENTS.md lists; the test proves a changed copy fails | Local reads; a plugin with no checkout is skipped and named, and a run that compared nothing fails. It reads gitlinks, staged ones included, from the checkout it runs in and plugin history from the root argument: from the top of a worktree without plugin checkouts, node scripts/check-shared-copies.js <root> checks the worktree's gitlinks against the Foundry root's plugins. The test takes about a minute and prints nothing until it ends; --test-reporter=spec shows progress |
node scripts/check-references.js --root . --memory .claude/memory --exclude "fixtures/" --exclude "^benchmarks/hush/anchors/" --allow "^src/auth\.js" --allow "^src/legacy/cache\.js", node --test scripts/check-references.test.js | Every Markdown link and anchor, related_files entry, memory pointer, SKILL.md reference and manifest path resolves, and no public file points at an ignored target; exit 1 on a hard break, prose paths only warn | Local reads of the root and the plugin checkouts. It needs every plugin checked out: in a worktree, Foundry's links into the plugins report as missing, so the test's run on this repository is skipped there |
node scripts/check-mod-colors.js --types <claude-code.d.ts> [--exceptions <file>] <mod folder>..., node --test scripts/check-mod-colors.test.js | A mod paints only with theme keys; raw colors only where an approved exception lists them | Local; the types file is the one the plugin-authoring skill names when it loads |
node --test scripts/cut-release-block.test.js | The bash block of cut-release step 4 parses, and runs as written from this checkout with exit 0 | Local; needs a bash that finds node and git, which on Windows is Git's own, and the run needs the claude CLI. The run is skipped and names the plugins when a catalogued plugin has no checkout, as in a worktree; CI checks out no submodules, so this test stays local |
git submodule update --init | Check every plugin out at its pinned commit | Network on a fresh clone |
node --test scripts/claude-hooks/*.test.js | The repository's own hook, which reruns a plugin's suite after an edit under its scripts/ or hooks/; for Foreman, only the test files that cover the edited module | Local temporary fixtures |
node brand/mascot/build.cjs, node brand/graphics/build.cjs | Rebuild the Ember scenes or the evidence graphics | Local |
node brand/identity/build.cjs | Rebuild icons, README banners, wordmarks and social cards | Local; needs Segoe UI and Sharp at the sharp.sharp version in brand/identity/build-environment.json, resolved normally or through NODE_PATH; the repository installs neither |
node brand/identity/build-review.cjs | Refresh the review gallery brand/identity/index.html | Local |
node brand/check-timing.js <svg> | Check the SMIL timing lists of an animated SVG | Local |
npm ci from benchmarks/ | Install the Agent SDK pinned in benchmarks/package.json, which only a live --sdk run loads | Network, once per checkout; the offline tests and claude -p runs do not need it |
node --test foreman/tests/*.test.js, hush/tests/*.test.js or razor/tests/*.test.js from benchmarks/ | One benchmark suite's offline tests: runners, scorers and fixtures, with no model session | Local; reads the plugin checkouts, so CI, which checks out no submodules, cannot run them. From a worktree, set BENCH_PLUGINS_DIR and BENCH_DATA_DIR as the benchmarks configuration says |
node runner/hillclimb.js --smoke, --variant <variant> --from <run> or --variant <variant> --regrade from benchmarks/<suite>/ | The suite's entry point for /claude-api build-eval and /claude-api hillclimb, called once per variant: it writes results.jsonl, traces/ and errors.jsonl under the ignored .claude/hillclimb/<suite>/<variant>/. --smoke grades oracle and null answers; --regrade grades stored output twice and lists changed verdicts | Local with --smoke, --from or --regrade, under the same rules as the row above, except that Hush's --go --max-usd <usd> sends its fidelity judge to the Message Batches API, billed to ANTHROPIC_API_KEY. --variant alone starts the suite's live run, which starts paid model sessions; read Hill-climb a suite first |
CI runs .github/workflows/validate-marketplace.yml on pushes and pull requests to main. Its
validate job is the check the default branch's ruleset requires. It checks both catalogs: no
entry carries a version, each has a full source.sha and a ref, each name is a submodule path
whose gitlink names that same commit, and a plugin in both catalogs has one pin. Then it runs
claude plugin validate .. A gitlink moved off its pin therefore fails CI. The cut-release
step 4 pin check and shared-copy check stay local steps, because they read the plugin checkouts
and CI checks out no submodules.
Where things live
| Path | Content |
.claude-plugin/marketplace.json | Claude Code catalog: foreman, hush, razor |
.agents/plugins/marketplace.json | Codex catalog: foreman, razor |
foreman/, hush/, razor/ | Plugin repositories, mounted as submodules |
flint/ | Plain-text writing and coding instructions; a submodule outside both catalogs. Its gitlink moves in an ordinary commit, only to a commit already on flint's origin/main; the cut-release shared-copy check compares its style copy with Hush's, and nothing else in cut-release or CI covers it |
.claude/skills/cut-release/, .agents/skills/cut-release/ | The release procedure, user-invoked only: Claude Code's skill holds the steps, and the .agents/skills/ skill, which Codex and Antigravity both find, delegates to it with notes for those hosts; its agents/openai.yaml sets Codex's display name and prompt and turns implicit invocation off, and its disable-model-invocation: true keeps it out of the list Antigravity offers the model (record) |
.claude/skills/brand/, .agents/skills/brand/ | The artwork procedure for Claude Code, Codex and Antigravity; the two SKILL.md files stay identical, and the Codex skill's agents/openai.yaml sets its display name and default prompt |
.claude/agents/, .codex/agents/ | plugin-docs-reviewer, the read-only README review, for Claude Code and Codex; the two share one body that differs only in naming Bash or shell commands, so a change goes into both. On Codex it is read-only by its instructions only, because an agent role cannot set its sandbox, and starting the parent session with -s read-only enforces it |
.claude/settings.json, .codex/hooks.json | Shared Claude Code settings and the Codex hook registration for this checkout |
.github/workflows/validate-marketplace.yml, .github/dependabot.yml | The CI workflow that produces the required validate check, and the weekly update of its pinned actions |
scripts/claude-hooks/ | The post-edit hook that reruns the touched plugin's tests, with its own test |
scripts/check-shared-copies.js | The check that the plugins' hand-copied files, and flint's copy of Hush's style, agree, with its own test |
scripts/cut-release-block.test.js | The test that runs cut-release step 4's bash block as written |
brand/ | The brand kit: sources, generators and the exported images each plugin copies into its assets/ |
benchmarks/ | The benchmark harness: per-plugin runners, fixtures and offline tests; paths.js resolves the plugin checkouts and the ignored .private/benchmarks/<plugin>/ folder that holds run history and output; bench-config-dir.js resolves BENCH_CONFIG_DIR, the scratch Claude state folder a live run needs; test-env.js gives a test that spawns a runner an environment without keys or Claude config folders; sdk-session.js runs a live session through the Agent SDK when a runner gets --sdk, and package.json with its lockfile pins that SDK; hillclimb.js writes the per-variant files that each suite's runner/hillclimb.js hands to /claude-api hillclimb |
docs/knowledge/ | Public documentation: the plugin README contract, the brand guide, the native-look rules for mods (mod-native-look.md) and the Antigravity skills record |
Conventions
CLAUDE.md imports this file; keep shared project facts here. Codex reads this file directly.
Each plugin keeps its README, AGENTS.md, tests and docs/knowledge/changelog.md in its own
repository. Edit them there, merge into that plugin's main, then re-pin here through the
release procedure. This repository carries no single plugin's documentation, only the README
contract the three share.
Pitfalls
- Old commits track the roadmap. Commits before 23db23e8 track
ROADMAP.jsonland.foreman/, so checking one out, or a reset or rebase across it, replaces or deletes the local roadmap. Copy both outside the repository first, or read old commits withgit showor a separate worktree. - A fresh clone leaves every plugin on a detached HEAD at its pin. A commit made there lands on no branch; switch to a branch in the plugin first.
- A plugin checkout serves one session at a time. When another task holds a branch or uncommitted edits in
foreman/,hush/orrazor/, work in a separate worktree under the root's ignored.private/:git -C <plugin> worktree add ../.private/<plugin>-<id> -b <branch> main, where<id>names your task. The post-edit hook reruns the worktree's suite after an edit in itsscripts/orhooks/. To compare its committed shared copies before merge, runnode scripts/check-shared-copies.js --<plugin> .private/<plugin>-<id>, which reads that plugin at the worktree's HEAD and the others at their pins. When an entry changes a shared file in several plugins, pass one override per worktree in the same run; one worktree alone is compared with the others' old pins. For a flint worktree,--flint <dir>reads that worktree's HEAD and compares itsoutput-styles/hush.mdwith Hush's. After the branch merges, remove it withgit -C <plugin> worktree remove ../.private/<plugin>-<id>. - A desktop-app worktree keeps the plugin worktree inside it. A session the desktop app started in its own worktree under
.claude/worktrees/adds the plugin worktree there. First rungit -C <app worktree> rev-parse --show-toplevel. When it prints the Foundry root, called<root>below, the app folder is not a worktree and Git there acts on the root: if the folder is empty, rungit -C <root> worktree add --detach <app worktree> main; if it is not empty, stop and report it rather than clear it, because that command then fails withalready exists. Otherwise rungit -C <app worktree> switch --detach main. After either command,.private/is ignored there; add the plugin worktree at<app worktree>/.private/<plugin>-<id>. Pass that absolute path to--<plugin>, as innode scripts/check-shared-copies.js --<plugin> <app worktree>/.private/<plugin>-<id> <root>, because a relative override resolves against the root argument, not the current directory. - A pushed gitlink ships to Antigravity. Claude Code and Codex install the catalog's
source.sha, but a Foundry clone checks each plugin out at its gitlink, and Antigravity installs that checkout. A release moves both together; never push amainwhere they differ. git submodule updatemoves each plugin back to its pin. It stops on uncommitted edits to tracked files; untracked files stay.- An Antigravity install is a copy of a checkout, not a pin.
agy plugin installcopies the directory it is given; a plugin checked out anywhere but its pinned commit installs that other state. An install takes a new release only when its user pulls the clone, runsgit submodule update --initand installs again. - A plugin's
assets/holds copies. An image edited there is overwritten by the next copy frombrand/; change the kit, rebuild, then copy. - Codex trusts the Foundry root, not a worktree. Codex loads
.codex/agents/and.codex/hooks.jsononly in a trusted project, and it keys that trust on the main checkout's path. From a worktree, trust the Foundry root, as incodex -c "projects.'<root>'.trust_level='trusted'"; Codex reports a worktree path underprojectsas an ignored setting. Project trust loads the hooks, but each hook runs only after the owner also trusts it in Codex's/hooksstep, which only the owner persists. - Codex's
/hookstrust covers a hook's registration, not its script. The trust records a hash of the hook's event, matcher and handler settings: its command, timeout and other handler fields. Codex keys that trust on the absolute path of.codex/hooks.json, so a hook trusted in one checkout is not trusted in another. A changed registration stays off until the owner trusts it again; a changed hook script needs no new trust. From a worktree, the owner runs that trust step ascodex --no-daemon, because a long worktree path breaks the TUI's socket.
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.

