-
Notifications
You must be signed in to change notification settings - Fork 461
feat: Unity Asset Store compliance implementation with post-installation dependency setup #280
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
- Clean up menu items for production (hide dev/test items behind compile flag) - Integrate MCP client configuration into setup wizard as new step - Complete end-to-end setup experience with 6-step wizard - Enhanced client detection and auto-configuration - Production-ready menu structure with essential items only - Users are left 100% ready to use MCP after completing setup
- Updated IMPLEMENTATION_SUMMARY.md to reflect menu cleanup and client configuration integration - Enhanced PR_DESCRIPTION.md with complete refinement details - Documented production-ready menu structure and 6-step setup wizard - Added comprehensive user experience improvements and Asset Store readiness details
WalkthroughReorients editor tooling for Asset Store readiness: restructures menus with development-only items, elevates a guided Setup Wizard by adding a new Client Configuration step and automation, adjusts menu priorities, adds a new editor window entry point, and updates/adds Unity .meta assets and documentation to reflect the production-focused workflow. Changes
Sequence Diagram(s)sequenceDiagram
autonumber
actor U as User
participant M as Unity Menu
participant SW as SetupWizardWindow
participant DC as DependencyChecker
participant INST as Installer
participant CD as ClientDetector
participant CFG as ClientConfigurator
participant CC as Claude Code
participant FS as FileSystem
rect rgb(240,245,255)
note over U,M: Launch
U->>M: Window/MCP for Unity (Check Dependencies)
M->>SW: Open wizard
end
rect rgb(245,255,240)
note over SW,DC: Dependency check
SW->>DC: Validate prerequisites
DC-->>SW: Status (ok/missing)
alt Missing
SW->>INST: Install guidance / run installers
INST-->>SW: Progress updates
end
end
rect rgb(255,250,240)
note over SW,CD: Client detection
SW->>CD: Enumerate available clients
CD-->>SW: Detected list + installed flags
SW->>CFG: Check configuration status
CFG-->>SW: Per-client config status
end
rect rgb(255,245,245)
note over SW,CFG: Configuration actions
alt Auto-config all
SW->>CFG: Configure all clients
CFG->>FS: Read/write config JSON
CFG->>CC: Register/Unregister as needed
CC-->>CFG: Result
FS-->>CFG: Write result
CFG-->>SW: Summary
else Manual per-client
U->>SW: Configure/Repair selected
SW->>CFG: Execute chosen action
CFG-->>SW: Result
end
end
rect rgb(240,255,250)
note over SW,U: Completion
SW-->>U: Summary (dependencies ready, clients configured)
end
Estimated code review effort🎯 4 (Complex) | ⏱️ ~60 minutes Possibly related PRs
Suggested reviewers
Poem
Pre-merge checks and finishing touches❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
✨ Finishing touches
🧪 Generate unit tests
Tip 👮 Agentic pre-merge checks are now available in preview!Pro plan users can now enable pre-merge checks in their settings to enforce checklists before merging PRs.
Please see the documentation for more information. Example: reviews:
pre_merge_checks:
custom_checks:
- name: "Undocumented Breaking Changes"
mode: "warning"
instructions: |
Pass/fail criteria: All breaking changes to public APIs, CLI flags, environment variables, configuration keys, database schemas, or HTTP/GraphQL endpoints must be documented in the "Breaking Change" section of the PR description and in CHANGELOG.md. Exclude purely internal or private changes (e.g., code not exported from package entry points or explicitly marked as internal). Please share your feedback with us on this Discord post. 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 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 5
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
ava-worktrees/feature/ava-asset-store-compliance/UnityMcpBridge/Editor/Windows/MCPForUnityEditorWindow.cs (1)
981-1038
: Fix mismatched GUILayout Begin/End pairs in Claude section (causes GUI exceptions).The ClaudeCode branch opens/closes horizontal groups inconsistently, double-ending the outer group. This can throw “EndLayoutGroup: BeginLayoutGroup must be called first” and break the UI.
Proposed minimal fix: don’t close the outer action row inside the Claude branch; wrap sub-rows in their own groups.
- if (GUILayout.Button(buttonText, GUILayout.Height(32))) + if (GUILayout.Button(buttonText, GUILayout.Height(32))) { if (isConfigured) { UnregisterWithClaudeCode(); } else { string pythonDir = FindPackagePythonDirectory(); RegisterWithClaudeCode(pythonDir); } } - // Hide the picker once a valid binary is available - EditorGUILayout.EndHorizontal(); - EditorGUILayout.BeginHorizontal(); + // Extra info row under the same action section + EditorGUILayout.EndHorizontal(); // close inner 'actions' row + EditorGUILayout.BeginHorizontal(); // start row for CLI path label GUIStyle pathLabelStyle = new GUIStyle(EditorStyles.miniLabel) { wordWrap = true }; string resolvedClaude = ExecPath.ResolveClaude(); EditorGUILayout.LabelField($"Claude CLI: {resolvedClaude}", pathLabelStyle); - EditorGUILayout.EndHorizontal(); - EditorGUILayout.BeginHorizontal(); + EditorGUILayout.EndHorizontal(); + EditorGUILayout.BeginHorizontal(); // resume actions row scope if needed } - // CLI picker row (only when not found) - EditorGUILayout.EndHorizontal(); - EditorGUILayout.BeginHorizontal(); + // CLI picker row (only when not found) if (!claudeAvailable) { // Only show the picker button in not-found state (no redundant "not found" label) if (GUILayout.Button("Choose Claude Install Location", GUILayout.Width(260), GUILayout.Height(22))) { string suggested = RuntimeInformation.IsOSPlatform(OSPlatform.OSX) ? "/opt/homebrew/bin" : Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles); string picked = EditorUtility.OpenFilePanel("Select 'claude' CLI", suggested, ""); if (!string.IsNullOrEmpty(picked)) { ExecPath.SetClaudeCliPath(picked); // Auto-register after setting a valid path string pythonDir = FindPackagePythonDirectory(); RegisterWithClaudeCode(pythonDir); Repaint(); } } } - EditorGUILayout.EndHorizontal(); - EditorGUILayout.BeginHorizontal(); + // do not prematurely end the outer action row hereIf preferred, we can simplify by keeping a single BeginHorizontal() at 979 and using vertical groups for sub-rows.
🧹 Nitpick comments (9)
ava-worktrees/feature/ava-asset-store-compliance/PR_DESCRIPTION.md (1)
30-31
: Clarify “automatic installation” to align with Asset Store rules.Docs elsewhere state “no automatic downloads.” Rephrase to avoid implying unattended downloads.
Apply this diff:
-- ✅ **Installation Guidance**: Platform-specific instructions and automatic installation +- ✅ **Installation Guidance**: Platform-specific instructions with assisted installation (explicit user consent, no automatic downloads)ava-worktrees/feature/ava-asset-store-compliance/IMPLEMENTATION_SUMMARY.md (4)
18-24
: Add a fenced code language to satisfy markdownlint (MD040).Specify a language for the menu tree block.
Apply this diff:
-``` +```text Window/MCP for Unity/ ├── Setup Wizard (priority 1) ├── Check Dependencies (priority 2) └── MCP Client Configuration (priority 3)--- `26-33`: **Add a fenced code language to satisfy markdownlint (MD040).** Same fix for the development menu tree. Apply this diff: ```diff -``` +```text Window/MCP for Unity/Development/ ├── Reset Setup (priority 10) ├── Run Dependency Tests (priority 100) ├── Test Setup Wizard (priority 101) └── Reset Setup State (Test) (priority 102)
--- `158-163`: **Fix step-count inconsistency (5 vs 6).** Earlier you define a 6-step flow; this section still says 5. Apply this diff: ```diff -**Progressive disclosure**: 5-step guided process +**Progressive disclosure**: 6-step guided process
89-106
: Heading numbering drifts (duplicate “3.” and “4.”).Consider removing manual numbers or making them consistent to avoid future drift.
ava-worktrees/feature/ava-asset-store-compliance/UnityMcpBridge/Editor/Windows/MCPForUnityEditorWindow.cs (1)
769-810
: Avoid blocking network I/O on the editor UI thread in VerifyBridgePing.Connect/reads can block up to 2s + 30s, freezing the Editor. Run this on a background thread or shorten timeouts and poll via EditorApplication.update.
ava-worktrees/feature/ava-asset-store-compliance/UnityMcpBridge/Editor/Setup/SetupWizard.cs (1)
17-18
: Derive PACKAGE_VERSION at runtime to avoid drift.Hardcoding risks mismatch with package.json. Recommend using PackageInfo.
- private const string PACKAGE_VERSION = "3.4.0"; // Should match package.json version + private static readonly string PACKAGE_VERSION = + UnityEditor.PackageManager.PackageInfo.FindForAssembly(typeof(SetupWizard).Assembly)?.version + ?? "0.0.0";ava-worktrees/feature/ava-asset-store-compliance/UnityMcpBridge/Editor/Setup/SetupWizardWindow.cs (2)
1048-1089
: Write client config atomically to avoid corruption.Use the atomic temp+replace pattern you already use in the main window to prevent partial writes.
- string json = updatedConfig.ToString(Newtonsoft.Json.Formatting.Indented); - System.IO.File.WriteAllText(configPath, json); + string json = updatedConfig.ToString(Newtonsoft.Json.Formatting.Indented); + var tmp = configPath + ".tmp"; + var backup = configPath + ".backup"; + bool replaced = false; + System.IO.File.WriteAllText(tmp, json, new System.Text.UTF8Encoding(false)); + try + { + System.IO.File.Replace(tmp, configPath, backup); + replaced = true; + } + catch (System.IO.FileNotFoundException) + { + System.IO.File.Move(tmp, configPath); + replaced = true; + } + catch (System.PlatformNotSupportedException) + { + if (System.IO.File.Exists(configPath)) + { + try { if (System.IO.File.Exists(backup)) System.IO.File.Delete(backup); } catch { } + System.IO.File.Move(configPath, backup); + } + System.IO.File.Move(tmp, configPath); + replaced = true; + } + finally + { + try { if (System.IO.File.Exists(tmp)) System.IO.File.Delete(tmp); } catch { } + try { if (replaced && System.IO.File.Exists(backup)) System.IO.File.Delete(backup); } catch { } + }
753-776
: Consider deeper validation of “configured” for standard clients.String contains check may false-positive. Parsing JSON and verifying command/args match expected uv/--directory would be more accurate (you already have WriteToConfig/ExtractDirectoryArg patterns to reuse).
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (17)
ava-worktrees/feature/ava-asset-store-compliance/IMPLEMENTATION_SUMMARY.md
(4 hunks)ava-worktrees/feature/ava-asset-store-compliance/PR_DESCRIPTION.md
(1 hunks)ava-worktrees/feature/ava-asset-store-compliance/UnityMcpBridge/Editor/Dependencies.meta
(1 hunks)ava-worktrees/feature/ava-asset-store-compliance/UnityMcpBridge/Editor/Dependencies/DependencyManagerTests.cs
(4 hunks)ava-worktrees/feature/ava-asset-store-compliance/UnityMcpBridge/Editor/Dependencies/Validators.meta
(1 hunks)ava-worktrees/feature/ava-asset-store-compliance/UnityMcpBridge/Editor/Helpers/PortManager.cs.meta
(1 hunks)ava-worktrees/feature/ava-asset-store-compliance/UnityMcpBridge/Editor/Installation/Downloaders.meta
(1 hunks)ava-worktrees/feature/ava-asset-store-compliance/UnityMcpBridge/Editor/Installation/Installers.meta
(1 hunks)ava-worktrees/feature/ava-asset-store-compliance/UnityMcpBridge/Editor/Setup/SetupWizard.cs
(2 hunks)ava-worktrees/feature/ava-asset-store-compliance/UnityMcpBridge/Editor/Setup/SetupWizardWindow.cs
(10 hunks)ava-worktrees/feature/ava-asset-store-compliance/UnityMcpBridge/Editor/Setup/Steps.meta
(1 hunks)ava-worktrees/feature/ava-asset-store-compliance/UnityMcpBridge/Editor/Setup/UI.meta
(1 hunks)ava-worktrees/feature/ava-asset-store-compliance/UnityMcpBridge/Editor/SetupWizard.meta
(1 hunks)ava-worktrees/feature/ava-asset-store-compliance/UnityMcpBridge/Editor/SetupWizard/Components.meta
(1 hunks)ava-worktrees/feature/ava-asset-store-compliance/UnityMcpBridge/Editor/SetupWizard/Pages.meta
(1 hunks)ava-worktrees/feature/ava-asset-store-compliance/UnityMcpBridge/Editor/SetupWizard/UI.meta
(1 hunks)ava-worktrees/feature/ava-asset-store-compliance/UnityMcpBridge/Editor/Windows/MCPForUnityEditorWindow.cs
(1 hunks)
🧰 Additional context used
🧠 Learnings (1)
📚 Learning: 2025-09-03T16:00:55.839Z
Learnt from: dsarno
PR: CoplayDev/unity-mcp#0
File: :0-0
Timestamp: 2025-09-03T16:00:55.839Z
Learning: ComponentResolver in UnityMcpBridge/Editor/Tools/ManageGameObject.cs is a nested static class within ManageGameObject, not a sibling type. The `using static MCPForUnity.Editor.Tools.ManageGameObject;` import is required to access ComponentResolver methods directly without the outer class qualifier.
Applied to files:
ava-worktrees/feature/ava-asset-store-compliance/UnityMcpBridge/Editor/Setup/SetupWizardWindow.cs
🧬 Code graph analysis (2)
ava-worktrees/feature/ava-asset-store-compliance/UnityMcpBridge/Editor/Windows/MCPForUnityEditorWindow.cs (2)
ava-worktrees/feature/ava-asset-store-compliance/UnityMcpBridge/Editor/Setup/SetupWizard.cs (3)
MenuItem
(226-230)MenuItem
(235-265)MenuItem
(271-277)ava-worktrees/feature/ava-asset-store-compliance/UnityMcpBridge/Editor/Setup/SetupWizardWindow.cs (1)
ShowWindow
(43-50)
ava-worktrees/feature/ava-asset-store-compliance/UnityMcpBridge/Editor/Setup/SetupWizard.cs (1)
ava-worktrees/feature/ava-asset-store-compliance/UnityMcpBridge/Editor/Windows/MCPForUnityEditorWindow.cs (2)
MenuItem
(48-52)MenuItem
(57-63)
🪛 markdownlint-cli2 (0.18.1)
ava-worktrees/feature/ava-asset-store-compliance/IMPLEMENTATION_SUMMARY.md
18-18: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
26-26: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
🔇 Additional comments (13)
ava-worktrees/feature/ava-asset-store-compliance/UnityMcpBridge/Editor/Dependencies/Validators.meta (1)
1-9
: LGTM — Validators.meta present but verification incompleteValidators.meta found and contains "folderAsset: yes". Verification aborted with "/bin/bash: -c: line 20: conditional binary operator expected"; duplicate-GUID and missing-directory .meta checks did not complete. Re-run the supplied verification script locally or in CI and confirm no duplicate GUIDs and that every directory under Editor/Dependencies has a corresponding .meta.
ava-worktrees/feature/ava-asset-store-compliance/UnityMcpBridge/Editor/Helpers/PortManager.cs.meta (1)
2-2
: GUID rotated: confirm intent and check for duplicates/referencesChanging a C# script’s .meta GUID can orphan serialized references; lower risk for Editor-only scripts — verify uniqueness and that no YAML/assets reference the old GUID.
File: ava-worktrees/feature/ava-asset-store-compliance/UnityMcpBridge/Editor/Helpers/PortManager.cs.meta (guid: 709729fd1199d31f48987241ead826ba)
Automated check here was inconclusive (ripgrep skipped files). Run a repo-wide search for this GUID and for serialized missing-script markers (e.g., "m_Script: {fileID: 0}"); if any matches are found, update references or restore the original GUID.
ava-worktrees/feature/ava-asset-store-compliance/UnityMcpBridge/Editor/SetupWizard.meta (1)
1-8
: LGTM for Unity folder .meta.Standard fields; no issues spotted.
ava-worktrees/feature/ava-asset-store-compliance/UnityMcpBridge/Editor/SetupWizard/UI.meta (1)
1-8
: LGTM for Unity folder .meta.No changes needed.
ava-worktrees/feature/ava-asset-store-compliance/UnityMcpBridge/Editor/SetupWizard/Pages.meta (1)
1-8
: LGTM for Unity folder .meta.Looks correct.
ava-worktrees/feature/ava-asset-store-compliance/UnityMcpBridge/Editor/SetupWizard/Components.meta (1)
1-8
: LGTM for Unity folder .meta.All standard.
ava-worktrees/feature/ava-asset-store-compliance/UnityMcpBridge/Editor/Setup/UI.meta (1)
1-8
: LGTM for Unity folder .meta.Good to go.
ava-worktrees/feature/ava-asset-store-compliance/UnityMcpBridge/Editor/Dependencies.meta (1)
2-2
: LGTM – meta GUID change only.Folder meta GUID update looks fine and low risk.
ava-worktrees/feature/ava-asset-store-compliance/UnityMcpBridge/Editor/Windows/MCPForUnityEditorWindow.cs (2)
48-52
: Good: main window menu with explicit priority.MenuItem priority aligns with Setup Wizard ordering. No issues.
54-63
: Good: dedicated Client Configuration entry point.Shows and focuses the existing window; consistent with the setup flow.
ava-worktrees/feature/ava-asset-store-compliance/UnityMcpBridge/Editor/Dependencies/DependencyManagerTests.cs (1)
17-19
: Good: development-only gating for test menus.Menu items are hidden unless MCP_DEVELOPMENT_MODE is defined. Ensure CI and release builds don’t define this symbol.
ava-worktrees/feature/ava-asset-store-compliance/UnityMcpBridge/Editor/Setup/SetupWizard.cs (1)
267-278
: Good: dev-only Reset Setup menu.The reset entry is properly hidden behind MCP_DEVELOPMENT_MODE.
ava-worktrees/feature/ava-asset-store-compliance/UnityMcpBridge/Editor/Setup/SetupWizardWindow.cs (1)
63-66
: Good: initializes client detection on enable.Sets up _mcpClients and populates available clients.
fileFormatVersion: 2 | ||
guid: 65e824e2fd7ec1738ae3cd8278cb4df0 | ||
folderAsset: yes | ||
DefaultImporter: | ||
externalObjects: {} | ||
userData: | ||
assetBundleName: | ||
assetBundleVariant: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🧩 Analysis chain
LGTM: valid folder .meta
Fields look correct for a folder asset (.meta): fileFormatVersion 2, unique GUID, folderAsset: yes, and empty DefaultImporter fields.
Run this to verify GUID uniqueness and that the corresponding folder exists:
🏁 Script executed:
#!/bin/bash
set -euo pipefail
META_FILE="ava-worktrees/feature/ava-asset-store-compliance/UnityMcpBridge/Editor/Installation/Downloaders.meta"
FOLDER_PATH="ava-worktrees/feature/ava-asset-store-compliance/UnityMcpBridge/Editor/Installation/Downloaders"
# 1) Ensure the folder exists
if [[ -d "$FOLDER_PATH" ]]; then
echo "OK: Folder exists: $FOLDER_PATH"
else
echo "ERROR: Folder missing: $FOLDER_PATH"
exit 1
fi
# 2) Ensure the .meta marks a folder
if rg -nP '^folderAsset:\s*yes\b' "$META_FILE" > /dev/null; then
echo "OK: .meta is marked as folderAsset: yes"
else
echo "ERROR: .meta does not indicate folder asset"
exit 1
fi
# 3) Check duplicate GUIDs across .meta files
echo "Scanning for duplicate GUIDs..."
rg -nP '^guid:\s*[0-9a-f]{32}\b' --glob '**/*.meta' | tee /tmp/all_meta_guid_lines.txt >/dev/null
awk -F: '
{
match($0, /guid:\s*([0-9a-f]{32})/, m);
if (m[1] != "") { count[m[1]]++; lines[m[1]] = lines[m[1]] $0 "\n" }
}
END {
dup=0
for (g in count) {
if (count[g] > 1) {
dup=1
printf("DUP GUID %s in:\n%s\n", g, lines[g])
}
}
exit dup
}
' /tmp/all_meta_guid_lines.txt && echo "OK: No duplicate GUIDs found."
Length of output: 118
Fix missing folder referenced by Downloaders.meta
ava-worktrees/feature/ava-asset-store-compliance/UnityMcpBridge/Editor/Installation/Downloaders.meta is marked folderAsset: yes but the folder ava-worktrees/feature/ava-asset-store-compliance/UnityMcpBridge/Editor/Installation/Downloaders is missing — add the folder or remove/update the .meta (then re-run the GUID-duplication scan).
🤖 Prompt for AI Agents
In
ava-worktrees/feature/ava-asset-store-compliance/UnityMcpBridge/Editor/Installation/Downloaders.meta
(lines 1-8) the meta file is marked "folderAsset: yes" but the corresponding
folder "UnityMcpBridge/Editor/Installation/Downloaders" is missing; either
create that exact folder path in the repo so the .meta points to a real folder
(ensure the GUID remains unique and matches any intended assets), or
remove/update the .meta (or change folderAsset to no and delete the meta) and
then re-run the GUID-duplication scan to ensure no GUID conflicts remain.
fileFormatVersion: 2 | ||
guid: 513bed53e688c25ed91cecc27c074568 | ||
folderAsset: yes | ||
DefaultImporter: | ||
externalObjects: {} | ||
userData: | ||
assetBundleName: | ||
assetBundleVariant: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🧩 Analysis chain
Unity folder .meta looks correct; verify GUID uniqueness and folder presence
Standard folder meta (fileFormatVersion: 2, folderAsset: yes, empty DefaultImporter) is good. Please verify GUID uniqueness across the repo and that the corresponding Installers/ folder exists.
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "1) Check for duplicate GUIDs in .meta files"
# Prints any GUIDs that appear more than once
rg -nP '^guid:\s*\K[0-9a-f]{32}$' -o --glob '!**/Library/**' --glob '!**/obj/**' --glob '!**/Temp/**' --glob '!**/Logs/**' \
| sort | uniq -c | awk '$1>1{print "DUPLICATE GUID:", $0}' || true
echo
echo "2) Verify this meta corresponds to a folder that exists"
target_meta='ava-worktrees/feature/ava-asset-store-compliance/UnityMcpBridge/Editor/Installation/Installers.meta'
if [ -f "$target_meta" ] && rg -qN '^folderAsset:\s*yes\b' "$target_meta"; then
target_dir="${target_meta%.meta}"
if [ -d "$target_dir" ]; then
echo "OK: Folder exists -> $target_dir"
else
echo "MISSING FOLDER: $target_dir"
exit 1
fi
else
echo "Meta not found or not marked as folderAsset: $target_meta"
exit 1
fi
echo
echo "3) Sanity check all folder meta files have matching directories"
while IFS= read -r f; do
d="${f%.meta}"
[ -d "$d" ] || echo "MISSING DIR for folder meta: $f -> $d"
done < <(rg -nPl '^folderAsset:\s*yes\b' --glob '*.meta' --glob '!**/Library/**' --glob '!**/Temp/**')
Length of output: 360
Installers folder missing — add folder or remove/update Installers.meta
- Found: ava-worktrees/feature/ava-asset-store-compliance/UnityMcpBridge/Editor/Installation/Installers.meta
Missing directory: ava-worktrees/feature/ava-asset-store-compliance/UnityMcpBridge/Editor/Installation/Installers — restore the folder or remove/update the .meta to avoid Unity issues. - GUID check incomplete: rg skipped files; verify GUID 513bed53e688c25ed91cecc27c074568 is unique across all .meta files (search all .meta for that value).
🤖 Prompt for AI Agents
In
ava-worktrees/feature/ava-asset-store-compliance/UnityMcpBridge/Editor/Installation/Installers.meta
lines 1-8, the .meta references a folder ("folderAsset: yes") but the
corresponding Installers directory is missing; either restore the Installers
folder at UnityMcpBridge/Editor/Installation/Installers so Unity can use this
.meta (keep the GUID as-is), or delete/update this .meta to remove the
folderAsset entry and any folder-specific importer settings if you intentionally
removed the folder. Also verify GUID 513bed53e688c25ed91cecc27c074568 is unique
by searching all .meta files; if a duplicate exists, assign a new GUID (and
update or recreate the folder/.meta consistently) so Unity GUIDs remain unique.
if (_currentStep == 2 && !_dependencyResult.IsSystemReady) | ||
{ | ||
// Skip installation progress if dependencies are ready | ||
_currentStep = 4; // Go directly to client configuration | ||
RefreshAvailableClients(); | ||
} | ||
else if (_currentStep == 3 && !_isInstalling) | ||
{ | ||
// Move from installation progress to client configuration | ||
_currentStep = 4; | ||
RefreshAvailableClients(); | ||
} | ||
else | ||
{ | ||
_currentStep++; | ||
|
||
// Refresh clients when entering client configuration step | ||
if (_currentStep == 4) | ||
{ | ||
RefreshAvailableClients(); | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Fix step navigation logic from Installation Options.
Condition/comment mismatch: it jumps to Client Configuration when dependencies are NOT ready. Should go to Client Configuration only if ready; otherwise to Installation Progress.
- if (_currentStep == 2 && !_dependencyResult.IsSystemReady)
- {
- // Skip installation progress if dependencies are ready
- _currentStep = 4; // Go directly to client configuration
- RefreshAvailableClients();
- }
+ if (_currentStep == 2)
+ {
+ if (_dependencyResult.IsSystemReady)
+ {
+ // Skip installation progress when already ready
+ _currentStep = 4; // Client configuration
+ RefreshAvailableClients();
+ }
+ else
+ {
+ _currentStep = 3; // Installation progress
+ }
+ }
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
if (_currentStep == 2 && !_dependencyResult.IsSystemReady) | |
{ | |
// Skip installation progress if dependencies are ready | |
_currentStep = 4; // Go directly to client configuration | |
RefreshAvailableClients(); | |
} | |
else if (_currentStep == 3 && !_isInstalling) | |
{ | |
// Move from installation progress to client configuration | |
_currentStep = 4; | |
RefreshAvailableClients(); | |
} | |
else | |
{ | |
_currentStep++; | |
// Refresh clients when entering client configuration step | |
if (_currentStep == 4) | |
{ | |
RefreshAvailableClients(); | |
} | |
} | |
if (_currentStep == 2) | |
{ | |
if (_dependencyResult.IsSystemReady) | |
{ | |
// Skip installation progress when already ready | |
_currentStep = 4; // Client configuration | |
RefreshAvailableClients(); | |
} | |
else | |
{ | |
_currentStep = 3; // Installation progress | |
} | |
} | |
else if (_currentStep == 3 && !_isInstalling) | |
{ | |
// Move from installation progress to client configuration | |
_currentStep = 4; | |
RefreshAvailableClients(); | |
} | |
else | |
{ | |
_currentStep++; | |
// Refresh clients when entering client configuration step | |
if (_currentStep == 4) | |
{ | |
RefreshAvailableClients(); | |
} | |
} |
🤖 Prompt for AI Agents
In UnityMcpBridge/Editor/Setup/SetupWizardWindow.cs around lines 541 to 562, the
logic incorrectly jumps to Client Configuration when
_dependencyResult.IsSystemReady is false; invert the condition so that if
_currentStep == 2 and _dependencyResult.IsSystemReady is true then set
_currentStep = 4 and RefreshAvailableClients(), otherwise set _currentStep = 3
(or proceed to the Installation Progress step) so that missing dependencies lead
to installation progress; also update the comment to reflect that we skip
installation progress only when dependencies are ready.
private bool IsClientInstalled(McpClient client) | ||
{ | ||
try | ||
{ | ||
// For most clients, check if their config directory exists or if they have known installation paths | ||
switch (client.mcpType) | ||
{ | ||
case McpTypes.ClaudeCode: | ||
// Check if Claude CLI is available | ||
return !string.IsNullOrEmpty(ExecPath.ResolveClaude()); | ||
|
||
case McpTypes.Cursor: | ||
// Check if Cursor config directory exists | ||
var cursorConfigDir = System.IO.Path.GetDirectoryName(client.windowsConfigPath); | ||
return System.IO.Directory.Exists(cursorConfigDir); | ||
|
||
case McpTypes.VSCode: | ||
// Check if VSCode config directory exists | ||
var vscodeConfigDir = System.IO.Path.GetDirectoryName(client.windowsConfigPath); | ||
return System.IO.Directory.Exists(vscodeConfigDir); | ||
|
||
case McpTypes.ClaudeDesktop: | ||
// Check if Claude Desktop config directory exists | ||
var claudeConfigDir = System.IO.Path.GetDirectoryName(client.windowsConfigPath); | ||
return System.IO.Directory.Exists(claudeConfigDir); | ||
|
||
default: | ||
// For other clients, assume they might be available | ||
return true; | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Use OS-specific config paths when detecting installed clients.
Current checks always use windowsConfigPath, breaking detection on macOS/Linux.
- case McpTypes.Cursor:
- // Check if Cursor config directory exists
- var cursorConfigDir = System.IO.Path.GetDirectoryName(client.windowsConfigPath);
- return System.IO.Directory.Exists(cursorConfigDir);
+ case McpTypes.Cursor:
+ // Check if Cursor config directory exists (OS-specific)
+ {
+ var dir = System.IO.Path.GetDirectoryName(GetClientConfigPath(client));
+ return !string.IsNullOrEmpty(dir) && System.IO.Directory.Exists(dir);
+ }
...
- case McpTypes.VSCode:
- // Check if VSCode config directory exists
- var vscodeConfigDir = System.IO.Path.GetDirectoryName(client.windowsConfigPath);
- return System.IO.Directory.Exists(vscodeConfigDir);
+ case McpTypes.VSCode:
+ {
+ var dir = System.IO.Path.GetDirectoryName(GetClientConfigPath(client));
+ return !string.IsNullOrEmpty(dir) && System.IO.Directory.Exists(dir);
+ }
...
- case McpTypes.ClaudeDesktop:
- // Check if Claude Desktop config directory exists
- var claudeConfigDir = System.IO.Path.GetDirectoryName(client.windowsConfigPath);
- return System.IO.Directory.Exists(claudeConfigDir);
+ case McpTypes.ClaudeDesktop:
+ {
+ var dir = System.IO.Path.GetDirectoryName(GetClientConfigPath(client));
+ return !string.IsNullOrEmpty(dir) && System.IO.Directory.Exists(dir);
+ }
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
private bool IsClientInstalled(McpClient client) | |
{ | |
try | |
{ | |
// For most clients, check if their config directory exists or if they have known installation paths | |
switch (client.mcpType) | |
{ | |
case McpTypes.ClaudeCode: | |
// Check if Claude CLI is available | |
return !string.IsNullOrEmpty(ExecPath.ResolveClaude()); | |
case McpTypes.Cursor: | |
// Check if Cursor config directory exists | |
var cursorConfigDir = System.IO.Path.GetDirectoryName(client.windowsConfigPath); | |
return System.IO.Directory.Exists(cursorConfigDir); | |
case McpTypes.VSCode: | |
// Check if VSCode config directory exists | |
var vscodeConfigDir = System.IO.Path.GetDirectoryName(client.windowsConfigPath); | |
return System.IO.Directory.Exists(vscodeConfigDir); | |
case McpTypes.ClaudeDesktop: | |
// Check if Claude Desktop config directory exists | |
var claudeConfigDir = System.IO.Path.GetDirectoryName(client.windowsConfigPath); | |
return System.IO.Directory.Exists(claudeConfigDir); | |
default: | |
// For other clients, assume they might be available | |
return true; | |
} | |
} | |
private bool IsClientInstalled(McpClient client) | |
{ | |
try | |
{ | |
// For most clients, check if their config directory exists or if they have known installation paths | |
switch (client.mcpType) | |
{ | |
case McpTypes.ClaudeCode: | |
// Check if Claude CLI is available | |
return !string.IsNullOrEmpty(ExecPath.ResolveClaude()); | |
case McpTypes.Cursor: | |
// Check if Cursor config directory exists (OS-specific) | |
{ | |
var dir = System.IO.Path.GetDirectoryName(GetClientConfigPath(client)); | |
return !string.IsNullOrEmpty(dir) && System.IO.Directory.Exists(dir); | |
} | |
case McpTypes.VSCode: | |
{ | |
var dir = System.IO.Path.GetDirectoryName(GetClientConfigPath(client)); | |
return !string.IsNullOrEmpty(dir) && System.IO.Directory.Exists(dir); | |
} | |
case McpTypes.ClaudeDesktop: | |
{ | |
var dir = System.IO.Path.GetDirectoryName(GetClientConfigPath(client)); | |
return !string.IsNullOrEmpty(dir) && System.IO.Directory.Exists(dir); | |
} | |
default: | |
// For other clients, assume they might be available | |
return true; | |
} | |
} |
fileFormatVersion: 2 | ||
guid: 30d32d64f42ac37cc9752ad97eed558b | ||
folderAsset: yes | ||
DefaultImporter: | ||
externalObjects: {} | ||
userData: | ||
assetBundleName: | ||
assetBundleVariant: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🧩 Analysis chain
LGTM for Unity folder .meta.
Fields look standard for a folder asset. Consider verifying GUID uniqueness across the repo to avoid collisions.
🏁 Script executed:
#!/bin/bash
# Verify no duplicate GUIDs across .meta files
rg -n '^guid:\s*[a-f0-9]{32}$' -g '*.meta' | awk '{print $NF}' | sort | uniq -d
Length of output: 1682
🏁 Script executed:
#!/bin/bash
set -euo pipefail
# List files for duplicate GUIDs found in .meta files
dups=$(rg -n --glob '*.meta' '^guid:\s*[a-f0-9]{32}$' | awk '{print $NF}' | sort | uniq -d)
if [ -z "$dups" ]; then
echo "No duplicate GUIDs found"
exit 0
fi
for g in $dups; do
echo "=== GUID: $g ==="
rg -n --glob '*.meta' "guid:\s*$g" -S
echo
done
Length of output: 14078
Duplicate Unity GUIDs detected — action required
Multiple .meta files under ava-worktrees/feature/ava-asset-store-compliance/UnityMcpBridge/... share GUIDs with files under UnityMcpBridge/...; this will cause asset collisions in Unity. Regenerate unique GUIDs (delete/recreate the .meta files or reimport in Unity) or remove the duplicate copies.
Examples:
- ava-worktrees/.../UnityMcpBridge/Editor/Models.meta <-> UnityMcpBridge/Editor/Models.meta (guid: 16d3ab36890b6c14f9afeabee30e03e3)
- ava-worktrees/.../UnityMcpBridge/Editor/Helpers/PackageInstaller.cs.meta <-> UnityMcpBridge/Editor/Helpers/PackageInstaller.cs.meta (guid: 19e6eaa637484e9fa19f9a0459809de2)
Full list available from the verification script output; resolve all duplicates before merging.
🤖 Prompt for AI Agents
In
ava-worktrees/feature/ava-asset-store-compliance/UnityMcpBridge/Editor/Setup/Steps.meta
(lines 1-8) this .meta contains a GUID that collides with files under
UnityMcpBridge/... causing Unity asset collisions; fix by regenerating unique
GUIDs for the duplicated .meta files—either delete the duplicated .meta files
and let Unity recreate them, reimport the affected assets in Unity, or remove
the duplicate copies from the branch; ensure you resolve every GUID reported by
the verification script and re-run the verification before merging.
Summary
Implements Unity Asset Store compliance by removing bundled Python dependencies and replacing them with a comprehensive post-installation dependency setup system. This ensures the package meets Asset Store submission requirements while maintaining full functionality through guided user setup.
Key Changes
🏪 Asset Store Compliance
🧙♂️ Complete Setup Wizard
[InitializeOnLoad]
🔍 Enhanced Dependency Detection
⚙️ Integrated Client Configuration
🎯 Production-Ready Experience
Technical Implementation
New Architecture Components
UnityMcpBridge/Editor/Dependencies/
- Cross-platform dependency detection systemUnityMcpBridge/Editor/Setup/
- Complete setup wizard implementationUnityMcpBridge/Editor/Installation/
- Installation orchestration and guidanceAsset Store Compliance Features
User Experience
First-Time Setup Flow
Post-Setup Management
Window/MCP for Unity/MCP Client Configuration
Testing & Quality Assurance
Benefits
For Asset Store Submission
For Users
For Developers
Ready for Asset Store Submission
This implementation successfully addresses all Asset Store compliance requirements while providing an exceptional user experience. The package is production-ready and meets all Unity Asset Store submission guidelines.
Summary by CodeRabbit
New Features
Documentation