Workflow Skills
Persistent history and rollback system for AI operations ("Time Machine"). Allows tagging tasks, snapshotting objects before modification, and undoing specific tasks even after Editor restarts.
NEW: Session-level undo - Group all changes from a conversation and undo them together.
Guardrails
Mode: Semi-Auto (available by default)
DO NOT (common hallucinations):
workflow_savedoes not exist → useworkflow_task_endto end and save a taskworkflow_rollbackdoes not exist → useworkflow_undo_task(by taskId) orworkflow_session_undo(by sessionId)workflow_createdoes not exist → useworkflow_task_startworkflow_revert_taskis deprecated → useworkflow_undo_task
Routing:
- For simple undo/redo (1 step) →
editor_undo/editor_redo(editor module) - For multi-step undo →
history_undowithstepsparameter (this module) - For conversation-level undo →
workflow_session_undo(this module)
Bookmark Skills
bookmark_set
Save current selection and scene view position as a bookmark.
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| bookmarkName | string | Yes | - | Name for the bookmark |
| note | string | No | null | Optional note for the bookmark |
Returns: {success, bookmark, selectedCount, hasSceneView, note}
bookmark_goto
Restore selection and scene view from a bookmark.
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| bookmarkName | string | Yes | - | Name of the bookmark to restore |
Returns: {success, bookmark, restoredSelection, note}
bookmark_list
List all saved bookmarks.
No parameters.
Returns: {success, count, bookmarks: [{name, selectedCount, hasSceneView, note, createdAt}]}
bookmark_delete
Delete a bookmark.
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| bookmarkName | string | Yes | - | Name of the bookmark to delete |
Returns: {success, deleted}
History Skills
history_undo
Undo the last operation (or multiple steps).
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| steps | int | No | 1 | Number of undo steps to perform |
Returns: {success, undoneSteps}
history_redo
Redo the last undone operation (or multiple steps).
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| steps | int | No | 1 | Number of redo steps to perform |
Returns: {success, redoneSteps}
history_get_current
Get the name of the current undo group.
No parameters.
Returns: {success, currentGroup, groupIndex}
Planning And Batch Governance
workflow_plan
Generate a combined execution plan for multiple skills on the server side.
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
skillsJson | string | Yes | - | JSON array of {"name": "...", "params": {...}} entries |
Returns: {totalSteps, totalRisk, steps, dependencies, warnings, mayDisconnect}
batch_query_assets
Query project assets with filters that are useful before batch cleanup or migration work.
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
searchFilter | string | No | - | Extra AssetDatabase.FindAssets filter text |
folder | string | No | Assets | Search root |
typeFilter | string | No | - | Asset type filter such as t:Material or Prefab |
namePattern | string | No | - | Regex applied to file name without extension |
labelFilter | string | No | - | Asset label filter such as l:Addressable |
maxResults | int | No | 200 | Max assets returned |
Returns: {count, totalMatched, summary, assets}
batch_retry_failed
Retry only the failed items from an earlier batch execution report. This now reuses the original operation context stored in the report.
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
reportId | string | Yes | - | Source report ID from batch_report_get / batch_report_list |
runAsync | bool | No | true | Return a jobId immediately or wait for completion |
chunkSize | int | No | 100 | Chunk size for retry execution |
Returns: {status, jobId?, retryCount, originalReportId, reportId?}
Session Management (Conversation-Level Undo)
workflow_session_start
Start a new session (conversation-level). All changes will be tracked and can be undone together. Call this at the beginning of each conversation.
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| tag | string | No | null | Label for the session |
Returns: {success, sessionId, message}
workflow_session_end
End the current session and save all tracked changes. Call this at the end of each conversation.
No parameters.
Returns: {success, sessionId, message}
workflow_session_undo
Undo all changes made during a specific session (conversation-level undo).
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| sessionId | string | No | null | The UUID of the session to undo. If not provided, undoes the most recent session |
Returns: {success, sessionId, message}
workflow_session_list
List all recorded sessions (conversation-level history).
No parameters.
Returns: {success, count, currentSessionId, sessions: [{sessionId, taskCount, totalChanges, startTime, endTime, tags}]}
workflow_session_status
Get the current session status.
No parameters.
Returns: {success, hasActiveSession, currentSessionId, isRecording, currentTaskId, currentTaskTag, currentTaskDescription, snapshotCount}
Task-Level Skills
workflow_task_start
Start a new persistent workflow task to track changes for undo. Call workflow_task_end when done.
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| tag | string | Yes | - | Short label for the task (e.g., "Create NPC") |
| description | string | No | "" | Detailed description or prompt |
Returns: {success, taskId, message}
workflow_task_end
End the current workflow task and save it. Requires an active task (call workflow_task_start first).
No parameters.
Returns: {success, taskId, snapshotCount, message}
workflow_snapshot_object
Manually snapshot an object's state before modification. Requires an active task (call workflow_task_start first). Call this BEFORE component_set_property, gameobject_set_transform, etc.
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| name | string | No | null | Name of the Game Object |
| instanceId | int | No | 0 | Instance ID of the object (preferred) |
Returns: {success, objectName, type}
workflow_snapshot_created
Record a newly created object for undo tracking. Requires an active task (call workflow_task_start first). Note: component_add and gameobject_create automatically record created objects, so you typically don't need to call this manually.
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| name | string | No | null | Name of the Game Object |
| instanceId | int | No | 0 | Instance ID of the object (preferred) |
Returns: {success, objectName, type}
workflow_list
List persistent workflow history.
No parameters.
Returns: {success, count, history: [{id, tag, description, time, changes}]}
workflow_undo_task
Undo changes from a specific task (restore to previous state). The undone task is saved and can be redone later.
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| taskId | string | Yes | - | The UUID of the task to undo |
Returns: {success, taskId}
workflow_redo_task
Redo a previously undone task (restore changes).
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| taskId | string | No | null | The UUID of the task to redo. If not provided, redoes the most recently undone task |
Returns: {success, taskId}
workflow_undone_list
List all undone tasks that can be redone.
No parameters.
Returns: {success, count, undoneStack: [{id, tag, description, time, changes}]}
workflow_revert_task
(deprecated) Alias for workflow_undo_task. Use workflow_undo_task instead.
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| taskId | string | Yes | - | The UUID of the task to undo |
Returns: {success, taskId}
workflow_delete_task
Delete a task from history (does not revert changes, just removes the record).
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| taskId | string | Yes | - | The UUID of the task to delete |
Returns: {success, deletedId}
Minimal Example
import unity_skills
# Session-level: wrap entire conversation for bulk undo
unity_skills.call_skill("workflow_session_start", tag="Build Player")
unity_skills.call_skill("gameobject_create", name="Player", primitiveType="Capsule")
unity_skills.call_skill("component_add", name="Player", componentType="Rigidbody")
unity_skills.call_skill("workflow_session_end")
# Later: undo entire session
sessions = unity_skills.call_skill("workflow_session_list")
unity_skills.call_skill("workflow_session_undo", sessionId=sessions["sessions"][0]["sessionId"])Auto-Tracked Operations
The following operations are automatically tracked for undo when a session/task is active:
gameobject_create/gameobject_create_batchgameobject_duplicate/gameobject_duplicate_batchcomponent_add/component_add_batchui_create_*(canvas, button, text, image, etc.)light_createprefab_instantiate/prefab_instantiate_batchmaterial_create/material_duplicateterrain_createcinemachine_create_vcam
For modification operations, the system auto-snapshots target objects before changes when possible.
Exact Signatures
Exact names, parameters, defaults, and returns are defined by GET /skills/schema or unity_skills.get_skill_schema(), not by this file.