9. Command line
The command is scf. factory still works as an alias and prints a short note.
| Command | What it does |
|---|---|
scf ui [--port 4777] [--no-open] [--dev] | Web UI, queue and watchers. Restarts itself when a new build is installed and no run is active (set SCF_NO_SUPERVISE=1 to turn that off) |
scf serve [--port 4777] [--dev] | The same without opening a browser. --dev (also on scf ui) serves the component gallery at /gallery/ for developers; leave it off in normal use |
scf service install | uninstall | status | Run scf serve in the background (macOS) |
scf run <flow> --task "…" [--var k=v] [--repo dir] | Run a flow |
scf resume <run-id> [--from <step>] [--force] | Continue a run. Refused when its issue is closed on GitHub; --force continues anyway |
scf approve <run-id> [--note "…"] [--force] / scf reject … | Decide on a waiting run. Refused for a closed issue, like resume |
scf flows / scf blocks | List flows / library blocks |
scf new <name> [--from <flow>] [--global] | Create a flow from a template |
scf skills [--repo dir] | List skill packages with trust, pin state, digest and effect (effect helps|no-effect|harms|not-measured|invalid, from the newest record of the digest), plus notes and problems with full paths; exits 1 when there are problems (also a changed pinned package) |
scf skills pin <id@version> <digest> [--replace] | Approve a listed package by its digest; --replace accepts a changed package. Refused for repository skills |
scf skills pin --builtin | Pin the built-in skills that have no pin; exits 1 when one has changed since its pin |
scf skills unpin <id@version> | Remove a pin; exits 1 when there is none |
scf skills lifecycle [<id@version> [<state> --reason <text> [--replacement <id@version>]]] [--runs-dir <dir>] | List the skills that are not active, print the history of one, or set deprecated, quarantined, retired, revoked or active (see Skill lifecycle); a state change also lists the runs that lock the version |
scf skills allow-run <run-id> <id@version> --reason <text> [--runs-dir <dir>] | Let one run go on with a quarantined version; then resume the run |
scf skills overrides check [<file>] | Check the owner overrides (skill-overrides.yaml); prints each entry with its digest; exits 1 on a problem or an expired entry |
scf skills connectors | List the reviewed skill source connectors (id, repository, roots, trust, licences); offline; reads no files |
scf skills project-pins check [<file>] | Check the project pins (.claude-factory/skill-pins.yaml); same output and exit codes |
scf skills assess <source-id> | Print the workflow report of a staged import (CONFLICT, CANDIDATE, EXCLUDED lines); offline and read-only; exits 1 only for a PROBLEM (Assess an import) |
scf skills compare <source-id> | Compare a staged import with the built-in java and spring-boot skills (SKILL, COLLISION, RECOMMEND, CONFLICT lines); for a community source also PROMOTABLE and REFUSED lines; offline and read-only; exits 1 on a conflict, a blocking collision, a refused candidate or a PROBLEM (Compare an import) |
scf skills selections evaluate <source-id> [<selections-file>] | Print per skill of a staged import whether it is ELIGIBLE or HELD, and the OVERLAP lines; offline and read-only; writes nothing; exits 1 for a PROBLEM or a usage error (Evaluate an import) |
scf skills evaluate <source-id> [<technology>@<version> ... | --repo <dir>] | Report compatibility, tools, access, licence and overlap of an enabled source; --repo reads the versions from the package.json files of a folder (sources with a reviewed profile only); writes nothing; exits 1 on a refusal, a block, a conflict, a missing selected folder or a PROBLEM (Evaluate a source) |
scf skills scan <source-id> [<exceptions-file>] | Print the security report of a staged import (FINDING, BLOCKED, OK lines) and, for a known source, the connector report (CONNECTOR lines); offline and read-only; exits 1 when a skill is blocked or a PROBLEM is printed (Scan an import) |
scf skills profiles evaluate <source-id> | Print PASS or BLOCKED per staged skill of a profiled source, with the gate reasons, NEEDS and MISSING lines, and the CANONICAL, CONFLICT, NONE and REJECTED lines per exclusive capability; offline and read-only; exits 1 when a skill is blocked, a PROBLEM is printed or a CONFLICT is found (Evaluate the profile gates, Canonical skill per capability) |
scf skills promote check <source-id> [<exceptions-file>] | Print per skill path whether licence, provenance, findings, evaluations and effect allow promotion (PROMOTABLE, REFUSED, LICENCES, ASSUMES, EVALUATION, EFFECT, CHECKED lines); reads skill-evaluations.yaml (evaluations and effect decisions), skill-selections.yaml and the effect records; offline and read-only; exits 1 when a path is refused or a PROBLEM is printed (Check a promotion, Confluent skills) |
scf skills overlap <source-id> | Compare a staged import with the registered skills: CANONICAL, REJECTED, CONFLICT, NONE, NEW, VERSIONS, PROBLEM and OVERLAP lines; reads skill-selections.yaml; offline and read-only; exits 1 for a conflict or a PROBLEM (Overlap with the catalogue) |
scf skills update <source-id> [--owner <@user>] [--reviewer <@user>] [--licence <id>] | Stage the upstream commit of a source and open a pull request that proposes it, or refresh the open one (UNCHANGED, OPEN, UPDATED or OK line); approves nothing (Update a source) |
scf skills update --due [--all] | Check every enabled source whose update cadence is due (--all: every enabled source), one line per outcome per source and a CHECKED summary; exits 1 on any PROBLEM (Check every due source) |
scf skills review <source-id> [--markdown] | Print the licence, attribution, scan and collision report of a staged import, grouped by category (REVIEW, SKILL, COLLISION, REVIEWED lines); offline and read-only; --markdown for a pull-request body; exits 1 when a skill is blocked, a licence is not allowed, a blocking collision exists or a PROBLEM is printed (Review an import) |
scf skills score <source-id> [<suite-file>] [--agent] | Score every skill of a staged import with the suite (default skill-evaluation.yaml) and store one record each under skill-evaluations/; offline, except --agent, which also runs the instructions scenarios in the macOS sandbox (Run the scenarios in the sandbox); exits 1 on a PROBLEM (Score and gate an import) |
scf skills gate <source-id> [<suite-file>] | Print PASSED, FAILED (with reason codes, including the effect codes), DECISION or PROBLEM per staged skill from its newest evaluation record and its newest effect record; offline and read-only; exits 1 when a skill fails or a PROBLEM is printed (Score and gate an import) |
scf skills effect <source-id> <skill-id> [<suite-file>] or scf skills effect <id@version> [<suite-file>] | Run the skill's sample tasks with and without the skill in the macOS sandbox and store the verdict (helps, no-measurable-effect or harms) under skill-effects/; prints RUN, SKIPPED, EFFECT, STORED lines; exits 1 on a PROBLEM or an interrupt (Measure the effect of a skill) |
scf validate <flow or file> | Check a flow |
scf flow-guide | Print the flow-writing guide for AI assistants (Let any AI write a flow) |
scf watch [flow] --var github_repo=o/r [--source …] [--once] | Run one watcher from the terminal |
scf eval <suite.yaml> [--flows a,b] [--models …] | Run an eval suite |
scf eval help [--live] | Check Ask SCF against its fixed scenarios; without --live no model is called |
scf clean [--older-than 7] [--purge] [--dry-run] [--evidence-older-than days] | Remove old run workspaces. With --evidence-older-than it also removes the evidence of the cleaned runs that ended at least that many days ago (Evidence of a run). With --purge it also removes plan records (see below) older than the larger of 90 days and --older-than |
scf user create [--admin] [--name n] [--email e] | Create an account. The first one needs --admin. Name and e-mail are asked for on a terminal |
scf user list | List accounts with the last sign-in; no password yet for an account that has not set one (never shows passwords, hashes or links) |
scf user role <e-mail> admin|user | Change the role of an account (not the last admin); counts from the next call |
scf user password <e-mail> | Set a new password and sign the account out; also for an account without a password (its link ends) |
scf user block <e-mail> [--stop-work] / scf user unblock <e-mail> | Block (and sign out) or unblock an account (not the last admin). Queued jobs are cancelled; --stop-work also cancels running and waiting runs |
scf user delete <e-mail> | Delete an account, its sessions and its stored credentials (not the last admin) |
scf credential rotate-key | Re-encrypt all stored credentials under a new key |
scf credential check | Check that the macOS Keychain can store, read and remove the key |
scf evidence verify <run-id> [--json] [--runs-dir dir] | Check the evidence of a run: manifest, chain of events and named files (Evidence of a run). Exit code 0 verified, 1 not verified, 2 nothing to verify |
scf monitor off / on / status | Stop the monitor from making bug stories, let it make them again (this also closes the circuit breaker), or print the state and the mutes. Works when the server is not running |
Plan records. When issue-plan posts a plan, the Foundry saves a small plan record in
<data folder>/skill-plans/. It holds the skill request, the plan comment ID and hash, the HEAD
commit and the technology hash — never the plan text. If the record cannot be written and skills
are in play, the run stops with skills not resolved: … and resumes at post_plan; without
skills it only logs a warning. scf clean --purge and the Admin clean-up remove records older than
the larger of 90 days and the cut-off, and report and N plan record(s). A dry run only counts.
Records are only touched when the runs folder is the default one in the data folder.
The password is asked twice on a terminal, or read from the first line of stdin; it is never an
option or an environment variable. A password has 12 to 200 characters and must not be a common
one; scf user create and scf user password refuse others and change nothing. No command needs a signed-in session; only the web UI does.
Environment variables#
Both names work; if both are set, SCF_… wins.
| Variable | Old name | What it does |
|---|---|---|
SCF_HOME | FACTORY_HOME | Data folder (default ~/.spaghetti-code-foundry) |
SCF_CLAUDE_BIN | FACTORY_CLAUDE_BIN | Claude Code program to run |
SCF_CODEX_BIN | FACTORY_CODEX_BIN | Codex program to run |
SCF_GH_BIN | FACTORY_GH_BIN | gh program to run |
SCF_NO_OPEN | FACTORY_NO_OPEN | Set to 1 to not open a browser |
SCF_NO_SUPERVISE | FACTORY_NO_SUPERVISE | Set to 1 to not restart the server on a new build |
SCF_NO_NOTIFY | FACTORY_NO_NOTIFY | Set to 1 to turn notifications off |
SCF_NO_FAILURE_MODEL | FACTORY_NO_FAILURE_MODEL | Set to 1 to skip the model call that writes the reason of a failed run |
SCF_LOCK_DIR | FACTORY_LOCK_DIR | Where lock files are kept |
Flows are looked up in <repo>/.claude-factory/flows/, then ~/.spaghetti-code-foundry/flows/, then the
built-in ones.