Documentation
¶
Overview ¶
Command csf is the agent harness: one process per machine that runs every agent session, and the thin client that talks to it. It was called harness; invoked by that name it still works and says so.
csf init [-repo DIR] [-state DIR] [-listen ADDR] csf serve -listen 127.0.0.1:14120 [-listen ADDR]... [-state DIR] [-claude PATH] [-database-config FILE] [-detach] csf submit -recipe agent.json csf send -assignment ID -message TEXT | -message-file FILE csf chat -assignment ID csf list | get -assignment ID | cancel -assignment ID | events -assignment ID [-from N] | stop csf housekeeping -trigger NAME [-trigger NAME]... [-dry-run] [-scratch DIR] csf view -listen 127.0.0.1:14121 [-listen ADDR]... [-state DIR] [-detach | -stop]
init, run at the root of any git repository, writes the sample assignment under .csf/assignments/sample and registers with the running host, or starts one. chat prints a session's chat address. serve is the host app: it builds the one host runtime, mounts the session service, the cron service with the default housekeeping triggers (when -database-config names the csfpg database its store lives in), the chat and one HTTP listener per address, and records where it listens in <state>/harness.json. housekeeping runs named triggers once, now, against the running host's sessions, and prints every record it writes. view is a second host app: it mounts the ops view, the live page of every session's card read from the state directory, and records where it listens in <state>/view.json; -stop ends the recorded one. Every other verb is a client of the generated harness operations, reaching the host at the recorded endpoint or -endpoint. Claude Code calls the same binary for each session gate:
csf gate PreToolUse <run directory> < hook input
A run lives in <state>/<assignment id>: events.jsonl, settings.json, run.json, the worktree and, while the session runs, its Bazel output base.