fallow agent install detects Claude Code, Codex, and Cursor, then writes what each one reads: an AGENTS.md task map, the fallow skill, the MCP server registration, and the commit/push gate. fallow agent status shows what is installed, and fallow agent uninstall removes exactly what fallow wrote.
fallow init --agents, fallow hooks install --target agent, and the hand-written MCP snippet keep working. agent install composes them; it does not replace them.Detection
Without--harness, a harness is selected when any of its signals is present. Nothing is fabricated when no signal exists: a Cursor-only repository never gets a .claude/ directory.
When nothing is detected, only the harness-neutral files are written (
AGENTS.md and .agents/skills/fallow) and the output names the --harness values you can pass. AGENTS.md itself is not a detection signal, because every harness and fallow write it.
What each step writes
Skill. When the project has
node_modules/fallow/skills/fallow, the installed skill is a small pointer to that copy, so it never drifts from the fallow version the project pins. Without it, the version-matched skill embedded in the binary is written. A skill named fallow that fallow did not write is refused (skill_name_taken) unless you pass --force.
MCP. The command is probed before anything is written: npx --no fallow-mcp for an npm-installed project, fallow-mcp from PATH, or the running binary when it is the npm multicall build. When none exists the step is skipped with mcp_entry_unavailable instead of writing a registration that cannot start. A project-level .codex/config.toml only applies once Codex trusts the project, so the output leads with the codex mcp add fallow -- ... command that works immediately.
Approval. Claude Code asks before starting a project-scoped MCP server. --approve records that approval for you by listing fallow in .claude/settings.local.json; it is opt-in and refused when that file is tracked by git.
Markers, idempotency, and uninstall
Every file or block carries a<!-- fallow:agent-install v1 ... --> marker. Re-running is byte-stable and reports every step as unchanged. Files fallow did not write are never overwritten without --force; a fallow MCP entry counts as fallow’s only when its command is one fallow writes, so a hand-written entry is refused (mcp_entry_foreign) and kept. --force on an unparsable config file saves the old bytes as <file>.fallow-bak first. uninstall removes managed blocks and entries, deletes a config file it emptied, and deletes AGENTS.md or CLAUDE.md only while the file still matches what fallow authored.
Options
The root is the git toplevel of the current directory unless
--root is passed explicitly, so a run from a monorepo package still writes where the harnesses read. The chosen root is the first line of output.
Output
Human output groups paths under “Shared with your team (commit these)” and “Local to you”. With--format json the envelope carries kind (agent-install, agent-uninstall, agent-status), schema_version, and fallow_version, and every step carries harness, step, status (written, removed, unchanged, skipped, refused, failed), scope, path, and a reason when it was skipped or refused, followed by next_actions (each flagged mutating when running it would write harness config, unlike the read-only next_steps of the analysis commands). The exit code is 2 when any step is refused or failed; every other step still runs.