Docs / CLI reference
CLI reference
Every command, grouped by task.
Grouped by task; flanner --help groups them a little differently. Commands above the team section work without an account or a network connection.
Which of these your agent can call
45 MCP tools cover projects, plans, review and memory, and messages — what an agent needs while it works. Account, device and syncing commands are yours. For skills your agent can only read. In the mesh it can read, and also send a message, mute a teammate or set quiet hours; flanner tells it to do these only when you ask.
Projects: 6 of 7 operations
project_context, initialize_project_tool, create_project_tool, list_projects …
Plans: 6 of 9 operations
create_plan_file_tool, update_plan_file_tool, get_plan_file_tool, list_plan_files_tool …
Review: 4 of 6 operations
propose_plan_revision_tool, record_plan_review_decision_tool, get_plan_workflow_status_tool, get_plan_assurance_tool
Memory: 16 of 21 operations
memory_remember, memory_recall, memory_get, memory_list …
Skills: 7 of 14 operations
skills_report, skills_usage, skills_submit_evidence, skills_propose …
Curb: 0 of 17 operations
flanner curb · hook
A map of what an agent can reach is a target list for a tricked agent, so Curb has no agent tools. See Flanner Curb for each one.
Mesh and your account: 4 of 16 operations
mesh_status, messages_inbox, messages_send, messages_reply …
Setup and maintenance: 0 of 10 operations
flanner setup · register · unregister · status · claude-info · doctor …
Registration, diagnostics and repair run where you can see the output.
The split follows three rules: an agent never authorises itself, anything that deletes or repairs files stays where you can watch it, and everything an agent needs mid-task is exposed. The full tool list is on the agents page.
Core
flanner initAdopt the repository you are in: creates the store and registers the MCP server with every agent it finds
flanner init --setup codexRegister with one agent instead of all of them. Repeatable; the choices are the rows flanner status reports
flanner init --syncAlso import the plan files already in the repository. What you want when adopting one somebody else set up
flanner init --skip-claudeSkip registering with any agent. The repository's CLAUDE.md, AGENTS.md, hook and skills are still written
flanner init --print-codex-hookPrint the Codex messages hook entry, for an administrator who allows only managed hooks. Changes nothing
flanner statusCheck server status and project information
flanner doctorCheck the catalog against the plan files on disk
flanner listList all projects
flanner list --project PROJECT_NAMEList plan files for a specific project
Plans
flanner syncSync existing plan files into database
flanner sync --dry-runPreview sync without making changes
flanner sync --project PROJECT_NAMESync specific project only
flanner history PLAN_NAMEEvery version of a plan, newest first
flanner diff PLAN_NAME 2 3What changed between two versions
Freshness
flanner freshnessFreshness status for every plan, with the evidence behind it
flanner freshness PLAN_NAMEStatus and evidence for one plan
flanner why PLAN_NAMEWhy a plan is judged fresh, aging, suspect or stale
$ flanner freshness payment-webhooks
● suspect payment-webhooks.md v2 · written 12 days ago
! 24 commits touched cited files since anchor 4c19aef
src/webhooks.py
It names 1 symbol; all still exist.
verify_signature
Re-read it against those commits: git log 4c19aef.. -- src/webhooks.py
Revise it: flanner web opens the editor; flanner history payment-webhooks shows what changed.Web interface
flanner webLaunch web UI on default port (8080)
flanner web --open-browserLaunch and auto-open browser
flanner web --port 3000Launch on custom port
MCP server
flanner startRun the MCP server in the background on 127.0.0.1, for clients that speak http
flanner stopStop the MCP server
Agent integration
flanner claude-infoShow flanner's entry in Claude Desktop's config. flanner status covers every agent
flanner setupRe-run the agent registration on its own. flanner init already does this; use it to repair one
flanner registerAdd the MCP server to Claude Desktop's config
flanner register --forceRewrite Claude Desktop's entry even if one exists
flanner unregisterRemove the MCP server from Claude Desktop's config
Memory
flanner mem remember "..." --category factSave one durable memory as a Markdown file. --category is required: fact, decision, preference, constraint, lesson, relationship or task_context
flanner mem recall "..."Search what earlier sessions knew, with why each result matched
flanner mem listBrowse memories rather than searching them
flanner mem show IDOne memory in full, with everything that happened to it. --related lists connected memories and why (0.13.0)
flanner mem tag ID TAG...Add topic tags to a memory, or --remove one. The memory keeps its id and text (0.13.0)
flanner mem tagsThe tags in use, most used first (0.13.0)
flanner mem list --tag authOnly memories with that tag. recall takes --tag too, and remember takes it when saving (0.13.0)
flanner mem supersede ID --with "..."Correct a memory by replacing it, keeping the old one readable
flanner mem forget IDStop recalling a memory, or erase it from this machine
flanner mem mode suggestHow much this project captures: off, explicit, suggest (the default) or auto_safe. A project may only tighten the machine-wide policy
flanner mem pendingSuggestions waiting on you, with approve and reject
flanner mem attach ID FILEAttach a screenshot, PDF or recording as evidence
flanner mem share IDShare one memory with the team. Always explicit
flanner mem withdraw IDAsk peers to stop recalling one you shared
$ flanner mem recall "concurrent writers"
Postgres over SQLite: we need concurrent writers decision
project · confirmed · exact title match, current project, confirmedSkills
flanner skills scanRead every skill package your agent would load, and record what was found. Nothing in a package is executed
flanner skills list --allWhat is in effect, and with --all the copies being shadowed by another
flanner skills doctorWhat is wrong with the collection. Exits 1 on a defect so a check can gate on it
flanner skills inspect NAMEOne skill in full, including every copy of it and where each lives
flanner skills observe enableStart recording which skills get invoked here. Off until you run it; installs a hook
flanner skills observe statusWhere observation is on, what it has seen, and what it could not store
flanner skills report --days 30What was used, over a window you can see. --json and --csv carry the window with the numbers
flanner skills data purgeDelete what was recorded. Never scheduled, always asked for
flanner skills adopt NAMEKeep a copy of a package where flanner can put it back. A copy, not a move
flanner skills install HASHInstall a stored version. Snapshots what it replaces; refuses a directory flanner did not install
flanner skills rollback IDPut back what an install replaced
flanner skills evidence submit "..."Hand over one piece of work to learn from. Nothing is harvested
flanner skills propose NAME --file DRAFTDraft a skill for review. Must name the evidence it came from
flanner skills review IDThe draft, its evidence, and what it would change
flanner skills approve IDApprove one exact draft. Editing it afterwards sends it back for another look
flanner skills share HASHSend a package to your workspace. Carries the files and nothing private
flanner skills transfersPackages that arrived, and whether each was received, verified or installed
flanner skills import IDInstall a package a teammate sent. A separate decision from receiving it
flanner skills channel subscribe NAMEBe told when a new version arrives. Notifies; never installs
Your team
flanner accept TOKEN --as your-user-idAccept an invitation: joins the team and enrols this machine. Once per machine
flanner login CODEEnrol this machine with an enrollment code from the team console
flanner whoamiThis device's identity, what its entitlement allows, and which workspaces you may enter
flanner logoutForget this device's session. The device keeps its identity
flanner join WORKSPACE_IDBind this repository to a workspace. Run with no id to list the ones you may use
flanner invite someone@company.comInvite somebody to your organization (admins only)
flanner membersYour organization's members and seat count (admins only)
flanner devices listThe machines enrolled under your account. devices add mints a code to enrol another; devices revoke DEVICE_ID retires one
Syncing with other machines
flanner peer serveServe this device's catalog to authorised peers, and receive teammates' messages. Opens no port and needs no admin rights
flanner peer start / flanner peer stopThe same thing in the background, so it keeps serving after you close the terminal. peer autostart on starts it each time you log in
flanner peer pull DEVICE_IDTake whatever a peer holds that this device lacks
flanner peer push DEVICE_IDSend a peer whatever it lacks. The peer checks each item and may refuse
flanner peer pushes on|offWhether teammates may push to this device. On by default: pushes come only from authorised teammates and overwrite nothing
flanner peer statusHow this device is reachable, or how it reaches one peer
flanner mesh connectConnect to the team's private network, if it has one. Separate from join, which binds a repository
flanner mesh status / flanner mesh leaveWhether this device is on that network, and how to come off it
Messages
flanner messages inboxThreads with unread messages. --all adds the ones you have read
flanner messages read IDOne conversation, with delivery for what you sent
flanner messages send HANDLE... "..."Message one or more teammates. Shows what will be sent, and to whom, first
flanner messages broadcast "..."Message everyone in a workspace. Always asks first
flanner messages reply ID "..."Answer everyone on a thread
flanner messages mute HANDLEKeep a teammate's messages from interrupting you, on this device
flanner messages quiet-hours 22:00-07:00Show or set quiet hours on this device, or turn them off
flanner messages interrupt channel|tool|promptHow agents show new messages
flanner messages notifications on|offDesktop notifications for new messages on this device
flanner messages wait / flanner messages watchWait up to 15 minutes for the next message, print it and exit (for agents); or print messages as they arrive
flanner peer autostart on|offStart receiving messages now and whenever you log in, with no admin rights. It runs flanner peer serve, which also syncs your plans
Review and retire
flanner review propose PLAN_NAMEOffer a plan's newest version for review
flanner review decide PLAN_NAME approveRecord a decision on a proposal: approve, reject, request_changes or withdraw
flanner review comment PLAN_NAME --on "quoted text" -m "note"Leave a note against a quotation in a plan. Both --on and -m are required
flanner review status PLAN_NAMEA plan's proposals and its accepted baseline
flanner review pack PLAN_NAMEWrite a plan as one file somebody outside the team can annotate
flanner retire PLAN_NAMEAsk peers to stop showing a plan, or show it again with --restore
$ flanner review status auth-rework
accepted: sha256:f71be17c1b06…
PROPOSAL STATE PROPOSER APPROVALS
sha256:6a0db90f291d... accepted @dani (Dani Okafor) @maya (Maya Ross)Curb
What your agents can reach. Only policy and fleet need an account, on Flanner Mesh. The rest send nothing unless you ask.
flanner curb mapWhat each Claude Code and Codex launch from this folder can reach, channel by channel, with a severity. Names no credential and no location. --json gives the same report, redacted the same
flanner curb map --dir DIR --agent codex --profile ciAnother launch: --dir is the folder the agent starts in, --agent is claude or codex, --profile is the Codex profile
flanner curb map -- claude --settings ./ci-settings.jsonAssess the launch command given after --, flags and all, instead of the default one
flanner curb showOpen the full report, with names and locations, in a window on this machine's screen. Prints nothing from it. Takes the same launch options as map
flanner curb inventoryThe agents here and what each loads: settings layers, MCP servers, hooks, skills and scheduled jobs. Takes --json and the same launch options
flanner curb sweepFind secrets agents left behind, counted by exposure class. Needs the flanner[sweep] extra. --dir names the project folder; --json prints the counts
flanner curb sweep --validateAlso ask each secret's own issuer whether it still works. Asks you first, every run
flanner curb show --sweepOpen each finding's type and location in a window. Add --validate to ask the issuers, after the same question
flanner curb forgetDelete what Curb keeps on this machine. Asks first; --yes skips the question. With --yes, --backups deletes settings backups too
flanner curb fix --dry-runShow the fixes and change nothing. --dir and --agent narrow it
flanner curb fixApply them to each agent's own user settings, after your operating system asks you. Each file is backed up for 7 days
flanner curb fix --undoPut back the files the last fix changed
flanner curb testProve each block by asking the agent itself to get past it. States the token cost and asks first. --dir and --agent narrow it
flanner curb decoysHow many decoys the tester planted, and when the first expires. --renew keeps them another 30 days; --remove deletes them
flanner curb scrub FILEReplace the secrets in one file with placeholders, after you have rotated them. No backup, so no undo. --dry-run only checks
flanner curb log --enableInstall the hooks that log each tool call's metadata. Asks first. --disable removes them; --agent picks one agent
flanner curb log --verifyCheck that no record was changed, removed or reordered
flanner curb observedWhat each agent has been seen using, per channel. Takes --agent and --json
flanner curb policyYour organization's agent policy on this device: its version, what is applied and what waits for you. --json prints the state
flanner curb policy --enrolLet signed org policy make changes that only tighten, after one approval. --withdraw ends that
flanner curb policy --check-inFetch the newest policy now, apply what may apply, and report
flanner curb policy --approveReview and apply the change that waits for you
flanner curb policy --export DIRWrite the policy as admin-owned settings files, for device management to deliver
flanner curb fleetEach device's newest report, checked here by the device's own signature (admins only). --json prints them
flanner curb ciJudge the agent steps in this repository's GitHub Actions workflows. Takes a PATH; --json prints the findings
flanner curb ci --sarif curb.sarif --fail-on highWrite SARIF for code scanning, and exit 1 at this severity or above: high, medium, low, or never (the default)
flanner curb ci --fixMake the one-line fixes that are safe without a person. Open a pull request with them
flanner curb appFind the LLM calls in an app's Python code, and label each one's shape. Takes a PATH, --sarif FILE and --json
flanner curb attribution --setupGive each agent a signing key of its own and sign its commits with it. --github also adds the public keys to GitHub, with your own gh
flanner curb attributionEach agent's key, and whether rotation is due. --json prints the keys and the registry's state
flanner curb attribution --rotateReplace each agent's key. The old one is retired and signs nothing new
flanner curb verify main..HEADWhich agent key signed each commit, as one of five states. Give a commit or a range; the last commit if left out. Takes --json
What flanner sends
flanner updates on|offA daily request to pypi.org for the latest version number. Off until you turn it on
flanner crash-reports on|offSend crash reports to flanner's developers: the error type and where in flanner it happened. Off until you turn it on (0.14.0)
flanner crash-reports showPrint exactly what is waiting to be sent, or what was sent last. The privacy policy lists every field (0.14.0)
Project configuration
flanner config PROJECT_NAME --plan-dir DIRConfigure project settings
flanner setup-gitignore PROJECT_NAMEUpdate .gitignore manually