14 KiB
name, description
| name | description |
|---|---|
| wf-cli | Use when authoring, validating, deploying, running, or debugging workflows through the repo-local `wf` CLI. |
wf CLI
Use the wf CLI when an agent needs a shell-friendly workflow lifecycle:
- Discover capabilities.
- Create or patch a draft workspace.
- Validate the draft.
- Save an artifact.
- Save and validate a deployment.
- Run the deployment.
- Read bounded trace slices only when debugging.
Canonical docs:
docs/wf_cli.mddocs/workflow_capabilities.mddocs/workflow_drafts.mddocs/workflow_artifacts.mddocs/durable_run_operations.md
If the workflow object model is unclear, read
skills/wf-workflow/references/system-model.md before choosing commands.
Core Commands
wf --config wf.config.json status
wf cap list --format ids
wf cap inspect <capability>
wf cap call <capability> --input '{"field":"value"}'
wf draft create <workspace_id> --name <name>
wf draft create <workspace_id> --capability <capability>
wf draft inspect <workspace_id> --include-draft
wf draft export <workspace_id> --output draft.json
wf draft import <workspace_id> --revision <n> --file draft.json
wf draft patch <workspace_id> --revision <n> --input-file patch.json
wf draft set-name <workspace_id> --revision <n> --name <name>
wf draft set-start <workspace_id> --revision <n> --step <step_id>
wf draft set-contract <workspace_id> --revision <n> --state-schema-file state.schema.json --outcome ok --outcome error
wf draft set-route <workspace_id> --revision <n> --step <step_id> --outcome <outcome> --to <target>
wf draft set-input <workspace_id> --revision <n> --step <step_id> --map input.title=report.title
wf draft set-input <workspace_id> --revision <n> --step <step_id> --value request.format='"markdown"'
wf draft set-input <workspace_id> --revision <n> --step <step_id> --bindings-file bindings.json
wf draft set-input <workspace_id> --revision <n> --step <step_id> --clear
wf draft set-input <workspace_id> --revision <n> --step <step_id> --merge --map input.other=other
wf draft set-output <workspace_id> --revision <n> --step <step_id> --map text=state.text
wf draft set-output <workspace_id> --revision <n> --step <step_id> --bindings-file bindings.json
wf draft set-output <workspace_id> --revision <n> --step <step_id> --clear
wf draft set-output <workspace_id> --revision <n> --step <step_id> --merge --map other=state.other
wf draft set-workflow-output <workspace_id> --revision <n> \
--map state.value=result --value format='"markdown"'
wf draft set-workflow-output <workspace_id> --revision <n> \
--bindings-file output-bindings.json
wf draft set-workflow-output <workspace_id> --revision <n> --clear
wf draft set-workflow-output <workspace_id> --revision <n> \
--merge --map state.other=other
wf draft branch <workspace_id> --revision <n> --step <step_id> --route ok=__end__ --route error=fail
wf draft handle <workspace_id> --revision <n> --to fail --branch lookup:error --branch transform:error
wf draft compile <workspace_id>
wf draft bind <workspace_id> --revision <n> --step <step_id> --from local.document.markdown --to state.document.markdown
wf draft bind <workspace_id> --revision <n> --step <step_id> --from input.title --to local.document.title
wf draft add capability <workspace_id> --revision <n> --step <step_id> --capability <qualified_name> --from-step <prev> --from-outcome ok --route ok=__end__ --route error=fail --input input.title=report.title --bind-output result=state.result
wf draft add interrupt <workspace_id> --revision <n> --step review --kind issue_review \
--request-schema-file request.schema.json --resume-schema-file resume.schema.json \
--outcome submitted --outcome cancelled --route submitted=next --route cancelled=revise
wf draft add when <workspace_id> --revision <n> --step decide --condition-file condition.json --then next --otherwise revise
wf draft validate <workspace_id>
wf draft save <workspace_id> --artifact <artifact_id> --version <n> --title <title>
Choose `draft create --capability` when the first step should derive its
contract and wrapper hints from a known capability. Choose `draft create
--name` for control-first, interrupt-first, end-first, or subgraph-first
authoring. An empty draft is expected to remain invalid until its start, steps,
routes, and contract agree.
`draft set-contract` replaces each supplied top-level schema or the complete
outcomes list; it does not deep-merge schemas. Prefer `draft bind` or `draft add
capability` when selected fields should be projected from a known node
contract. Use JSON Patch only for field-level schema surgery not covered by a
focused operation.
Draft creation auto-binds required capability inputs only. Optional inputs are
reported in wrapper-hint notes; bind them explicitly only when the workflow
should expose them. Use `wf draft bind --from input.x --to local.x` for an
existing step when schema projection may be needed; it is safe if the schema
field already exists. Use `wf draft set-input --merge --map input.x=x` for a
compatibility map-only edit when the workflow schema is already declared.
`wf draft bind` names both endpoints explicitly, so local paths keep the
`local.` root. `set-input` and `draft add capability --input` already imply the
local side, so their targets are rootless paths: write
`input.title=document.title`, not `input.title=local.document.title`.
`wf draft set-workflow-output` replaces the complete ordered public output
projection. Nested `input.*` and `state.*` sources can project missing nested
output-schema fields from declared source schemas. Literal values and
`context.*` paths require declared output targets; literals validate against
those targets and do not infer schemas. Use `wf draft bind --from local.x --to
output.y` when the source is a step-local capability output.
When `wf draft validate` returns a `repair_hint`, run that exact focused command
before writing JSON Patch manually. To make one capability output public, use
`wf draft bind <workspace_id> --revision <n> --step <step_id> --from local.x
--to output.y`; it creates the required state intermediary and projects the
field schema into both state and output schemas atomically. Re-run
`wf draft validate` after the repair.
wf artifact create-from-plan workflow.plan.json --artifact <artifact_id> --version <n> --title <title>
wf deploy save <deployment_id> --artifact <artifact_id> --version <n> --binding <logical>=<concrete>
wf deploy create <deployment_id> --artifact <artifact_id> --version <n>
wf deploy validate <deployment_id>
wf run start <deployment_id> --input-file input.json
wf run trace <run_id> --from 0 --limit 25
Public Discovery Order
Use public CLI surfaces before broader documentation or implementation search:
wf statuswf cap list --format idswf cap inspect <capability>wf schemato list workflow document/component shapeswf schema draft,wf schema raw, orwf schema <Component>wf explain <diagnostic-code>after validation failures
Use wf schema <name> --verbose only when the complete JSON Schema is required;
the default compact outline is preferred for agent context. --full is accepted
as an alias for --verbose.
For draft set-input, repeated --map and --value flags define the complete
ordered replacement list. Repeated graph sources are valid and preserve
fan-out. Use --bindings-file for the canonical lossless JSON form, or
--clear to replace the list with []. --merge is compatibility-only and
accepts map-only --map edits; compatibility map readers/writers cannot
preserve repeated-source fan-out.
Export, edit, restore, or clear canonical bindings as follows:
wf draft inspect WS --include-draft |
jq '.draft.steps.publish.input' > bindings.json
wf draft set-input WS --revision 4 --step publish \
--map state.report.title=request.title \
--map state.report.markdown=request.body \
--value request.format='"markdown"'
wf draft set-input WS --revision 5 --step publish \
--bindings-file bindings.json
wf draft set-input WS --revision 6 --step publish --clear
For draft set-output, repeated --map flags define the complete ordered
canonical binding list and preserve repeated-source fan-out. The canonical
file form is lossless, and --clear explicitly replaces the list with no
bindings:
wf draft set-output WS --revision 4 --step analyze \
--map report.title=state.report.title \
--map report.title=state.audit.title
wf draft inspect WS --include-draft |
jq '.draft.steps.analyze.output' > output-bindings.json
wf draft set-output WS --revision 5 --step analyze \
--bindings-file output-bindings.json
wf draft set-output WS --revision 6 --step analyze --clear
--merge --map is compatibility-only and may collapse existing fan-out. Use
it only when a lossy map edit is acceptable.
Use set-workflow-output without --merge when replacing the complete public
output projection. Use --bindings-file when exact path/value interleaving
must round-trip, and --clear to restore implicit same-name state fallback.
Use --merge --map only when a lossy compatibility edit is acceptable.
Prefer draft bind when a capability step binding also needs schema
projection. Use input/state -> local for step inputs and local -> state/output for step outputs. It requires a capability-backed step with
use; use JSON Patch for non-capability/control draft steps.
To add a capability step, prefer wf draft add capability over raw
JSON Patch when the route, input bindings, and output-to-state bindings are
known. It is explicit and does not guess missing maps.
If a capability has multiple outcomes, pass one --route OUTCOME=TARGET for
each declared outcome; extra outcome names are rejected.
Repeat --input and --bind-output once per mapping. Do not put multiple
mappings after one flag.
wf draft add capability <workspace_id> --revision <n> --step <step_id> --capability <qualified_name> --description "Publish report" --retry 2 --timeout-seconds 30 --input state.title=title --value format='"markdown"' --bind-output markdown=state.markdown
wf draft update capability <workspace_id> --revision <n> --step <step_id> --clear-description --retry 0 --clear-timeout
For update capability, omission preserves a field and --clear-* removes
the selected metadata. Any --input/--value update replaces the complete
ordered input list; use --bindings-file for exact path/value interleaving or
--clear-input for []. The update preserves use, routes, and outputs.
Use separate focused commands for routes/outputs, and remove/add to change the
capability.
Use the matching wf draft add <kind> command for control steps. when,
choose, and match embed their targets and do not accept --route.
Interrupt and subgraph commands preserve their explicit schema contracts.
Intermediate drafts may remain status: invalid; run wf draft validate
after the intended steps and routes are present.
wf draft compile prints the raw plan JSON directly on success. Do not expect a
top-level compiled_plan key from the CLI output.
Transfer an exact draft document between existing workspaces with:
uv run wf draft export report --output report-draft.json
uv run wf draft import restored --revision 1 --file report-draft.json
uv run wf draft validate restored
The export file contains only the draft document, not workspace ID, revision, status, or diagnostics. Import requires an existing destination workspace and its expected revision; it replaces the destination draft without renaming the workspace. A structurally valid but semantically invalid import is stored with fresh diagnostics so it can be repaired in place.
- To undo a bad draft edit, prefer
wf draft remove-route,wf draft remove-step, orwf draft remove-bindingover JSON Patch.
Rules
- For interrupted runs, call
wf run inspect <run_id>before resuming. If the interrupt includesresume_schema, shapewf run resume --payloadto that schema instead of guessing field names. - Use explicit
--config <path>for examples, challenge workspaces, and non-root configs. The default iswf.config.jsonin the current working directory. - Prefer
--input-filefor large JSON. - Prefer
--format idsor--format compactfor discovery. - Use
wf cap callas a cheap smoke test before creating a draft. - Prefer draft workspaces for iterative authoring; use
artifact create-from-planonly when you already have a complete raw JSON/YAML workflow plan. - Do not request unbounded traces.
- Do not treat wrapper hints as semantic guarantees.
- If validation fails, run
wf explain <code>orwf explain --input-file <validation-output.json>. - For draft validation errors, run
wf explain <code>. If routes point to a missing step, create the target step first or repair routes withwf draft handle/wf draft branch. - Do not use planning-session specs or implementation plans as user-facing runtime guidance.
set-input --mapisGRAPH_SOURCE=BARE_LOCAL_FIELD; never prefix the target withlocal..- For
wf draft add capability --route, route only outcomes reported bywf cap inspector the command error'sdeclared_outcomesfield. - Do not confuse draft shape with raw plan shape: drafts use
steps/routes/use; raw plans usenodes/edges/node. - Use
wf schemato list workflow document/component shapes. - Use
wf schema draft,wf schema raw, orwf schema <Component>for compact JSON guidance before authoring. - Add
--verboseonly when a complete JSON Schema document is required; it may be large.--fullis an alias if you already tried that spelling. - Prefer
wf schemaover searching tests or implementation code for draft/raw plan shape. - Treat compact schema output as authoring guidance; use validation commands as the source of truth for a concrete document.
- If public commands and supplied skills are insufficient, report the exact blocker instead of guessing undocumented fields.
- When artifact save returns
suggested_bindings, copy those values intowf deploy save --binding; otherwise choose the concrete source explicitly. status: invalidfrom a draft edit is not always a command failure. Inspect diagnostics and continue repairing the same workspace unless the command reports a conflict or malformed patch.