Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 8 additions & 8 deletions .agents/skills/uloop-clear-console/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,11 +39,11 @@ uloop clear-console --add-confirmation-message
## Output

Returns JSON with:
- `Success` (boolean): Whether the clear operation succeeded
- `ClearedLogCount` (number): Total number of log entries that were cleared
- `ClearedCounts` (object): Breakdown by log type
- `ErrorCount` (number): Errors cleared
- `WarningCount` (number): Warnings cleared
- `LogCount` (number): Info logs cleared
- `Message` (string): Description of the result; carries the failure summary when the operation fails (e.g. `"Failed to clear console: ..."`)
- `ErrorMessage` (string): Currently always empty for this tool — read `Message` for failure details
- `success` (boolean): Whether the clear operation succeeded
- `clearedLogCount` (number): Total number of log entries that were cleared
- `clearedCounts` (object): Breakdown by log type
- `errorCount` (number): Errors cleared
- `warningCount` (number): Warnings cleared
- `logCount` (number): Info logs cleared
- `message` (string): Description of the result; carries the failure summary when the operation fails (e.g. `"Failed to clear console: ..."`)
- `errorMessage` (string): Currently always empty for this tool — read `message` for failure details
7 changes: 4 additions & 3 deletions .agents/skills/uloop-compile/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ uloop compile --stop-on-external-scene-changes
## Output

Returns JSON:
- `Success`: boolean
- `ErrorCount`: number
- `WarningCount`: number
- `success`: boolean or null
- `errorCount`: number or null
- `warningCount`: number or null
- `message`: string
12 changes: 6 additions & 6 deletions .agents/skills/uloop-control-play-mode/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,16 +49,16 @@ uloop control-play-mode --action Step
## Output

Returns JSON with the current play mode state:
- `IsPlaying`: Whether Unity is currently in play mode
- `IsPaused`: Whether play mode is paused
- `Changed`: Whether the requested action changed the current play mode state
- `WasAlreadyStopped`: Whether `Stop` was requested while Play Mode was already stopped
- `Message`: Description of the action performed
- `isPlaying`: Whether Unity is currently in play mode
- `isPaused`: Whether play mode is paused
- `changed`: Whether the requested action changed the current play mode state
- `wasAlreadyStopped`: Whether `Stop` was requested while Play Mode was already stopped
- `message`: Description of the action performed

## Notes

- Play action starts the game in the Unity Editor (also resumes from pause)
- Stop action exits play mode and returns to edit mode. If Play Mode was already stopped, `Changed` is `false`, `WasAlreadyStopped` is `true`, and `Message` is `Play mode was already stopped`.
- Stop action exits play mode and returns to edit mode. If Play Mode was already stopped, `changed` is `false`, `wasAlreadyStopped` is `true`, and `message` is `Play mode was already stopped`.
- Pause action pauses the game while remaining in play mode
- Step action advances exactly one frame and leaves play mode paused (the Editor's Next Frame button; independent of Time.timeScale). Requires PlayMode to be running; repeat to walk transitions frame by frame
- Useful for automated testing workflows
Expand Down
24 changes: 12 additions & 12 deletions .agents/skills/uloop-execute-dynamic-code/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,18 +44,18 @@ return x;
## Output

Returns JSON:
- `Success`: boolean — overall execution success
- `Result`: string — value of the snippet's `return` statement (empty when omitted)
- `Logs`: string[] — execution messages from the dynamic-code tool; read Unity Console `Debug.Log` output with `get-logs`
- `CompilationErrors`: object[] — Roslyn diagnostics with `Message`, `Line`, `Column`, `ErrorCode`, optional `Hint` and `Suggestions`
- `ErrorMessage`: string — top-level failure summary (empty on success)
- `Error`: string — alias of `ErrorMessage`
- `SecurityLevel`: string — dynamic-code security level active for the request
- `UpdatedCode`: string|null — the wrapped form actually compiled (handy when debugging using-statement reordering)
- `DiagnosticsSummary`: string|null — compact summary when diagnostics are available
- `Diagnostics`: object[] — structured diagnostics; same shape as `CompilationErrors`, usually populated together with it

On `Success: false`, inspect `CompilationErrors` first. If empty, read `ErrorMessage` (and `Logs` for extra context) — the failure may be a runtime exception, security violation, cancellation, or an "execution in progress" rejection, all of which return empty `CompilationErrors`. Both EditMode and PlayMode are supported targets — the snippet runs in whichever mode the Editor is currently in.
- `success`: boolean — overall execution success
- `result`: string — value of the snippet's `return` statement (empty when omitted)
- `logs`: string[] — execution messages from the dynamic-code tool; read Unity Console `Debug.Log` output with `get-logs`
- `compilationErrors`: object[] — Roslyn diagnostics with `message`, `line`, `column`, `errorCode`, optional `hint` and `suggestions`
- `errorMessage`: string — top-level failure summary (empty on success)
- `error`: string — alias of `errorMessage`
- `securityLevel`: string — dynamic-code security level active for the request
- `updatedCode`: string|null — the wrapped form actually compiled (handy when debugging using-statement reordering)
- `diagnosticsSummary`: string|null — compact summary when diagnostics are available
- `diagnostics`: object[] — structured diagnostics; same shape as `compilationErrors`, usually populated together with it

On `success: false`, inspect `compilationErrors` first. If empty, read `errorMessage` (and `logs` for extra context) — the failure may be a runtime exception, security violation, cancellation, or an "execution in progress" rejection, all of which return empty `compilationErrors`. Both EditMode and PlayMode are supported targets — the snippet runs in whichever mode the Editor is currently in.

## Code Examples by Category

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,10 @@ using UnityEditor;

string matPath = "Assets/Materials/MyMaterial.mat";
Material mat = AssetDatabase.LoadAssetAtPath<Material>(matPath);
if (mat == null)
{
return $"Material not found at {matPath}";
}

mat.SetFloat("_Metallic", 0.8f);
mat.SetFloat("_Glossiness", 0.6f);
Expand Down Expand Up @@ -83,6 +87,10 @@ using UnityEditor;

string matPath = "Assets/Materials/MyMaterial.mat";
Material mat = AssetDatabase.LoadAssetAtPath<Material>(matPath);
if (mat == null)
{
return $"Material not found at {matPath}";
}

GameObject selected = Selection.activeGameObject;
if (selected == null)
Expand All @@ -108,6 +116,10 @@ using UnityEditor;

string matPath = "Assets/Materials/MyMaterial.mat";
Material mat = AssetDatabase.LoadAssetAtPath<Material>(matPath);
if (mat == null)
{
return $"Material not found at {matPath}";
}

mat.EnableKeyword("_EMISSION");
mat.globalIlluminationFlags = MaterialGlobalIlluminationFlags.RealtimeEmissive;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,8 @@ return $"Set {child.name}'s parent to {parent.name}";
## Get All Children

```csharp
using System.Collections.Generic;

GameObject parent = Selection.activeGameObject;
if (parent == null)
{
Expand Down Expand Up @@ -166,6 +168,8 @@ return $"Created new scene: {newScene.name}";
## Get All Root GameObjects in Scene

```csharp
using System.Collections.Generic;

UnityEngine.SceneManagement.Scene scene = UnityEngine.SceneManagement.SceneManager.GetActiveScene();
GameObject[] roots = scene.GetRootGameObjects();

Expand Down
4 changes: 2 additions & 2 deletions .agents/skills/uloop-focus-window/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,8 @@ uloop focus-window
## Output

Returns JSON with:
- `Success`: Whether the focus operation succeeded
- `Message`: Status message (e.g. `Unity Editor window focused (PID: 12345)`, or the failure reason such as `Unity project not found` / `No running Unity process found for this project` / `Failed to focus Unity window: <reason>`)
- `success`: Whether the focus operation succeeded
- `message`: Status message (e.g. `Unity Editor window focused (PID: 12345)`, or the failure reason such as `Unity project not found` / `No running Unity process found for this project` / `Failed to focus Unity window: <reason>`)

These are the only two fields. There is no PID, window-handle, or platform field returned to the caller.

Expand Down
20 changes: 10 additions & 10 deletions .agents/skills/uloop-get-logs/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -52,13 +52,13 @@ uloop get-logs --search-text "Missing.*Component" --use-regex
## Output

Returns JSON with:
- `TotalCount` (number): Total logs available before max-count clipping
- `DisplayedCount` (number): Logs returned in this response (≤ `--max-count`)
- `LogType` (string): The `--log-type` filter that was applied
- `MaxCount` (number): The `--max-count` cap that was applied
- `SearchText` (string): The `--search-text` filter that was applied (empty when omitted)
- `IncludeStackTrace` (boolean): Whether stack traces are included in `Logs[]`
- `Logs` (array): Each entry has:
- `Type` (string): `"Error"`, `"Warning"`, or `"Log"`
- `Message` (string): Log message body
- `StackTrace` (string): Stack trace text. Empty when `--include-stack-trace` is `false`.
- `totalCount` (number): Total logs available before max-count clipping
- `displayedCount` (number): Logs returned in this response (≤ `--max-count`)
- `logType` (string): The `--log-type` filter that was applied
- `maxCount` (number): The `--max-count` cap that was applied
- `searchText` (string): The `--search-text` filter that was applied (empty when omitted)
- `includeStackTrace` (boolean): Whether stack traces are included in `logs[]`
- `logs` (array): Each entry has:
- `type` (string): `"Error"`, `"Warning"`, or `"Log"`
- `message` (string): Log message body
- `stackTrace` (string): Stack trace text. Empty when `--include-stack-trace` is `false`.
6 changes: 3 additions & 3 deletions .agents/skills/uloop-hello-world/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,9 +40,9 @@ uloop hello-world --name "Carlos" --language spanish --no-include-timestamp
## Output

Returns JSON with:
- `Message`: The greeting message
- `Language`: Language used for greeting
- `Timestamp`: Current timestamp (if enabled)
- `message`: The greeting message
- `language`: Language used for greeting
- `timestamp`: Current timestamp (if enabled)

## Notes

Expand Down
26 changes: 13 additions & 13 deletions .agents/skills/uloop-launch/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -50,19 +50,19 @@ uloop launch --quit
- Prints detected Unity version
- Prints project path
- If Unity is already running, focuses the existing window and verifies tool readiness
- If the process scan is blocked by the environment (e.g. sandboxed `ps`), plain launch falls back to probing the project IPC; when Unity responds it reports `AlreadyRunning: true` without focusing the window instead of failing. `--restart` and `--quit` still fail because they need the process id
- If the process scan is blocked by the environment (e.g. sandboxed `ps`), plain launch falls back to probing the project IPC; when Unity responds it reports `alreadyRunning: true` without focusing the window instead of failing. `--restart` and `--quit` still fail because they need the process id
- If launching or restarting, prints when it is waiting for Unity CLI Loop server readiness
- If launching or restarting, waits until Unity finishes startup and the CLI can connect to the project
- Successful launch, restart, existing-process, and quit paths return JSON with:
- `Success`: whether the command completed
- `Ready`: whether Unity CLI Loop is ready for commands
- `ServerReady`: whether the Unity CLI Loop server accepted requests
- `ProjectIpcReady`: whether the project IPC path accepted tool requests
- `AlreadyRunning`: whether an existing Unity process was reused
- `Launched`: whether this command launched a Unity process
- `Restarted`: whether this command stopped an existing process and launched a new one
- `Quit`: whether this command stopped Unity without launching a new process
- `PreviousProcessId`: process ID stopped by restart or quit, when available
- `CurrentProcessId`: current Unity process ID, when available
- `ProjectRoot`: resolved project root
- `Message`: readiness summary
- `success`: whether the command completed
- `ready`: whether Unity CLI Loop is ready for commands
- `serverReady`: whether the Unity CLI Loop server accepted requests
- `projectIpcReady`: whether the project IPC path accepted tool requests
- `alreadyRunning`: whether an existing Unity process was reused
- `launched`: whether this command launched a Unity process
- `restarted`: whether this command stopped an existing process and launched a new one
- `quit`: whether this command stopped Unity without launching a new process
- `previousProcessId`: process ID stopped by restart or quit, when available
- `currentProcessId`: current Unity process ID, when available
- `projectRoot`: resolved project root
- `message`: readiness summary
16 changes: 8 additions & 8 deletions .agents/skills/uloop-record-input/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,11 +45,11 @@ Replay injects input frame-by-frame, so the game must also be deterministic to p
## Output

The CLI prints JSON with:
- `Success`: Whether the operation succeeded
- `Message`: Status message
- `Action`: Echoes which action was executed (`Start` or `Stop`)
- `OutputPath`: Path to saved recording (nullable; populated on `Stop` only)
- `TotalFrames`: Number of frames recorded (nullable int; populated on `Stop` only)
- `DurationSeconds`: Recording duration in seconds (nullable float; populated on `Stop` only)

The CLI output contains only these six payload fields. Internal metadata such as `Ver` is removed before printing. There is no `RecordingId`, `StartTimestamp`, `KeysCaptured`, or per-frame data in the response — frame data lives only in the JSON file at `OutputPath`.
- `success`: Whether the operation succeeded
- `message`: Status message
- `action`: Echoes which action was executed (`Start` or `Stop`)
- `outputPath`: Path to saved recording (nullable; populated on `Stop` only)
- `totalFrames`: Number of frames recorded (nullable int; populated on `Stop` only)
- `durationSeconds`: Recording duration in seconds (nullable float; populated on `Stop` only)

The CLI output contains only these six payload fields. Internal metadata such as `ver` is removed before printing. There is no `recordingId`, `startTimestamp`, `keysCaptured`, or per-frame data in the response — frame data lives only in the JSON file at `outputPath`.
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@ Replay injects input frame-by-frame, so the game must produce identical results
| `Time.deltaTime` for movement | Fixed per-frame constant (e.g. `MOVE_SPEED = 0.1f`) | Delta time varies between runs even at the same target frame rate |
| `Random.Range()` / `UnityEngine.Random` | Seeded random (`new System.Random(fixedSeed)`) or remove randomness | Random sequences differ between runs |
| `Rigidbody` / Physics simulation | Kinematic movement via `Transform.Translate` | Physics is non-deterministic across runs |
| `WaitForSeconds(n)` in coroutines | `WaitForEndOfFrame` or frame counting | Real-time waits depend on frame timing |
| `WaitForSeconds(n)` in coroutines | Frame counting | Real-time waits depend on frame timing |
| `Time.time` / `Time.realtimeSinceStartup` | Frame counter (`Time.frameCount - startFrame`) | Time values drift between runs |
| `FindObjectsOfType` without sort | `FindObjectsByType(FindObjectsSortMode.InstanceID)` | Iteration order is non-deterministic |
| `FindObjectsOfType` without sort | Serialized object lists or sorting by a stable project-defined key | Unity object iteration order is not replay-stable |
| `async/await` with `Task.Delay` | Frame-based waiting | Real-time delays are non-deterministic |

Set `Application.targetFrameRate = 60` or another fixed target to reduce frame timing variance. See `InputReplayVerificationController` for a complete example of deterministic game logic.
Set `QualitySettings.vSyncCount = 0` before `Application.targetFrameRate = 60` or another fixed target to reduce frame timing variance. See `InputReplayVerificationController` for a complete example of deterministic game logic.
20 changes: 10 additions & 10 deletions .agents/skills/uloop-replay-input/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,13 +49,13 @@ Replay injects the exact same input frame-by-frame, but the game must also be de
## Output

Returns JSON with:
- `Success`: Whether the operation succeeded
- `Message`: Status message
- `Action`: Echoes which action was executed (`Start`, `Stop`, or `Status`)
- `InputPath`: Path to recording file (nullable string; populated on `Start` only)
- `CurrentFrame`: Current replay frame index (nullable int)
- `TotalFrames`: Total frames in the recording (nullable int)
- `Progress`: Replay progress (nullable float in 0.0 – 1.0)
- `IsReplaying`: Whether replay is currently active (nullable bool)

These are the only eight fields. There is no `LoopCount`, `ElapsedSeconds`, `OverlayVisible`, or per-frame inspection data in the response.
- `success`: Whether the operation succeeded
- `message`: Status message
- `action`: Echoes which action was executed (`Start`, `Stop`, or `Status`)
- `inputPath`: Path to recording file (nullable string; populated on `Start` only)
- `currentFrame`: Current replay frame index (nullable int)
- `totalFrames`: Total frames in the recording (nullable int)
- `progress`: Replay progress (nullable float in 0.0 – 1.0)
- `isReplaying`: Whether replay is currently active (nullable bool)

These are the only eight fields. There is no `loopCount`, `elapsedSeconds`, `overlayVisible`, or per-frame inspection data in the response.
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@ Replay injects input frame-by-frame, so the game must produce identical results
| `Time.deltaTime` for movement | Fixed per-frame constant (e.g. `MOVE_SPEED = 0.1f`) | Delta time varies between runs even at the same target frame rate |
| `Random.Range()` / `UnityEngine.Random` | Seeded random (`new System.Random(fixedSeed)`) or remove randomness | Random sequences differ between runs |
| `Rigidbody` / Physics simulation | Kinematic movement via `Transform.Translate` | Physics is non-deterministic across runs |
| `WaitForSeconds(n)` in coroutines | `WaitForEndOfFrame` or frame counting | Real-time waits depend on frame timing |
| `WaitForSeconds(n)` in coroutines | Frame counting | Real-time waits depend on frame timing |
| `Time.time` / `Time.realtimeSinceStartup` | Frame counter (`Time.frameCount - startFrame`) | Time values drift between runs |
| `FindObjectsOfType` without sort | `FindObjectsByType(FindObjectsSortMode.InstanceID)` | Iteration order is non-deterministic |
| `FindObjectsOfType` without sort | Serialized object lists or sorting by a stable project-defined key | Unity object iteration order is not replay-stable |
| `async/await` with `Task.Delay` | Frame-based waiting | Real-time delays are non-deterministic |

Set `Application.targetFrameRate = 60` or another fixed target to reduce frame timing variance. See `InputReplayVerificationController` for a complete example of deterministic game logic.
Set `QualitySettings.vSyncCount = 0` before `Application.targetFrameRate = 60` or another fixed target to reduce frame timing variance. See `InputReplayVerificationController` for a complete example of deterministic game logic.
Loading
Loading