feat(editor): embed Ocean brand mark in Editor UI + setup polish#1231
Conversation
Add the Ocean split-cube brand mark to the Editor UI and land three low-risk installation-flow improvements. Logo: - OceanMark: reusable UI Toolkit control drawing the mark in Painter2D vector (geometry transcribed from logo-mark.svg, brand colors baked in), crisp at any DPI with no new package dependency. Painter2D is 2022.1+, so it is guarded by #if UNITY_2022_1_OR_NEWER with a raster fallback (package-icon.png) on the 2021.3 floor. - Embedded in the main window header (#header-left group) and the setup-wizard header. - Ship package-icon.png inside the package (listing icon + 2021.3 fallback). Installation polish: - One-click uv install: UvInstaller builds the official installer command per platform; setup wizard runs it off-thread with a confirm dialog and re-checks dependencies. - Claude CLI auto-discovery: consolidate the weaker resolver into ExecPath.ResolveClaude() and add the ~/.claude/local (migrate-installer) location both resolvers missed. - Setup wizard clarity: success/next-step copy after configuring clients. Tests: EditMode coverage for the geometry/color mapping, per-platform uv command, and the Claude override contract. Verified: compiles clean on 2021.3.45f2 (fallback path) and 6000.4.11f1 (Painter2D path).
📝 WalkthroughWalkthroughAdds a UvInstaller utility and setup-window install flow, introduces an OceanMark branding element used in editor windows, extends Claude CLI resolution with a shared fallback path, and adds matching tests and Unity metadata. ChangesUV install flow, branding, and Claude CLI resolution
Estimated code review effort: 3 (Moderate) | ~30 minutes Sequence Diagram(s)sequenceDiagram
participant User
participant MCPSetupWindow
participant UvInstaller
participant ExecPath
participant EditorApplication
User->>MCPSetupWindow: Click "Install UV Automatically"
MCPSetupWindow->>MCPSetupWindow: Confirm and disable button
MCPSetupWindow->>UvInstaller: Run() (background Task)
UvInstaller->>UvInstaller: BuildInstallCommand()
UvInstaller->>ExecPath: TryRun(file, arguments)
ExecPath-->>UvInstaller: stdout / stderr
UvInstaller-->>MCPSetupWindow: UvInstallResult
MCPSetupWindow->>EditorApplication: Subscribe PollUvInstall to update
loop Until task completes
EditorApplication->>MCPSetupWindow: update tick
MCPSetupWindow->>MCPSetupWindow: Check _uvInstallTask.IsCompleted
end
MCPSetupWindow->>MCPSetupWindow: Re-enable button, refresh dependency checks
MCPSetupWindow-->>User: Show success/PATH guidance or failure dialog
Possibly related PRs
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
- Setup wizard: de-box the title beside the logo; footer buttons size to content and sit together on one row (Refresh no longer stretches full-width and overflows); rename the deps-step "Done" button to "Next". - Client Configuration dialog: show the count + only failures + next step instead of enumerating every successfully configured client. - Main window header: version pill never shrinks/clips (flex-shrink 0); title stays at natural width. - Tabs: flex-shrink so all six stay reachable when docked narrow. - Connection status label wraps/shrinks instead of sliding under the Disconnect button (scoped to #connection-section).
There was a problem hiding this comment.
Pull request overview
This PR brings the Ocean split-cube brand mark into the Unity Editor UI (vector via UI Toolkit Painter2D on 2022.1+, raster fallback on 2021.3) and adds several setup-flow improvements around dependency installation and CLI discovery.
Changes:
- Add
OceanMarkUI Toolkit control and embed it into the main window header and setup wizard header (with 2021.3 raster fallback). - Add one-click
uvinstallation via a newUvInstallerhelper and wire it into the setup wizard UI/UX. - Consolidate Claude CLI discovery to
ExecPath.ResolveClaude()(including~/.claude/local/*) and add EditMode coverage for the new behaviors.
Reviewed changes
Copilot reviewed 14 out of 22 changed files in this pull request and generated 2 comments.
Show a summary per file
| File | Description |
|---|---|
| TestProjects/UnityMCPTests/Assets/Tests/EditMode/UvInstallerTests.cs.meta | Adds Unity meta for new EditMode test. |
| TestProjects/UnityMCPTests/Assets/Tests/EditMode/UvInstallerTests.cs | Tests platform-specific uv installer command construction and supported platforms. |
| TestProjects/UnityMCPTests/Assets/Tests/EditMode/PathResolverClaudeCliTests.cs.meta | Adds Unity meta for new EditMode test. |
| TestProjects/UnityMCPTests/Assets/Tests/EditMode/PathResolverClaudeCliTests.cs | Tests Claude CLI override contract (valid override honored; invalid override returns null without fallback). |
| TestProjects/UnityMCPTests/Assets/Tests/EditMode/OceanMarkTests.cs.meta | Adds Unity meta for new EditMode test. |
| TestProjects/UnityMCPTests/Assets/Tests/EditMode/OceanMarkTests.cs | Tests OceanMark color parsing and SVG-to-rect mapping helpers. |
| MCPForUnity/package-icon.png.meta | Adds import settings/meta for the raster fallback/package icon. |
| MCPForUnity/Editor/Windows/MCPSetupWindow.uxml | Adds a header container for logo injection and a new “Install UV Automatically” button; renames Done → Next. |
| MCPForUnity/Editor/Windows/MCPSetupWindow.uss | Styles setup header/logo and improves footer button layout/wrapping. |
| MCPForUnity/Editor/Windows/MCPSetupWindow.cs | Injects the logo, adds uv auto-install flow, and improves client configuration summary messaging. |
| MCPForUnity/Editor/Windows/MCPForUnityEditorWindow.uxml | Wraps header title into a left group for logo injection while keeping version right-aligned. |
| MCPForUnity/Editor/Windows/MCPForUnityEditorWindow.uss | Styles header-left/logo and tweaks header/version/tab toolbar layout behavior. |
| MCPForUnity/Editor/Windows/MCPForUnityEditorWindow.cs | Injects OceanMark into the main editor window header. |
| MCPForUnity/Editor/Windows/Components/Common.uss | Improves connection status row behavior at narrow widths (wrapping/shrinking). |
| MCPForUnity/Editor/Windows/Components/Branding/OceanMark.cs.meta | Adds Unity meta for new branding component. |
| MCPForUnity/Editor/Windows/Components/Branding/OceanMark.cs | Implements the vector OceanMark (Painter2D on 2022.1+) with 2021.3 raster fallback + mapping helpers. |
| MCPForUnity/Editor/Windows/Components/Branding.meta | Adds folder meta for new Branding component folder. |
| MCPForUnity/Editor/Services/PathResolverService.cs | Delegates Claude auto-discovery to ExecPath.ResolveClaude() when no override is set. |
| MCPForUnity/Editor/Helpers/ExecPath.cs | Adds ~/.claude/local/claude(.exe) candidate paths for Claude CLI resolution. |
| MCPForUnity/Editor/Dependencies/UvInstaller.cs.meta | Adds Unity meta for new dependency helper. |
| MCPForUnity/Editor/Dependencies/UvInstaller.cs | Adds a testable uv installer command builder + runner with truncated output for dialogs. |
Files not reviewed (7)
- MCPForUnity/Editor/Dependencies/UvInstaller.cs.meta: Generated file
- MCPForUnity/Editor/Windows/Components/Branding.meta: Generated file
- MCPForUnity/Editor/Windows/Components/Branding/OceanMark.cs.meta: Generated file
- MCPForUnity/package-icon.png.meta: Generated file
- TestProjects/UnityMCPTests/Assets/Tests/EditMode/OceanMarkTests.cs.meta: Generated file
- TestProjects/UnityMCPTests/Assets/Tests/EditMode/PathResolverClaudeCliTests.cs.meta: Generated file
- TestProjects/UnityMCPTests/Assets/Tests/EditMode/UvInstallerTests.cs.meta: Generated file
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| private void OnDisable() | ||
| { | ||
| EditorApplication.update -= PollUvInstall; | ||
| } |
| private void PollUvInstall() | ||
| { | ||
| if (_uvInstallTask == null || !_uvInstallTask.IsCompleted) return; | ||
|
|
||
| EditorApplication.update -= PollUvInstall; | ||
| var task = _uvInstallTask; | ||
| _uvInstallTask = null; | ||
|
|
||
| installUvButton.SetEnabled(true); | ||
| installUvButton.text = "Install UV Automatically"; | ||
|
|
There was a problem hiding this comment.
Actionable comments posted: 3
🧹 Nitpick comments (1)
MCPForUnity/Editor/Windows/MCPSetupWindow.cs (1)
96-96: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winInconsistent defensive null-checks around a guaranteed UI element.
installUvButtonis unconditionally defined in the UXML, yet it's null-checked before wiring the click handler (Line 110) and before toggling visibility (Line 319), while sibling buttons (refreshButton,doneButton) are used unconditionally right below. If the UXMLnameever drifts frominstall-uv-button, this pattern silently disables the whole install feature instead of surfacing a clear failure.Based on learnings, "prefer relying on the established testing process to catch UI initialization issues instead of adding defensive null checks for UI elements in editor windows... unless a well-tested fallback or that its initialization is guaranteed by design."
♻️ Proposed consistency fix
- if (installUvButton != null) installUvButton.clicked += OnInstallUvClicked; + installUvButton.clicked += OnInstallUvClicked;- if (installUvButton != null) - { - bool showInstall = uvMissing && UvInstaller.IsSupported && _uvInstallTask == null; - installUvButton.style.display = showInstall ? DisplayStyle.Flex : DisplayStyle.None; - } + bool showInstall = uvMissing && UvInstaller.IsSupported && _uvInstallTask == null; + installUvButton.style.display = showInstall ? DisplayStyle.Flex : DisplayStyle.None;Also applies to: 110-110, 317-324
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@MCPForUnity/Editor/Windows/MCPSetupWindow.cs` at line 96, Remove the inconsistent null-guarding around the guaranteed install UV UI element in MCPSetupWindow. In the window initialization and visibility code that uses installUvButton, follow the same pattern as refreshButton and doneButton: assume the UXML binding is correct and wire the click handler / toggle visibility directly, letting any mismatch surface during setup or tests instead of silently disabling the install flow.Source: Learnings
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@MCPForUnity/Editor/Windows/Components/Branding/OceanMark.cs`:
- Around line 26-33: The Painter2D vs. raster-fallback version branching in
OceanMark should be moved out of the constructor and call sites into a compat
shim. Extract the “does Painter2D support exist” and render-strategy selection
logic into a UnityPainter2DCompat helper under Runtime/Helpers, then have
OceanMark use that helper instead of inline UNITY_2022_1_OR_NEWER checks. Update
the related render setup paths in OceanMark so they rely on the shim for
behavior selection rather than embedding preprocessor directives directly.
- Around line 129-140: The LoadBrandTexture method is swallowing all exceptions,
which hides asset-loading failures on the 2021.3 fallback path. Update the
try/catch in LoadBrandTexture to catch the failure, log a clear error with the
exception details and the package root/path context, and then return null; keep
the behavior of returning null on failure, but make the failure visible instead
of silent.
In `@MCPForUnity/Editor/Windows/MCPSetupWindow.cs`:
- Around line 232-297: The uv install guard is only stored on the MCPSetupWindow
instance, so closing and reopening the window can start another UvInstaller.Run
while the first is still active. Move the in-flight install tracking out of the
window instance or into a shared/static guard used by OnInstallUvClicked and
PollUvInstall, and make OnDisable prevent the window from being closed or
otherwise preserve the running task state until completion.
---
Nitpick comments:
In `@MCPForUnity/Editor/Windows/MCPSetupWindow.cs`:
- Line 96: Remove the inconsistent null-guarding around the guaranteed install
UV UI element in MCPSetupWindow. In the window initialization and visibility
code that uses installUvButton, follow the same pattern as refreshButton and
doneButton: assume the UXML binding is correct and wire the click handler /
toggle visibility directly, letting any mismatch surface during setup or tests
instead of silently disabling the install flow.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: 2705c3fe-aa9f-4b70-ac3c-6e0e95c8a318
⛔ Files ignored due to path filters (1)
MCPForUnity/package-icon.pngis excluded by!**/*.png
📒 Files selected for processing (21)
MCPForUnity/Editor/Dependencies/UvInstaller.csMCPForUnity/Editor/Dependencies/UvInstaller.cs.metaMCPForUnity/Editor/Helpers/ExecPath.csMCPForUnity/Editor/Services/PathResolverService.csMCPForUnity/Editor/Windows/Components/Branding.metaMCPForUnity/Editor/Windows/Components/Branding/OceanMark.csMCPForUnity/Editor/Windows/Components/Branding/OceanMark.cs.metaMCPForUnity/Editor/Windows/Components/Common.ussMCPForUnity/Editor/Windows/MCPForUnityEditorWindow.csMCPForUnity/Editor/Windows/MCPForUnityEditorWindow.ussMCPForUnity/Editor/Windows/MCPForUnityEditorWindow.uxmlMCPForUnity/Editor/Windows/MCPSetupWindow.csMCPForUnity/Editor/Windows/MCPSetupWindow.ussMCPForUnity/Editor/Windows/MCPSetupWindow.uxmlMCPForUnity/package-icon.png.metaTestProjects/UnityMCPTests/Assets/Tests/EditMode/OceanMarkTests.csTestProjects/UnityMCPTests/Assets/Tests/EditMode/OceanMarkTests.cs.metaTestProjects/UnityMCPTests/Assets/Tests/EditMode/PathResolverClaudeCliTests.csTestProjects/UnityMCPTests/Assets/Tests/EditMode/PathResolverClaudeCliTests.cs.metaTestProjects/UnityMCPTests/Assets/Tests/EditMode/UvInstallerTests.csTestProjects/UnityMCPTests/Assets/Tests/EditMode/UvInstallerTests.cs.meta
| private void OnInstallUvClicked() | ||
| { | ||
| if (_uvInstallTask != null) return; // already running | ||
|
|
||
| bool proceed = EditorUtility.DisplayDialog( | ||
| "Install UV", | ||
| "This will download and run the official uv installer:\n\n" + | ||
| UvInstaller.DescribeCommand() + | ||
| "\n\nContinue?", | ||
| "Install", | ||
| "Cancel"); | ||
| if (!proceed) return; | ||
|
|
||
| installUvButton.SetEnabled(false); | ||
| installUvButton.text = "Installing UV…"; | ||
| statusMessage.text = "Installing uv… this can take a moment."; | ||
| statusMessage.style.color = new StyleColor(new Color(1f, 0.6f, 0f)); | ||
|
|
||
| _uvInstallTask = Task.Run(() => UvInstaller.Run()); | ||
| EditorApplication.update += PollUvInstall; | ||
| } | ||
|
|
||
| private void PollUvInstall() | ||
| { | ||
| if (_uvInstallTask == null || !_uvInstallTask.IsCompleted) return; | ||
|
|
||
| EditorApplication.update -= PollUvInstall; | ||
| var task = _uvInstallTask; | ||
| _uvInstallTask = null; | ||
|
|
||
| installUvButton.SetEnabled(true); | ||
| installUvButton.text = "Install UV Automatically"; | ||
|
|
||
| // UvInstaller.Run catches its own exceptions, so the task always completes with a result. | ||
| UvInstaller.UvInstallResult result = task.Result; | ||
|
|
||
| if (result.Success) | ||
| { | ||
| _dependencyResult = DependencyManager.CheckAllDependencies(); | ||
| UpdateUI(); | ||
| if (!_dependencyResult.IsSystemReady) | ||
| { | ||
| EditorUtility.DisplayDialog( | ||
| "Install UV", | ||
| "uv installed, but it isn't visible on PATH yet. Restart Unity (or your terminal) so it picks up the new PATH, then click Refresh.\n\n" + | ||
| result.Output, | ||
| "OK"); | ||
| } | ||
| } | ||
| else | ||
| { | ||
| // Reset the status label off the "Installing…" state before reporting the failure. | ||
| UpdateUI(); | ||
| EditorUtility.DisplayDialog( | ||
| "Install UV Failed", | ||
| "The installer did not complete successfully. You can install uv manually via \"Open UV Install Page\".\n\n" + | ||
| result.Output, | ||
| "OK"); | ||
| } | ||
| } | ||
|
|
||
| private void OnDisable() | ||
| { | ||
| EditorApplication.update -= PollUvInstall; | ||
| } | ||
|
|
There was a problem hiding this comment.
🩺 Stability & Availability | 🟠 Major | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -euo pipefail
printf '--- MCPSetupWindow.cs outline ---\n'
ast-grep outline MCPForUnity/Editor/Windows/MCPSetupWindow.cs --view expanded || true
printf '\n--- UvInstaller references ---\n'
rg -n "class UvInstaller|Run\(|DescribeCommand|UvInstallResult|SessionState|static .*install|install in progress|PollUvInstall|OnDisable|OnEnable" MCPForUnity -S
printf '\n--- MCPSetupWindow.cs relevant slice ---\n'
nl -ba MCPForUnity/Editor/Windows/MCPSetupWindow.cs | sed -n '1,360p'
printf '\n--- UvInstaller source candidates ---\n'
fd -a "UvInstaller.cs|*UvInstaller*.cs" MCPForUnityRepository: CoplayDev/unity-mcp
Length of output: 248
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo '--- MCPSetupWindow.cs outline ---'
ast-grep outline MCPForUnity/Editor/Windows/MCPSetupWindow.cs --view expanded || true
echo
echo '--- UvInstaller references ---'
rg -n "class UvInstaller|Run\(|DescribeCommand|UvInstallResult|SessionState|static .*install|install in progress|PollUvInstall|OnDisable|OnEnable" MCPForUnity -S
echo
echo '--- MCPSetupWindow.cs relevant slice ---'
nl -ba MCPForUnity/Editor/Windows/MCPSetupWindow.cs | sed -n '1,360p'
echo
echo '--- UvInstaller source candidates ---'
fd -a "UvInstaller.cs|*UvInstaller*.cs" MCPForUnityRepository: CoplayDev/unity-mcp
Length of output: 21099
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo '--- MCPSetupWindow.cs (selected ranges) ---'
sed -n '1,220p' MCPForUnity/Editor/Windows/MCPSetupWindow.cs | cat -n
echo
sed -n '220,340p' MCPForUnity/Editor/Windows/MCPSetupWindow.cs | cat -n
echo
echo '--- UvInstaller.cs ---'
sed -n '1,220p' MCPForUnity/Editor/Dependencies/UvInstaller.cs | cat -n
echo
echo '--- SetupWindowService.cs ---'
sed -n '1,120p' MCPForUnity/Editor/Setup/SetupWindowService.cs | cat -nRepository: CoplayDev/unity-mcp
Length of output: 25231
Prevent duplicate uv installs across window reopen. _uvInstallTask is scoped to the current EditorWindow, so closing the window drops the guard while the installer keeps running. Reopening the setup window can start a second UvInstaller.Run() against the same target. Track the in-flight install outside the window instance, or block closing until it finishes.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@MCPForUnity/Editor/Windows/MCPSetupWindow.cs` around lines 232 - 297, The uv
install guard is only stored on the MCPSetupWindow instance, so closing and
reopening the window can start another UvInstaller.Run while the first is still
active. Move the in-flight install tracking out of the window instance or into a
shared/static guard used by OnInstallUvClicked and PollUvInstall, and make
OnDisable prevent the window from being closed or otherwise preserve the running
task state until completion.
…ilure Addresses AI review (Copilot + CodeRabbit) on CoplayDev#1231: - PollUvInstall: bail out (and detach) if the window/UI was torn down while the task ran, guarding against dereferencing UI fields after teardown. - OnEnable: resume polling if an install was still in flight when the window was disabled, so completion is still processed (button reset, deps re-checked). - OceanMark.LoadBrandTexture: log a warning instead of silently swallowing asset-load failures on the 2021.3 raster-fallback path. Declined CodeRabbit's "use a compat shim" suggestion for OceanMark's #if UNITY_2022_1_OR_NEWER: per UnityCompatShims.cs policy, shims are for [Obsolete] APIs, 3+ gated call sites, or announced removals — Painter2D is a new API used via static dispatch in one self-contained file, which the policy explicitly says to handle with #if, not a shim.
|
AI review addressed in c46d86d:
Note: the fallback-logging change is in the |
…o the #if - Remove OceanMarkTests (geometry/color mapping + construction) per request; the mark is verified visually in-Editor. - With the test gone, MapSvgPoint/FromHex no longer need to be `internal`, and they (plus the SvgOrigin/SvgSize consts) are only used by the Painter2D path — move them inside `#if UNITY_2022_1_OR_NEWER` and make them `private`, so the 2021.3 fallback carries no unused members. Result of a /simplify pass; reuse/altitude/efficiency angles came back clean (logo-injection duplication left at 2 call sites per the repo's 3+-uses rule).
|
@coderabbitai full review |
✅ Action performedFull review finished. |
There was a problem hiding this comment.
🧹 Nitpick comments (1)
MCPForUnity/Editor/Windows/MCPSetupWindow.cs (1)
110-110: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low valueInconsistent defensive null check on
installUvButton.
install-uv-buttonis unconditionally present in the uxml (added in this same PR), so this null check is inconsistent with how sibling buttons (refreshButton,doneButton, etc.) are wired without guards.Based on learnings, prefer relying on the established testing process to catch UI initialization issues instead of adding defensive null checks for UI elements in editor windows, ensuring initialization is guaranteed by design rather than sprinkling null checks.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@MCPForUnity/Editor/Windows/MCPSetupWindow.cs` at line 110, Remove the defensive null guard around installUvButton in MCPSetupWindow; the UI element is guaranteed by the UXML, and sibling controls like refreshButton and doneButton are wired directly. Update the initialization in the window setup code to match the existing pattern by attaching OnInstallUvClicked without a null check, relying on the established UI initialization/testing flow instead of adding per-element guards.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Nitpick comments:
In `@MCPForUnity/Editor/Windows/MCPSetupWindow.cs`:
- Line 110: Remove the defensive null guard around installUvButton in
MCPSetupWindow; the UI element is guaranteed by the UXML, and sibling controls
like refreshButton and doneButton are wired directly. Update the initialization
in the window setup code to match the existing pattern by attaching
OnInstallUvClicked without a null check, relying on the established UI
initialization/testing flow instead of adding per-element guards.
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: b90592ab-fb2a-4690-b915-79ecd87f0d1a
⛔ Files ignored due to path filters (1)
MCPForUnity/package-icon.pngis excluded by!**/*.png
📒 Files selected for processing (19)
MCPForUnity/Editor/Dependencies/UvInstaller.csMCPForUnity/Editor/Dependencies/UvInstaller.cs.metaMCPForUnity/Editor/Helpers/ExecPath.csMCPForUnity/Editor/Services/PathResolverService.csMCPForUnity/Editor/Windows/Components/Branding.metaMCPForUnity/Editor/Windows/Components/Branding/OceanMark.csMCPForUnity/Editor/Windows/Components/Branding/OceanMark.cs.metaMCPForUnity/Editor/Windows/Components/Common.ussMCPForUnity/Editor/Windows/MCPForUnityEditorWindow.csMCPForUnity/Editor/Windows/MCPForUnityEditorWindow.ussMCPForUnity/Editor/Windows/MCPForUnityEditorWindow.uxmlMCPForUnity/Editor/Windows/MCPSetupWindow.csMCPForUnity/Editor/Windows/MCPSetupWindow.ussMCPForUnity/Editor/Windows/MCPSetupWindow.uxmlMCPForUnity/package-icon.png.metaTestProjects/UnityMCPTests/Assets/Tests/EditMode/PathResolverClaudeCliTests.csTestProjects/UnityMCPTests/Assets/Tests/EditMode/PathResolverClaudeCliTests.cs.metaTestProjects/UnityMCPTests/Assets/Tests/EditMode/UvInstallerTests.csTestProjects/UnityMCPTests/Assets/Tests/EditMode/UvInstallerTests.cs.meta
What
Brings the Ocean split-cube brand mark into the Editor UI (it previously lived only in the website/README) and lands three low-risk installation-flow improvements.
Logo
OceanMark— a reusable UI Toolkit control that draws the mark in Painter2D vector (geometry transcribed directly fromwebsite/static/img/logo-mark.svg, brand colors baked in). Crisp at any DPI, theme-independent, no new package dependency.Painter2Dis Unity 2022.1+ only. The drawing is guarded by#if UNITY_2022_1_OR_NEWER; on the 2021.3 floor the control falls back to the rasterpackage-icon.png. Vector on modern editors, still-branded on the floor.#header-leftgroup so the version pill stays right-aligned) and the setup-wizard header.package-icon.pngnow ships inside the package (canonical listing/Asset-Store icon + doubles as the 2021.3 fallback). Note: Unity's in-editor Package Manager can't render custom icons for git packages, so this is for listings/fallback, not the PM tile.Installation polish
UvInstallerbuilds the official installer command per platform (astral.sh/uv/install.sh|install.ps1); the setup wizard runs it off the main thread behind a confirm dialog, then re-checks dependencies. Manual "Open UV Install Page" link stays as fallback.PathResolverService.GetClaudeCliPath()into the fullerExecPath.ResolveClaude()(−~50 lines), and added~/.claude/local/claude(theclaude migrate-installerlocation both resolvers missed).IsClaudeCliDetected()now gets NVM + PATH-scan for free, on all platforms.Tests
EditMode coverage added: geometry/color mapping (
OceanMarkTests), per-platform uv command construction (UvInstallerTests), and the Claude override contract (PathResolverClaudeCliTests).Verification
error CSNot covered here
Summary by CodeRabbit