Level Actors
Every Level Actors command in CodeFizz Editor Agent, with parameters and examples.
Every Level Actors command in CodeFizz Editor Agent, with parameters and examples.
58 commands. Each shows its parameters and an example, and has a copyable deep link, so you (or an AI agent) can jump straight to one.
get_actors_in_levelList all actors in the current level
Returns every actor currently placed in the active level, including their names, types, and transforms. Use this to get an overview of level contents before performing targeted operations.
cfa get_actors_in_levelfind_actors_by_nameFind actors by name pattern
Searches the current level for actors whose label matches the given pattern. Supports partial matching, so you can find groups of related actors without listing every actor in the level.
| Parameter | Type | Required | Description |
|---|---|---|---|
| pattern | string | Yes | Name pattern to search |
cfa find_actors_by_name --pattern "Light"
cfa find_actors_by_name --pattern "BP_Conveyor"spawn_actorSpawn an actor in the level
Creates a new actor instance in the current level at the specified transform. The actor-type defaults to StaticMeshActor but can be any built-in actor class. Use spawn_blueprint_actor for Blueprint-based actors instead. location, rotation and scale must each be three numbers ([x,y,z], {"x":..,"y":..,"z":..}, "x,y,z" or "(X=..,Y=..,Z=..)"; rotation as pitch,yaw,roll). A bad transform, or a static_mesh that is not a StaticMesh asset or is given for another actor type, fails before anything is spawned.
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | string | Yes | Actor name |
| actor_type | string | No | Actor type |
| location | json | No | JSON array [x,y,z] |
| rotation | json | No | JSON array [pitch,yaw,roll] |
| scale | json | No | JSON array [x,y,z] |
| static_mesh | string | No | Static mesh path |
cfa spawn_actor --name "MyCube" --actor-type "StaticMeshActor" --location "[0,0,100]" --rotation "[0,45,0]" --scale "[2,2,2]"
cfa spawn_actor --name "FloorPlane" --static-mesh "/Engine/BasicShapes/Plane.Plane" --location "[0,0,0]"search_classesSearch available UClasses by name, optionally filtered by a base class
Enumerates loaded UClasses whose name contains the query (case-insensitive), optionally restricted to subclasses of base_class (e.g. 'ActorComponent', 'Actor', or a full path). Excludes abstract (unless include_abstract), deprecated, and transient/generated classes. Returns name, full path, parent, and is_abstract. Use it to discover the exact class name or path to pass to add_component_to_blueprint, spawn_actor_by_class, etc.
| Parameter | Type | Required | Description |
|---|---|---|---|
| query | string | No | Case-insensitive substring to match in the class name |
| base_class | string | No | Only return subclasses of this class (short name or full path) |
| max_results | int | No | Maximum number of results |
| include_abstract | bool | No | Include abstract classes (default false) |
cfa search_classes --query "StaticMesh" --base-class ActorComponent
cfa search_classes --query Light --base-class Actor --max-results 20delete_actorDelete an actor from the level
Removes a placed actor from the current level by its label name. The deletion is immediate and cannot be undone from the CLI, so verify the target with find_actors_by_name first if unsure.
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | string | Yes | Actor name |
cfa delete_actor --name "MyCube"set_actor_transformSet actor location/rotation/scale
Updates the world transform of an existing actor in the level. You can set any combination of location, rotation, and scale -- omitted fields are left unchanged. location, rotation and scale must each be three numbers ([x,y,z], {"x":..,"y":..,"z":..}, "x,y,z" or "(X=..,Y=..,Z=..)"; rotation as pitch,yaw,roll); a bad field fails the call and nothing moves.
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | string | Yes | Actor name |
| location | json | No | JSON array [x,y,z] |
| rotation | json | No | JSON array [pitch,yaw,roll] |
| scale | json | No | JSON array [x,y,z] |
cfa set_actor_transform --name "MyCube" --location "[100,200,50]"
cfa set_actor_transform --name "MyCube" --rotation "[0,90,0]" --scale "[1,1,2]"spawn_blueprint_actorSpawn a Blueprint actor instance
Spawns an instance of a Blueprint asset into the current level. Use this instead of spawn_actor when you need to place a Blueprint-based actor with its full component hierarchy and default properties. location, rotation and scale must each be three numbers ([x,y,z], {"x":..,"y":..,"z":..}, "x,y,z" or "(X=..,Y=..,Z=..)"; rotation as pitch,yaw,roll); a bad field fails before anything is spawned.
| Parameter | Type | Required | Description |
|---|---|---|---|
| blueprint_path | string | Yes | Blueprint asset path |
| location | json | No | JSON array [x,y,z] |
| rotation | json | No | JSON array [pitch,yaw,roll] |
| scale | json | No | JSON array [x,y,z] |
| name | string | No | Actor name |
cfa spawn_blueprint_actor --blueprint-path "/Game/Blueprints/BP_Miner" --location "[500,0,0]"
cfa spawn_blueprint_actor --blueprint-path "/Game/Blueprints/BP_ConveyorBelt" --location "[0,0,0]" --rotation "[0,90,0]" --name "Belt_01"spawn_actor_from_classSpawn an actor from a class name
Spawns an actor using a C++ or Blueprint class name with individual float parameters for location and rotation instead of JSON arrays. Useful when you know the exact class name and want to specify coordinates directly.
| Parameter | Type | Required | Description |
|---|---|---|---|
| class_name | string | Yes | Actor class name |
| location_x | float | No | X location |
| location_y | float | No | Y location |
| location_z | float | No | Z location |
| rotation_yaw | float | No | Yaw rotation |
| rotation_pitch | float | No | Pitch rotation |
| rotation_roll | float | No | Roll rotation |
cfa spawn_actor_from_class --class-name "PointLight" --location-x 100 --location-y 200 --location-z 300
cfa spawn_actor_from_class --class-name "AMyCustomActor" --location-z 50 --rotation-yaw 45get_selected_actorsGet currently selected viewport actors
Returns the list of actors currently selected in the Unreal Editor viewport. Useful for inspecting or modifying whatever the user has selected in the editor.
cfa get_selected_actorsget_world_infoGet current level info (world name, actor count)
Returns metadata about the currently loaded world, including the level name, total actor count, and other summary information. Use this to confirm which level is active before performing operations.
cfa get_world_infotake_screenshotCapture the level viewport or a named editor window to PNG
Captures a screenshot as PNG via Unreal's own FSlateApplication::TakeScreenshot (window) or the level viewport ReadPixels (viewport). Default mode=viewport is the 3D level viewport only, without overlays: stat text and the Niagara Debug HUD appear only with mode=window. mode=window is the full Slate chrome of a window (menus, tabs, Outliner, Details). Pass --window for a title substring from list_editor_windows. To show an asset, call open_asset first, then take_screenshot --mode window --window <editor title>. asset_path on this command is rejected: photographing a docked tab often never paints.
| Parameter | Type | Required | Description |
|---|---|---|---|
| file_path | string | No | Output file path (default: auto) |
| mode | string | No | viewport or window (implied by --window) |
| window | string | No | Capture the window whose title contains this substring |
cfa take_screenshot
cfa take_screenshot --file-path "C:/Screenshots/level_overview.png" --mode "viewport"
cfa open_asset --asset-path "/Game/CFATest/BP_Door"
cfa take_screenshot --mode window --window "CFA_Main" --file-path "C:/Shots/editor.png"wait_for_compilationBlock until asset and shader compilation finishes
Waits until the editor has no assets and no shader jobs left to compile, then returns. Read any metric only after this returns idle. Material instruction counts, widget layout, lighting budgets and FX cost are all measured against whatever is compiled at that instant, so asking while a compile is still running returns a real number for the wrong thing, with nothing to indicate it. Polls rather than blocking outright, so a timeout is honoured; if it times out it says so and reports what is still outstanding rather than pretending it finished. The CLI waits 30 s longer than timeout_seconds for that report; the editor stops waiting for any reply at 600 s, so keep timeout_seconds at 570 or less.
| Parameter | Type | Required | Description |
|---|---|---|---|
| timeout_seconds | float | No | Give up after this long and report what is left (at most 570) |
cfa wait_for_compilation
cfa wait_for_compilation --timeout-seconds 300read_message_logRead an editor Message Log listing
Returns the messages the editor put in one of its Message Log listings, with counts by severity. These are the same entries the Message Log window shows, and they carry detail that a command's own result does not: which asset failed to load, which actor failed a map check, why a Blueprint compile complained. Filter with --severity error or warning, and cap with --max-results. A log only exists once something has written to it this session, so an unknown name is refused by name rather than returned empty, which would read as no problems.
| Parameter | Type | Required | Description |
|---|---|---|---|
| log_name | string | Yes | Listing name, e.g. PIE, BlueprintLog, AssetCheck, MapCheck, LoadErrors |
| severity | string | No | Only error, warning or info |
| max_results | int | No | Cap returned messages (1-500); reports how many were dropped |
cfa read_message_log --log-name PIE
cfa read_message_log --log-name AssetCheck --severity error
cfa read_message_log --log-name MapCheck --max-results 20validate_project_assetsRun the project's own data validators over its assets
Runs every validator the project itself defines (each UEditorValidatorBase subclass, plus every IsDataValid override) over the assets you point it at, and reports a verdict with the assets that failed and why. This is the project's own definition of correct, not ours, so it catches the rules a studio actually cares about. Scope it with --path, --filter or an explicit --assets list, and cap the work with --max-assets. Assets are loaded to validate them, so a whole-project run is slow; narrow the path while iterating. Verdict is fail if anything is invalid, pass_with_warnings if only warnings were raised, pass otherwise.
| Parameter | Type | Required | Description |
|---|---|---|---|
| path | string | No | Content path to validate recursively |
| assets | stringlist | No | Explicit asset object paths; overrides --path |
| filter | string | No | Only assets whose object path contains this |
| usecase | string | No | manual, save, commandlet, presubmit or script; validators can behave differently per usecase |
| max_assets | int | No | Cap how many assets are validated; reports asset_limit_reached when hit |
| max_results | int | No | Cap returned failing assets (1-200); reports how many were dropped |
| load_assets | bool | No | Load unloaded assets so they can be validated; false skips them |
| skip_excluded_directories | bool | No | Honour the project's excluded validation directories |
cfa validate_project_assets
cfa validate_project_assets --path /Game/Characters
cfa validate_project_assets --filter ABP_ --max-results 50
cfa validate_project_assets --assets /Game/Hero.Hero --usecase presubmitvalidate_blueprint_compileCompile a Blueprint and report which nodes failed
Compiles a Blueprint with our own results log attached, then reports the errors and warnings mapped to the nodes that caused them, rather than as a flat wall of text. Each entry names the node and the graph it lives in, so you can go straight to it. Also reports orphaned pins (left behind when a function signature changed) and dangling_exec_chains, the number of exec chains nothing drives, which is the usual sign of a graph that silently never runs (a dead chain counts once, at its head). Compiler notes are reported as note and do not count as warnings. Compiling never saves the asset, even in a project set to save on compile. status distinguishes up_to_date_with_warnings from up_to_date, so a Blueprint that compiles but is dirty does not read as clean.
| Parameter | Type | Required | Description |
|---|---|---|---|
| blueprint_path | string | Yes | Blueprint asset path or name |
| max_results | int | No | Cap reported nodes (1-200); reports how many were dropped |
cfa validate_blueprint_compile --blueprint-path /Game/BP_Player
cfa validate_blueprint_compile --blueprint-path /Game/BP_Player --max-results 50validate_collisionFind static meshes with missing or unusable collision
Checks every static mesh under a path for collision that will not work. A mesh with no simple collision primitives is reported as an error: default traces and sweeps miss it and it cannot block or simulate, though explicit complex traces still hit it. A mesh set to use complex collision as simple is a warning, because it cannot be simulated. Meshes that pass are counted but not listed, so the output stays small on a large project. The check reads the collision counts the engine already publishes to the asset registry, so a whole project sweep loads nothing; loaded_for_inspection reports how many meshes had to be loaded because those tags were missing.
| Parameter | Type | Required | Description |
|---|---|---|---|
| path | string | No | Content path to check recursively |
| filter | string | No | Only meshes whose object path contains this |
| max_results | int | No | Cap reported meshes (1-200); reports how many were dropped |
cfa validate_collision
cfa validate_collision --path /Game/Environment
cfa validate_collision --filter SM_Rock --max-results 50validate_replicationCheck a class for silent multiplayer bugs
Statically checks one class for the replication mistakes that cost hours to find at runtime, with no PIE session needed. Reports properties marked Replicated that were never registered in GetLifetimeReplicatedProps, RepNotify properties whose OnRep function does not exist, server RPCs with no validation (a client can call those with any arguments), and reliable multicasts, whose cost scales with connection count. The missing-registration case is a warning rather than an error because a project that auto-registers replicated properties replicates them anyway.
| Parameter | Type | Required | Description |
|---|---|---|---|
| class_path | string | Yes | Class path, Blueprint asset path, or native class name |
| max_results | int | No | Cap reported issues (1-200); reports how many were dropped |
cfa validate_replication --class-path /Game/BP_Player.BP_Player
cfa validate_replication --class-path Characterlist_editor_windowsList open editor windows and asset editors
Lists every top-level Slate window the editor has open (title, size, visible, minimized) plus every asset currently being edited and which window holds it. Use this to find the right --window substring for take_screenshot --mode window.
cfa list_editor_windowsfocus_asset_editorBring an asset's editor tab to the front
Activates the tab for an already-open asset editor and raises its window, so the user is looking at that asset. Works whether the editor is a floating window or a tab docked in the main frame. Open the asset first with open_asset. Use this when you want the person watching to see the thing you are about to change.
| Parameter | Type | Required | Description |
|---|---|---|---|
| asset_path | string | Yes | Asset whose editor tab should come to the front |
cfa focus_asset_editor --asset-path "/Game/Anims/ABP_Hero"list_tabsList editor tabs you can open, and which are open
Lists every tab the editor can show, open or not, with the id that open_tab and close_tab take: the whole editor's tabs (Output Log, Content Browser, Project Settings, Editor Preferences, Plugins...), the level editor's (Details, Outliner, World Settings...) and each open asset editor's. Each row has id, label, owner (global, level_editor, asset_editor) and open; an open tab adds its window title and whether it is the front tab. --filter matches the id or the label, best matches first; when nothing matches, did_you_mean suggests close spellings. The list stops at --max-results and reports total and truncated.
| Parameter | Type | Required | Description |
|---|---|---|---|
| filter | string | No | Only tabs whose id or label contains this text (case-insensitive); best matches first |
| open_only | bool | No | Only tabs that are open right now (default false) |
| asset_path | string | No | Only the tabs of this asset's editor (it must be open) |
| max_results | int | No | How many tabs to return |
cfa list_tabs --filter log
cfa list_tabs --open-only
cfa list_tabs --asset-path "/Game/Blueprints/BP_Hero"open_tabOpen any editor tab, docked or in its own window
Opens a tab by id (from list_tabs) or by its exact label, the way the Window menu does. --placement auto (default) puts it where Unreal would: its last spot, otherwise a new window. --placement new_window gives it its own floating window; an open tab is closed and reopened there, so its content restarts. --section opens Project Settings or Editor Preferences at one section (name, display name or settings class, as search_project_settings returns), and --tab-id may then be left out. --window-state maximized, minimized or restored sizes the window that holds the tab. For an asset editor's tab pass --asset-path; that editor opens first if it is closed. The result is read back from Slate: window, floating, foreground, window_state and a verdict.
| Parameter | Type | Required | Description |
|---|---|---|---|
| tab_id | string | No | Tab id from list_tabs (e.g. OutputLog, ProjectSettings); an exact label also works |
| asset_path | string | No | For an asset editor's tab: the asset (its editor opens if it is closed) |
| section | string | No | Project Settings or Editor Preferences section to show, by name, display name or settings class |
| category | string | No | Narrows --section when two categories have a section of that name (e.g. Engine, Game) |
| placement | string | No | auto (default: where Unreal would put it) or new_window (its own floating window) |
| window_state | string | No | maximized, minimized or restored, applied to the window that holds the tab |
| width | int | No | Width of the new window with --placement new_window (default 1000) |
| height | int | No | Height of the new window with --placement new_window (default 600) |
| focus | bool | No | Bring the tab and its window to the front (default true; --focus=false opens it behind) |
cfa open_tab --tab-id OutputLog
cfa open_tab --tab-id "Output Log" --placement new_window --window-state maximized
cfa open_tab --section "Maps & Modes"
cfa open_tab --tab-id LevelEditorSelectionDetails
cfa open_tab --tab-id MyBlueprint --asset-path "/Game/Blueprints/BP_Hero"close_tabClose an open editor tab
Closes an open tab by id, the way its close button does. A locked tab, or one keeping unsaved work, refuses and nothing changes. The tab an asset editor lives in is closed with close_asset instead, which saves or discards its changes; the Level Editor tab stays open. A tab that is not open returns an error saying so; list_tabs --open-only shows what is open.
| Parameter | Type | Required | Description |
|---|---|---|---|
| tab_id | string | Yes | Id of the open tab (list_tabs --open-only) |
| asset_path | string | No | For an asset editor's tab: the asset |
cfa close_tab --tab-id OutputLog
cfa close_tab --tab-id MyBlueprint --asset-path "/Game/Blueprints/BP_Hero"set_window_stateMaximize, minimize, restore or raise an editor window
Changes an editor window: --state maximized, minimized, restored, or front (restore if minimized, raise, and focus it). Target the window that holds an open tab with --tab-id, a window by a substring of its title with --window (see list_editor_windows, which also lists minimized windows), or pass neither for the main editor window. The state is read back: if the window did not reach it, the command fails and names the state the window is in.
| Parameter | Type | Required | Description |
|---|---|---|---|
| state | string | Yes | maximized, minimized, restored or front |
| tab_id | string | No | Target the window that holds this open tab |
| asset_path | string | No | With --tab-id: the asset whose editor owns that tab |
| window | string | No | Or target a window by a substring of its title |
cfa set_window_state --state maximized
cfa set_window_state --tab-id OutputLog --state front
cfa set_window_state --window "BP_Hero" --state minimizedfocus_viewportFrame the level viewport on an actor or move the camera
Aims the active level editor perspective viewport. Pass an actor label/name to frame it (like pressing F). Add direction (top/bottom/front/back/left/right/iso) or explicit pitch+yaw to frame it FROM a chosen angle, and fill (0-1) or distance to control how tight the framing is. Or pass an explicit location (and optional rotation) to place the camera directly.
| Parameter | Type | Required | Description |
|---|---|---|---|
| actor | string | No | Actor label or name to frame in the viewport |
| direction | string | No | View angle preset: top/bottom/front/back/left/right/iso (with actor) |
| pitch | float | No | Custom camera pitch in degrees (overrides direction; use with actor) |
| yaw | float | No | Custom camera yaw in degrees (overrides direction; use with actor) |
| fill | float | No | Fraction of the frame the actor fills, 0-1 (default 1 = tight) |
| distance | float | No | Explicit camera distance from the actor (overrides fill) |
| location | string | No | Camera world position: "(X=..,Y=..,Z=..)" or X,Y,Z |
| rotation | string | No | Camera rotation: "(P=..,Y=..,R=..)" (used with location) |
| realtime | bool | No | Enable viewport Realtime so placed effects simulate |
| view_mode | string | No | How the viewport renders: lit, unlit, wireframe, shader_complexity and the engine's other view modes (an unknown name lists them). Can be passed alone. take_screenshot reports the current one |
cfa focus_viewport --actor "ElectricBeamTest"
cfa focus_viewport --actor "Reactor" --direction "top" --fill 0.8
cfa focus_viewport --actor "Reactor" --pitch -30 --yaw 120 --distance 1500
cfa focus_viewport --location "(X=600,Y=-600,Z=400)" --rotation "(P=-25,Y=45,R=0)"get_scene_mapContext-friendly clustered understanding of the level
Summarizes the level so an agent understands it WITHOUT reading a giant per-actor list (scales 10 -> 100k actors). Default returns: content bounds, per-category counts, and one line per detected CLUSTER (actors grouped by mesh, split spatially via grid+union-find connected components), each tagged with an arrangement (grid/ring/line/scattered via PCA + circle-fit + spacing) plus count, instance count, center, size, folder. Also an ASCII density heatmap of the whole level. Drill into a cluster's raw actors with --drill <id> (paginated). Use --export true to write the full flat per-actor JSON to Exports/ (interchange only). label_filter/class_filter scope by label or class-name substring.
| Parameter | Type | Required | Description |
|---|---|---|---|
| class_filter | string | No | Only include actors whose class NAME contains this substring |
| label_filter | string | No | Only include actors whose outliner LABEL contains this substring |
| region_grid | bool | No | Include the ASCII density heatmap |
| grid_size | int | No | Density heatmap resolution NxN (4-64) |
| cell_size | float | No | Clustering merge distance in world units (default: auto ~2x median actor size) |
| drill | int | No | Return the raw actors of cluster <id> instead of the summary |
| page | int | No | Drill page index |
| page_size | int | No | Drill actors per page |
| export | bool | No | Write the full flat per-actor JSON to Exports/ (interchange) |
cfa get_scene_map
cfa get_scene_map --drill 0 --page 0
cfa get_scene_map --label-filter "Brick_"
cfa get_scene_map --export=trueget_mesh_infoNative shape/bounds/pivot of a static mesh asset (before placing)
Inspects a UStaticMesh asset (not a placed actor) so you can plan placement precisely: native bounds (size + half-extent), pivot_offset (bounds center relative to the mesh pivot), bounding sphere radius, the REAL collision shape (convex hulls with vertex counts, boxes, spheres, capsules) which conveys weird shapes far better than an AABB, named sockets with local transforms, and vertex/triangle/LOD/material counts.
| Parameter | Type | Required | Description |
|---|---|---|---|
| mesh_path | string | Yes | Static mesh content path (object or package path) |
| include_collision | bool | No | Include collision primitives (the real shape) |
| include_sockets | bool | No | Include named sockets with local transforms |
cfa get_mesh_info --mesh-path "/Engine/BasicShapes/Cube.Cube"
cfa get_mesh_info --mesh-path "/Game/Meshes/SM_Rock" --include-collision=truespawn_actors_batchSpawn many actors from one computed array in a single call
Spawns a whole layout (city, pyramid, grid...) at once from a JSON array of specs, in a single undo transaction. Each entry: {mesh, location [x,y,z], rotation [p,y,r], scale [x,y,z], name, type}. Top-level 'mesh'/'type'/'name_prefix' act as defaults so a shared-mesh batch stays compact. Far faster than one spawn per actor (one bridge call, one mesh load per unique path). Pass the params via --json - (stdin) for large batches. Every entry is checked first (type, transform, mesh): one bad entry fails the whole batch, lists every bad entry, and spawns nothing. Returns spawned (and names with --return-names). Manage/revert afterwards with delete_actors_batch --name-prefix.
| Parameter | Type | Required | Description |
|---|---|---|---|
| actors | json | Yes | JSON array of {mesh,location,rotation,scale,name,type} |
| mesh | string | No | Default static mesh path for entries that omit it |
| type | string | No | Default actor type (StaticMeshActor/PointLight/SpotLight/DirectionalLight/CameraActor) |
| name_prefix | string | No | Auto-name entries as <prefix><index> when they omit 'name' |
| folder | string | No | Put all spawned actors into this outliner folder (organized on creation) |
| return_names | bool | No | Return the created labels (default false = counts only) |
# build the whole layout in one call (params piped as JSON on stdin)
echo '{"mesh":"/Engine/BasicShapes/Cube.Cube","name_prefix":"City_","actors":[{"location":[0,0,0],"scale":[10,10,1]},{"location":[500,0,250],"scale":[3,3,5]}]}' | cfa spawn_actors_batch --json -delete_actors_batchBulk-delete actors by name/label prefix or an explicit list
Deletes every actor whose label/name starts with name_prefix, and/or is in the names list, in a single undo transaction. Reverts a spawn_actors_batch in one call. Every entry in names must match an actor label or object name; an unmatched name fails the call with the closest labels and deletes nothing.
| Parameter | Type | Required | Description |
|---|---|---|---|
| name_prefix | string | No | Delete actors whose label/name starts with this |
| names | json | No | JSON array of exact labels/names to delete |
cfa delete_actors_batch --name-prefix "City_"
echo '{"names":["Ramp_A","Ramp_B"]}' | cfa delete_actors_batch --json -move_actors_to_folderPut actors into an outliner folder (organization only)
Moves selected actors into a named outliner folder (auto-created; '/' nests). Folders are pure organization, no transform effect. Select actors via name_prefix and/or names; an entry in names that matches no actor fails the call and moves nothing.
| Parameter | Type | Required | Description |
|---|---|---|---|
| folder | string | Yes | Outliner folder path ('/' nests) |
| name_prefix | string | No | Select actors whose label/name starts with this |
| names | json | No | JSON array of exact labels/names to select |
cfa move_actors_to_folder --folder "Structures/Pyramid" --name-prefix "Brick_"create_folderCreate an empty outliner folder
Creates an empty outliner folder (World-Partition aware). Use move_actors_to_folder or spawn_actors_batch --folder to populate it.
| Parameter | Type | Required | Description |
|---|---|---|---|
| folder | string | Yes | Outliner folder path ('/' nests) |
cfa create_folder --folder "Structures"delete_folderDelete an outliner folder (and subfolders)
Deletes an outliner folder by enumerating the world's real folders and removing the exact match (World-Partition safe). Recursive by default (also removes subfolders). Actors inside move up to the parent (not deleted). Returns the count actually removed.
| Parameter | Type | Required | Description |
|---|---|---|---|
| folder | string | Yes | Outliner folder path |
| recursive | bool | No | Also delete subfolders |
cfa delete_folder --folder "Structures"list_foldersList all outliner folders in the level
Enumerates every outliner folder (World-Partition aware). Use to verify folder create/delete. Optional filter matches a substring.
| Parameter | Type | Required | Description |
|---|---|---|---|
| filter | string | No | Only list folders whose path contains this |
cfa list_folders
cfa list_folders --filter "Structures"rename_folderRename/move an outliner folder
Renames an outliner folder (and moves its actors + subfolders). A missing folder (the error lists the existing ones), a new path equal to or inside the old one, or a rename the editor refuses fails the call.
| Parameter | Type | Required | Description |
|---|---|---|---|
| folder | string | Yes | Existing folder path |
| new_folder | string | Yes | New folder path |
cfa rename_folder --folder "Structures" --new-folder "Buildings"group_actorsGroup actors into an editor Group (AGroupActor)
Creates an editor Group from the selected actors (select one -> selects all, like Ctrl+G). Different from folders (organization) and attachment (transform). Select via name_prefix and/or names (>=2 actors); an entry in names that matches no actor fails the call.
| Parameter | Type | Required | Description |
|---|---|---|---|
| name_prefix | string | No | Select actors whose label/name starts with this |
| names | json | No | JSON array of exact labels/names to select |
cfa group_actors --name-prefix "Brick_"ungroup_actorsDissolve the editor Group(s) containing the given actors
Ungroups the AGroupActor(s) that contain the selected actors. Select via name_prefix and/or names; an entry in names that matches no actor fails the call.
| Parameter | Type | Required | Description |
|---|---|---|---|
| name_prefix | string | No | Select actors whose label/name starts with this |
| names | json | No | JSON array of exact labels/names to select |
cfa ungroup_actors --name-prefix "Brick_"attach_actorsAttach actors as children of a parent (transform hierarchy)
Attaches child actors to a parent so moving/rotating the parent moves the children (keeps world transform, so they stay put visually). Undo-able, outliner-reflected, cycle-validated. Select children via name_prefix and/or names; an entry in names that matches no actor fails the call. All or nothing: if the editor refuses any child (a cycle, a Static child under a Movable parent, another level), the call fails naming each refused child and attaches none.
| Parameter | Type | Required | Description |
|---|---|---|---|
| parent | string | Yes | The actor to attach children to (label or name) |
| name_prefix | string | No | Select child actors whose label/name starts with this |
| names | json | No | JSON array of exact child labels/names |
cfa attach_actors --parent "Reactor" --name-prefix "Pipe_"detach_actorsDetach actors from their parent (become independent)
Detaches actors from their attachment parent (keeps world transform). Select via name_prefix and/or names; an entry in names that matches no actor fails the call.
| Parameter | Type | Required | Description |
|---|---|---|---|
| name_prefix | string | No | Select actors whose label/name starts with this |
| names | json | No | JSON array of exact labels/names |
cfa detach_actors --name-prefix "Pipe_"capture_top_downOff-screen orthographic top-down (floor-plan) render to PNG
Renders an orthographic top-down floor-plan of the whole level to a PNG off-screen (does not disturb the user's viewport). Auto-fits OrthoWidth to the level footprint. Far more legible than a perspective screenshot for understanding layout.
| Parameter | Type | Required | Description |
|---|---|---|---|
| file_path | string | No | Output PNG path (default: Saved/Screenshots/MCP_TopDown.png) |
| resolution | int | No | Square render resolution in pixels (64-8192) |
| padding | float | No | Extra margin around the level footprint (>=1.0) |
| area_width | float | No | How much ground to cover in world units. Defaults to the whole landscape; give a smaller width with --center to study one area |
| ortho_width | float | No | Older name for area_width, still accepted |
| pitch | float | No | Camera pitch. -90 is straight down (default); around -25 shows relief, which a straight-down frame flattens |
| yaw | float | No | Compass direction to view from, used when pitch is angled |
| center | string | No | Override view center "X,Y,Z" (e.g. a get_scene_map region center) |
cfa capture_top_down
cfa capture_top_down --file-path "C:/Shots/floorplan.png" --resolution 2048 --padding 1.2set_actor_propertySet a property at any nested path on a placed actor
Writes any property on the actual placed level actor (not the CDO/Blueprint defaults). Walks paths through structs, FArrayProperty, FMapProperty, FSetProperty and static C arrays: Field[N] by index, Field[-] to append to an array or a set, Field[Key] for a map row (quote a key holding a dot, a space or a bracket). A map subscript adds or edits that one row; writing the whole map as a JSON object replaces every row. See set_object_property for the full grammar. Fires PostEditChangeProperty on the top-level FProperty so the renderer/component refresh, and marks the level dirty for save.
| Parameter | Type | Required | Description |
|---|---|---|---|
| actor_label | string | Yes | Actor outliner label or UObject name |
| property_path | string | Yes | Property path: dotted members, [N] index, [-] append, [Key] for a map row (e.g. Settings.BloomIntensity, Settings.LensFlareTints[2]) |
| property_value | json | Yes | JSON-encoded value (number, bool, string, object, array) |
| component_name | string | No | Optional: anchor path to a named component |
cfa set_actor_property --actor-label "PostProcessVolume_1" --property-path "Settings.BloomIntensity" --property-value 2.0
cfa set_actor_property --actor-label "PostProcessVolume_1" --property-path "Settings.bOverride_BloomIntensity" --property-value true
cfa set_actor_property --actor-label "PostProcessVolume_1" --property-path "Settings.LensFlareTints[2]" --property-value '{"R":0,"G":1,"B":0,"A":1}'
cfa set_actor_property --actor-label "MyMeshActor" --component-name "StaticMeshComponent" --property-path "Mobility" --property-value "Movable"get_actor_property_metadataInspect property type/clamp/enum metadata on a placed actor
Returns per-property metadata (cpp_type, ue_type, category, current_value, clamp_min/max, ui_min/max, valid_values for enums, inner/element/key/value types for containers, object_class/meta_class for refs, is_struct/is_array/is_enum/is_object/is_bool flags) PLUS a _summary header (total_available, total_returned, truncated, next_cursor, own_count, inherited_count, class_chain, categories breakdown). Object refs DO NOT auto-descend by default, use component_name to switch context, or pass descend_into_objects=true. max_entries=0 returns only the _summary so you can plan first.
| Parameter | Type | Required | Description |
|---|---|---|---|
| actor_label | string | Yes | Actor outliner label or UObject name |
| property_path | string | No | Optional path; container subscripts work ([N], [Key]); empty = top-level |
| filter | string | No | Case-insensitive substring on full path |
| category | string | No | UPROPERTY(Category=X) exact match (case-insensitive) |
| depth | int | No | Struct nesting levels to expand |
| expand_enums | bool | No | Include valid_values for enum-typed fields |
| include_inherited | bool | No | Walk super class properties |
| descend_into_objects | bool | No | If path lands on object ref, enumerate its class |
| max_entries | int | No | Cap on emitted entries (0 = summary only) |
| cursor | int | No | Pagination offset (use _summary.next_cursor) |
| component_name | string | No | Optional: anchor to a named component |
cfa get_actor_property_metadata --actor-label "PostProcessVolume_1" --property-path "Settings.AutoExposureMethod"
cfa get_actor_property_metadata --actor-label "PostProcessVolume_1" --property-path "Settings" --filter "bloom" --depth 1
cfa get_actor_property_metadata --actor-label "MCP_TestPointLight" --component-name "LightComponent0" --category "Light" --max-entries 20
cfa get_actor_property_metadata --actor-label "MCP_TestPointLight" --max-entries 0
cfa get_actor_property_metadata --actor-label "MCP_TestPointLight" --include-inherited=false --component-name "LightComponent0"get_material_slotsList material element slots (index, slot name, current material, override state) for any target's mesh components, placed actor, Blueprint component template, or a StaticMesh asset
Reads material slots via Epic's own mesh-component API (GetMaterialSlotNames / GetNumMaterials / GetMaterial), for any UMeshComponent (StaticMesh, SkeletalMesh, InstancedStaticMesh). Targets through the universal object resolver, the SAME addressing as set_object_property: 'actor' (+optional 'component') for a placed actor, or 'blueprint_path'/'asset_path' (+optional 'component') for a Blueprint's component template / class defaults. With no 'component' it reports EVERY mesh component on the target. Each slot: index, slot_name, current material, and whether it's an override vs the mesh default; each component is tagged source=instance|blueprint_template. 'mesh_path' reads a StaticMesh asset's slots directly. (actor_label / component_name are still accepted as aliases.)
| Parameter | Type | Required | Description |
|---|---|---|---|
| actor | string | No | Placed actor's label/name (reports all its mesh components, or just 'component') |
| actor_label | string | No | Alias for 'actor' |
| blueprint_path | string | No | Blueprint asset: reports its mesh component templates (class defaults). Add 'component' for one. |
| asset_path | string | No | Any asset path (a Blueprint resolves like blueprint_path) |
| component | string | No | Optional: restrict to one mesh component (object or class name) |
| component_name | string | No | Alias for 'component' |
| mesh_path | string | No | A StaticMesh asset path to read slots from directly |
cfa get_material_slots --actor "SM_Chair_2"
cfa get_material_slots --blueprint-path "/Game/BP/BP_Chair.BP_Chair"
cfa get_material_slots --blueprint-path "/Game/BP/BP_Chair.BP_Chair" --component "Mesh"
cfa get_material_slots --mesh-path "/Game/Meshes/SM_Chair.SM_Chair"set_materials_batchAssign materials per element slot to any target's mesh components, placed actors, Blueprint component templates, one or many, in a single call
Overrides materials via Epic's own UMeshComponent::SetMaterial and finalizes through the universal resolver's ApplyPropertyEdit, so a live edit reregisters the component (shows immediately) and a Blueprint-template edit persists + propagates to instances, exactly like the Details panel. Universal targeting (same addressing as set_object_property): each assignment targets by 'actor' (a placed actor), 'blueprint_path'/'asset_path' (a Blueprint's component template / class defaults), or 'name_prefix' (all matching placed actors, pairs with spawn_actors_batch). 'component' is optional (default = ALL mesh components on the target). Slot is 'slot' (index, default 0), 'slot_name' (resolved via GetMaterialIndex), or 'all_slots'. 'material' is an asset path, or empty string to clear the override back to the mesh default. Pass 'assignments' (an array) to do many at once. Returns applied_count + per-result {component, source, slots, material} + errors (a bad slot lists the valid indices AND slot names).
| Parameter | Type | Required | Description |
|---|---|---|---|
| assignments | json | No | JSON array of {actor|blueprint_path|asset_path|name_prefix, component?, slot?|slot_name?|all_slots?, material}, omit to use the top-level fields as one assignment |
| actor | string | No | Single-assignment: target a placed actor by label/name |
| blueprint_path | string | No | Single-assignment: target a Blueprint's component template(s) / class defaults |
| asset_path | string | No | Single-assignment: any asset path (a Blueprint resolves like blueprint_path) |
| name_prefix | string | No | Single-assignment: every placed actor whose label/name starts with this |
| component | string | No | Optional: restrict to one mesh component (default = all mesh components on the target) |
| slot | int | No | Element slot index to set (default 0) |
| slot_name | string | No | Element slot by name (alternative to slot; resolved via GetMaterialIndex) |
| all_slots | bool | No | Set every element slot on the component |
| material | string | No | Material/MaterialInstance asset path, or empty string to clear the override to the mesh default |
cfa set_materials_batch --actor "TC_Orange" --material "/Game/CFATest/Materials/M_Orange.M_Orange"
cfa set_materials_batch --name-prefix "TC_" --slot 0 --material "/Game/CFATest/Materials/M_Concrete.M_Concrete"
cfa set_materials_batch --blueprint-path "/Game/BP/BP_Chair.BP_Chair" --component "Mesh" --slot-name "Seat" --material "/Game/M/M_Wood.M_Wood"
cfa set_materials_batch --json '{"assignments":[{"blueprint_path":"/Game/BP/BP_Car.BP_Car","all_slots":true,"material":"/Game/M/M_Red.M_Red"},{"actor":"Wheel","slot":1,"material":""}]}'spawn_actor_by_classSpawn ANY AActor subclass, engine, plugin, or Blueprint
Resolves class_path as full UClass path ("/Script/Engine.PostProcessVolume"), Blueprint asset path ("/Game/BP_Miner"), or short name ("PostProcessVolume"). Validates child of AActor + not abstract + not deprecated. Uses UEditorActorSubsystem::SpawnActorFromClass when available so Ctrl+Z restores. Replaces the legacy whitelist of spawn_actor. location, rotation and scale must each be three numbers ([x,y,z], {"x":..,"y":..,"z":..}, "x,y,z" or "(X=..,Y=..,Z=..)"; rotation as pitch,yaw,roll); a bad field fails before anything is spawned.
| Parameter | Type | Required | Description |
|---|---|---|---|
| class_path | string | Yes | Full path, BP path, or short name |
| name | string | No | Optional outliner label |
| location | json | No | JSON [x,y,z] |
| rotation | json | No | JSON [pitch,yaw,roll] |
| scale | json | No | JSON [x,y,z] |
cfa spawn_actor_by_class --class-path "/Script/Engine.PostProcessVolume" --name "GlobalPP" --location "[0,0,0]"
cfa spawn_actor_by_class --class-path "/Script/Engine.SkyAtmosphere"
cfa spawn_actor_by_class --class-path "/Game/Blueprints/BP_Miner.BP_Miner_C" --location "[500,0,100]" --rotation "[0,90,0]"find_actorsFlexible actor search by name, label, class, or tag
Combine any number of filters (all AND'd together) to query the level. Useful to confirm an actor exists, list all of a class, or filter by tag. Returns total_scanned/total_matched even when truncated, so you know if you need to widen max_results.
| Parameter | Type | Required | Description |
|---|---|---|---|
| name_pattern | string | No | Case-insensitive substring on UObject name |
| label_pattern | string | No | Case-insensitive substring on outliner label |
| class_filter | string | No | Class name (short or full path) |
| tag | string | No | Match actors with this Tag |
| exact_class | bool | No | Require exact class match (else IsA) |
| max_results | int | No | Result cap (0 = unlimited) |
| include_transform | bool | No | Include location/rotation/scale |
cfa find_actors --label-pattern "Light" --max-results 10
cfa find_actors --class-filter "PointLight" --include-transform=true
cfa find_actors --class-filter "/Script/Engine.PostProcessVolume" --exact-class=true
cfa find_actors --tag "MCPModified"
cfa find_actors --name-pattern "Conveyor" --class-filter "ConveyorBeltActor" --max-results 5get_actor_propertiesGet property values from a live placed actor instance
Reads the placed instance (not CDO). flat=false returns nested JSON with top-level filter; flat=true returns dotted-path dict with path-aware filter, depth limit, and optional per-property metadata, use this for searching deep into structs like FPostProcessSettings.
| Parameter | Type | Required | Description |
|---|---|---|---|
| actor_label | string | Yes | Actor label or UObject name |
| filter | string | No | Substring filter (top-level for nested, full path for flat) |
| include_components | bool | No | Also return component properties |
| flat | bool | No | Flat dotted-path dict mode |
| max_depth | int | No | (flat) max struct nesting |
| include_metadata | bool | No | (flat) emit metadata blob per leaf |
| expand_arrays | bool | No | (flat) emit Field[N] entries |
| array_element_limit | int | No | (flat) max array elements |
| category | string | No | (flat) UPROPERTY(Category=X) exact match |
| include_inherited | bool | No | (flat) walk super classes |
| max_entries | int | No | (flat) cap on emitted entries |
| cursor | int | No | (flat) pagination offset |
cfa get_actor_properties --actor-label "PostProcessVolume_1" --filter "bloom"
cfa get_actor_properties --actor-label "PostProcessVolume_1" --flat=true --filter "bloom" --max-depth 4
cfa get_actor_properties --actor-label "MyActor" --include-components=true --flat=true --include-metadata=truequit_editorClose the connected Unreal Editor the safe way (no process kill)
Shuts down the editor this command is routed to through Unreal's own graceful shutdown, exactly like File > Exit, instead of killing it by PID. By default it discards unsaved changes (like clicking Don't Save). Pass --save to write every unsaved map and asset first. Either way the save and confirm popups are skipped, so it works whether or not the editor was launched unattended. The editor exits a moment after this command returns its result.
| Parameter | Type | Required | Description |
|---|---|---|---|
| save | bool | No | Save all unsaved changes before closing (default false = discard unsaved changes) |
cfa quit_editor
cfa quit_editor --saveplay_in_editorStart Play-In-Editor (PIE), in the active viewport, or a new window
Starts a Play-In-Editor session the same way the toolbar Play button does. If a level viewport is currently active/visible, the game plays inside that viewport; if no level viewport is showing (e.g. a Blueprint editor tab is focused), it opens a separate PIE window. Pass --new-window to always open a separate window, or --simulate for Simulate-In-Editor (SIE) instead of play. The session starts a moment after this returns (RequestPlaySession is deferred). Stop it with stop_play_in_editor.
| Parameter | Type | Required | Description |
|---|---|---|---|
| new_window | bool | No | Always open a separate PIE window instead of using the active viewport |
| simulate | bool | No | Simulate-In-Editor (SIE) instead of Play-In-Editor |
cfa play_in_editor
cfa play_in_editor --new-window
cfa play_in_editor --simulatestop_play_in_editorStop the running Play/Simulate-In-Editor session
Ends the active PIE or SIE session via Unreal's RequestEndPlayMap (the safe, deferred path). No-op if nothing is playing. The session ends a moment after this returns.
cfa stop_play_in_editorlist_level_templatesList the New-Level templates the editor offers (Basic, Open World, blanks, project templates)
Reads GUnrealEd->GetTemplateMapInfos(), the exact source the editor's New Level picker uses, plus the two blank options (Empty Level, Empty Open World). Each entry returns display_name, category, template_map (the asset path to pass to create_level's --template), and a partitioned flag for the blank options.
cfa list_level_templatescreate_levelCreate and open a new level (blank, partitioned, or from a template)
Creates a new map at --asset-path and opens it. With no --template it makes a blank level (add --partitioned for an Empty Open World / World Partition level). With --template (a template_map path or a display name from list_level_templates, e.g. "Basic" or "Open World") it clones that template map. Mirrors ULevelEditorSubsystem::NewLevel / NewLevelFromTemplate. Save the result with save_level (already has a path), a template/blank level is opened but not yet written to disk.
| Parameter | Type | Required | Description |
|---|---|---|---|
| asset_path | string | Yes | Package path for the new level, e.g. /Game/Maps/MyLevel |
| template | string | No | Template map path or display name (from list_level_templates). Omit for a blank level. |
| partitioned | bool | No | Make a World Partition (Open World) blank level. Ignored when --template is set. |
cfa create_level --asset-path /Game/Maps/MyLevel
cfa create_level --asset-path /Game/Maps/MyWorld --partitioned
cfa create_level --asset-path /Game/Maps/MyLevel --template "Basic"open_levelOpen an existing level in the editor
Loads the map at --asset-path into the editor (ULevelEditorSubsystem::LoadLevel).
| Parameter | Type | Required | Description |
|---|---|---|---|
| asset_path | string | Yes | Package path of the level to open, e.g. /Game/Maps/MyLevel |
cfa open_level --asset-path /Game/Maps/MyLevelsave_levelSave the current level in place
Saves the currently open level (ULevelEditorSubsystem::SaveCurrentLevel). A brand-new unsaved level needs save_level_as with a path instead.
cfa save_levelsave_level_asSave the current level to a new asset path
Writes the current editor world to --asset-path (UEditorLoadingAndSavingUtils::SaveMap). Use this to persist a freshly created template/blank level.
| Parameter | Type | Required | Description |
|---|---|---|---|
| asset_path | string | Yes | Package path to save the level to, e.g. /Game/Maps/MyLevel |
cfa save_level_as --asset-path /Game/Maps/MyLevelsetup_default_sceneDrop a ready-to-light environment (sun, sky, fog, floor) into the current level, with optional lighting presets
Spawns a default lighting/sky rig into the current level in one call so a freshly created empty map is instantly viewable: DirectionalLight (sun), SkyAtmosphere, SkyLight, ExponentialHeightFog, and a floor plane, all filed under an Environment outliner folder. Pass --preset (clear|noon|sunset|overcast|snowy|night) to also apply a physically-grounded grade (sun angle/intensity, fog, atmosphere, exposure, saturation) following Unreal's outdoor-lighting rules, a preset forces the sky rig + a PostProcessVolume on. Without a preset, toggle parts with --sky/--floor/--clouds/--post-process/--player-start and tune the sun with --sun-pitch/--sun-yaw and the floor with --floor-size (metres).
| Parameter | Type | Required | Description |
|---|---|---|---|
| preset | string | No | Physically-grounded lighting preset: clear, noon, sunset, overcast, snowy, night. Forces the sky rig + PostProcessVolume on and grades sun/fog/atmosphere/exposure. Empty = plain rig, no grade. |
| sky | bool | No | Spawn the sky rig: sun (atmosphere light) + SkyAtmosphere + SkyLight (real-time capture) + HeightFog |
| floor | bool | No | Spawn a floor plane |
| clouds | bool | No | Spawn a VolumetricCloud |
| post_process | bool | No | Spawn an unbound PostProcessVolume (exposure/tonemapping) |
| player_start | bool | No | Spawn a PlayerStart |
| sun_pitch | float | No | Sun (DirectionalLight) pitch in degrees (Environment Light Mixer default) |
| sun_yaw | float | No | Sun (DirectionalLight) yaw in degrees |
| sun_roll | float | No | Sun (DirectionalLight) roll in degrees |
| floor_size | float | No | Floor plane size in metres |
| folder | string | No | Outliner folder for the spawned actors |
cfa setup_default_scene --preset clear
cfa setup_default_scene --preset sunset --floor-size 200
cfa setup_default_scene --preset overcast
cfa setup_default_scene --clouds --player-startget_undo_historyRead the editor's undo stack, newest first
Lists the editor's undo history the way the Undo History window does. Every CFA mutation is one entry titled 'CFA: <command>' with source=cfa, while the user's own edits show source=editor, so an agent can tell its work apart from theirs. Pass --details to also report what each transaction changed: the objects touched, their classes, and the property names that differ. Use --scope mine or --scope others to filter, and --filter to match on title.
| Parameter | Type | Required | Description |
|---|---|---|---|
| max_results | int | No | How many entries to return, newest first |
| filter | string | No | Only return entries whose title contains this text |
| scope | string | No | all (default), mine (authored by CFA), or others (authored by the user or the editor) |
| details | bool | No | Include the objects and property names each transaction changed |
cfa get_undo_history
cfa get_undo_history --scope mine --details
cfa get_undo_history --filter spawn_actor --max-results 5undoRoll back the last N transactions, as Ctrl+Z does
Undoes the top of the editor's undo stack. By default (--scope mine) it stops at the first entry CFA did not author, so an agent can back its own work out without reverting the user's edits, and reports stopped_because when it stops early. The undo stack is strictly last-in-first-out, so a CFA transaction sitting below a user edit cannot be reverted on its own; check get_undo_history first. Pass --scope any to undo whatever is on top regardless of who made it.
| Parameter | Type | Required | Description |
|---|---|---|---|
| count | int | No | How many transactions to undo |
| scope | string | No | mine (default) stops at the first entry CFA did not author; any undoes whatever is on top |
cfa undo
cfa undo --count 5
cfa undo --count 3 --scope anybatchRun many commands in one round trip and one undo step
Executes an ordered list of commands against the editor in a single bridge call. By default the batch is atomic: consecutive undoable steps share one transaction, so fifty edits collapse to a single Ctrl+Z, and if any step fails the whole thing is rolled back with undo. With --continue-on-error or --atomic=false each step is its own undo step and a failed step undoes only its own partial edits; --continue-on-error runs everything and reports per step, --atomic=false stops at the first failure and keeps the steps before it. --dry-run validates command names and parameters without touching the project. A step can reference an earlier step's output with "$2.asset_path", substitution only, it is a data format, not a scripting language; write "$$100" to send the literal text "$100". A rollback also deletes the assets the batch created; deleting, renaming, moving or saving assets cannot be undone, so those steps are listed under not_rolled_back. Packages a step saved are listed under saved_to_disk: their files keep the saved version, so rolled_back is then false.
| Parameter | Type | Required | Description |
|---|---|---|---|
| steps | json | Yes | JSON array of {command, params} objects, run in order. "$2.field" reads step 2's result; "$$text" sends "$text" |
| atomic | bool | No | One undo step for the batch, rolled back whole if any step fails. false: each step is its own undo step and the batch stops at the first failure |
| continue_on_error | bool | No | Run every step even when some fail, then report which failed; each step is its own undo step |
| dry_run | bool | No | Validate every step without mutating anything |
| include_results | bool | No | Include each step's full result payload |
cfa batch --json '{"steps":[{"command":"spawn_actor","params":{"name":"A","location":[0,0,100]}},{"command":"spawn_actor","params":{"name":"B","location":[200,0,100]}}]}'
cfa batch --dry-run --json '{"steps":[{"command":"spawn_actor","params":{"name":"A"}}]}'
cfa batch --continue-on-error --json '{"steps":[...]}'redoRe-apply the last N undone transactions
Redoes transactions previously undone. By default (--scope mine) it stops at the first entry CFA did not author; pass --scope any to redo whatever is next.
| Parameter | Type | Required | Description |
|---|---|---|---|
| count | int | No | How many transactions to redo |
| scope | string | No | mine (default) stops at the first entry CFA did not author; any redoes whatever is next |
cfa redo
cfa redo --count 3