Definition

A command is a single markdown file in .claude/commands/. The filename becomes the command - audit.md is /audit - and the body is plain instructions the assistant follows in order.

Farmwork ships seven. Nothing fires on its own: you type the command, it runs, and it does the one thing its name says. There is no semantic matching to second-guess and no phrase to memorise.

Core Principle

If you can't see it, you won't use it. Farmwork used to trigger on phrases like "open the farm" and "water the garden". They worked, but they were invisible - you had to read CLAUDE.md to learn they existed - and the names described farm life rather than what the workflow did. Typing / lists every command Farmwork has.

Why Commands

Version 2.1.0 replaced the two auto-activating skills with seven commands. Three reasons drove it:

Discoverability

A skill announces itself only in documentation. A command appears in the picker the moment you type a slash. For a system whose whole pitch is "small enough to hold in your head", making the surface area visible matters more than making it clever.

Predictability

Semantic activation is a judgement call - a phrase may or may not fire the skill you meant. A command either ran or it didn't. Each of the seven also does exactly one thing rather than branching on its arguments, so /audit can't surprise you by behaving like /inspect.

Portability

This is the one that settled it. Skills are Claude Code-specific, so the CLI had to generate a second copy of every workflow in AGENTS.md as prose for tools that couldn't invoke them - two versions of each procedure, kept in sync by hand. Commands are plain markdown that any agent can read, so that duplication disappeared and AGENTS.md roughly halved.

What was given up

Skills could auto-activate on related phrasing - asking "what's the state of this project?" could trigger an audit without knowing any magic words. Commands can't do that; you have to type the command. That was a deliberate trade: discoverability over implicit invocation.

Structure

One file per command, no directory, no supporting files:

directory structure
.claude/commands/
├── audit.md          # /audit
├── inspect.md        # /inspect
├── add-idea.md       # /add-idea
├── new-ideas.md      # /new-ideas
├── compost.md        # /compost
├── plan-idea.md      # /plan-idea
└── push.md           # /push

File Format

YAML frontmatter for metadata, then the instructions. $ARGUMENTS carries whatever the user typed after the command name.

markdown
---
description: Plant a new idea in the Idea Garden
argument-hint: [the idea]
allowed-tools: Task, Read, Edit, Glob, Grep
---

# Add Idea

Plant `$ARGUMENTS` in `_AUDIT/GARDEN.md`.

Launch the `idea-gardener` agent to record it. If `$ARGUMENTS`
is empty, ask what the idea is before doing anything.
...

Commands delegate the heavy lifting to agents. The command says what should happen and in what order; the agent file holds the detailed procedure. That keeps each command short enough to read in one sitting.

The Seven

Command What It Does Delegates To
/audit Refresh FARMHOUSE.md metrics and age the Idea Garden the-farmer
/inspect Everything in /audit, plus a code review and dry-run quality gates the-farmer, code-reviewer
/add-idea Plant a dated idea in GARDEN.md idea-gardener
/new-ideas Propose 10 ideas, plant the ones you choose idea-gardener
/compost Retire an idea with a reason idea-gardener
/plan-idea Graduate an idea into a plan in _PLANS/ -
/push Clean, gate, commit, push, refresh metrics code-cleaner, the-farmer

Only one of them writes to git

/audit and /inspect are read-only - they report and update audit documents, but never commit. /push is the only command that touches your remote. That split is deliberate: you should be able to run an inspection on anything without wondering what it might do.

Portability

Because a command is just markdown, it isn't tied to Claude Code:

  • Claude Code - reads .claude/commands/ natively
  • Codex - copy the files into ~/.codex/prompts/ and the same slash commands work
  • Anything else - AGENTS.md points at the command files, so the assistant reads and follows them directly

Where a command says "launch the code-reviewer agent", a tool without subagents reads .claude/agents/code-reviewer.md and does that work itself. The instructions live in exactly one place either way.

Custom Commands

Add your own by dropping a file into .claude/commands/. A good one:

  • Does a single thing its name describes
  • Lists numbered steps in the order they should happen
  • Says what to do when something is missing or ambiguous - most failures are the assistant guessing rather than asking
  • Declares allowed-tools narrowly enough to be safe
  • States plainly whether it writes anything

Resist the mega-command

If a command needs to branch on its arguments to decide what it does, that's two commands. Argument-dependent behaviour is exactly the unpredictability the seven were designed to avoid - /new-ideas and /add-idea are separate for this reason, not because they're unrelated.