API
rf command line
Search, plan, install, publish and buy from the terminal with rf: install, configuration, exit codes, money rules and every command, generated from the real --help.
rf (also installed as reuseforge) is the command line for ReuseForge. Each command maps onto one or more API operations, so anything you can do here you can do from the SDKs or with curl. It is Node 18+ with no runtime dependencies (it embeds the JavaScript SDK). Output is human text on a terminal and JSON when piped or with --json; errors go to stderr.
Install
Not on npm yet. Install from a checkout of the repository. The commands below that use npx reuseforge or npm install -g reuseforge will work once the package is published.
git clone https://github.com/Longfordjames/Claude-1 && cd Claude-1
npm install -g ./cli
rf --version # prints the version and where the SDK comes from
rf search rag --free # no token needed to readA Python port with the same flags, exit codes, files and lock semantics ships in the Python package (pip install ./sdk/python gives you a reuseforge and an rf command). It covers the day-to-day commands; the Node CLI documented here is the complete one.
Five minutes
rf login # opens the token page; paste the token (no echo). CI: echo "$TOKEN" | rf login --with-token
rf whoami # account, scopes and the remaining spend allowance
rf search rag --kind skill --free --limit 5
rf plan "RAG chatbot over my PDF invoices" --budget 50 --out plan.json
rf install acme/invoice-extractor # verify, write, update reuseforge.lock
rf install --from-plan pln_abc123 # the hosted items of a plan option
rf list; rf verify # what is installed; re-hash it against the lock (offline)
rf init && rf publish --dry-run # publish your own: see the publishing guideEverything that changes something supports --dry-run, which prints the requests it would send and sends none. rf add and rf pull are aliases of install.
Configuration
Highest wins:
- flags;
- environment:
REUSEFORGE_TOKEN,REUSEFORGE_API_URL,REUSEFORGE_PROFILE,REUSEFORGE_MAX_SPEND_CENTS,NO_COLOR,REUSEFORGE_CONFIG_DIR; - the project file
./.reuseforge/config.json(api_url,profile,target; never tokens), found by walking up to the git root; - the user config
$XDG_CONFIG_HOME/reuseforge/config.json(default~/.config/reuseforge/,%APPDATA%\reuseforgeon Windows); credentials.jsonnext to it, mode 0600 (the CLI refuses to read it if group or world readable):{"profiles": {"default": {"api_url", "token", "account"}}};- the defaults:
https://reuseforge.com/api/v1, anonymous.
rf config get|set|unset edits the config files. rf doctor checks reachability, the token and its scopes and clock skew (which matters for webhook signatures), and prints the effective configuration with the source of each value and no secrets. The SDKs read the same files and variables, so rf login once and your scripts are signed in too. To use your own node: rf --api-url http://127.0.0.1:8420/api/v1 whoami or REUSEFORGE_API_URL.
Exit codes
Scripts can branch on the exit code without parsing text.
| Code | Meaning |
|---|---|
| 0 | success |
| 1 | unexpected error |
| 2 | usage error (unknown flag, missing argument) |
| 3 | authentication or permission (401, and 403 except spend limit) |
| 4 | not found or gone (404, 410) |
| 5 | conflict, stale state, unsatisfiable lock (409, 412, 428, resolution conflicts) |
| 6 | invalid input (400, 413, 415, 422 except payment_invalid) |
| 7 | payment: payment_required, spend_limit_exceeded, payment_invalid, rail_unsupported, or a total above --max-spend |
| 8 | rate limited after retries (429) |
| 9 | network or server failure (timeouts, DNS, 5xx, and 501 on a deployment that lacks the operation) |
| 10 | integrity failure (hash or signature mismatch, tampered download, unsafe path) |
| 11 | confirmation required or declined |
| 130 | interrupted |
With --json a failure prints the Problem JSON plus exit_code on stdout as well (stderr carries the human text), so a script never parses stderr:
rf items get acme/nothing --json | jq '{code, exit_code, request_id}'Money rules
The CLI is stricter than the API about spending, because it is often run unattended.
- Commands that commit money (
orders pay,projects back,projects transfer,install --buy) print a summary first (items, total in dollars, fee, rail and a test-mode banner) and askProceed? [y/N]on a terminal. --yesalone never pays. Without a terminal (or with--no-input) a spend needs--yesand a ceiling:--max-spend <usd>orREUSEFORGE_MAX_SPEND_CENTS, checked against the order total before any request is sent. This CLI also requires the ceiling with--yeson a terminal.orders acceptreleases escrow to the seller and cannot be undone. It always asks on a terminal (type the order id again); without one it needs--yes --confirm <order_id>. It refuses to try unlessrf whoamilists theorders:acceptscope, which only a person can grant.rf mcp servenever forwards it.rf installnever pays. For a paid item it prints the server'sorder_hintand exits 7;--buycreates the order and applies rules 1 and 2.- The CLI keeps nothing that can spend money except the token, so put spend limits on the token:
rf tokens create --scopes items:read,orders:pay --spend-limit 20.rf whoamishows what is left. See agent limits.
Install safety and the lockfile
rf install verifies every file sha256 and the bundle content_hash before anything is written (exit 10 on a mismatch, nothing touched); resolves paths inside the project root and refuses absolute paths, .. and symlink escapes; writes atomically; strips setuid, setgid and sticky bits; caps a version at 2 MiB and 100 files; and never executes anything from a package (suggested commands run only with --run-commands and a confirmation, and never when the descriptor says never). Config files such as .mcp.json are merged key by key; a conflicting key stops the install unless --force.
reuseforge.lock is written by install, lock, update and uninstall: one entry per resolved package with the exact version, the bundle content_hash, per-file hashes and targets, sorted so diffs stay small. rf install with a lock installs exactly the locked versions; rf install --frozen is for CI (never writes the lock, exit 5 if it cannot be satisfied); rf update re-resolves within the ranges in reuseforge.json; rf verify is offline and exits 10 if an installed file differs; rf uninstall removes only files that still match the lock.
Local MCP bridge, completion
rf mcp serve is a local stdio MCP server that proxies to the hosted tools with your credentials, for clients without remote MCP (see the MCP guide). --read-only forwards only read-only tools.
rf completion bash > ~/.local/share/bash-completion/completions/rf
rf completion zsh > "${fpath[1]}/_rf"
rf completion fish > ~/.config/fish/completions/rf.fishCommands
Everything below is generated from the output of rf --help and rf <command> --help of the CLI in this repository, so flags and wording are exactly what the program prints. Where a command is the CLI form of an operation, the operation's reference page shows an example with it in the CLI tab.
Global options
Global options work before or after the command. They are the same for every command.
| Option | What it does |
|---|---|
--api-url <value> | API root (default https://reuseforge.com/api/v1) |
--token <value> | token rf_... (visible in the process list; prefer REUSEFORGE_TOKEN or rf login) |
--profile <value> | credentials profile (default: "default") |
--json | print JSON (the default when stdout is not a terminal) |
--no-json | print human text even when stdout is not a terminal |
-q, --quiet | only results and errors |
-v, --verbose | print method, URL, status and request id of every request (never the token) |
--no-color | no ANSI colours (NO_COLOR is honoured too) |
--no-input | never prompt; fail instead |
-y, --yes | answer yes to confirmations (never enough to spend money, see --max-spend) |
--dry-run | show the requests a mutating command would send, send none |
--timeout <value> | per-request timeout in seconds (default 30) |
-h, --help | show help |
--version | print the version |
Commands
| Command | What it does |
|---|---|
rf login | Store a token for this machine |
rf logout | Remove the stored token |
rf tokens | Personal access tokens |
rf whoami | Show the signed-in account, scopes and spend allowance |
rf items | Items: get, create, update, retract, star, stats |
rf reviews | Reviews: list, create, delete |
rf search | Search hosted items |
rf versions | Versions: list, get, yank, download |
rf init | Scaffold reuseforge.json from the current directory |
rf publish | Publish the project in the current directory as a new version |
rf install | Install items (and their dependencies) into this project |
rf list | List installed items from reuseforge.lock |
rf lock | Resolve and write reuseforge.lock without installing files |
rf uninstall | Remove an installed item (only files that still match the lock) |
rf update | Re-resolve installed items within their ranges |
rf verify | Check installed files against the lock (offline); verify request\|get for verifications |
rf connectors | Discovery connectors |
rf discover | Search external sources (GitHub, npm, PyPI, arXiv, ...) |
rf mcp-config | Print or write MCP server configuration for a plan |
rf plan | Turn a goal and a budget into a Pareto-optimal plan |
rf plans | Stored plans: get, brief |
rf admin | Operator actions |
rf orders | Orders and escrow: create, pay, accept, dispute, ... |
rf payouts | Seller payouts and earnings |
rf portfolio | Your project backings and revenue units |
rf projects | Crowdfunded projects |
rf events | Webhook event types |
rf webhooks | Webhook endpoints and deliveries |
rf accounts | Public account profiles |
rf api | API meta: index, health, openapi, rate-limit |
rf completion | Print a shell completion script (bash, zsh, fish) |
rf config | Read and write rf configuration (api_url, profile, target) |
rf doctor | Check configuration, connectivity, credentials and clock skew |
rf ledger | Ledger events of self-hosted nodes |
rf marketplaces | The hosted Claude Code marketplace of an account (its public, free, active items) |
rf mcp | Hosted MCP server: mcp serve is a stdio proxy |
rf login
rf login [options]Store a personal access token for this machine (credentials file, mode 0600)
Without --with-token, opens the token page in your browser and asks you to paste the token (no echo). With --with-token the token is read from stdin: echo $TOKEN | rf login --with-token. The token is verified with GET /me before it is stored and is never printed.
Changes something, so --dry-run shows the request(s) without sending them.
| Option | What it does |
|---|---|
--with-token | read the token from stdin (CI, scripts) |
--no-browser | do not try to open the token page |
rf logout
rf logout [options]Remove the stored token for the profile (optionally revoke it on the server first)
Changes something, so --dry-run shows the request(s) without sending them.
| Option | What it does |
|---|---|
--revoke | revoke the token with the API before removing it (needs tokens:manage) |
rf tokens
Personal access tokens
rf tokens create
rf tokens create [options]Create a token (read-only scopes by default). The secret is shown once.
Scopes: items:read, items:write, items:publish, orders:read, orders:create, orders:pay, orders:accept, projects:read, projects:write, webhooks:manage, tokens:manage, admin. orders:accept (release escrow) is refused unless --allow-accept. Tokens with orders:pay get a spend limit of $50.00 unless you set one with --spend-limit.
Changes something, so --dry-run shows the request(s) without sending them.
| Option | What it does |
|---|---|
--name <name> | label for the token (default "rf cli") |
--scopes <list> | comma separated scopes (default items:read,orders:read,projects:read) |
--expires-days <n> | lifetime in days (1-365, default 90) |
--spend-limit <usd> | lifetime cap on money this token may commit, or "none" (only honoured for interactive sessions) |
--allow-accept | permit the orders:accept scope (releases escrow) |
rf tokens list
rf tokens list [options]List your tokens (never the secrets)
| Option | What it does |
|---|---|
--limit <n> | page size (server maximum applies) |
--cursor <cursor> | continue after this cursor (from a previous page) |
--all | follow every page (up to 10000 rows) |
rf tokens revoke
rf tokens revoke <token_id>Revoke a token by id (tok_...)
Changes something, so --dry-run shows the request(s) without sending them.
rf whoami
rf whoamiShow the signed-in account, token scopes and remaining spend allowance
rf items
Items: get, create, update, retract, star, stats
rf items create
rf items create <item> [options]Create an item (metadata only; use rf publish to upload a version)
Changes something, so --dry-run shows the request(s) without sending them.
| Option | What it does |
|---|---|
--kind <kind> | repo | skill | harness | mcp_server | model | dataset | prompt | template (required) |
--title <text> | display title (max 120) |
--summary <text> | one line for search results (max 280) |
--license <spdx> | SPDX id |
--price <usd> | price in dollars (explicit; publishing never changes it) |
--pricing-model <model> | free | fixed | pwyw |
--visibility <v> | public | unlisted | private |
--readme <file> | markdown file to use as README |
--tag <tag> | tag (repeatable); replaces the tag list |
--capability <id> | capability id (repeatable); replaces the list |
--homepage <url> | homepage URL |
rf items descriptor
rf items descriptor <item> [options]Show the install descriptor of an item for a target (what rf install would write)
| Option | What it does |
|---|---|
--target <target> | generic | claude-code | cursor | codex | mcp-json |
rf items get
rf items get <item> [options]Show one item
| Option | What it does |
|---|---|
--readme | also print the README |
rf items retract
rf items retract <item>Retract an item (hidden from search; existing buyers keep access)
Changes something, so --dry-run shows the request(s) without sending them.
rf items search
rf items search [query]... [options]Search hosted items (alias of rf items search)
| Option | What it does |
|---|---|
--kind <kind> | repo, skill, harness, mcp_server, model, dataset, prompt, template (repeat or comma separated) |
--capability <id> | planner capability id |
--tag <tag> | items carrying this tag |
--license <spdx> | license id (repeat or comma separated) |
--max-price <usd> | highest price in dollars (0 = free only) |
--free | free items only |
--verified | items whose tests were attested by the platform |
--min-rating <1-5> | minimum average rating |
--owner <handle> | items of this account |
--sort <order> | relevance | trending | stars | downloads | updated | newest | rating | price_asc | price_desc |
--limit <n> | page size (server maximum applies) |
--cursor <cursor> | continue after this cursor (from a previous page) |
--all | follow every page (up to 10000 rows) |
rf search rag --kind skill --free
rf search "invoice pdf" --max-price 20 --sort ratingrf items star
rf items star <item>Star an item
Changes something, so --dry-run shows the request(s) without sending them.
rf items stats
rf items stats <item> [options]Views, downloads, stars, reviews and sales of an item (daily series for owners)
| Option | What it does |
|---|---|
--days <n> | days of history for owners |
rf items unstar
rf items unstar <item>Remove your star from an item
Changes something, so --dry-run shows the request(s) without sending them.
rf items update
rf items update <item> [options]Change item metadata (reads the ETag itself and sends If-Match)
Changes something, so --dry-run shows the request(s) without sending them.
| Option | What it does |
|---|---|
--status <s> | draft | active | archived |
--title <text> | display title (max 120) |
--summary <text> | one line for search results (max 280) |
--license <spdx> | SPDX id |
--price <usd> | price in dollars (explicit; publishing never changes it) |
--pricing-model <model> | free | fixed | pwyw |
--visibility <v> | public | unlisted | private |
--readme <file> | markdown file to use as README |
--tag <tag> | tag (repeatable); replaces the tag list |
--capability <id> | capability id (repeatable); replaces the list |
--homepage <url> | homepage URL |
rf reviews
Reviews: list, create, delete
rf reviews create
rf reviews create <item> [options]Review an item you installed or bought (one per account; sending again replaces nothing, delete first)
Changes something, so --dry-run shows the request(s) without sending them.
| Option | What it does |
|---|---|
--rating <1-5> | stars (required) |
--title <text> | headline |
--body <text> | review text |
rf reviews delete
rf reviews delete <item>Delete your review of an item
Changes something, so --dry-run shows the request(s) without sending them.
rf reviews list
rf reviews list <item> [options]List reviews of an item
| Option | What it does |
|---|---|
--sort <order> | newest | rating_desc | rating_asc | helpful |
--limit <n> | page size (server maximum applies) |
--cursor <cursor> | continue after this cursor (from a previous page) |
--all | follow every page (up to 10000 rows) |
rf search
rf search [query]... [options]Search hosted items (alias of rf items search)
| Option | What it does |
|---|---|
--kind <kind> | repo, skill, harness, mcp_server, model, dataset, prompt, template (repeat or comma separated) |
--capability <id> | planner capability id |
--tag <tag> | items carrying this tag |
--license <spdx> | license id (repeat or comma separated) |
--max-price <usd> | highest price in dollars (0 = free only) |
--free | free items only |
--verified | items whose tests were attested by the platform |
--min-rating <1-5> | minimum average rating |
--owner <handle> | items of this account |
--sort <order> | relevance | trending | stars | downloads | updated | newest | rating | price_asc | price_desc |
--limit <n> | page size (server maximum applies) |
--cursor <cursor> | continue after this cursor (from a previous page) |
--all | follow every page (up to 10000 rows) |
rf search rag --kind skill --free
rf search "invoice pdf" --max-price 20 --sort ratingrf versions
Versions: list, get, yank, download
rf versions download
rf versions download <item> [version] [options]Download a version into a directory, verifying every hash first (does not install or lock)
Changes something, so --dry-run shows the request(s) without sending them.
| Option | What it does |
|---|---|
--out <path> | destination directory (default ./<slug>-<version>); with --format zip the .zip file (default ./<slug>-<version>.zip) |
--force | write into a non-empty directory / overwrite files |
--format <files|zip> | files (default): verified files in a directory; zip: the deterministic ZIP archive, saved unextracted after its SHA-256 is checked |
--layout <plain|claude-plugin> | zip layout (default plain); claude-plugin is for skill, prompt and mcp_server items |
rf versions get
rf versions get <item> [version]Show one version: files, dependencies, verification
rf versions list
rf versions list <item> [options]List published versions of an item
| Option | What it does |
|---|---|
--limit <n> | page size (server maximum applies) |
--cursor <cursor> | continue after this cursor (from a previous page) |
--all | follow every page (up to 10000 rows) |
rf versions yank
rf versions yank <item> <version> [options]Yank a version (stays downloadable for existing lockfiles, skipped by new resolution); --undo restores it
Changes something, so --dry-run shows the request(s) without sending them.
| Option | What it does |
|---|---|
--reason <text> | why it was yanked (shown to installers) |
--undo | un-yank |
rf versions publish
rf versions publish [options]Same as rf publish: publish the project as a new immutable version
Reads reuseforge.json, validates it, lists the files and the content hash, scans for secrets, creates the item when missing and uploads the version. It never changes the price of an existing item. The upload carries a deterministic Idempotency-Key, so repeating an interrupted publish cannot create a second version.
Changes something, so --dry-run shows the request(s) without sending them.
| Option | What it does |
|---|---|
--dir <dir> | project directory (default: current directory) |
--tag <tag> | tag for a newly created item (repeatable; existing items: rf items update --tag) |
--allow-secrets | publish even if files look like they contain secrets |
--verify | request an attested test run after publishing (uses test.command from the manifest) |
--wait | with --verify: wait for the result |
rf init
rf init [options]Scaffold reuseforge.json from the current directory (detects SKILL.md, package.json, pyproject.toml, .mcp.json)
Changes something, so --dry-run shows the request(s) without sending them.
| Option | What it does |
|---|---|
--kind <kind> | repo | skill | harness | mcp_server | model | dataset | prompt | template |
--name <owner/slug> | item name (default: from the project) |
--dir <dir> | project directory (default: current directory) |
--force | overwrite an existing reuseforge.json |
rf publish
rf publish [options]Publish the project as a new immutable version (creates the item if it does not exist)
Reads reuseforge.json, validates it, lists the files and the content hash, scans for secrets, creates the item when missing and uploads the version. It never changes the price of an existing item. The upload carries a deterministic Idempotency-Key, so repeating an interrupted publish cannot create a second version.
Changes something, so --dry-run shows the request(s) without sending them.
| Option | What it does |
|---|---|
--dir <dir> | project directory (default: current directory) |
--tag <tag> | tag for a newly created item (repeatable; existing items: rf items update --tag) |
--allow-secrets | publish even if files look like they contain secrets |
--verify | request an attested test run after publishing (uses test.command from the manifest) |
--wait | with --verify: wait for the result |
rf install
rf install [item]... [options]Install items and their dependencies (also: rf add, rf pull); with no arguments, install reuseforge.json / reuseforge.lock
Every file hash and the bundle content_hash are verified before anything is written; paths are confined to the project; writes are atomic; nothing from a package is executed. A paid item you do not own stops with exit 7 and prints the order to create (use --buy to buy it as part of the run).
Changes something, so --dry-run shows the request(s) without sending them.
| Option | What it does |
|---|---|
--target <target> | generic | claude-code | cursor | codex | mcp-json (default: detected from .claude/, .cursor/, .codex/ or AGENTS.md, else generic) |
--dest <dir> | project root to install into (default: current directory) |
--force | overwrite modified files and conflicting config keys |
--frozen | CI mode: install exactly what reuseforge.lock says, never write it, fail if it would change |
--buy | buy paid items that are missing (follows the spending rules: needs --yes --max-spend <usd> without a terminal) |
--max-spend <usd> | spending ceiling for --buy (or REUSEFORGE_MAX_SPEND_CENTS) |
--rail <rail> | payment rail for --buy (default: the platform default) |
--tx <hash> | transaction reference for --buy on real rails |
--from-plan <plan_id> | install the hosted items of a plan option (external results are recorded, not downloaded) |
--option <n> | plan option for --from-plan (default: the recommended one) |
--run-commands | run the descriptor's suggested commands after installing (asks first; never runs commands marked "never") |
--allow-home | allow descriptors that write into your home directory (~/...) |
--include-prerelease | allow prerelease versions when resolving ranges |
--save | add the requested items to dependencies in reuseforge.json |
rf install acme/invoice-extractor
rf install acme/pdf-text-layer@^2 --target claude-code
rf install --frozen
rf install --from-plan pln_abc123 --buy --yes --max-spend 20rf list
rf list [options]List what reuseforge.lock says is installed
| Option | What it does |
|---|---|
--dest <dir> | project root to install into (default: current directory) |
rf lock
rf lock [item]... [options]Resolve reuseforge.json dependencies (and named items) and write reuseforge.lock without installing files
Changes something, so --dry-run shows the request(s) without sending them.
| Option | What it does |
|---|---|
--target <target> | generic | claude-code | cursor | codex | mcp-json (default: detected from .claude/, .cursor/, .codex/ or AGENTS.md, else generic) |
--dest <dir> | project root to install into (default: current directory) |
--include-prerelease | allow prerelease versions when resolving ranges |
rf uninstall
rf uninstall <package> [options]Remove an installed item: only files recorded in the lock whose hash still matches are deleted; edited files are left and reported
Changes something, so --dry-run shows the request(s) without sending them.
| Option | What it does |
|---|---|
--target <target> | generic | claude-code | cursor | codex | mcp-json (default: detected from .claude/, .cursor/, .codex/ or AGENTS.md, else generic) |
--dest <dir> | project root to install into (default: current directory) |
rf update
rf update [package] [options]Re-resolve installed items within their ranges to the highest non-yanked version and install the changes
Changes something, so --dry-run shows the request(s) without sending them.
| Option | What it does |
|---|---|
--target <target> | generic | claude-code | cursor | codex | mcp-json (default: detected from .claude/, .cursor/, .codex/ or AGENTS.md, else generic) |
--dest <dir> | project root to install into (default: current directory) |
--force | overwrite modified files and conflicting config keys |
--buy | buy paid items that are missing (follows the spending rules: needs --yes --max-spend <usd> without a terminal) |
--max-spend <usd> | spending ceiling for --buy (or REUSEFORGE_MAX_SPEND_CENTS) |
--rail <rail> | payment rail for --buy (default: the platform default) |
--tx <hash> | transaction reference for --buy on real rails |
--run-commands | run the descriptor's suggested commands after installing (asks first; never runs commands marked "never") |
--allow-home | allow descriptors that write into your home directory (~/...) |
--include-prerelease | allow prerelease versions when resolving ranges |
rf verify
rf verify [options]Re-hash every installed file against reuseforge.lock, offline; exit 10 on drift
Subcommands rf verify request <item> [version] and rf verify get <id> handle attested test runs on the server.
| Option | What it does |
|---|---|
--dest <dir> | project root to install into (default: current directory) |
--strict | also fail (exit 10) for external blocks, which cannot be verified |
rf verify get
rf verify get <verification_id>Show a verification (vrf_...)
rf verify request
rf verify request <item> [version] [options]Ask the platform to run the version's tests in its sandbox and attest the result
Changes something, so --dry-run shows the request(s) without sending them.
| Option | What it does |
|---|---|
--wait | poll until the run finishes (exit 10 if it failed) |
rf connectors
Discovery connectors
rf connectors list
rf connectors list [options]List discovery connectors and whether they are ready
| Option | What it does |
|---|---|
--limit <n> | page size (server maximum applies) |
--cursor <cursor> | continue after this cursor (from a previous page) |
--all | follow every page (up to 10000 rows) |
rf discover
rf discover <query>... [options]Search external sources (GitHub, npm, PyPI, crates, arXiv, HF, MCP registries) without planning
| Option | What it does |
|---|---|
--connectors <list> | restrict to these connectors (see rf connectors list) |
--kind <kind> | restrict kinds |
--limit <n> | page size (server maximum applies) |
rf mcp-config
rf mcp-config [options]MCP servers that fit a plan or goal; --write merges them into .mcp.json (asks first)
Changes something, so --dry-run shows the request(s) without sending them.
| Option | What it does |
|---|---|
--plan <plan_id> | derive servers from a plan |
--goal <text> | derive servers from a goal |
--capabilities <list> | capability ids |
--write | merge the servers into .mcp.json (never overwrites a different existing entry without --force) |
--file <path> | config file for --write (default .mcp.json in the project) |
--force | overwrite entries that already exist with different values |
--dest <dir> | project root |
rf plan
rf plan <goal>... [options]Turn a goal and a budget into a Pareto-optimal plan: reuse, buy or build
Prints the recommended option, the Pareto table (quality up, cost down, risk down) and the reasoning. Nothing is bought. A plan is stored for 24 hours; its id is a capability.
Changes something, so --dry-run shows the request(s) without sending them.
| Option | What it does |
|---|---|
--budget <usd> | total budget in dollars (omit for none) |
--online | also search external sources (GitHub, npm, PyPI, arXiv, MCP registries, ...) |
--connectors <list> | restrict external discovery to these connectors |
--llm | decompose the goal with an LLM instead of the keyword taxonomy |
--per-requirement <n> | candidates considered per requirement (1-8) |
--exclude-paid | never plan paid items |
--prefer-free | prefer a free plan when it scores within 0.10 of the best |
--require-verified | only verified sellers and external sources |
--license <spdx> | allowed licenses (repeatable) |
--deny-license <spdx> | refused licenses; trailing * matches a prefix |
--max-risk <0-1> | refuse candidates riskier than this |
--kind <kind> | restrict kinds: repo, skill, harness, mcp_server, dataset, paper, build_task, design, model, prompt, template |
--out <file> | save the plan (id and body) as JSON |
rf plan "RAG chatbot over my PDF invoices" --budget 50
rf plan "scrape and summarize arXiv papers" --online --exclude-paid --out plan.jsonrf plans
Stored plans: get, brief
rf plans brief
rf plans brief <plan_id> [options]Build brief for the parts of a plan option that must be built (markdown for an agent or a person)
| Option | What it does |
|---|---|
--option <n> | plan option (default: recommended) |
rf plans get
rf plans get <plan_id>Show a stored plan
rf admin
Operator actions
rf admin resolve
rf admin resolve <order_id> <item_id> [options]Operator: resolve a disputed order item by splitting the escrow (basis points to the seller)
Changes something, so --dry-run shows the request(s) without sending them.
| Option | What it does |
|---|---|
--seller-bps <0-10000> | share of the price the seller receives (required) |
--note <text> | reasoning recorded with the decision (required) |
rf orders
Orders and escrow: create, pay, accept, dispute, ...
rf orders accept
rf orders accept <order_id> [options]Accept delivery and RELEASE the escrow to the seller (irreversible; needs the orders:accept scope)
Always asks on a terminal (type the order id). Without a terminal it needs --yes --confirm <order_id>. The CLI refuses to try when rf whoami does not list orders:accept: that scope can only be granted by a person in the web app and must never be handed to an autonomous agent.
Changes something, so --dry-run shows the request(s) without sending them.
| Option | What it does |
|---|---|
--item <item_id> | accept only these delivered items (default: all delivered) |
--note <text> | note to the seller |
--confirm <order_id> | type the order id again (required without a terminal) |
rf orders cancel
rf orders cancel <order_id>Cancel an unpaid order
Changes something, so --dry-run shows the request(s) without sending them.
rf orders create
rf orders create [options]Create an order from a plan or from items. Nothing is paid until rf orders pay.
Changes something, so --dry-run shows the request(s) without sending them.
| Option | What it does |
|---|---|
--plan <plan_id> | order the paid items of a plan option |
--option <n> | plan option (default: recommended) |
--item <owner/slug[@version]> | item to buy (repeatable) |
--rail <rail> | payment rail (see rf api index; default: the platform default) |
--wallet <address> | your wallet, used to verify funds and as the default refund address |
--refund-address <address> | where refunds go |
--accept-days <n> | days you have to accept after delivery (1-60, default 7) |
--deliver-days <n> | days the seller has to deliver (default 7) |
rf orders create --plan pln_abc123
rf orders create --item acme/invoice-extractor@1.4.0 --rail simulatedrf orders deliver
rf orders deliver <order_id> [options]Seller: mark items as delivered (buyer access starts here; the buyer has the accept window to review)
Changes something, so --dry-run shows the request(s) without sending them.
| Option | What it does |
|---|---|
--item <item_id> | item id (itm_...) to deliver (repeatable) |
--version <v> | deliver this hosted version (type item_version) |
--url <url> | deliver by URL instead |
--note <text> | message to the buyer |
--body <json|@file> | full request body, for different access per item |
rf orders dispute
rf orders dispute <order_id> [options]Open a dispute: freezes the release of the disputed items until an operator decides
Changes something, so --dry-run shows the request(s) without sending them.
| Option | What it does |
|---|---|
--reason <text> | what is wrong (10-2000 characters, required) |
--item <item_id> | only these items (default: all delivered) |
--evidence <url> | evidence URL (repeatable, up to 10) |
rf orders get
rf orders get <order_id>Show an order: items, escrow state, payment instructions, next steps
rf orders list
rf orders list [options]List your orders (as buyer, or --role seller)
| Option | What it does |
|---|---|
--role <role> | buyer (default) | seller |
--state <state> | awaiting_payment | funded | settled | expired | cancelled |
--limit <n> | page size (server maximum applies) |
--cursor <cursor> | continue after this cursor (from a previous page) |
--all | follow every page (up to 10000 rows) |
rf orders pay
rf orders pay <order_id> [options]Pay an order into escrow (asks first; non-interactive runs need --yes and --max-spend)
Prints the items, total, fee, rail and destination, then asks "Proceed? [y/N]". Without a terminal it refuses (exit 11) unless --yes is given AND the total is within --max-spend / REUSEFORGE_MAX_SPEND_CENTS: --yes alone never pays. The token's own spend limit applies on top. On real rails send the funds first and pass the transaction with --tx.
Changes something, so --dry-run shows the request(s) without sending them.
| Option | What it does |
|---|---|
--tx <hash> | transaction reference (required on real rails; ignored on the simulated rail) |
--max-spend <usd> | spending ceiling for this invocation (or REUSEFORGE_MAX_SPEND_CENTS); required with --yes when there is no terminal |
--no-wait | do not wait for the order to become funded |
rf orders refund
rf orders refund <order_id> <item_id> [options]Seller: refund one item of an order to the buyer (irreversible)
Changes something, so --dry-run shows the request(s) without sending them.
| Option | What it does |
|---|---|
--note <text> | note to the buyer |
rf payouts
Seller payouts and earnings
rf payouts earnings
rf payouts earningsEscrowed, releasable, available and paid-out amounts
rf payouts list
rf payouts list [options]Your payouts as a seller
| Option | What it does |
|---|---|
--kind <kind> | payout kind |
--state <state> | payout state |
--limit <n> | page size (server maximum applies) |
--cursor <cursor> | continue after this cursor (from a previous page) |
--all | follow every page (up to 10000 rows) |
rf portfolio
rf portfolio [options]Your project backings: invested, dividends and ownership
| Option | What it does |
|---|---|
--holder <handle> | another account (public data) |
rf projects
Crowdfunded projects
rf projects abort
rf projects abort <project_id> [options]Vote to abort a project and refund the remaining funds (--undo withdraws the vote)
Changes something, so --dry-run shows the request(s) without sending them.
| Option | What it does |
|---|---|
--undo | withdraw your abort vote |
rf projects attach
rf projects attach <project_id> [options]Attach the hosted item that is the finished product of a project
Changes something, so --dry-run shows the request(s) without sending them.
| Option | What it does |
|---|---|
--item <owner/slug> | the product (required) |
rf projects back
rf projects back <project_id> [options]Pledge money to a project (spending rules apply: asks first; no terminal needs --yes and --max-spend)
Changes something, so --dry-run shows the request(s) without sending them.
| Option | What it does |
|---|---|
--amount <usd> | pledge in dollars (min $1, required) |
--rail <rail> | payment rail |
--tx <hash> | transaction reference on real rails |
--wallet <address> | your wallet |
--max-spend <usd> | spending ceiling for this invocation (or REUSEFORGE_MAX_SPEND_CENTS); required with --yes when there is no terminal |
rf projects create
rf projects create [options]Propose a crowdfunded build project
Changes something, so --dry-run shows the request(s) without sending them.
| Option | What it does |
|---|---|
--title <text> | title (required) |
--spec <text> | what should be built |
--deliverable <text> | a deliverable (repeatable) |
--goal <usd> | funding goal in dollars (min $10) |
--deadline-days <n> | days to reach the goal (1-180, default 30) |
--developer <handle:budget_bps:equity_bps> | developer and shares (repeatable; budget shares total 10000) |
--milestone <name:bps> | milestone and its share of the budget (repeatable; totals 10000) |
--body <json|@file> | full request body instead of the flags |
rf projects deliver
rf projects deliver <project_id> <index> [options]Developer: submit evidence that a milestone is done
Changes something, so --dry-run shows the request(s) without sending them.
| Option | What it does |
|---|---|
--evidence <text|url> | what you delivered (required) |
rf projects finalize
rf projects finalize <project_id> <index>Close voting on a milestone once the outcome is decided
Changes something, so --dry-run shows the request(s) without sending them.
rf projects get
rf projects get <project_id>Show a project: milestones, developers, cap table
rf projects list
rf projects list [options]Crowdfunded build projects
| Option | What it does |
|---|---|
--state <state> | funding | funded | ... |
--proposer <handle> | projects proposed by this account |
--limit <n> | page size (server maximum applies) |
--cursor <cursor> | continue after this cursor (from a previous page) |
--all | follow every page (up to 10000 rows) |
rf projects transfer
rf projects transfer <project_id> [options]Transfer revenue units of a project to another account (asks first)
Changes something, so --dry-run shows the request(s) without sending them.
| Option | What it does |
|---|---|
--to <handle> | recipient (required) |
--units <n> | number of units (required) |
--max-spend <usd> | spending ceiling for this invocation (or REUSEFORGE_MAX_SPEND_CENTS); required with --yes when there is no terminal |
rf projects vote
rf projects vote <project_id> <index> [options]Backer: approve or reject a submitted milestone (weighted by pledge)
Changes something, so --dry-run shows the request(s) without sending them.
| Option | What it does |
|---|---|
--approve | approve the milestone |
--reject | reject the milestone |
rf projects withdraw
rf projects withdraw <project_id> <backing_id>Withdraw a pledge that is not yet confirmed
Changes something, so --dry-run shows the request(s) without sending them.
rf events
Webhook event types
rf events types
rf events typesWebhook event types
rf webhooks
Webhook endpoints and deliveries
rf webhooks create
rf webhooks create [options]Create an endpoint. The signing secret (whsec_...) is printed once.
Changes something, so --dry-run shows the request(s) without sending them.
| Option | What it does |
|---|---|
--url <https-url> | where events are POSTed (required; private addresses are refused) |
--events <list> | event types, comma separated, or * (required; see rf events types) |
--description <text> | label |
--account <org> | organization handle you administer (default: you) |
rf webhooks delete
rf webhooks delete <webhook_id>Delete an endpoint (pending deliveries are dropped)
Changes something, so --dry-run shows the request(s) without sending them.
rf webhooks deliveries
rf webhooks deliveries <webhook_id> [options]Delivery log of an endpoint
| Option | What it does |
|---|---|
--state <state> | succeeded | failed | pending |
--event-type <type> | only this event type |
--limit <n> | page size (server maximum applies) |
--cursor <cursor> | continue after this cursor (from a previous page) |
--all | follow every page (up to 10000 rows) |
rf webhooks get
rf webhooks get <webhook_id>Show one endpoint
rf webhooks list
rf webhooks list [options]List webhook endpoints
| Option | What it does |
|---|---|
--limit <n> | page size (server maximum applies) |
--cursor <cursor> | continue after this cursor (from a previous page) |
--all | follow every page (up to 10000 rows) |
rf webhooks redeliver
rf webhooks redeliver <webhook_id> <delivery_id>Send an earlier event again (same event id; receivers must de-duplicate)
Changes something, so --dry-run shows the request(s) without sending them.
rf webhooks rotate-secret
rf webhooks rotate-secret <webhook_id>Rotate the signing secret; the old one keeps verifying for a grace period. The new secret is printed once.
Changes something, so --dry-run shows the request(s) without sending them.
rf webhooks test
rf webhooks test <webhook_id>Send a ping event to an endpoint and show the delivery attempt
Changes something, so --dry-run shows the request(s) without sending them.
rf webhooks update
rf webhooks update <webhook_id> [options]Change URL, events, description or enable/disable an endpoint
Changes something, so --dry-run shows the request(s) without sending them.
| Option | What it does |
|---|---|
--url <https-url> | new URL |
--events <list> | replace the event list |
--description <text> | new label |
--status <enabled|disabled> | enable or disable |
rf accounts
Public account profiles
rf accounts get
rf accounts get <handle>Public profile of a user or organization
rf api
API meta: index, health, openapi, rate-limit
rf api health
rf api healthLiveness and dependency check (exit 9 when the API reports itself down)
rf api index
rf api indexThe API entry point: version, links, payment rails, limits, deprecations
rf api openapi
rf api openapi [options]Fetch the OpenAPI contract this deployment serves
| Option | What it does |
|---|---|
--format <json|yaml> | document format (default json) |
--out <file> | write the document to this file instead of stdout |
rf api rate-limit
rf api rate-limitYour current rate-limit windows per tier
rf completion
rf completion <shell>Print a shell completion script (bash, zsh or fish)
Install, for example: rf completion bash > ~/.local/share/bash-completion/completions/rf
rf config
Read and write rf configuration (api_url, profile, target)
rf config get
rf config get [key]Show the effective value (and where it comes from) of api_url, profile or target
rf config set
rf config set <key> <value> [options]Set api_url, profile or target in the user config (or the project config with --project)
Config files never hold tokens. Environment variables and flags still override these values; see rf config get.
Changes something, so --dry-run shows the request(s) without sending them.
| Option | What it does |
|---|---|
--project | write ./.reuseforge/config.json instead of the user config |
rf config unset
rf config unset <key> [options]Remove a key from the user config (or the project config with --project)
Changes something, so --dry-run shows the request(s) without sending them.
| Option | What it does |
|---|---|
--project | edit ./.reuseforge/config.json instead of the user config |
rf doctor
rf doctorCheck configuration, credentials, connectivity, token scopes and clock skew
Prints the effective configuration without secrets. Exit 0 when nothing failed (warnings are fine); otherwise the exit code of the first failure (3 credentials, 9 network).
rf ledger
Ledger events of self-hosted nodes
rf ledger pull
rf ledger pull [options]Read signed ledger events (JSON, or JSONL with --out)
| Option | What it does |
|---|---|
--since <cursor> | continue after this cursor (empty: from the beginning) |
--kind <kinds> | only these event kinds, e.g. block.publish,review |
--limit <n> | page size (server maximum applies) |
--all | follow every page (up to 10000 rows) |
--out <file> | write one event per line to this file |
rf ledger push
rf ledger push [file]Submit signed events (from a file or stdin) to the API; invalid ones are reported, never blocking the rest
The file holds a JSON array, {"events": [...]}, or one event per line. "-" or no file reads stdin. Batches of 500 events / 2.5 MiB, each with a deterministic idempotency key so a repeat is harmless. Needs the items:write scope.
Changes something, so --dry-run shows the request(s) without sending them.
rf ledger sync
rf ledger sync <node_url> [options]Two-way sync with a self-hosted node: pull its new events into the API, then pull the API's new events into the node
The node is any server that speaks /ledger/events. Its token comes from REUSEFORGE_NODE_TOKEN (never from your ReuseForge token, which is not sent to other servers). Cursors are remembered per node in the user config directory so the next run only moves new events.
Changes something, so --dry-run shows the request(s) without sending them.
| Option | What it does |
|---|---|
--direction <both|pull|push> | pull = node -> API, push = API -> node (default both) |
--kind <kinds> | only these event kinds, e.g. block.publish,review |
rf marketplaces
The hosted Claude Code marketplace of an account (its public, free, active items)
rf marketplaces get
rf marketplaces get <owner>The hosted Claude Code marketplace of an account (its public, free, active items)
rf mcp
Hosted MCP server: mcp serve is a stdio proxy
rf mcp serve
rf mcp serve [options]Run a local stdio MCP server that proxies to the hosted ReuseForge tools with your credentials
For MCP clients without remote-MCP support: command "rf", args ["mcp", "serve"]. Stdout carries only protocol messages; diagnostics go to stderr. accept_order is never forwarded (releasing escrow needs a human: rf orders accept). The token is used as stored; to limit what an agent can spend, give it a token with --spend-limit.
| Option | What it does |
|---|---|
--read-only | forward only tools annotated readOnlyHint (search, plan, install descriptors, ...) |
--url <url> | MCP endpoint (default: <api origin>/mcp) |
Last updated: