On this page

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.

bash
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 read

A 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

bash
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 guide

Everything 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:

  1. flags;
  2. environment: REUSEFORGE_TOKEN, REUSEFORGE_API_URL, REUSEFORGE_PROFILE, REUSEFORGE_MAX_SPEND_CENTS, NO_COLOR, REUSEFORGE_CONFIG_DIR;
  3. the project file ./.reuseforge/config.json (api_url, profile, target; never tokens), found by walking up to the git root;
  4. the user config $XDG_CONFIG_HOME/reuseforge/config.json (default ~/.config/reuseforge/, %APPDATA%\reuseforge on Windows);
  5. credentials.json next to it, mode 0600 (the CLI refuses to read it if group or world readable): {"profiles": {"default": {"api_url", "token", "account"}}};
  6. 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.

CodeMeaning
0success
1unexpected error
2usage error (unknown flag, missing argument)
3authentication or permission (401, and 403 except spend limit)
4not found or gone (404, 410)
5conflict, stale state, unsatisfiable lock (409, 412, 428, resolution conflicts)
6invalid input (400, 413, 415, 422 except payment_invalid)
7payment: payment_required, spend_limit_exceeded, payment_invalid, rail_unsupported, or a total above --max-spend
8rate limited after retries (429)
9network or server failure (timeouts, DNS, 5xx, and 501 on a deployment that lacks the operation)
10integrity failure (hash or signature mismatch, tampered download, unsafe path)
11confirmation required or declined
130interrupted

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:

bash
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.

  1. 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 ask Proceed? [y/N] on a terminal.
  2. --yes alone never pays. Without a terminal (or with --no-input) a spend needs --yes and a ceiling: --max-spend <usd> or REUSEFORGE_MAX_SPEND_CENTS, checked against the order total before any request is sent. This CLI also requires the ceiling with --yes on a terminal.
  3. orders accept releases 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 unless rf whoami lists the orders:accept scope, which only a person can grant. rf mcp serve never forwards it.
  4. rf install never pays. For a paid item it prints the server's order_hint and exits 7; --buy creates the order and applies rules 1 and 2.
  5. 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 whoami shows 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.

bash
rf completion bash > ~/.local/share/bash-completion/completions/rf
rf completion zsh  > "${fpath[1]}/_rf"
rf completion fish > ~/.config/fish/completions/rf.fish

Commands

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.

Global options
OptionWhat 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")
--jsonprint JSON (the default when stdout is not a terminal)
--no-jsonprint human text even when stdout is not a terminal
-q, --quietonly results and errors
-v, --verboseprint method, URL, status and request id of every request (never the token)
--no-colorno ANSI colours (NO_COLOR is honoured too)
--no-inputnever prompt; fail instead
-y, --yesanswer yes to confirmations (never enough to spend money, see --max-spend)
--dry-runshow the requests a mutating command would send, send none
--timeout <value>per-request timeout in seconds (default 30)
-h, --helpshow help
--versionprint the version

Commands

Commands
CommandWhat it does
rf loginStore a token for this machine
rf logoutRemove the stored token
rf tokensPersonal access tokens
rf whoamiShow the signed-in account, scopes and spend allowance
rf itemsItems: get, create, update, retract, star, stats
rf reviewsReviews: list, create, delete
rf searchSearch hosted items
rf versionsVersions: list, get, yank, download
rf initScaffold reuseforge.json from the current directory
rf publishPublish the project in the current directory as a new version
rf installInstall items (and their dependencies) into this project
rf listList installed items from reuseforge.lock
rf lockResolve and write reuseforge.lock without installing files
rf uninstallRemove an installed item (only files that still match the lock)
rf updateRe-resolve installed items within their ranges
rf verifyCheck installed files against the lock (offline); verify request\|get for verifications
rf connectorsDiscovery connectors
rf discoverSearch external sources (GitHub, npm, PyPI, arXiv, ...)
rf mcp-configPrint or write MCP server configuration for a plan
rf planTurn a goal and a budget into a Pareto-optimal plan
rf plansStored plans: get, brief
rf adminOperator actions
rf ordersOrders and escrow: create, pay, accept, dispute, ...
rf payoutsSeller payouts and earnings
rf portfolioYour project backings and revenue units
rf projectsCrowdfunded projects
rf eventsWebhook event types
rf webhooksWebhook endpoints and deliveries
rf accountsPublic account profiles
rf apiAPI meta: index, health, openapi, rate-limit
rf completionPrint a shell completion script (bash, zsh, fish)
rf configRead and write rf configuration (api_url, profile, target)
rf doctorCheck configuration, connectivity, credentials and clock skew
rf ledgerLedger events of self-hosted nodes
rf marketplacesThe hosted Claude Code marketplace of an account (its public, free, active items)
rf mcpHosted MCP server: mcp serve is a stdio proxy

rf login

text
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.

Options of rf login
OptionWhat it does
--with-tokenread the token from stdin (CI, scripts)
--no-browserdo not try to open the token page

rf logout

text
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.

Options of rf logout
OptionWhat it does
--revokerevoke the token with the API before removing it (needs tokens:manage)

rf tokens

Personal access tokens

rf tokens create

text
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.

Options of rf tokens create
OptionWhat 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-acceptpermit the orders:accept scope (releases escrow)

rf tokens list

text
rf tokens list [options]

List your tokens (never the secrets)

Options of rf tokens list
OptionWhat it does
--limit <n>page size (server maximum applies)
--cursor <cursor>continue after this cursor (from a previous page)
--allfollow every page (up to 10000 rows)

rf tokens revoke

text
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

text
rf whoami

Show the signed-in account, token scopes and remaining spend allowance

rf items

Items: get, create, update, retract, star, stats

rf items create

text
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.

Options of rf items create
OptionWhat 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

text
rf items descriptor <item> [options]

Show the install descriptor of an item for a target (what rf install would write)

Options of rf items descriptor
OptionWhat it does
--target <target>generic | claude-code | cursor | codex | mcp-json

rf items get

text
rf items get <item> [options]

Show one item

Options of rf items get
OptionWhat it does
--readmealso print the README

rf items retract

text
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.

text
rf items search [query]... [options]

Search hosted items (alias of rf items search)

Options of rf items search
OptionWhat 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)
--freefree items only
--verifieditems 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)
--allfollow every page (up to 10000 rows)
bash
rf search rag --kind skill --free
rf search "invoice pdf" --max-price 20 --sort rating

rf items star

text
rf items star <item>

Star an item

Changes something, so --dry-run shows the request(s) without sending them.

rf items stats

text
rf items stats <item> [options]

Views, downloads, stars, reviews and sales of an item (daily series for owners)

Options of rf items stats
OptionWhat it does
--days <n>days of history for owners

rf items unstar

text
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

text
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.

Options of rf items update
OptionWhat 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

text
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.

Options of rf reviews create
OptionWhat it does
--rating <1-5>stars (required)
--title <text>headline
--body <text>review text

rf reviews delete

text
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

text
rf reviews list <item> [options]

List reviews of an item

Options of rf reviews list
OptionWhat 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)
--allfollow every page (up to 10000 rows)
text
rf search [query]... [options]

Search hosted items (alias of rf items search)

Options of rf search
OptionWhat 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)
--freefree items only
--verifieditems 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)
--allfollow every page (up to 10000 rows)
bash
rf search rag --kind skill --free
rf search "invoice pdf" --max-price 20 --sort rating

rf versions

Versions: list, get, yank, download

rf versions download

text
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.

Options of rf versions download
OptionWhat it does
--out <path>destination directory (default ./<slug>-<version>); with --format zip the .zip file (default ./<slug>-<version>.zip)
--forcewrite 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

text
rf versions get <item> [version]

Show one version: files, dependencies, verification

rf versions list

text
rf versions list <item> [options]

List published versions of an item

Options of rf versions list
OptionWhat it does
--limit <n>page size (server maximum applies)
--cursor <cursor>continue after this cursor (from a previous page)
--allfollow every page (up to 10000 rows)

rf versions yank

text
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.

Options of rf versions yank
OptionWhat it does
--reason <text>why it was yanked (shown to installers)
--undoun-yank

rf versions publish

text
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.

Options of rf versions publish
OptionWhat 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-secretspublish even if files look like they contain secrets
--verifyrequest an attested test run after publishing (uses test.command from the manifest)
--waitwith --verify: wait for the result

rf init

text
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.

Options of rf init
OptionWhat 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)
--forceoverwrite an existing reuseforge.json

rf publish

text
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.

Options of rf publish
OptionWhat 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-secretspublish even if files look like they contain secrets
--verifyrequest an attested test run after publishing (uses test.command from the manifest)
--waitwith --verify: wait for the result

rf install

text
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.

Options of rf install
OptionWhat 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)
--forceoverwrite modified files and conflicting config keys
--frozenCI mode: install exactly what reuseforge.lock says, never write it, fail if it would change
--buybuy 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-commandsrun the descriptor's suggested commands after installing (asks first; never runs commands marked "never")
--allow-homeallow descriptors that write into your home directory (~/...)
--include-prereleaseallow prerelease versions when resolving ranges
--saveadd the requested items to dependencies in reuseforge.json
bash
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 20

rf list

text
rf list [options]

List what reuseforge.lock says is installed

Options of rf list
OptionWhat it does
--dest <dir>project root to install into (default: current directory)

rf lock

text
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.

Options of rf lock
OptionWhat 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-prereleaseallow prerelease versions when resolving ranges

rf uninstall

text
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.

Options of rf uninstall
OptionWhat 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

text
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.

Options of rf update
OptionWhat 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)
--forceoverwrite modified files and conflicting config keys
--buybuy 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-commandsrun the descriptor's suggested commands after installing (asks first; never runs commands marked "never")
--allow-homeallow descriptors that write into your home directory (~/...)
--include-prereleaseallow prerelease versions when resolving ranges

rf verify

text
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.

Options of rf verify
OptionWhat it does
--dest <dir>project root to install into (default: current directory)
--strictalso fail (exit 10) for external blocks, which cannot be verified

rf verify get

text
rf verify get <verification_id>

Show a verification (vrf_...)

rf verify request

text
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.

Options of rf verify request
OptionWhat it does
--waitpoll until the run finishes (exit 10 if it failed)

rf connectors

Discovery connectors

rf connectors list

text
rf connectors list [options]

List discovery connectors and whether they are ready

Options of rf connectors list
OptionWhat it does
--limit <n>page size (server maximum applies)
--cursor <cursor>continue after this cursor (from a previous page)
--allfollow every page (up to 10000 rows)

rf discover

text
rf discover <query>... [options]

Search external sources (GitHub, npm, PyPI, crates, arXiv, HF, MCP registries) without planning

Options of rf discover
OptionWhat 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

text
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.

Options of rf mcp-config
OptionWhat it does
--plan <plan_id>derive servers from a plan
--goal <text>derive servers from a goal
--capabilities <list>capability ids
--writemerge 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)
--forceoverwrite entries that already exist with different values
--dest <dir>project root

rf plan

text
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.

Options of rf plan
OptionWhat it does
--budget <usd>total budget in dollars (omit for none)
--onlinealso search external sources (GitHub, npm, PyPI, arXiv, MCP registries, ...)
--connectors <list>restrict external discovery to these connectors
--llmdecompose the goal with an LLM instead of the keyword taxonomy
--per-requirement <n>candidates considered per requirement (1-8)
--exclude-paidnever plan paid items
--prefer-freeprefer a free plan when it scores within 0.10 of the best
--require-verifiedonly 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
bash
rf plan "RAG chatbot over my PDF invoices" --budget 50
rf plan "scrape and summarize arXiv papers" --online --exclude-paid --out plan.json

rf plans

Stored plans: get, brief

rf plans brief

text
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)

Options of rf plans brief
OptionWhat it does
--option <n>plan option (default: recommended)

rf plans get

text
rf plans get <plan_id>

Show a stored plan

rf admin

Operator actions

rf admin resolve

text
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.

Options of rf admin resolve
OptionWhat 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

text
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.

Options of rf orders accept
OptionWhat 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

text
rf orders cancel <order_id>

Cancel an unpaid order

Changes something, so --dry-run shows the request(s) without sending them.

rf orders create

text
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.

Options of rf orders create
OptionWhat 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)
bash
rf orders create --plan pln_abc123
rf orders create --item acme/invoice-extractor@1.4.0 --rail simulated

rf orders deliver

text
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.

Options of rf orders deliver
OptionWhat 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

text
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.

Options of rf orders dispute
OptionWhat 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

text
rf orders get <order_id>

Show an order: items, escrow state, payment instructions, next steps

rf orders list

text
rf orders list [options]

List your orders (as buyer, or --role seller)

Options of rf orders list
OptionWhat 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)
--allfollow every page (up to 10000 rows)

rf orders pay

text
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.

Options of rf orders pay
OptionWhat 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-waitdo not wait for the order to become funded

rf orders refund

text
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.

Options of rf orders refund
OptionWhat it does
--note <text>note to the buyer

rf payouts

Seller payouts and earnings

rf payouts earnings

text
rf payouts earnings

Escrowed, releasable, available and paid-out amounts

rf payouts list

text
rf payouts list [options]

Your payouts as a seller

Options of rf payouts list
OptionWhat 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)
--allfollow every page (up to 10000 rows)

rf portfolio

text
rf portfolio [options]

Your project backings: invested, dividends and ownership

Options of rf portfolio
OptionWhat it does
--holder <handle>another account (public data)

rf projects

Crowdfunded projects

rf projects abort

text
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.

Options of rf projects abort
OptionWhat it does
--undowithdraw your abort vote

rf projects attach

text
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.

Options of rf projects attach
OptionWhat it does
--item <owner/slug>the product (required)

rf projects back

text
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.

Options of rf projects back
OptionWhat 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

text
rf projects create [options]

Propose a crowdfunded build project

Changes something, so --dry-run shows the request(s) without sending them.

Options of rf projects create
OptionWhat 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

text
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.

Options of rf projects deliver
OptionWhat it does
--evidence <text|url>what you delivered (required)

rf projects finalize

text
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

text
rf projects get <project_id>

Show a project: milestones, developers, cap table

rf projects list

text
rf projects list [options]

Crowdfunded build projects

Options of rf projects list
OptionWhat 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)
--allfollow every page (up to 10000 rows)

rf projects transfer

text
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.

Options of rf projects transfer
OptionWhat 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

text
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.

Options of rf projects vote
OptionWhat it does
--approveapprove the milestone
--rejectreject the milestone

rf projects withdraw

text
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

text
rf events types

Webhook event types

rf webhooks

Webhook endpoints and deliveries

rf webhooks create

text
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.

Options of rf webhooks create
OptionWhat 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

text
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

text
rf webhooks deliveries <webhook_id> [options]

Delivery log of an endpoint

Options of rf webhooks deliveries
OptionWhat 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)
--allfollow every page (up to 10000 rows)

rf webhooks get

text
rf webhooks get <webhook_id>

Show one endpoint

rf webhooks list

text
rf webhooks list [options]

List webhook endpoints

Options of rf webhooks list
OptionWhat it does
--limit <n>page size (server maximum applies)
--cursor <cursor>continue after this cursor (from a previous page)
--allfollow every page (up to 10000 rows)

rf webhooks redeliver

text
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

text
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

text
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

text
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.

Options of rf webhooks update
OptionWhat 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

text
rf accounts get <handle>

Public profile of a user or organization

rf api

API meta: index, health, openapi, rate-limit

rf api health

text
rf api health

Liveness and dependency check (exit 9 when the API reports itself down)

rf api index

text
rf api index

The API entry point: version, links, payment rails, limits, deprecations

rf api openapi

text
rf api openapi [options]

Fetch the OpenAPI contract this deployment serves

Options of rf api openapi
OptionWhat it does
--format <json|yaml>document format (default json)
--out <file>write the document to this file instead of stdout

rf api rate-limit

text
rf api rate-limit

Your current rate-limit windows per tier

rf completion

text
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

text
rf config get [key]

Show the effective value (and where it comes from) of api_url, profile or target

rf config set

text
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.

Options of rf config set
OptionWhat it does
--projectwrite ./.reuseforge/config.json instead of the user config

rf config unset

text
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.

Options of rf config unset
OptionWhat it does
--projectedit ./.reuseforge/config.json instead of the user config

rf doctor

text
rf doctor

Check 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

text
rf ledger pull [options]

Read signed ledger events (JSON, or JSONL with --out)

Options of rf ledger pull
OptionWhat 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)
--allfollow every page (up to 10000 rows)
--out <file>write one event per line to this file

rf ledger push

text
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

text
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.

Options of rf ledger sync
OptionWhat 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

text
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

text
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.

Options of rf mcp serve
OptionWhat it does
--read-onlyforward only tools annotated readOnlyHint (search, plan, install descriptors, ...)
--url <url>MCP endpoint (default: <api origin>/mcp)

Last updated: