Skip to content
Draft
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
4 changes: 2 additions & 2 deletions .agents/skills/uloop-launch/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,8 @@ May print status/progress lines before the final JSON payload, such as project p
The final JSON payload includes:

- `Success`: whether the command completed
- `Ready`: whether Unity CLI Loop is ready for commands
- `ServerReady`: whether the Unity CLI Loop server accepted requests
- `Ready`: whether Unity Loop Harness is ready for commands
- `ServerReady`: whether the Unity Loop Harness 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
Expand Down
2 changes: 1 addition & 1 deletion .agents/skills/uloop-replay-input/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ description: "Replay recorded PlayMode keyboard and mouse input. Use for exact g

Replay recorded keyboard and mouse input during PlayMode. Loads a JSON recording and injects input frame-by-frame via Input System with zero CLI overhead. Supports looping and progress monitoring.

Create recording JSON files in the Unity Editor from **Window > Unity CLI Loop > Recordings** with **Start Recording** and **Stop Recording**. There is no CLI command for recording input.
Create recording JSON files in the Unity Editor from **Window > Unity Loop Harness > Recordings** with **Start Recording** and **Stop Recording**. There is no CLI command for recording input.

## Usage

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ Returns JSON with:
- `ReleasedKeys` (string list, nullable): Set only for `ReleaseAll`; the key names that were force-released (empty when nothing was held)
- `ReleasedKeyStates` (list, nullable): Set only for `ReleaseAll`. Each entry is `{ Key, DeviceIsPressedAfterRelease }` from a device readback after the release injection. Empty when nothing was held, or when no keyboard device is present (`KeyStateReadUpdateType` is also omitted then). If tracked keys remain with no keyboard device, `ReleasedKeys` is non-empty while `ReleasedKeyStates` is empty. Omitted (`null`) for other actions. `DeviceIsPressedAfterRelease: true` means the Input System view still reports pressed — do not treat `Success: true` as proof that gameplay polling already sees the key as up
- `KeyStateReadUpdateType` (string, nullable): Set for `ReleaseAll`. The `InputState.currentUpdateType` at that device readback (`Editor`, `Dynamic`, `Fixed`, ...). Omitted when empty
- `KeyStateTrackedHeld` (boolean, nullable): Whether Unity CLI Loop's own key-hold tracker considered the key held. Set on KeyDown "already held" / KeyUp "not currently held" rejections, and on successful `KeyUp`
- `KeyStateTrackedHeld` (boolean, nullable): Whether Unity Loop Harness's own key-hold tracker considered the key held. Set on KeyDown "already held" / KeyUp "not currently held" rejections, and on successful `KeyUp`
- `KeyStateDeviceIsPressed` (boolean, nullable): Whether `keyboard[key].isPressed` reported pressed at that same moment. Set on the same responses as `KeyStateTrackedHeld`
- `DeferredLatchSyncScheduled` (boolean): Set `true` on successful `ReleaseAll` / `KeyUp` when a one-shot player-update latch sync was scheduled. Omitted when false. The sync runs on the next Dynamic/Fixed/Manual Input System update (not Editor); while PlayMode is paused it therefore waits until resume. Gameplay polling during that same input update may still see a stale press; polling from `Update` after that input update should see the key up
- `InterruptedByPausePoint` / `PausePointId` / `PausePointHitCount` / `PausePointHits`: Pause-point interruption info (all nullable except the boolean). `PausePointHits` lists every marker hit during this input in hit order; `PausePointId` only names the latest one. See the Pause Point Inspection section in SKILL.md
Expand Down
4 changes: 2 additions & 2 deletions .claude/skills/uloop-launch/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,8 @@ May print status/progress lines before the final JSON payload, such as project p
The final JSON payload includes:

- `Success`: whether the command completed
- `Ready`: whether Unity CLI Loop is ready for commands
- `ServerReady`: whether the Unity CLI Loop server accepted requests
- `Ready`: whether Unity Loop Harness is ready for commands
- `ServerReady`: whether the Unity Loop Harness 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
Expand Down
2 changes: 1 addition & 1 deletion .claude/skills/uloop-replay-input/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ description: "Replay recorded PlayMode keyboard and mouse input. Use for exact g

Replay recorded keyboard and mouse input during PlayMode. Loads a JSON recording and injects input frame-by-frame via Input System with zero CLI overhead. Supports looping and progress monitoring.

Create recording JSON files in the Unity Editor from **Window > Unity CLI Loop > Recordings** with **Start Recording** and **Stop Recording**. There is no CLI command for recording input.
Create recording JSON files in the Unity Editor from **Window > Unity Loop Harness > Recordings** with **Start Recording** and **Stop Recording**. There is no CLI command for recording input.

## Usage

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ Returns JSON with:
- `ReleasedKeys` (string list, nullable): Set only for `ReleaseAll`; the key names that were force-released (empty when nothing was held)
- `ReleasedKeyStates` (list, nullable): Set only for `ReleaseAll`. Each entry is `{ Key, DeviceIsPressedAfterRelease }` from a device readback after the release injection. Empty when nothing was held, or when no keyboard device is present (`KeyStateReadUpdateType` is also omitted then). If tracked keys remain with no keyboard device, `ReleasedKeys` is non-empty while `ReleasedKeyStates` is empty. Omitted (`null`) for other actions. `DeviceIsPressedAfterRelease: true` means the Input System view still reports pressed — do not treat `Success: true` as proof that gameplay polling already sees the key as up
- `KeyStateReadUpdateType` (string, nullable): Set for `ReleaseAll`. The `InputState.currentUpdateType` at that device readback (`Editor`, `Dynamic`, `Fixed`, ...). Omitted when empty
- `KeyStateTrackedHeld` (boolean, nullable): Whether Unity CLI Loop's own key-hold tracker considered the key held. Set on KeyDown "already held" / KeyUp "not currently held" rejections, and on successful `KeyUp`
- `KeyStateTrackedHeld` (boolean, nullable): Whether Unity Loop Harness's own key-hold tracker considered the key held. Set on KeyDown "already held" / KeyUp "not currently held" rejections, and on successful `KeyUp`
- `KeyStateDeviceIsPressed` (boolean, nullable): Whether `keyboard[key].isPressed` reported pressed at that same moment. Set on the same responses as `KeyStateTrackedHeld`
- `DeferredLatchSyncScheduled` (boolean): Set `true` on successful `ReleaseAll` / `KeyUp` when a one-shot player-update latch sync was scheduled. Omitted when false. The sync runs on the next Dynamic/Fixed/Manual Input System update (not Editor); while PlayMode is paused it therefore waits until resume. Gameplay polling during that same input update may still see a stale press; polling from `Update` after that input update should see the key up
- `InterruptedByPausePoint` / `PausePointId` / `PausePointHitCount` / `PausePointHits`: Pause-point interruption info (all nullable except the boolean). `PausePointHits` lists every marker hit during this input in hit order; `PausePointId` only names the latest one. See the Pause Point Inspection section in SKILL.md
Expand Down
2 changes: 1 addition & 1 deletion Assets/Editor/CompileCheckWindow/CompileCheckerExample.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
namespace io.github.hatayama.UnityCliLoop.Dev
{
/// <summary>
/// Provides Compile Checker Example behavior for Unity CLI Loop.
/// Provides Compile Checker Example behavior for Unity Loop Harness.
/// </summary>
public class CompileCheckerExample
{
Expand Down
2 changes: 1 addition & 1 deletion Assets/Editor/CompileCheckWindow/CompileLogDisplay.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
namespace io.github.hatayama.UnityCliLoop.Dev
{
/// <summary>
/// Provides Compile Log Display behavior for Unity CLI Loop.
/// Provides Compile Log Display behavior for Unity Loop Harness.
/// </summary>
public class CompileLogDisplay : System.IDisposable
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,4 +38,4 @@ Returns JSON with:

## Notes

This is a sample custom tool demonstrating how to create Unity CLI Loop tools.
This is a sample custom tool demonstrating how to create Unity Loop Harness tools.
2 changes: 1 addition & 1 deletion Assets/Editor/FindGameObjects/FindGameObjectsTestMenu.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
namespace io.github.hatayama.UnityCliLoop.Dev
{
/// <summary>
/// Provides Find Game Objects Test Menu behavior for Unity CLI Loop.
/// Provides Find Game Objects Test Menu behavior for Unity Loop Harness.
/// </summary>
public static class FindGameObjectsTestMenu
{
Expand Down
4 changes: 2 additions & 2 deletions Assets/Tests/Demo/scripts/verify-replay-via-cli.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ Usage:
Prerequisites:
- Unity Editor running with InputReplayVerificationScene loaded
- PlayMode is not running because this script starts it
- Record input with Window > Unity CLI Loop > Recordings when prompted
- Record input with Window > Unity Loop Harness > Recordings when prompted
#>

[CmdletBinding()]
Expand Down Expand Up @@ -452,7 +452,7 @@ Invoke-ActivateForRecord
Write-Host "[3/8] Recording input with the Recordings window..."
Write-Host ""
Write-Host "========================================="
Write-Host " Open Window > Unity CLI Loop > Recordings."
Write-Host " Open Window > Unity Loop Harness > Recordings."
Write-Host " Click Start Recording, play in the Game View, then click Stop Recording."
Write-Host ""
Write-Host " WASD: move | Mouse: rotate"
Expand Down
4 changes: 2 additions & 2 deletions Assets/Tests/Demo/scripts/verify-replay-via-cli.sh
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
# Prerequisites:
# - Unity Editor running for the target project
# - PlayMode is not running because this script starts it
# - Record input with Window > Unity CLI Loop > Recordings when prompted
# - Record input with Window > Unity Loop Harness > Recordings when prompted

set -e

Expand Down Expand Up @@ -168,7 +168,7 @@ activate_for_record
echo "[4/8] Recording input with the Recordings window..."
echo ""
echo "========================================="
echo " Open Window > Unity CLI Loop > Recordings."
echo " Open Window > Unity Loop Harness > Recordings."
echo " Click Start Recording, play in the Game View, then click Stop Recording."
echo ""
echo " WASD: move | Mouse: rotate"
Expand Down
16 changes: 8 additions & 8 deletions Assets/Tests/Editor/CliPinReaderServiceTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ public void LoadPinFromPath_WhenFileIsMissing_ReturnsFailureWithNotFoundMessage(
CliPinLoadResult result = CliPinReaderService.LoadPinFromPath(pinPath);

Assert.That(result.Success, Is.False);
Assert.That(result.ErrorMessage, Is.EqualTo($"Unity CLI Loop pin file not found at {pinPath}."));
Assert.That(result.ErrorMessage, Is.EqualTo($"Unity Loop Harness pin file not found at {pinPath}."));
}

[Test]
Expand All @@ -72,7 +72,7 @@ public void LoadPinFromPath_WhenFileIsEmpty_ReturnsFailureWithEmptyMessage()
CliPinLoadResult result = CliPinReaderService.LoadPinFromPath(pinPath);

Assert.That(result.Success, Is.False);
Assert.That(result.ErrorMessage, Is.EqualTo($"Unity CLI Loop pin file at {pinPath} is empty."));
Assert.That(result.ErrorMessage, Is.EqualTo($"Unity Loop Harness pin file at {pinPath} is empty."));
}
finally
{
Expand Down Expand Up @@ -102,7 +102,7 @@ public void LoadPinFromPath_WhenProjectRunnerVersionKeyIsMissing_ReturnsFailureW
Assert.That(result.Success, Is.False);
Assert.That(
result.ErrorMessage,
Is.EqualTo($"Unity CLI Loop pin file at {pinPath} is missing projectRunnerVersion."));
Is.EqualTo($"Unity Loop Harness pin file at {pinPath} is missing projectRunnerVersion."));
}
finally
{
Expand Down Expand Up @@ -132,7 +132,7 @@ public void LoadPinFromPath_WhenMinimumDispatcherVersionKeyIsMissing_ReturnsFail
Assert.That(result.Success, Is.False);
Assert.That(
result.ErrorMessage,
Is.EqualTo($"Unity CLI Loop pin file at {pinPath} is missing minimumDispatcherVersion."));
Is.EqualTo($"Unity Loop Harness pin file at {pinPath} is missing minimumDispatcherVersion."));
}
finally
{
Expand Down Expand Up @@ -163,7 +163,7 @@ public void LoadPinFromPath_WhenFileIsInvalidJson_ReturnsFailureWithInvalidJsonM
Assert.That(result.Success, Is.False);
Assert.That(
result.ErrorMessage,
Does.StartWith($"Unity CLI Loop pin file at {pinPath} contains invalid JSON:"));
Does.StartWith($"Unity Loop Harness pin file at {pinPath} contains invalid JSON:"));
}
finally
{
Expand Down Expand Up @@ -389,7 +389,7 @@ public void LoadPinFromPath_WhenPathIsWhitespace_ReturnsEmptyPathFailure()
CliPinLoadResult result = CliPinReaderService.LoadPinFromPath(" ");

Assert.That(result.Success, Is.False);
Assert.That(result.ErrorMessage, Is.EqualTo("Unity CLI Loop pin file path is empty."));
Assert.That(result.ErrorMessage, Is.EqualTo("Unity Loop Harness pin file path is empty."));
}

/// <summary>
Expand All @@ -404,7 +404,7 @@ public void LoadDispatcherBootstrapPinFromPath_WhenPinFileIsMissing_ReturnsRegul
DispatcherBootstrapPinLoadResult result = CliPinReaderService.LoadDispatcherBootstrapPinFromPath(pinPath);

Assert.That(result.Success, Is.False);
Assert.That(result.ErrorMessage, Is.EqualTo($"Unity CLI Loop pin file not found at {pinPath}."));
Assert.That(result.ErrorMessage, Is.EqualTo($"Unity Loop Harness pin file not found at {pinPath}."));
}

/// <summary>
Expand Down Expand Up @@ -505,7 +505,7 @@ private static void AssertBootstrapFailure(string releaseTag, string manifest, s
Assert.That(result.Success, Is.False);
Assert.That(
result.ErrorMessage,
Is.EqualTo($"Unity CLI Loop pin file at {pinPath} {expectedMessageSuffix}"));
Is.EqualTo($"Unity Loop Harness pin file at {pinPath} {expectedMessageSuffix}"));
}
finally
{
Expand Down
4 changes: 2 additions & 2 deletions Assets/Tests/Editor/CliPinSynchronizerTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,7 @@ public void SyncProjectPinFile_WhenSourcePinMissing_ShouldLogWarningAndSkip()
UnityCliLoopConstants.ULOOP_PROJECT_RUNNER_PIN_FILE_NAME);
LogAssert.Expect(
LogType.Warning,
$"Unity CLI Loop skipped {UnityCliLoopConstants.ULOOP_PROJECT_RUNNER_PIN_FILE_NAME} synchronization because the package source pin was not found at {sourcePath}.");
$"Unity Loop Harness skipped {UnityCliLoopConstants.ULOOP_PROJECT_RUNNER_PIN_FILE_NAME} synchronization because the package source pin was not found at {sourcePath}.");

bool changed = CliPinSynchronizer.SyncProjectPinFile(packageRoot, projectRoot);

Expand Down Expand Up @@ -159,7 +159,7 @@ public void SyncProjectPinFile_WhenPackageRootMissing_ShouldSkipWrite()
{
Directory.CreateDirectory(projectRoot);
string expectedWarning =
$"Unity CLI Loop skipped {UnityCliLoopConstants.ULOOP_PROJECT_RUNNER_PIN_FILE_NAME} synchronization because the package root is empty.";
$"Unity Loop Harness skipped {UnityCliLoopConstants.ULOOP_PROJECT_RUNNER_PIN_FILE_NAME} synchronization because the package root is empty.";
LogAssert.Expect(
LogType.Warning,
expectedWarning);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -162,7 +162,7 @@ public void HandleCompileStoppedWithoutFinishEvent_WhenConsoleErrorsExist_Append
Assert.That(
abortedWithResult.Message,
Is.EqualTo(
"Unity stopped compiling before Unity CLI Loop received the compilationFinished callback. " +
"Unity stopped compiling before Unity Loop Harness received the compilationFinished callback. " +
"The compile result is indeterminate; use get-logs to inspect the compiler output.\n" +
"Recent Console errors:\n- " + consoleError));
}
Expand Down Expand Up @@ -211,7 +211,7 @@ public void HandleCompileStoppedWithoutFinishEvent_WhenNoConsoleErrorsExist_Keep
Assert.That(
abortedWithResult.Message,
Is.EqualTo(
"Unity stopped compiling before Unity CLI Loop received the compilationFinished callback. " +
"Unity stopped compiling before Unity Loop Harness received the compilationFinished callback. " +
"The compile result is indeterminate; use get-logs to inspect the compiler output."));
}

Expand Down
4 changes: 2 additions & 2 deletions Assets/Tests/Editor/DomainReloadRecoveryUseCaseTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ public async Task RestoreServerStateIfNeededAsync_WhenRecoveryDoesNotStartServer
Assert.That(result.IsValid, Is.False);
Assert.That(
result.ErrorMessage,
Is.EqualTo("Unity CLI Loop server recovery finished, but no running server instance is available."));
Is.EqualTo("Unity Loop Harness server recovery finished, but no running server instance is available."));
}

[Test]
Expand Down Expand Up @@ -482,7 +482,7 @@ public void ExecuteAfterDomainReloadAsync_WhenRestorationFails_ReturnsFailureWit
Assert.That(result.Success, Is.False);
Assert.That(
result.ErrorMessage,
Is.EqualTo("Server restoration failed: Unity CLI Loop server recovery finished, but no running server instance is available."));
Is.EqualTo("Server restoration failed: Unity Loop Harness server recovery finished, but no running server instance is available."));
Assert.That(recoveryCoordinator.StartRecoveryCallCount, Is.EqualTo(1));
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
namespace io.github.hatayama.UnityCliLoop.Tests.Editor.DynamicCodeToolTests
{
/// <summary>
/// Verifies that bundled Roslyn support plugins stay private to Unity CLI Loop.
/// Verifies that bundled Roslyn support plugins stay private to Unity Loop Harness.
/// </summary>
public sealed class CodeAnalysisPluginImporterTests
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ public async Task ProcessRequest_WhenToolIsDisabled_ProducesFrozenErrorJson()
string response = await processor.ProcessRequest(BuildToolRequest(DeterministicSuccessTool.Name, 1), CancellationToken.None);

Assert.That(response, Is.EqualTo(
"{\"jsonrpc\":\"2.0\",\"id\":1,\"error\":{\"code\":-32603,\"message\":\"Tool 'deterministic-success' is disabled. To enable it, go to Window > Unity CLI Loop > Settings\",\"data\":{\"type\":\"internal_error\",\"message\":\"This tool has been disabled in project settings.\"}}}"));
"{\"jsonrpc\":\"2.0\",\"id\":1,\"error\":{\"code\":-32603,\"message\":\"Tool 'deterministic-success' is disabled. To enable it, go to Window > Unity Loop Harness > Settings\",\"data\":{\"type\":\"internal_error\",\"message\":\"This tool has been disabled in project settings.\"}}}"));
}

[Test]
Expand Down
2 changes: 1 addition & 1 deletion Assets/Tests/Editor/MacProcessActivityApiTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ public void BeginThenEnd_OnMacOS_ReturnsATokenAndDoesNotThrow()
MacProcessActivityApi api = new MacProcessActivityApi();
for (int attempt = 0; attempt < 3; attempt++)
{
IntPtr token = api.Begin("Unity CLI Loop activity test");
IntPtr token = api.Begin("Unity Loop Harness activity test");

Assert.That(token, Is.Not.EqualTo(IntPtr.Zero));
Assert.DoesNotThrow(() => api.End(token));
Expand Down
4 changes: 2 additions & 2 deletions Assets/Tests/Editor/SetupWizardWindowTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -445,15 +445,15 @@ public void PrepareForOpen_PopulatesWindowStateBeforeShowing()

SetupWizardWindow.PrepareForOpen(
window,
"Unity CLI Loop Setup",
"Unity Loop Harness Setup",
position,
true);

SerializedObject serializedWindow = new(window);
SerializedProperty recordVersionProperty =
serializedWindow.FindProperty("_shouldRecordLastSeenVersionAfterCreateGui");

Assert.That(window.titleContent.text, Is.EqualTo("Unity CLI Loop Setup"));
Assert.That(window.titleContent.text, Is.EqualTo("Unity Loop Harness Setup"));
Assert.That(window.position, Is.EqualTo(position));
Assert.That(recordVersionProperty, Is.Not.Null);
Assert.That(recordVersionProperty.boolValue, Is.True);
Expand Down
Loading
Loading