unity-cli

August 23, 2026 · View on GitHub

unity-cli

AI coding agent skill for Unity Editor — works with any skills-compatible agent (Claude Code, Codex, …)
Powered by unity-csharpconsole

License Unity Claude Code Codex

62 package-owned built-ins: 56 authoring commands across six default domains and 6 explicit control-plane commands.
Depends on unity-csharpconsole — a Roslyn-powered interactive C# REPL for Unity.

Quick Start · Usage · Commands · Custom Commands · Architecture

English | 中文


You:    "Create 10 cubes in a circle and add Rigidbody to each"
Agent:  Done. 10 cubes created at radius 5, each with a Rigidbody component.

⚡ CLI + Skills

CLI commands are exposed through the agent's skill system.

  • Token-efficient. Domain Index → Route Cards → Contract Bundle keeps unrelated command schemas out of context.
  • Package-aligned. One fingerprint comparison resolves package-owned built-in and project custom contracts into a per-project machine cache.
  • Unrestricted. Falls back to a full Roslyn C# REPL when no structured command or reusable snippet fits.
  • No sidecar. The service runs inside Unity Editor with no extra process.
  • Workflow-aware. Understands Unity's compile lifecycle, play mode, and domain reload.
  • Runtime / IL2CPP support. Works with HybridCLR for runtime builds.
  • Debug a running player. --mode runtime addresses the player instead of the editor — inspect its scene, screenshot it, record a profiler capture — and cs pull brings any file back from it, including one on another machine.
  • Self-evolving snippet library. Project-local C# snippets have a validation gate, usage tracking, and aging.

🚀 Quick Start

Important

Install scope = the Unity project, not global. Never install into your home or global skills directory. The bundled CLI locates its Unity project by walking up from its own committed location.

1 · Install the unity-cli skill:

cd path/to/your/UnityProject
npx skills add niqibiao/unity-cli-skill --copy

2 · Initialize:

In your AI agent, run unity-cli setup.

Prerequisites: a skills-compatible agent (for example Claude Code or Codex CLI), Node.js for npx, Unity 2022, and Python 3.10+.

💬 Usage

Tell your agent what you want:

> Add a directional light and rotate it 45 degrees on X
> Find all "Enemy" objects and list their components
> Take a screenshot of the Scene View
> Start profiler recording with deep profiling

The agent discovers the smallest relevant command contract, verifies mutations, and writes C# only when a structured route does not fit.

🧩 One skill, many subcommands

Everything ships in one skill (unity-cli):

SubcommandDescription
cs setupInstall/version-check the Unity package
cs status / cs healthInspect package and service state
cs list-commandsProgressively discover package-owned contracts
cs command --inputPreflight and run one canonical command
cs batch --inputPreflight and run a command workflow in one request
cs exec --fileRun raw C# as the final fallback
cs refreshRefresh assets and wait for compilation
cs testRun Unity Test Framework tests and wait for results
cs pull <path>Retrieve a file from the process being addressed
cs logs [path]Follow a log file on the process being addressed, foreground or detached
cs catalog sync / cs catalog listMaintain the shared custom-command shortlist
cs snippets …Browse and maintain reusable C# snippets

📦 Commands

The Unity package is the executable schema authority. The CLI does not maintain a second built-in argument/result manifest. Instead it combines the current package Registry Snapshot with a small schema-free routing overlay.

Progressive discovery has three stages:

# 1. Optional Domain Index: skip when the relevant domains are already clear
cs list-commands --offline --json

# 2. First live discovery: scoped Route Cards, still no argument/result schemas
cs list-commands \
  --domain objects --domain assets --tier core --json

# 3. Contract Bundle: selected contracts + one direct relation layer
cs list-commands --offline \
  --id gameobject/create \
  --id gameobject/get \
  --json

The first live discovery in an agent session performs one fingerprint comparison. Later queries use --offline and the validated project cache. --refresh forces a complete snapshot only when the user explicitly asks to update the command list.

Default authoring domains

DomainScope
editorEditor readiness, play mode, test runs, and Console diagnostics
sceneScene discovery, loading, saving, and hierarchy
objectsGameObjects, components, transforms, and selection
assetsProject assets, materials, and ScriptableObjects
prefabsPrefab creation, instantiation, inspection, and direct editing
captureScene/Game View capture and Profiler recording

The five registry/session mechanics are visible only through the explicit control view:

cs list-commands --offline \
  --view control --domain control --tier control-plane --json

Execute the stable canonical ID; the package contract owns its internal wire route:

{"id":"gameobject/create","args":{"name":"Wall","primitiveType":"Cube"}}

Pass the JSON through cs command --json --input <file>. Built-in and custom commands use the same package-owned preflight. The CLI rejects stale execution contracts, unknown arguments, invalid types/ranges, ambiguous selectors, and unsafe empty mutations before Unity runs them.

editor/menu.open and editor/window.open are deny-policy intents, not executable contracts. Exact-ID discovery returns them as non-executing denied decisions; the skill will not bypass them through snippets or raw C#.

Snippets

ActionDescription
list / show / searchDiscover reusable snippets
useRun a snippet
add / updateValidate and maintain snippets
deprecate / pruneRetire snippets
stats / doctorAudit usage and library health

🔧 Custom Commands

Custom commands use the same package registry, canonical-ID discovery, preflight, and execution path as built-ins:

cs list-commands --view custom --json
cs list-commands --offline --view custom --id teamtools/build_room --json

See unity-csharpconsole for defining and registering them.

cs catalog sync writes a deterministic, version-controlled shortlist from a registry verified during that invocation. cs catalog list reads the shortlist offline; the current package Registry Snapshot remains execution authority.

🏗️ Architecture

AI Agent
  └─ unity-cli skill
      └─ pure-stdlib Python CLI
          ├─ schema-free routing overlay
          ├─ fingerprint resolver + machine-local Registry Snapshot cache
          ├─ progressive discovery + package-contract preflight
          └─ HTTP bridge
              └─ com.zh1zh1.csharpconsole in Unity Editor/Player
                  ├─ package-owned registry (56 authoring + 6 control)
                  ├─ command handlers
                  └─ Roslyn compiler / REPL executor

The CLI dynamically imports its client core from the installed Unity package, so client and service stay on the same major.minor line. Project root and service port are auto-detected.

❓ Troubleshooting

Warning

The Unity-side service binds all interfaces without authentication — a trusted-LAN design (reaching a teammate's Editor is a feature). Do not expose the port to untrusted networks.

ProblemSolution
service: UNREACHABLEOpen Unity Editor with the project loaded
package: NOT FOUNDRun cs setup, then let Unity resolve the package
Port conflictThe service advances to a free port; inspect Temp/CSharpConsole/refresh_state.json
Custom unavailable offlineRun one live cs list-commands --view custom --json
Version mismatchUse cs status, then align package and CLI major.minor

License

Apache-2.0


If this skill saves you time, consider giving it a star. It helps others find it.