Full Code of CoplayDev/unity-mcp for AI

beta ec25df8f791e cached
1717 files
6.8 MB
1.9M tokens
7715 symbols
1 requests
Download .txt
Showing preview only (7,509K chars total). Download the full file or copy to clipboard to get everything.
Repository: CoplayDev/unity-mcp
Branch: beta
Commit: ec25df8f791e
Files: 1717
Total size: 6.8 MB

Directory structure:
gitextract_6xex_klh/

├── .dockerignore
├── .github/
│   ├── actions/
│   │   ├── publish-docker/
│   │   │   └── action.yml
│   │   └── publish-pypi/
│   │       └── action.yml
│   ├── pull_request_template.md
│   ├── scripts/
│   │   └── mark_skipped.py
│   └── workflows/
│       ├── beta-release.yml
│       ├── claude-nl-suite.yml
│       ├── github-repo-stats.yml
│       ├── python-tests.yml
│       ├── release.yml
│       └── unity-tests.yml
├── .gitignore
├── .mcpbignore
├── CLAUDE.md
├── CustomTools/
│   └── RoslynRuntimeCompilation/
│       ├── ManageRuntimeCompilation.cs
│       ├── ManageRuntimeCompilation.cs.meta
│       ├── RoslynRuntimeCompiler.cs
│       └── RoslynRuntimeCompiler.cs.meta
├── LICENSE
├── MCPForUnity/
│   ├── Editor/
│   │   ├── AssemblyInfo.cs
│   │   ├── AssemblyInfo.cs.meta
│   │   ├── Clients/
│   │   │   ├── Configurators/
│   │   │   │   ├── AntigravityConfigurator.cs
│   │   │   │   ├── AntigravityConfigurator.cs.meta
│   │   │   │   ├── CherryStudioConfigurator.cs
│   │   │   │   ├── CherryStudioConfigurator.cs.meta
│   │   │   │   ├── ClaudeCodeConfigurator.cs
│   │   │   │   ├── ClaudeCodeConfigurator.cs.meta
│   │   │   │   ├── ClaudeDesktopConfigurator.cs
│   │   │   │   ├── ClaudeDesktopConfigurator.cs.meta
│   │   │   │   ├── ClineConfigurator.cs
│   │   │   │   ├── ClineConfigurator.cs.meta
│   │   │   │   ├── CodeBuddyCliConfigurator.cs
│   │   │   │   ├── CodeBuddyCliConfigurator.cs.meta
│   │   │   │   ├── CodexConfigurator.cs
│   │   │   │   ├── CodexConfigurator.cs.meta
│   │   │   │   ├── CopilotCliConfigurator.cs
│   │   │   │   ├── CopilotCliConfigurator.cs.meta
│   │   │   │   ├── CursorConfigurator.cs
│   │   │   │   ├── CursorConfigurator.cs.meta
│   │   │   │   ├── GeminiCliConfigurator.cs
│   │   │   │   ├── GeminiCliConfigurator.cs.meta
│   │   │   │   ├── KiloCodeConfigurator.cs
│   │   │   │   ├── KiloCodeConfigurator.cs.meta
│   │   │   │   ├── KiroConfigurator.cs
│   │   │   │   ├── KiroConfigurator.cs.meta
│   │   │   │   ├── OpenCodeConfigurator.cs
│   │   │   │   ├── OpenCodeConfigurator.cs.meta
│   │   │   │   ├── QwenCodeConfigurator.cs
│   │   │   │   ├── QwenCodeConfigurator.cs.meta
│   │   │   │   ├── RiderConfigurator.cs
│   │   │   │   ├── RiderConfigurator.cs.meta
│   │   │   │   ├── TraeConfigurator.cs
│   │   │   │   ├── TraeConfigurator.cs.meta
│   │   │   │   ├── VSCodeConfigurator.cs
│   │   │   │   ├── VSCodeConfigurator.cs.meta
│   │   │   │   ├── VSCodeInsidersConfigurator.cs
│   │   │   │   ├── VSCodeInsidersConfigurator.cs.meta
│   │   │   │   ├── WindsurfConfigurator.cs
│   │   │   │   └── WindsurfConfigurator.cs.meta
│   │   │   ├── Configurators.meta
│   │   │   ├── IMcpClientConfigurator.cs
│   │   │   ├── IMcpClientConfigurator.cs.meta
│   │   │   ├── McpClientConfiguratorBase.cs
│   │   │   ├── McpClientConfiguratorBase.cs.meta
│   │   │   ├── McpClientRegistry.cs
│   │   │   └── McpClientRegistry.cs.meta
│   │   ├── Clients.meta
│   │   ├── Constants/
│   │   │   ├── AuthConstants.cs
│   │   │   ├── AuthConstants.cs.meta
│   │   │   ├── EditorPrefKeys.cs
│   │   │   ├── EditorPrefKeys.cs.meta
│   │   │   ├── HealthStatus.cs
│   │   │   └── HealthStatus.cs.meta
│   │   ├── Constants.meta
│   │   ├── Dependencies/
│   │   │   ├── DependencyManager.cs
│   │   │   ├── DependencyManager.cs.meta
│   │   │   ├── Models/
│   │   │   │   ├── DependencyCheckResult.cs
│   │   │   │   ├── DependencyCheckResult.cs.meta
│   │   │   │   ├── DependencyStatus.cs
│   │   │   │   └── DependencyStatus.cs.meta
│   │   │   ├── Models.meta
│   │   │   ├── PlatformDetectors/
│   │   │   │   ├── IPlatformDetector.cs
│   │   │   │   ├── IPlatformDetector.cs.meta
│   │   │   │   ├── LinuxPlatformDetector.cs
│   │   │   │   ├── LinuxPlatformDetector.cs.meta
│   │   │   │   ├── MacOSPlatformDetector.cs
│   │   │   │   ├── MacOSPlatformDetector.cs.meta
│   │   │   │   ├── PlatformDetectorBase.cs
│   │   │   │   ├── PlatformDetectorBase.cs.meta
│   │   │   │   ├── WindowsPlatformDetector.cs
│   │   │   │   └── WindowsPlatformDetector.cs.meta
│   │   │   └── PlatformDetectors.meta
│   │   ├── Dependencies.meta
│   │   ├── External/
│   │   │   ├── Tommy.cs
│   │   │   └── Tommy.cs.meta
│   │   ├── External.meta
│   │   ├── Helpers/
│   │   │   ├── AssetPathUtility.cs
│   │   │   ├── AssetPathUtility.cs.meta
│   │   │   ├── CodexConfigHelper.cs
│   │   │   ├── CodexConfigHelper.cs.meta
│   │   │   ├── ComponentOps.cs
│   │   │   ├── ComponentOps.cs.meta
│   │   │   ├── ConfigJsonBuilder.cs
│   │   │   ├── ConfigJsonBuilder.cs.meta
│   │   │   ├── EditorWindowScreenshotUtility.cs
│   │   │   ├── EditorWindowScreenshotUtility.cs.meta
│   │   │   ├── ExecPath.cs
│   │   │   ├── ExecPath.cs.meta
│   │   │   ├── GameObjectLookup.cs
│   │   │   ├── GameObjectLookup.cs.meta
│   │   │   ├── GameObjectSerializer.cs
│   │   │   ├── GameObjectSerializer.cs.meta
│   │   │   ├── HttpEndpointUtility.cs
│   │   │   ├── HttpEndpointUtility.cs.meta
│   │   │   ├── MaterialOps.cs
│   │   │   ├── MaterialOps.cs.meta
│   │   │   ├── McpConfigurationHelper.cs
│   │   │   ├── McpConfigurationHelper.cs.meta
│   │   │   ├── McpJobStateStore.cs
│   │   │   ├── McpJobStateStore.cs.meta
│   │   │   ├── McpLog.cs
│   │   │   ├── McpLog.cs.meta
│   │   │   ├── McpLogRecord.cs
│   │   │   ├── McpLogRecord.cs.meta
│   │   │   ├── ObjectResolver.cs
│   │   │   ├── ObjectResolver.cs.meta
│   │   │   ├── Pagination.cs
│   │   │   ├── Pagination.cs.meta
│   │   │   ├── ParamCoercion.cs
│   │   │   ├── ParamCoercion.cs.meta
│   │   │   ├── PortManager.cs
│   │   │   ├── PortManager.cs.meta
│   │   │   ├── PrefabUtilityHelper.cs
│   │   │   ├── PrefabUtilityHelper.cs.meta
│   │   │   ├── ProjectIdentityUtility.cs
│   │   │   ├── ProjectIdentityUtility.cs.meta
│   │   │   ├── PropertyConversion.cs
│   │   │   ├── PropertyConversion.cs.meta
│   │   │   ├── RenderPipelineUtility.cs
│   │   │   ├── RenderPipelineUtility.cs.meta
│   │   │   ├── RendererHelpers.cs
│   │   │   ├── RendererHelpers.cs.meta
│   │   │   ├── Response.cs
│   │   │   ├── Response.cs.meta
│   │   │   ├── StringCaseUtility.cs
│   │   │   ├── StringCaseUtility.cs.meta
│   │   │   ├── TelemetryHelper.cs
│   │   │   ├── TelemetryHelper.cs.meta
│   │   │   ├── TextureOps.cs
│   │   │   ├── TextureOps.cs.meta
│   │   │   ├── ToolParams.cs
│   │   │   ├── ToolParams.cs.meta
│   │   │   ├── UnityJsonSerializer.cs
│   │   │   ├── UnityJsonSerializer.cs.meta
│   │   │   ├── UnityTypeResolver.cs
│   │   │   ├── UnityTypeResolver.cs.meta
│   │   │   ├── VectorParsing.cs
│   │   │   └── VectorParsing.cs.meta
│   │   ├── Helpers.meta
│   │   ├── MCPForUnity.Editor.asmdef
│   │   ├── MCPForUnity.Editor.asmdef.meta
│   │   ├── McpCiBoot.cs
│   │   ├── McpCiBoot.cs.meta
│   │   ├── MenuItems/
│   │   │   ├── MCPForUnityMenu.cs
│   │   │   └── MCPForUnityMenu.cs.meta
│   │   ├── MenuItems.meta
│   │   ├── Migrations/
│   │   │   ├── LegacyServerSrcMigration.cs
│   │   │   ├── LegacyServerSrcMigration.cs.meta
│   │   │   ├── StdIoVersionMigration.cs
│   │   │   └── StdIoVersionMigration.cs.meta
│   │   ├── Migrations.meta
│   │   ├── Models/
│   │   │   ├── Command.cs
│   │   │   ├── Command.cs.meta
│   │   │   ├── MCPConfigServer.cs
│   │   │   ├── MCPConfigServer.cs.meta
│   │   │   ├── MCPConfigServers.cs
│   │   │   ├── MCPConfigServers.cs.meta
│   │   │   ├── McpClient.cs
│   │   │   ├── McpClient.cs.meta
│   │   │   ├── McpConfig.cs
│   │   │   ├── McpConfig.cs.meta
│   │   │   ├── McpStatus.cs
│   │   │   └── McpStatus.cs.meta
│   │   ├── Models.meta
│   │   ├── Resources/
│   │   │   ├── Editor/
│   │   │   │   ├── ActiveTool.cs
│   │   │   │   ├── ActiveTool.cs.meta
│   │   │   │   ├── EditorState.cs
│   │   │   │   ├── EditorState.cs.meta
│   │   │   │   ├── Selection.cs
│   │   │   │   ├── Selection.cs.meta
│   │   │   │   ├── ToolStates.cs
│   │   │   │   ├── ToolStates.cs.meta
│   │   │   │   ├── Windows.cs
│   │   │   │   └── Windows.cs.meta
│   │   │   ├── Editor.meta
│   │   │   ├── McpForUnityResourceAttribute.cs
│   │   │   ├── McpForUnityResourceAttribute.cs.meta
│   │   │   ├── MenuItems/
│   │   │   │   ├── GetMenuItems.cs
│   │   │   │   └── GetMenuItems.cs.meta
│   │   │   ├── MenuItems.meta
│   │   │   ├── Project/
│   │   │   │   ├── Layers.cs
│   │   │   │   ├── Layers.cs.meta
│   │   │   │   ├── ProjectInfo.cs
│   │   │   │   ├── ProjectInfo.cs.meta
│   │   │   │   ├── Tags.cs
│   │   │   │   └── Tags.cs.meta
│   │   │   ├── Project.meta
│   │   │   ├── Scene/
│   │   │   │   ├── CamerasResource.cs
│   │   │   │   ├── CamerasResource.cs.meta
│   │   │   │   ├── GameObjectResource.cs
│   │   │   │   ├── GameObjectResource.cs.meta
│   │   │   │   ├── RendererFeaturesResource.cs
│   │   │   │   ├── RendererFeaturesResource.cs.meta
│   │   │   │   ├── RenderingStatsResource.cs
│   │   │   │   ├── RenderingStatsResource.cs.meta
│   │   │   │   ├── VolumesResource.cs
│   │   │   │   └── VolumesResource.cs.meta
│   │   │   ├── Scene.meta
│   │   │   ├── Tests/
│   │   │   │   ├── GetTests.cs
│   │   │   │   └── GetTests.cs.meta
│   │   │   └── Tests.meta
│   │   ├── Resources.meta
│   │   ├── Services/
│   │   │   ├── BridgeControlService.cs
│   │   │   ├── BridgeControlService.cs.meta
│   │   │   ├── ClientConfigurationService.cs
│   │   │   ├── ClientConfigurationService.cs.meta
│   │   │   ├── EditorConfigurationCache.cs
│   │   │   ├── EditorConfigurationCache.cs.meta
│   │   │   ├── EditorPrefsWindowService.cs
│   │   │   ├── EditorPrefsWindowService.cs.meta
│   │   │   ├── EditorStateCache.cs
│   │   │   ├── EditorStateCache.cs.meta
│   │   │   ├── HttpAutoStartHandler.cs
│   │   │   ├── HttpAutoStartHandler.cs.meta
│   │   │   ├── HttpBridgeReloadHandler.cs
│   │   │   ├── HttpBridgeReloadHandler.cs.meta
│   │   │   ├── IBridgeControlService.cs
│   │   │   ├── IBridgeControlService.cs.meta
│   │   │   ├── IClientConfigurationService.cs
│   │   │   ├── IClientConfigurationService.cs.meta
│   │   │   ├── IPackageDeploymentService.cs
│   │   │   ├── IPackageDeploymentService.cs.meta
│   │   │   ├── IPackageUpdateService.cs
│   │   │   ├── IPackageUpdateService.cs.meta
│   │   │   ├── IPathResolverService.cs
│   │   │   ├── IPathResolverService.cs.meta
│   │   │   ├── IPlatformService.cs
│   │   │   ├── IPlatformService.cs.meta
│   │   │   ├── IResourceDiscoveryService.cs
│   │   │   ├── IResourceDiscoveryService.cs.meta
│   │   │   ├── IServerManagementService.cs
│   │   │   ├── IServerManagementService.cs.meta
│   │   │   ├── ITestRunnerService.cs
│   │   │   ├── ITestRunnerService.cs.meta
│   │   │   ├── IToolDiscoveryService.cs
│   │   │   ├── IToolDiscoveryService.cs.meta
│   │   │   ├── MCPServiceLocator.cs
│   │   │   ├── MCPServiceLocator.cs.meta
│   │   │   ├── McpEditorShutdownCleanup.cs
│   │   │   ├── McpEditorShutdownCleanup.cs.meta
│   │   │   ├── PackageDeploymentService.cs
│   │   │   ├── PackageDeploymentService.cs.meta
│   │   │   ├── PackageJobManager.cs
│   │   │   ├── PackageJobManager.cs.meta
│   │   │   ├── PackageUpdateService.cs
│   │   │   ├── PackageUpdateService.cs.meta
│   │   │   ├── PathResolverService.cs
│   │   │   ├── PathResolverService.cs.meta
│   │   │   ├── PlatformService.cs
│   │   │   ├── PlatformService.cs.meta
│   │   │   ├── ResourceDiscoveryService.cs
│   │   │   ├── ResourceDiscoveryService.cs.meta
│   │   │   ├── Server/
│   │   │   │   ├── IPidFileManager.cs
│   │   │   │   ├── IPidFileManager.cs.meta
│   │   │   │   ├── IProcessDetector.cs
│   │   │   │   ├── IProcessDetector.cs.meta
│   │   │   │   ├── IProcessTerminator.cs
│   │   │   │   ├── IProcessTerminator.cs.meta
│   │   │   │   ├── IServerCommandBuilder.cs
│   │   │   │   ├── IServerCommandBuilder.cs.meta
│   │   │   │   ├── ITerminalLauncher.cs
│   │   │   │   ├── ITerminalLauncher.cs.meta
│   │   │   │   ├── PidFileManager.cs
│   │   │   │   ├── PidFileManager.cs.meta
│   │   │   │   ├── ProcessDetector.cs
│   │   │   │   ├── ProcessDetector.cs.meta
│   │   │   │   ├── ProcessTerminator.cs
│   │   │   │   ├── ProcessTerminator.cs.meta
│   │   │   │   ├── ServerCommandBuilder.cs
│   │   │   │   ├── ServerCommandBuilder.cs.meta
│   │   │   │   ├── TerminalLauncher.cs
│   │   │   │   └── TerminalLauncher.cs.meta
│   │   │   ├── Server.meta
│   │   │   ├── ServerManagementService.cs
│   │   │   ├── ServerManagementService.cs.meta
│   │   │   ├── StdioBridgeReloadHandler.cs
│   │   │   ├── StdioBridgeReloadHandler.cs.meta
│   │   │   ├── TestJobManager.cs
│   │   │   ├── TestJobManager.cs.meta
│   │   │   ├── TestRunStatus.cs
│   │   │   ├── TestRunStatus.cs.meta
│   │   │   ├── TestRunnerNoThrottle.cs
│   │   │   ├── TestRunnerNoThrottle.cs.meta
│   │   │   ├── TestRunnerService.cs
│   │   │   ├── TestRunnerService.cs.meta
│   │   │   ├── ToolDiscoveryService.cs
│   │   │   ├── ToolDiscoveryService.cs.meta
│   │   │   ├── Transport/
│   │   │   │   ├── IMcpTransportClient.cs
│   │   │   │   ├── IMcpTransportClient.cs.meta
│   │   │   │   ├── TransportCommandDispatcher.cs
│   │   │   │   ├── TransportCommandDispatcher.cs.meta
│   │   │   │   ├── TransportManager.cs
│   │   │   │   ├── TransportManager.cs.meta
│   │   │   │   ├── TransportState.cs
│   │   │   │   ├── TransportState.cs.meta
│   │   │   │   ├── Transports/
│   │   │   │   │   ├── StdioBridgeHost.cs
│   │   │   │   │   ├── StdioBridgeHost.cs.meta
│   │   │   │   │   ├── StdioTransportClient.cs
│   │   │   │   │   ├── StdioTransportClient.cs.meta
│   │   │   │   │   ├── WebSocketTransportClient.cs
│   │   │   │   │   └── WebSocketTransportClient.cs.meta
│   │   │   │   └── Transports.meta
│   │   │   └── Transport.meta
│   │   ├── Services.meta
│   │   ├── Setup/
│   │   │   ├── McpForUnitySkillInstaller.cs
│   │   │   ├── McpForUnitySkillInstaller.cs.meta
│   │   │   ├── RoslynInstaller.cs
│   │   │   ├── RoslynInstaller.cs.meta
│   │   │   ├── SetupWindowService.cs
│   │   │   ├── SetupWindowService.cs.meta
│   │   │   ├── SkillSyncService.cs
│   │   │   └── SkillSyncService.cs.meta
│   │   ├── Setup.meta
│   │   ├── Tools/
│   │   │   ├── Animation/
│   │   │   │   ├── AnimatorControl.cs
│   │   │   │   ├── AnimatorControl.cs.meta
│   │   │   │   ├── AnimatorRead.cs
│   │   │   │   ├── AnimatorRead.cs.meta
│   │   │   │   ├── ClipCreate.cs
│   │   │   │   ├── ClipCreate.cs.meta
│   │   │   │   ├── ClipPresets.cs
│   │   │   │   ├── ClipPresets.cs.meta
│   │   │   │   ├── ControllerBlendTrees.cs
│   │   │   │   ├── ControllerBlendTrees.cs.meta
│   │   │   │   ├── ControllerCreate.cs
│   │   │   │   ├── ControllerCreate.cs.meta
│   │   │   │   ├── ControllerLayers.cs
│   │   │   │   ├── ControllerLayers.cs.meta
│   │   │   │   ├── ManageAnimation.cs
│   │   │   │   └── ManageAnimation.cs.meta
│   │   │   ├── Animation.meta
│   │   │   ├── BatchExecute.cs
│   │   │   ├── BatchExecute.cs.meta
│   │   │   ├── Cameras/
│   │   │   │   ├── CameraConfigure.cs
│   │   │   │   ├── CameraConfigure.cs.meta
│   │   │   │   ├── CameraControl.cs
│   │   │   │   ├── CameraControl.cs.meta
│   │   │   │   ├── CameraCreate.cs
│   │   │   │   ├── CameraCreate.cs.meta
│   │   │   │   ├── CameraHelpers.cs
│   │   │   │   ├── CameraHelpers.cs.meta
│   │   │   │   ├── ManageCamera.cs
│   │   │   │   └── ManageCamera.cs.meta
│   │   │   ├── Cameras.meta
│   │   │   ├── CommandRegistry.cs
│   │   │   ├── CommandRegistry.cs.meta
│   │   │   ├── ExecuteMenuItem.cs
│   │   │   ├── ExecuteMenuItem.cs.meta
│   │   │   ├── FindGameObjects.cs
│   │   │   ├── FindGameObjects.cs.meta
│   │   │   ├── GameObjects/
│   │   │   │   ├── ComponentResolver.cs
│   │   │   │   ├── ComponentResolver.cs.meta
│   │   │   │   ├── GameObjectComponentHelpers.cs
│   │   │   │   ├── GameObjectComponentHelpers.cs.meta
│   │   │   │   ├── GameObjectCreate.cs
│   │   │   │   ├── GameObjectCreate.cs.meta
│   │   │   │   ├── GameObjectDelete.cs
│   │   │   │   ├── GameObjectDelete.cs.meta
│   │   │   │   ├── GameObjectDuplicate.cs
│   │   │   │   ├── GameObjectDuplicate.cs.meta
│   │   │   │   ├── GameObjectHandlers.cs
│   │   │   │   ├── GameObjectHandlers.cs.meta
│   │   │   │   ├── GameObjectLookAt.cs
│   │   │   │   ├── GameObjectLookAt.cs.meta
│   │   │   │   ├── GameObjectModify.cs
│   │   │   │   ├── GameObjectModify.cs.meta
│   │   │   │   ├── GameObjectMoveRelative.cs
│   │   │   │   ├── GameObjectMoveRelative.cs.meta
│   │   │   │   ├── ManageGameObject.cs
│   │   │   │   ├── ManageGameObject.cs.meta
│   │   │   │   ├── ManageGameObjectCommon.cs
│   │   │   │   └── ManageGameObjectCommon.cs.meta
│   │   │   ├── GameObjects.meta
│   │   │   ├── GetTestJob.cs
│   │   │   ├── GetTestJob.cs.meta
│   │   │   ├── Graphics/
│   │   │   │   ├── GraphicsHelpers.cs
│   │   │   │   ├── GraphicsHelpers.cs.meta
│   │   │   │   ├── LightBakingOps.cs
│   │   │   │   ├── LightBakingOps.cs.meta
│   │   │   │   ├── ManageGraphics.cs
│   │   │   │   ├── ManageGraphics.cs.meta
│   │   │   │   ├── RenderPipelineOps.cs
│   │   │   │   ├── RenderPipelineOps.cs.meta
│   │   │   │   ├── RendererFeatureOps.cs
│   │   │   │   ├── RendererFeatureOps.cs.meta
│   │   │   │   ├── RenderingStatsOps.cs
│   │   │   │   ├── RenderingStatsOps.cs.meta
│   │   │   │   ├── SkyboxOps.cs
│   │   │   │   ├── SkyboxOps.cs.meta
│   │   │   │   ├── VolumeOps.cs
│   │   │   │   └── VolumeOps.cs.meta
│   │   │   ├── Graphics.meta
│   │   │   ├── JsonUtil.cs
│   │   │   ├── JsonUtil.cs.meta
│   │   │   ├── ManageAsset.cs
│   │   │   ├── ManageAsset.cs.meta
│   │   │   ├── ManageComponents.cs
│   │   │   ├── ManageComponents.cs.meta
│   │   │   ├── ManageEditor.cs
│   │   │   ├── ManageEditor.cs.meta
│   │   │   ├── ManageMaterial.cs
│   │   │   ├── ManageMaterial.cs.meta
│   │   │   ├── ManagePackages.cs
│   │   │   ├── ManagePackages.cs.meta
│   │   │   ├── ManageScene.cs
│   │   │   ├── ManageScene.cs.meta
│   │   │   ├── ManageScript.cs
│   │   │   ├── ManageScript.cs.meta
│   │   │   ├── ManageScriptableObject.cs
│   │   │   ├── ManageScriptableObject.cs.meta
│   │   │   ├── ManageShader.cs
│   │   │   ├── ManageShader.cs.meta
│   │   │   ├── ManageTexture.cs
│   │   │   ├── ManageTexture.cs.meta
│   │   │   ├── ManageUI.cs
│   │   │   ├── ManageUI.cs.meta
│   │   │   ├── McpForUnityToolAttribute.cs
│   │   │   ├── McpForUnityToolAttribute.cs.meta
│   │   │   ├── Prefabs/
│   │   │   │   ├── ManagePrefabs.cs
│   │   │   │   └── ManagePrefabs.cs.meta
│   │   │   ├── Prefabs.meta
│   │   │   ├── ProBuilder/
│   │   │   │   ├── ManageProBuilder.cs
│   │   │   │   ├── ManageProBuilder.cs.meta
│   │   │   │   ├── ProBuilderMeshUtils.cs
│   │   │   │   ├── ProBuilderMeshUtils.cs.meta
│   │   │   │   ├── ProBuilderSmoothing.cs
│   │   │   │   └── ProBuilderSmoothing.cs.meta
│   │   │   ├── ProBuilder.meta
│   │   │   ├── ReadConsole.cs
│   │   │   ├── ReadConsole.cs.meta
│   │   │   ├── RefreshUnity.cs
│   │   │   ├── RefreshUnity.cs.meta
│   │   │   ├── RunTests.cs
│   │   │   ├── RunTests.cs.meta
│   │   │   ├── UnityReflect.cs
│   │   │   ├── UnityReflect.cs.meta
│   │   │   ├── Vfx/
│   │   │   │   ├── LineCreate.cs
│   │   │   │   ├── LineCreate.cs.meta
│   │   │   │   ├── LineRead.cs
│   │   │   │   ├── LineRead.cs.meta
│   │   │   │   ├── LineWrite.cs
│   │   │   │   ├── LineWrite.cs.meta
│   │   │   │   ├── ManageVFX.cs
│   │   │   │   ├── ManageVFX.cs.meta
│   │   │   │   ├── ManageVfxCommon.cs
│   │   │   │   ├── ManageVfxCommon.cs.meta
│   │   │   │   ├── ParticleCommon.cs
│   │   │   │   ├── ParticleCommon.cs.meta
│   │   │   │   ├── ParticleControl.cs
│   │   │   │   ├── ParticleControl.cs.meta
│   │   │   │   ├── ParticleRead.cs
│   │   │   │   ├── ParticleRead.cs.meta
│   │   │   │   ├── ParticleWrite.cs
│   │   │   │   ├── ParticleWrite.cs.meta
│   │   │   │   ├── TrailControl.cs
│   │   │   │   ├── TrailControl.cs.meta
│   │   │   │   ├── TrailRead.cs
│   │   │   │   ├── TrailRead.cs.meta
│   │   │   │   ├── TrailWrite.cs
│   │   │   │   ├── TrailWrite.cs.meta
│   │   │   │   ├── VfxGraphAssets.cs
│   │   │   │   ├── VfxGraphAssets.cs.meta
│   │   │   │   ├── VfxGraphCommon.cs
│   │   │   │   ├── VfxGraphCommon.cs.meta
│   │   │   │   ├── VfxGraphControl.cs
│   │   │   │   ├── VfxGraphControl.cs.meta
│   │   │   │   ├── VfxGraphRead.cs
│   │   │   │   ├── VfxGraphRead.cs.meta
│   │   │   │   ├── VfxGraphWrite.cs
│   │   │   │   └── VfxGraphWrite.cs.meta
│   │   │   └── Vfx.meta
│   │   ├── Tools.meta
│   │   ├── Windows/
│   │   │   ├── Components/
│   │   │   │   ├── Advanced/
│   │   │   │   │   ├── McpAdvancedSection.cs
│   │   │   │   │   ├── McpAdvancedSection.cs.meta
│   │   │   │   │   ├── McpAdvancedSection.uxml
│   │   │   │   │   └── McpAdvancedSection.uxml.meta
│   │   │   │   ├── Advanced.meta
│   │   │   │   ├── ClientConfig/
│   │   │   │   │   ├── McpClientConfigSection.cs
│   │   │   │   │   ├── McpClientConfigSection.cs.meta
│   │   │   │   │   ├── McpClientConfigSection.uxml
│   │   │   │   │   └── McpClientConfigSection.uxml.meta
│   │   │   │   ├── ClientConfig.meta
│   │   │   │   ├── Common.uss
│   │   │   │   ├── Common.uss.meta
│   │   │   │   ├── Connection/
│   │   │   │   │   ├── McpConnectionSection.cs
│   │   │   │   │   ├── McpConnectionSection.cs.meta
│   │   │   │   │   ├── McpConnectionSection.uxml
│   │   │   │   │   └── McpConnectionSection.uxml.meta
│   │   │   │   ├── Connection.meta
│   │   │   │   ├── Resources/
│   │   │   │   │   ├── McpResourcesSection.cs
│   │   │   │   │   ├── McpResourcesSection.cs.meta
│   │   │   │   │   ├── McpResourcesSection.uxml
│   │   │   │   │   └── McpResourcesSection.uxml.meta
│   │   │   │   ├── Resources.meta
│   │   │   │   ├── Tools/
│   │   │   │   │   ├── McpToolsSection.cs
│   │   │   │   │   ├── McpToolsSection.cs.meta
│   │   │   │   │   ├── McpToolsSection.uxml
│   │   │   │   │   └── McpToolsSection.uxml.meta
│   │   │   │   ├── Tools.meta
│   │   │   │   ├── Validation/
│   │   │   │   │   ├── McpValidationSection.cs
│   │   │   │   │   ├── McpValidationSection.cs.meta
│   │   │   │   │   ├── McpValidationSection.uxml
│   │   │   │   │   └── McpValidationSection.uxml.meta
│   │   │   │   └── Validation.meta
│   │   │   ├── Components.meta
│   │   │   ├── EditorPrefs/
│   │   │   │   ├── EditorPrefItem.uxml
│   │   │   │   ├── EditorPrefItem.uxml.meta
│   │   │   │   ├── EditorPrefsWindow.cs
│   │   │   │   ├── EditorPrefsWindow.cs.meta
│   │   │   │   ├── EditorPrefsWindow.uss
│   │   │   │   ├── EditorPrefsWindow.uss.meta
│   │   │   │   ├── EditorPrefsWindow.uxml
│   │   │   │   └── EditorPrefsWindow.uxml.meta
│   │   │   ├── EditorPrefs.meta
│   │   │   ├── MCPForUnityEditorWindow.cs
│   │   │   ├── MCPForUnityEditorWindow.cs.meta
│   │   │   ├── MCPForUnityEditorWindow.uss
│   │   │   ├── MCPForUnityEditorWindow.uss.meta
│   │   │   ├── MCPForUnityEditorWindow.uxml
│   │   │   ├── MCPForUnityEditorWindow.uxml.meta
│   │   │   ├── MCPSetupWindow.cs
│   │   │   ├── MCPSetupWindow.cs.meta
│   │   │   ├── MCPSetupWindow.uss
│   │   │   ├── MCPSetupWindow.uss.meta
│   │   │   ├── MCPSetupWindow.uxml
│   │   │   └── MCPSetupWindow.uxml.meta
│   │   └── Windows.meta
│   ├── Editor.meta
│   ├── README.md
│   ├── README.md.meta
│   ├── Runtime/
│   │   ├── Helpers/
│   │   │   ├── ScreenshotUtility.cs
│   │   │   └── ScreenshotUtility.cs.meta
│   │   ├── Helpers.meta
│   │   ├── MCPForUnity.Runtime.asmdef
│   │   ├── MCPForUnity.Runtime.asmdef.meta
│   │   ├── Serialization/
│   │   │   ├── UnityTypeConverters.cs
│   │   │   └── UnityTypeConverters.cs.meta
│   │   └── Serialization.meta
│   ├── Runtime.meta
│   ├── package.json
│   └── package.json.meta
├── README.md
├── Server/
│   ├── DOCKER_OVERVIEW.md
│   ├── Dockerfile
│   ├── LICENSE
│   ├── README.md
│   ├── __init__.py
│   ├── pyproject.toml
│   ├── pyrightconfig.json
│   ├── src/
│   │   ├── __init__.py
│   │   ├── cli/
│   │   │   ├── CLI_USAGE_GUIDE.md
│   │   │   ├── __init__.py
│   │   │   ├── commands/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── animation.py
│   │   │   │   ├── asset.py
│   │   │   │   ├── audio.py
│   │   │   │   ├── batch.py
│   │   │   │   ├── camera.py
│   │   │   │   ├── code.py
│   │   │   │   ├── component.py
│   │   │   │   ├── docs.py
│   │   │   │   ├── editor.py
│   │   │   │   ├── gameobject.py
│   │   │   │   ├── graphics.py
│   │   │   │   ├── instance.py
│   │   │   │   ├── lighting.py
│   │   │   │   ├── material.py
│   │   │   │   ├── packages.py
│   │   │   │   ├── prefab.py
│   │   │   │   ├── probuilder.py
│   │   │   │   ├── reflect.py
│   │   │   │   ├── scene.py
│   │   │   │   ├── script.py
│   │   │   │   ├── shader.py
│   │   │   │   ├── texture.py
│   │   │   │   ├── tool.py
│   │   │   │   ├── ui.py
│   │   │   │   └── vfx.py
│   │   │   ├── main.py
│   │   │   └── utils/
│   │   │       ├── __init__.py
│   │   │       ├── config.py
│   │   │       ├── confirmation.py
│   │   │       ├── connection.py
│   │   │       ├── constants.py
│   │   │       ├── output.py
│   │   │       ├── parsers.py
│   │   │       └── suggestions.py
│   │   ├── core/
│   │   │   ├── __init__.py
│   │   │   ├── config.py
│   │   │   ├── constants.py
│   │   │   ├── logging_decorator.py
│   │   │   ├── telemetry.py
│   │   │   └── telemetry_decorator.py
│   │   ├── main.py
│   │   ├── models/
│   │   │   ├── __init__.py
│   │   │   ├── models.py
│   │   │   └── unity_response.py
│   │   ├── services/
│   │   │   ├── __init__.py
│   │   │   ├── api_key_service.py
│   │   │   ├── custom_tool_service.py
│   │   │   ├── registry/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── resource_registry.py
│   │   │   │   └── tool_registry.py
│   │   │   ├── resources/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── active_tool.py
│   │   │   │   ├── cameras.py
│   │   │   │   ├── custom_tools.py
│   │   │   │   ├── editor_state.py
│   │   │   │   ├── gameobject.py
│   │   │   │   ├── layers.py
│   │   │   │   ├── menu_items.py
│   │   │   │   ├── prefab.py
│   │   │   │   ├── prefab_stage.py
│   │   │   │   ├── project_info.py
│   │   │   │   ├── renderer_features.py
│   │   │   │   ├── rendering_stats.py
│   │   │   │   ├── selection.py
│   │   │   │   ├── tags.py
│   │   │   │   ├── tests.py
│   │   │   │   ├── tool_groups.py
│   │   │   │   ├── unity_instances.py
│   │   │   │   ├── volumes.py
│   │   │   │   └── windows.py
│   │   │   ├── state/
│   │   │   │   └── external_changes_scanner.py
│   │   │   └── tools/
│   │   │       ├── __init__.py
│   │   │       ├── batch_execute.py
│   │   │       ├── debug_request_context.py
│   │   │       ├── execute_custom_tool.py
│   │   │       ├── execute_menu_item.py
│   │   │       ├── find_gameobjects.py
│   │   │       ├── find_in_file.py
│   │   │       ├── manage_animation.py
│   │   │       ├── manage_asset.py
│   │   │       ├── manage_camera.py
│   │   │       ├── manage_components.py
│   │   │       ├── manage_editor.py
│   │   │       ├── manage_gameobject.py
│   │   │       ├── manage_graphics.py
│   │   │       ├── manage_material.py
│   │   │       ├── manage_packages.py
│   │   │       ├── manage_prefabs.py
│   │   │       ├── manage_probuilder.py
│   │   │       ├── manage_scene.py
│   │   │       ├── manage_script.py
│   │   │       ├── manage_scriptable_object.py
│   │   │       ├── manage_shader.py
│   │   │       ├── manage_texture.py
│   │   │       ├── manage_tools.py
│   │   │       ├── manage_ui.py
│   │   │       ├── manage_vfx.py
│   │   │       ├── preflight.py
│   │   │       ├── read_console.py
│   │   │       ├── refresh_unity.py
│   │   │       ├── run_tests.py
│   │   │       ├── script_apply_edits.py
│   │   │       ├── set_active_instance.py
│   │   │       ├── unity_docs.py
│   │   │       ├── unity_reflect.py
│   │   │       └── utils.py
│   │   ├── transport/
│   │   │   ├── __init__.py
│   │   │   ├── legacy/
│   │   │   │   ├── port_discovery.py
│   │   │   │   ├── stdio_port_registry.py
│   │   │   │   └── unity_connection.py
│   │   │   ├── models.py
│   │   │   ├── plugin_hub.py
│   │   │   ├── plugin_registry.py
│   │   │   ├── unity_instance_middleware.py
│   │   │   └── unity_transport.py
│   │   └── utils/
│   │       ├── focus_nudge.py
│   │       └── module_discovery.py
│   └── tests/
│       ├── __init__.py
│       ├── conftest.py
│       ├── integration/
│       │   ├── __init__.py
│       │   ├── conftest.py
│       │   ├── test_api_key_service.py
│       │   ├── test_auth_config_startup.py
│       │   ├── test_debug_request_context_diagnostics.py
│       │   ├── test_domain_reload_resilience.py
│       │   ├── test_edit_normalization_and_noop.py
│       │   ├── test_edit_strict_and_warnings.py
│       │   ├── test_editor_state_v2_contract.py
│       │   ├── test_external_changes_scanner.py
│       │   ├── test_find_gameobjects.py
│       │   ├── test_gameobject_resources.py
│       │   ├── test_get_sha.py
│       │   ├── test_helpers.py
│       │   ├── test_improved_anchor_matching.py
│       │   ├── test_inline_unity_instance.py
│       │   ├── test_instance_autoselect.py
│       │   ├── test_instance_routing_comprehensive.py
│       │   ├── test_instance_targeting_resolution.py
│       │   ├── test_json_parsing_simple.py
│       │   ├── test_logging_stdout.py
│       │   ├── test_manage_asset_json_parsing.py
│       │   ├── test_manage_asset_param_coercion.py
│       │   ├── test_manage_components.py
│       │   ├── test_manage_gameobject_look_at.py
│       │   ├── test_manage_gameobject_param_coercion.py
│       │   ├── test_manage_scene_paging_params.py
│       │   ├── test_manage_script_uri.py
│       │   ├── test_manage_scriptable_object_tool.py
│       │   ├── test_manage_texture.py
│       │   ├── test_manage_ui.py
│       │   ├── test_middleware_auth_integration.py
│       │   ├── test_multi_user_session_isolation.py
│       │   ├── test_plugin_hub_websocket_auth.py
│       │   ├── test_plugin_registry_user_isolation.py
│       │   ├── test_read_console_truncate.py
│       │   ├── test_read_resource_minimal.py
│       │   ├── test_refresh_unity_registration.py
│       │   ├── test_refresh_unity_retry_recovery.py
│       │   ├── test_resolve_user_id.py
│       │   ├── test_run_tests_async.py
│       │   ├── test_script_apply_edits_local.py
│       │   ├── test_script_tools.py
│       │   ├── test_telemetry_endpoint_validation.py
│       │   ├── test_telemetry_queue_worker.py
│       │   ├── test_telemetry_subaction.py
│       │   ├── test_tool_signatures_paging.py
│       │   ├── test_transport_framing.py
│       │   ├── test_transport_smoke.py
│       │   ├── test_validate_script_summary.py
│       │   └── test_wait_for_editor_ready.py
│       ├── pytest.ini
│       ├── test_cli.py
│       ├── test_cli_commands_characterization.py
│       ├── test_core_infrastructure_characterization.py
│       ├── test_custom_tool_service_user_scope.py
│       ├── test_focus_nudge.py
│       ├── test_manage_animation.py
│       ├── test_manage_camera.py
│       ├── test_manage_graphics.py
│       ├── test_manage_prefabs.py
│       ├── test_manage_probuilder.py
│       ├── test_manage_vfx_actions.py
│       ├── test_models_characterization.py
│       ├── test_param_normalizer.py
│       ├── test_tool_registry_metadata.py
│       ├── test_transport_characterization.py
│       ├── test_unity_docs.py
│       ├── test_unity_reflect.py
│       └── test_utilities_characterization.py
├── TestProjects/
│   ├── AssetStoreUploads/
│   │   ├── .gitignore
│   │   ├── Assets/
│   │   │   ├── Readme.asset.meta
│   │   │   ├── Scenes/
│   │   │   │   ├── SampleScene.unity
│   │   │   │   └── SampleScene.unity.meta
│   │   │   ├── Scenes.meta
│   │   │   ├── Settings/
│   │   │   │   ├── SampleSceneProfile.asset.meta
│   │   │   │   ├── URP-Balanced-Renderer.asset.meta
│   │   │   │   ├── URP-Balanced.asset.meta
│   │   │   │   ├── URP-HighFidelity-Renderer.asset.meta
│   │   │   │   ├── URP-HighFidelity.asset.meta
│   │   │   │   ├── URP-Performant-Renderer.asset.meta
│   │   │   │   └── URP-Performant.asset.meta
│   │   │   ├── Settings.meta
│   │   │   ├── TutorialInfo/
│   │   │   │   ├── Icons/
│   │   │   │   │   └── URP.png.meta
│   │   │   │   ├── Icons.meta
│   │   │   │   ├── Layout.wlt
│   │   │   │   ├── Layout.wlt.meta
│   │   │   │   ├── Scripts/
│   │   │   │   │   ├── Editor/
│   │   │   │   │   │   ├── ReadmeEditor.cs
│   │   │   │   │   │   └── ReadmeEditor.cs.meta
│   │   │   │   │   ├── Editor.meta
│   │   │   │   │   ├── Readme.cs
│   │   │   │   │   └── Readme.cs.meta
│   │   │   │   └── Scripts.meta
│   │   │   ├── TutorialInfo.meta
│   │   │   └── UniversalRenderPipelineGlobalSettings.asset.meta
│   │   ├── Packages/
│   │   │   ├── com.unity.asset-store-tools/
│   │   │   │   ├── CHANGELOG.md
│   │   │   │   ├── CHANGELOG.md.meta
│   │   │   │   ├── Editor/
│   │   │   │   │   ├── Api/
│   │   │   │   │   │   ├── Abstractions/
│   │   │   │   │   │   │   ├── AuthenticationBase.cs
│   │   │   │   │   │   │   ├── AuthenticationBase.cs.meta
│   │   │   │   │   │   │   ├── IAssetStoreApi.cs
│   │   │   │   │   │   │   ├── IAssetStoreApi.cs.meta
│   │   │   │   │   │   │   ├── IAssetStoreClient.cs
│   │   │   │   │   │   │   ├── IAssetStoreClient.cs.meta
│   │   │   │   │   │   │   ├── IAuthenticationType.cs
│   │   │   │   │   │   │   ├── IAuthenticationType.cs.meta
│   │   │   │   │   │   │   ├── IPackageUploader.cs
│   │   │   │   │   │   │   ├── IPackageUploader.cs.meta
│   │   │   │   │   │   │   ├── PackageUploaderBase.cs
│   │   │   │   │   │   │   └── PackageUploaderBase.cs.meta
│   │   │   │   │   │   ├── Abstractions.meta
│   │   │   │   │   │   ├── ApiUtility.cs
│   │   │   │   │   │   ├── ApiUtility.cs.meta
│   │   │   │   │   │   ├── AssetStoreApi.cs
│   │   │   │   │   │   ├── AssetStoreApi.cs.meta
│   │   │   │   │   │   ├── AssetStoreClient.cs
│   │   │   │   │   │   ├── AssetStoreClient.cs.meta
│   │   │   │   │   │   ├── CloudTokenAuthentication.cs
│   │   │   │   │   │   ├── CloudTokenAuthentication.cs.meta
│   │   │   │   │   │   ├── CredentialsAuthentication.cs
│   │   │   │   │   │   ├── CredentialsAuthentication.cs.meta
│   │   │   │   │   │   ├── Models/
│   │   │   │   │   │   │   ├── Category.cs
│   │   │   │   │   │   │   ├── Category.cs.meta
│   │   │   │   │   │   │   ├── Package.cs
│   │   │   │   │   │   │   ├── Package.cs.meta
│   │   │   │   │   │   │   ├── PackageAdditionalData.cs
│   │   │   │   │   │   │   ├── PackageAdditionalData.cs.meta
│   │   │   │   │   │   │   ├── User.cs
│   │   │   │   │   │   │   └── User.cs.meta
│   │   │   │   │   │   ├── Models.meta
│   │   │   │   │   │   ├── Responses/
│   │   │   │   │   │   │   ├── AssetStoreResponse.cs
│   │   │   │   │   │   │   ├── AssetStoreResponse.cs.meta
│   │   │   │   │   │   │   ├── AssetStoreToolsVersionResponse.cs
│   │   │   │   │   │   │   ├── AssetStoreToolsVersionResponse.cs.meta
│   │   │   │   │   │   │   ├── AuthenticationResponse.cs
│   │   │   │   │   │   │   ├── AuthenticationResponse.cs.meta
│   │   │   │   │   │   │   ├── CategoryDataResponse.cs
│   │   │   │   │   │   │   ├── CategoryDataResponse.cs.meta
│   │   │   │   │   │   │   ├── PackageThumbnailResponse.cs
│   │   │   │   │   │   │   ├── PackageThumbnailResponse.cs.meta
│   │   │   │   │   │   │   ├── PackageUploadedUnityVersionDataResponse.cs
│   │   │   │   │   │   │   ├── PackageUploadedUnityVersionDataResponse.cs.meta
│   │   │   │   │   │   │   ├── PackagesAdditionalDataResponse.cs
│   │   │   │   │   │   │   ├── PackagesAdditionalDataResponse.cs.meta
│   │   │   │   │   │   │   ├── PackagesDataResponse.cs
│   │   │   │   │   │   │   ├── PackagesDataResponse.cs.meta
│   │   │   │   │   │   │   ├── RefreshedPackageDataResponse.cs
│   │   │   │   │   │   │   ├── RefreshedPackageDataResponse.cs.meta
│   │   │   │   │   │   │   ├── UploadResponse.cs
│   │   │   │   │   │   │   └── UploadResponse.cs.meta
│   │   │   │   │   │   ├── Responses.meta
│   │   │   │   │   │   ├── SessionAuthentication.cs
│   │   │   │   │   │   ├── SessionAuthentication.cs.meta
│   │   │   │   │   │   ├── UnityPackageUploader.cs
│   │   │   │   │   │   ├── UnityPackageUploader.cs.meta
│   │   │   │   │   │   ├── UploadStatus.cs
│   │   │   │   │   │   └── UploadStatus.cs.meta
│   │   │   │   │   ├── Api.meta
│   │   │   │   │   ├── AssemblyInfo.cs
│   │   │   │   │   ├── AssemblyInfo.cs.meta
│   │   │   │   │   ├── AssetStoreTools.cs
│   │   │   │   │   ├── AssetStoreTools.cs.meta
│   │   │   │   │   ├── AssetStoreToolsWindow.cs
│   │   │   │   │   ├── AssetStoreToolsWindow.cs.meta
│   │   │   │   │   ├── Constants.cs
│   │   │   │   │   ├── Constants.cs.meta
│   │   │   │   │   ├── Exporter/
│   │   │   │   │   │   ├── Abstractions/
│   │   │   │   │   │   │   ├── IPackageExporter.cs
│   │   │   │   │   │   │   ├── IPackageExporter.cs.meta
│   │   │   │   │   │   │   ├── IPreviewInjector.cs
│   │   │   │   │   │   │   ├── IPreviewInjector.cs.meta
│   │   │   │   │   │   │   ├── PackageExporterBase.cs
│   │   │   │   │   │   │   ├── PackageExporterBase.cs.meta
│   │   │   │   │   │   │   ├── PackageExporterSettings.cs
│   │   │   │   │   │   │   └── PackageExporterSettings.cs.meta
│   │   │   │   │   │   ├── Abstractions.meta
│   │   │   │   │   │   ├── DefaultExporterSettings.cs
│   │   │   │   │   │   ├── DefaultExporterSettings.cs.meta
│   │   │   │   │   │   ├── DefaultPackageExporter.cs
│   │   │   │   │   │   ├── DefaultPackageExporter.cs.meta
│   │   │   │   │   │   ├── LegacyExporterSettings.cs
│   │   │   │   │   │   ├── LegacyExporterSettings.cs.meta
│   │   │   │   │   │   ├── LegacyPackageExporter.cs
│   │   │   │   │   │   ├── LegacyPackageExporter.cs.meta
│   │   │   │   │   │   ├── PackageExporterResult.cs
│   │   │   │   │   │   ├── PackageExporterResult.cs.meta
│   │   │   │   │   │   ├── PreviewInjector.cs
│   │   │   │   │   │   └── PreviewInjector.cs.meta
│   │   │   │   │   ├── Exporter.meta
│   │   │   │   │   ├── Previews/
│   │   │   │   │   │   ├── Scripts/
│   │   │   │   │   │   │   ├── Data/
│   │   │   │   │   │   │   │   ├── CustomPreviewGenerationSettings.cs
│   │   │   │   │   │   │   │   ├── CustomPreviewGenerationSettings.cs.meta
│   │   │   │   │   │   │   │   ├── FileNameFormat.cs
│   │   │   │   │   │   │   │   ├── FileNameFormat.cs.meta
│   │   │   │   │   │   │   │   ├── GenerationType.cs
│   │   │   │   │   │   │   │   ├── GenerationType.cs.meta
│   │   │   │   │   │   │   │   ├── NativePreviewGenerationSettings.cs
│   │   │   │   │   │   │   │   ├── NativePreviewGenerationSettings.cs.meta
│   │   │   │   │   │   │   │   ├── PreviewDatabase.cs
│   │   │   │   │   │   │   │   ├── PreviewDatabase.cs.meta
│   │   │   │   │   │   │   │   ├── PreviewFormat.cs
│   │   │   │   │   │   │   │   ├── PreviewFormat.cs.meta
│   │   │   │   │   │   │   │   ├── PreviewGenerationResult.cs
│   │   │   │   │   │   │   │   ├── PreviewGenerationResult.cs.meta
│   │   │   │   │   │   │   │   ├── PreviewGenerationSettings.cs
│   │   │   │   │   │   │   │   ├── PreviewGenerationSettings.cs.meta
│   │   │   │   │   │   │   │   ├── PreviewMetadata.cs
│   │   │   │   │   │   │   │   └── PreviewMetadata.cs.meta
│   │   │   │   │   │   │   ├── Data.meta
│   │   │   │   │   │   │   ├── Generators/
│   │   │   │   │   │   │   │   ├── Custom/
│   │   │   │   │   │   │   │   │   ├── AudioChannel.cs
│   │   │   │   │   │   │   │   │   ├── AudioChannel.cs.meta
│   │   │   │   │   │   │   │   │   ├── AudioChannelCoordinate.cs
│   │   │   │   │   │   │   │   │   ├── AudioChannelCoordinate.cs.meta
│   │   │   │   │   │   │   │   │   ├── Screenshotters/
│   │   │   │   │   │   │   │   │   │   ├── ISceneScreenshotter.cs
│   │   │   │   │   │   │   │   │   │   ├── ISceneScreenshotter.cs.meta
│   │   │   │   │   │   │   │   │   │   ├── MaterialScreenshotter.cs
│   │   │   │   │   │   │   │   │   │   ├── MaterialScreenshotter.cs.meta
│   │   │   │   │   │   │   │   │   │   ├── MeshScreenshotter.cs
│   │   │   │   │   │   │   │   │   │   ├── MeshScreenshotter.cs.meta
│   │   │   │   │   │   │   │   │   │   ├── SceneScreenshotterBase.cs
│   │   │   │   │   │   │   │   │   │   ├── SceneScreenshotterBase.cs.meta
│   │   │   │   │   │   │   │   │   │   ├── SceneScreenshotterSettings.cs
│   │   │   │   │   │   │   │   │   │   └── SceneScreenshotterSettings.cs.meta
│   │   │   │   │   │   │   │   │   ├── Screenshotters.meta
│   │   │   │   │   │   │   │   │   ├── TypeGenerators/
│   │   │   │   │   │   │   │   │   │   ├── AudioTypeGeneratorSettings.cs
│   │   │   │   │   │   │   │   │   │   ├── AudioTypeGeneratorSettings.cs.meta
│   │   │   │   │   │   │   │   │   │   ├── AudioTypePreviewGenerator.cs
│   │   │   │   │   │   │   │   │   │   ├── AudioTypePreviewGenerator.cs.meta
│   │   │   │   │   │   │   │   │   │   ├── ITypePreviewGenerator.cs
│   │   │   │   │   │   │   │   │   │   ├── ITypePreviewGenerator.cs.meta
│   │   │   │   │   │   │   │   │   │   ├── MaterialTypePreviewGenerator.cs
│   │   │   │   │   │   │   │   │   │   ├── MaterialTypePreviewGenerator.cs.meta
│   │   │   │   │   │   │   │   │   │   ├── ModelTypePreviewGenerator.cs
│   │   │   │   │   │   │   │   │   │   ├── ModelTypePreviewGenerator.cs.meta
│   │   │   │   │   │   │   │   │   │   ├── PrefabTypePreviewGenerator.cs
│   │   │   │   │   │   │   │   │   │   ├── PrefabTypePreviewGenerator.cs.meta
│   │   │   │   │   │   │   │   │   │   ├── TextureTypeGeneratorSettings.cs
│   │   │   │   │   │   │   │   │   │   ├── TextureTypeGeneratorSettings.cs.meta
│   │   │   │   │   │   │   │   │   │   ├── TextureTypePreviewGenerator.cs
│   │   │   │   │   │   │   │   │   │   ├── TextureTypePreviewGenerator.cs.meta
│   │   │   │   │   │   │   │   │   │   ├── TypeGeneratorSettings.cs
│   │   │   │   │   │   │   │   │   │   ├── TypeGeneratorSettings.cs.meta
│   │   │   │   │   │   │   │   │   │   ├── TypePreviewGeneratorBase.cs
│   │   │   │   │   │   │   │   │   │   ├── TypePreviewGeneratorBase.cs.meta
│   │   │   │   │   │   │   │   │   │   ├── TypePreviewGeneratorFromScene.cs
│   │   │   │   │   │   │   │   │   │   ├── TypePreviewGeneratorFromScene.cs.meta
│   │   │   │   │   │   │   │   │   │   ├── TypePreviewGeneratorFromSceneSettings.cs
│   │   │   │   │   │   │   │   │   │   └── TypePreviewGeneratorFromSceneSettings.cs.meta
│   │   │   │   │   │   │   │   │   └── TypeGenerators.meta
│   │   │   │   │   │   │   │   ├── Custom.meta
│   │   │   │   │   │   │   │   ├── CustomPreviewGenerator.cs
│   │   │   │   │   │   │   │   ├── CustomPreviewGenerator.cs.meta
│   │   │   │   │   │   │   │   ├── IPreviewGenerator.cs
│   │   │   │   │   │   │   │   ├── IPreviewGenerator.cs.meta
│   │   │   │   │   │   │   │   ├── NativePreviewGenerator.cs
│   │   │   │   │   │   │   │   ├── NativePreviewGenerator.cs.meta
│   │   │   │   │   │   │   │   ├── PreviewGeneratorBase.cs
│   │   │   │   │   │   │   │   └── PreviewGeneratorBase.cs.meta
│   │   │   │   │   │   │   ├── Generators.meta
│   │   │   │   │   │   │   ├── Services/
│   │   │   │   │   │   │   │   ├── Caching/
│   │   │   │   │   │   │   │   │   ├── CachingService.cs
│   │   │   │   │   │   │   │   │   ├── CachingService.cs.meta
│   │   │   │   │   │   │   │   │   ├── ICachingService.cs
│   │   │   │   │   │   │   │   │   └── ICachingService.cs.meta
│   │   │   │   │   │   │   │   ├── Caching.meta
│   │   │   │   │   │   │   │   ├── IPreviewService.cs
│   │   │   │   │   │   │   │   ├── IPreviewService.cs.meta
│   │   │   │   │   │   │   │   ├── PreviewServiceProvider.cs
│   │   │   │   │   │   │   │   └── PreviewServiceProvider.cs.meta
│   │   │   │   │   │   │   ├── Services.meta
│   │   │   │   │   │   │   ├── UI/
│   │   │   │   │   │   │   │   ├── Data/
│   │   │   │   │   │   │   │   │   ├── AssetPreview.cs
│   │   │   │   │   │   │   │   │   ├── AssetPreview.cs.meta
│   │   │   │   │   │   │   │   │   ├── AssetPreviewCollection.cs
│   │   │   │   │   │   │   │   │   ├── AssetPreviewCollection.cs.meta
│   │   │   │   │   │   │   │   │   ├── IAssetPreview.cs
│   │   │   │   │   │   │   │   │   ├── IAssetPreview.cs.meta
│   │   │   │   │   │   │   │   │   ├── IAssetPreviewCollection.cs
│   │   │   │   │   │   │   │   │   ├── IAssetPreviewCollection.cs.meta
│   │   │   │   │   │   │   │   │   ├── IPreviewGeneratorSettings.cs
│   │   │   │   │   │   │   │   │   ├── IPreviewGeneratorSettings.cs.meta
│   │   │   │   │   │   │   │   │   ├── PreviewGeneratorSettings.cs
│   │   │   │   │   │   │   │   │   └── PreviewGeneratorSettings.cs.meta
│   │   │   │   │   │   │   │   ├── Data.meta
│   │   │   │   │   │   │   │   ├── Elements/
│   │   │   │   │   │   │   │   │   ├── AssetPreviewElement.cs
│   │   │   │   │   │   │   │   │   ├── AssetPreviewElement.cs.meta
│   │   │   │   │   │   │   │   │   ├── GridListElement.cs
│   │   │   │   │   │   │   │   │   ├── GridListElement.cs.meta
│   │   │   │   │   │   │   │   │   ├── PreviewCollectionElement.cs
│   │   │   │   │   │   │   │   │   ├── PreviewCollectionElement.cs.meta
│   │   │   │   │   │   │   │   │   ├── PreviewGenerateButtonElement.cs
│   │   │   │   │   │   │   │   │   ├── PreviewGenerateButtonElement.cs.meta
│   │   │   │   │   │   │   │   │   ├── PreviewGeneratorPathsElement.cs
│   │   │   │   │   │   │   │   │   ├── PreviewGeneratorPathsElement.cs.meta
│   │   │   │   │   │   │   │   │   ├── PreviewGeneratorSettingsElement.cs
│   │   │   │   │   │   │   │   │   ├── PreviewGeneratorSettingsElement.cs.meta
│   │   │   │   │   │   │   │   │   ├── PreviewWindowDescriptionElement.cs
│   │   │   │   │   │   │   │   │   └── PreviewWindowDescriptionElement.cs.meta
│   │   │   │   │   │   │   │   ├── Elements.meta
│   │   │   │   │   │   │   │   ├── PreviewGeneratorWindow.cs
│   │   │   │   │   │   │   │   ├── PreviewGeneratorWindow.cs.meta
│   │   │   │   │   │   │   │   ├── Views/
│   │   │   │   │   │   │   │   │   ├── PreviewListView.cs
│   │   │   │   │   │   │   │   │   └── PreviewListView.cs.meta
│   │   │   │   │   │   │   │   └── Views.meta
│   │   │   │   │   │   │   ├── UI.meta
│   │   │   │   │   │   │   ├── Utility/
│   │   │   │   │   │   │   │   ├── GraphicsUtility.cs
│   │   │   │   │   │   │   │   ├── GraphicsUtility.cs.meta
│   │   │   │   │   │   │   │   ├── PreviewConvertUtility.cs
│   │   │   │   │   │   │   │   ├── PreviewConvertUtility.cs.meta
│   │   │   │   │   │   │   │   ├── PreviewSceneUtility.cs
│   │   │   │   │   │   │   │   ├── PreviewSceneUtility.cs.meta
│   │   │   │   │   │   │   │   ├── RenderPipeline.cs
│   │   │   │   │   │   │   │   ├── RenderPipeline.cs.meta
│   │   │   │   │   │   │   │   ├── RenderPipelineUtility.cs
│   │   │   │   │   │   │   │   └── RenderPipelineUtility.cs.meta
│   │   │   │   │   │   │   └── Utility.meta
│   │   │   │   │   │   ├── Scripts.meta
│   │   │   │   │   │   ├── Styles/
│   │   │   │   │   │   │   ├── Style.uss
│   │   │   │   │   │   │   ├── Style.uss.meta
│   │   │   │   │   │   │   ├── ThemeDark.uss
│   │   │   │   │   │   │   ├── ThemeDark.uss.meta
│   │   │   │   │   │   │   ├── ThemeLight.uss
│   │   │   │   │   │   │   └── ThemeLight.uss.meta
│   │   │   │   │   │   └── Styles.meta
│   │   │   │   │   ├── Previews.meta
│   │   │   │   │   ├── Unity.AssetStoreTools.Editor.asmdef
│   │   │   │   │   ├── Unity.AssetStoreTools.Editor.asmdef.meta
│   │   │   │   │   ├── Uploader/
│   │   │   │   │   │   ├── Icons/
│   │   │   │   │   │   │   ├── account-dark.png.meta
│   │   │   │   │   │   │   ├── account-light.png.meta
│   │   │   │   │   │   │   ├── open-in-browser.png.meta
│   │   │   │   │   │   │   ├── publisher-portal-dark.png.meta
│   │   │   │   │   │   │   └── publisher-portal-light.png.meta
│   │   │   │   │   │   ├── Icons.meta
│   │   │   │   │   │   ├── Scripts/
│   │   │   │   │   │   │   ├── Data/
│   │   │   │   │   │   │   │   ├── Abstractions/
│   │   │   │   │   │   │   │   │   ├── IPackage.cs
│   │   │   │   │   │   │   │   │   ├── IPackage.cs.meta
│   │   │   │   │   │   │   │   │   ├── IPackageContent.cs
│   │   │   │   │   │   │   │   │   ├── IPackageContent.cs.meta
│   │   │   │   │   │   │   │   │   ├── IPackageGroup.cs
│   │   │   │   │   │   │   │   │   ├── IPackageGroup.cs.meta
│   │   │   │   │   │   │   │   │   ├── IWorkflow.cs
│   │   │   │   │   │   │   │   │   ├── IWorkflow.cs.meta
│   │   │   │   │   │   │   │   │   ├── IWorkflowServices.cs
│   │   │   │   │   │   │   │   │   ├── IWorkflowServices.cs.meta
│   │   │   │   │   │   │   │   │   ├── WorkflowBase.cs
│   │   │   │   │   │   │   │   │   └── WorkflowBase.cs.meta
│   │   │   │   │   │   │   │   ├── Abstractions.meta
│   │   │   │   │   │   │   │   ├── AssetsWorkflow.cs
│   │   │   │   │   │   │   │   ├── AssetsWorkflow.cs.meta
│   │   │   │   │   │   │   │   ├── HybridPackageWorkflow.cs
│   │   │   │   │   │   │   │   ├── HybridPackageWorkflow.cs.meta
│   │   │   │   │   │   │   │   ├── Package.cs
│   │   │   │   │   │   │   │   ├── Package.cs.meta
│   │   │   │   │   │   │   │   ├── PackageContent.cs
│   │   │   │   │   │   │   │   ├── PackageContent.cs.meta
│   │   │   │   │   │   │   │   ├── PackageGroup.cs
│   │   │   │   │   │   │   │   ├── PackageGroup.cs.meta
│   │   │   │   │   │   │   │   ├── PackageSorting.cs
│   │   │   │   │   │   │   │   ├── PackageSorting.cs.meta
│   │   │   │   │   │   │   │   ├── Serialization/
│   │   │   │   │   │   │   │   │   ├── AssetPath.cs
│   │   │   │   │   │   │   │   │   ├── AssetPath.cs.meta
│   │   │   │   │   │   │   │   │   ├── AssetsWorkflowStateData.cs
│   │   │   │   │   │   │   │   │   ├── AssetsWorkflowStateData.cs.meta
│   │   │   │   │   │   │   │   │   ├── HybridPackageWorkflowState.cs
│   │   │   │   │   │   │   │   │   ├── HybridPackageWorkflowState.cs.meta
│   │   │   │   │   │   │   │   │   ├── UnityPackageWorkflowStateData.cs
│   │   │   │   │   │   │   │   │   ├── UnityPackageWorkflowStateData.cs.meta
│   │   │   │   │   │   │   │   │   ├── WorkflowStateData.cs
│   │   │   │   │   │   │   │   │   └── WorkflowStateData.cs.meta
│   │   │   │   │   │   │   │   ├── Serialization.meta
│   │   │   │   │   │   │   │   ├── UnityPackageWorkflow.cs
│   │   │   │   │   │   │   │   ├── UnityPackageWorkflow.cs.meta
│   │   │   │   │   │   │   │   ├── WorkflowServices.cs
│   │   │   │   │   │   │   │   └── WorkflowServices.cs.meta
│   │   │   │   │   │   │   ├── Data.meta
│   │   │   │   │   │   │   ├── Services/
│   │   │   │   │   │   │   │   ├── Analytics/
│   │   │   │   │   │   │   │   │   ├── AnalyticsService.cs
│   │   │   │   │   │   │   │   │   ├── AnalyticsService.cs.meta
│   │   │   │   │   │   │   │   │   ├── Data/
│   │   │   │   │   │   │   │   │   │   ├── AuthenticationAnalytic.cs
│   │   │   │   │   │   │   │   │   │   ├── AuthenticationAnalytic.cs.meta
│   │   │   │   │   │   │   │   │   │   ├── BaseAnalytic.cs
│   │   │   │   │   │   │   │   │   │   ├── BaseAnalytic.cs.meta
│   │   │   │   │   │   │   │   │   │   ├── IAssetStoreAnalytic.cs
│   │   │   │   │   │   │   │   │   │   ├── IAssetStoreAnalytic.cs.meta
│   │   │   │   │   │   │   │   │   │   ├── IAssetStoreAnalyticData.cs
│   │   │   │   │   │   │   │   │   │   ├── IAssetStoreAnalyticData.cs.meta
│   │   │   │   │   │   │   │   │   │   ├── PackageUploadAnalytic.cs
│   │   │   │   │   │   │   │   │   │   ├── PackageUploadAnalytic.cs.meta
│   │   │   │   │   │   │   │   │   │   ├── ValidationResultsSerializer.cs
│   │   │   │   │   │   │   │   │   │   └── ValidationResultsSerializer.cs.meta
│   │   │   │   │   │   │   │   │   ├── Data.meta
│   │   │   │   │   │   │   │   │   ├── IAnalyticsService.cs
│   │   │   │   │   │   │   │   │   └── IAnalyticsService.cs.meta
│   │   │   │   │   │   │   │   ├── Analytics.meta
│   │   │   │   │   │   │   │   ├── Api/
│   │   │   │   │   │   │   │   │   ├── AuthenticationService.cs
│   │   │   │   │   │   │   │   │   ├── AuthenticationService.cs.meta
│   │   │   │   │   │   │   │   │   ├── IAuthenticationService.cs
│   │   │   │   │   │   │   │   │   ├── IAuthenticationService.cs.meta
│   │   │   │   │   │   │   │   │   ├── IPackageDownloadingService.cs
│   │   │   │   │   │   │   │   │   ├── IPackageDownloadingService.cs.meta
│   │   │   │   │   │   │   │   │   ├── IPackageUploadingService.cs
│   │   │   │   │   │   │   │   │   ├── IPackageUploadingService.cs.meta
│   │   │   │   │   │   │   │   │   ├── PackageDownloadingService.cs
│   │   │   │   │   │   │   │   │   ├── PackageDownloadingService.cs.meta
│   │   │   │   │   │   │   │   │   ├── PackageUploadingService.cs
│   │   │   │   │   │   │   │   │   └── PackageUploadingService.cs.meta
│   │   │   │   │   │   │   │   ├── Api.meta
│   │   │   │   │   │   │   │   ├── Caching/
│   │   │   │   │   │   │   │   │   ├── CachingService.cs
│   │   │   │   │   │   │   │   │   ├── CachingService.cs.meta
│   │   │   │   │   │   │   │   │   ├── ICachingService.cs
│   │   │   │   │   │   │   │   │   └── ICachingService.cs.meta
│   │   │   │   │   │   │   │   ├── Caching.meta
│   │   │   │   │   │   │   │   ├── IUploaderService.cs
│   │   │   │   │   │   │   │   ├── IUploaderService.cs.meta
│   │   │   │   │   │   │   │   ├── PackageFactory/
│   │   │   │   │   │   │   │   │   ├── IPackageFactoryService.cs
│   │   │   │   │   │   │   │   │   ├── IPackageFactoryService.cs.meta
│   │   │   │   │   │   │   │   │   ├── PackageFactoryService.cs
│   │   │   │   │   │   │   │   │   └── PackageFactoryService.cs.meta
│   │   │   │   │   │   │   │   ├── PackageFactory.meta
│   │   │   │   │   │   │   │   ├── UploaderServiceProvider.cs
│   │   │   │   │   │   │   │   └── UploaderServiceProvider.cs.meta
│   │   │   │   │   │   │   ├── Services.meta
│   │   │   │   │   │   │   ├── UI/
│   │   │   │   │   │   │   │   ├── Elements/
│   │   │   │   │   │   │   │   │   ├── Abstractions/
│   │   │   │   │   │   │   │   │   │   ├── ValidationElementBase.cs
│   │   │   │   │   │   │   │   │   │   ├── ValidationElementBase.cs.meta
│   │   │   │   │   │   │   │   │   │   ├── WorkflowElementBase.cs
│   │   │   │   │   │   │   │   │   │   └── WorkflowElementBase.cs.meta
│   │   │   │   │   │   │   │   │   ├── Abstractions.meta
│   │   │   │   │   │   │   │   │   ├── AccountToolbar.cs
│   │   │   │   │   │   │   │   │   ├── AccountToolbar.cs.meta
│   │   │   │   │   │   │   │   │   ├── AssetsWorkflowElement.cs
│   │   │   │   │   │   │   │   │   ├── AssetsWorkflowElement.cs.meta
│   │   │   │   │   │   │   │   │   ├── CurrentProjectValidationElement.cs
│   │   │   │   │   │   │   │   │   ├── CurrentProjectValidationElement.cs.meta
│   │   │   │   │   │   │   │   │   ├── ExternalProjectValidationElement.cs
│   │   │   │   │   │   │   │   │   ├── ExternalProjectValidationElement.cs.meta
│   │   │   │   │   │   │   │   │   ├── HybridPackageWorkflowElement.cs
│   │   │   │   │   │   │   │   │   ├── HybridPackageWorkflowElement.cs.meta
│   │   │   │   │   │   │   │   │   ├── LoadingSpinner.cs
│   │   │   │   │   │   │   │   │   ├── LoadingSpinner.cs.meta
│   │   │   │   │   │   │   │   │   ├── MultiToggleSelectionElement.cs
│   │   │   │   │   │   │   │   │   ├── MultiToggleSelectionElement.cs.meta
│   │   │   │   │   │   │   │   │   ├── PackageContentElement.cs
│   │   │   │   │   │   │   │   │   ├── PackageContentElement.cs.meta
│   │   │   │   │   │   │   │   │   ├── PackageElement.cs
│   │   │   │   │   │   │   │   │   ├── PackageElement.cs.meta
│   │   │   │   │   │   │   │   │   ├── PackageGroupElement.cs
│   │   │   │   │   │   │   │   │   ├── PackageGroupElement.cs.meta
│   │   │   │   │   │   │   │   │   ├── PackageListToolbar.cs
│   │   │   │   │   │   │   │   │   ├── PackageListToolbar.cs.meta
│   │   │   │   │   │   │   │   │   ├── PackageUploadElement.cs
│   │   │   │   │   │   │   │   │   ├── PackageUploadElement.cs.meta
│   │   │   │   │   │   │   │   │   ├── PathSelectionElement.cs
│   │   │   │   │   │   │   │   │   ├── PathSelectionElement.cs.meta
│   │   │   │   │   │   │   │   │   ├── PreviewGenerationElement.cs
│   │   │   │   │   │   │   │   │   ├── PreviewGenerationElement.cs.meta
│   │   │   │   │   │   │   │   │   ├── UnityPackageWorkflowElement.cs
│   │   │   │   │   │   │   │   │   └── UnityPackageWorkflowElement.cs.meta
│   │   │   │   │   │   │   │   ├── Elements.meta
│   │   │   │   │   │   │   │   ├── Views/
│   │   │   │   │   │   │   │   │   ├── LoginView.cs
│   │   │   │   │   │   │   │   │   ├── LoginView.cs.meta
│   │   │   │   │   │   │   │   │   ├── PackageListView.cs
│   │   │   │   │   │   │   │   │   └── PackageListView.cs.meta
│   │   │   │   │   │   │   │   └── Views.meta
│   │   │   │   │   │   │   └── UI.meta
│   │   │   │   │   │   ├── Scripts.meta
│   │   │   │   │   │   ├── Styles/
│   │   │   │   │   │   │   ├── LoginView/
│   │   │   │   │   │   │   │   ├── Style.uss
│   │   │   │   │   │   │   │   ├── Style.uss.meta
│   │   │   │   │   │   │   │   ├── ThemeDark.uss
│   │   │   │   │   │   │   │   ├── ThemeDark.uss.meta
│   │   │   │   │   │   │   │   ├── ThemeLight.uss
│   │   │   │   │   │   │   │   └── ThemeLight.uss.meta
│   │   │   │   │   │   │   ├── LoginView.meta
│   │   │   │   │   │   │   ├── PackageListView/
│   │   │   │   │   │   │   │   ├── Style.uss
│   │   │   │   │   │   │   │   ├── Style.uss.meta
│   │   │   │   │   │   │   │   ├── ThemeDark.uss
│   │   │   │   │   │   │   │   ├── ThemeDark.uss.meta
│   │   │   │   │   │   │   │   ├── ThemeLight.uss
│   │   │   │   │   │   │   │   └── ThemeLight.uss.meta
│   │   │   │   │   │   │   ├── PackageListView.meta
│   │   │   │   │   │   │   ├── Style.uss
│   │   │   │   │   │   │   ├── Style.uss.meta
│   │   │   │   │   │   │   ├── ThemeDark.uss
│   │   │   │   │   │   │   ├── ThemeDark.uss.meta
│   │   │   │   │   │   │   ├── ThemeLight.uss
│   │   │   │   │   │   │   └── ThemeLight.uss.meta
│   │   │   │   │   │   ├── Styles.meta
│   │   │   │   │   │   ├── UploaderWindow.cs
│   │   │   │   │   │   └── UploaderWindow.cs.meta
│   │   │   │   │   ├── Uploader.meta
│   │   │   │   │   ├── Utility/
│   │   │   │   │   │   ├── ASDebug.cs
│   │   │   │   │   │   ├── ASDebug.cs.meta
│   │   │   │   │   │   ├── ASToolsPreferences.cs
│   │   │   │   │   │   ├── ASToolsPreferences.cs.meta
│   │   │   │   │   │   ├── ASToolsUpdater.cs
│   │   │   │   │   │   ├── ASToolsUpdater.cs.meta
│   │   │   │   │   │   ├── CacheUtil.cs
│   │   │   │   │   │   ├── CacheUtil.cs.meta
│   │   │   │   │   │   ├── FileUtility.cs
│   │   │   │   │   │   ├── FileUtility.cs.meta
│   │   │   │   │   │   ├── LegacyToolsRemover.cs
│   │   │   │   │   │   ├── LegacyToolsRemover.cs.meta
│   │   │   │   │   │   ├── PackageUtility.cs
│   │   │   │   │   │   ├── PackageUtility.cs.meta
│   │   │   │   │   │   ├── ServiceProvider.cs
│   │   │   │   │   │   ├── ServiceProvider.cs.meta
│   │   │   │   │   │   ├── StyleSelector.cs
│   │   │   │   │   │   ├── StyleSelector.cs.meta
│   │   │   │   │   │   ├── Styles/
│   │   │   │   │   │   │   ├── Updater/
│   │   │   │   │   │   │   │   ├── Style.uss
│   │   │   │   │   │   │   │   ├── Style.uss.meta
│   │   │   │   │   │   │   │   ├── ThemeDark.uss
│   │   │   │   │   │   │   │   ├── ThemeDark.uss.meta
│   │   │   │   │   │   │   │   ├── ThemeLight.uss
│   │   │   │   │   │   │   │   └── ThemeLight.uss.meta
│   │   │   │   │   │   │   └── Updater.meta
│   │   │   │   │   │   ├── Styles.meta
│   │   │   │   │   │   ├── SymlinkUtil.cs
│   │   │   │   │   │   └── SymlinkUtil.cs.meta
│   │   │   │   │   ├── Utility.meta
│   │   │   │   │   ├── Validator/
│   │   │   │   │   │   ├── Icons/
│   │   │   │   │   │   │   ├── error.png.meta
│   │   │   │   │   │   │   ├── error_d.png.meta
│   │   │   │   │   │   │   ├── success.png.meta
│   │   │   │   │   │   │   ├── success_d.png.meta
│   │   │   │   │   │   │   ├── undefined.png.meta
│   │   │   │   │   │   │   ├── undefined_d.png.meta
│   │   │   │   │   │   │   ├── warning.png.meta
│   │   │   │   │   │   │   └── warning_d.png.meta
│   │   │   │   │   │   ├── Icons.meta
│   │   │   │   │   │   ├── Scripts/
│   │   │   │   │   │   │   ├── Categories/
│   │   │   │   │   │   │   │   ├── CategoryEvaluator.cs
│   │   │   │   │   │   │   │   ├── CategoryEvaluator.cs.meta
│   │   │   │   │   │   │   │   ├── ValidatorCategory.cs
│   │   │   │   │   │   │   │   └── ValidatorCategory.cs.meta
│   │   │   │   │   │   │   ├── Categories.meta
│   │   │   │   │   │   │   ├── CurrentProjectValidator.cs
│   │   │   │   │   │   │   ├── CurrentProjectValidator.cs.meta
│   │   │   │   │   │   │   ├── Data/
│   │   │   │   │   │   │   │   ├── CurrentProjectValidationSettings.cs
│   │   │   │   │   │   │   │   ├── CurrentProjectValidationSettings.cs.meta
│   │   │   │   │   │   │   │   ├── ExternalProjectValidationSettings.cs
│   │   │   │   │   │   │   │   ├── ExternalProjectValidationSettings.cs.meta
│   │   │   │   │   │   │   │   ├── MessageActions/
│   │   │   │   │   │   │   │   │   ├── HighlightObjectAction.cs
│   │   │   │   │   │   │   │   │   ├── HighlightObjectAction.cs.meta
│   │   │   │   │   │   │   │   │   ├── IMessageAction.cs
│   │   │   │   │   │   │   │   │   ├── IMessageAction.cs.meta
│   │   │   │   │   │   │   │   │   ├── OpenAssetAction.cs
│   │   │   │   │   │   │   │   │   └── OpenAssetAction.cs.meta
│   │   │   │   │   │   │   │   ├── MessageActions.meta
│   │   │   │   │   │   │   │   ├── TestResult.cs
│   │   │   │   │   │   │   │   ├── TestResult.cs.meta
│   │   │   │   │   │   │   │   ├── TestResultMessage.cs
│   │   │   │   │   │   │   │   ├── TestResultMessage.cs.meta
│   │   │   │   │   │   │   │   ├── TestResultObject.cs
│   │   │   │   │   │   │   │   ├── TestResultObject.cs.meta
│   │   │   │   │   │   │   │   ├── TestResultStatus.cs
│   │   │   │   │   │   │   │   ├── TestResultStatus.cs.meta
│   │   │   │   │   │   │   │   ├── ValidationResult.cs
│   │   │   │   │   │   │   │   ├── ValidationResult.cs.meta
│   │   │   │   │   │   │   │   ├── ValidationSettings.cs
│   │   │   │   │   │   │   │   ├── ValidationSettings.cs.meta
│   │   │   │   │   │   │   │   ├── ValidationStatus.cs
│   │   │   │   │   │   │   │   ├── ValidationStatus.cs.meta
│   │   │   │   │   │   │   │   ├── ValidationType.cs
│   │   │   │   │   │   │   │   └── ValidationType.cs.meta
│   │   │   │   │   │   │   ├── Data.meta
│   │   │   │   │   │   │   ├── ExternalProjectValidator.cs
│   │   │   │   │   │   │   ├── ExternalProjectValidator.cs.meta
│   │   │   │   │   │   │   ├── IValidator.cs
│   │   │   │   │   │   │   ├── IValidator.cs.meta
│   │   │   │   │   │   │   ├── Services/
│   │   │   │   │   │   │   │   ├── CachingService/
│   │   │   │   │   │   │   │   │   ├── CachingService.cs
│   │   │   │   │   │   │   │   │   ├── CachingService.cs.meta
│   │   │   │   │   │   │   │   │   ├── ICachingService.cs
│   │   │   │   │   │   │   │   │   ├── ICachingService.cs.meta
│   │   │   │   │   │   │   │   │   ├── PreviewDatabaseContractResolver.cs
│   │   │   │   │   │   │   │   │   └── PreviewDatabaseContractResolver.cs.meta
│   │   │   │   │   │   │   │   ├── CachingService.meta
│   │   │   │   │   │   │   │   ├── IValidatorService.cs
│   │   │   │   │   │   │   │   ├── IValidatorService.cs.meta
│   │   │   │   │   │   │   │   ├── Validation/
│   │   │   │   │   │   │   │   │   ├── Abstractions/
│   │   │   │   │   │   │   │   │   │   ├── IAssetUtilityService.cs
│   │   │   │   │   │   │   │   │   │   ├── IAssetUtilityService.cs.meta
│   │   │   │   │   │   │   │   │   │   ├── IFileSignatureUtilityService.cs
│   │   │   │   │   │   │   │   │   │   ├── IFileSignatureUtilityService.cs.meta
│   │   │   │   │   │   │   │   │   │   ├── IMeshUtilityService.cs
│   │   │   │   │   │   │   │   │   │   ├── IMeshUtilityService.cs.meta
│   │   │   │   │   │   │   │   │   │   ├── IModelUtilityService.cs
│   │   │   │   │   │   │   │   │   │   ├── IModelUtilityService.cs.meta
│   │   │   │   │   │   │   │   │   │   ├── ISceneUtilityService.cs
│   │   │   │   │   │   │   │   │   │   ├── ISceneUtilityService.cs.meta
│   │   │   │   │   │   │   │   │   │   ├── IScriptUtilityService.cs
│   │   │   │   │   │   │   │   │   │   └── IScriptUtilityService.cs.meta
│   │   │   │   │   │   │   │   │   ├── Abstractions.meta
│   │   │   │   │   │   │   │   │   ├── AssetUtilityService.cs
│   │   │   │   │   │   │   │   │   ├── AssetUtilityService.cs.meta
│   │   │   │   │   │   │   │   │   ├── Data/
│   │   │   │   │   │   │   │   │   │   ├── ArchiveType.cs
│   │   │   │   │   │   │   │   │   │   ├── ArchiveType.cs.meta
│   │   │   │   │   │   │   │   │   │   ├── AssetEnumerator.cs
│   │   │   │   │   │   │   │   │   │   ├── AssetEnumerator.cs.meta
│   │   │   │   │   │   │   │   │   │   ├── AssetType.cs
│   │   │   │   │   │   │   │   │   │   ├── AssetType.cs.meta
│   │   │   │   │   │   │   │   │   │   ├── LogEntry.cs
│   │   │   │   │   │   │   │   │   │   └── LogEntry.cs.meta
│   │   │   │   │   │   │   │   │   ├── Data.meta
│   │   │   │   │   │   │   │   │   ├── FileSignatureUtilityService.cs
│   │   │   │   │   │   │   │   │   ├── FileSignatureUtilityService.cs.meta
│   │   │   │   │   │   │   │   │   ├── MeshUtilityService.cs
│   │   │   │   │   │   │   │   │   ├── MeshUtilityService.cs.meta
│   │   │   │   │   │   │   │   │   ├── ModelUtilityService.cs
│   │   │   │   │   │   │   │   │   ├── ModelUtilityService.cs.meta
│   │   │   │   │   │   │   │   │   ├── SceneUtilityService.cs
│   │   │   │   │   │   │   │   │   ├── SceneUtilityService.cs.meta
│   │   │   │   │   │   │   │   │   ├── ScriptUtilityService.cs
│   │   │   │   │   │   │   │   │   └── ScriptUtilityService.cs.meta
│   │   │   │   │   │   │   │   ├── Validation.meta
│   │   │   │   │   │   │   │   ├── ValidatorServiceProvider.cs
│   │   │   │   │   │   │   │   └── ValidatorServiceProvider.cs.meta
│   │   │   │   │   │   │   ├── Services.meta
│   │   │   │   │   │   │   ├── Test Definitions/
│   │   │   │   │   │   │   │   ├── AutomatedTest.cs
│   │   │   │   │   │   │   │   ├── AutomatedTest.cs.meta
│   │   │   │   │   │   │   │   ├── GenericTestConfig.cs
│   │   │   │   │   │   │   │   ├── GenericTestConfig.cs.meta
│   │   │   │   │   │   │   │   ├── ITestConfig.cs
│   │   │   │   │   │   │   │   ├── ITestConfig.cs.meta
│   │   │   │   │   │   │   │   ├── ITestScript.cs
│   │   │   │   │   │   │   │   ├── ITestScript.cs.meta
│   │   │   │   │   │   │   │   ├── Scriptable Objects/
│   │   │   │   │   │   │   │   │   ├── AutomatedTestScriptableObject.cs
│   │   │   │   │   │   │   │   │   ├── AutomatedTestScriptableObject.cs.meta
│   │   │   │   │   │   │   │   │   ├── Editor/
│   │   │   │   │   │   │   │   │   │   ├── ValidationTestScriptableObjectInspector.cs
│   │   │   │   │   │   │   │   │   │   └── ValidationTestScriptableObjectInspector.cs.meta
│   │   │   │   │   │   │   │   │   ├── Editor.meta
│   │   │   │   │   │   │   │   │   ├── ValidationTestScriptableObject.cs
│   │   │   │   │   │   │   │   │   └── ValidationTestScriptableObject.cs.meta
│   │   │   │   │   │   │   │   ├── Scriptable Objects.meta
│   │   │   │   │   │   │   │   ├── ValidationTest.cs
│   │   │   │   │   │   │   │   └── ValidationTest.cs.meta
│   │   │   │   │   │   │   ├── Test Definitions.meta
│   │   │   │   │   │   │   ├── Test Methods/
│   │   │   │   │   │   │   │   ├── Generic/
│   │   │   │   │   │   │   │   │   ├── CheckAnimationClips.cs
│   │   │   │   │   │   │   │   │   ├── CheckAnimationClips.cs.meta
│   │   │   │   │   │   │   │   │   ├── CheckAudioClipping.cs
│   │   │   │   │   │   │   │   │   ├── CheckAudioClipping.cs.meta
│   │   │   │   │   │   │   │   │   ├── CheckColliders.cs
│   │   │   │   │   │   │   │   │   ├── CheckColliders.cs.meta
│   │   │   │   │   │   │   │   │   ├── CheckCompressedFiles.cs
│   │   │   │   │   │   │   │   │   ├── CheckCompressedFiles.cs.meta
│   │   │   │   │   │   │   │   │   ├── CheckEmptyPrefabs.cs
│   │   │   │   │   │   │   │   │   ├── CheckEmptyPrefabs.cs.meta
│   │   │   │   │   │   │   │   │   ├── CheckFileMenuNames.cs
│   │   │   │   │   │   │   │   │   ├── CheckFileMenuNames.cs.meta
│   │   │   │   │   │   │   │   │   ├── CheckLODs.cs
│   │   │   │   │   │   │   │   │   ├── CheckLODs.cs.meta
│   │   │   │   │   │   │   │   │   ├── CheckLineEndings.cs
│   │   │   │   │   │   │   │   │   ├── CheckLineEndings.cs.meta
│   │   │   │   │   │   │   │   │   ├── CheckMeshPrefabs.cs
│   │   │   │   │   │   │   │   │   ├── CheckMeshPrefabs.cs.meta
│   │   │   │   │   │   │   │   │   ├── CheckMissingComponentsinAssets.cs
│   │   │   │   │   │   │   │   │   ├── CheckMissingComponentsinAssets.cs.meta
│   │   │   │   │   │   │   │   │   ├── CheckMissingComponentsinScenes.cs
│   │   │   │   │   │   │   │   │   ├── CheckMissingComponentsinScenes.cs.meta
│   │   │   │   │   │   │   │   │   ├── CheckModelImportLogs.cs
│   │   │   │   │   │   │   │   │   ├── CheckModelImportLogs.cs.meta
│   │   │   │   │   │   │   │   │   ├── CheckModelOrientation.cs
│   │   │   │   │   │   │   │   │   ├── CheckModelOrientation.cs.meta
│   │   │   │   │   │   │   │   │   ├── CheckModelTypes.cs
│   │   │   │   │   │   │   │   │   ├── CheckModelTypes.cs.meta
│   │   │   │   │   │   │   │   │   ├── CheckNormalMapTextures.cs
│   │   │   │   │   │   │   │   │   ├── CheckNormalMapTextures.cs.meta
│   │   │   │   │   │   │   │   │   ├── CheckPackageNaming.cs
│   │   │   │   │   │   │   │   │   ├── CheckPackageNaming.cs.meta
│   │   │   │   │   │   │   │   │   ├── CheckParticleSystems.cs
│   │   │   │   │   │   │   │   │   ├── CheckParticleSystems.cs.meta
│   │   │   │   │   │   │   │   │   ├── CheckPathLengths.cs
│   │   │   │   │   │   │   │   │   ├── CheckPathLengths.cs.meta
│   │   │   │   │   │   │   │   │   ├── CheckPrefabTransforms.cs
│   │   │   │   │   │   │   │   │   ├── CheckPrefabTransforms.cs.meta
│   │   │   │   │   │   │   │   │   ├── CheckScriptCompilation.cs
│   │   │   │   │   │   │   │   │   ├── CheckScriptCompilation.cs.meta
│   │   │   │   │   │   │   │   │   ├── CheckShaderCompilation.cs
│   │   │   │   │   │   │   │   │   ├── CheckShaderCompilation.cs.meta
│   │   │   │   │   │   │   │   │   ├── CheckTextureDimensions.cs
│   │   │   │   │   │   │   │   │   ├── CheckTextureDimensions.cs.meta
│   │   │   │   │   │   │   │   │   ├── CheckTypeNamespaces.cs
│   │   │   │   │   │   │   │   │   ├── CheckTypeNamespaces.cs.meta
│   │   │   │   │   │   │   │   │   ├── RemoveExecutableFiles.cs
│   │   │   │   │   │   │   │   │   ├── RemoveExecutableFiles.cs.meta
│   │   │   │   │   │   │   │   │   ├── RemoveJPGFiles.cs
│   │   │   │   │   │   │   │   │   ├── RemoveJPGFiles.cs.meta
│   │   │   │   │   │   │   │   │   ├── RemoveJavaScriptFiles.cs
│   │   │   │   │   │   │   │   │   ├── RemoveJavaScriptFiles.cs.meta
│   │   │   │   │   │   │   │   │   ├── RemoveLossyAudioFiles.cs
│   │   │   │   │   │   │   │   │   ├── RemoveLossyAudioFiles.cs.meta
│   │   │   │   │   │   │   │   │   ├── RemoveMixamoFiles.cs
│   │   │   │   │   │   │   │   │   ├── RemoveMixamoFiles.cs.meta
│   │   │   │   │   │   │   │   │   ├── RemoveSpeedTreeFiles.cs
│   │   │   │   │   │   │   │   │   ├── RemoveSpeedTreeFiles.cs.meta
│   │   │   │   │   │   │   │   │   ├── RemoveVideoFiles.cs
│   │   │   │   │   │   │   │   │   └── RemoveVideoFiles.cs.meta
│   │   │   │   │   │   │   │   ├── Generic.meta
│   │   │   │   │   │   │   │   ├── UnityPackage/
│   │   │   │   │   │   │   │   │   ├── CheckDemoScenes.cs
│   │   │   │   │   │   │   │   │   ├── CheckDemoScenes.cs.meta
│   │   │   │   │   │   │   │   │   ├── CheckDocumentation.cs
│   │   │   │   │   │   │   │   │   ├── CheckDocumentation.cs.meta
│   │   │   │   │   │   │   │   │   ├── CheckPackageSize.cs
│   │   │   │   │   │   │   │   │   ├── CheckPackageSize.cs.meta
│   │   │   │   │   │   │   │   │   ├── CheckProjectTemplateAssets.cs
│   │   │   │   │   │   │   │   │   └── CheckProjectTemplateAssets.cs.meta
│   │   │   │   │   │   │   │   └── UnityPackage.meta
│   │   │   │   │   │   │   ├── Test Methods.meta
│   │   │   │   │   │   │   ├── UI/
│   │   │   │   │   │   │   │   ├── Data/
│   │   │   │   │   │   │   │   │   ├── Abstractions/
│   │   │   │   │   │   │   │   │   │   ├── IValidatorResults.cs
│   │   │   │   │   │   │   │   │   │   ├── IValidatorResults.cs.meta
│   │   │   │   │   │   │   │   │   │   ├── IValidatorSettings.cs
│   │   │   │   │   │   │   │   │   │   ├── IValidatorSettings.cs.meta
│   │   │   │   │   │   │   │   │   │   ├── IValidatorTest.cs
│   │   │   │   │   │   │   │   │   │   ├── IValidatorTest.cs.meta
│   │   │   │   │   │   │   │   │   │   ├── IValidatorTestGroup.cs
│   │   │   │   │   │   │   │   │   │   └── IValidatorTestGroup.cs.meta
│   │   │   │   │   │   │   │   │   ├── Abstractions.meta
│   │   │   │   │   │   │   │   │   ├── Serialization/
│   │   │   │   │   │   │   │   │   │   ├── ValidatorStateData.cs
│   │   │   │   │   │   │   │   │   │   ├── ValidatorStateData.cs.meta
│   │   │   │   │   │   │   │   │   │   ├── ValidatorStateDataContractResolver.cs
│   │   │   │   │   │   │   │   │   │   ├── ValidatorStateDataContractResolver.cs.meta
│   │   │   │   │   │   │   │   │   │   ├── ValidatorStateResults.cs
│   │   │   │   │   │   │   │   │   │   ├── ValidatorStateResults.cs.meta
│   │   │   │   │   │   │   │   │   │   ├── ValidatorStateSettings.cs
│   │   │   │   │   │   │   │   │   │   └── ValidatorStateSettings.cs.meta
│   │   │   │   │   │   │   │   │   ├── Serialization.meta
│   │   │   │   │   │   │   │   │   ├── ValidatorResults.cs
│   │   │   │   │   │   │   │   │   ├── ValidatorResults.cs.meta
│   │   │   │   │   │   │   │   │   ├── ValidatorSettings.cs
│   │   │   │   │   │   │   │   │   ├── ValidatorSettings.cs.meta
│   │   │   │   │   │   │   │   │   ├── ValidatorTest.cs
│   │   │   │   │   │   │   │   │   ├── ValidatorTest.cs.meta
│   │   │   │   │   │   │   │   │   ├── ValidatorTestGroup.cs
│   │   │   │   │   │   │   │   │   └── ValidatorTestGroup.cs.meta
│   │   │   │   │   │   │   │   ├── Data.meta
│   │   │   │   │   │   │   │   ├── Elements/
│   │   │   │   │   │   │   │   │   ├── ValidatorButtonElement.cs
│   │   │   │   │   │   │   │   │   ├── ValidatorButtonElement.cs.meta
│   │   │   │   │   │   │   │   │   ├── ValidatorDescriptionElement.cs
│   │   │   │   │   │   │   │   │   ├── ValidatorDescriptionElement.cs.meta
│   │   │   │   │   │   │   │   │   ├── ValidatorPathsElement.cs
│   │   │   │   │   │   │   │   │   ├── ValidatorPathsElement.cs.meta
│   │   │   │   │   │   │   │   │   ├── ValidatorResultsElement.cs
│   │   │   │   │   │   │   │   │   ├── ValidatorResultsElement.cs.meta
│   │   │   │   │   │   │   │   │   ├── ValidatorSettingsElement.cs
│   │   │   │   │   │   │   │   │   ├── ValidatorSettingsElement.cs.meta
│   │   │   │   │   │   │   │   │   ├── ValidatorTestElement.cs
│   │   │   │   │   │   │   │   │   ├── ValidatorTestElement.cs.meta
│   │   │   │   │   │   │   │   │   ├── ValidatorTestGroupElement.cs
│   │   │   │   │   │   │   │   │   └── ValidatorTestGroupElement.cs.meta
│   │   │   │   │   │   │   │   ├── Elements.meta
│   │   │   │   │   │   │   │   ├── ValidatorWindow.cs
│   │   │   │   │   │   │   │   ├── ValidatorWindow.cs.meta
│   │   │   │   │   │   │   │   ├── Views/
│   │   │   │   │   │   │   │   │   ├── ValidatorTestsView.cs
│   │   │   │   │   │   │   │   │   └── ValidatorTestsView.cs.meta
│   │   │   │   │   │   │   │   └── Views.meta
│   │   │   │   │   │   │   ├── UI.meta
│   │   │   │   │   │   │   ├── Utility/
│   │   │   │   │   │   │   │   ├── ValidatorUtility.cs
│   │   │   │   │   │   │   │   └── ValidatorUtility.cs.meta
│   │   │   │   │   │   │   ├── Utility.meta
│   │   │   │   │   │   │   ├── ValidatorBase.cs
│   │   │   │   │   │   │   └── ValidatorBase.cs.meta
│   │   │   │   │   │   ├── Scripts.meta
│   │   │   │   │   │   ├── Styles/
│   │   │   │   │   │   │   ├── Style.uss
│   │   │   │   │   │   │   ├── Style.uss.meta
│   │   │   │   │   │   │   ├── ThemeDark.uss
│   │   │   │   │   │   │   ├── ThemeDark.uss.meta
│   │   │   │   │   │   │   ├── ThemeLight.uss
│   │   │   │   │   │   │   └── ThemeLight.uss.meta
│   │   │   │   │   │   ├── Styles.meta
│   │   │   │   │   │   ├── Tests/
│   │   │   │   │   │   │   ├── Generic/
│   │   │   │   │   │   │   │   ├── Check Animation Clips.asset.meta
│   │   │   │   │   │   │   │   ├── Check Audio Clipping.asset.meta
│   │   │   │   │   │   │   │   ├── Check Colliders.asset.meta
│   │   │   │   │   │   │   │   ├── Check Compressed Files.asset.meta
│   │   │   │   │   │   │   │   ├── Check Empty Prefabs.asset.meta
│   │   │   │   │   │   │   │   ├── Check File Menu Names.asset.meta
│   │   │   │   │   │   │   │   ├── Check LODs.asset.meta
│   │   │   │   │   │   │   │   ├── Check Line Endings.asset.meta
│   │   │   │   │   │   │   │   ├── Check Mesh Prefabs.asset.meta
│   │   │   │   │   │   │   │   ├── Check Missing Components in Assets.asset.meta
│   │   │   │   │   │   │   │   ├── Check Missing Components in Scenes.asset.meta
│   │   │   │   │   │   │   │   ├── Check Model Import Logs.asset.meta
│   │   │   │   │   │   │   │   ├── Check Model Orientation.asset.meta
│   │   │   │   │   │   │   │   ├── Check Model Types.asset.meta
│   │   │   │   │   │   │   │   ├── Check Normal Map Textures.asset.meta
│   │   │   │   │   │   │   │   ├── Check Package Naming.asset.meta
│   │   │   │   │   │   │   │   ├── Check Particle Systems.asset.meta
│   │   │   │   │   │   │   │   ├── Check Path Lengths.asset.meta
│   │   │   │   │   │   │   │   ├── Check Prefab Transforms.asset.meta
│   │   │   │   │   │   │   │   ├── Check Script Compilation.asset.meta
│   │   │   │   │   │   │   │   ├── Check Shader Compilation.asset.meta
│   │   │   │   │   │   │   │   ├── Check Texture Dimensions.asset.meta
│   │   │   │   │   │   │   │   ├── Check Type Namespaces.asset.meta
│   │   │   │   │   │   │   │   ├── Remove Executable Files.asset.meta
│   │   │   │   │   │   │   │   ├── Remove JPG Files.asset.meta
│   │   │   │   │   │   │   │   ├── Remove JavaScript Files.asset.meta
│   │   │   │   │   │   │   │   ├── Remove Lossy Audio Files.asset.meta
│   │   │   │   │   │   │   │   ├── Remove Mixamo Files.asset.meta
│   │   │   │   │   │   │   │   ├── Remove SpeedTree Files.asset.meta
│   │   │   │   │   │   │   │   └── Remove Video Files.asset.meta
│   │   │   │   │   │   │   ├── Generic.meta
│   │   │   │   │   │   │   ├── UnityPackage/
│   │   │   │   │   │   │   │   ├── Check Demo Scenes.asset.meta
│   │   │   │   │   │   │   │   ├── Check Documentation.asset.meta
│   │   │   │   │   │   │   │   ├── Check Package Size.asset.meta
│   │   │   │   │   │   │   │   └── Check Project Template Assets.asset.meta
│   │   │   │   │   │   │   └── UnityPackage.meta
│   │   │   │   │   │   └── Tests.meta
│   │   │   │   │   └── Validator.meta
│   │   │   │   ├── Editor.meta
│   │   │   │   ├── LICENSE.md
│   │   │   │   ├── LICENSE.md.meta
│   │   │   │   ├── package.json
│   │   │   │   └── package.json.meta
│   │   │   ├── manifest.json
│   │   │   └── packages-lock.json
│   │   └── ProjectSettings/
│   │       ├── BurstAotSettings_StandaloneWindows.json
│   │       ├── CommonBurstAotSettings.json
│   │       ├── ProjectVersion.txt
│   │       └── SceneTemplateSettings.json
│   └── UnityMCPTests/
│       ├── .gitignore
│       ├── Assets/
│       │   ├── Packages.meta
│       │   ├── Scenes/
│       │   │   ├── SampleScene.unity
│       │   │   ├── SampleScene.unity.meta
│       │   │   ├── Test.unity/
│       │   │   │   ├── Test.unity
│       │   │   │   └── Test.unity.meta
│       │   │   └── Test.unity.meta
│       │   ├── Scenes.meta
│       │   ├── Scripts/
│       │   │   ├── Bouncer.cs
│       │   │   ├── Bouncer.cs.meta
│       │   │   ├── Hello.cs
│       │   │   ├── Hello.cs.meta
│       │   │   ├── LongUnityScriptClaudeTest.cs
│       │   │   ├── LongUnityScriptClaudeTest.cs.meta
│       │   │   ├── TestAsmdef/
│       │   │   │   ├── CustomComponent.cs
│       │   │   │   ├── CustomComponent.cs.meta
│       │   │   │   ├── TestAsmdef.asmdef
│       │   │   │   ├── TestAsmdef.asmdef.meta
│       │   │   │   ├── UnityEventTestComponent.cs
│       │   │   │   └── UnityEventTestComponent.cs.meta
│       │   │   └── TestAsmdef.meta
│       │   ├── Scripts.meta
│       │   ├── Temp.meta
│       │   ├── TestMat.mat
│       │   ├── TestMat.mat.meta
│       │   ├── Tests/
│       │   │   ├── EditMode/
│       │   │   │   ├── Helpers/
│       │   │   │   │   ├── AssetPathUtilityOfflineTests.cs
│       │   │   │   │   ├── AssetPathUtilityOfflineTests.cs.meta
│       │   │   │   │   ├── CodexConfigHelperTests.cs
│       │   │   │   │   ├── CodexConfigHelperTests.cs.meta
│       │   │   │   │   ├── Matrix4x4ConverterTests.cs
│       │   │   │   │   ├── Matrix4x4ConverterTests.cs.meta
│       │   │   │   │   ├── PaginationTests.cs
│       │   │   │   │   ├── PaginationTests.cs.meta
│       │   │   │   │   ├── ToolParamsTests.cs
│       │   │   │   │   ├── ToolParamsTests.cs.meta
│       │   │   │   │   ├── WriteToConfigTests.cs
│       │   │   │   │   └── WriteToConfigTests.cs.meta
│       │   │   │   ├── Helpers.meta
│       │   │   │   ├── MCPForUnityTests.Editor.asmdef
│       │   │   │   ├── MCPForUnityTests.Editor.asmdef.meta
│       │   │   │   ├── Resources/
│       │   │   │   │   ├── GetMenuItemsTests.cs
│       │   │   │   │   └── GetMenuItemsTests.cs.meta
│       │   │   │   ├── Resources.meta
│       │   │   │   ├── Services/
│       │   │   │   │   ├── Characterization/
│       │   │   │   │   │   ├── ServerManagementServiceCharacterizationTests.cs
│       │   │   │   │   │   ├── ServerManagementServiceCharacterizationTests.cs.meta
│       │   │   │   │   │   ├── Services_Characterization.cs
│       │   │   │   │   │   └── Services_Characterization.cs.meta
│       │   │   │   │   ├── Characterization.meta
│       │   │   │   │   ├── EditorConfigurationCacheTests.cs
│       │   │   │   │   ├── EditorConfigurationCacheTests.cs.meta
│       │   │   │   │   ├── PackageUpdateServiceTests.cs
│       │   │   │   │   ├── PackageUpdateServiceTests.cs.meta
│       │   │   │   │   ├── PortManagerTests.cs
│       │   │   │   │   ├── PortManagerTests.cs.meta
│       │   │   │   │   ├── Server/
│       │   │   │   │   │   ├── PidFileManagerTests.cs
│       │   │   │   │   │   ├── PidFileManagerTests.cs.meta
│       │   │   │   │   │   ├── ProcessDetectorTests.cs
│       │   │   │   │   │   ├── ProcessDetectorTests.cs.meta
│       │   │   │   │   │   ├── ProcessTerminatorTests.cs
│       │   │   │   │   │   ├── ProcessTerminatorTests.cs.meta
│       │   │   │   │   │   ├── ServerCommandBuilderTests.cs
│       │   │   │   │   │   ├── ServerCommandBuilderTests.cs.meta
│       │   │   │   │   │   ├── TerminalLauncherTests.cs
│       │   │   │   │   │   └── TerminalLauncherTests.cs.meta
│       │   │   │   │   ├── Server.meta
│       │   │   │   │   ├── StdioBridgeReconnectTests.cs
│       │   │   │   │   ├── StdioBridgeReconnectTests.cs.meta
│       │   │   │   │   ├── ToolDiscoveryServiceTests.cs
│       │   │   │   │   ├── ToolDiscoveryServiceTests.cs.meta
│       │   │   │   │   ├── WebSocketTransportClientTests.cs
│       │   │   │   │   └── WebSocketTransportClientTests.cs.meta
│       │   │   │   ├── Services.meta
│       │   │   │   ├── TestUtilities.cs
│       │   │   │   ├── TestUtilities.cs.meta
│       │   │   │   ├── Tools/
│       │   │   │   │   ├── AIPropertyMatchingTests.cs
│       │   │   │   │   ├── AIPropertyMatchingTests.cs.meta
│       │   │   │   │   ├── BatchExecuteKeyPreservationTests.cs
│       │   │   │   │   ├── BatchExecuteKeyPreservationTests.cs.meta
│       │   │   │   │   ├── Characterization/
│       │   │   │   │   │   ├── EditorTools_Characterization.cs
│       │   │   │   │   │   └── EditorTools_Characterization.cs.meta
│       │   │   │   │   ├── Characterization.meta
│       │   │   │   │   ├── CommandRegistryTests.cs
│       │   │   │   │   ├── CommandRegistryTests.cs.meta
│       │   │   │   │   ├── ComponentOpsUnityEventTests.cs
│       │   │   │   │   ├── ComponentOpsUnityEventTests.cs.meta
│       │   │   │   │   ├── ComponentResolverTests.cs
│       │   │   │   │   ├── ComponentResolverTests.cs.meta
│       │   │   │   │   ├── DomainReloadResilienceTests.cs
│       │   │   │   │   ├── DomainReloadResilienceTests.cs.meta
│       │   │   │   │   ├── ExecuteMenuItemTests.cs
│       │   │   │   │   ├── ExecuteMenuItemTests.cs.meta
│       │   │   │   │   ├── Fixtures/
│       │   │   │   │   │   ├── ManageScriptableObjectTestDefinition.cs
│       │   │   │   │   │   ├── ManageScriptableObjectTestDefinition.cs.meta
│       │   │   │   │   │   ├── ManageScriptableObjectTestDefinitionBase.cs
│       │   │   │   │   │   ├── ManageScriptableObjectTestDefinitionBase.cs.meta
│       │   │   │   │   │   ├── StressTestSOs/
│       │   │   │   │   │   │   ├── ArrayStressSO.cs
│       │   │   │   │   │   │   ├── ArrayStressSO.cs.meta
│       │   │   │   │   │   │   ├── ComplexStressSO.cs
│       │   │   │   │   │   │   ├── ComplexStressSO.cs.meta
│       │   │   │   │   │   │   ├── DeepStressSO.cs
│       │   │   │   │   │   │   └── DeepStressSO.cs.meta
│       │   │   │   │   │   └── StressTestSOs.meta
│       │   │   │   │   ├── Fixtures.meta
│       │   │   │   │   ├── GameObjectAPIStressTests.cs
│       │   │   │   │   ├── GameObjectAPIStressTests.cs.meta
│       │   │   │   │   ├── GameObjectComponentHelpersErrorTests.cs
│       │   │   │   │   ├── GameObjectComponentHelpersErrorTests.cs.meta
│       │   │   │   │   ├── MCPToolParameterTests.cs
│       │   │   │   │   ├── MCPToolParameterTests.cs.meta
│       │   │   │   │   ├── ManageAnimationTests.cs
│       │   │   │   │   ├── ManageAnimationTests.cs.meta
│       │   │   │   │   ├── ManageGameObjectCreateTests.cs
│       │   │   │   │   ├── ManageGameObjectCreateTests.cs.meta
│       │   │   │   │   ├── ManageGameObjectDeleteTests.cs
│       │   │   │   │   ├── ManageGameObjectDeleteTests.cs.meta
│       │   │   │   │   ├── ManageGameObjectModifyTests.cs
│       │   │   │   │   ├── ManageGameObjectModifyTests.cs.meta
│       │   │   │   │   ├── ManageGameObjectTests.cs
│       │   │   │   │   ├── ManageGameObjectTests.cs.meta
│       │   │   │   │   ├── ManageGraphicsTests.cs
│       │   │   │   │   ├── ManageMaterialPropertiesTests.cs
│       │   │   │   │   ├── ManageMaterialPropertiesTests.cs.meta
│       │   │   │   │   ├── ManageMaterialReproTests.cs
│       │   │   │   │   ├── ManageMaterialReproTests.cs.meta
│       │   │   │   │   ├── ManageMaterialStressTests.cs
│       │   │   │   │   ├── ManageMaterialStressTests.cs.meta
│       │   │   │   │   ├── ManageMaterialTests.cs
│       │   │   │   │   ├── ManageMaterialTests.cs.meta
│       │   │   │   │   ├── ManagePrefabsCrudTests.cs
│       │   │   │   │   ├── ManagePrefabsCrudTests.cs.meta
│       │   │   │   │   ├── ManageProBuilderTests.cs
│       │   │   │   │   ├── ManageProBuilderTests.cs.meta
│       │   │   │   │   ├── ManageSceneHierarchyPagingTests.cs
│       │   │   │   │   ├── ManageSceneHierarchyPagingTests.cs.meta
│       │   │   │   │   ├── ManageScriptDelimiterTests.cs
│       │   │   │   │   ├── ManageScriptDelimiterTests.cs.meta
│       │   │   │   │   ├── ManageScriptValidationTests.cs
│       │   │   │   │   ├── ManageScriptValidationTests.cs.meta
│       │   │   │   │   ├── ManageScriptableObjectStressTests.cs
│       │   │   │   │   ├── ManageScriptableObjectStressTests.cs.meta
│       │   │   │   │   ├── ManageScriptableObjectTests.cs
│       │   │   │   │   ├── ManageScriptableObjectTests.cs.meta
│       │   │   │   │   ├── ManageUITests.cs
│       │   │   │   │   ├── ManageUITests.cs.meta
│       │   │   │   │   ├── MaterialDirectPropertiesTests.cs
│       │   │   │   │   ├── MaterialDirectPropertiesTests.cs.meta
│       │   │   │   │   ├── MaterialMeshInstantiationTests.cs
│       │   │   │   │   ├── MaterialMeshInstantiationTests.cs.meta
│       │   │   │   │   ├── MaterialParameterToolTests.cs
│       │   │   │   │   ├── MaterialParameterToolTests.cs.meta
│       │   │   │   │   ├── PropertyConversionErrorHandlingTests.cs
│       │   │   │   │   ├── PropertyConversionErrorHandlingTests.cs.meta
│       │   │   │   │   ├── PropertyConversion_ArrayForFloat_Test.cs
│       │   │   │   │   ├── PropertyConversion_ArrayForFloat_Test.cs.meta
│       │   │   │   │   ├── ReadConsoleTests.cs
│       │   │   │   │   ├── ReadConsoleTests.cs.meta
│       │   │   │   │   ├── RunTestsTests.cs
│       │   │   │   │   ├── RunTestsTests.cs.meta
│       │   │   │   │   ├── UIDocumentSerializationTests.cs
│       │   │   │   │   ├── UIDocumentSerializationTests.cs.meta
│       │   │   │   │   ├── UnityReflectTests.cs
│       │   │   │   │   └── UnityReflectTests.cs.meta
│       │   │   │   ├── Tools.meta
│       │   │   │   ├── Windows/
│       │   │   │   │   ├── Characterization/
│       │   │   │   │   │   ├── Windows_Characterization.cs
│       │   │   │   │   │   └── Windows_Characterization.cs.meta
│       │   │   │   │   └── Characterization.meta
│       │   │   │   └── Windows.meta
│       │   │   ├── EditMode.meta
│       │   │   ├── Editor.meta
│       │   │   ├── PlayMode/
│       │   │   │   ├── MCPForUnityTests.PlayMode.asmdef
│       │   │   │   ├── MCPForUnityTests.PlayMode.asmdef.meta
│       │   │   │   ├── PlayModeBasicTests.cs
│       │   │   │   └── PlayModeBasicTests.cs.meta
│       │   │   └── PlayMode.meta
│       │   ├── Tests.meta
│       │   ├── UI Toolkit/
│       │   │   ├── UnityThemes/
│       │   │   │   ├── UnityDefaultRuntimeTheme.tss
│       │   │   │   └── UnityDefaultRuntimeTheme.tss.meta
│       │   │   └── UnityThemes.meta
│       │   └── UI Toolkit.meta
│       ├── Packages/
│       │   └── manifest.json
│       └── ProjectSettings/
│           ├── Packages/
│           │   └── com.unity.testtools.codecoverage/
│           │       └── Settings.json
│           ├── ProjectVersion.txt
│           └── SceneTemplateSettings.json
├── docker-compose.yml
├── docs/
│   ├── development/
│   │   ├── README-DEV-zh.md
│   │   └── README-DEV.md
│   ├── feature-roadmap-2026.md
│   ├── guides/
│   │   ├── CLI_EXAMPLE.md
│   │   ├── CLI_USAGE.md
│   │   ├── CURSOR_HELP.md
│   │   ├── MCP_CLIENT_CONFIGURATORS.md
│   │   ├── RELEASING.md
│   │   └── REMOTE_SERVER_AUTH.md
│   ├── i18n/
│   │   └── README-zh.md
│   ├── migrations/
│   │   ├── v5_MIGRATION.md
│   │   ├── v6_NEW_UI_CHANGES.md
│   │   └── v8_NEW_NETWORKING_SETUP.md
│   └── reference/
│       ├── CUSTOM_TOOLS.md
│       ├── REMOTE_SERVER_AUTH_ARCHITECTURE.md
│       └── TELEMETRY.md
├── manifest.json
├── mcp_source.py
├── scripts/
│   └── validate-nlt-coverage.sh
├── tools/
│   ├── UPDATE_DOCS_PROMPT.md
│   ├── docker_publish.sh
│   ├── generate_mcpb.py
│   ├── prepare_unity_asset_store_release.py
│   ├── pypi_publish.sh
│   ├── stress_editor_state.py
│   ├── stress_mcp.py
│   ├── tests/
│   │   ├── __init__.py
│   │   └── test_build_release_characterization.py
│   ├── update_fork.bat
│   ├── update_fork.sh
│   └── update_versions.py
└── unity-mcp-skill/
    ├── SKILL.md
    └── references/
        ├── probuilder-guide.md
        ├── resources-reference.md
        ├── tools-reference.md
        └── workflows.md

================================================
FILE CONTENTS
================================================

================================================
FILE: .dockerignore
================================================
Server/build
.git
.venv
__pycache__
*.pyc
.DS_Store


================================================
FILE: .github/actions/publish-docker/action.yml
================================================
name: Publish Docker image
description: Build and push the Docker image to Docker Hub
inputs:
  docker_username:
    required: true
    description: Docker Hub username
  docker_password:
    required: true
    description: Docker Hub password
  image:
    required: true
    description: Docker image name (e.g. user/repo)
  version:
    required: false
    default: ""
    description: Optional version string (e.g. 1.2.3). If provided, tags are computed from this version instead of the GitHub ref.
  include_branch_tags:
    required: false
    default: "true"
    description: Whether to also publish a branch tag when running on a branch ref (e.g. manual runs).
  context:
    required: false
    default: .
    description: Docker build context
  dockerfile:
    required: false
    default: Server/Dockerfile
    description: Path to Dockerfile
  platforms:
    required: false
    default: linux/amd64
    description: Target platforms
runs:
  using: composite
  steps:
    - name: Log in to Docker Hub
      uses: docker/login-action@v3
      with:
        username: ${{ inputs.docker_username }}
        password: ${{ inputs.docker_password }}

    - name: Extract metadata (tags, labels) for Docker
      id: meta
      uses: docker/metadata-action@v5
      if: ${{ inputs.version == '' && inputs.include_branch_tags == 'true' }}
      with:
        images: ${{ inputs.image }}
        tags: |
          type=semver,pattern={{version}}
          type=semver,pattern={{major}}.{{minor}}
          type=semver,pattern={{major}}
          type=ref,event=branch

    - name: Extract metadata (tags, labels) for Docker
      id: meta_nobranch
      uses: docker/metadata-action@v5
      if: ${{ inputs.version == '' && inputs.include_branch_tags != 'true' }}
      with:
        images: ${{ inputs.image }}
        tags: |
          type=semver,pattern={{version}}
          type=semver,pattern={{major}}.{{minor}}
          type=semver,pattern={{major}}

    - name: Compute Docker tags from version
      id: version_tags
      if: ${{ inputs.version != '' }}
      shell: bash
      run: |
        set -euo pipefail
        IFS='.' read -r MA MI PA <<< "${{ inputs.version }}"
        echo "major=$MA" >> "$GITHUB_OUTPUT"
        echo "minor=$MI" >> "$GITHUB_OUTPUT"

    - name: Extract metadata (tags, labels) for Docker
      id: meta_version
      uses: docker/metadata-action@v5
      if: ${{ inputs.version != '' && inputs.include_branch_tags == 'true' }}
      with:
        images: ${{ inputs.image }}
        tags: |
          type=raw,value=v${{ inputs.version }}
          type=raw,value=v${{ steps.version_tags.outputs.major }}.${{ steps.version_tags.outputs.minor }}
          type=raw,value=v${{ steps.version_tags.outputs.major }}
          type=ref,event=branch

    - name: Extract metadata (tags, labels) for Docker
      id: meta_version_nobranch
      uses: docker/metadata-action@v5
      if: ${{ inputs.version != '' && inputs.include_branch_tags != 'true' }}
      with:
        images: ${{ inputs.image }}
        tags: |
          type=raw,value=v${{ inputs.version }}
          type=raw,value=v${{ steps.version_tags.outputs.major }}.${{ steps.version_tags.outputs.minor }}
          type=raw,value=v${{ steps.version_tags.outputs.major }}

    - name: Set up Docker Buildx
      uses: docker/setup-buildx-action@v3

    - name: Build and push Docker image
      uses: docker/build-push-action@v6
      with:
        context: ${{ inputs.context }}
        file: ${{ inputs.dockerfile }}
        platforms: ${{ inputs.platforms }}
        push: true
        tags: ${{ steps.meta.outputs.tags || steps.meta_nobranch.outputs.tags || steps.meta_version.outputs.tags || steps.meta_version_nobranch.outputs.tags }}
        labels: ${{ steps.meta.outputs.labels || steps.meta_nobranch.outputs.labels || steps.meta_version.outputs.labels || steps.meta_version_nobranch.outputs.labels }}
        cache-from: type=gha
        cache-to: type=gha,mode=max


================================================
FILE: .github/actions/publish-pypi/action.yml
================================================
name: Publish Python distribution to PyPI
description: Build and publish the Python package from Server/ to PyPI
runs:
  using: composite
  steps:
    - name: Install uv
      uses: astral-sh/setup-uv@v7
      with:
        version: "latest"
        enable-cache: true
        cache-dependency-glob: "Server/uv.lock"

    - name: Build a binary wheel and a source tarball
      shell: bash
      run: uv build
      working-directory: ./Server

    - name: Publish distribution to PyPI
      # Pin to v1.12.4 to avoid Docker container name issue with uppercase repo names in v1.13.0+
      uses: pypa/gh-action-pypi-publish@v1.12.4
      with:
        packages-dir: Server/dist/


================================================
FILE: .github/pull_request_template.md
================================================
## Description
<!-- Provide a brief description of your changes -->

## Type of Change
<!-- Save the type of change you did -->
Save your change type
- Bug fix (non-breaking change that fixes an issue)
- New feature (non-breaking change that adds functionality)
- Breaking change (fix or feature that would cause existing functionality to change)
- Documentation update
- Refactoring (no functional changes)
- Test update

## Changes Made
<!-- List the specific changes in this PR -->


## Testing/Screenshots/Recordings
<!-- If applicable, add screenshots or recordings to demonstrate the changes -->


## Documentation Updates
<!-- Check if you updated documentation for changes to tools/resources -->
- [ ] I have added/removed/modified tools or resources
- [ ] If yes, I have updated all documentation files using:
  - [ ] The LLM prompt at `tools/UPDATE_DOCS_PROMPT.md` (recommended)
  - [ ] Manual updates following the guide at `tools/UPDATE_DOCS.md`


## Related Issues
<!-- Link any related issues using "Fixes #123" or "Relates to #123" -->

## Additional Notes
<!-- Any other information that reviewers should know -->


================================================
FILE: .github/scripts/mark_skipped.py
================================================
#!/usr/bin/env python3
"""
Post-processes a JUnit XML so that "expected"/environmental failures
(e.g., permission prompts, empty MCP resources, or schema hiccups)
are converted to <skipped/>. Leaves real failures intact.

Usage:
  python .github/scripts/mark_skipped.py reports/claude-nl-tests.xml
"""

from __future__ import annotations
import sys
import os
import re
import xml.etree.ElementTree as ET

PATTERNS = [
    r"\bpermission\b",
    r"\bpermissions\b",
    r"\bautoApprove\b",
    r"\bapproval\b",
    r"\bdenied\b",
    r"requested\s+permissions",
    r"^MCP resources list is empty$",
    r"No MCP resources detected",
    r"aggregator.*returned\s*\[\s*\]",
    r"Unknown resource:\s*mcpforunity://",
    r"Input should be a valid dictionary.*ctx",
    r"validation error .* ctx",
]


def should_skip(msg: str) -> bool:
    if not msg:
        return False
    msg_l = msg.strip()
    for pat in PATTERNS:
        if re.search(pat, msg_l, flags=re.IGNORECASE | re.MULTILINE):
            return True
    return False


def summarize_counts(ts: ET.Element):
    tests = 0
    failures = 0
    errors = 0
    skipped = 0
    for case in ts.findall("testcase"):
        tests += 1
        if case.find("failure") is not None:
            failures += 1
        if case.find("error") is not None:
            errors += 1
        if case.find("skipped") is not None:
            skipped += 1
    return tests, failures, errors, skipped


def main(path: str) -> int:
    if not os.path.exists(path):
        print(f"[mark_skipped] No JUnit at {path}; nothing to do.")
        return 0

    try:
        tree = ET.parse(path)
    except ET.ParseError as e:
        print(f"[mark_skipped] Could not parse {path}: {e}")
        return 0

    root = tree.getroot()
    suites = root.findall("testsuite") if root.tag == "testsuites" else [root]

    changed = False
    for ts in suites:
        for case in list(ts.findall("testcase")):
            nodes = [n for n in list(case) if n.tag in ("failure", "error")]
            if not nodes:
                continue
            # If any node matches skip patterns, convert the whole case to skipped.
            first_match_text = None
            to_skip = False
            for n in nodes:
                msg = (n.get("message") or "") + "\n" + (n.text or "")
                if should_skip(msg):
                    first_match_text = (
                        n.text or "").strip() or first_match_text
                    to_skip = True
            if to_skip:
                for n in nodes:
                    case.remove(n)
                reason = "Marked skipped: environment/permission precondition not met"
                skip = ET.SubElement(case, "skipped")
                skip.set("message", reason)
                skip.text = first_match_text or reason
                changed = True
        # Recompute tallies per testsuite
        tests, failures, errors, skipped = summarize_counts(ts)
        ts.set("tests", str(tests))
        ts.set("failures", str(failures))
        ts.set("errors", str(errors))
        ts.set("skipped", str(skipped))

    if changed:
        tree.write(path, encoding="utf-8", xml_declaration=True)
        print(
            f"[mark_skipped] Updated {path}: converted environmental failures to skipped.")
    else:
        print(f"[mark_skipped] No environmental failures detected in {path}.")

    return 0


if __name__ == "__main__":
    target = (
        sys.argv[1]
        if len(sys.argv) > 1
        else os.environ.get("JUNIT_OUT", "reports/junit-nl-suite.xml")
    )
    raise SystemExit(main(target))


================================================
FILE: .github/workflows/beta-release.yml
================================================
name: Beta Release (PyPI Pre-release)

concurrency:
  group: beta-release
  cancel-in-progress: true

on:
  push:
    branches:
      - beta
    paths:
      - "Server/**"
      - "MCPForUnity/**"

jobs:
  update_unity_beta_version:
    name: Update Unity package to beta version
    runs-on: ubuntu-latest
    # Avoid running when the workflow's own automation merges the PR
    # created by this workflow (prevents a version-bump loop).
    if: github.actor != 'github-actions[bot]'
    permissions:
      contents: write
      pull-requests: write
    outputs:
      unity_beta_version: ${{ steps.version.outputs.unity_beta_version }}
      version_updated: ${{ steps.commit.outputs.updated }}
    steps:
      - uses: actions/checkout@v6
        with:
          fetch-depth: 0
          ref: beta

      - name: Generate beta version for Unity package
        id: version
        shell: bash
        run: |
          set -euo pipefail
          # Read current Unity package version
          CURRENT_VERSION=$(jq -r '.version' MCPForUnity/package.json)
          echo "Current Unity package version: $CURRENT_VERSION"

          # Check if already a beta version - increment beta number
          if [[ "$CURRENT_VERSION" =~ ^([0-9]+\.[0-9]+\.[0-9]+)-beta\.([0-9]+)$ ]]; then
            BASE_VERSION="${BASH_REMATCH[1]}"
            BETA_NUM="${BASH_REMATCH[2]}"
            NEXT_BETA=$((BETA_NUM + 1))
            BETA_VERSION="${BASE_VERSION}-beta.${NEXT_BETA}"
            echo "Incrementing beta number: $CURRENT_VERSION -> $BETA_VERSION"
          elif [[ "$CURRENT_VERSION" =~ ^([0-9]+)\.([0-9]+)\.([0-9]+)$ ]]; then
            # Stable version - bump patch and add -beta.1 suffix
            # This ensures beta is "newer" than stable (9.3.2-beta.1 > 9.3.1)
            # The release workflow decides final bump type (patch/minor/major)
            MAJOR="${BASH_REMATCH[1]}"
            MINOR="${BASH_REMATCH[2]}"
            PATCH="${BASH_REMATCH[3]}"
            NEXT_PATCH=$((PATCH + 1))
            BETA_VERSION="${MAJOR}.${MINOR}.${NEXT_PATCH}-beta.1"
            echo "Converting stable to beta: $CURRENT_VERSION -> $BETA_VERSION"
          else
            echo "Error: Could not parse version '$CURRENT_VERSION'" >&2
            exit 1
          fi

          # Always output the computed version
          echo "unity_beta_version=$BETA_VERSION" >> "$GITHUB_OUTPUT"

          # Only skip update if computed version matches current (no change needed)
          if [[ "$BETA_VERSION" == "$CURRENT_VERSION" ]]; then
            echo "Version unchanged, skipping update"
            echo "needs_update=false" >> "$GITHUB_OUTPUT"
          else
            echo "Version will be updated: $CURRENT_VERSION -> $BETA_VERSION"
            echo "needs_update=true" >> "$GITHUB_OUTPUT"
          fi

      - name: Update Unity package.json with beta version
        if: steps.version.outputs.needs_update == 'true'
        env:
          BETA_VERSION: ${{ steps.version.outputs.unity_beta_version }}
        shell: bash
        run: |
          set -euo pipefail
          # Update package.json version
          jq --arg v "$BETA_VERSION" '.version = $v' MCPForUnity/package.json > tmp.json
          mv tmp.json MCPForUnity/package.json
          echo "Updated MCPForUnity/package.json:"
          jq '.version' MCPForUnity/package.json

      - name: Commit to temporary branch and create PR
        id: commit
        if: steps.version.outputs.needs_update == 'true'
        env:
          GH_TOKEN: ${{ github.token }}
          BETA_VERSION: ${{ steps.version.outputs.unity_beta_version }}
        shell: bash
        run: |
          set -euo pipefail
          git config user.name "GitHub Actions"
          git config user.email "actions@github.com"

          if git diff --quiet MCPForUnity/package.json; then
            echo "No changes to commit"
            echo "updated=false" >> "$GITHUB_OUTPUT"
            exit 0
          fi

          # Create a temporary branch for the version update
          BRANCH="beta-version-${BETA_VERSION}-${GITHUB_RUN_ID}"
          echo "branch=$BRANCH" >> "$GITHUB_OUTPUT"

          git checkout -b "$BRANCH"
          git add MCPForUnity/package.json
          git commit -m "chore: update Unity package to beta version ${BETA_VERSION}"
          git push origin "$BRANCH"

          # Check if PR already exists
          if gh pr view "$BRANCH" >/dev/null 2>&1; then
            echo "PR already exists for $BRANCH"
            PR_NUMBER=$(gh pr view "$BRANCH" --json number -q '.number')
          else
            PR_URL=$(gh pr create \
              --base beta \
              --head "$BRANCH" \
              --title "chore: update Unity package to beta version ${BETA_VERSION}" \
              --body "Automated beta version bump for the Unity package.")
            echo "pr_url=$PR_URL" >> "$GITHUB_OUTPUT"
            PR_NUMBER=$(echo "$PR_URL" | grep -oE '[0-9]+$')
          fi
          echo "pr_number=$PR_NUMBER" >> "$GITHUB_OUTPUT"
          echo "updated=true" >> "$GITHUB_OUTPUT"

      - name: Auto-merge version bump PR
        if: steps.commit.outputs.updated == 'true' && steps.commit.outputs.pr_number != ''
        env:
          GH_TOKEN: ${{ github.token }}
          PR_NUMBER: ${{ steps.commit.outputs.pr_number }}
        shell: bash
        run: |
          set -euo pipefail
          gh pr merge "$PR_NUMBER" --merge --delete-branch

  publish_pypi_prerelease:
    name: Publish beta to PyPI (pre-release)
    runs-on: ubuntu-latest
    # Avoid double-publish when the bot merges the version bump PR
    if: github.actor != 'github-actions[bot]'
    environment:
      name: pypi
      url: https://pypi.org/p/mcpforunityserver
    permissions:
      contents: read
      id-token: write
    steps:
      - uses: actions/checkout@v6
        with:
          fetch-depth: 0
          ref: beta

      - name: Install uv
        uses: astral-sh/setup-uv@v7
        with:
          version: "latest"
          enable-cache: true
          cache-dependency-glob: "Server/uv.lock"

      - name: Generate beta version
        id: version
        shell: bash
        run: |
          set -euo pipefail
          RAW_VERSION=$(grep -oP '(?<=version = ")[^"]+' Server/pyproject.toml)
          echo "Raw version: $RAW_VERSION"

          # Check if already a beta/prerelease version
          if [[ "$RAW_VERSION" =~ (a|b|rc|\.dev|\.post)[0-9]+$ ]]; then
            IS_PRERELEASE=true
            # Strip the prerelease suffix to get base version
            BASE_VERSION=$(echo "$RAW_VERSION" | sed -E 's/(a|b|rc|\.dev|\.post)[0-9]+$//')
          else
            IS_PRERELEASE=false
            BASE_VERSION="$RAW_VERSION"
          fi

          # Validate we have a proper X.Y.Z format
          if ! [[ "$BASE_VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
            echo "Error: Could not parse version '$RAW_VERSION' -> '$BASE_VERSION'" >&2
            exit 1
          fi

          IFS='.' read -r MAJOR MINOR PATCH <<< "$BASE_VERSION"

          # Only bump patch if coming from stable; keep same base if already prerelease
          if [[ "$IS_PRERELEASE" == "true" ]]; then
            # Already on a beta series - keep the same base version
            NEXT_PATCH="$PATCH"
            echo "Already prerelease, keeping base: $BASE_VERSION"
          else
            # Stable version - bump patch to ensure beta is "newer"
            NEXT_PATCH=$((PATCH + 1))
            echo "Stable version, bumping patch: $PATCH -> $NEXT_PATCH"
          fi

          BETA_NUMBER="$(date +%Y%m%d%H%M%S)"
          BETA_VERSION="${MAJOR}.${MINOR}.${NEXT_PATCH}b${BETA_NUMBER}"
          echo "Base version: $BASE_VERSION"
          echo "Beta version: $BETA_VERSION"
          echo "beta_version=$BETA_VERSION" >> "$GITHUB_OUTPUT"

      - name: Update version for beta release
        env:
          BETA_VERSION: ${{ steps.version.outputs.beta_version }}
        shell: bash
        run: |
          set -euo pipefail
          sed -i "s/^version = .*/version = \"${BETA_VERSION}\"/" Server/pyproject.toml
          echo "Updated pyproject.toml:"
          grep "^version" Server/pyproject.toml

      - name: Build a binary wheel and a source tarball
        shell: bash
        run: uv build
        working-directory: ./Server

      - name: Publish distribution to PyPI
        uses: pypa/gh-action-pypi-publish@release/v1
        with:
          packages-dir: Server/dist/


================================================
FILE: .github/workflows/claude-nl-suite.yml
================================================
name: Claude NL/T Full Suite (Unity live)

on: [workflow_dispatch]

permissions:
  contents: read
  checks: write
  id-token: write

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

env:
  UNITY_IMAGE: unityci/editor:ubuntu-2021.3.45f2-linux-il2cpp-3

jobs:
  nl-suite:
    runs-on: ubuntu-24.04
    timeout-minutes: 60
    env:
      JUNIT_OUT: reports/junit-nl-suite.xml
      MD_OUT: reports/junit-nl-suite.md

    steps:
      # ---------- Secrets check ----------
      - name: Detect secrets (outputs)
        id: detect
        env:
          UNITY_LICENSE: ${{ secrets.UNITY_LICENSE }}
          UNITY_EMAIL: ${{ secrets.UNITY_EMAIL }}
          UNITY_PASSWORD: ${{ secrets.UNITY_PASSWORD }}
          UNITY_SERIAL: ${{ secrets.UNITY_SERIAL }}
          ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
        run: |
          set -e
          if [ -n "$ANTHROPIC_API_KEY" ]; then echo "anthropic_ok=true" >> "$GITHUB_OUTPUT"; else echo "anthropic_ok=false" >> "$GITHUB_OUTPUT"; fi
          if [ -n "$UNITY_LICENSE" ] || { [ -n "$UNITY_EMAIL" ] && [ -n "$UNITY_PASSWORD" ] && [ -n "$UNITY_SERIAL" ]; }; then
            echo "unity_ok=true" >> "$GITHUB_OUTPUT"
          else
            echo "unity_ok=false" >> "$GITHUB_OUTPUT"
          fi

      - uses: actions/checkout@v4
        with:
          fetch-depth: 0

      # ---------- Python env for MCP server (uv) ----------
      - uses: astral-sh/setup-uv@v4
        with:
          python-version: "3.11"

      - name: Install MCP server
        run: |
          set -eux
          uv venv
          echo "VIRTUAL_ENV=$GITHUB_WORKSPACE/.venv" >> "$GITHUB_ENV"
          echo "$GITHUB_WORKSPACE/.venv/bin" >> "$GITHUB_PATH"
          if [ -f Server/pyproject.toml ]; then
            uv pip install -e Server
          elif [ -f Server/requirements.txt ]; then
            uv pip install -r Server/requirements.txt
          else
            echo "No MCP Python deps found (skipping)"
          fi

      # --- Licensing: allow both ULF and EBL when available ---
      - name: Decide license sources
        id: lic
        shell: bash
        env:
          UNITY_LICENSE: ${{ secrets.UNITY_LICENSE }}
          UNITY_EMAIL: ${{ secrets.UNITY_EMAIL }}
          UNITY_PASSWORD: ${{ secrets.UNITY_PASSWORD }}
          UNITY_SERIAL: ${{ secrets.UNITY_SERIAL }}
        run: |
          set -eu
          use_ulf=false; use_ebl=false
          [[ -n "${UNITY_LICENSE:-}" ]] && use_ulf=true
          [[ -n "${UNITY_EMAIL:-}" && -n "${UNITY_PASSWORD:-}" && -n "${UNITY_SERIAL:-}" ]] && use_ebl=true
          echo "use_ulf=$use_ulf" >> "$GITHUB_OUTPUT"
          echo "use_ebl=$use_ebl" >> "$GITHUB_OUTPUT"
          echo "has_serial=$([[ -n "${UNITY_SERIAL:-}" ]] && echo true || echo false)" >> "$GITHUB_OUTPUT"

      - name: Stage Unity .ulf license (from secret)
        if: steps.lic.outputs.use_ulf == 'true'
        id: ulf
        env:
          UNITY_LICENSE: ${{ secrets.UNITY_LICENSE }}
        shell: bash
        run: |
          set -eu
          mkdir -p "$RUNNER_TEMP/unity-license-ulf" "$RUNNER_TEMP/unity-local/Unity"
          f="$RUNNER_TEMP/unity-license-ulf/Unity_lic.ulf"
          if printf "%s" "$UNITY_LICENSE" | base64 -d - >/dev/null 2>&1; then
            printf "%s" "$UNITY_LICENSE" | base64 -d - > "$f"
          else
            printf "%s" "$UNITY_LICENSE" > "$f"
          fi
          chmod 600 "$f" || true
          # Detect ULF first; it is XML and includes a <Signature> element.
          if grep -qi '<Signature>' "$f"; then
            # provide it in the standard local-share path too
            cp -f "$f" "$RUNNER_TEMP/unity-local/Unity/Unity_lic.ulf"
            echo "License source: ULF (Signature found)"
            echo "ok=true" >> "$GITHUB_OUTPUT"
          # If someone pasted an entitlement XML into UNITY_LICENSE by mistake, re-home it:
          elif grep -qi 'Entitlement|entitlement' "$f"; then
            mkdir -p "$RUNNER_TEMP/unity-config/Unity/licenses"
            mv "$f" "$RUNNER_TEMP/unity-config/Unity/licenses/UnityEntitlementLicense.xml"
            echo "License source: Entitlement XML (re-homed)"
            echo "ok=false" >> "$GITHUB_OUTPUT"
          else
            echo "License source: Unknown format (no ULF Signature or Entitlement markers)"
            echo "ok=false" >> "$GITHUB_OUTPUT"
          fi

      # --- Activate via EBL inside the same Unity image (writes host-side entitlement) ---
      - name: Activate Unity (EBL via container - host-mount)
        if: steps.lic.outputs.use_ebl == 'true'
        shell: bash
        env:
          UNITY_IMAGE: ${{ env.UNITY_IMAGE }}
          UNITY_EMAIL: ${{ secrets.UNITY_EMAIL }}
          UNITY_PASSWORD: ${{ secrets.UNITY_PASSWORD }}
          UNITY_SERIAL: ${{ secrets.UNITY_SERIAL }}
        run: |
          set -euo pipefail
          # host dirs to receive the full Unity config and local-share
          mkdir -p "$RUNNER_TEMP/unity-config" "$RUNNER_TEMP/unity-local"

          # Try Pro first if serial is present, otherwise named-user EBL.
          docker run --rm --network host \
            -e HOME=/root \
            -e UNITY_EMAIL -e UNITY_PASSWORD -e UNITY_SERIAL \
            -v "$RUNNER_TEMP/unity-config:/root/.config/unity3d" \
            -v "$RUNNER_TEMP/unity-local:/root/.local/share/unity3d" \
            "$UNITY_IMAGE" bash -lc '
              set -euxo pipefail
              if [[ -n "${UNITY_SERIAL:-}" ]]; then
                /opt/unity/Editor/Unity -batchmode -nographics -logFile - \
                  -username "$UNITY_EMAIL" -password "$UNITY_PASSWORD" -serial "$UNITY_SERIAL" -quit || true
              else
                /opt/unity/Editor/Unity -batchmode -nographics -logFile - \
                  -username "$UNITY_EMAIL" -password "$UNITY_PASSWORD" -quit || true
              fi
              ls -la /root/.config/unity3d/Unity/licenses || true
            '

          # Verify entitlement written to host mount; allow ULF-only runs to proceed
          if ! find "$RUNNER_TEMP/unity-config" -type f -iname "*.xml" | grep -q .; then
            if [[ "${{ steps.ulf.outputs.ok }}" == "true" ]]; then
              echo "EBL entitlement not found; proceeding with ULF-only (ok=true)."
            else
              echo "No entitlement produced and no valid ULF; cannot continue." >&2
              exit 1
            fi
          fi

      # EBL entitlement is already written directly to $RUNNER_TEMP/unity-config by the activation step

      # ---------- Warm up project (import Library once) ----------
      - name: Warm up project (import Library once)
        if: steps.detect.outputs.anthropic_ok == 'true' && (steps.lic.outputs.use_ulf == 'true' || steps.lic.outputs.use_ebl == 'true')
        shell: bash
        env:
          UNITY_IMAGE: ${{ env.UNITY_IMAGE }}
          ULF_OK: ${{ steps.ulf.outputs.ok }}
        run: |
          set -euxo pipefail
          manual_args=()
          if [[ "${ULF_OK:-false}" == "true" ]]; then
            manual_args=(-manualLicenseFile "/root/.local/share/unity3d/Unity/Unity_lic.ulf")
          fi
          docker run --rm --network host \
            -e HOME=/root \
            -v "${{ github.workspace }}:${{ github.workspace }}" -w "${{ github.workspace }}" \
            -v "$RUNNER_TEMP/unity-config:/root/.config/unity3d" \
            -v "$RUNNER_TEMP/unity-local:/root/.local/share/unity3d" \
            -v "$RUNNER_TEMP/unity-cache:/root/.cache/unity3d" \
            "$UNITY_IMAGE" /opt/unity/Editor/Unity -batchmode -nographics -logFile - \
              -projectPath "${{ github.workspace }}/TestProjects/UnityMCPTests" \
              "${manual_args[@]}" \
              -quit

      # ---------- Clean old MCP status ----------
      - name: Clean old MCP status
        run: |
          set -eux
          mkdir -p "$GITHUB_WORKSPACE/.unity-mcp"
          rm -f "$GITHUB_WORKSPACE/.unity-mcp"/unity-mcp-status-*.json || true

      # ---------- Start headless Unity (persistent bridge) ----------
      - name: Start Unity (persistent bridge)
        if: steps.detect.outputs.anthropic_ok == 'true' && (steps.lic.outputs.use_ulf == 'true' || steps.lic.outputs.use_ebl == 'true')
        shell: bash
        env:
          UNITY_IMAGE: ${{ env.UNITY_IMAGE }}
          ULF_OK: ${{ steps.ulf.outputs.ok }}
        run: |
          set -euxo pipefail
          manual_args=()
          if [[ "${ULF_OK:-false}" == "true" ]]; then
            manual_args=(-manualLicenseFile "/root/.local/share/unity3d/Unity/Unity_lic.ulf")
          fi

          mkdir -p "$GITHUB_WORKSPACE/.unity-mcp"
          docker rm -f unity-mcp >/dev/null 2>&1 || true
          docker run -d --name unity-mcp --network host \
            -e HOME=/root \
            -e UNITY_MCP_ALLOW_BATCH=1 \
            -e UNITY_MCP_STATUS_DIR="${{ github.workspace }}/.unity-mcp" \
            -e UNITY_MCP_BIND_HOST=127.0.0.1 \
            -v "${{ github.workspace }}:${{ github.workspace }}" -w "${{ github.workspace }}" \
            -v "$RUNNER_TEMP/unity-config:/root/.config/unity3d" \
            -v "$RUNNER_TEMP/unity-local:/root/.local/share/unity3d" \
            -v "$RUNNER_TEMP/unity-cache:/root/.cache/unity3d" \
            "$UNITY_IMAGE" /opt/unity/Editor/Unity -batchmode -nographics -logFile /root/.config/unity3d/Editor.log \
              -stackTraceLogType Full \
              -projectPath "${{ github.workspace }}/TestProjects/UnityMCPTests" \
              "${manual_args[@]}" \
              -executeMethod MCPForUnity.Editor.McpCiBoot.StartStdioForCi

      # ---------- Wait for Unity bridge ----------
      - name: Wait for Unity bridge (robust)
        if: steps.detect.outputs.anthropic_ok == 'true' && (steps.lic.outputs.use_ulf == 'true' || steps.lic.outputs.use_ebl == 'true')
        shell: bash
        run: |
          set -euo pipefail
          deadline=$((SECONDS+600))          # 10 min max
          fatal_after=$((SECONDS+120))       # give licensing 2 min to settle

          # Fail fast only if container actually died
          st="$(docker inspect -f '{{.State.Status}} {{.State.ExitCode}}' unity-mcp 2>/dev/null || true)"
          case "$st" in exited*|dead*) docker logs unity-mcp --tail 200 | sed -E 's/((email|serial|license|password|token)[^[:space:]]*)/[REDACTED]/Ig'; exit 1;; esac

          # Patterns
          ok_pat='(Bridge|MCP(For)?Unity|AutoConnect).*(listening|ready|started|port|bound)'
          # Only truly fatal signals; allow transient "Licensing::..." chatter
          license_fatal='No valid Unity|License is not active|cannot load ULF|Signature element not found|Token not found|0 entitlement|Entitlement.*(failed|denied)|License (activation|return|renewal).*(failed|expired|denied)'

          while [ $SECONDS -lt $deadline ]; do
            logs="$(docker logs unity-mcp 2>&1 || true)"

            # 1) Primary: status JSON exposes TCP port
            port="$(jq -r '.unity_port // empty' "$GITHUB_WORKSPACE"/.unity-mcp/unity-mcp-status-*.json 2>/dev/null | head -n1 || true)"
            if [[ -n "${port:-}" ]] && timeout 1 bash -lc "exec 3<>/dev/tcp/127.0.0.1/$port"; then
              echo "Bridge ready on port $port"
              # Ensure status file is readable by all (Claude container might run as different user)
              docker exec unity-mcp chmod -R a+rwx "$GITHUB_WORKSPACE/.unity-mcp" || chmod -R a+rwx "$GITHUB_WORKSPACE/.unity-mcp" || true
              exit 0
            fi

            # 2) Secondary: log markers
            if echo "$logs" | grep -qiE "$ok_pat"; then
              echo "Bridge ready (log markers)"
              docker exec unity-mcp chmod -R a+rwx "$GITHUB_WORKSPACE/.unity-mcp" || chmod -R a+rwx "$GITHUB_WORKSPACE/.unity-mcp" || true
              exit 0
            fi

            # Only treat license failures as fatal *after* warm-up
            if [ $SECONDS -ge $fatal_after ] && echo "$logs" | grep -qiE "$license_fatal"; then
              echo "::error::Fatal licensing signal detected after warm-up"
              echo "$logs" | tail -n 200 | sed -E 's/((email|serial|license|password|token)[^[:space:]]*)/[REDACTED]/Ig'
              exit 1
            fi

            # If the container dies mid-wait, bail
            st="$(docker inspect -f '{{.State.Status}}' unity-mcp 2>/dev/null || true)"
            if [[ "$st" != "running" ]]; then
              echo "::error::Unity container exited during wait"; docker logs unity-mcp --tail 200 | sed -E 's/((email|serial|license|password|token)[^[:space:]]*)/[REDACTED]/Ig'
              exit 1
            fi

            sleep 2
          done

          echo "::error::Bridge not ready before deadline"
          docker logs unity-mcp --tail 200 | sed -E 's/((email|serial|license|password|token)[^[:space:]]*)/[REDACTED]/Ig'
          exit 1

      # ---------- Debug Unity bridge status ----------
      - name: Debug Unity bridge status
        if: always() && (steps.lic.outputs.use_ulf == 'true' || steps.lic.outputs.use_ebl == 'true')
        shell: bash
        run: |
          set -euxo pipefail
          echo "--- Unity container state ---"
          docker inspect -f '{{.State.Status}} {{.State.ExitCode}}' unity-mcp || true
          echo "--- Unity container logs (tail 200) ---"
          docker logs unity-mcp --tail 200 | sed -E 's/((email|serial|license|password|token)[^[:space:]]*)/[REDACTED]/Ig' || true
          echo "--- Container status dir ---"
          docker exec unity-mcp ls -la "${{ github.workspace }}/.unity-mcp" || true
          echo "--- Host status dir ---"
          ls -la "$GITHUB_WORKSPACE/.unity-mcp" || true
          echo "--- Host status file (first 120 lines) ---"
          jq -r . "$GITHUB_WORKSPACE"/.unity-mcp/unity-mcp-status-*.json | sed -n '1,120p' || true
          echo "--- Port probe from host ---"
          port="$(jq -r '.unity_port // empty' "$GITHUB_WORKSPACE"/.unity-mcp/unity-mcp-status-*.json 2>/dev/null | head -n1 || true)"
          echo "unity_port=${port:-}"
          if [[ -n "${port:-}" ]]; then
            timeout 1 bash -lc "exec 3<>/dev/tcp/127.0.0.1/$port" && echo "TCP OK" || echo "TCP probe failed"
          else
            echo "No unity_port in status file"
          fi
          echo "--- Config dir listing ---"
          docker exec unity-mcp ls -la /root/.config/unity3d || true
          echo "--- Editor log tail ---"
          docker exec unity-mcp tail -n 200 /root/.config/unity3d/Editor.log || true
          # Fail fast if no status file was written
          shopt -s nullglob
          status_files=("$GITHUB_WORKSPACE"/.unity-mcp/unity-mcp-status-*.json)
          if ((${#status_files[@]} == 0)); then
            echo "::error::No Unity MCP status file found; failing fast."
            exit 1
          fi

      # (moved) — return license after Unity is stopped

      - name: Pin Claude tool permissions (.claude/settings.json)
        run: |
          set -eux
          mkdir -p .claude
          cat > .claude/settings.json <<'JSON'
          {
            "permissions": {
              "allow": [
                "mcp__unity",
                "Edit(reports/**)",
                "MultiEdit(reports/**)"
              ],
              "deny": [
                "Bash",
                "WebFetch",
                "WebSearch",
                "Task",
                "TodoWrite",
                "NotebookEdit",
                "NotebookRead"
              ]
            }
          }
          JSON

          # ---------- Reports & helper ----------
      - name: Prepare reports and dirs
        run: |
          set -eux
          rm -f reports/*.xml reports/*.md || true
          mkdir -p reports reports/_snapshots reports/_staging

      - name: Create report skeletons
        run: |
          set -eu
          cat > "$JUNIT_OUT" <<'XML'
          <?xml version="1.0" encoding="UTF-8"?>
          <testsuites><testsuite name="UnityMCP.NL-T" tests="1" failures="1" errors="0" skipped="0" time="0">
            <testcase name="NL-Suite.Bootstrap" classname="UnityMCP.NL-T">
              <failure message="bootstrap">Bootstrap placeholder; suite will append real tests.</failure>
            </testcase>
          </testsuite></testsuites>
          XML
          printf '# Unity NL/T Editing Suite Test Results\n\n' > "$MD_OUT"

      - name: Verify Unity bridge status/port
        run: |
          set -euxo pipefail
          ls -la "$GITHUB_WORKSPACE/.unity-mcp" || true
          jq -r . "$GITHUB_WORKSPACE"/.unity-mcp/unity-mcp-status-*.json | sed -n '1,80p' || true

          shopt -s nullglob
          status_files=("$GITHUB_WORKSPACE"/.unity-mcp/unity-mcp-status-*.json)
          if ((${#status_files[@]})); then
            port="$(grep -hEo '"unity_port"[[:space:]]*:[[:space:]]*[0-9]+' "${status_files[@]}" \
              | sed -E 's/.*: *([0-9]+).*/\1/' | head -n1 || true)"
          else
            port=""
          fi

          echo "unity_port=$port"
          if [[ -n "$port" ]]; then
            timeout 1 bash -lc "exec 3<>/dev/tcp/127.0.0.1/$port" && echo "TCP OK"
          fi

          if ((${#status_files[@]})); then
            first_status="${status_files[0]}"
            fname="$(basename "$first_status")"
            hash_part="${fname%.json}"; hash_part="${hash_part#unity-mcp-status-}"
            proj="$(jq -r '.project_name // empty' "$first_status" || true)"
            if [[ -n "${proj:-}" && -n "${hash_part:-}" ]]; then
              echo "UNITY_MCP_DEFAULT_INSTANCE=${proj}@${hash_part}" >> "$GITHUB_ENV"
              echo "Default instance set to ${proj}@${hash_part}"
            fi
          fi

      # ---------- MCP client config ----------
      - name: Write MCP config (.claude/mcp.json)
        run: |
          set -eux
          mkdir -p .claude
          python3 - <<'PY'
          import json
          import os
          import textwrap
          from pathlib import Path

          workspace = os.environ["GITHUB_WORKSPACE"]
          default_inst = os.environ.get("UNITY_MCP_DEFAULT_INSTANCE", "").strip()

          cfg = {
              "mcpServers": {
                  "unity": {
                      "args": [
                          "run",
                          "--active",
                          "--directory",
                          "Server",
                          "mcp-for-unity",
                          "--transport",
                          "stdio",
                      ],
                      "transport": {"type": "stdio"},
                      "env": {
                          "PYTHONUNBUFFERED": "1",
                          "MCP_LOG_LEVEL": "debug",
                          "UNITY_PROJECT_ROOT": f"{workspace}/TestProjects/UnityMCPTests",
                          "UNITY_MCP_STATUS_DIR": f"{workspace}/.unity-mcp",
                          "UNITY_MCP_HOST": "127.0.0.1",
                      },
                  }
              }
          }

          unity = cfg["mcpServers"]["unity"]
          if default_inst:
              unity["env"]["UNITY_MCP_DEFAULT_INSTANCE"] = default_inst
              if "--default-instance" not in unity["args"]:
                  unity["args"] += ["--default-instance", default_inst]

          runner_script = Path(".claude/run-unity-mcp.sh")
          workspace_path = Path(workspace)
          uv_candidate = workspace_path / ".venv" / "bin" / "uv"
          uv_cmd = uv_candidate.as_posix() if uv_candidate.exists() else "uv"
          script = textwrap.dedent(f"""\
              #!/usr/bin/env bash
              set -euo pipefail
              LOG="{workspace}/.unity-mcp/mcp-server-startup-debug.log"
              mkdir -p "$(dirname "$LOG")"
              echo "" >> "$LOG"
              echo "[ $(date -Iseconds) ] Starting unity MCP server" >> "$LOG"
              # Redirect stderr to log, keep stdout for MCP communication
              exec {uv_cmd} "$@" 2>> "$LOG"
              """)
          runner_script.write_text(script)
          runner_script.chmod(0o755)

          unity["command"] = runner_script.resolve().as_posix()

          path = Path(".claude/mcp.json")
          path.write_text(json.dumps(cfg, indent=2) + "\n")
          print(f"Wrote {path} and {runner_script} (UNITY_MCP_DEFAULT_INSTANCE={default_inst or 'unset'})")
          PY

      - name: Debug MCP config
        run: |
          set -eux
          echo "=== .claude/mcp.json ==="
          cat .claude/mcp.json
          echo ""
          echo "=== Status dir contents ==="
          ls -la "$GITHUB_WORKSPACE/.unity-mcp" || true
          echo ""
          echo "=== Status file content ==="
          cat "$GITHUB_WORKSPACE"/.unity-mcp/unity-mcp-status-*.json 2>/dev/null || echo "(no status files)"

      - name: Preflight MCP server (with retries)
        env:
          UNITY_MCP_DEFAULT_INSTANCE: ${{ env.UNITY_MCP_DEFAULT_INSTANCE }}
        run: |
          set -euxo pipefail
          export PYTHONUNBUFFERED=1
          export MCP_LOG_LEVEL=debug
          export UNITY_PROJECT_ROOT="$GITHUB_WORKSPACE/TestProjects/UnityMCPTests"
          export UNITY_MCP_STATUS_DIR="$GITHUB_WORKSPACE/.unity-mcp"
          export UNITY_MCP_HOST=127.0.0.1
          if [[ -n "${UNITY_MCP_DEFAULT_INSTANCE:-}" ]]; then
            export UNITY_MCP_DEFAULT_INSTANCE
          fi

          # Debug: probe Unity's actual ping/pong response
          echo "--- Unity ping/pong probe ---"
          python3 <<'PY'
          import socket, struct, sys
          port = 6400
          try:
              s = socket.create_connection(("127.0.0.1", port), timeout=2)
              s.settimeout(2)
              hs = s.recv(512)
              print(f"handshake: {hs!r}")
              hs_ok = b"FRAMING=1" in hs
              print(f"FRAMING=1 present: {hs_ok}")
              if hs_ok:
                  s.sendall(struct.pack(">Q", 4) + b"ping")
                  hdr = s.recv(8)
                  print(f"response header len: {len(hdr)}")
                  if len(hdr) == 8:
                      length = struct.unpack(">Q", hdr)[0]
                      resp = s.recv(length)
                      print(f"response payload: {resp!r}")
                      pong_check = b'"message":"pong"'
                      print(f"contains pong_check: {pong_check in resp}")
              s.close()
          except Exception as e:
              print(f"probe error: {e}")
          PY

          attempt=0
          while true; do
            attempt=$((attempt+1))
            if uv run --active --directory Server python <<'PY' > /tmp/mcp-preflight.log 2>&1
          import json
          import os
          import sys
          sys.path.insert(0, "src")
          from transport.legacy.unity_connection import send_command_with_retry

          unity_instance = (os.environ.get("UNITY_MCP_DEFAULT_INSTANCE") or "").strip() or None
          resp = send_command_with_retry(
              "read_console",
              {"action": "get", "count": "1", "include_stacktrace": False},
              instance_id=unity_instance,
              max_retries=1,
              retry_ms=200,
              retry_on_reload=False,
          )
          print(json.dumps(resp, default=str))
          ok = isinstance(resp, dict) and (resp.get("success") is True or resp.get("status") == "success")
          raise SystemExit(0 if ok else 1)
          PY
            then
              echo "MCP command-plane preflight passed on attempt ${attempt}"
              cat /tmp/mcp-preflight.log
              break
            fi
            echo "MCP command-plane preflight failed on attempt ${attempt}"
            cat /tmp/mcp-preflight.log || true
            if [ "$attempt" -ge 8 ]; then
              echo "::error::Unity command plane not ready after $attempt attempts"
              cat /tmp/mcp-preflight.log || true
              exit 1
            fi
            sleep 2
          done

      # ---------- Readiness diagnostics (only if preflight fails) ----------
      - name: Readiness diagnostics (on preflight failure)
        if: failure()
        continue-on-error: true
        env:
          UNITY_MCP_DEFAULT_INSTANCE: ${{ env.UNITY_MCP_DEFAULT_INSTANCE }}
        run: |
          set -euxo pipefail
          export PYTHONUNBUFFERED=1 MCP_LOG_LEVEL=debug
          export UNITY_PROJECT_ROOT="$GITHUB_WORKSPACE/TestProjects/UnityMCPTests"
          export UNITY_MCP_STATUS_DIR="$GITHUB_WORKSPACE/.unity-mcp"
          export UNITY_MCP_HOST=127.0.0.1
          if [[ -n "${UNITY_MCP_DEFAULT_INSTANCE:-}" ]]; then
            export UNITY_MCP_DEFAULT_INSTANCE
          fi

          echo "=== Unity container status ==="
          docker inspect -f '{{.State.Status}} {{.State.Running}} {{.State.ExitCode}}' unity-mcp || true
          echo "=== Unity container logs (tail 200) ==="
          docker logs unity-mcp --tail 200 | sed -E 's/((email|serial|license|password|token)[^[:space:]]*)/[REDACTED]/ig' || true

          echo "=== Status directory ==="
          ls -la "$GITHUB_WORKSPACE/.unity-mcp" || true
          jq -r . "$GITHUB_WORKSPACE"/.unity-mcp/unity-mcp-status-*.json | sed -n '1,120p' || true

          echo "=== Raw TCP probe to 6400 ==="
          for host in 127.0.0.1 localhost; do
            if timeout 2 bash -c "exec 3<>/dev/tcp/$host/6400" 2>/dev/null; then
              echo "$host:6400 - SUCCESS"
            else
              echo "$host:6400 - FAILED"
            fi
          done

          echo "--- PortDiscovery debug ---"
          python3 - <<'PY'
          import sys
          sys.path.insert(0, "Server/src")
          from transport.legacy.port_discovery import PortDiscovery

          print(f"status_dir: {PortDiscovery.get_registry_dir()}")
          instances = PortDiscovery.discover_all_unity_instances()
          print(f"discover_all_unity_instances: {[{'id': i.id, 'port': i.port} for i in instances]}")
          print(f"discover_unity_port: {PortDiscovery.discover_unity_port()}")
          PY

          echo "--- Stdio registry debug ---"
          uv run --active --directory Server python - <<'PY'
          from transport.legacy.stdio_port_registry import stdio_port_registry
          import json
          instances = stdio_port_registry.get_instances(force_refresh=True)
          print(json.dumps([{"id": i.id, "port": i.port} for i in instances]))
          PY

          echo "=== MCP startup debug log ==="
          cat "$GITHUB_WORKSPACE/.unity-mcp/mcp-server-startup-debug.log" 2>/dev/null || echo "(no startup debug log)"

      # ---------- Run suite in two passes ----------
      - name: Load NL prompt
        id: nl_prompt
        if: steps.detect.outputs.anthropic_ok == 'true' && steps.detect.outputs.unity_ok == 'true'
        run: |
          set -euo pipefail
          cp .claude/prompts/nl-unity-suite-nl.md .claude/prompts/nl-unity-suite-nl-run.md
          cat >> .claude/prompts/nl-unity-suite-nl-run.md <<'EOF'

          You are running the NL pass only.
          - Emit exactly NL-0, NL-1, NL-2, NL-3, NL-4.
          - Write each to reports/${ID}_results.xml.
          - Prefer a single MultiEdit(reports/**) batch. Do not emit any T-* tests.
          - Stop after NL-4_results.xml is written.
          EOF
          cp .claude/prompts/nl-unity-suite-nl.md .claude/prompts/nl-unity-suite-nl-retry.md
          cat >> .claude/prompts/nl-unity-suite-nl-retry.md <<'EOF'

          You are retrying the NL pass only.
          - Emit exactly NL-0, NL-1, NL-2, NL-3, NL-4.
          - Overwrite reports/${ID}_results.xml for each ID.
          - Do not emit any T-* or GO-* tests.
          - Stop after NL-4_results.xml is written.
          EOF

          {
            echo "run_prompt<<__NL_RUN_PROMPT__"
            cat .claude/prompts/nl-unity-suite-nl-run.md
            echo "__NL_RUN_PROMPT__"
            echo "retry_prompt<<__NL_RETRY_PROMPT__"
            cat .claude/prompts/nl-unity-suite-nl-retry.md
            echo "__NL_RETRY_PROMPT__"
          } >> "$GITHUB_OUTPUT"

      - name: Run Claude NL pass
        uses: anthropics/claude-code-action@cc5ef44546fda0649ddde3c5ab0cd3db7b7c5035
        if: steps.detect.outputs.anthropic_ok == 'true' && steps.detect.outputs.unity_ok == 'true'
        continue-on-error: true
        env:
          UNITY_MCP_DEFAULT_INSTANCE: ${{ env.UNITY_MCP_DEFAULT_INSTANCE }}
          GITHUB_STEP_SUMMARY: /dev/null
        with:
          prompt: ${{ steps.nl_prompt.outputs.run_prompt }}
          settings: .claude/settings.json
          claude_args: |
            --mcp-config .claude/mcp.json
            --allowedTools mcp__unity,Edit(reports/**),MultiEdit(reports/**)
            --disallowedTools Bash,WebFetch,WebSearch,Task,TodoWrite,NotebookEdit,NotebookRead
            --model claude-haiku-4-5-20251001
            --fallback-model claude-sonnet-4-5-20250929
          track_progress: false
          show_full_output: true
          display_report: false
          anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}

      - name: Debug MCP server startup (after NL pass)
        if: always()
        run: |
          set -eux
          echo "=== MCP Server Startup Debug Log ==="
          cat "$GITHUB_WORKSPACE/.unity-mcp/mcp-server-startup-debug.log" 2>/dev/null || echo "(no debug log found - MCP server may not have started)"
          echo ""
          echo "=== Status dir after Claude ==="
          ls -la "$GITHUB_WORKSPACE/.unity-mcp" || true

      - name: Check NL coverage incomplete/failed (pre-retry)
        id: nl_cov
        if: always()
        shell: bash
        run: |
          set -euo pipefail
          missing=()
          failed=()
          for id in NL-0 NL-1 NL-2 NL-3 NL-4; do
            f="reports/${id}_results.xml"
            if [[ ! -s "$f" && ! -s "reports/_staging/${id}_results.xml" ]]; then
              missing+=("$id")
              continue
            fi
            if [[ ! -s "$f" && -s "reports/_staging/${id}_results.xml" ]]; then
              f="reports/_staging/${id}_results.xml"
            fi
            if grep -Eq '<(failure|error)\b' "$f"; then
              failed+=("$id")
            fi
          done
          echo "missing=${#missing[@]}" >> "$GITHUB_OUTPUT"
          echo "failed=${#failed[@]}" >> "$GITHUB_OUTPUT"
          if (( ${#missing[@]} )); then
            echo "missing_list=${missing[*]}" >> "$GITHUB_OUTPUT"
          fi
          if (( ${#failed[@]} )); then
            echo "failed_list=${failed[*]}" >> "$GITHUB_OUTPUT"
          fi

      - name: Retry NL pass (Sonnet) if incomplete or failed
        if: steps.nl_cov.outputs.missing != '0' || steps.nl_cov.outputs.failed != '0'
        uses: anthropics/claude-code-action@cc5ef44546fda0649ddde3c5ab0cd3db7b7c5035
        continue-on-error: true
        env:
          UNITY_MCP_DEFAULT_INSTANCE: ${{ env.UNITY_MCP_DEFAULT_INSTANCE }}
          GITHUB_STEP_SUMMARY: /dev/null
        with:
          prompt: ${{ steps.nl_prompt.outputs.retry_prompt }}
          settings: .claude/settings.json
          claude_args: |
            --mcp-config .claude/mcp.json
            --allowedTools mcp__unity,Edit(reports/**),MultiEdit(reports/**)
            --disallowedTools Bash,WebFetch,WebSearch,Task,TodoWrite,NotebookEdit,NotebookRead
            --model claude-sonnet-4-5-20250929
            --fallback-model claude-haiku-4-5-20251001
          track_progress: false
          show_full_output: true
          display_report: false
          anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}

      - name: Load T prompt
        id: t_prompt
        if: steps.detect.outputs.anthropic_ok == 'true' && steps.detect.outputs.unity_ok == 'true'
        run: |
          set -euo pipefail
          cp .claude/prompts/nl-unity-suite-t.md .claude/prompts/nl-unity-suite-t-run.md
          cat >> .claude/prompts/nl-unity-suite-t-run.md <<'EOF'

          You are running the T pass (A–J) only.
          Output requirements:
          - Emit exactly 10 test fragments: T-A, T-B, T-C, T-D, T-E, T-F, T-G, T-H, T-I, T-J.
          - Write each fragment to reports/${ID}_results.xml (e.g., T-A_results.xml).
          - Prefer a single MultiEdit(reports/**) call that writes all ten files in one batch.
          - If MultiEdit is not used, emit individual writes for any missing IDs until all ten exist.
          - Do not emit any NL-* fragments.
          Stop condition:
          - After T-J_results.xml is written, stop.
          EOF

          cp .claude/prompts/nl-unity-suite-t.md .claude/prompts/nl-unity-suite-t-retry.md
          cat >> .claude/prompts/nl-unity-suite-t-retry.md <<'EOF'

          You are running the T pass only.
          Output requirements:
          - Emit exactly 10 test fragments: T-A, T-B, T-C, T-D, T-E, T-F, T-G, T-H, T-I, T-J.
          - Write each fragment to reports/${ID}_results.xml (e.g., T-A_results.xml).
          - Prefer a single MultiEdit(reports/**) call that writes all ten files in one batch.
          - If MultiEdit is not used, emit individual writes for any missing IDs until all ten exist.
          - Do not emit any NL-* fragments.
          Stop condition:
          - After T-J_results.xml is written, stop.
          EOF

          {
            echo "run_prompt<<__T_RUN_PROMPT__"
            cat .claude/prompts/nl-unity-suite-t-run.md
            echo "__T_RUN_PROMPT__"
            echo "retry_prompt<<__T_RETRY_PROMPT__"
            cat .claude/prompts/nl-unity-suite-t-retry.md
            echo "__T_RETRY_PROMPT__"
          } >> "$GITHUB_OUTPUT"

      - name: Run Claude T pass A-J
        uses: anthropics/claude-code-action@cc5ef44546fda0649ddde3c5ab0cd3db7b7c5035
        if: steps.detect.outputs.anthropic_ok == 'true' && steps.detect.outputs.unity_ok == 'true'
        continue-on-error: true
        env:
          UNITY_MCP_DEFAULT_INSTANCE: ${{ env.UNITY_MCP_DEFAULT_INSTANCE }}
          GITHUB_STEP_SUMMARY: /dev/null
        with:
          prompt: ${{ steps.t_prompt.outputs.run_prompt }}
          settings: .claude/settings.json
          claude_args: |
            --mcp-config .claude/mcp.json
            --allowedTools mcp__unity,Edit(reports/**),MultiEdit(reports/**)
            --disallowedTools Bash,WebFetch,WebSearch,Task,TodoWrite,NotebookEdit,NotebookRead
            --model claude-haiku-4-5-20251001
            --fallback-model claude-sonnet-4-5-20250929
          track_progress: false
          show_full_output: true
          display_report: false
          anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}

      # (moved) Assert T coverage after staged fragments are promoted

      - name: Check T coverage incomplete (pre-retry)
        id: t_cov
        if: always()
        shell: bash
        run: |
          set -euo pipefail
          missing=()
          for id in T-A T-B T-C T-D T-E T-F T-G T-H T-I T-J; do
            if [[ ! -s "reports/${id}_results.xml" && ! -s "reports/_staging/${id}_results.xml" ]]; then
              missing+=("$id")
            fi
          done
          echo "missing=${#missing[@]}" >> "$GITHUB_OUTPUT"
          if (( ${#missing[@]} )); then
            echo "list=${missing[*]}" >> "$GITHUB_OUTPUT"
          fi

      - name: Retry T pass (Sonnet) if incomplete
        if: steps.t_cov.outputs.missing != '0'
        uses: anthropics/claude-code-action@cc5ef44546fda0649ddde3c5ab0cd3db7b7c5035
        env:
          GITHUB_STEP_SUMMARY: /dev/null
        with:
          prompt: ${{ steps.t_prompt.outputs.retry_prompt }}
          settings: .claude/settings.json
          claude_args: |
            --mcp-config .claude/mcp.json
            --allowedTools mcp__unity,Edit(reports/**),MultiEdit(reports/**)
            --disallowedTools Bash,MultiEdit(/!(reports/**)),WebFetch,WebSearch,Task,TodoWrite,NotebookEdit,NotebookRead
            --model claude-sonnet-4-5-20250929
            --fallback-model claude-haiku-4-5-20251001
          track_progress: false
          show_full_output: true
          display_report: false
          anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}

      - name: Re-assert T coverage (post-retry)
        if: always()
        shell: bash
        run: |
          set -euo pipefail
          missing=()
          for id in T-A T-B T-C T-D T-E T-F T-G T-H T-I T-J; do
            [[ -s "reports/${id}_results.xml" ]] || missing+=("$id")
          done
          if (( ${#missing[@]} )); then
            echo "::error::Still missing T fragments: ${missing[*]}"
            exit 1
          fi

      # ---------- Run GO pass (GameObject API tests) ----------
      - name: Load GO prompt
        id: go_prompt
        if: steps.detect.outputs.anthropic_ok == 'true' && steps.detect.outputs.unity_ok == 'true'
        run: |
          set -euo pipefail
          cp .claude/prompts/nl-gameobject-suite.md .claude/prompts/nl-gameobject-suite-run.md
          cat >> .claude/prompts/nl-gameobject-suite-run.md <<'EOF'

          You are running the GO pass (GameObject API tests) only.
          Output requirements:
          - Emit exactly 11 test fragments: GO-0, GO-1, GO-2, GO-3, GO-4, GO-5, GO-6, GO-7, GO-8, GO-9, GO-10.
          - Write each fragment to reports/${ID}_results.xml (e.g., GO-0_results.xml).
          - Prefer a single MultiEdit(reports/**) call that writes all eleven files in one batch.
          - Do not emit any NL-* or T-* fragments.
          Stop condition:
          - After GO-10_results.xml is written, stop.
          EOF

          cp .claude/prompts/nl-gameobject-suite.md .claude/prompts/nl-gameobject-suite-retry.md
          cat >> .claude/prompts/nl-gameobject-suite-retry.md <<'EOF'

          You are running the GO pass only.
          Output requirements:
          - Emit exactly 11 test fragments: GO-0, GO-1, GO-2, GO-3, GO-4, GO-5, GO-6, GO-7, GO-8, GO-9, GO-10.
          - Write each fragment to reports/${ID}_results.xml (e.g., GO-0_results.xml).
          - Prefer a single MultiEdit(reports/**) call that writes all eleven files in one batch.
          - Do not emit any NL-* or T-* fragments.
          Stop condition:
          - After GO-10_results.xml is written, stop.
          EOF

          {
            echo "run_prompt<<__GO_RUN_PROMPT__"
            cat .claude/prompts/nl-gameobject-suite-run.md
            echo "__GO_RUN_PROMPT__"
            echo "retry_prompt<<__GO_RETRY_PROMPT__"
            cat .claude/prompts/nl-gameobject-suite-retry.md
            echo "__GO_RETRY_PROMPT__"
          } >> "$GITHUB_OUTPUT"

      - name: Run Claude GO pass
        uses: anthropics/claude-code-action@cc5ef44546fda0649ddde3c5ab0cd3db7b7c5035
        if: steps.detect.outputs.anthropic_ok == 'true' && steps.detect.outputs.unity_ok == 'true'
        continue-on-error: true
        env:
          UNITY_MCP_DEFAULT_INSTANCE: ${{ env.UNITY_MCP_DEFAULT_INSTANCE }}
          GITHUB_STEP_SUMMARY: /dev/null
        with:
          prompt: ${{ steps.go_prompt.outputs.run_prompt }}
          settings: .claude/settings.json
          claude_args: |
            --mcp-config .claude/mcp.json
            --allowedTools mcp__unity,Edit(reports/**),MultiEdit(reports/**)
            --disallowedTools Bash,WebFetch,WebSearch,Task,TodoWrite,NotebookEdit,NotebookRead
            --model claude-haiku-4-5-20251001
            --fallback-model claude-sonnet-4-5-20250929
          track_progress: false
          show_full_output: true
          display_report: false
          anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}

      - name: Check GO coverage incomplete (pre-retry)
        id: go_cov
        if: always()
        shell: bash
        run: |
          set -euo pipefail
          missing=()
          for id in GO-0 GO-1 GO-2 GO-3 GO-4 GO-5 GO-6 GO-7 GO-8 GO-9 GO-10; do
            if [[ ! -s "reports/${id}_results.xml" && ! -s "reports/_staging/${id}_results.xml" ]]; then
              missing+=("$id")
            fi
          done
          echo "missing=${#missing[@]}" >> "$GITHUB_OUTPUT"
          if (( ${#missing[@]} )); then
            echo "list=${missing[*]}" >> "$GITHUB_OUTPUT"
          fi

      - name: Retry GO pass (Sonnet) if incomplete
        if: steps.go_cov.outputs.missing != '0'
        uses: anthropics/claude-code-action@cc5ef44546fda0649ddde3c5ab0cd3db7b7c5035
        env:
          GITHUB_STEP_SUMMARY: /dev/null
        with:
          prompt: ${{ steps.go_prompt.outputs.retry_prompt }}
          settings: .claude/settings.json
          claude_args: |
            --mcp-config .claude/mcp.json
            --allowedTools mcp__unity,Edit(reports/**),MultiEdit(reports/**)
            --disallowedTools Bash,WebFetch,WebSearch,Task,TodoWrite,NotebookEdit,NotebookRead
            --model claude-sonnet-4-5-20250929
            --fallback-model claude-haiku-4-5-20251001
          track_progress: false
          show_full_output: true
          display_report: false
          anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}

      # (kept) Finalize staged report fragments (promote to reports/)

      # (removed duplicate) Finalize staged report fragments

      - name: Assert T coverage (after promotion)
        if: always()
        shell: bash
        run: |
          set -euo pipefail
          missing=()
          for id in T-A T-B T-C T-D T-E T-F T-G T-H T-I T-J; do
            if [[ ! -s "reports/${id}_results.xml" ]]; then
              # Accept staged fragment as present
              [[ -s "reports/_staging/${id}_results.xml" ]] || missing+=("$id")
            fi
          done
          if (( ${#missing[@]} )); then
            echo "::error::Missing T fragments: ${missing[*]}"
            exit 1
          fi

      - name: Canonicalize testcase names (NL/T prefixes)
        if: always()
        shell: bash
        run: |
          python3 - <<'PY'
          from pathlib import Path
          import xml.etree.ElementTree as ET, re, os

          RULES = [
            ("NL-0", r"\b(NL-0|Baseline|State\s*Capture)\b"),
            ("NL-1", r"\b(NL-1|Core\s*Method)\b"),
            ("NL-2", r"\b(NL-2|Anchor|Build\s*marker)\b"),
            ("NL-3", r"\b(NL-3|End[-\s]*of[-\s]*Class\s*Content|Tail\s*test\s*[ABC])\b"),
            ("NL-4", r"\b(NL-4|Console|Unity\s*console)\b"),
            ("T-A",  r"\b(T-?A|Temporary\s*Helper)\b"),
            ("T-B",  r"\b(T-?B|Method\s*Body\s*Interior)\b"),
            ("T-C",  r"\b(T-?C|Different\s*Method\s*Interior|ApplyBlend)\b"),
            ("T-D",  r"\b(T-?D|End[-\s]*of[-\s]*Class\s*Helper|TestHelper)\b"),
            ("T-E",  r"\b(T-?E|Method\s*Evolution|Counter|IncrementCounter)\b"),
            ("T-F",  r"\b(T-?F|Atomic\s*Multi[-\s]*Edit)\b"),
            ("T-G",  r"\b(T-?G|Path\s*Normalization)\b"),
            ("T-H",  r"\b(T-?H|Validation\s*on\s*Modified)\b"),
            ("T-I",  r"\b(T-?I|Failure\s*Surface)\b"),
            ("T-J",  r"\b(T-?J|Idempotenc(y|e))\b"),
            ("GO-0", r"\b(GO-?0|Hierarchy.*ComponentTypes)\b"),
            ("GO-1", r"\b(GO-?1|Find\s*GameObjects\s*Tool)\b"),
            ("GO-2", r"\b(GO-?2|GameObject\s*Resource)\b"),
            ("GO-3", r"\b(GO-?3|Components\s*Resource)\b"),
            ("GO-4", r"\b(GO-?4|Manage\s*Components)\b"),
            ("GO-5", r"\b(GO-?5|Find.*by.*Name)\b"),
            ("GO-6", r"\b(GO-?6|Find.*by.*Tag)\b"),
            ("GO-7", r"\b(GO-?7|Single\s*Component)\b"),
            ("GO-8", r"\b(GO-?8|Remove\s*Component)\b"),
            ("GO-9", r"\b(GO-?9|Pagination)\b"),
            ("GO-10", r"\b(GO-?10|Deprecation)\b"),
          ]

          def canon_name(name: str) -> str:
            n = name or ""
            for tid, pat in RULES:
              if re.search(pat, n, flags=re.I):
                # If it already starts with the correct format, leave it alone
                if re.match(rf'^\s*{re.escape(tid)}\s*[—–-]', n, flags=re.I):
                  return n.strip()
                # If it has a different separator, extract title and reformat
                title_match = re.search(rf'{re.escape(tid)}\s*[:.\-–—]\s*(.+)', n, flags=re.I)
                if title_match:
                  title = title_match.group(1).strip()
                  return f"{tid} — {title}"
                # Otherwise, just return the canonical ID
                return tid
            return n

          def id_from_filename(p: Path):
            n = p.name
            m = re.match(r'NL-?(\d+)_results\.xml$', n, re.I)
            if m:
              return f"NL-{int(m.group(1))}"
            m = re.match(r'T-?([A-J])_results\.xml$', n, re.I)
            if m:
              return f"T-{m.group(1).upper()}"
            m = re.match(r'GO-?(\d+)_results\.xml$', n, re.I)
            if m:
              return f"GO-{int(m.group(1))}"
            return None

          frags = list(sorted(Path("reports").glob("*_results.xml")))
          for frag in frags:
            try:
              tree = ET.parse(frag); root = tree.getroot()
            except Exception:
              continue
            if root.tag != "testcase":
              continue
            file_id = id_from_filename(frag)
            old = root.get("name") or ""
            # Prefer filename-derived ID; if name doesn't start with it, override
            if file_id:
              # Respect file's ID (prevents T-D being renamed to NL-3 by loose patterns)
              title = re.sub(r'^\s*(NL-\d+|T-[A-Z]|GO-\d+)\s*[—–:\-]\s*', '', old).strip()
              new = f"{file_id} — {title}" if title else file_id
            else:
              new = canon_name(old)
            if new != old and new:
              root.set("name", new)
              tree.write(frag, encoding="utf-8", xml_declaration=False)
              print(f'canon: {frag.name}: "{old}" -> "{new}"')

          # Note: Do not auto-relable fragments. We rely on per-test strict emission
          # and the backfill step to surface missing tests explicitly.
          PY

      - name: Backfill missing NL/T tests (fail placeholders)
        if: always()
        shell: bash
        run: |
          python3 - <<'PY'
          from pathlib import Path
          import xml.etree.ElementTree as ET
          import re
          import shutil

          DESIRED = ["NL-0","NL-1","NL-2","NL-3","NL-4","T-A","T-B","T-C","T-D","T-E","T-F","T-G","T-H","T-I","T-J","GO-0","GO-1","GO-2","GO-3","GO-4","GO-5","GO-6","GO-7","GO-8","GO-9","GO-10"]
          seen = set()
          bad = set()
          def id_from_filename(p: Path):
            n = p.name
            m = re.match(r'NL-?(\d+)_results\.xml$', n, re.I)
            if m:
              return f"NL-{int(m.group(1))}"
            m = re.match(r'T-?([A-J])_results\.xml$', n, re.I)
            if m:
              return f"T-{m.group(1).upper()}"
            m = re.match(r'GO-?(\d+)_results\.xml$', n, re.I)
            if m:
              return f"GO-{int(m.group(1))}"
            return None

          for p in Path("reports").glob("*_results.xml"):
            fid = id_from_filename(p)
            try:
              r = ET.parse(p).getroot()
            except Exception:
              # If the file exists but isn't parseable, preserve it for debugging and
              # treat it as a failing (malformed) fragment rather than "not produced".
              if fid in DESIRED and p.exists() and p.stat().st_size > 0:
                staging = Path("reports/_staging")
                staging.mkdir(parents=True, exist_ok=True)
                preserved = staging / f"{fid}_malformed.xml"
                try:
                  shutil.copyfile(p, preserved)
                except Exception:
                  pass
                bad.add(fid)
              continue
            # Count by filename id primarily; fall back to testcase name if needed
            if fid in DESIRED:
              seen.add(fid)
              continue
            if r.tag == "testcase":
              name = (r.get("name") or "").strip()
              for d in DESIRED:
                if name.startswith(d):
                  seen.add(d)
                  break

          Path("reports").mkdir(parents=True, exist_ok=True)
          for d in DESIRED:
            if d in seen:
              continue
            frag = Path(f"reports/{d}_results.xml")
            tc = ET.Element("testcase", {"classname":"UnityMCP.NL-T", "name": d})
            if d in bad:
              fail = ET.SubElement(tc, "failure", {"message":"malformed xml"})
              fail.text = "The agent wrote a fragment file, but it was not valid XML (parse failed). See reports/_staging/*_malformed.xml for the preserved original."
            else:
              fail = ET.SubElement(tc, "failure", {"message":"not produced"})
              fail.text = "The agent did not emit a fragment for this test."
            ET.ElementTree(tc).write(frag, encoding="utf-8", xml_declaration=False)
            print(f"backfill: {d}")
          PY

      - name: "Debug: list testcase names"
        if: always()
        run: |
          python3 - <<'PY'
          from pathlib import Path
          import xml.etree.ElementTree as ET
          for p in sorted(Path('reports').glob('*_results.xml')):
              try:
                  r = ET.parse(p).getroot()
                  if r.tag == 'testcase':
                      print(f"{p.name}: {(r.get('name') or '').strip()}")
              except Exception:
                  pass
          PY

      # ---------- Merge testcase fragments into JUnit ----------
      - name: Normalize/assemble JUnit in-place (single file)
        if: always()
        shell: bash
        run: |
          python3 - <<'PY'
          from pathlib import Path
          import xml.etree.ElementTree as ET
          import re, os

          def localname(tag: str) -> str:
              return tag.rsplit('}', 1)[-1] if '}' in tag else tag

          src = Path(os.environ.get('JUNIT_OUT', 'reports/junit-nl-suite.xml'))
          if not src.exists():
              raise SystemExit(0)

          tree = ET.parse(src)
          root = tree.getroot()
          suite = root.find('./*') if localname(root.tag) == 'testsuites' else root
          if suite is None:
              raise SystemExit(0)

          def id_from_filename(p: Path):
              n = p.name
              m = re.match(r'NL-?(\d+)_results\.xml$', n, re.I)
              if m:
                  return f"NL-{int(m.group(1))}"
              m = re.match(r'T-?([A-J])_results\.xml$', n, re.I)
              if m:
                  return f"T-{m.group(1).upper()}"
              m = re.match(r'GO-?(\d+)_results\.xml$', n, re.I)
              if m:
                  return f"GO-{int(m.group(1))}"
              return None

          def id_from_system_out(tc):
              so = tc.find('system-out')
              if so is not None and so.text:
                  m = re.search(r'\b(NL-\d+|T-[A-Z]|GO-\d+)\b', so.text)
                  if m:
                      return m.group(1)
              return None

          fragments = sorted(Path('reports').glob('*_results.xml'))
          report_names = {p.name for p in fragments}
          fragments += sorted(p for p in Path('reports/_staging').glob('*_results.xml') if p.name not in report_names)
          if fragments:
              print("merge fragments:", ", ".join(p.as_posix() for p in fragments))
          added = 0
          renamed = 0

          for frag in fragments:
              tcs = []
              try:
                  froot = ET.parse(frag).getroot()
                  if localname(froot.tag) == 'testcase':
                      tcs = [froot]
                  else:
                      tcs = list(froot.findall('.//testcase'))
              except Exception:
                  txt = Path(frag).read_text(encoding='utf-8', errors='replace')
                  # Extract all testcase nodes from raw text
                  nodes = re.findall(r'<testcase[\s\S]*?</testcase>', txt, flags=re.DOTALL)
                  for m in nodes:
                      try:
                          tcs.append(ET.fromstring(m))
                      except Exception:
                          pass

              # Guard: keep only the first testcase from each fragment
              if len(tcs) > 1:
                  tcs = tcs[:1]

              test_id = id_from_filename(frag)

              for tc in tcs:
                  current_name = tc.get('name') or ''
                  tid = test_id or id_from_system_out(tc)
                  # Enforce filename-derived ID as prefix; repair names if needed
                  if tid and not re.match(r'^\s*(NL-\d+|T-[A-Z]|GO-\d+)\b', current_name):
                      title = current_name.strip()
                      new_name = f'{tid} — {title}' if title else tid
                      tc.set('name', new_name)
                  elif tid and not re.match(rf'^\s*{re.escape(tid)}\b', current_name):
                      # Replace any wrong leading ID with the correct one
                      title = re.sub(r'^\s*(NL-\d+|T-[A-Z]|GO-\d+)\s*[—–:\-]\s*', '', current_name).strip()
                      new_name = f'{tid} — {title}' if title else tid
                      tc.set('name', new_name)
                      renamed += 1
                  suite.append(tc)
                  added += 1
                  print(f"merge add: {frag.name} -> {tc.get('name')}")

          if added:
              # Drop bootstrap placeholder and recompute counts
              for tc in list(suite.findall('.//testcase')):
                  if (tc.get('name') or '') == 'NL-Suite.Bootstrap':
                      suite.remove(tc)
              testcases = suite.findall('.//testcase')
              failures_cnt = sum(1 for tc in testcases if (tc.find('failure') is not None or tc.find('error') is not None))
              suite.set('tests', str(len(testcases)))
              suite.set('failures', str(failures_cnt))
              suite.set('errors', '0')
              suite.set('skipped', '0')
              tree.write(src, encoding='utf-8', xml_declaration=True)
              print(f"Appended {added} testcase(s); renamed {renamed} to canonical NL/T names.")
          PY

      # Guard is GO-specific; only parse GO fragments here.
      - name: "Guard: ensure GO fragments merged into JUnit"
        if: always()
        shell: bash
        run: |
          python3 - <<'PY'
          from pathlib import Path
          import xml.etree.ElementTree as ET
          import os, re

          def localname(tag: str) -> str:
              return tag.rsplit('}', 1)[-1] if '}' in tag else tag

          junit_path = Path(os.environ.get('JUNIT_OUT', 'reports/junit-nl-suite.xml'))
          if not junit_path.exists():
              raise SystemExit(0)

          tree = ET.parse(junit_path)
          root = tree.getroot()
          suite = root.find('./*') if localname(root.tag) == 'testsuites' else root
          if suite is None:
              raise SystemExit(0)

          def id_from_filename(p: Path):
              n = p.name
              m = re.match(r'GO-?(\d+)_results\.xml$', n, re.I)
              if m:
                  return f"GO-{int(m.group(1))}"
              return None

          expected = set()
          for p in list(Path("reports").glob("GO-*_results.xml")) + list(Path("reports/_staging").glob("GO-*_results.xml")):
              fid = id_from_filename(p)
              if fid:
                  expected.add(fid)

          seen = set()
          for tc in suite.findall('.//testcase'):
              name = (tc.get('name') or '').strip()
              m = re.match(r'(GO-\d+)\b', name)
              if m:
                  seen.add(m.group(1))

          missing = sorted(expected - seen)
          if missing:
              print(f"::error::GO fragments present but not merged into JUnit: {' '.join(missing)}")
              raise SystemExit(1)
          PY

      # ---------- Markdown summary from JUnit ----------
      - name: Build markdown summary from JUnit
        if: always()
        shell: bash
        run: |
          python3 - <<'PY'
          import xml.etree.ElementTree as ET
          from pathlib import Path
          import os, html, re

          def localname(tag: str) -> str:
              return tag.rsplit('}', 1)[-1] if '}' in tag else tag

          src = Path(os.environ.get('JUNIT_OUT', 'reports/junit-nl-suite.xml'))
          md_out = Path(os.environ.get('MD_OUT', 'reports/junit-nl-suite.md'))
          md_out.parent.mkdir(parents=True, exist_ok=True)

          if not src.exists():
              md_out.write_text("# Unity NL/T Editing Suite Test Results\n\n(No JUnit found)\n", encoding='utf-8')
              raise SystemExit(0)

          tree = ET.parse(src)
          root = tree.getroot()
          suite = root.find('./*') if localname(root.tag) == 'testsuites' else root
          cases = [] if suite is None else list(suite.findall('.//testcase'))

          def id_from_case(tc):
              n = (tc.get('name') or '')
              m = re.match(r'\s*(NL-\d+|T-[A-Z]|GO-\d+)\b', n)
              if m:
                  return m.group(1)
              so = tc.find('system-out')
              if so is not None and so.text:
                  m = re.search(r'\b(NL-\d+|T-[A-Z]|GO-\d+)\b', so.text)
                  if m:
                      return m.group(1)
              return None

          id_status = {}
          name_map = {}
          for tc in cases:
              tid = id_from_case(tc)
              ok = (tc.find('failure') is None and tc.find('error') is None)
              if tid and tid not in id_status:
                  id_status[tid] = ok
                  name_map[tid] = (tc.get('name') or tid)

          desired = ['NL-0','NL-1','NL-2','NL-3','NL-4','T-A','T-B','T-C','T-D','T-E','T-F','T-G','T-H','T-I','T-J','GO-0','GO-1','GO-2','GO-3','GO-4','GO-5','GO-6','GO-7','GO-8','GO-9','GO-10']
          default_titles = {
              'NL-0': 'Baseline State Capture',
              'NL-1': 'Core Method Operations',
              'NL-2': 'Anchor Comment Insertion',
              'NL-3': 'End-of-Class Content',
              'NL-4': 'Console State Verification',
              'T-A': 'Temporary Helper',
              'T-B': 'Method Body Interior',
              'T-C': 'Different Method Interior',
              'T-D': 'End-of-Class Helper',
              'T-E': 'Method Evolution',
              'T-F': 'Atomic Multi-Edit',
              'T-G': 'Path Normalization',
              'T-H': 'Validation on Modified',
              'T-I': 'Failure Surface',
              'T-J': 'Idempotency',
              'GO-0': 'Hierarchy with ComponentTypes',
              'GO-1': 'Find GameObjects Tool',
              'GO-2': 'GameObject Resource Read',
              'GO-3': 'Components Resource Read',
              'GO-4': 'Manage Components Tool',
              'GO-5': 'Find GameObjects by Name',
              'GO-6': 'Find GameObjects by Tag',
              'GO-7': 'Single Component Resource Read',
              'GO-8': 'Remove Component',
              'GO-9': 'Find with Pagination',
              'GO-10': 'Deprecation Warnings',
          }

          def display_name(test_id: str) -> str:
              # Prefer the emitted testcase "name" attribute (it may already include ID + title).
              n = (name_map.get(test_id) or '').strip()
              if n:
                  return n
              t = (default_titles.get(test_id) or '').strip()
              return f"{test_id} — {t}" if t else test_id

          total = len(cases)
          failures = sum(1 for tc in cases if (tc.find('failure') is not None or tc.find('error') is not None))
          passed = total - failures

          lines = []
          lines += [
              '# Unity NL/T Editing Suite Test Results',
              '',
              f'Totals: {passed} passed, {failures} failed, {total} total',
              '',
              '## Test Checklist'
          ]
          for p in desired:
              st = id_status.get(p, None)
              label = display_name(p)
              lines.append(f"- [x] {label}" if st is True else (f"- [ ] {label} (fail)" if st is False else f"- [ ] {label} (not run)"))
          lines.append('')

          lines.append('## Test Details (trimmed)')

          def order_key(n: str):
              if n.startswith('NL-'):
                  try:
                      return (0, int(n.split('-')[1]))
                  except:
                      return (0, 999)
              if n.startswith('T-') and len(n) > 2:
                  return (1, ord(n[2]))
              if n.startswith('GO-'):
                  try:
                      return (2, int(n.split('-')[1]))
                  except:
                      return (2, 999)
              return (3, n)

          MAX_CHARS = 800
          MAX_LINES = 8
          seen = set()
          for tid in sorted(id_status.keys(), key=order_key):
              seen.add(tid)
              tc = next((c for c in cases if (id_from_case(c) == tid)), None)
              if not tc:
                  continue
              title = name_map.get(tid, tid)
              status_badge = "PASS" if id_status[tid] else "FAIL"
              lines.append(f"### {title} — {status_badge}")
              so = tc.find('system-out')
              text = '' if so is None or so.text is None else html.unescape(so.text.replace('\r\n','\n'))
              if text.strip():
                  t = text.strip()
                  truncated = False
                  lines_out = t.splitlines()
                  if len(lines_out) > MAX_LINES:
                      t = "\n".join(lines_out[:MAX_LINES]).rstrip()
                      truncated = True
                  if len(t) > MAX_CHARS:
                      t = t[:MAX_CHARS].rstrip()
                      truncated = True
                  if truncated:
                      t += "\n…(truncated)"
                  fence = '```' if '```' not in t else '````'
                  lines += [fence, t, fence]
              else:
                  lines.append('(no system-out)')
              node = tc.find('failure') or tc.find('error')
              if node is not None:
                  msg = (node.get('message') or '').strip()
                  body = (node.text or '').strip()
                  if msg:
                      lines.append(f"- Message: {msg}")
                  if body:
                      lines.append(f"- Detail: {body.splitlines()[0][:500]}")
              lines.append('')

          for tc in cases:
              if id_from_case(tc) in seen:
                  continue
              title = tc.get('name') or '(unnamed)'
              status_badge = "PASS" if (tc.find('failure') is None and tc.find('error') is None) else "FAIL"
              lines.append(f"### {title} — {status_badge}")
              lines.append('(unmapped test id)')
              lines.append('')

          md_out.write_text('\n'.join(lines), encoding='utf-8')
          PY

      # ---------- CI gate: fail job if any NL/T test missing or failed ----------
      - name: Fail CI if NL/T incomplete or failed
        if: always()
        shell: bash
        run: |
          python3 - <<'PY'
          import os, re, sys
          from pathlib import Path
          import xml.etree.ElementTree as ET

          desired = ['NL-0','NL-1','NL-2','NL-3','NL-4','T-A','T-B','T-C','T-D','T-E','T-F','T-G','T-H','T-I','T-J','GO-0','GO-1','GO-2','GO-3','GO-4','GO-5','GO-6','GO-7','GO-8','GO-9','GO-10']

          junit_path = Path(os.environ.get('JUNIT_OUT', 'reports/junit-nl-suite.xml'))
          if not junit_path.exists():
              print("::error::No JUnit output found; failing CI gate.")
              sys.exit(1)

          def localname(tag: str) -> str:
              return tag.rsplit('}', 1)[-1] if '}' in tag else tag

          tree = ET.parse(junit_path)
          root = tree.getroot()
          suite = root.find('./*') if localname(root.tag) == 'testsuites' else root
          cases = [] if suite is None else list(suite.findall('.//testcase'))

          def id_from_case(tc):
              name = (tc.get('name') or '').strip()
              m = re.match(r'(NL-\d+|T-[A-Z]|GO-\d+)\b', name)
              if m:
                  return m.group(1)
              so = tc.find('system-out')
              if so is not None and so.text:
                  m = re.search(r'\b(NL-\d+|T-[A-Z]|GO-\d+)\b', so.text)
                  if m:
                      return m.group(1)
              return None

          # Determine status per desired ID (first occurrence wins, matching the summary builder)
          id_status = {}
          for tc in cases:
              tid = id_from_case(tc)
              if not tid or tid not in desired or tid in id_status:
                  continue
              ok = (tc.find('failure') is None and tc.find('error') is None)
              id_status[tid] = ok

          missing = [d for d in desired if d not in id_status]
          failed = [d for d, ok in id_status.items() if ok is False]

          if missing:
              print(f"::error::Missing NL/T tests in JUnit: {' '.join(missing)}")
          if failed:
              print(f"::error::Failing NL/T tests in JUnit: {' '.join(sorted(failed))}")

          # Gate: all desired must be present and passing
          if missing or failed:
              sys.exit(1)

          print("NL/T CI gate passed: all required tests present and passing.")
          PY

      # ---------- Collect execution transcript (if present) ----------
      - name: Collect action execution transcript
        if: always()
        shell: bash
        run: |
          set -eux
          if [ -f "$RUNNER_TEMP/claude-execution-output.json" ]; then
            cp "$RUNNER_TEMP/claude-execution-output.json" reports/claude-execution-output.json
          elif [ -f "/home/runner/work/_temp/claude-execution-output.json" ]; then
            cp "/home/runner/work/_temp/claude-execution-output.json" reports/claude-execution-output.json
          fi

      - name: Sanitize markdown (normalize newlines)
        if: always()
        run: |
          set -eu
          python3 - <<'PY'
          from pathlib import Path
          rp=Path('reports'); rp.mkdir(parents=True, exist_ok=True)
          for p in rp.glob('*.md'):
              b=p.read_bytes().replace(b'\x00', b'')
              s=b.decode('utf-8','replace').replace('\r\n','\n')
              p.write_text(s, encoding='utf-8', newline='\n')
          PY

      - name: NL/T details -> Job Summary
        if: always()
        run: |
          python3 - <<'PY' >> $GITHUB_STEP_SUMMARY
          from pathlib import Path

          print("## Unity NL/T Editing Suite — Summary")
          print("")

          p = Path('reports/junit-nl-suite.md')
          if not p.exists():
              print("_No markdown report found._")
              raise SystemExit(0)

          text = p.read_bytes().decode('utf-8', 'replace').replace('\r\n', '\n')
          lines = text.splitlines()

          details_start = None
          for i, line in enumerate(lines):
              if line.startswith("## Test Details"):
                  details_start = i
                  break

          # Keep the summary compact: show heading/totals/checklist only.
          prefix_lines = lines if details_start is None else lines[:details_start]
          prefix = "\n".join(prefix_lines).strip()
          if prefix:
              print(prefix)
          else:
              print("_No summary section found in markdown report._")

          failed_blocks = []
          if details_start is not None:
              i = details_start + 1
              while i < len(lines):
                  line = lines[i]
                  if line.startswith("### "):
                      block = [line]
                      i += 1
                      while i < len(lines) and not lines[i].startswith("### "):
                          block.append(lines[i])
                          i += 1
                      if " — FAIL" in line or " - FAIL" in line:
                          failed_blocks.append(block)
                      continue
                  i += 1

          if failed_blocks:
              print("")
              print("## Failing Test Details")
              print("")
              max_block_lines = 40
              for block in failed_blocks:
                  if len(block) > max_block_lines:
                      block = block[:max_block_lines] + ["…(truncated)"]
                  print("\n".join(block).rstrip())
                  print("")
          else:
              print("")
              print("_All tests passed. Full per-test details are in artifact file `reports/junit-nl-suite.md`._")
          PY

      - name: Fallback JUnit if missing
        if: always()
        run: |
          set -eu
          mkdir -p reports
          if [ ! -f "$JUNIT_OUT" ]; then
            printf '%s\n' \
              '<?xml version="1.0" encoding="UTF-8"?>' \
              '<testsuite name="UnityMCP.NL-T" tests="1" failures="1" time="0">' \
              '  <testcase classname="UnityMCP.NL-T" name="NL-Suite.Execution" time="0.0">' \
              '    <failure><![CDATA[No JUnit was produced by the NL suite step. See the step logs.]]></failure>' \
              '  </testcase>' \
              '</testsuite>' \
              > "$JUNIT_OUT"
          fi

      - name: Publish JUnit report
        if: always()
        uses: mikepenz/action-junit-report@v5
        with:
          report_paths: "${{ env.JUNIT_OUT }}"
          include_passed: false
          detailed_summary: false
          annotate_notice: false
          check_annotations: false
          job_summary: false
          verbose_summary: false
          skip_success_summary: true
          require_tests: false
          fail_on_parse_error: true

      - name: Upload artifacts (reports + fragments + transcript + debug)
        if: always()
        uses: actions/upload-artifact@v4
        with:
          name: claude-nl-suite-artifacts
          path: |
            ${{ env.JUNIT_OUT }}
            ${{ env.MD_OUT }}
            reports/*_results.xml
            reports/claude-execution-output.json
            ${{ github.workspace }}/.unity-mcp/mcp-server-startup-debug.log
          retention-days: 7

      # ---------- Always stop Unity ----------
      - name: Stop Unity
        if: always()
        run: |
          docker logs --tail 400 unity-mcp | sed -E 's/((email|serial|license|password|token)[^[:space:]]*)/[REDACTED]/ig' || true
          docker rm -f unity-mcp || true

      - name: Return Pro license (if used)
        if: always() && steps.lic.outputs.use_ebl == 'true' && steps.lic.outputs.has_serial == 'true'
        uses: game-ci/unity-return-license@v2
        continue-on-error: true
        env:
          UNITY_EMAIL: ${{ secrets.UNITY_EMAIL }}
          UNITY_PASSWORD: ${{ secrets.UNITY_PASSWORD }}
          UNITY_SERIAL: ${{ secrets.UNITY_SERIAL }}


================================================
FILE: .github/workflows/github-repo-stats.yml
================================================
name: github-repo-stats

on:
  # schedule:
    # Run this once per day, towards the end of the day for keeping the most
    # recent data point most meaningful (hours are interpreted in UTC).
    #- cron: "0 23 * * *"
  workflow_dispatch: # Allow for running this manually.

jobs:
  j1:
    if: github.repository == 'CoplayDev/unity-mcp'
    name: github-repo-stats
    runs-on: ubuntu-latest
    steps:
      - name: run-ghrs
        # Use latest release.
        uses: jgehrcke/github-repo-stats@RELEASE
        with:
          ghtoken: ${{ secrets.ghrs_github_api_token }}


================================================
FILE: .github/workflows/python-tests.yml
================================================
name: Python Tests

on:
  push:
    branches: ["**"]
    paths:
      - Server/**
      - .github/workflows/python-tests.yml
  workflow_dispatch: {}

jobs:
  test:
    name: Run Python Tests
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Install uv
        uses: astral-sh/setup-uv@v4
        with:
          version: "latest"

      - name: Set up Python
        run: uv python install 3.10

      - name: Install dependencies
        run: |
          cd Server
          uv sync
          uv pip install -e ".[dev]"

      - name: Run tests with coverage
        run: |
          cd Server
          uv run pytest tests/ -v --tb=short --cov --cov-report=xml --cov-report=html --cov-report=term

      - name: Upload coverage reports
        uses: codecov/codecov-action@v4
        if: always()
        with:
          files: ./Server/coverage.xml
          flags: python
          name: python-coverage
          fail_ci_if_error: false

      - name: Upload test results
        uses: actions/upload-artifact@v4
        if: always()
        with:
          name: pytest-results
          path: |
            Server/.pytest_cache/
            Server/tests/
            Server/coverage.xml
            Server/htmlcov/


================================================
FILE: .github/workflows/release.yml
================================================
name: Release

concurrency:
  group: release-main
  cancel-in-progress: false

on:
  workflow_dispatch:
    inputs:
      version_bump:
        description: "Version bump type (none = release beta version as-is)"
        type: choice
        options:
          - patch
          - minor
          - major
          - none
        default: patch
        required: true

jobs:
  bump:
    name: Bump version, tag, and create release
    runs-on: ubuntu-latest
    permissions:
      contents: write
      pull-requests: write
    outputs:
      new_version: ${{ steps.compute.outputs.new_version }}
      tag: ${{ steps.tag.outputs.tag }}
      bump_branch: ${{ steps.bump_branch.outputs.name }}
    steps:
      - name: Ensure workflow is running on main
        shell: bash
        run: |
          set -euo pipefail
          if [[ "${GITHUB_REF_NAME}" != "main" ]]; then
            echo "This workflow must be run on the main branch. Current ref: ${GITHUB_REF_NAME}" >&2
            exit 1
          fi

      - name: Checkout repository
        uses: actions/checkout@v6
        with:
          ref: main
          fetch-depth: 0

      - name: Show current versions
        id: preview
        shell: bash
        run: |
          set -euo pipefail
          echo "============================================"
          echo "CURRENT VERSION STATUS"
          echo "============================================"

          # Get main version
          MAIN_VERSION=$(jq -r '.version' "MCPForUnity/package.json")
          MAIN_PYPI=$(grep -oP '(?<=version = ")[^"]+' Server/pyproject.toml)
          echo "Main branch:"
          echo "  Unity package: $MAIN_VERSION"
          echo "  PyPI server:   $MAIN_PYPI"
          echo ""

          # Get beta version
          git fetch origin beta
          BETA_VERSION=$(git show origin/beta:MCPForUnity/package.json | jq -r '.version')
          BETA_PYPI=$(git show origin/beta:Server/pyproject.toml | grep -oP '(?<=version = ")[^"]+')
          echo "Beta branch:"
          echo "  Unity package: $BETA_VERSION"
          echo "  PyPI server:   $BETA_PYPI"
          echo ""

          # Compute stripped version (used for "none" bump option)
          STRIPPED=$(echo "$BETA_VERSION" | sed -E 's/-[a-zA-Z]+\.[0-9]+$//')
          echo "stripped_version=$STRIPPED" >> "$GITHUB_OUTPUT"

          # Show what will happen
          BUMP="${{ inputs.version_bump }}"
          echo "Selected bump type: $BUMP"
          echo "After stripping beta suffix: $STRIPPED"

          if [[ "$BUMP" == "none" ]]; then
            echo "Release version will be: $STRIPPED"
          else
            IFS='.' read -r MA MI PA <<< "$STRIPPED"
            case "$BUMP" in
              major) ((MA+=1)); MI=0; PA=0 ;;
              minor) ((MI+=1)); PA=0 ;;
              patch) ((PA+=1)) ;;
            esac
            echo "Release version will be: $MA.$MI.$PA"
          fi
          echo "============================================"

      - name: Merge beta into main
        shell: bash
        run: |
          set -euo pipefail
          git config user.name "GitHub Actions"
          git config user.email "actions@github.com"

          # Fetch beta branch
          git fetch origin beta

          # Check if beta has changes not in main
          if git merge-base --is-ancestor origin/beta HEAD; then
            echo "beta is already merged into main. Nothing to merge."
          else
            echo "Merging beta into main..."
            git merge origin/beta --no-edit -m "chore: merge beta into main for release"
            echo "Beta merged successfully."
          fi

      - name: Strip beta suffix from version if present
        shell: bash
        run: |
          set -euo pipefail
          CURRENT_VERSION=$(jq -r '.version' "MCPForUnity/package.json")
          echo "Current version: $CURRENT_VERSION"

          # Strip beta/alpha/rc suffix if present (e.g., "9.4.0-beta.1" -> "9.4.0")
          if [[ "$CURRENT_VERSION" == *"-"* ]]; then
            STABLE_VERSION=$(echo "$CURRENT_VERSION" | sed -E 's/-[a-zA-Z]+\.[0-9]+$//')
            # Validate we have a proper X.Y.Z format after stripping
            if ! [[ "$STABLE_VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
              echo "Error: Could not parse version '$CURRENT_VERSION' -> '$STABLE_VERSION'" >&2
              exit 1
            fi
            echo "Stripping prerelease suffix: $CURRENT_VERSION -> $STABLE_VERSION"
            jq --arg v "$STABLE_VERSION" '.version = $v' MCPForUnity/package.json > tmp.json
            mv tmp.json MCPForUnity/package.json

            # Also update pyproject.toml
            sed -i "s/^version = .*/version = \"${STABLE_VERSION}\"/" Server/pyproject.toml
          else
            echo "Version is already stable: $CURRENT_VERSION"
          fi

      - name: Compute new version
        id: compute
        env:
          PREVIEWED_STRIPPED: ${{ steps.preview.outputs.stripped_version }}
        shell: bash
        run: |
          set -euo pipefail
          BUMP="${{ inputs.version_bump }}"
          CURRENT_VERSION=$(jq -r '.version' "MCPForUnity/package.json")
          echo "Current version: $CURRENT_VERSION"

          # Sanity check: ensure current version matches what was previewed
          if [[ "$CURRENT_VERSION" != "$PREVIEWED_STRIPPED" ]]; then
            echo "Warning: Current version ($CURRENT_VERSION) differs from previewed ($PREVIEWED_STRIPPED)"
            echo "This may indicate an unexpected merge result. Proceeding with current version."
          fi

          if [[ "$BUMP" == "none" ]]; then
            # Use the previewed stripped version to ensure consistency with what user saw
            NEW_VERSION="$PREVIEWED_STRIPPED"
          else
            IFS='.' read -r MA MI PA <<< "$CURRENT_VERSION"
            case "$BUMP" in
              major)
                ((MA+=1)); MI=0; PA=0
                ;;
              minor)
                ((MI+=1)); PA=0
                ;;
              patch)
                ((PA+=1))
                ;;
              *)
                echo "Unknown version_bump: $BUMP" >&2
                exit 1
                ;;
            esac
            NEW_VERSION="$MA.$MI.$PA"
          fi

          echo "New version: $NEW_VERSION"
          echo "new_version=$NEW_VERSION" >> "$GITHUB_OUTPUT"
          echo "current_version=$CURRENT_VERSION" >> "$GITHUB_OUTPUT"

      - name: Compute tag
        id: tag
        env:
          NEW_VERSION: ${{ steps.compute.outputs.new_version }}
        shell: bash
        run: |
          set -euo pipefail
          echo "tag=v${NEW_VERSION}" >> "$GITHUB_OUTPUT"

      - name: Update files to new version
        env:
          NEW_VERSION: ${{ steps.compute.outputs.new_version }}
        shell: bash
        run: |
          set -euo pipefail

          echo "Updating all version references to $NEW_VERSION"
          python3 tools/update_versions.py --version "$NEW_VERSION"

      - name: Commit version bump to a temporary branch
        id: bump_branch
        env:
          NEW_VERSION: ${{ steps.compute.outputs.new_version }}
        shell: bash
        run: |
          set -euo pipefail
          BRANCH="release/v${NEW_VERSION}"
          echo "name=$BRANCH" >> "$GITHUB_OUTPUT"

          git config user.name "GitHub Actions"
          git config user.email "actions@github.com"
          git checkout -b "$BRANCH"
          git add MCPForUnity/package.json manifest.json "Server/pyproject.toml" Server/README.md
          if git diff --cached --quiet; then
            echo "No version changes to commit."
          else
            git commit -m "chore: bump version to ${NEW_VERSION}"
          fi

          echo "Pushing bump branch $BRANCH"
          git push origin "$BRANCH"

      - name: Create PR for version bump into main
        id: bump_pr
        env:
          GH_TOKEN: ${{ github.token }}
          NEW_VERSION: ${{ steps.compute.outputs.new_version }}
          BRANCH: ${{ steps.bump_branch.outputs.name }}
        shell: bash
        run: |
          set -euo pipefail
          PR_URL=$(gh pr create \
            --base main \
            --head "$BRANCH" \
            --title "chore: bump version to ${NEW_VERSION}" \
            --body "Automated version bump to ${NEW_VERSION}.")
          echo "pr_url=$PR_URL" >> "$GITHUB_OUTPUT"
          PR_NUMBER=$(echo "$PR_URL" | grep -oE '[0-9]+$')
          echo "pr_number=$PR_NUMBER" >> "$GITHUB_OUTPUT"

      - name: Enable auto-merge and merge PR
        env:
          GH_TOKEN: ${{ github.token }}
          PR_NUMBER: ${{ steps.bump_pr.outputs.pr_number }}
        shell: bash
        run: |
          set -euo pipefail
          # Enable auto-merge (requires repo setting "Allow auto-merge")
          gh pr merge "$PR_NUMBER" --merge --auto || true
          # Wait for PR to be merged (poll up to 2 minutes)
          for i in {1..24}; do
            STATE=$(gh pr view "$PR_NUMBER" --json state -q '.state')
            if [[ "$STATE" == "MERGED" ]]; then
              echo "PR merged successfully."
              exit 0
            fi
            echo "Waiting for PR to merge... (state: $STATE)"
            sleep 5
          done
          echo "PR did not merge in time. Attempting direct merge..."
          gh pr merge "$PR_NUMBER" --merge

      - name: Fetch merged main and create tag
        env:
          TAG: ${{ steps.tag.outputs.tag }}
        shell: bash
        run: |
          set -euo pipefail
          git fetch origin main
          git checkout main
          git pull origin main

          echo "Preparing to create tag $TAG"

          if git ls-remote --tags origin | grep -q "refs/tags/$TAG$"; then
            echo "Tag $TAG already exists on remote. Refusing to release." >&2
            exit 1
          fi

          git tag -a "$TAG" -m "Version ${TAG#v}"
          git push origin "$TAG"

      - name: Clean up release branch
        if: always()
        env:
          GH_TOKEN: ${{ github.token }}
          BRANCH: ${{ steps.bump_branch.outputs.name }}
        shell: bash
        run: |
          set -euo pipefail
          git push origin --delete "$BRANCH" || true

      - name: Create GitHub release
        uses: softprops/action-gh-release@v2
        with:
          tag_name: ${{ steps.tag.outputs.tag }}
          name: ${{ steps.tag.outputs.tag }}
          generate_release_notes: true

  sync_beta:
    name: Merge main back into beta via PR
    needs:
      - bump
    runs-on: ubuntu-latest
    permissions:
      contents: write
      pull-requests: write
    steps:
      - name: Checkout beta
        uses: actions/checkout@v6
        with:
          ref: beta
          fetch-depth: 0

      - name: Prepare sync branch from beta with merged main
        id: sync_branch
        env:
          NEW_VERSION: ${{ needs.bump.outputs.new_version }}
        shell: bash
        run: |
          set -euo pipefail
          git config user.name "GitHub Actions"
          git config user.email "actions@github.com"

          # Fetch both branches so we can build a merge commit in CI.
          git fetch origin main beta
          if git merge-base --is-ancestor origin/main origin/beta; then
            echo "beta is already up to date with main. Skipping sync."
            echo "skipped=true" >> "$GITHUB_OUTPUT"
            exit 0
          fi

          SYNC_BRANCH="sync/main-v${NEW_VERSION}-into-beta-${GITHUB_RUN_ID}"
          echo "name=$SYNC_BRANCH" >> "$GITHUB_OUTPUT"
          echo "skipped=false" >> "$GITHUB_OUTPUT"

          git checkout -b "$SYNC_BRANCH" origin/beta

          if git merge origin/main --no-ff --no-commit; then
            echo "main merged cleanly into sync branch."
          else
            echo "Merge conflicts detected. Attempting expected conflict resolution for beta version files."
            CONFLICTS=$(git diff --name-only --diff-filter=U || true)
            if [[ -n "$CONFLICTS" ]]; then
              echo "$CONFLICTS"
            fi

            # Keep beta-side prerelease versions if these files conflict.
            for file in MCPForUnity/package.json Server/pyproject.toml; do
              if git ls-files -u -- "$file" | grep -q .; then
                echo "Keeping beta version for $file"
                git checkout --ours -- "$file"
                git add "$file"
              fi
            done

            REMAINING=$(git diff --name-only --diff-filter=U || true)
            if [[ -n "$REMAINING" ]]; then
              echo "Unexpected unresolved conflicts remain:"
              echo "$REMAINING"
              exit 1
            fi
          fi

          git commit -m "chore: sync main (v${NEW_VERSION}) into beta"

          # After releasing X.Y.Z on main, beta should move to X.Y.(Z+1)-beta.1.
          IFS='.' read -r MAJOR MINOR PATCH <<< "$NEW_VERSION"
          NEXT_PATCH=$((PATCH + 1))
          NEXT_BETA_VERSION="${MAJOR}.${MINOR}.${NEXT_PATCH}-beta.1"
          echo "beta_version=$NEXT_BETA_VERSION" >> "$GITHUB_OUTPUT"
          echo "Setting beta version to $NEXT_BETA_VERSION"

          CURRENT_BETA_VERSION=$(jq -r '.version' MCPForUnity/package.json)
          if [[ "$CURRENT_BETA_VERSION" != "$NEXT_BETA_VERSION" ]]; then
            jq --arg v "$NEXT_BETA_VERSION" '.version = $v' MCPForUnity/package.json > tmp.json
            mv tmp.json MCPForUnity/package.json
            git add MCPForUnity/package.json
            git commit -m "chore: set beta version to ${NEXT_BETA_VERSION} after release v${NEW_VERSION}"
          else
            echo "Beta version already at target: $NEXT_BETA_VERSION"
          fi

          echo "Pushing sync branch $SYNC_BRANCH"
          git push origin "$SYNC_BRANCH"

      - name: Create PR to merge sync branch into beta
        if: steps.sync_branch.outputs.skipped != 'true'
        id: sync_pr
        env:
          GH_TOKEN: ${{ github.token }}
          NEW_VERSION: ${{ needs.bump.outputs.new_version }}
          NEXT_BETA_VERSION: ${{ steps.sync_branch.outputs.beta_version }}
          SYNC_BRANCH: ${{ steps.sync_branch.outputs.name }}
        shell: bash
        run: |
          set -euo pipefail
          PR_URL=$(gh pr create \
            --base beta \
            --head "$SYNC_BRANCH" \
            --title "chore: sync main (v${NEW_VERSION}) into beta" \
            --body "Automated sync of main back into beta after release v${NEW_VERSION}, including beta version set to ${NEXT_BETA_VERSION}.")
          echo "pr_url=$PR_URL" >> "$GITHUB_OUTPUT"
          PR_NUMBER=$(echo "$PR_URL" | grep -oE '[0-9]+$')
          echo "pr_number=$PR_NUMBER" >> "$GITHUB_OUTPUT"

      - name: Merge sync PR
        if: steps.sync_branch.outputs.skipped != 'true'
        env:
          GH_TOKEN: ${{ github.token }}
          PR_NUMBER: ${{ steps.sync_pr.outputs.pr_number }}
        shell: bash
        run: |
          set -euo pipefail

          # Best effort: auto-merge if repository settings allow it.
          gh pr merge "$PR_NUMBER" --merge --auto --delete-branch || true

          # Retry direct merge for up to 2 minutes while checks settle.
          for i in {1..24}; do
            STATE=$(gh pr view "$PR_NUMBER" --json state -q '.state')
            if [[ "$STATE" == "MERGED" ]]; then
              echo "Sync PR merged successfully."
              exit 0
            fi

            if gh pr merge "$PR_NUMBER" --merge --delete-branch >/dev/null 2>&1; then
              echo "Sync PR merged successfully."
              exit 0
            fi

            echo "Waiting for sync PR to become mergeable... (state: $STATE)"
            sleep 5
          done

          echo "Sync PR did not merge in time."
          gh pr view "$PR_NUMBER" --json state,mergeStateStatus,isDraft -q '{state: .state, mergeStateStatus: .mergeStateStatus, isDraft: .isDraft}'
          exit 1

  publish_docker:
    name: Publish Docker image
    needs:
      - bump
    runs-on: ubuntu-latest
    permissions:
      contents: read
    steps:
      - name: Check out the repo
        uses: actions/checkout@v6
        with:
          ref: ${{ needs.bump.outputs.tag }}
          fetch-depth: 0

      - name: Build and push Docker image
        uses: ./.github/actions/publish-docker
        with:
          docker_username: ${{ secrets.DOCKER_USERNAME }}
          docker_password: ${{ secrets.DOCKER_PASSWORD }}
          image: ${{ secrets.DOCKER_USERNAME }}/mcp-for-unity-server
          version: ${{ needs.bump.outputs.new_version }}
          include_branch_tags: "false"
          context: .
          dockerfile: Server/Dockerfile
          platforms: linux/amd64

  publish_pypi:
    name: Publish Python distribution to PyPI
    needs:
      - bump
    runs-on: ubuntu-latest
    environment:
      name: pypi
      url: https://pypi.org/p/mcpforunityserver
    permissions:
      contents: read
      id-token: write
    steps:
      - uses: actions/checkout@v6
        with:
          ref: ${{ needs.bump.outputs.tag }}
          fetch-depth: 0

      # Inlined from .github/actions/publish-pypi to avoid nested composite action issue
      # with pypa/gh-action-pypi-publish (see https://github.com/pypa/gh-action-pypi-publish/issues/338)
      - name: Install uv
        uses: astral-sh/setup-uv@v7
        with:
          version: "latest"
          enable-cache: true
          cache-dependency-glob: "Server/uv.lock"

      - name: Build a binary wheel and a source tarball
        shell: bash
        run: uv build
        working-directory: ./Server

      - name: Publish distribution to PyPI
        uses: pypa/gh-action-pypi-publish@release/v1
        with:
          packages-dir: Server/dist/

  publish_mcpb:
    name: Generate and publish MCPB bundle
    needs:
      - bump
    runs-on: ubuntu-latest
    permissions:
      contents: write
    steps:
      - name: Check out the repo
        uses: actions/checkout@v6
        with:
          ref: ${{ needs.bump.outputs.tag }}
          fetch-depth: 0

      - name: Set up Node.js
        uses: actions/setup-node@v4
        with:
          node-version: "20"

      - name: Set up Python
        uses: actions/setup-python@v5
        with:
          python-version: "3.11"

      - name: Generate MCPB bundle
        env:
          NEW_VERSION: ${{ needs.bump.outputs.new_version }}
        shell: bash
        run: |
          set -euo pipefail
          python3 tools/generate_mcpb.py "$NEW_VERSION" \
            --output "unity-mcp-${NEW_VERSION}.mcpb" \
            --icon docs/images/coplay-logo.png

      - name: Upload MCPB to release
        uses: softprops/action-gh-release@v2
        with:
          tag_name: ${{ needs.bump.outputs.tag }}
          files: unity-mcp-${{ needs.bump.outputs.new_version }}.mcpb


================================================
FILE: .github/workflows/unity-tests.yml
================================================
name: Unity Tests

on:
  workflow_dispatch: {}
  push:
    branches: ["**"]
    paths:
      - TestProjects/UnityMCPTests/**
      - MCPForUnity/Editor/**
      - .github/workflows/unity-tests.yml

jobs:
  testAllModes:
    name: Test in ${{ matrix.testMode }}
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        projectPath:
          - TestProjects/UnityMCPTests
        testMode:
          - editmode
        unityVersion:
          - 2021.3.45f2
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4
        with:
          lfs: true

      - name: Detect Unity license secrets
        id: detect
        env:
          UNITY_LICENSE: ${{ secrets.UNITY_LICENSE }}
          UNITY_EMAIL: ${{ secrets.UNITY_EMAIL }}
          UNITY_PASSWORD: ${{ secrets.UNITY_PASSWORD }}
          UNITY_SERIAL: ${{ secrets.UNITY_SERIAL }}
        run: |
          set -e
          if [ -n "$UNITY_LICENSE" ] || { [ -n "$UNITY_EMAIL" ] && [ -n "$UNITY_PASSWORD" ] && [ -n "$UNITY_SERIAL" ]; }; then
            echo "unity_ok=true" >> "$GITHUB_OUTPUT"
          else
            echo "unity_ok=false" >> "$GITHUB_OUTPUT"
          fi

      - name: Skip Unity tests (missing license secrets)
        if: steps.detect.outputs.unity_ok != 'true'
        run: |
          echo "Unity license secrets missing; skipping Unity tests."

      - uses: actions/cache@v4
        with:
          path: ${{ matrix.projectPath }}/Library
          key: Library-${{ matrix.projectPath }}-${{ matrix.unityVersion }}
          restore-keys: |
            Library-${{ matrix.projectPath }}-
            Library-

      # Run domain reload tests first (they're [Explicit] so need explicit category)
      - name: Run domain reload tests
        if: steps.detect.outputs.unity_ok == 'true'
        uses: game-ci/unity-test-runner@v4
        id: domain-tests
        env:
          UNITY_EMAIL: ${{ secrets.UNITY_EMAIL }}
          UNITY_PASSWORD: ${{ secrets.UNITY_PASSWORD }}
          UNITY_LICENSE: ${{ secrets.UNITY_LICENSE }}
          UNITY_SERIAL: ${{ secrets.UNITY_SERIAL }}
        with:
          projectPath: ${{ matrix.projectPath }}
          unityVersion: ${{ matrix.unityVersion }}
          testMode: ${{ matrix.testMode }}
          customParameters: -testCategory domain_reload

      - name: Run tests
        if: steps.detect.outputs.unity_ok == 'true'
        uses: game-ci/unity-test-runner@v4
        id: tests
        env:
          UNITY_EMAIL: ${{ secrets.UNITY_EMAIL }}
          UNITY_PASSWORD: ${{ secrets.UNITY_PASSWORD }}
          UNITY_LICENSE: ${{ secrets.UNITY_LICENSE }}
          UNITY_SERIAL: ${{ secrets.UNITY_SERIAL }}
        with:
          projectPath: ${{ matrix.projectPath }}
          unityVersion: ${{ matrix.unityVersion }}
          testMode: ${{ matrix.testMode }}

      - uses: actions/upload-artifact@v4
        if: always() && steps.detect.outputs.unity_ok == 'true'
        with:
          name: Test results for ${{ matrix.testMode }}
          path: ${{ steps.tests.outputs.artifactsPath }}


================================================
FILE: .gitignore
================================================
# AI-related files (user-specific)
.cursorrules
.cursorignore
.windsurf
.codeiumignore
.kiro

# Code-copy related files
.clipignore

# Python-generated files
__pycache__/
__pycache__.meta
build/
dist/
wheels/
*.egg-info

# Test coverage
.coverage
.coverage.*
htmlcov/
coverage.xml
*.cover

# Virtual environments
.venv

# Environment files (API keys)
.env

# Unity Editor
*.unitypackage
*.asset
LICENSE.meta
CONTRIBUTING.md.meta

# IDE
.idea/
.vscode/
.aider*
.DS_Store*
# Unity test project lock files
TestProjects/UnityMCPTests/Packages/packages-lock.json

# UnityMCPTests stress-run artifacts (these are created by tests/tools and should never be committed)
TestProjects/UnityMCPTests/Assets/Temp/

# Backup artifacts
*.backup
*.backup.meta

.wt-origin-main/

# CI test reports (generated during test runs)
reports/

# Local testing harness
scripts/local-test/
.claude/settings.local.json

# Ignore the .claude directory, since it might contain local/project-level setting such as deny and allowlist.
/.claude


================================================
FILE: .mcpbignore
================================================
# MCPB Ignore File
# This bundle uses uvx pattern - package downloaded from PyPI at runtime
# Only manifest.json, icon.png, README.md, and LICENSE are needed

# Server source code (downloaded via uvx from PyPI)
Server/

# Unity Client plugin (separate installation)
MCPForUnity/

# Test projects
TestProjects/

# Documentation folder
docs/

# Custom Tools (shipped separately)
CustomTools/

# Development scripts at root
scripts/
tools/

# Claude skill zip (separate distribution)
claude_skill_unity.zip

# Development batch files
deploy-dev.bat
restore-dev.bat

# Test files at root
test_unity_socket_framing.py
mcp_source.py
prune_tool_results.py

# Docker
docker-compose.yml
.dockerignore
Dockerfile

# Chinese README (keep English only)
README-zh.md

# GitHub and CI
.github/
.claude/

# IDE
.vscode/
.idea/

# Python artifacts
*.pyc
__pycache__/
.pytest_cache/
.mypy_cache/
*.egg-info/
dist/
build/

# Environment
.env*
*.local
.venv/
venv/

# Git
.git/
.gitignore
.gitattributes

# Package management
uv.lock
poetry.lock
requirements*.txt
pyproject.toml

# Logs and temp
*.log
*.tmp
.DS_Store
Thumbs.db


================================================
FILE: CLAUDE.md
================================================
# CLAUDE.md

This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.

## What This Project Is

**MCP for Unity** is a bridge that lets AI assistants (Claude, Cursor, Windsurf, etc.) control the Unity Editor through the Model Context Protocol (MCP). It enables AI-driven game development workflows - creating GameObjects, editing scripts, managing assets, running tests, and more.

## Architecture

```text
AI Assistant (Claude/Cursor)
        ↓ MCP Protocol (stdio/HTTP)
Python Server (Server/src/)
        ↓ WebSocket + HTTP
Unity Editor Plugin (MCPForUnity/)
        ↓ Unity Editor API
Scene, Assets, Scripts
```

**Two codebases, one system:**
- `Server/` - Python MCP server using FastMCP
- `MCPForUnity/` - Unity C# Editor package

### Three Layers on the Python Side

The Python server has three distinct layers. These are **not** auto-generated from each other:

| Layer | Location | Framework | Purpose |
|-------|----------|-----------|---------|
| **MCP Tools** | `Server/src/services/tools/` | FastMCP (`@mcp_for_unity_tool`) | Exposed to AI assistants via MCP protocol |
| **CLI Commands** | `Server/src/cli/commands/` | Click (`@click.command`) | Terminal interface for developers |
| **Resources** | `Server/src/services/resources/` | FastMCP (`@mcp_for_unity_resource`) | Read-only state exposed to AI assistants |

MCP tools call Unity via WebSocket (`send_with_unity_instance`). CLI commands call Unity via HTTP (`run_command`). Both route to the same C# `HandleCommand` methods.

### Transport Modes

- **Stdio**: Single-agent only. Separate Python process per client. Legacy TCP bridge to Unity. New connections stomp old ones.
- **HTTP**: Multi-agent ready. Single shared Python server. WebSocket hub at `/hub/plugin`. Session isolation via `client_id`.

## Code Philosophy

### 1. Domain Symmetry
Python MCP tools mirror C# Editor tools. Each domain exists in both:
- `Server/src/services/tools/manage_material.py` ↔ `MCPForUnity/Editor/Tools/ManageMaterial.cs`
- CLI commands (`Server/src/cli/commands/`) also mirror these but are a separate implementation.

### 2. Minimal Abstraction
Avoid premature abstraction. Three similar lines of code is better than a helper that's used once. Only abstract when you have 3+ genuine use cases.

### 3. Delete Rather Than Deprecate
When removing functionality, delete it completely. No `_unused` renames, no `// removed` comments, no backwards-compatibility shims for internal code.

### 4. Test Coverage Required
Every new feature needs tests. Run them before PRs.

### 5. Keep Tools Focused
Each MCP tool does one thing well. Resist the urge to add "convenient" parameters that bloat the API surface.

### 6. Use Resources for Reading
Keep them smart and focused rather than "read everything" type resources. Resources should be quick and LLM-friendly.

## Key Patterns

### Python MCP Tool Registration
Tools in `Server/src/services/tools/` are auto-discovered. Use the `@mcp_for_unity_tool` decorator:
```python
from services.registry import mcp_for_unity_tool

@mcp_for_unity_tool(
    description="Does something in Unity.",
    group="core",  # core (default), vfx, animation, ui, scripting_ext, testing, probuilder
)
async def manage_something(
    ctx: Context,
    action: Annotated[Literal["create", "delete"], "Action to perform"],
) -> dict[str, Any]:
    unity_instance = await get_unity_instance_from_context(ctx)
    params = {"action": action}
    response = await send_with_unity_instance(async_send_command_with_retry, unity_instance, "manage_something", params)
    return response
```

The `group` parameter controls tool visibility. Only `"core"` is enabled by default. Non-core groups (vfx, animation, etc.) start disabled and are toggled via `manage_tools`.

### Python CLI Error Handling
CLI commands (not MCP tools) use the `@handle_unity_errors` decorator:
```python
@handle_unity_errors
async def my_command(ctx, ...):
    result = await call_unity_tool(...)
```

### C# Tool Registration
Tools are auto-discovered by `CommandRegistry` via reflection. Use the `[McpForUnityTool]` attribute:
```csharp
[McpForUnityTool("manage_something", AutoRegister = false, Group = "core")]
public static class ManageSomething
{
    // Sync handler (most tools):
    public static object HandleCommand(JObject @params)
    {
        var p = new ToolParams(@params);
        // ...
        return new SuccessResponse("Done.", new { data = result });
    }

    // OR async handler (for long-running operations like play-test, refresh, batch):
    public static async Task<object> HandleCommand(JObject @params)
    {
        // CommandRegistry detects Task return type automatically
        await SomeAsyncOperation();
        return new SuccessResponse("Done.");
    }
}
```

Async handlers use `EditorApplication.update` polling with `TaskCompletionSource` — see `RefreshUnity.cs` for the canonical pattern.

### C# Parameter Handling
Use `ToolParams` for consistent parameter validation:
```csharp
var p = new ToolParams(parameters);
var pageSize = p.GetInt("page_size", "pageSize") ?? 50;
var name = p.RequireString("name");
```

### C# Resources
Resources use `[McpForUnityResource]` and follow the same `HandleCommand` pattern as tools. They provide read-only state to AI assistants.

### Paging Large Results
Always page results that could be large (hierarchies, components, search results):
- Use `page_size` and `cursor` parameters
- Return `next_cursor` when more results exist

### Composing Tools Internally (C#)
Use `CommandRegistry.InvokeCommandAsync` to call other tools from within a handler:
```csharp
var result = await CommandRegistry.InvokeCommandAsync("read_console", consoleParams);
```

## Commands

### Running Tests
```bash
# Python (all tests)
cd Server && uv run pytest tests/ -v

# Python (single test file)
cd Server && uv run pytest tests/test_manage_material.py -v

# Python (single test by name)
cd Server && uv run pytest tests/ -k "test_create_material" -v

# Unity - open TestProjects/UnityMCPTests in Unity, use Test Runner window
```

### Local Development
1. Set **Server Source Override** in MCP for Unity Advanced Settings to your local `Server/` path
2. Enable **Dev Mode** checkbox to force fresh installs
3. Use `mcp_source.py` to switch Unity package sources
4. Test on Windows and Mac if possible, and multiple clients (Claude Desktop and Claude Code are tricky for configuration as of this writing)

### Adding a New Tool
1. Add Python MCP tool in `Server/src/services/tools/manage_<domain>.py` using `@mcp_for_unity_tool`
2. Add Python CLI commands in `Server/src/cli/commands/<domain>.py` using Click
3. Add C# implementation in `MCPForUnity/Editor/Tools/Manage<Domain>.cs` with `[McpForUnityTool]`
4. Add Python tests in `Server/tests/test_manage_<domain>.py`
5. Add Unity tests in `TestProjects/UnityMCPTests/Assets/Tests/`

## What Not To Do

- Don't add features without tests
- Don't create helper functions for one-time operations
- Don't add error handling for scenarios that can't happen
- Don't commit to `main` directly - branch off `beta` for PRs
- Don't add docstrings/comments to code you didn't change


================================================
FILE: CustomTools/RoslynRuntimeCompilation/ManageRuntimeCompilation.cs
================================================
#nullable disable
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using Newtonsoft.Json.Linq;
using UnityEngine;
using UnityEditor;
using MCPForUnity.Editor.Helpers;

#if USE_ROSLYN
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.Emit;
#endif

namespace MCPForUnity.Editor.Tools
{
    /// <summary>
    /// Runtime compilation tool for MCP Unity.
    /// Compiles and loads C# code at runtime without triggering domain reload via Roslyn Runtime Compilation, where in traditional Unity workflow it would take seconds to reload assets and reset script states for each script change. 
    /// </summary>
    [McpForUnityTool(
        name:"runtime_compilation",
        Description = "Enable runtime compilation of C# code within Unity without domain reload via Roslyn.")]
    public static class ManageRuntimeCompilation
    {
        private static readonly Dictionary<string, LoadedAssemblyInfo> LoadedAssemblies = new Dictionary<string, LoadedAssemblyInfo>();
        private static string DynamicAssembliesPath => Path.Combine(Application.temporaryCachePath, "DynamicAssemblies");
        
        private class LoadedAssemblyInfo
        {
            public string Name;
            public Assembly Assembly;
            public string DllPath;
            public DateTime LoadedAt;
            public List<string> TypeNames;
        }
        
        public static object HandleCommand(JObject @params)
        {
            string action = @params["action"]?.ToString()?.ToLower();
            
            if (string.IsNullOrEmpty(action))
            {
                return new ErrorResponse("Action parameter is required. Valid actions: compile_and_load, list_loaded, get_types, execute_with_roslyn, get_history, save_history, clear_history");
            }
            
            switch (action)
            {
                case "compile_and_load":
                    return CompileAndLoad(@params);
                
                case "list_loaded":
                    return ListLoadedAssemblies();
                
                case "get_types":
                    return GetAssemblyTypes(@params);
                
                case "execute_with_roslyn":
                    return ExecuteWithRoslyn(@params);
                
                case "get_history":
                    return GetCompilationHistory();
                
                case "save_history":
                    return SaveCompilationHistory();
                
                case "clear_history":
                    return ClearCompilationHistory();
                
                default:
                    return new ErrorResponse($"Unknown action '{action}'. Valid actions: compile_and_load, list_loaded, get_types, execute_with_roslyn, get_history, save_history, clear_history");
            }
        }
        
        private static object CompileAndLoad(JObject @params)
        {
#if !USE_ROSLYN
            return new ErrorResponse(
                "Runtime compilation requires Roslyn. Please install Microsoft.CodeAnalysis.CSharp NuGet package and add USE_ROSLYN to Scripting Define Symbols. " +
                "See ManageScript.cs header for installation instructions."
            );
#else
            try
            {
                string code = @params["code"]?.ToString();
                string assemblyName = @params["assembly_name"]?.ToString() ?? $"DynamicAssembly_{DateTime.Now.Ticks}";
                string attachTo = @params["attach_to"]?.ToString();
                bool loadImmediately = @params["load_immediately"]?.ToObject<bool>() ?? true;
                
                if (string.IsNullOrEmpty(code))
                {
                    return new ErrorResponse("'code' parameter is required");
                }
                
                // Ensure unique assembly name
                if (LoadedAssemblies.ContainsKey(assemblyName))
                {
                    assemblyName = $"{assemblyName}_{DateTime.Now.Ticks}";
                }
                
                // Create output directory
                Directory.CreateDirectory(DynamicAssembliesPath);
                string dllPath = Path.Combine(DynamicAssembliesPath, $"{assemblyName}.dll");
                
                // Parse code
                var syntaxTree = CSharpSyntaxTree.ParseText(code);
                
                // Get references
                var references = GetDefaultReferences();
                
                // Create compilation
                var compilation = CSharpCompilation.Create(
                    assemblyName,
                    new[] { syntaxTree },
                    references,
                    new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary)
                        .WithOptimizationLevel(OptimizationLevel.Debug)
                        .WithPlatform(Platform.AnyCpu)
                );
                
                // Emit to file
                EmitResult emitResult;
                using (var stream = new FileStream(dllPath, FileMode.Create))
                {
                    emitResult = compilation.Emit(stream);
                }
                
                // Check for compilation errors
                if (!emitResult.Success)
                {
                    var errors = emitResult.Diagnostics
                        .Where(d => d.Severity == DiagnosticSeverity.Error)
                        .Select(d => new
                        {
                            line = d.Location.GetLineSpan().StartLinePosition.Line + 1,
                            column = d.Location.GetLineSpan().StartLinePosition.Character + 1,
                            message = d.GetMessage(),
                            id = d.Id
                        })
                        .ToList();
                    
                    return new ErrorResponse("Compilation failed", new
                    {
                        errors = errors,
                        error_count = errors.Count
                    });
                }
                
                // Load assembly if requested
                Assembly loadedAssembly = null;
                List<string> typeNames = new List<string>();
                
                if (loadImmediately)
                {
                    loadedAssembly = Assembly.LoadFrom(dllPath);
                    typeNames = loadedAssembly.GetTypes().Select(t => t.FullName).ToList();
                    
                    // Store info
                    LoadedAssemblies[assemblyName] = new LoadedAssemblyInfo
                    {
                        Name = assemblyName,
                        Assembly = loadedAssembly,
                        DllPath = dllPath,
                        LoadedAt = DateTime.Now,
                        TypeNames = typeNames
                    };
                    
                    Debug.Log($"[MCP] Runtime compilation successful: {assemblyName} ({typeNames.Count} types)");
                }
                
                // Optionally attach to GameObject
                GameObject attachedTo = null;
                Type attachedType = null;
                
                if (!string.IsNullOrEmpty(attachTo) && loadedAssembly != null)
                {
                    var go = GameObject.Find(attachTo);
                    if (go == null)
                    {
                        // Try hierarchical path search
                        go = FindGameObjectByPath(attachTo);
                    }
                    
                    if (go != null)
                    {
                        // Find first MonoBehaviour type
                        var behaviourType = loadedAssembly.GetTypes()
                            .FirstOrDefault(t => t.IsSubclassOf(typeof(MonoBehaviour)) && !t.IsAbstract);
                        
                        if (behaviourType != null)
                        {
                            go.AddComponent(behaviourType);
                            attachedTo = go;
                            attachedType = behaviourType;
                            Debug.Log($"[MCP] Attached {behaviourType.Name} to {go.name}");
                        }
                        else
                        {
                            Debug.LogWarning($"[MCP] No MonoBehaviour types found in {assemblyName} to attach");
                        }
                    }
                    else
                    {
                        Debug.LogWarning($"[MCP] GameObject '{attachTo}' not found");
                    }
                }
                
                return new SuccessResponse("Runtime compilation completed successfully", new
                {
                    assembly_name = assemblyName,
                    dll_path = dllPath,
                    loaded = loadImmediately,
                    type_count = typeNames.Count,
                    types = typeNames,
                    attached_to = attachedTo != null ? attachedTo.name : null,
                    attached_type = attachedType != null ? attachedType.FullName : null
                });
            }
            catch (Exception ex)
            {
                return new ErrorResponse($"Runtime compilation failed: {ex.Message}", new
                {
                    exception = ex.GetType().Name,
                    stack_trace = ex.StackTrace
                });
            }
#endif
        }
        
        private static object ListLoadedAssemblies()
        {
            var assemblies = LoadedAssemblies.Values.Select(info => new
            {
                name = info.Name,
                dll_path = info.DllPath,
                loaded_at = info.LoadedAt.ToString("o"),
                type_count = info.TypeNames.Count,
                types = info.TypeNames
            }).ToList();
            
            return new SuccessResponse($"Found {assemblies.Count} loaded dynamic assemblies", new
            {
                count = assemblies.Count,
                assemblies = assemblies
            });
        }
        
        private static object GetAssemblyTypes(JObject @params)
        {
            string assemblyName = @params["assembly_name"]?.ToString();
            
            if (string.IsNullOrEmpty(assemblyName))
            {
                return new ErrorResponse("'assembly_name' parameter is required");
            }
            
            if (!LoadedAssemblies.TryGetValue(assemblyName, out var info))
            {
                return new ErrorResponse($"Assembly '{assemblyName}' not found in loaded assemblies");
            }
            
            var types = info.Assembly.GetTypes().Select(t => new
            {
                full_name = t.FullName,
                name = t.Name,
                @namespace = t.Namespace,
                is_class = t.IsClass,
                is_abstract = t.IsAbstract,
                is_monobehaviour = t.IsSubclassOf(typeof(MonoBehaviour)),
                base_type = t.BaseType?.FullName
            }).ToList();
            
            return new SuccessResponse($"Retrieved {types.Count} types from {assemblyName}", new
            {
                assembly_name = assemblyName,
                type_count = types.Count,
                types = types
            });
        }
        
        /// <summary>
        /// Execute code using RoslynRuntimeCompiler with full GUI tool integration
        /// Supports MonoBehaviours, static methods, and coroutines
        /// </summary>
        private static object ExecuteWithRoslyn(JObject @params)
        {
            try
            {
                string code = @params["code"]?.ToString();
                string className = @params["class_name"]?.ToString() ?? "AIGenerated";
                string methodName = @params["method_name"]?.ToString() ?? "Run";
                string targetObjectName = @params["target_object"]?.ToString();
                bool attachAsComponent = @params["attach_as_component"]?.ToObject<bool>() ?? false;
                
                if (string.IsNullOrEmpty(code))
                {
                    return new ErrorResponse("'code' parameter is required");
                }
                
                // Get or create the RoslynRuntimeCompiler instance
                var compiler = GetOrCreateRoslynCompiler();
                
                // Find target GameObject if specified
                GameObject targetObject = null;
                if (!string.IsNullOrEmpty(targetObjectName))
                {
                    targetObject = GameObject.Find(targetObjectName);
                    if (targetObject == null)
                    {
                        targetObject = FindGameObjectByPath(targetObjectName);
                    }
                    
                    if (targetObject == null)
                    {
                        return new ErrorResponse($"Target GameObject '{targetObjectName}' not found");
                    }
                }
                
                // Use the RoslynRuntimeCompiler's CompileAndExecute method
                bool success = compiler.CompileAndExecute(
                    code,
                    className,
                    methodName,
                    targetObject,
                    attachAsComponent,
                    out string errorMessage
                );
                
                if (success)
                {
                    return new SuccessResponse($"Code compiled and executed successfully", new
                    {
                        class_name = className,
                        method_name = methodName,
                        target_object = targetObject != null ? targetObject.name : "compiler_host",
                        attached_as_component = attachAsComponent,
                        diagnostics = compiler.lastCompileDiagnostics
                    });
                }
                else
                {
                    return new ErrorResponse($"Execution failed: {errorMessage}", new
                    {
                        diagnostics = compiler.lastCompileDiagnostics
                    });
                }
            }
            catch (Exception ex)
            {
                return new ErrorResponse($"Failed to execute with Roslyn: {ex.Message}", new
                {
                    exception = ex.GetType().Name,
                    stack_trace = ex.StackTrace
                });
            }
        }
        
        /// <summary>
        /// Get compilation history from RoslynRuntimeCompiler
        /// </summary>
        private static object GetCompilationHistory()
        {
            try
            {
                var compiler = GetOrCreateRoslynCompiler();
                var history = compiler.CompilationHistory;
                
                var historyData = history.Select(entry => new
                {
                    timestamp = entry.timestamp,
                    type_name = entry.typeName,
                    method_name = entry.methodName,
                    success = entry.success,
                    diagnostics = entry.diagnostics,
                    execution_target = entry.executionTarget,
                    source_code_preview = entry.sourceCode.Length > 200 
                        ? entry.sourceCode.Substring(0, 200) + "..." 
                        : entry.sourceCode
                }).ToList();
                
                return new SuccessResponse($"Retrieved {historyData.Count} history entries", new
                {
                    count = historyData.Count,
                    history = historyData
                });
            }
            catch (Exception ex)
            {
                return new ErrorResponse($"Failed to get history: {ex.Message}");
            }
        }
        
        /// <summary>
        /// Save compilation history to JSON file
        /// </summary>
        private static object SaveCompilationHistory()
        {
            try
            {
                var compiler = GetOrCreateRoslynCompiler();
                
                if (compiler.SaveHistoryToFile(out string savedPath, out string error))
                {
                    return new SuccessResponse($"History saved successfully", new
                    {
                        path = savedPath,
                        entry_count = compiler.CompilationHistory.Count
                    });
                }
                else
                {
                    return new ErrorResponse($"Failed to save history: {error}");
                }
            }
            catch (Exception ex)
            {
                return new ErrorResponse($"Failed to save history: {ex.Message}");
            }
        }
        
        /// <summary>
        /// Clear compilation history
        /// </summary>
        private static object ClearCompilationHistory()
        {
            try
            {
                var compiler = GetOrCreateRoslynCompiler();
                int count = compiler.CompilationHistory.Count;
                compiler.ClearHistory();
                
                return new SuccessResponse($"Cleared {count} history entries");
            }
            catch (Exception ex)
            {
                return new ErrorResponse($"Failed to clear history: {ex.Message}");
            }
        }
        
#if USE_ROSLYN
        private static List<MetadataReference> GetDefaultReferences()
        {
            var references = new List<MetadataReference>();
            
            // Add core .NET references
            references.Add(MetadataReference.CreateFromFile(typeof(object).Assembly.Location));
            references.Add(MetadataReference.CreateFromFile(typeof(Enumerable).Assembly.Location));
            
            // Add Unity references
            var unityEngine = typeof(UnityEngine.Object).Assembly.Location;
            references.Add(MetadataReference.CreateFromFile(unityEngine));
            
            // Add UnityEditor if available
            try
            {
                var unityEditor = typeof(UnityEditor.Editor).Assembly.Location;
                references.Add(MetadataReference.CreateFromFile(unityEditor));
            }
            catch { /* Editor assembly not always needed */ }
            
            // Add Assembly-CSharp (user scripts)
            try
            {
                var assemblyCSharp = AppDomain.CurrentDomain.GetAssemblies()
                    .FirstOrDefault(a => a.GetName().Name == "Assembly-CSharp");
                if (assemblyCSharp != null)
                {
                    references.Add(MetadataReference.CreateFromFile(assemblyCSharp.Location));
                }
            }
            catch { /* User assembly not always needed */ }
            
            return references;
        }
#endif
        
        private static GameObject FindGameObjectByPath(string path)
        {
            // Handle hierarchical paths like "Canvas/Panel/Button"
            var parts = path.Split('/');
            GameObject current = null;
            
            foreach (var part in parts)
            {
                if (current == null)
                {
                    // Find root object
                    current = GameObject.Find(part);
                }
                else
                {
                    // Find child
                    var transform = current.transform.Find(part);
                    if (transform == null)
                        return null;
                    current = transform.gameObject;
                }
            }
            
            return current;
        }

        /// <summary>
        /// Get or create a RoslynRuntimeCompiler instance for GUI integration
        /// This allows MCP commands to leverage the existing GUI tool
        /// </summary>
        private static RoslynRuntimeCompiler GetOrCreateRoslynCompiler()
        {
            var existing = UnityEngine.Object.FindFirstObjectByType<RoslynRuntimeCompiler>();
            if (existing != null)
            {
                return existing;
            }
            
            var go = new GameObject("MCPRoslynCompiler");
            var compiler = go.AddComponent<RoslynRuntimeCompiler>();
            compiler.enableHistory = true; // Enable history tracking for MCP operations
            if (!Application.isPlaying)
            {
                go.hideFlags = HideFlags.HideAndDontSave;
            }
            return compiler;
        }
    }
}


================================================
FILE: CustomTools/RoslynRuntimeCompilation/ManageRuntimeCompilation.cs.meta
================================================
fileFormatVersion: 2
guid: 1c3b2419382faa04481f4a631c510ee6

================================================
FILE: CustomTools/RoslynRuntimeCompilation/RoslynRuntimeCompiler.cs
================================================
// RoslynRuntimeCompiler.cs
// Single-file Unity tool for Editor+PlayMode dynamic C# compilation using Roslyn.
// Features:
// - EditorWindow GUI with a large text area for LLM-generated code
// - Compile button (compiles in-memory using Roslyn)
// - Run button (invokes a well-known entry point in the compiled assembly)
// - Shows compile errors and runtime exceptions
// - Safe: Does NOT write .cs files to Assets (no Domain Reload)
//
// Requirements:
// 1) Add Microsoft.CodeAnalysis.CSharp.dll and Microsoft.CodeAnalysis.dll to your Unity project
//    (place under Assets/Plugins or Packages and target the Editor). These come from the Roslyn nuget package.
// 2) This tool is designed to run in the Unity Editor (Play Mode or Edit Mode). It uses Assembly.Load(byte[]).
// 3) Generated code should expose a public type and a public static entry method matching one of the supported signatures:
//    - public static void Run(UnityEngine.GameObject host)
//    - public static void Run(UnityEngine.MonoBehaviour host)
//    - public static System.Collections.IEnumerator RunCoroutine(UnityEngine.MonoBehaviour host) // if you want a coroutine
//    By convention this demo looks for a type name you specify in the window (default: "AIGenerated").
//
// Usage:
// - Window -> Roslyn Runtime Compiler
// - Paste code into the big text area (or use LLM output pasted there)
// - Optionally set Entry Type (default AIGenerated) and Entry Method (default Run)
// - Press "Compile". Compiler diagnostics appear below.
// - In Play Mode, press "Run" to invoke the entry method. In Edit Mode it will attempt to run if valid.
//
// Security note: Any dynamically compiled code runs with the same permissions as the editor. Be careful when running untrusted code.

#if UNITY_EDITOR
using UnityEditor;
#endif
using System;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Collections.Generic;
using UnityEngine;

#if UNITY_EDITOR
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
#endif

public class RoslynRuntimeCompiler : MonoBehaviour
{
    [TextArea(8, 20)]
    [Tooltip("Code to compile at runtime. Example class name: AIGenerated with public static void Run(GameObject host)")]
    public string code = "using UnityEngine;\npublic class AIGenerated {\n    public static void Run(GameObject host) {\n        Debug.Log($\"Hello from AI - {host.name}\");\n        host.transform.Rotate(Vector3.up * 45f * Time.deltaTime);\n    }\n}";

    [Tooltip("Fully qualified type name to invoke (default: AIGenerated)")]
    public string entryTypeName = "AIGenerated";
    [Tooltip("Method name to call on entry type (default: Run)")]
    public string entryMethodName = "Run";
    
    [Header("MonoBehaviour Support")]
    [Tooltip("If true, attempts to attach generated MonoBehaviour to target GameObject")]
    public bool attachAsComponent = false;
    [Tooltip("Target GameObject to attach component to (if null, uses this.gameObject)")]
    public GameObject targetGameObject;

    [Header("History & Tracing")]
    [Tooltip("Enable automatic history tracking of compiled scripts")]
    public bool enableHistory = true;
    [Tooltip("Maximum number of history entries to keep")]
    public int maxHistoryEntries = 20;

    // compiled assembly & method cache
    private Assembly compiledAssembly;
    private MethodInfo entryMethod;
    private Type entryType;
    private Component attachedComponent; // Track dynamically attached component

    public bool HasCompiledAssembly => compiledAssembly != null;
    public bool HasEntryMethod => entryMethod != null;
    public bool HasEntryType => entryType != null;
    public Type EntryType => entryType; // Public accessor for editor

    // compile result diagnostics (string-friendly)
    public string lastCompileDiagnostics = "";
    
    // History tracking - SHARED across all instances
    [System.Serializable]
    public class CompilationHistoryEntry
    {
        public string timestamp;
        public string sourceCode;
        public string typeName;
        public string methodName;
        public bool success;
        public string diagnostics;
        public string executionTarget;
    }
    
    // Static shared history
    private static System.Collections.Generic.List<CompilationHistoryEntry> _sharedHistory = new System.Collections.Generic.List<CompilationHistoryEntry>();
    
    public System.Collections.Generic.List<CompilationHistoryEntry> CompilationHistory => _sharedHistory;

    // public wrapper so EditorWindow or other runtime UI can call compile/run
    public bool CompileInMemory(out string diagnostics)
    {
#if UNITY_EDITOR
        diagnostics = string.Empty;
        lastCompileDiagnostics = string.Empty;

        try
        {
            var syntaxTree = CSharpSyntaxTree.ParseText(code ?? string.Empty);

            // collect references from loaded assemblies (Editor-safe)
            var refs = new List<MetadataReference>();

            // Always include mscorlib / system.runtime
            refs.Add(MetadataReference.CreateFromFile(typeof(object).Assembly.Location));

            // Add all currently loaded assemblies' locations that are not dynamic and have a location
            var assemblies = AppDomain.CurrentDomain.GetAssemblies()
                .Where(a => !a.IsDynamic && !string.IsNullOrEmpty(a.Location))
                .Distinct();

            foreach (var a in assemblies)
            {
                try
                {
                    refs.Add(MetadataReference.CreateFromFile(a.Location));
                }
                catch { }
            }

            var compilation = CSharpCompilation.Create(
                assemblyName: "RoslynRuntimeAssembly_" + Guid.NewGuid().ToString("N"),
                syntaxTrees: new[] { syntaxTree },
                references: refs,
                options: new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary)
            );

            using (var ms = new MemoryStream())
            {
                var result = compilation.Emit(ms);
                if (!result.Success)
                {
                    var diagText = string.Join("\n", result.Diagnostics.Select(d => d.ToString()));
                    lastCompileDiagnostics = diagText;
                    diagnostics = diagText;
                    Debug.LogError("Roslyn compile failed:\n" + diagText);
                    return false;
                }

                ms.Seek(0, SeekOrigin.Begin);
                var assemblyData = ms.ToArray();
                compiledAssembly = Assembly.Load(assemblyData);

                // find entry type
                var type = compiledAssembly.GetType(entryTypeName);
                if (type == null)
                {
                    lastCompileDiagnostics = $"Type '{entryTypeName}' not found in compiled assembly.";
                    diagnostics = lastCompileDiagnostics;
                    return false;
                }
                
                entryType = type;

                // Check if it's a MonoBehaviour
                if (typeof(MonoBehaviour).IsAssignableFrom(type))
                {
                    lastCompileDiagnostics = $"Compilation OK. Type '{entryTypeName}' is a MonoBehaviour and can be attached as a component.";
                    diagnostics = lastCompileDiagnostics;
                    Debug.Log(diagnostics);
                    return true;
                }

                // try various method signatures for non-MonoBehaviour types
                entryMethod = type.GetMethod(entryMethodName, BindingFlags.Public | BindingFlags.Static);
                if (entryMethod == null)
                {
                    lastCompileDiagnostics = $"Static method '{entryMethodName}' not found on type '{entryTypeName}'.\n" +
                        $"For MonoBehaviour types, set 'attachAsComponent' to true instead.";
                    diagnostics = lastCompileDiagnostics;
                    return false;
                }

                lastCompileDiagnostics = "Compilation OK.";
                diagnostics = lastCompileDiagnostics;
                Debug.Log("Roslyn compilation successful.");
                return true;
            }
        }
        catch (Exception ex)
        {
            diagnostics = ex.ToString();
            lastCompileDiagnostics = diagnostics;
            Debug.LogError("Roslyn compile exception: " + diagnostics);
            return false;
        }
#else
        diagnostics = "Roslyn compilation is only supported in the Unity Editor when referencing Roslyn assemblies.";
        lastCompileDiagnostics = diagnostics;
        Debug.LogError(diagnostics);
        return false;
#endif
    }

    public bool InvokeEntry(GameObject host, out string runtimeError)
    {
        runtimeError = null;
        if (compiledAssembly == null || entryType == null)
        {
            runtimeError = "No compiled assembly / entry type. Call CompileInMemory first.";
            return false;
        }

        // Handle MonoBehaviour types
        if (typeof(MonoBehaviour).IsAssignableFrom(entryType))
        {
            return AttachMonoBehaviour(host, out runtimeError);
        }

        // Handle static method invocation
        if (entryMethod == null)
        {
            runtimeError = "No entry method found. For MonoBehaviour types, use attachAsComponent=true.";
            return false;
        }

        try
        {
            var parameters = entryMethod.GetParameters();
            if (parameters.Length == 0)
            {
                entryMethod.Invoke(null, null);
                return true;
            }
            else if (parameters.Length == 1)
            {
                var pType = parameters[0].ParameterType;
                if (pType == typeof(GameObject))
                    entryMethod.Invoke(null, new object[] { host });
                else if (typeof(MonoBehaviour).IsAssignableFrom(pType))
                {
                    var component = host.GetComponent(pType);
                    entryMethod.Invoke(null, new object[] { component != null ? component : (object)host });
                }
                else if (pType == typeof(Transform))
                    entryMethod.Invoke(null, new object[] { host.transform });
                else if (pType == typeof(object))
                    entryMethod.Invoke(null, new object[] { host });
                else
                    entryMethod.Invoke(null, new object[] { host }); // best effort

                return true;
            }
            else
            {
                runtimeError = "Entry method has unsupported parameter signature.";
                return false;
            }
        }
        catch (TargetInvocationException tie)
        {
            runtimeError = tie.InnerException?.ToString() ?? tie.ToString();
            Debug.LogError("Runtime invocation error: " + runtimeError);
            return false;
        }
        catch (Exception ex)
        {
            runtimeError = ex.ToString();
            Debug.LogError("Runtime invocation error: " + runtimeError);
            return false;
        }
    }

    /// <summary>
    /// Attaches a dynamically compiled MonoBehaviour to a GameObject
    /// </summary>
    public bool AttachMonoBehaviour(GameObject host, out string runtimeError)
    {
        runtimeError = null;
        
        if (host == null)
        {
            runtimeError = "Target GameObject is null.";
            return false;
        }

        if (entryType == null || !typeof(MonoBehaviour).IsAssignableFrom(entryType))
        {
            runtimeError = $"Type '{entryTypeName}' is not a MonoBehaviour.";
            return false;
        }

        try
        {
            // Check if component already exists
            var existing = host.GetComponent(entryType);
            if (existing != null)
            {
                Debug.LogWarning($"Component '{entryType.Name}' already exists on '{host.name}'. Removing old instance.");
                if (Application.isPlaying)
                    Destroy(existing);
                else
                    DestroyImmediate(existing);
            }

            // Add the component
            attachedComponent = host.AddComponent(entryType);
            
            if (attachedComponent == null)
            {
                runtimeError = "Failed to add component to GameObject.";
                return false;
            }

            Debug.Log($"Successfully attached '{entryType.Name}' to '{host.name}'");
            return true;
        }
        catch (Exception ex)
        {
            runtimeError = ex.ToString();
            Debug.LogError("Failed to attach MonoBehaviour: " + runtimeError);
            return false;
        }
    }

    /// <summary>
    /// Invokes a coroutine on the compiled type if it returns IEnumerator
    /// </summary>
    public bool InvokeCoroutine(MonoBehaviour host, out string runtimeError)
    {
        runtimeError = null;
        
        if (entryMethod == null)
        {
            runtimeError = "No entry method found.";
            return false;
        }

        if (!typeof(System.Collections.IEnumerator).IsAssignableFrom(entryMethod.ReturnType))
        {
            runtimeError = $"Method '{entryMethodName}' does not return IEnumerator.";
            return false;
        }

        try
        {
            var parameters = entryMethod.GetParameters();
            object result = null;

            if (parameters.Length == 0)
            {
                result = entryMethod.Invoke(null, null);
            }
            else if (parameters.Length == 1)
            {
                var pType = parameters[0].ParameterType;
                if (pType == typeof(GameObject))
                    result = entryMethod.Invoke(null, new object[] { host.gameObject });
                else if (typeof(MonoBehaviour).IsAssignableFrom(pType))
                    result = entryMethod.Invoke(null, new object[] { host });
                else
                    result = entryMethod.Invoke(null, new object[] { host });
            }

            if (result is System.Collections.IEnumerator coroutine)
            {
                host.StartCoroutine(coroutine);
                Debug.Log($"Started coroutine '{entryMethodName}' on '{host.name}'");
                return true;
            }
            else
            {
                runtimeError = "Method did not return a valid IEnumerator.";
                return false;
            }
        }
        catch (Exception ex)
        {
            runtimeError = ex.ToString();
            Debug.LogError("Failed to start coroutine: " + runtimeError);
            return false;
        }
    }

    /// <summary>
    /// MCP-callable function: Compiles code and optionally attaches to a GameObject
    /// </summary>
    /// <param name="sourceCode">C# source code to compile</param>
    /// <param name="typeName">Type name to instantiate/invoke</param>
    /// <param name="methodName">Method name to invoke (for static methods)</param>
    /// <param name="targetObject">Target GameObject (null = this.gameObject)</param>
    /// <param name="shouldAttachComponent">If true and type is MonoBehaviour, attach as component</param>
    /// <param name="errorMessage">Output error message if operation fails</param>
    /// <returns>True if successful, false otherwise</returns>
    public bool CompileAndExecute(
        string sourceCode, 
        string typeName, 
        string methodName, 
        GameObject targetObject, 
        bool shouldAttachComponent,
        out string errorMessage)
    {
        errorMessage = null;

        // Validate inputs
        if (string.IsNullOrWhiteSpace(sourceCode))
        {
            errorMessage = "Source code cannot be empty.";
            return false;
        }

        if (string.IsNullOrWhiteSpace(typeName))
        {
            errorMessage = "Type name cannot be empty.";
            return false;
        }

        // Set properties
        code = sourceCode;
        entryTypeName = typeName;
        entryMethodName = string.IsNullOrWhiteSpace(methodName) ? "Run" : methodName;
        attachAsComponent = shouldAttachComponent;
        targetGameObject = targetObject;

        // Determine target GameObject first
        GameObject target = targetGameObject != null ? targetGameObject : this.gameObject;
        string targetName = target != null ? target.name : "null";
        
        // Compile
        if (!CompileInMemory(out string compileError))
        {
            errorMessage = $"Compilation failed:\n{compileError}";
            AddHistoryEntry(sourceCode, typeName, entryMethodName, false, compileError, targetName);
            return false;
        }

        if (target == null)
        {
            errorMessage = "No target GameObject available.";
            AddHistoryEntry(sourceCode, typeName, entryMethodName, false, "No target GameObject", "null");
            return false;
        }

        // Execute based on type
        try
        {
            // MonoBehaviour attachment
            if (shouldAttachComponent && entryType != null && typeof(MonoBehaviour).IsAssignableFrom(entryType))
            {
                if (!AttachMonoBehaviour(target, out string attachError))
                {
                    errorMessage = $"Failed to attach MonoBehaviour:\n{attachError}";
                    AddHistoryEntry(sourceCode, typeName, entryMethodName, false, attachError, target.name);
                    return false;
                }
                
                Debug.Log($"[MCP] MonoBehaviour '{typeName}' successfully attached to '{target.name}'");
                AddHistoryEntry(sourceCode, typeName, entryMethodName, true, "Component attached successfully", target.name);
                return true;
            }
            
            // Coroutine invocation
            if (entryMethod != null && typeof(System.Collections.IEnumerator).IsAssignableFrom(entryMethod.ReturnType))
            {
                var host = target.GetComponent<MonoBehaviour>() ?? this;
                if (!InvokeCoroutine(host, out string coroutineError))
                {
                    errorMessage = $"Failed to start coroutine:\n{coroutineError}";
                    AddHistoryEntry(sourceCode, typeName, entryMethodName, false, coroutineError, target.name);
                    return false;
                }
                
                Debug.Log($"[MCP] Coroutine '{methodName}' started on '{target.name}'");
                AddHistoryEntry(sourceCode, typeName, entryMethodName, true, "Coroutine started successfully", target.name);
                return true;
            }
            
            // Static method invocation
            if (!InvokeEntry(target, out string invokeError))
            {
                errorMessage = $"Failed to invoke method:\n{invokeError}";
                AddHistoryEntry(sourceCode, typeName, entryMethodName, false, invokeError, target.name);
                return false;
            }
            
            Debug.Log($"[MCP] Method '{methodName}' executed successfully on '{target.name}'");
            AddHistoryEntry(sourceCode, typeName, entryMethodName, true, "Method executed successfully", target.name);
            return true;
        }
        catch (Exception ex)
        {
            errorMessage = $"Execution error:\n{ex.Message}\n{ex.StackTrace}";
            return false;
        }
    }

    /// <summary>
    /// Simplified MCP-callable function with default parameters
    /// </summary>
    public bool CompileAndExecute(string sourceCode, string typeName, GameObject targetObject, out string errorMessage)
    {
        // Auto-detect if it's a MonoBehaviour by checking the source
        bool shouldAttach = sourceCode.Contains(": MonoBehaviour") || sourceCode.Contains(":MonoBehaviour");
        return CompileAndExecute(sourceCode, typeName, "Run", targetObject, shouldAttach, out errorMessage);
    }

    /// <summary>
    /// MCP-callable: Compile and attach to current GameObject
    /// </summary>
    public bool CompileAndAttachToSelf(string sourceCode, string typeName, out string errorMessage)
    {
        return CompileAndExecute(sourceCode, typeName, "Run", this.gameObject, true, out errorMessage);
    }

    // helper: convenience method to compile + run on this.gameObject
    public void CompileAndRunOnSelf()
    {
        if (CompileInMemory(out var diag))
        {
            if (!Application.isPlaying)
                Debug.LogWarning("Running compiled code in Edit Mode. Some UnityEngine APIs may not behave as expected.");

            GameObject target = targetGameObject != null ? targetGameObject : this.gameObject;

            // Check if we should attach as component
            if (attachAsComponent && entryType != null && typeof(MonoBehaviour).IsAssignableFrom(entryType))
            {
                if (AttachMonoBehaviour(target, out var attachErr))
                {
                    Debug.Log($"MonoBehaviour '{entryTypeName}' attached successfully to '{target.name}'.");
                }
                else
                {
                    Debug.LogError("Failed to attach MonoBehaviour: " + attachErr);
                }
            }
            // Check if it's a coroutine
            else if (entryMethod != null && typeof(System.Collections.IEnumerator).IsAssignableFrom(entryMethod.ReturnType))
            {
                var host = target.GetComponent<MonoBehaviour>() ?? this;
                if (InvokeCoroutine(host, out var coroutineErr))
                {
                    Debug.Log("Coroutine started successfully.");
                }
                else
                {
                    Debug.LogError("Failed to start coroutine: " + coroutineErr);
                }
            }
            // Regular static method invocation
            else if (InvokeEntry(target, out var runtimeErr))
            {
                Debug.Log("Entry invoked successfully.");
            }
            else
            {
                Debug.LogError("Failed to invoke entry: " + runtimeErr);
            }
        }
        else
        {
            Debug.LogError("Compile failed: " + lastCompileDiagnostics);
        }
    }
    
    /// <summary>
    /// Adds an entry to the compilation history
    /// </summary>
    private void AddHistoryEntry(string sourceCode, string typeName, string methodName, bool success, string diagnostics, string target)
    {
        if (!enableHistory) return;
        
        var entry = new CompilationHistoryEntry
        {
            timestamp = System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
            sourceCode = sourceCode,
            typeName = typeName,
            methodName = methodName,
            success = success,
            diagnostics = diagnostics,
            executionTarget = target
        };
        
        _sharedHistory.Add(entry);
        
        // Trim if exceeded max
        while (_sharedHistory.Count > maxHistoryEntries)
        {
            _sharedHistory.RemoveAt(0);
        }
    }
    
    /// <summary>
    /// Saves the compilation history to a JSON file outside Assets
    /// </summary>
    public bool SaveHistoryToFile(out string savedPath, out string error)
    {
        error = "";
        savedPath = "";
        
        try
        {
            string projectRoot = Application.dataPath.Replace("/Assets", "").Replace("\\Assets", "");
            string historyDir = System.IO.Path.Combine(projectRoot, "RoslynHistory");
            
            if (!System.IO.Directory.Exists(historyDir))
            {
                System.IO.Directory.CreateDirectory(historyDir);
            }
            
            string timestamp = System.DateTime.Now.ToString("yyyyMMdd_HHmmss");
            string filename = $"RoslynHistory_{timestamp}.json";
            savedPath = System.IO.Path.Combine(historyDir, filename);
            
            string json = JsonUtility.ToJson(new HistoryWrapper { entries = _sharedHistory }, true);
            System.IO.File.WriteAllText(savedPath, json);
            
            Debug.Log($"[RuntimeRoslynDemo] Saved {_sharedHistory.Count} history entries to: {savedPath}");
            return true;
        }
        catch (System.Exception ex)
        {
            error = ex.Message;
            Debug.LogError($"[RuntimeRoslynDemo] Failed to save history: {error}");
            return false;
        }
    }
    
    /// <summary>
    /// Saves a specific history entry as a standalone .cs file outside Assets
    /// </summary>
    public bool SaveHistoryEntryAsScript(int index, out string savedPath, out string error)
    {
        error = "";
        savedPath = "";
        
        if (index < 0 || index >= _sharedHistory.Count)
        {
            error = "Invalid history index";
            return false;
        }
        
        try
        {
            var entry = _sharedHistory[index];
            string projectRoot = Application.dataPath.Replace("/Assets", "").Replace("\\Assets", "");
            string scriptsDir = System.IO.Path.Combine(projectRoot, "RoslynHistory", "Scripts");
            
            if (!System.IO.Directory.Exists(scriptsDir))
            {
                System.IO.Directory.CreateDirectory(scriptsDir);
            }
            
            string timestamp = System.DateTime.Parse(entry.timestamp).ToString("yyyyMMdd_HHmmss");
            string filename = $"{entry.typeName}_{timestamp}.cs";
            savedPath = System.IO.Path.Combine(scriptsDir, filename);
            
            // Add header comment
            string header = $"// Roslyn Runtime Compiled Script\n// Original Timestamp: {entry.timestamp}\n// Type: {entry.typeName}\n// Method: {entry.methodName}\n// Success: {entry.success}\n// Target: {entry.executionTarget}\n\n";
            
            System.IO.File.WriteAllText(savedPath, header + entry.sourceCode);
            
            Debug.Log($"[RuntimeRoslynDemo] Saved script to: {savedPath}");
            return true;
        }
        catch (System.Exception ex)
        {
            error = ex.Message;
            Debug.LogError($"[RuntimeRoslynDemo] Failed to save script: {error}");
            return false;
        }
    }
    
    /// <summary>
    /// Clears the compilation history
    /// </summary>
    public void ClearHistory()
    {
        _sharedHistory.Clear();
        Debug.Log("[RuntimeRoslynDemo] Compilation history cleared");
    }
    
    [System.Serializable]
    private class HistoryWrapper
    {
        public System.Collections.Generic.List<CompilationHistoryEntry> entries;
    }
}

/// <summary>
/// Static helper class for MCP tools to compile and execute C# code at runtime
/// </summary>
public static class RoslynMCPHelper
{
    private static RoslynRuntimeCompiler _compiler;
    
    /// <summary>
    /// Get or create the runtime compiler instance
    /// </summary>
    private static RoslynRuntimeCompiler GetOrCreateCompiler()
    {
        if (_compiler == null || _compiler.gameObject == null)
        {
            var existing = UnityEngine.Object.FindFirstObjectByType<RoslynRuntimeCompiler>();
            if (existing != null)
            {
                _compiler = existing;
            }
            else
            {
                var go = new GameObject("MCPRoslynCompiler");
                _compiler = go.AddComponent<RoslynRuntimeCompiler>();
                if (!Application.isPlaying)
                {
                    go.hideFlags = HideFlags.HideAndDontSave;
                }
            }
        }
        return _compiler;
    }

    /// <summary>
    /// MCP Entry Point: Compile C# code and attach to a GameObject
    /// </summary>
    /// <param name="sourceCode">Complete C# source code</param>
    /// <param name="className">Name of the class to instantiate</param>
    /// <param name="targetGameObjectName">Name of GameObject to attach to (null = create new)</param>
    /// <param name="result">Output result message</param>
    /// <returns>True if successful</returns>
    public static bool CompileAndAttach(string sourceCode, string className, string targetGameObjectName, out string result)
    {
        try
        {
            var compiler = GetOrCreateCompiler();
            
            // Find or create target GameObject
            GameObject target = null;
            if (!string.IsNullOrEmpty(targetGameObjectName))
            {
                target = GameObject.Find(targetGameObjectName);
                if (target == null)
                {
                    result = $"GameObject '{targetGameObjectName}' not found.";
                    return false;
                }
            }
            else
            {
                // Create a new GameObject for the script
                target = new GameObject($"Generated_{className}");
                UnityEngine.Debug.Log($"[MCP] Created new GameObject: {target.name}");
            }

            // Compile and execute
            bool success = compiler.CompileAndExecute(sourceCode, className, target, out string error);
            
            if (success)
            {
                result = $"Successfully compiled and attached '{className}' to '{target.name}'";
                UnityEngine.Debug.Log($"[MCP] {result}");
                return true;
            }
            else
            {
                result = $"Failed: {error}";
                UnityEngine.Debug.LogError($"[MCP] {result}");
                return false;
            }
        }
        catch (Exception ex)
        {
            result = $"Exception: {ex.Message}";
            UnityEngine.Debug.LogError($"[MCP] {result}\n{ex.StackTrace}");
            return false;
        }
    }

    /// <summary>
    /// MCP Entry Point: Compile and execute static method
    /// </summary>
    /// <param name="sourceCode">Complete C# source code</param>
    /// <param name="className">Name of the class containing the method</param>
    /// <param name="methodName">Name of the static method to invoke</param>
    /// <param name="targetGameObjectName">GameObject to pass as parameter (optional)</param>
    /// <param name="result">Output result message</param>
    /// <returns>True if successful</returns>
    public static bool CompileAndExecuteStatic(string sourceCode, string className, string methodName, string targetGameObjectName, out string result)
    {
        try
        {
            var compiler = GetOrCreateCompiler();
            
            GameObject target = compiler.gameObject;
            if (!string.IsNullOrEmpty(targetGameObjectName))
            {
                var found = GameObject.Find(targetGameObjectName);
                if (found != null)
                {
                    target = found;
                }
            }

            bool success = compiler.CompileAndExecute(sourceCode, className, methodName, target, false, out string error);
            
            if (success)
            {
                result = $"Successfully compiled and executed '{className}.{methodName}'";
                UnityEngine.Debug.Log($"[MCP] {result}");
                return true;
            }
            else
            {
                result = $"Failed: {error}";
                UnityEngine.Debug.LogError($"[MCP] {result}");
                return false;
            }
        }
        catch (Exception ex)
        {
            result = $"Exception: {ex.Message}";
            UnityEngine.Debug.LogError($"[MCP] {result}\n{ex.StackTrace}");
            return false;
        }
    }

    /// <summary>
    /// MCP Entry Point: Quick compile and attach MonoBehaviour
    /// </summary>
    /// <param name="sourceCode">MonoBehaviour source code</param>
    /// <param name="className">MonoBehaviour class name</param>
    /// <param name="gameObjectName">Target GameObject name (creates if null)</param>
    /// <returns>Success status message</returns>
    public static string QuickAttachScript(string sourceCode, string className, string gameObjectName = null)
    {
        bool success = CompileAndAttach(sourceCode, className, gameObjectName, out string result);
        return result;
    }

    /// <summary>
    /// MCP Entry Point: Execute code snippet with minimal parameters
    /// </summary>
    public static string ExecuteCode(string sourceCode, string className = "AIGenerated")
    {
        bool success = CompileAndExecuteStatic(sourceCode, className, "Run", null, out string result);
        return result;
    }
}

#if UNITY_EDITOR
// Editor window
public class RoslynRuntimeCompilerWindow : EditorWindow
{
    private RoslynRuntimeCompiler helperInScene;
    private Vector2 scrollPos;
    private Vector2 diagScroll;
    private Vector2 historyScroll;
    private int selectedTab = 0;
    private string[] tabNames = { "Compiler", "History" };
    private int selectedHistoryIndex = -1;
    private Vector2 historyCodeScroll;

    // Editor UI state
    private string codeText = string.Empty;
    private string typeName = "AIGenerated";
    private string methodName = "Run";
    private bool attachAsComponent = false;
    private GameObject targetGameObject = null;

    [MenuItem("Window/Roslyn Runtime Compiler")]
    public static void ShowWindow()
    {
        var w = GetWindow<RoslynRuntimeCompilerWindow>("Roslyn Runtime Compiler");
        w.minSize = new Vector2(600, 400);
    }

    void OnEnable()
    {
        // try to find an existing helper in scene
        helperInScene = FindFirstObjectByType<RoslynRuntimeCompiler>(FindObjectsInactive.Include);
        if (helperInScene == null)
        {
            var go = new GameObject("RoslynRuntimeHelper");
            helperInScene = go.AddComponent<RoslynRuntimeCompiler>();
            // Don't save this helper into scene assets
            go.hideFlags = HideFlags.HideAndDontSave;
        }

        if (helperInScene != null)
        {
            codeText = helperInScene.code;
            typeName = helperInScene.entryTypeName;
            methodName = helperInScene.entryMethodName;
            attachAsComponent = helperInScene.attachAsComponent;
            targetGameObject = helperInScene.targetGameObject;
        }
    }

    void OnDisable()
    {
        // keep editor text back to helper if it still exists
        if (helperInScene != null && helperInScene.gameObject != null)
        {
            helperInScene.code = codeText;
            helperInScene.entryTypeName = typeName;
            helperInScene.entryMethodName = methodName;
            helperInScene.attachAsComponent = attachAsComponent;
            helperInScene.targetGameObject = targetGameObject;
        }
    }
    
    void OnDestroy()
    {
        // Clean up helper object when window is destroyed
        if (helperInScene != null && helperInScene.gameObject != null)
        {
            DestroyImmediate(helperInScene.gameObject);
            helperInScene = null;
        }
    }

    void OnGUI()
    {
        // Ensure helper exists before drawing GUI - recreate if needed
        if (helperInScene == null || helperInScene.gameObject == null)
        {
            // Try to find existing helper first
            helperInScene = FindFirstObjectByType<RoslynRuntimeCompiler>(FindObjectsInactive.Include);
            
            // If still not found, create a new one
            if (helperInScene == null)
            {
                var go = new GameObject("RoslynRuntimeHelper");
                helperInScene = go.AddComponent<RoslynRuntimeCompiler>();
                go.hideFlags = HideFlags.HideAndDontSave;
                
                // Initialize with default values
                helperInScene.code = codeText;
                helperInScene.entryTypeName = typeName;
                helperInScene.entryMethodName = methodName;
                helperInScene.attachAsComponent = attachAsComponent;
                helperInScene.targetGameObject = targetGameObject;
            }
            else
            {
                // Load state from found helper
                codeText = helperInScene.code;
                typeName = helperInScene.entryTypeName;
                methodName = helperInScene.entryMethodName;
                attachAsComponent = helperInScene.attachAsComponent;
                targetGameObject = helperInScene.targetGameObject;
            }
        }

        EditorGUILayout.LabelField("Roslyn Runtime Compiler (Editor)", EditorStyles.boldLabel);
        EditorGUILayout.Space();
        
        // Tab selector
        selectedTab = GUILayout.Toolbar(selectedTab, tabNames);
        EditorGUILayout.Space();
        
        if (selectedTab == 0)
        {
            DrawCompilerTab();
        }
        else if (selectedTab == 1)
        {
            DrawHistoryTab();
        }
    }
    
    void DrawCompilerTab()
    {
        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.LabelField("Entry Type:", GUILayout.Width(70));
        typeName = EditorGUILayout.TextField(typeName);
        EditorGUILayout.LabelField("Method:", GUILayout.Width(50));
        methodName = EditorGUILayout.TextField(methodName, GUILayout.Width(120));
        EditorGUILayout.EndHorizontal();
        
        EditorGUILayout.BeginHorizontal();
        attachAsComponent = EditorGUILayout.Toggle("Attach as Component", attachAsComponent, GUILayout.Width(200));
        if (attachAsComponent)
        {
            EditorGUILayout.LabelField("Target:", GUILayout.Width(45));
            targetGameObject = (GameObject)EditorGUILayout.ObjectField(targetGameObject, typeof(GameObject), true);
        }
        EditorGUILayout.EndHorizontal();

        EditorGUILayout.Space();

        EditorGUILayout.LabelField("Code (paste LLM output here):");
        scrollPos = EditorGUILayout.BeginScrollView(scrollPos, GUILayout.Height(position.height * 0.55f));
        codeText = EditorGUILayout.TextArea(codeText, GUILayout.ExpandHeight(true));
        EditorGUILayout.EndScrollView();

        EditorGUILayout.Space();

        EditorGUILayout.BeginHorizontal();
        if (GUILayout.Button("Compile"))
        {
            ApplyToHelper();
            if (helperInScene != null)
            {
                var ok = helperInScene.CompileInMemory(out var diag);
                Debug.Log(ok ? "Compile OK" : "Compile Failed\n" + diag);
            }
        }

        bool canRun = helperInScene != null && helperInScene.HasCompiledAssembly && 
                      (helperInScene.HasEntryMethod || (helperInScene.HasEntryType && typeof(MonoBehaviour).IsAssignableFrom(helperInScene.EntryType)));
        GUI.enabled = canRun;
        if (GUILayout.Button("Run (invoke on selected)"))
        {
            ApplyToHelper();
            var sel = Selection.activeGameObject;
            if (sel == null && helperInScene != null && helperInScene.gameObject != null)
                sel = helperInScene.gameObject;
                
            if (sel != null && helperInScene != null)
            {
                if (helperInScene.InvokeEntry(sel, out var runtimeErr))
                    Debug.Log("Invocation OK on: " + sel.name);
                else
                    Debug.LogError("Invocation failed: " + runtimeErr);
            }
        }

        GUI.enabled = true;
        if (GUILayout.Button("Compile & Run on helper"))
        {
            ApplyToHelper();
            if (helperInScene != null)
            {
                helperInScene.CompileAndRunOnSelf();
            }
        }

        EditorGUILayout.EndHorizontal();

        EditorGUILayout.Space();
        EditorGUILayout.LabelField("Diagnostics:");
        diagScroll = EditorGUILayout.BeginScrollView(diagScroll, GUILayout.Height(120));
        string diagnosticsText = (helperInScene != null && helperInScene.lastCompileDiagnostics != null) 
            ? helperInScene.lastCompileDiagnostics 
            : "No diagnostics available.";
        EditorGUILayout.HelpBox(diagnosticsText, MessageType.Info);
        EditorGUILayout.EndScrollView();

        EditorGUILayout.Space();
        EditorGUILayout.LabelField("Notes:");
        EditorGUILayout.HelpBox("This compiles code in-memory using Roslyn. Do not write .cs files into Assets while running. Generated code runs with editor permissions.\n\n" +
            "Supported patterns:\n" +
            "1. Static method: public static void Run(GameObject host)\n" +
            "2. MonoBehaviour: Enable 'Attach as Component' for classes inheriting MonoBehaviour\n" +
            "3. Coroutine: public static IEnumerator RunCoroutine(MonoBehaviour host)\n" +
            "4. Parameterless: public static void Run()", MessageType.None);
    }
    
    void DrawHistoryTab()
    {
        if (helperInScene == null) return;
        
        var history = helperInScene.CompilationHistory;
        
        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.LabelField($"Compilation History ({history.Count} entries)", EditorStyles.boldLabel);
        
        if (GUILayout.Button("Save History JSON", GUILayout.Width(140)))
        {
            if (helperInScene.SaveHistoryToFile(out string path, out string error))
            {
                EditorUtility.DisplayDialog("Success", $"History saved to:\n{path}", "OK");
            }
            else
            {
                EditorUtility.DisplayDialog("Error", $"Failed to save history:\n{error}", "OK");
            }
        }
        
        if (GUILayout.Button("Clear History", GUILayout.Width(100)))
        {
            if (EditorUtility.DisplayDialog("Clear History", "Are you sure you want to clear all compilation history?", "Yes", "No"))
            {
                helperInScene.ClearHistory();
                selectedHistoryIndex = -1;
            }
        }
        EditorGUILayout.EndHorizontal();
        
        EditorGUILayout.Space();
        
        if (history.Count == 0)
        {
            EditorGUILayout.HelpBox("No compilation history yet. Compile and run scripts to see them here.", MessageType.Info);
            return;
        }
        
        EditorGUILayout.BeginHorizontal();
        
        // Left panel - history list
        EditorGUILayout.BeginVertical(GUILayout.Width(position.width * 0.4f));
        EditorGUILayout.LabelField("History Entries:", EditorStyles.boldLabel);
        historyScroll = EditorGUILayout.BeginScrollView(historyScroll);
        
        for (int i = history.Count - 1; i >= 0; i--) // Reverse order (newest first)
        {
            var entry = history[i];
            GUIStyle entryStyle = new GUIStyle(GUI.skin.button);
            entryStyle.alignment = TextAnchor.MiddleLeft;
            entryStyle.normal.textColor = entry.success ? Color.green : Color.red;
            
            if (selectedHistoryIndex == i)
            {
                entryStyle.normal.background = Texture2D.grayTexture;
            }
            
            string label = $"[{i}] {entry.timestamp} - {entry.typeName}.{entry.methodName}";
            if (entry.success)
                label += " ✓";
            else
                label += " ✗";
                
            if (GUILayout.Button(label, entryStyle, GUILayout.Height(30)))
            {
                selectedHistoryIndex = i;
            }
        }
        
        EditorGUILayout.EndScrollView();
        EditorGUILayout.EndVertical();
        
        // Right panel - selected entry details
        EditorGUILayout.BeginVertical();
        
        if (selectedHistoryIndex >= 0 && selectedHistoryIndex < history.Count)
        {
            var entry = history[selectedHistoryIndex];
            
            EditorGUILayout.LabelField("Entry Details:", EditorStyles.boldLabel);
            EditorGUILayout.LabelField("Timestamp:", entry.timestamp);
            EditorGUILayout.LabelField("Type:", entry.typeName);
            EditorGUILayout.LabelField("Method:", entry.methodName);
            EditorGUILayout.LabelField("Target:", entry.executionTarget);
            EditorGUILayout.LabelField("Success:", entry.success ? "Yes" : "No");
            
            EditorGUILayout.Space();
            
            if (!string.IsNullOrEmpty(entry.diagnostics))
            {
                EditorGUILayout.LabelField("Diagnostics:");
                EditorGUILayout.HelpBox(entry.diagnostics, entry.success ? MessageType.Info : MessageType.Error);
            }
            
            EditorGUILayout.Space();
            
            EditorGUILayout.BeginHorizontal();
            if (GUILayout.Button("Load to Compiler", GUILayout.Height(25)))
            {
                codeText = entry.sourceCode;
                typeName = entry.typeName;
                methodName = entry.methodName;
                selectedTab = 0; // Switch to compiler tab
            }
            
            if (GUILayout.Button("Save as .cs File", GUILayout.Height(25)))
            {
                if (helperInScene.SaveHistoryEntryAsScript(selectedHistoryIndex, out string path, out string error))
                {
                    EditorUtility.DisplayDialog("Success", $"Script saved to:\n{path}", "OK");
                    EditorUtility.RevealInFinder(path);
                }
                else
                {
                    EditorUtility.DisplayDialog("Error", $"Failed to save script:\n{error}", "OK");
                }
            }
            EditorGUILayout.EndHorizontal();
            
            EditorGUILayout.Space();
            
            EditorGUILayout.LabelField("Source Code:");
            historyCodeScroll = EditorGUILayout.BeginScrollView(historyCodeScroll, GUILayout.ExpandHeight(true));
            EditorGUILayout.TextArea(entry.sourceCode, GUILayout.ExpandHeight(true));
            EditorGUILayout.EndScrollView();
        }
        else
        {
            EditorGUILayout.HelpBox("Select a history entry to view details.", MessageType.Info);
        }
        
        EditorGUILayout.EndVertical();
        
        EditorGUILayout.EndHorizontal();
    }

    void ApplyToHelper()
    {
        if (helperInScene == null || helperInScene.gameObject == null)
        {
            Debug.LogError("Helper object is missing or destroyed. Cannot apply settings.");
            return;
        }

        helperInScene.code = codeText;
        helperInScene.entryTypeName = typeName;
        helperInScene.entryMethodName = methodName;
        helperInScene.attachAsComponent = attachAsComponent;
        helperInScene.targetGameObject = targetGameObject;
    }
}
#endif


================================================
FILE: CustomTools/RoslynRuntimeCompilation/RoslynRuntimeCompiler.cs.meta
================================================
fileFormatVersion: 2
guid: 97f1198c66ce56043a3c8a5e05ba0150

================================================
FILE: LICENSE
================================================
MIT License

Copyright (c) 2025 CoplayDev

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


================================================
FILE: MCPForUnity/Editor/AssemblyInfo.cs
================================================
using System.Runtime.CompilerServices;

[assembly: InternalsVisibleTo("MCPForUnityTests.EditMode")]


================================================
FILE: MCPForUnity/Editor/AssemblyInfo.cs.meta
================================================
fileFormatVersion: 2
guid: be61633e00d934610ac1ff8192ffbe3d
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData: 
  assetBundleName: 
  assetBundleVariant: 


================================================
FILE: MCPForUnity/Editor/Clients/Configurators/AntigravityConfigurator.cs
================================================
using System;
using System.Collections.Generic;
using System.IO;
using MCPForUnity.Editor.Constants;
using MCPForUnity.Editor.Models;
using UnityEditor;

namespace MCPForUnity.Editor.Clients.Configurators
{
    public class AntigravityConfigurator : JsonFileMcpConfigurator
    {
        public AntigravityConfigurator() : base(new McpClient
        {
            name = "Antigravity",
            windowsConfigPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), ".gemini", "antigravity", "mcp_config.json"),
            macConfigPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), ".gemini", "antigravity", "mcp_config.json"),
            linuxConfigPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), ".gemini", "antigravity", "mcp_config.json"),
            HttpUrlProperty = "serverUrl",
            DefaultUnityFields = { { "disabled", false } },
            StripEnvWhenNotRequired = true
        })
        { }

        public override IList<string> GetInstallationSteps() => new List<string>
        {
            "Open Antigravity",
            "Click the more_horiz menu in the Agent pane > MCP Servers",
            "Select 'Install' for Unity MCP or use the Configure button above",
            "Restart Antigravity if necessary"
        };
    }
}


================================================
FILE: MCPForUnity/Editor/Clients/Configurators/AntigravityConfigurator.cs.meta
================================================
fileFormatVersion: 2
guid: 331b33961513042e3945d0a1d06615b5
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData: 
  assetBundleName: 
  assetBundleVariant: 


================================================
FILE: MCPForUnity/Editor/Clients/Configurators/CherryStudioConfigurator.cs
================================================
using System;
using System.Collections.Generic;
using System.IO;
using MCPForUnity.Editor.Constants;
using MCPForUnity.Editor.Models;
using MCPForUnity.Editor.Services;
using UnityEditor;

namespace MCPForUnity.Editor.Clients.Configurators
{
    public class CherryStudioConfigurator : JsonFileMcpConfigurator
    {
        public const string ClientName = "Cherry Studio";

        public CherryStudioConfigurator() : base(new McpClient
        {
            name = ClientName,
            windowsConfigPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Cherry Studio", "config"),
            macConfigPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), "Library", "Application Support", "Cherry Studio", "config"),
            linuxConfigPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), ".config", "Cherry Studio", "config"),
            SupportsHttpTransport = false
        })
        { }

        public override bool SupportsAutoConfigure => false;

        public override IList<string> GetInstallationSteps() => new List<string>
        {
            "Open Cherry Studio",
            "Go to Settings (⚙️) → MCP Server",
            "Click 'Add Server' button",
            "For STDIO mode (recommended):",
            "  - Name: unity-mcp",
            "  - Type: STDIO",
            "  - Command: uvx",
            "  - Arguments: Copy from the Manual Configuration JSON below",
            "Click Save and restart Cherry Studio",
            "",
            "Note: Cherry Studio uses UI-based configuration.",
            "Use the manual snippet below as reference for the values to enter."
        };

        public override McpStatus CheckStatus(bool attemptAutoRewrite = true)
        {
            client.SetStatus(McpStatus.NotConfigured, "Cherry Studio requires manual UI configuration");
            return client.status;
        }

        public override void Configure()
        {
            throw new InvalidOperationException(
                "Cherry Studio uses UI-based configuration. " +
                "Please use the Manual Configuration snippet and Installation Steps to configure manually."
            );
        }

        public override string GetManualSnippet()
        {
            bool useHttp = EditorConfigurationCache.Instance.UseHttpTransport;

            if (useHttp)
            {
                return "# Cherry Studio does not support WebSocket transport.\n" +
                       "# Cherry Studio supports STDIO and SSE transports.\n" +
                       "# \n" +
                       "# To use Cherry Studio:\n" +
                       "# 1. Switch transport to 'Stdio' in Advanced Settings below\n" +
                       "# 2. Return to this configuration screen\n" +
                       "# 3. Copy the STDIO configuration snippet that will appear\n" +
                       "# \n" +
                       "# OPTION 2: SSE mode (future support)\n" +
                       "# Note: Unity MCP does not currently have an SSE endpoint.\n" +
                       "# This may be added in a future update.";
            }

            return base.GetManualSnippet() + "\n\n" +
                   "# Cherry Studio Configuration Instructions:\n" +
                   "# Cherry Studio uses UI-based configuration, not a JSON file.\n" +
                   "# \n" +
                   "# To configure:\n" +
                   "# 1. Open Cherry Studio\n" +
                   "# 2. Go to Settings (⚙️) → MCP Server\n" +
                   "# 3. Click 'Ad
Download .txt
gitextract_6xex_klh/

├── .dockerignore
├── .github/
│   ├── actions/
│   │   ├── publish-docker/
│   │   │   └── action.yml
│   │   └── publish-pypi/
│   │       └── action.yml
│   ├── pull_request_template.md
│   ├── scripts/
│   │   └── mark_skipped.py
│   └── workflows/
│       ├── beta-release.yml
│       ├── claude-nl-suite.yml
│       ├── github-repo-stats.yml
│       ├── python-tests.yml
│       ├── release.yml
│       └── unity-tests.yml
├── .gitignore
├── .mcpbignore
├── CLAUDE.md
├── CustomTools/
│   └── RoslynRuntimeCompilation/
│       ├── ManageRuntimeCompilation.cs
│       ├── ManageRuntimeCompilation.cs.meta
│       ├── RoslynRuntimeCompiler.cs
│       └── RoslynRuntimeCompiler.cs.meta
├── LICENSE
├── MCPForUnity/
│   ├── Editor/
│   │   ├── AssemblyInfo.cs
│   │   ├── AssemblyInfo.cs.meta
│   │   ├── Clients/
│   │   │   ├── Configurators/
│   │   │   │   ├── AntigravityConfigurator.cs
│   │   │   │   ├── AntigravityConfigurator.cs.meta
│   │   │   │   ├── CherryStudioConfigurator.cs
│   │   │   │   ├── CherryStudioConfigurator.cs.meta
│   │   │   │   ├── ClaudeCodeConfigurator.cs
│   │   │   │   ├── ClaudeCodeConfigurator.cs.meta
│   │   │   │   ├── ClaudeDesktopConfigurator.cs
│   │   │   │   ├── ClaudeDesktopConfigurator.cs.meta
│   │   │   │   ├── ClineConfigurator.cs
│   │   │   │   ├── ClineConfigurator.cs.meta
│   │   │   │   ├── CodeBuddyCliConfigurator.cs
│   │   │   │   ├── CodeBuddyCliConfigurator.cs.meta
│   │   │   │   ├── CodexConfigurator.cs
│   │   │   │   ├── CodexConfigurator.cs.meta
│   │   │   │   ├── CopilotCliConfigurator.cs
│   │   │   │   ├── CopilotCliConfigurator.cs.meta
│   │   │   │   ├── CursorConfigurator.cs
│   │   │   │   ├── CursorConfigurator.cs.meta
│   │   │   │   ├── GeminiCliConfigurator.cs
│   │   │   │   ├── GeminiCliConfigurator.cs.meta
│   │   │   │   ├── KiloCodeConfigurator.cs
│   │   │   │   ├── KiloCodeConfigurator.cs.meta
│   │   │   │   ├── KiroConfigurator.cs
│   │   │   │   ├── KiroConfigurator.cs.meta
│   │   │   │   ├── OpenCodeConfigurator.cs
│   │   │   │   ├── OpenCodeConfigurator.cs.meta
│   │   │   │   ├── QwenCodeConfigurator.cs
│   │   │   │   ├── QwenCodeConfigurator.cs.meta
│   │   │   │   ├── RiderConfigurator.cs
│   │   │   │   ├── RiderConfigurator.cs.meta
│   │   │   │   ├── TraeConfigurator.cs
│   │   │   │   ├── TraeConfigurator.cs.meta
│   │   │   │   ├── VSCodeConfigurator.cs
│   │   │   │   ├── VSCodeConfigurator.cs.meta
│   │   │   │   ├── VSCodeInsidersConfigurator.cs
│   │   │   │   ├── VSCodeInsidersConfigurator.cs.meta
│   │   │   │   ├── WindsurfConfigurator.cs
│   │   │   │   └── WindsurfConfigurator.cs.meta
│   │   │   ├── Configurators.meta
│   │   │   ├── IMcpClientConfigurator.cs
│   │   │   ├── IMcpClientConfigurator.cs.meta
│   │   │   ├── McpClientConfiguratorBase.cs
│   │   │   ├── McpClientConfiguratorBase.cs.meta
│   │   │   ├── McpClientRegistry.cs
│   │   │   └── McpClientRegistry.cs.meta
│   │   ├── Clients.meta
│   │   ├── Constants/
│   │   │   ├── AuthConstants.cs
│   │   │   ├── AuthConstants.cs.meta
│   │   │   ├── EditorPrefKeys.cs
│   │   │   ├── EditorPrefKeys.cs.meta
│   │   │   ├── HealthStatus.cs
│   │   │   └── HealthStatus.cs.meta
│   │   ├── Constants.meta
│   │   ├── Dependencies/
│   │   │   ├── DependencyManager.cs
│   │   │   ├── DependencyManager.cs.meta
│   │   │   ├── Models/
│   │   │   │   ├── DependencyCheckResult.cs
│   │   │   │   ├── DependencyCheckResult.cs.meta
│   │   │   │   ├── DependencyStatus.cs
│   │   │   │   └── DependencyStatus.cs.meta
│   │   │   ├── Models.meta
│   │   │   ├── PlatformDetectors/
│   │   │   │   ├── IPlatformDetector.cs
│   │   │   │   ├── IPlatformDetector.cs.meta
│   │   │   │   ├── LinuxPlatformDetector.cs
│   │   │   │   ├── LinuxPlatformDetector.cs.meta
│   │   │   │   ├── MacOSPlatformDetector.cs
│   │   │   │   ├── MacOSPlatformDetector.cs.meta
│   │   │   │   ├── PlatformDetectorBase.cs
│   │   │   │   ├── PlatformDetectorBase.cs.meta
│   │   │   │   ├── WindowsPlatformDetector.cs
│   │   │   │   └── WindowsPlatformDetector.cs.meta
│   │   │   └── PlatformDetectors.meta
│   │   ├── Dependencies.meta
│   │   ├── External/
│   │   │   ├── Tommy.cs
│   │   │   └── Tommy.cs.meta
│   │   ├── External.meta
│   │   ├── Helpers/
│   │   │   ├── AssetPathUtility.cs
│   │   │   ├── AssetPathUtility.cs.meta
│   │   │   ├── CodexConfigHelper.cs
│   │   │   ├── CodexConfigHelper.cs.meta
│   │   │   ├── ComponentOps.cs
│   │   │   ├── ComponentOps.cs.meta
│   │   │   ├── ConfigJsonBuilder.cs
│   │   │   ├── ConfigJsonBuilder.cs.meta
│   │   │   ├── EditorWindowScreenshotUtility.cs
│   │   │   ├── EditorWindowScreenshotUtility.cs.meta
│   │   │   ├── ExecPath.cs
│   │   │   ├── ExecPath.cs.meta
│   │   │   ├── GameObjectLookup.cs
│   │   │   ├── GameObjectLookup.cs.meta
│   │   │   ├── GameObjectSerializer.cs
│   │   │   ├── GameObjectSerializer.cs.meta
│   │   │   ├── HttpEndpointUtility.cs
│   │   │   ├── HttpEndpointUtility.cs.meta
│   │   │   ├── MaterialOps.cs
│   │   │   ├── MaterialOps.cs.meta
│   │   │   ├── McpConfigurationHelper.cs
│   │   │   ├── McpConfigurationHelper.cs.meta
│   │   │   ├── McpJobStateStore.cs
│   │   │   ├── McpJobStateStore.cs.meta
│   │   │   ├── McpLog.cs
│   │   │   ├── McpLog.cs.meta
│   │   │   ├── McpLogRecord.cs
│   │   │   ├── McpLogRecord.cs.meta
│   │   │   ├── ObjectResolver.cs
│   │   │   ├── ObjectResolver.cs.meta
│   │   │   ├── Pagination.cs
│   │   │   ├── Pagination.cs.meta
│   │   │   ├── ParamCoercion.cs
│   │   │   ├── ParamCoercion.cs.meta
│   │   │   ├── PortManager.cs
│   │   │   ├── PortManager.cs.meta
│   │   │   ├── PrefabUtilityHelper.cs
│   │   │   ├── PrefabUtilityHelper.cs.meta
│   │   │   ├── ProjectIdentityUtility.cs
│   │   │   ├── ProjectIdentityUtility.cs.meta
│   │   │   ├── PropertyConversion.cs
│   │   │   ├── PropertyConversion.cs.meta
│   │   │   ├── RenderPipelineUtility.cs
│   │   │   ├── RenderPipelineUtility.cs.meta
│   │   │   ├── RendererHelpers.cs
│   │   │   ├── RendererHelpers.cs.meta
│   │   │   ├── Response.cs
│   │   │   ├── Response.cs.meta
│   │   │   ├── StringCaseUtility.cs
│   │   │   ├── StringCaseUtility.cs.meta
│   │   │   ├── TelemetryHelper.cs
│   │   │   ├── TelemetryHelper.cs.meta
│   │   │   ├── TextureOps.cs
│   │   │   ├── TextureOps.cs.meta
│   │   │   ├── ToolParams.cs
│   │   │   ├── ToolParams.cs.meta
│   │   │   ├── UnityJsonSerializer.cs
│   │   │   ├── UnityJsonSerializer.cs.meta
│   │   │   ├── UnityTypeResolver.cs
│   │   │   ├── UnityTypeResolver.cs.meta
│   │   │   ├── VectorParsing.cs
│   │   │   └── VectorParsing.cs.meta
│   │   ├── Helpers.meta
│   │   ├── MCPForUnity.Editor.asmdef
│   │   ├── MCPForUnity.Editor.asmdef.meta
│   │   ├── McpCiBoot.cs
│   │   ├── McpCiBoot.cs.meta
│   │   ├── MenuItems/
│   │   │   ├── MCPForUnityMenu.cs
│   │   │   └── MCPForUnityMenu.cs.meta
│   │   ├── MenuItems.meta
│   │   ├── Migrations/
│   │   │   ├── LegacyServerSrcMigration.cs
│   │   │   ├── LegacyServerSrcMigration.cs.meta
│   │   │   ├── StdIoVersionMigration.cs
│   │   │   └── StdIoVersionMigration.cs.meta
│   │   ├── Migrations.meta
│   │   ├── Models/
│   │   │   ├── Command.cs
│   │   │   ├── Command.cs.meta
│   │   │   ├── MCPConfigServer.cs
│   │   │   ├── MCPConfigServer.cs.meta
│   │   │   ├── MCPConfigServers.cs
│   │   │   ├── MCPConfigServers.cs.meta
│   │   │   ├── McpClient.cs
│   │   │   ├── McpClient.cs.meta
│   │   │   ├── McpConfig.cs
│   │   │   ├── McpConfig.cs.meta
│   │   │   ├── McpStatus.cs
│   │   │   └── McpStatus.cs.meta
│   │   ├── Models.meta
│   │   ├── Resources/
│   │   │   ├── Editor/
│   │   │   │   ├── ActiveTool.cs
│   │   │   │   ├── ActiveTool.cs.meta
│   │   │   │   ├── EditorState.cs
│   │   │   │   ├── EditorState.cs.meta
│   │   │   │   ├── Selection.cs
│   │   │   │   ├── Selection.cs.meta
│   │   │   │   ├── ToolStates.cs
│   │   │   │   ├── ToolStates.cs.meta
│   │   │   │   ├── Windows.cs
│   │   │   │   └── Windows.cs.meta
│   │   │   ├── Editor.meta
│   │   │   ├── McpForUnityResourceAttribute.cs
│   │   │   ├── McpForUnityResourceAttribute.cs.meta
│   │   │   ├── MenuItems/
│   │   │   │   ├── GetMenuItems.cs
│   │   │   │   └── GetMenuItems.cs.meta
│   │   │   ├── MenuItems.meta
│   │   │   ├── Project/
│   │   │   │   ├── Layers.cs
│   │   │   │   ├── Layers.cs.meta
│   │   │   │   ├── ProjectInfo.cs
│   │   │   │   ├── ProjectInfo.cs.meta
│   │   │   │   ├── Tags.cs
│   │   │   │   └── Tags.cs.meta
│   │   │   ├── Project.meta
│   │   │   ├── Scene/
│   │   │   │   ├── CamerasResource.cs
│   │   │   │   ├── CamerasResource.cs.meta
│   │   │   │   ├── GameObjectResource.cs
│   │   │   │   ├── GameObjectResource.cs.meta
│   │   │   │   ├── RendererFeaturesResource.cs
│   │   │   │   ├── RendererFeaturesResource.cs.meta
│   │   │   │   ├── RenderingStatsResource.cs
│   │   │   │   ├── RenderingStatsResource.cs.meta
│   │   │   │   ├── VolumesResource.cs
│   │   │   │   └── VolumesResource.cs.meta
│   │   │   ├── Scene.meta
│   │   │   ├── Tests/
│   │   │   │   ├── GetTests.cs
│   │   │   │   └── GetTests.cs.meta
│   │   │   └── Tests.meta
│   │   ├── Resources.meta
│   │   ├── Services/
│   │   │   ├── BridgeControlService.cs
│   │   │   ├── BridgeControlService.cs.meta
│   │   │   ├── ClientConfigurationService.cs
│   │   │   ├── ClientConfigurationService.cs.meta
│   │   │   ├── EditorConfigurationCache.cs
│   │   │   ├── EditorConfigurationCache.cs.meta
│   │   │   ├── EditorPrefsWindowService.cs
│   │   │   ├── EditorPrefsWindowService.cs.meta
│   │   │   ├── EditorStateCache.cs
│   │   │   ├── EditorStateCache.cs.meta
│   │   │   ├── HttpAutoStartHandler.cs
│   │   │   ├── HttpAutoStartHandler.cs.meta
│   │   │   ├── HttpBridgeReloadHandler.cs
│   │   │   ├── HttpBridgeReloadHandler.cs.meta
│   │   │   ├── IBridgeControlService.cs
│   │   │   ├── IBridgeControlService.cs.meta
│   │   │   ├── IClientConfigurationService.cs
│   │   │   ├── IClientConfigurationService.cs.meta
│   │   │   ├── IPackageDeploymentService.cs
│   │   │   ├── IPackageDeploymentService.cs.meta
│   │   │   ├── IPackageUpdateService.cs
│   │   │   ├── IPackageUpdateService.cs.meta
│   │   │   ├── IPathResolverService.cs
│   │   │   ├── IPathResolverService.cs.meta
│   │   │   ├── IPlatformService.cs
│   │   │   ├── IPlatformService.cs.meta
│   │   │   ├── IResourceDiscoveryService.cs
│   │   │   ├── IResourceDiscoveryService.cs.meta
│   │   │   ├── IServerManagementService.cs
│   │   │   ├── IServerManagementService.cs.meta
│   │   │   ├── ITestRunnerService.cs
│   │   │   ├── ITestRunnerService.cs.meta
│   │   │   ├── IToolDiscoveryService.cs
│   │   │   ├── IToolDiscoveryService.cs.meta
│   │   │   ├── MCPServiceLocator.cs
│   │   │   ├── MCPServiceLocator.cs.meta
│   │   │   ├── McpEditorShutdownCleanup.cs
│   │   │   ├── McpEditorShutdownCleanup.cs.meta
│   │   │   ├── PackageDeploymentService.cs
│   │   │   ├── PackageDeploymentService.cs.meta
│   │   │   ├── PackageJobManager.cs
│   │   │   ├── PackageJobManager.cs.meta
│   │   │   ├── PackageUpdateService.cs
│   │   │   ├── PackageUpdateService.cs.meta
│   │   │   ├── PathResolverService.cs
│   │   │   ├── PathResolverService.cs.meta
│   │   │   ├── PlatformService.cs
│   │   │   ├── PlatformService.cs.meta
│   │   │   ├── ResourceDiscoveryService.cs
│   │   │   ├── ResourceDiscoveryService.cs.meta
│   │   │   ├── Server/
│   │   │   │   ├── IPidFileManager.cs
│   │   │   │   ├── IPidFileManager.cs.meta
│   │   │   │   ├── IProcessDetector.cs
│   │   │   │   ├── IProcessDetector.cs.meta
│   │   │   │   ├── IProcessTerminator.cs
│   │   │   │   ├── IProcessTerminator.cs.meta
│   │   │   │   ├── IServerCommandBuilder.cs
│   │   │   │   ├── IServerCommandBuilder.cs.meta
│   │   │   │   ├── ITerminalLauncher.cs
│   │   │   │   ├── ITerminalLauncher.cs.meta
│   │   │   │   ├── PidFileManager.cs
│   │   │   │   ├── PidFileManager.cs.meta
│   │   │   │   ├── ProcessDetector.cs
│   │   │   │   ├── ProcessDetector.cs.meta
│   │   │   │   ├── ProcessTerminator.cs
│   │   │   │   ├── ProcessTerminator.cs.meta
│   │   │   │   ├── ServerCommandBuilder.cs
│   │   │   │   ├── ServerCommandBuilder.cs.meta
│   │   │   │   ├── TerminalLauncher.cs
│   │   │   │   └── TerminalLauncher.cs.meta
│   │   │   ├── Server.meta
│   │   │   ├── ServerManagementService.cs
│   │   │   ├── ServerManagementService.cs.meta
│   │   │   ├── StdioBridgeReloadHandler.cs
│   │   │   ├── StdioBridgeReloadHandler.cs.meta
│   │   │   ├── TestJobManager.cs
│   │   │   ├── TestJobManager.cs.meta
│   │   │   ├── TestRunStatus.cs
│   │   │   ├── TestRunStatus.cs.meta
│   │   │   ├── TestRunnerNoThrottle.cs
│   │   │   ├── TestRunnerNoThrottle.cs.meta
│   │   │   ├── TestRunnerService.cs
│   │   │   ├── TestRunnerService.cs.meta
│   │   │   ├── ToolDiscoveryService.cs
│   │   │   ├── ToolDiscoveryService.cs.meta
│   │   │   ├── Transport/
│   │   │   │   ├── IMcpTransportClient.cs
│   │   │   │   ├── IMcpTransportClient.cs.meta
│   │   │   │   ├── TransportCommandDispatcher.cs
│   │   │   │   ├── TransportCommandDispatcher.cs.meta
│   │   │   │   ├── TransportManager.cs
│   │   │   │   ├── TransportManager.cs.meta
│   │   │   │   ├── TransportState.cs
│   │   │   │   ├── TransportState.cs.meta
│   │   │   │   ├── Transports/
│   │   │   │   │   ├── StdioBridgeHost.cs
│   │   │   │   │   ├── StdioBridgeHost.cs.meta
│   │   │   │   │   ├── StdioTransportClient.cs
│   │   │   │   │   ├── StdioTransportClient.cs.meta
│   │   │   │   │   ├── WebSocketTransportClient.cs
│   │   │   │   │   └── WebSocketTransportClient.cs.meta
│   │   │   │   └── Transports.meta
│   │   │   └── Transport.meta
│   │   ├── Services.meta
│   │   ├── Setup/
│   │   │   ├── McpForUnitySkillInstaller.cs
│   │   │   ├── McpForUnitySkillInstaller.cs.meta
│   │   │   ├── RoslynInstaller.cs
│   │   │   ├── RoslynInstaller.cs.meta
│   │   │   ├── SetupWindowService.cs
│   │   │   ├── SetupWindowService.cs.meta
│   │   │   ├── SkillSyncService.cs
│   │   │   └── SkillSyncService.cs.meta
│   │   ├── Setup.meta
│   │   ├── Tools/
│   │   │   ├── Animation/
│   │   │   │   ├── AnimatorControl.cs
│   │   │   │   ├── AnimatorControl.cs.meta
│   │   │   │   ├── AnimatorRead.cs
│   │   │   │   ├── AnimatorRead.cs.meta
│   │   │   │   ├── ClipCreate.cs
│   │   │   │   ├── ClipCreate.cs.meta
│   │   │   │   ├── ClipPresets.cs
│   │   │   │   ├── ClipPresets.cs.meta
│   │   │   │   ├── ControllerBlendTrees.cs
│   │   │   │   ├── ControllerBlendTrees.cs.meta
│   │   │   │   ├── ControllerCreate.cs
│   │   │   │   ├── ControllerCreate.cs.meta
│   │   │   │   ├── ControllerLayers.cs
│   │   │   │   ├── ControllerLayers.cs.meta
│   │   │   │   ├── ManageAnimation.cs
│   │   │   │   └── ManageAnimation.cs.meta
│   │   │   ├── Animation.meta
│   │   │   ├── BatchExecute.cs
│   │   │   ├── BatchExecute.cs.meta
│   │   │   ├── Cameras/
│   │   │   │   ├── CameraConfigure.cs
│   │   │   │   ├── CameraConfigure.cs.meta
│   │   │   │   ├── CameraControl.cs
│   │   │   │   ├── CameraControl.cs.meta
│   │   │   │   ├── CameraCreate.cs
│   │   │   │   ├── CameraCreate.cs.meta
│   │   │   │   ├── CameraHelpers.cs
│   │   │   │   ├── CameraHelpers.cs.meta
│   │   │   │   ├── ManageCamera.cs
│   │   │   │   └── ManageCamera.cs.meta
│   │   │   ├── Cameras.meta
│   │   │   ├── CommandRegistry.cs
│   │   │   ├── CommandRegistry.cs.meta
│   │   │   ├── ExecuteMenuItem.cs
│   │   │   ├── ExecuteMenuItem.cs.meta
│   │   │   ├── FindGameObjects.cs
│   │   │   ├── FindGameObjects.cs.meta
│   │   │   ├── GameObjects/
│   │   │   │   ├── ComponentResolver.cs
│   │   │   │   ├── ComponentResolver.cs.meta
│   │   │   │   ├── GameObjectComponentHelpers.cs
│   │   │   │   ├── GameObjectComponentHelpers.cs.meta
│   │   │   │   ├── GameObjectCreate.cs
│   │   │   │   ├── GameObjectCreate.cs.meta
│   │   │   │   ├── GameObjectDelete.cs
│   │   │   │   ├── GameObjectDelete.cs.meta
│   │   │   │   ├── GameObjectDuplicate.cs
│   │   │   │   ├── GameObjectDuplicate.cs.meta
│   │   │   │   ├── GameObjectHandlers.cs
│   │   │   │   ├── GameObjectHandlers.cs.meta
│   │   │   │   ├── GameObjectLookAt.cs
│   │   │   │   ├── GameObjectLookAt.cs.meta
│   │   │   │   ├── GameObjectModify.cs
│   │   │   │   ├── GameObjectModify.cs.meta
│   │   │   │   ├── GameObjectMoveRelative.cs
│   │   │   │   ├── GameObjectMoveRelative.cs.meta
│   │   │   │   ├── ManageGameObject.cs
│   │   │   │   ├── ManageGameObject.cs.meta
│   │   │   │   ├── ManageGameObjectCommon.cs
│   │   │   │   └── ManageGameObjectCommon.cs.meta
│   │   │   ├── GameObjects.meta
│   │   │   ├── GetTestJob.cs
│   │   │   ├── GetTestJob.cs.meta
│   │   │   ├── Graphics/
│   │   │   │   ├── GraphicsHelpers.cs
│   │   │   │   ├── GraphicsHelpers.cs.meta
│   │   │   │   ├── LightBakingOps.cs
│   │   │   │   ├── LightBakingOps.cs.meta
│   │   │   │   ├── ManageGraphics.cs
│   │   │   │   ├── ManageGraphics.cs.meta
│   │   │   │   ├── RenderPipelineOps.cs
│   │   │   │   ├── RenderPipelineOps.cs.meta
│   │   │   │   ├── RendererFeatureOps.cs
│   │   │   │   ├── RendererFeatureOps.cs.meta
│   │   │   │   ├── RenderingStatsOps.cs
│   │   │   │   ├── RenderingStatsOps.cs.meta
│   │   │   │   ├── SkyboxOps.cs
│   │   │   │   ├── SkyboxOps.cs.meta
│   │   │   │   ├── VolumeOps.cs
│   │   │   │   └── VolumeOps.cs.meta
│   │   │   ├── Graphics.meta
│   │   │   ├── JsonUtil.cs
│   │   │   ├── JsonUtil.cs.meta
│   │   │   ├── ManageAsset.cs
│   │   │   ├── ManageAsset.cs.meta
│   │   │   ├── ManageComponents.cs
│   │   │   ├── ManageComponents.cs.meta
│   │   │   ├── ManageEditor.cs
│   │   │   ├── ManageEditor.cs.meta
│   │   │   ├── ManageMaterial.cs
│   │   │   ├── ManageMaterial.cs.meta
│   │   │   ├── ManagePackages.cs
│   │   │   ├── ManagePackages.cs.meta
│   │   │   ├── ManageScene.cs
│   │   │   ├── ManageScene.cs.meta
│   │   │   ├── ManageScript.cs
│   │   │   ├── ManageScript.cs.meta
│   │   │   ├── ManageScriptableObject.cs
│   │   │   ├── ManageScriptableObject.cs.meta
│   │   │   ├── ManageShader.cs
│   │   │   ├── ManageShader.cs.meta
│   │   │   ├── ManageTexture.cs
│   │   │   ├── ManageTexture.cs.meta
│   │   │   ├── ManageUI.cs
│   │   │   ├── ManageUI.cs.meta
│   │   │   ├── McpForUnityToolAttribute.cs
│   │   │   ├── McpForUnityToolAttribute.cs.meta
│   │   │   ├── Prefabs/
│   │   │   │   ├── ManagePrefabs.cs
│   │   │   │   └── ManagePrefabs.cs.meta
│   │   │   ├── Prefabs.meta
│   │   │   ├── ProBuilder/
│   │   │   │   ├── ManageProBuilder.cs
│   │   │   │   ├── ManageProBuilder.cs.meta
│   │   │   │   ├── ProBuilderMeshUtils.cs
│   │   │   │   ├── ProBuilderMeshUtils.cs.meta
│   │   │   │   ├── ProBuilderSmoothing.cs
│   │   │   │   └── ProBuilderSmoothing.cs.meta
│   │   │   ├── ProBuilder.meta
│   │   │   ├── ReadConsole.cs
│   │   │   ├── ReadConsole.cs.meta
│   │   │   ├── RefreshUnity.cs
│   │   │   ├── RefreshUnity.cs.meta
│   │   │   ├── RunTests.cs
│   │   │   ├── RunTests.cs.meta
│   │   │   ├── UnityReflect.cs
│   │   │   ├── UnityReflect.cs.meta
│   │   │   ├── Vfx/
│   │   │   │   ├── LineCreate.cs
│   │   │   │   ├── LineCreate.cs.meta
│   │   │   │   ├── LineRead.cs
│   │   │   │   ├── LineRead.cs.meta
│   │   │   │   ├── LineWrite.cs
│   │   │   │   ├── LineWrite.cs.meta
│   │   │   │   ├── ManageVFX.cs
│   │   │   │   ├── ManageVFX.cs.meta
│   │   │   │   ├── ManageVfxCommon.cs
│   │   │   │   ├── ManageVfxCommon.cs.meta
│   │   │   │   ├── ParticleCommon.cs
│   │   │   │   ├── ParticleCommon.cs.meta
│   │   │   │   ├── ParticleControl.cs
│   │   │   │   ├── ParticleControl.cs.meta
│   │   │   │   ├── ParticleRead.cs
│   │   │   │   ├── ParticleRead.cs.meta
│   │   │   │   ├── ParticleWrite.cs
│   │   │   │   ├── ParticleWrite.cs.meta
│   │   │   │   ├── TrailControl.cs
│   │   │   │   ├── TrailControl.cs.meta
│   │   │   │   ├── TrailRead.cs
│   │   │   │   ├── TrailRead.cs.meta
│   │   │   │   ├── TrailWrite.cs
│   │   │   │   ├── TrailWrite.cs.meta
│   │   │   │   ├── VfxGraphAssets.cs
│   │   │   │   ├── VfxGraphAssets.cs.meta
│   │   │   │   ├── VfxGraphCommon.cs
│   │   │   │   ├── VfxGraphCommon.cs.meta
│   │   │   │   ├── VfxGraphControl.cs
│   │   │   │   ├── VfxGraphControl.cs.meta
│   │   │   │   ├── VfxGraphRead.cs
│   │   │   │   ├── VfxGraphRead.cs.meta
│   │   │   │   ├── VfxGraphWrite.cs
│   │   │   │   └── VfxGraphWrite.cs.meta
│   │   │   └── Vfx.meta
│   │   ├── Tools.meta
│   │   ├── Windows/
│   │   │   ├── Components/
│   │   │   │   ├── Advanced/
│   │   │   │   │   ├── McpAdvancedSection.cs
│   │   │   │   │   ├── McpAdvancedSection.cs.meta
│   │   │   │   │   ├── McpAdvancedSection.uxml
│   │   │   │   │   └── McpAdvancedSection.uxml.meta
│   │   │   │   ├── Advanced.meta
│   │   │   │   ├── ClientConfig/
│   │   │   │   │   ├── McpClientConfigSection.cs
│   │   │   │   │   ├── McpClientConfigSection.cs.meta
│   │   │   │   │   ├── McpClientConfigSection.uxml
│   │   │   │   │   └── McpClientConfigSection.uxml.meta
│   │   │   │   ├── ClientConfig.meta
│   │   │   │   ├── Common.uss
│   │   │   │   ├── Common.uss.meta
│   │   │   │   ├── Connection/
│   │   │   │   │   ├── McpConnectionSection.cs
│   │   │   │   │   ├── McpConnectionSection.cs.meta
│   │   │   │   │   ├── McpConnectionSection.uxml
│   │   │   │   │   └── McpConnectionSection.uxml.meta
│   │   │   │   ├── Connection.meta
│   │   │   │   ├── Resources/
│   │   │   │   │   ├── McpResourcesSection.cs
│   │   │   │   │   ├── McpResourcesSection.cs.meta
│   │   │   │   │   ├── McpResourcesSection.uxml
│   │   │   │   │   └── McpResourcesSection.uxml.meta
│   │   │   │   ├── Resources.meta
│   │   │   │   ├── Tools/
│   │   │   │   │   ├── McpToolsSection.cs
│   │   │   │   │   ├── McpToolsSection.cs.meta
│   │   │   │   │   ├── McpToolsSection.uxml
│   │   │   │   │   └── McpToolsSection.uxml.meta
│   │   │   │   ├── Tools.meta
│   │   │   │   ├── Validation/
│   │   │   │   │   ├── McpValidationSection.cs
│   │   │   │   │   ├── McpValidationSection.cs.meta
│   │   │   │   │   ├── McpValidationSection.uxml
│   │   │   │   │   └── McpValidationSection.uxml.meta
│   │   │   │   └── Validation.meta
│   │   │   ├── Components.meta
│   │   │   ├── EditorPrefs/
│   │   │   │   ├── EditorPrefItem.uxml
│   │   │   │   ├── EditorPrefItem.uxml.meta
│   │   │   │   ├── EditorPrefsWindow.cs
│   │   │   │   ├── EditorPrefsWindow.cs.meta
│   │   │   │   ├── EditorPrefsWindow.uss
│   │   │   │   ├── EditorPrefsWindow.uss.meta
│   │   │   │   ├── EditorPrefsWindow.uxml
│   │   │   │   └── EditorPrefsWindow.uxml.meta
│   │   │   ├── EditorPrefs.meta
│   │   │   ├── MCPForUnityEditorWindow.cs
│   │   │   ├── MCPForUnityEditorWindow.cs.meta
│   │   │   ├── MCPForUnityEditorWindow.uss
│   │   │   ├── MCPForUnityEditorWindow.uss.meta
│   │   │   ├── MCPForUnityEditorWindow.uxml
│   │   │   ├── MCPForUnityEditorWindow.uxml.meta
│   │   │   ├── MCPSetupWindow.cs
│   │   │   ├── MCPSetupWindow.cs.meta
│   │   │   ├── MCPSetupWindow.uss
│   │   │   ├── MCPSetupWindow.uss.meta
│   │   │   ├── MCPSetupWindow.uxml
│   │   │   └── MCPSetupWindow.uxml.meta
│   │   └── Windows.meta
│   ├── Editor.meta
│   ├── README.md
│   ├── README.md.meta
│   ├── Runtime/
│   │   ├── Helpers/
│   │   │   ├── ScreenshotUtility.cs
│   │   │   └── ScreenshotUtility.cs.meta
│   │   ├── Helpers.meta
│   │   ├── MCPForUnity.Runtime.asmdef
│   │   ├── MCPForUnity.Runtime.asmdef.meta
│   │   ├── Serialization/
│   │   │   ├── UnityTypeConverters.cs
│   │   │   └── UnityTypeConverters.cs.meta
│   │   └── Serialization.meta
│   ├── Runtime.meta
│   ├── package.json
│   └── package.json.meta
├── README.md
├── Server/
│   ├── DOCKER_OVERVIEW.md
│   ├── Dockerfile
│   ├── LICENSE
│   ├── README.md
│   ├── __init__.py
│   ├── pyproject.toml
│   ├── pyrightconfig.json
│   ├── src/
│   │   ├── __init__.py
│   │   ├── cli/
│   │   │   ├── CLI_USAGE_GUIDE.md
│   │   │   ├── __init__.py
│   │   │   ├── commands/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── animation.py
│   │   │   │   ├── asset.py
│   │   │   │   ├── audio.py
│   │   │   │   ├── batch.py
│   │   │   │   ├── camera.py
│   │   │   │   ├── code.py
│   │   │   │   ├── component.py
│   │   │   │   ├── docs.py
│   │   │   │   ├── editor.py
│   │   │   │   ├── gameobject.py
│   │   │   │   ├── graphics.py
│   │   │   │   ├── instance.py
│   │   │   │   ├── lighting.py
│   │   │   │   ├── material.py
│   │   │   │   ├── packages.py
│   │   │   │   ├── prefab.py
│   │   │   │   ├── probuilder.py
│   │   │   │   ├── reflect.py
│   │   │   │   ├── scene.py
│   │   │   │   ├── script.py
│   │   │   │   ├── shader.py
│   │   │   │   ├── texture.py
│   │   │   │   ├── tool.py
│   │   │   │   ├── ui.py
│   │   │   │   └── vfx.py
│   │   │   ├── main.py
│   │   │   └── utils/
│   │   │       ├── __init__.py
│   │   │       ├── config.py
│   │   │       ├── confirmation.py
│   │   │       ├── connection.py
│   │   │       ├── constants.py
│   │   │       ├── output.py
│   │   │       ├── parsers.py
│   │   │       └── suggestions.py
│   │   ├── core/
│   │   │   ├── __init__.py
│   │   │   ├── config.py
│   │   │   ├── constants.py
│   │   │   ├── logging_decorator.py
│   │   │   ├── telemetry.py
│   │   │   └── telemetry_decorator.py
│   │   ├── main.py
│   │   ├── models/
│   │   │   ├── __init__.py
│   │   │   ├── models.py
│   │   │   └── unity_response.py
│   │   ├── services/
│   │   │   ├── __init__.py
│   │   │   ├── api_key_service.py
│   │   │   ├── custom_tool_service.py
│   │   │   ├── registry/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── resource_registry.py
│   │   │   │   └── tool_registry.py
│   │   │   ├── resources/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── active_tool.py
│   │   │   │   ├── cameras.py
│   │   │   │   ├── custom_tools.py
│   │   │   │   ├── editor_state.py
│   │   │   │   ├── gameobject.py
│   │   │   │   ├── layers.py
│   │   │   │   ├── menu_items.py
│   │   │   │   ├── prefab.py
│   │   │   │   ├── prefab_stage.py
│   │   │   │   ├── project_info.py
│   │   │   │   ├── renderer_features.py
│   │   │   │   ├── rendering_stats.py
│   │   │   │   ├── selection.py
│   │   │   │   ├── tags.py
│   │   │   │   ├── tests.py
│   │   │   │   ├── tool_groups.py
│   │   │   │   ├── unity_instances.py
│   │   │   │   ├── volumes.py
│   │   │   │   └── windows.py
│   │   │   ├── state/
│   │   │   │   └── external_changes_scanner.py
│   │   │   └── tools/
│   │   │       ├── __init__.py
│   │   │       ├── batch_execute.py
│   │   │       ├── debug_request_context.py
│   │   │       ├── execute_custom_tool.py
│   │   │       ├── execute_menu_item.py
│   │   │       ├── find_gameobjects.py
│   │   │       ├── find_in_file.py
│   │   │       ├── manage_animation.py
│   │   │       ├── manage_asset.py
│   │   │       ├── manage_camera.py
│   │   │       ├── manage_components.py
│   │   │       ├── manage_editor.py
│   │   │       ├── manage_gameobject.py
│   │   │       ├── manage_graphics.py
│   │   │       ├── manage_material.py
│   │   │       ├── manage_packages.py
│   │   │       ├── manage_prefabs.py
│   │   │       ├── manage_probuilder.py
│   │   │       ├── manage_scene.py
│   │   │       ├── manage_script.py
│   │   │       ├── manage_scriptable_object.py
│   │   │       ├── manage_shader.py
│   │   │       ├── manage_texture.py
│   │   │       ├── manage_tools.py
│   │   │       ├── manage_ui.py
│   │   │       ├── manage_vfx.py
│   │   │       ├── preflight.py
│   │   │       ├── read_console.py
│   │   │       ├── refresh_unity.py
│   │   │       ├── run_tests.py
│   │   │       ├── script_apply_edits.py
│   │   │       ├── set_active_instance.py
│   │   │       ├── unity_docs.py
│   │   │       ├── unity_reflect.py
│   │   │       └── utils.py
│   │   ├── transport/
│   │   │   ├── __init__.py
│   │   │   ├── legacy/
│   │   │   │   ├── port_discovery.py
│   │   │   │   ├── stdio_port_registry.py
│   │   │   │   └── unity_connection.py
│   │   │   ├── models.py
│   │   │   ├── plugin_hub.py
│   │   │   ├── plugin_registry.py
│   │   │   ├── unity_instance_middleware.py
│   │   │   └── unity_transport.py
│   │   └── utils/
│   │       ├── focus_nudge.py
│   │       └── module_discovery.py
│   └── tests/
│       ├── __init__.py
│       ├── conftest.py
│       ├── integration/
│       │   ├── __init__.py
│       │   ├── conftest.py
│       │   ├── test_api_key_service.py
│       │   ├── test_auth_config_startup.py
│       │   ├── test_debug_request_context_diagnostics.py
│       │   ├── test_domain_reload_resilience.py
│       │   ├── test_edit_normalization_and_noop.py
│       │   ├── test_edit_strict_and_warnings.py
│       │   ├── test_editor_state_v2_contract.py
│       │   ├── test_external_changes_scanner.py
│       │   ├── test_find_gameobjects.py
│       │   ├── test_gameobject_resources.py
│       │   ├── test_get_sha.py
│       │   ├── test_helpers.py
│       │   ├── test_improved_anchor_matching.py
│       │   ├── test_inline_unity_instance.py
│       │   ├── test_instance_autoselect.py
│       │   ├── test_instance_routing_comprehensive.py
│       │   ├── test_instance_targeting_resolution.py
│       │   ├── test_json_parsing_simple.py
│       │   ├── test_logging_stdout.py
│       │   ├── test_manage_asset_json_parsing.py
│       │   ├── test_manage_asset_param_coercion.py
│       │   ├── test_manage_components.py
│       │   ├── test_manage_gameobject_look_at.py
│       │   ├── test_manage_gameobject_param_coercion.py
│       │   ├── test_manage_scene_paging_params.py
│       │   ├── test_manage_script_uri.py
│       │   ├── test_manage_scriptable_object_tool.py
│       │   ├── test_manage_texture.py
│       │   ├── test_manage_ui.py
│       │   ├── test_middleware_auth_integration.py
│       │   ├── test_multi_user_session_isolation.py
│       │   ├── test_plugin_hub_websocket_auth.py
│       │   ├── test_plugin_registry_user_isolation.py
│       │   ├── test_read_console_truncate.py
│       │   ├── test_read_resource_minimal.py
│       │   ├── test_refresh_unity_registration.py
│       │   ├── test_refresh_unity_retry_recovery.py
│       │   ├── test_resolve_user_id.py
│       │   ├── test_run_tests_async.py
│       │   ├── test_script_apply_edits_local.py
│       │   ├── test_script_tools.py
│       │   ├── test_telemetry_endpoint_validation.py
│       │   ├── test_telemetry_queue_worker.py
│       │   ├── test_telemetry_subaction.py
│       │   ├── test_tool_signatures_paging.py
│       │   ├── test_transport_framing.py
│       │   ├── test_transport_smoke.py
│       │   ├── test_validate_script_summary.py
│       │   └── test_wait_for_editor_ready.py
│       ├── pytest.ini
│       ├── test_cli.py
│       ├── test_cli_commands_characterization.py
│       ├── test_core_infrastructure_characterization.py
│       ├── test_custom_tool_service_user_scope.py
│       ├── test_focus_nudge.py
│       ├── test_manage_animation.py
│       ├── test_manage_camera.py
│       ├── test_manage_graphics.py
│       ├── test_manage_prefabs.py
│       ├── test_manage_probuilder.py
│       ├── test_manage_vfx_actions.py
│       ├── test_models_characterization.py
│       ├── test_param_normalizer.py
│       ├── test_tool_registry_metadata.py
│       ├── test_transport_characterization.py
│       ├── test_unity_docs.py
│       ├── test_unity_reflect.py
│       └── test_utilities_characterization.py
├── TestProjects/
│   ├── AssetStoreUploads/
│   │   ├── .gitignore
│   │   ├── Assets/
│   │   │   ├── Readme.asset.meta
│   │   │   ├── Scenes/
│   │   │   │   ├── SampleScene.unity
│   │   │   │   └── SampleScene.unity.meta
│   │   │   ├── Scenes.meta
│   │   │   ├── Settings/
│   │   │   │   ├── SampleSceneProfile.asset.meta
│   │   │   │   ├── URP-Balanced-Renderer.asset.meta
│   │   │   │   ├── URP-Balanced.asset.meta
│   │   │   │   ├── URP-HighFidelity-Renderer.asset.meta
│   │   │   │   ├── URP-HighFidelity.asset.meta
│   │   │   │   ├── URP-Performant-Renderer.asset.meta
│   │   │   │   └── URP-Performant.asset.meta
│   │   │   ├── Settings.meta
│   │   │   ├── TutorialInfo/
│   │   │   │   ├── Icons/
│   │   │   │   │   └── URP.png.meta
│   │   │   │   ├── Icons.meta
│   │   │   │   ├── Layout.wlt
│   │   │   │   ├── Layout.wlt.meta
│   │   │   │   ├── Scripts/
│   │   │   │   │   ├── Editor/
│   │   │   │   │   │   ├── ReadmeEditor.cs
│   │   │   │   │   │   └── ReadmeEditor.cs.meta
│   │   │   │   │   ├── Editor.meta
│   │   │   │   │   ├── Readme.cs
│   │   │   │   │   └── Readme.cs.meta
│   │   │   │   └── Scripts.meta
│   │   │   ├── TutorialInfo.meta
│   │   │   └── UniversalRenderPipelineGlobalSettings.asset.meta
│   │   ├── Packages/
│   │   │   ├── com.unity.asset-store-tools/
│   │   │   │   ├── CHANGELOG.md
│   │   │   │   ├── CHANGELOG.md.meta
│   │   │   │   ├── Editor/
│   │   │   │   │   ├── Api/
│   │   │   │   │   │   ├── Abstractions/
│   │   │   │   │   │   │   ├── AuthenticationBase.cs
│   │   │   │   │   │   │   ├── AuthenticationBase.cs.meta
│   │   │   │   │   │   │   ├── IAssetStoreApi.cs
│   │   │   │   │   │   │   ├── IAssetStoreApi.cs.meta
│   │   │   │   │   │   │   ├── IAssetStoreClient.cs
│   │   │   │   │   │   │   ├── IAssetStoreClient.cs.meta
│   │   │   │   │   │   │   ├── IAuthenticationType.cs
│   │   │   │   │   │   │   ├── IAuthenticationType.cs.meta
│   │   │   │   │   │   │   ├── IPackageUploader.cs
│   │   │   │   │   │   │   ├── IPackageUploader.cs.meta
│   │   │   │   │   │   │   ├── PackageUploaderBase.cs
│   │   │   │   │   │   │   └── PackageUploaderBase.cs.meta
│   │   │   │   │   │   ├── Abstractions.meta
│   │   │   │   │   │   ├── ApiUtility.cs
│   │   │   │   │   │   ├── ApiUtility.cs.meta
│   │   │   │   │   │   ├── AssetStoreApi.cs
│   │   │   │   │   │   ├── AssetStoreApi.cs.meta
│   │   │   │   │   │   ├── AssetStoreClient.cs
│   │   │   │   │   │   ├── AssetStoreClient.cs.meta
│   │   │   │   │   │   ├── CloudTokenAuthentication.cs
│   │   │   │   │   │   ├── CloudTokenAuthentication.cs.meta
│   │   │   │   │   │   ├── CredentialsAuthentication.cs
│   │   │   │   │   │   ├── CredentialsAuthentication.cs.meta
│   │   │   │   │   │   ├── Models/
│   │   │   │   │   │   │   ├── Category.cs
│   │   │   │   │   │   │   ├── Category.cs.meta
│   │   │   │   │   │   │   ├── Package.cs
│   │   │   │   │   │   │   ├── Package.cs.meta
│   │   │   │   │   │   │   ├── PackageAdditionalData.cs
│   │   │   │   │   │   │   ├── PackageAdditionalData.cs.meta
│   │   │   │   │   │   │   ├── User.cs
│   │   │   │   │   │   │   └── User.cs.meta
│   │   │   │   │   │   ├── Models.meta
│   │   │   │   │   │   ├── Responses/
│   │   │   │   │   │   │   ├── AssetStoreResponse.cs
│   │   │   │   │   │   │   ├── AssetStoreResponse.cs.meta
│   │   │   │   │   │   │   ├── AssetStoreToolsVersionResponse.cs
│   │   │   │   │   │   │   ├── AssetStoreToolsVersionResponse.cs.meta
│   │   │   │   │   │   │   ├── AuthenticationResponse.cs
│   │   │   │   │   │   │   ├── AuthenticationResponse.cs.meta
│   │   │   │   │   │   │   ├── CategoryDataResponse.cs
│   │   │   │   │   │   │   ├── CategoryDataResponse.cs.meta
│   │   │   │   │   │   │   ├── PackageThumbnailResponse.cs
│   │   │   │   │   │   │   ├── PackageThumbnailResponse.cs.meta
│   │   │   │   │   │   │   ├── PackageUploadedUnityVersionDataResponse.cs
│   │   │   │   │   │   │   ├── PackageUploadedUnityVersionDataResponse.cs.meta
│   │   │   │   │   │   │   ├── PackagesAdditionalDataResponse.cs
│   │   │   │   │   │   │   ├── PackagesAdditionalDataResponse.cs.meta
│   │   │   │   │   │   │   ├── PackagesDataResponse.cs
│   │   │   │   │   │   │   ├── PackagesDataResponse.cs.meta
│   │   │   │   │   │   │   ├── RefreshedPackageDataResponse.cs
│   │   │   │   │   │   │   ├── RefreshedPackageDataResponse.cs.meta
│   │   │   │   │   │   │   ├── UploadResponse.cs
│   │   │   │   │   │   │   └── UploadResponse.cs.meta
│   │   │   │   │   │   ├── Responses.meta
│   │   │   │   │   │   ├── SessionAuthentication.cs
│   │   │   │   │   │   ├── SessionAuthentication.cs.meta
│   │   │   │   │   │   ├── UnityPackageUploader.cs
│   │   │   │   │   │   ├── UnityPackageUploader.cs.meta
│   │   │   │   │   │   ├── UploadStatus.cs
│   │   │   │   │   │   └── UploadStatus.cs.meta
│   │   │   │   │   ├── Api.meta
│   │   │   │   │   ├── AssemblyInfo.cs
│   │   │   │   │   ├── AssemblyInfo.cs.meta
│   │   │   │   │   ├── AssetStoreTools.cs
│   │   │   │   │   ├── AssetStoreTools.cs.meta
│   │   │   │   │   ├── AssetStoreToolsWindow.cs
│   │   │   │   │   ├── AssetStoreToolsWindow.cs.meta
│   │   │   │   │   ├── Constants.cs
│   │   │   │   │   ├── Constants.cs.meta
│   │   │   │   │   ├── Exporter/
│   │   │   │   │   │   ├── Abstractions/
│   │   │   │   │   │   │   ├── IPackageExporter.cs
│   │   │   │   │   │   │   ├── IPackageExporter.cs.meta
│   │   │   │   │   │   │   ├── IPreviewInjector.cs
│   │   │   │   │   │   │   ├── IPreviewInjector.cs.meta
│   │   │   │   │   │   │   ├── PackageExporterBase.cs
│   │   │   │   │   │   │   ├── PackageExporterBase.cs.meta
│   │   │   │   │   │   │   ├── PackageExporterSettings.cs
│   │   │   │   │   │   │   └── PackageExporterSettings.cs.meta
│   │   │   │   │   │   ├── Abstractions.meta
│   │   │   │   │   │   ├── DefaultExporterSettings.cs
│   │   │   │   │   │   ├── DefaultExporterSettings.cs.meta
│   │   │   │   │   │   ├── DefaultPackageExporter.cs
│   │   │   │   │   │   ├── DefaultPackageExporter.cs.meta
│   │   │   │   │   │   ├── LegacyExporterSettings.cs
│   │   │   │   │   │   ├── LegacyExporterSettings.cs.meta
│   │   │   │   │   │   ├── LegacyPackageExporter.cs
│   │   │   │   │   │   ├── LegacyPackageExporter.cs.meta
│   │   │   │   │   │   ├── PackageExporterResult.cs
│   │   │   │   │   │   ├── PackageExporterResult.cs.meta
│   │   │   │   │   │   ├── PreviewInjector.cs
│   │   │   │   │   │   └── PreviewInjector.cs.meta
│   │   │   │   │   ├── Exporter.meta
│   │   │   │   │   ├── Previews/
│   │   │   │   │   │   ├── Scripts/
│   │   │   │   │   │   │   ├── Data/
│   │   │   │   │   │   │   │   ├── CustomPreviewGenerationSettings.cs
│   │   │   │   │   │   │   │   ├── CustomPreviewGenerationSettings.cs.meta
│   │   │   │   │   │   │   │   ├── FileNameFormat.cs
│   │   │   │   │   │   │   │   ├── FileNameFormat.cs.meta
│   │   │   │   │   │   │   │   ├── GenerationType.cs
│   │   │   │   │   │   │   │   ├── GenerationType.cs.meta
│   │   │   │   │   │   │   │   ├── NativePreviewGenerationSettings.cs
│   │   │   │   │   │   │   │   ├── NativePreviewGenerationSettings.cs.meta
│   │   │   │   │   │   │   │   ├── PreviewDatabase.cs
│   │   │   │   │   │   │   │   ├── PreviewDatabase.cs.meta
│   │   │   │   │   │   │   │   ├── PreviewFormat.cs
│   │   │   │   │   │   │   │   ├── PreviewFormat.cs.meta
│   │   │   │   │   │   │   │   ├── PreviewGenerationResult.cs
│   │   │   │   │   │   │   │   ├── PreviewGenerationResult.cs.meta
│   │   │   │   │   │   │   │   ├── PreviewGenerationSettings.cs
│   │   │   │   │   │   │   │   ├── PreviewGenerationSettings.cs.meta
│   │   │   │   │   │   │   │   ├── PreviewMetadata.cs
│   │   │   │   │   │   │   │   └── PreviewMetadata.cs.meta
│   │   │   │   │   │   │   ├── Data.meta
│   │   │   │   │   │   │   ├── Generators/
│   │   │   │   │   │   │   │   ├── Custom/
│   │   │   │   │   │   │   │   │   ├── AudioChannel.cs
│   │   │   │   │   │   │   │   │   ├── AudioChannel.cs.meta
│   │   │   │   │   │   │   │   │   ├── AudioChannelCoordinate.cs
│   │   │   │   │   │   │   │   │   ├── AudioChannelCoordinate.cs.meta
│   │   │   │   │   │   │   │   │   ├── Screenshotters/
│   │   │   │   │   │   │   │   │   │   ├── ISceneScreenshotter.cs
│   │   │   │   │   │   │   │   │   │   ├── ISceneScreenshotter.cs.meta
│   │   │   │   │   │   │   │   │   │   ├── MaterialScreenshotter.cs
│   │   │   │   │   │   │   │   │   │   ├── MaterialScreenshotter.cs.meta
│   │   │   │   │   │   │   │   │   │   ├── MeshScreenshotter.cs
│   │   │   │   │   │   │   │   │   │   ├── MeshScreenshotter.cs.meta
│   │   │   │   │   │   │   │   │   │   ├── SceneScreenshotterBase.cs
│   │   │   │   │   │   │   │   │   │   ├── SceneScreenshotterBase.cs.meta
│   │   │   │   │   │   │   │   │   │   ├── SceneScreenshotterSettings.cs
│   │   │   │   │   │   │   │   │   │   └── SceneScreenshotterSettings.cs.meta
│   │   │   │   │   │   │   │   │   ├── Screenshotters.meta
│   │   │   │   │   │   │   │   │   ├── TypeGenerators/
│   │   │   │   │   │   │   │   │   │   ├── AudioTypeGeneratorSettings.cs
│   │   │   │   │   │   │   │   │   │   ├── AudioTypeGeneratorSettings.cs.meta
│   │   │   │   │   │   │   │   │   │   ├── AudioTypePreviewGenerator.cs
│   │   │   │   │   │   │   │   │   │   ├── AudioTypePreviewGenerator.cs.meta
│   │   │   │   │   │   │   │   │   │   ├── ITypePreviewGenerator.cs
│   │   │   │   │   │   │   │   │   │   ├── ITypePreviewGenerator.cs.meta
│   │   │   │   │   │   │   │   │   │   ├── MaterialTypePreviewGenerator.cs
│   │   │   │   │   │   │   │   │   │   ├── MaterialTypePreviewGenerator.cs.meta
│   │   │   │   │   │   │   │   │   │   ├── ModelTypePreviewGenerator.cs
│   │   │   │   │   │   │   │   │   │   ├── ModelTypePreviewGenerator.cs.meta
│   │   │   │   │   │   │   │   │   │   ├── PrefabTypePreviewGenerator.cs
│   │   │   │   │   │   │   │   │   │   ├── PrefabTypePreviewGenerator.cs.meta
│   │   │   │   │   │   │   │   │   │   ├── TextureTypeGeneratorSettings.cs
│   │   │   │   │   │   │   │   │   │   ├── TextureTypeGeneratorSettings.cs.meta
│   │   │   │   │   │   │   │   │   │   ├── TextureTypePreviewGenerator.cs
│   │   │   │   │   │   │   │   │   │   ├── TextureTypePreviewGenerator.cs.meta
│   │   │   │   │   │   │   │   │   │   ├── TypeGeneratorSettings.cs
│   │   │   │   │   │   │   │   │   │   ├── TypeGeneratorSettings.cs.meta
│   │   │   │   │   │   │   │   │   │   ├── TypePreviewGeneratorBase.cs
│   │   │   │   │   │   │   │   │   │   ├── TypePreviewGeneratorBase.cs.meta
│   │   │   │   │   │   │   │   │   │   ├── TypePreviewGeneratorFromScene.cs
│   │   │   │   │   │   │   │   │   │   ├── TypePreviewGeneratorFromScene.cs.meta
│   │   │   │   │   │   │   │   │   │   ├── TypePreviewGeneratorFromSceneSettings.cs
│   │   │   │   │   │   │   │   │   │   └── TypePreviewGeneratorFromSceneSettings.cs.meta
│   │   │   │   │   │   │   │   │   └── TypeGenerators.meta
│   │   │   │   │   │   │   │   ├── Custom.meta
│   │   │   │   │   │   │   │   ├── CustomPreviewGenerator.cs
│   │   │   │   │   │   │   │   ├── CustomPreviewGenerator.cs.meta
│   │   │   │   │   │   │   │   ├── IPreviewGenerator.cs
│   │   │   │   │   │   │   │   ├── IPreviewGenerator.cs.meta
│   │   │   │   │   │   │   │   ├── NativePreviewGenerator.cs
│   │   │   │   │   │   │   │   ├── NativePreviewGenerator.cs.meta
│   │   │   │   │   │   │   │   ├── PreviewGeneratorBase.cs
│   │   │   │   │   │   │   │   └── PreviewGeneratorBase.cs.meta
│   │   │   │   │   │   │   ├── Generators.meta
│   │   │   │   │   │   │   ├── Services/
│   │   │   │   │   │   │   │   ├── Caching/
│   │   │   │   │   │   │   │   │   ├── CachingService.cs
│   │   │   │   │   │   │   │   │   ├── CachingService.cs.meta
│   │   │   │   │   │   │   │   │   ├── ICachingService.cs
│   │   │   │   │   │   │   │   │   └── ICachingService.cs.meta
│   │   │   │   │   │   │   │   ├── Caching.meta
│   │   │   │   │   │   │   │   ├── IPreviewService.cs
│   │   │   │   │   │   │   │   ├── IPreviewService.cs.meta
│   │   │   │   │   │   │   │   ├── PreviewServiceProvider.cs
│   │   │   │   │   │   │   │   └── PreviewServiceProvider.cs.meta
│   │   │   │   │   │   │   ├── Services.meta
│   │   │   │   │   │   │   ├── UI/
│   │   │   │   │   │   │   │   ├── Data/
│   │   │   │   │   │   │   │   │   ├── AssetPreview.cs
│   │   │   │   │   │   │   │   │   ├── AssetPreview.cs.meta
│   │   │   │   │   │   │   │   │   ├── AssetPreviewCollection.cs
│   │   │   │   │   │   │   │   │   ├── AssetPreviewCollection.cs.meta
│   │   │   │   │   │   │   │   │   ├── IAssetPreview.cs
│   │   │   │   │   │   │   │   │   ├── IAssetPreview.cs.meta
│   │   │   │   │   │   │   │   │   ├── IAssetPreviewCollection.cs
│   │   │   │   │   │   │   │   │   ├── IAssetPreviewCollection.cs.meta
│   │   │   │   │   │   │   │   │   ├── IPreviewGeneratorSettings.cs
│   │   │   │   │   │   │   │   │   ├── IPreviewGeneratorSettings.cs.meta
│   │   │   │   │   │   │   │   │   ├── PreviewGeneratorSettings.cs
│   │   │   │   │   │   │   │   │   └── PreviewGeneratorSettings.cs.meta
│   │   │   │   │   │   │   │   ├── Data.meta
│   │   │   │   │   │   │   │   ├── Elements/
│   │   │   │   │   │   │   │   │   ├── AssetPreviewElement.cs
│   │   │   │   │   │   │   │   │   ├── AssetPreviewElement.cs.meta
│   │   │   │   │   │   │   │   │   ├── GridListElement.cs
│   │   │   │   │   │   │   │   │   ├── GridListElement.cs.meta
│   │   │   │   │   │   │   │   │   ├── PreviewCollectionElement.cs
│   │   │   │   │   │   │   │   │   ├── PreviewCollectionElement.cs.meta
│   │   │   │   │   │   │   │   │   ├── PreviewGenerateButtonElement.cs
│   │   │   │   │   │   │   │   │   ├── PreviewGenerateButtonElement.cs.meta
│   │   │   │   │   │   │   │   │   ├── PreviewGeneratorPathsElement.cs
│   │   │   │   │   │   │   │   │   ├── PreviewGeneratorPathsElement.cs.meta
│   │   │   │   │   │   │   │   │   ├── PreviewGeneratorSettingsElement.cs
│   │   │   │   │   │   │   │   │   ├── PreviewGeneratorSettingsElement.cs.meta
│   │   │   │   │   │   │   │   │   ├── PreviewWindowDescriptionElement.cs
│   │   │   │   │   │   │   │   │   └── PreviewWindowDescriptionElement.cs.meta
│   │   │   │   │   │   │   │   ├── Elements.meta
│   │   │   │   │   │   │   │   ├── PreviewGeneratorWindow.cs
│   │   │   │   │   │   │   │   ├── PreviewGeneratorWindow.cs.meta
│   │   │   │   │   │   │   │   ├── Views/
│   │   │   │   │   │   │   │   │   ├── PreviewListView.cs
│   │   │   │   │   │   │   │   │   └── PreviewListView.cs.meta
│   │   │   │   │   │   │   │   └── Views.meta
│   │   │   │   │   │   │   ├── UI.meta
│   │   │   │   │   │   │   ├── Utility/
│   │   │   │   │   │   │   │   ├── GraphicsUtility.cs
│   │   │   │   │   │   │   │   ├── GraphicsUtility.cs.meta
│   │   │   │   │   │   │   │   ├── PreviewConvertUtility.cs
│   │   │   │   │   │   │   │   ├── PreviewConvertUtility.cs.meta
│   │   │   │   │   │   │   │   ├── PreviewSceneUtility.cs
│   │   │   │   │   │   │   │   ├── PreviewSceneUtility.cs.meta
│   │   │   │   │   │   │   │   ├── RenderPipeline.cs
│   │   │   │   │   │   │   │   ├── RenderPipeline.cs.meta
│   │   │   │   │   │   │   │   ├── RenderPipelineUtility.cs
│   │   │   │   │   │   │   │   └── RenderPipelineUtility.cs.meta
│   │   │   │   │   │   │   └── Utility.meta
│   │   │   │   │   │   ├── Scripts.meta
│   │   │   │   │   │   ├── Styles/
│   │   │   │   │   │   │   ├── Style.uss
│   │   │   │   │   │   │   ├── Style.uss.meta
│   │   │   │   │   │   │   ├── ThemeDark.uss
│   │   │   │   │   │   │   ├── ThemeDark.uss.meta
│   │   │   │   │   │   │   ├── ThemeLight.uss
│   │   │   │   │   │   │   └── ThemeLight.uss.meta
│   │   │   │   │   │   └── Styles.meta
│   │   │   │   │   ├── Previews.meta
│   │   │   │   │   ├── Unity.AssetStoreTools.Editor.asmdef
│   │   │   │   │   ├── Unity.AssetStoreTools.Editor.asmdef.meta
│   │   │   │   │   ├── Uploader/
│   │   │   │   │   │   ├── Icons/
│   │   │   │   │   │   │   ├── account-dark.png.meta
│   │   │   │   │   │   │   ├── account-light.png.meta
│   │   │   │   │   │   │   ├── open-in-browser.png.meta
│   │   │   │   │   │   │   ├── publisher-portal-dark.png.meta
│   │   │   │   │   │   │   └── publisher-portal-light.png.meta
│   │   │   │   │   │   ├── Icons.meta
│   │   │   │   │   │   ├── Scripts/
│   │   │   │   │   │   │   ├── Data/
│   │   │   │   │   │   │   │   ├── Abstractions/
│   │   │   │   │   │   │   │   │   ├── IPackage.cs
│   │   │   │   │   │   │   │   │   ├── IPackage.cs.meta
│   │   │   │   │   │   │   │   │   ├── IPackageContent.cs
│   │   │   │   │   │   │   │   │   ├── IPackageContent.cs.meta
│   │   │   │   │   │   │   │   │   ├── IPackageGroup.cs
│   │   │   │   │   │   │   │   │   ├── IPackageGroup.cs.meta
│   │   │   │   │   │   │   │   │   ├── IWorkflow.cs
│   │   │   │   │   │   │   │   │   ├── IWorkflow.cs.meta
│   │   │   │   │   │   │   │   │   ├── IWorkflowServices.cs
│   │   │   │   │   │   │   │   │   ├── IWorkflowServices.cs.meta
│   │   │   │   │   │   │   │   │   ├── WorkflowBase.cs
│   │   │   │   │   │   │   │   │   └── WorkflowBase.cs.meta
│   │   │   │   │   │   │   │   ├── Abstractions.meta
│   │   │   │   │   │   │   │   ├── AssetsWorkflow.cs
│   │   │   │   │   │   │   │   ├── AssetsWorkflow.cs.meta
│   │   │   │   │   │   │   │   ├── HybridPackageWorkflow.cs
│   │   │   │   │   │   │   │   ├── HybridPackageWorkflow.cs.meta
│   │   │   │   │   │   │   │   ├── Package.cs
│   │   │   │   │   │   │   │   ├── Package.cs.meta
│   │   │   │   │   │   │   │   ├── PackageContent.cs
│   │   │   │   │   │   │   │   ├── PackageContent.cs.meta
│   │   │   │   │   │   │   │   ├── PackageGroup.cs
│   │   │   │   │   │   │   │   ├── PackageGroup.cs.meta
│   │   │   │   │   │   │   │   ├── PackageSorting.cs
│   │   │   │   │   │   │   │   ├── PackageSorting.cs.meta
│   │   │   │   │   │   │   │   ├── Serialization/
│   │   │   │   │   │   │   │   │   ├── AssetPath.cs
│   │   │   │   │   │   │   │   │   ├── AssetPath.cs.meta
│   │   │   │   │   │   │   │   │   ├── AssetsWorkflowStateData.cs
│   │   │   │   │   │   │   │   │   ├── AssetsWorkflowStateData.cs.meta
│   │   │   │   │   │   │   │   │   ├── HybridPackageWorkflowState.cs
│   │   │   │   │   │   │   │   │   ├── HybridPackageWorkflowState.cs.meta
│   │   │   │   │   │   │   │   │   ├── UnityPackageWorkflowStateData.cs
│   │   │   │   │   │   │   │   │   ├── UnityPackageWorkflowStateData.cs.meta
│   │   │   │   │   │   │   │   │   ├── WorkflowStateData.cs
│   │   │   │   │   │   │   │   │   └── WorkflowStateData.cs.meta
│   │   │   │   │   │   │   │   ├── Serialization.meta
│   │   │   │   │   │   │   │   ├── UnityPackageWorkflow.cs
│   │   │   │   │   │   │   │   ├── UnityPackageWorkflow.cs.meta
│   │   │   │   │   │   │   │   ├── WorkflowServices.cs
│   │   │   │   │   │   │   │   └── WorkflowServices.cs.meta
│   │   │   │   │   │   │   ├── Data.meta
│   │   │   │   │   │   │   ├── Services/
│   │   │   │   │   │   │   │   ├── Analytics/
│   │   │   │   │   │   │   │   │   ├── AnalyticsService.cs
│   │   │   │   │   │   │   │   │   ├── AnalyticsService.cs.meta
│   │   │   │   │   │   │   │   │   ├── Data/
│   │   │   │   │   │   │   │   │   │   ├── AuthenticationAnalytic.cs
│   │   │   │   │   │   │   │   │   │   ├── AuthenticationAnalytic.cs.meta
│   │   │   │   │   │   │   │   │   │   ├── BaseAnalytic.cs
│   │   │   │   │   │   │   │   │   │   ├── BaseAnalytic.cs.meta
│   │   │   │   │   │   │   │   │   │   ├── IAssetStoreAnalytic.cs
│   │   │   │   │   │   │   │   │   │   ├── IAssetStoreAnalytic.cs.meta
│   │   │   │   │   │   │   │   │   │   ├── IAssetStoreAnalyticData.cs
│   │   │   │   │   │   │   │   │   │   ├── IAssetStoreAnalyticData.cs.meta
│   │   │   │   │   │   │   │   │   │   ├── PackageUploadAnalytic.cs
│   │   │   │   │   │   │   │   │   │   ├── PackageUploadAnalytic.cs.meta
│   │   │   │   │   │   │   │   │   │   ├── ValidationResultsSerializer.cs
│   │   │   │   │   │   │   │   │   │   └── ValidationResultsSerializer.cs.meta
│   │   │   │   │   │   │   │   │   ├── Data.meta
│   │   │   │   │   │   │   │   │   ├── IAnalyticsService.cs
│   │   │   │   │   │   │   │   │   └── IAnalyticsService.cs.meta
│   │   │   │   │   │   │   │   ├── Analytics.meta
│   │   │   │   │   │   │   │   ├── Api/
│   │   │   │   │   │   │   │   │   ├── AuthenticationService.cs
│   │   │   │   │   │   │   │   │   ├── AuthenticationService.cs.meta
│   │   │   │   │   │   │   │   │   ├── IAuthenticationService.cs
│   │   │   │   │   │   │   │   │   ├── IAuthenticationService.cs.meta
│   │   │   │   │   │   │   │   │   ├── IPackageDownloadingService.cs
│   │   │   │   │   │   │   │   │   ├── IPackageDownloadingService.cs.meta
│   │   │   │   │   │   │   │   │   ├── IPackageUploadingService.cs
│   │   │   │   │   │   │   │   │   ├── IPackageUploadingService.cs.meta
│   │   │   │   │   │   │   │   │   ├── PackageDownloadingService.cs
│   │   │   │   │   │   │   │   │   ├── PackageDownloadingService.cs.meta
│   │   │   │   │   │   │   │   │   ├── PackageUploadingService.cs
│   │   │   │   │   │   │   │   │   └── PackageUploadingService.cs.meta
│   │   │   │   │   │   │   │   ├── Api.meta
│   │   │   │   │   │   │   │   ├── Caching/
│   │   │   │   │   │   │   │   │   ├── CachingService.cs
│   │   │   │   │   │   │   │   │   ├── CachingService.cs.meta
│   │   │   │   │   │   │   │   │   ├── ICachingService.cs
│   │   │   │   │   │   │   │   │   └── ICachingService.cs.meta
│   │   │   │   │   │   │   │   ├── Caching.meta
│   │   │   │   │   │   │   │   ├── IUploaderService.cs
│   │   │   │   │   │   │   │   ├── IUploaderService.cs.meta
│   │   │   │   │   │   │   │   ├── PackageFactory/
│   │   │   │   │   │   │   │   │   ├── IPackageFactoryService.cs
│   │   │   │   │   │   │   │   │   ├── IPackageFactoryService.cs.meta
│   │   │   │   │   │   │   │   │   ├── PackageFactoryService.cs
│   │   │   │   │   │   │   │   │   └── PackageFactoryService.cs.meta
│   │   │   │   │   │   │   │   ├── PackageFactory.meta
│   │   │   │   │   │   │   │   ├── UploaderServiceProvider.cs
│   │   │   │   │   │   │   │   └── UploaderServiceProvider.cs.meta
│   │   │   │   │   │   │   ├── Services.meta
│   │   │   │   │   │   │   ├── UI/
│   │   │   │   │   │   │   │   ├── Elements/
│   │   │   │   │   │   │   │   │   ├── Abstractions/
│   │   │   │   │   │   │   │   │   │   ├── ValidationElementBase.cs
│   │   │   │   │   │   │   │   │   │   ├── ValidationElementBase.cs.meta
│   │   │   │   │   │   │   │   │   │   ├── WorkflowElementBase.cs
│   │   │   │   │   │   │   │   │   │   └── WorkflowElementBase.cs.meta
│   │   │   │   │   │   │   │   │   ├── Abstractions.meta
│   │   │   │   │   │   │   │   │   ├── AccountToolbar.cs
│   │   │   │   │   │   │   │   │   ├── AccountToolbar.cs.meta
│   │   │   │   │   │   │   │   │   ├── AssetsWorkflowElement.cs
│   │   │   │   │   │   │   │   │   ├── AssetsWorkflowElement.cs.meta
│   │   │   │   │   │   │   │   │   ├── CurrentProjectValidationElement.cs
│   │   │   │   │   │   │   │   │   ├── CurrentProjectValidationElement.cs.meta
│   │   │   │   │   │   │   │   │   ├── ExternalProjectValidationElement.cs
│   │   │   │   │   │   │   │   │   ├── ExternalProjectValidationElement.cs.meta
│   │   │   │   │   │   │   │   │   ├── HybridPackageWorkflowElement.cs
│   │   │   │   │   │   │   │   │   ├── HybridPackageWorkflowElement.cs.meta
│   │   │   │   │   │   │   │   │   ├── LoadingSpinner.cs
│   │   │   │   │   │   │   │   │   ├── LoadingSpinner.cs.meta
│   │   │   │   │   │   │   │   │   ├── MultiToggleSelectionElement.cs
│   │   │   │   │   │   │   │   │   ├── MultiToggleSelectionElement.cs.meta
│   │   │   │   │   │   │   │   │   ├── PackageContentElement.cs
│   │   │   │   │   │   │   │   │   ├── PackageContentElement.cs.meta
│   │   │   │   │   │   │   │   │   ├── PackageElement.cs
│   │   │   │   │   │   │   │   │   ├── PackageElement.cs.meta
│   │   │   │   │   │   │   │   │   ├── PackageGroupElement.cs
│   │   │   │   │   │   │   │   │   ├── PackageGroupElement.cs.meta
│   │   │   │   │   │   │   │   │   ├── PackageListToolbar.cs
│   │   │   │   │   │   │   │   │   ├── PackageListToolbar.cs.meta
│   │   │   │   │   │   │   │   │   ├── PackageUploadElement.cs
│   │   │   │   │   │   │   │   │   ├── PackageUploadElement.cs.meta
│   │   │   │   │   │   │   │   │   ├── PathSelectionElement.cs
│   │   │   │   │   │   │   │   │   ├── PathSelectionElement.cs.meta
│   │   │   │   │   │   │   │   │   ├── PreviewGenerationElement.cs
│   │   │   │   │   │   │   │   │   ├── PreviewGenerationElement.cs.meta
│   │   │   │   │   │   │   │   │   ├── UnityPackageWorkflowElement.cs
│   │   │   │   │   │   │   │   │   └── UnityPackageWorkflowElement.cs.meta
│   │   │   │   │   │   │   │   ├── Elements.meta
│   │   │   │   │   │   │   │   ├── Views/
│   │   │   │   │   │   │   │   │   ├── LoginView.cs
│   │   │   │   │   │   │   │   │   ├── LoginView.cs.meta
│   │   │   │   │   │   │   │   │   ├── PackageListView.cs
│   │   │   │   │   │   │   │   │   └── PackageListView.cs.meta
│   │   │   │   │   │   │   │   └── Views.meta
│   │   │   │   │   │   │   └── UI.meta
│   │   │   │   │   │   ├── Scripts.meta
│   │   │   │   │   │   ├── Styles/
│   │   │   │   │   │   │   ├── LoginView/
│   │   │   │   │   │   │   │   ├── Style.uss
│   │   │   │   │   │   │   │   ├── Style.uss.meta
│   │   │   │   │   │   │   │   ├── ThemeDark.uss
│   │   │   │   │   │   │   │   ├── ThemeDark.uss.meta
│   │   │   │   │   │   │   │   ├── ThemeLight.uss
│   │   │   │   │   │   │   │   └── ThemeLight.uss.meta
│   │   │   │   │   │   │   ├── LoginView.meta
│   │   │   │   │   │   │   ├── PackageListView/
│   │   │   │   │   │   │   │   ├── Style.uss
│   │   │   │   │   │   │   │   ├── Style.uss.meta
│   │   │   │   │   │   │   │   ├── ThemeDark.uss
│   │   │   │   │   │   │   │   ├── ThemeDark.uss.meta
│   │   │   │   │   │   │   │   ├── ThemeLight.uss
│   │   │   │   │   │   │   │   └── ThemeLight.uss.meta
│   │   │   │   │   │   │   ├── PackageListView.meta
│   │   │   │   │   │   │   ├── Style.uss
│   │   │   │   │   │   │   ├── Style.uss.meta
│   │   │   │   │   │   │   ├── ThemeDark.uss
│   │   │   │   │   │   │   ├── ThemeDark.uss.meta
│   │   │   │   │   │   │   ├── ThemeLight.uss
│   │   │   │   │   │   │   └── ThemeLight.uss.meta
│   │   │   │   │   │   ├── Styles.meta
│   │   │   │   │   │   ├── UploaderWindow.cs
│   │   │   │   │   │   └── UploaderWindow.cs.meta
│   │   │   │   │   ├── Uploader.meta
│   │   │   │   │   ├── Utility/
│   │   │   │   │   │   ├── ASDebug.cs
│   │   │   │   │   │   ├── ASDebug.cs.meta
│   │   │   │   │   │   ├── ASToolsPreferences.cs
│   │   │   │   │   │   ├── ASToolsPreferences.cs.meta
│   │   │   │   │   │   ├── ASToolsUpdater.cs
│   │   │   │   │   │   ├── ASToolsUpdater.cs.meta
│   │   │   │   │   │   ├── CacheUtil.cs
│   │   │   │   │   │   ├── CacheUtil.cs.meta
│   │   │   │   │   │   ├── FileUtility.cs
│   │   │   │   │   │   ├── FileUtility.cs.meta
│   │   │   │   │   │   ├── LegacyToolsRemover.cs
│   │   │   │   │   │   ├── LegacyToolsRemover.cs.meta
│   │   │   │   │   │   ├── PackageUtility.cs
│   │   │   │   │   │   ├── PackageUtility.cs.meta
│   │   │   │   │   │   ├── ServiceProvider.cs
│   │   │   │   │   │   ├── ServiceProvider.cs.meta
│   │   │   │   │   │   ├── StyleSelector.cs
│   │   │   │   │   │   ├── StyleSelector.cs.meta
│   │   │   │   │   │   ├── Styles/
│   │   │   │   │   │   │   ├── Updater/
│   │   │   │   │   │   │   │   ├── Style.uss
│   │   │   │   │   │   │   │   ├── Style.uss.meta
│   │   │   │   │   │   │   │   ├── ThemeDark.uss
│   │   │   │   │   │   │   │   ├── ThemeDark.uss.meta
│   │   │   │   │   │   │   │   ├── ThemeLight.uss
│   │   │   │   │   │   │   │   └── ThemeLight.uss.meta
│   │   │   │   │   │   │   └── Updater.meta
│   │   │   │   │   │   ├── Styles.meta
│   │   │   │   │   │   ├── SymlinkUtil.cs
│   │   │   │   │   │   └── SymlinkUtil.cs.meta
│   │   │   │   │   ├── Utility.meta
│   │   │   │   │   ├── Validator/
│   │   │   │   │   │   ├── Icons/
│   │   │   │   │   │   │   ├── error.png.meta
│   │   │   │   │   │   │   ├── error_d.png.meta
│   │   │   │   │   │   │   ├── success.png.meta
│   │   │   │   │   │   │   ├── success_d.png.meta
│   │   │   │   │   │   │   ├── undefined.png.meta
│   │   │   │   │   │   │   ├── undefined_d.png.meta
│   │   │   │   │   │   │   ├── warning.png.meta
│   │   │   │   │   │   │   └── warning_d.png.meta
│   │   │   │   │   │   ├── Icons.meta
│   │   │   │   │   │   ├── Scripts/
│   │   │   │   │   │   │   ├── Categories/
│   │   │   │   │   │   │   │   ├── CategoryEvaluator.cs
│   │   │   │   │   │   │   │   ├── CategoryEvaluator.cs.meta
│   │   │   │   │   │   │   │   ├── ValidatorCategory.cs
│   │   │   │   │   │   │   │   └── ValidatorCategory.cs.meta
│   │   │   │   │   │   │   ├── Categories.meta
│   │   │   │   │   │   │   ├── CurrentProjectValidator.cs
│   │   │   │   │   │   │   ├── CurrentProjectValidator.cs.meta
│   │   │   │   │   │   │   ├── Data/
│   │   │   │   │   │   │   │   ├── CurrentProjectValidationSettings.cs
│   │   │   │   │   │   │   │   ├── CurrentProjectValidationSettings.cs.meta
│   │   │   │   │   │   │   │   ├── ExternalProjectValidationSettings.cs
│   │   │   │   │   │   │   │   ├── ExternalProjectValidationSettings.cs.meta
│   │   │   │   │   │   │   │   ├── MessageActions/
│   │   │   │   │   │   │   │   │   ├── HighlightObjectAction.cs
│   │   │   │   │   │   │   │   │   ├── HighlightObjectAction.cs.meta
│   │   │   │   │   │   │   │   │   ├── IMessageAction.cs
│   │   │   │   │   │   │   │   │   ├── IMessageAction.cs.meta
│   │   │   │   │   │   │   │   │   ├── OpenAssetAction.cs
│   │   │   │   │   │   │   │   │   └── OpenAssetAction.cs.meta
│   │   │   │   │   │   │   │   ├── MessageActions.meta
│   │   │   │   │   │   │   │   ├── TestResult.cs
│   │   │   │   │   │   │   │   ├── TestResult.cs.meta
│   │   │   │   │   │   │   │   ├── TestResultMessage.cs
│   │   │   │   │   │   │   │   ├── TestResultMessage.cs.meta
│   │   │   │   │   │   │   │   ├── TestResultObject.cs
│   │   │   │   │   │   │   │   ├── TestResultObject.cs.meta
│   │   │   │   │   │   │   │   ├── TestResultStatus.cs
│   │   │   │   │   │   │   │   ├── TestResultStatus.cs.meta
│   │   │   │   │   │   │   │   ├── ValidationResult.cs
│   │   │   │   │   │   │   │   ├── ValidationResult.cs.meta
│   │   │   │   │   │   │   │   ├── ValidationSettings.cs
│   │   │   │   │   │   │   │   ├── ValidationSettings.cs.meta
│   │   │   │   │   │   │   │   ├── ValidationStatus.cs
│   │   │   │   │   │   │   │   ├── ValidationStatus.cs.meta
│   │   │   │   │   │   │   │   ├── ValidationType.cs
│   │   │   │   │   │   │   │   └── ValidationType.cs.meta
│   │   │   │   │   │   │   ├── Data.meta
│   │   │   │   │   │   │   ├── ExternalProjectValidator.cs
│   │   │   │   │   │   │   ├── ExternalProjectValidator.cs.meta
│   │   │   │   │   │   │   ├── IValidator.cs
│   │   │   │   │   │   │   ├── IValidator.cs.meta
│   │   │   │   │   │   │   ├── Services/
│   │   │   │   │   │   │   │   ├── CachingService/
│   │   │   │   │   │   │   │   │   ├── CachingService.cs
│   │   │   │   │   │   │   │   │   ├── CachingService.cs.meta
│   │   │   │   │   │   │   │   │   ├── ICachingService.cs
│   │   │   │   │   │   │   │   │   ├── ICachingService.cs.meta
│   │   │   │   │   │   │   │   │   ├── PreviewDatabaseContractResolver.cs
│   │   │   │   │   │   │   │   │   └── PreviewDatabaseContractResolver.cs.meta
│   │   │   │   │   │   │   │   ├── CachingService.meta
│   │   │   │   │   │   │   │   ├── IValidatorService.cs
│   │   │   │   │   │   │   │   ├── IValidatorService.cs.meta
│   │   │   │   │   │   │   │   ├── Validation/
│   │   │   │   │   │   │   │   │   ├── Abstractions/
│   │   │   │   │   │   │   │   │   │   ├── IAssetUtilityService.cs
│   │   │   │   │   │   │   │   │   │   ├── IAssetUtilityService.cs.meta
│   │   │   │   │   │   │   │   │   │   ├── IFileSignatureUtilityService.cs
│   │   │   │   │   │   │   │   │   │   ├── IFileSignatureUtilityService.cs.meta
│   │   │   │   │   │   │   │   │   │   ├── IMeshUtilityService.cs
│   │   │   │   │   │   │   │   │   │   ├── IMeshUtilityService.cs.meta
│   │   │   │   │   │   │   │   │   │   ├── IModelUtilityService.cs
│   │   │   │   │   │   │   │   │   │   ├── IModelUtilityService.cs.meta
│   │   │   │   │   │   │   │   │   │   ├── ISceneUtilityService.cs
│   │   │   │   │   │   │   │   │   │   ├── ISceneUtilityService.cs.meta
│   │   │   │   │   │   │   │   │   │   ├── IScriptUtilityService.cs
│   │   │   │   │   │   │   │   │   │   └── IScriptUtilityService.cs.meta
│   │   │   │   │   │   │   │   │   ├── Abstractions.meta
│   │   │   │   │   │   │   │   │   ├── AssetUtilityService.cs
│   │   │   │   │   │   │   │   │   ├── AssetUtilityService.cs.meta
│   │   │   │   │   │   │   │   │   ├── Data/
│   │   │   │   │   │   │   │   │   │   ├── ArchiveType.cs
│   │   │   │   │   │   │   │   │   │   ├── ArchiveType.cs.meta
│   │   │   │   │   │   │   │   │   │   ├── AssetEnumerator.cs
│   │   │   │   │   │   │   │   │   │   ├── AssetEnumerator.cs.meta
│   │   │   │   │   │   │   │   │   │   ├── AssetType.cs
│   │   │   │   │   │   │   │   │   │   ├── AssetType.cs.meta
│   │   │   │   │   │   │   │   │   │   ├── LogEntry.cs
│   │   │   │   │   │   │   │   │   │   └── LogEntry.cs.meta
│   │   │   │   │   │   │   │   │   ├── Data.meta
│   │   │   │   │   │   │   │   │   ├── FileSignatureUtilityService.cs
│   │   │   │   │   │   │   │   │   ├── FileSignatureUtilityService.cs.meta
│   │   │   │   │   │   │   │   │   ├── MeshUtilityService.cs
│   │   │   │   │   │   │   │   │   ├── MeshUtilityService.cs.meta
│   │   │   │   │   │   │   │   │   ├── ModelUtilityService.cs
│   │   │   │   │   │   │   │   │   ├── ModelUtilityService.cs.meta
│   │   │   │   │   │   │   │   │   ├── SceneUtilityService.cs
│   │   │   │   │   │   │   │   │   ├── SceneUtilityService.cs.meta
│   │   │   │   │   │   │   │   │   ├── ScriptUtilityService.cs
│   │   │   │   │   │   │   │   │   └── ScriptUtilityService.cs.meta
│   │   │   │   │   │   │   │   ├── Validation.meta
│   │   │   │   │   │   │   │   ├── ValidatorServiceProvider.cs
│   │   │   │   │   │   │   │   └── ValidatorServiceProvider.cs.meta
│   │   │   │   │   │   │   ├── Services.meta
│   │   │   │   │   │   │   ├── Test Definitions/
│   │   │   │   │   │   │   │   ├── AutomatedTest.cs
│   │   │   │   │   │   │   │   ├── AutomatedTest.cs.meta
│   │   │   │   │   │   │   │   ├── GenericTestConfig.cs
│   │   │   │   │   │   │   │   ├── GenericTestConfig.cs.meta
│   │   │   │   │   │   │   │   ├── ITestConfig.cs
│   │   │   │   │   │   │   │   ├── ITestConfig.cs.meta
│   │   │   │   │   │   │   │   ├── ITestScript.cs
│   │   │   │   │   │   │   │   ├── ITestScript.cs.meta
│   │   │   │   │   │   │   │   ├── Scriptable Objects/
│   │   │   │   │   │   │   │   │   ├── AutomatedTestScriptableObject.cs
│   │   │   │   │   │   │   │   │   ├── AutomatedTestScriptableObject.cs.meta
│   │   │   │   │   │   │   │   │   ├── Editor/
│   │   │   │   │   │   │   │   │   │   ├── ValidationTestScriptableObjectInspector.cs
│   │   │   │   │   │   │   │   │   │   └── ValidationTestScriptableObjectInspector.cs.meta
│   │   │   │   │   │   │   │   │   ├── Editor.meta
│   │   │   │   │   │   │   │   │   ├── ValidationTestScriptableObject.cs
│   │   │   │   │   │   │   │   │   └── ValidationTestScriptableObject.cs.meta
│   │   │   │   │   │   │   │   ├── Scriptable Objects.meta
│   │   │   │   │   │   │   │   ├── ValidationTest.cs
│   │   │   │   │   │   │   │   └── ValidationTest.cs.meta
│   │   │   │   │   │   │   ├── Test Definitions.meta
│   │   │   │   │   │   │   ├── Test Methods/
│   │   │   │   │   │   │   │   ├── Generic/
│   │   │   │   │   │   │   │   │   ├── CheckAnimationClips.cs
│   │   │   │   │   │   │   │   │   ├── CheckAnimationClips.cs.meta
│   │   │   │   │   │   │   │   │   ├── CheckAudioClipping.cs
│   │   │   │   │   │   │   │   │   ├── CheckAudioClipping.cs.meta
│   │   │   │   │   │   │   │   │   ├── CheckColliders.cs
│   │   │   │   │   │   │   │   │   ├── CheckColliders.cs.meta
│   │   │   │   │   │   │   │   │   ├── CheckCompressedFiles.cs
│   │   │   │   │   │   │   │   │   ├── CheckCompressedFiles.cs.meta
│   │   │   │   │   │   │   │   │   ├── CheckEmptyPrefabs.cs
│   │   │   │   │   │   │   │   │   ├── CheckEmptyPrefabs.cs.meta
│   │   │   │   │   │   │   │   │   ├── CheckFileMenuNames.cs
│   │   │   │   │   │   │   │   │   ├── CheckFileMenuNames.cs.meta
│   │   │   │   │   │   │   │   │   ├── CheckLODs.cs
│   │   │   │   │   │   │   │   │   ├── CheckLODs.cs.meta
│   │   │   │   │   │   │   │   │   ├── CheckLineEndings.cs
│   │   │   │   │   │   │   │   │   ├── CheckLineEndings.cs.meta
│   │   │   │   │   │   │   │   │   ├── CheckMeshPrefabs.cs
│   │   │   │   │   │   │   │   │   ├── CheckMeshPrefabs.cs.meta
│   │   │   │   │   │   │   │   │   ├── CheckMissingComponentsinAssets.cs
│   │   │   │   │   │   │   │   │   ├── CheckMissingComponentsinAssets.cs.meta
│   │   │   │   │   │   │   │   │   ├── CheckMissingComponentsinScenes.cs
│   │   │   │   │   │   │   │   │   ├── CheckMissingComponentsinScenes.cs.meta
│   │   │   │   │   │   │   │   │   ├── CheckModelImportLogs.cs
│   │   │   │   │   │   │   │   │   ├── CheckModelImportLogs.cs.meta
│   │   │   │   │   │   │   │   │   ├── CheckModelOrientation.cs
│   │   │   │   │   │   │   │   │   ├── CheckModelOrientation.cs.meta
│   │   │   │   │   │   │   │   │   ├── CheckModelTypes.cs
│   │   │   │   │   │   │   │   │   ├── CheckModelTypes.cs.meta
│   │   │   │   │   │   │   │   │   ├── CheckNormalMapTextures.cs
│   │   │   │   │   │   │   │   │   ├── CheckNormalMapTextures.cs.meta
│   │   │   │   │   │   │   │   │   ├── CheckPackageNaming.cs
│   │   │   │   │   │   │   │   │   ├── CheckPackageNaming.cs.meta
│   │   │   │   │   │   │   │   │   ├── CheckParticleSystems.cs
│   │   │   │   │   │   │   │   │   ├── CheckParticleSystems.cs.meta
│   │   │   │   │   │   │   │   │   ├── CheckPathLengths.cs
│   │   │   │   │   │   │   │   │   ├── CheckPathLengths.cs.meta
│   │   │   │   │   │   │   │   │   ├── CheckPrefabTransforms.cs
│   │   │   │   │   │   │   │   │   ├── CheckPrefabTransforms.cs.meta
│   │   │   │   │   │   │   │   │   ├── CheckScriptCompilation.cs
│   │   │   │   │   │   │   │   │   ├── CheckScriptCompilation.cs.meta
│   │   │   │   │   │   │   │   │   ├── CheckShaderCompilation.cs
│   │   │   │   │   │   │   │   │   ├── CheckShaderCompilation.cs.meta
│   │   │   │   │   │   │   │   │   ├── CheckTextureDimensions.cs
│   │   │   │   │   │   │   │   │   ├── CheckTextureDimensions.cs.meta
│   │   │   │   │   │   │   │   │   ├── CheckTypeNamespaces.cs
│   │   │   │   │   │   │   │   │   ├── CheckTypeNamespaces.cs.meta
│   │   │   │   │   │   │   │   │   ├── RemoveExecutableFiles.cs
│   │   │   │   │   │   │   │   │   ├── RemoveExecutableFiles.cs.meta
│   │   │   │   │   │   │   │   │   ├── RemoveJPGFiles.cs
│   │   │   │   │   │   │   │   │   ├── RemoveJPGFiles.cs.meta
│   │   │   │   │   │   │   │   │   ├── RemoveJavaScriptFiles.cs
│   │   │   │   │   │   │   │   │   ├── RemoveJavaScriptFiles.cs.meta
│   │   │   │   │   │   │   │   │   ├── RemoveLossyAudioFiles.cs
│   │   │   │   │   │   │   │   │   ├── RemoveLossyAudioFiles.cs.meta
│   │   │   │   │   │   │   │   │   ├── RemoveMixamoFiles.cs
│   │   │   │   │   │   │   │   │   ├── RemoveMixamoFiles.cs.meta
│   │   │   │   │   │   │   │   │   ├── RemoveSpeedTreeFiles.cs
│   │   │   │   │   │   │   │   │   ├── RemoveSpeedTreeFiles.cs.meta
│   │   │   │   │   │   │   │   │   ├── RemoveVideoFiles.cs
│   │   │   │   │   │   │   │   │   └── RemoveVideoFiles.cs.meta
│   │   │   │   │   │   │   │   ├── Generic.meta
│   │   │   │   │   │   │   │   ├── UnityPackage/
│   │   │   │   │   │   │   │   │   ├── CheckDemoScenes.cs
│   │   │   │   │   │   │   │   │   ├── CheckDemoScenes.cs.meta
│   │   │   │   │   │   │   │   │   ├── CheckDocumentation.cs
│   │   │   │   │   │   │   │   │   ├── CheckDocumentation.cs.meta
│   │   │   │   │   │   │   │   │   ├── CheckPackageSize.cs
│   │   │   │   │   │   │   │   │   ├── CheckPackageSize.cs.meta
│   │   │   │   │   │   │   │   │   ├── CheckProjectTemplateAssets.cs
│   │   │   │   │   │   │   │   │   └── CheckProjectTemplateAssets.cs.meta
│   │   │   │   │   │   │   │   └── UnityPackage.meta
│   │   │   │   │   │   │   ├── Test Methods.meta
│   │   │   │   │   │   │   ├── UI/
│   │   │   │   │   │   │   │   ├── Data/
│   │   │   │   │   │   │   │   │   ├── Abstractions/
│   │   │   │   │   │   │   │   │   │   ├── IValidatorResults.cs
│   │   │   │   │   │   │   │   │   │   ├── IValidatorResults.cs.meta
│   │   │   │   │   │   │   │   │   │   ├── IValidatorSettings.cs
│   │   │   │   │   │   │   │   │   │   ├── IValidatorSettings.cs.meta
│   │   │   │   │   │   │   │   │   │   ├── IValidatorTest.cs
│   │   │   │   │   │   │   │   │   │   ├── IValidatorTest.cs.meta
│   │   │   │   │   │   │   │   │   │   ├── IValidatorTestGroup.cs
│   │   │   │   │   │   │   │   │   │   └── IValidatorTestGroup.cs.meta
│   │   │   │   │   │   │   │   │   ├── Abstractions.meta
│   │   │   │   │   │   │   │   │   ├── Serialization/
│   │   │   │   │   │   │   │   │   │   ├── ValidatorStateData.cs
│   │   │   │   │   │   │   │   │   │   ├── ValidatorStateData.cs.meta
│   │   │   │   │   │   │   │   │   │   ├── ValidatorStateDataContractResolver.cs
│   │   │   │   │   │   │   │   │   │   ├── ValidatorStateDataContractResolver.cs.meta
│   │   │   │   │   │   │   │   │   │   ├── ValidatorStateResults.cs
│   │   │   │   │   │   │   │   │   │   ├── ValidatorStateResults.cs.meta
│   │   │   │   │   │   │   │   │   │   ├── ValidatorStateSettings.cs
│   │   │   │   │   │   │   │   │   │   └── ValidatorStateSettings.cs.meta
│   │   │   │   │   │   │   │   │   ├── Serialization.meta
│   │   │   │   │   │   │   │   │   ├── ValidatorResults.cs
│   │   │   │   │   │   │   │   │   ├── ValidatorResults.cs.meta
│   │   │   │   │   │   │   │   │   ├── ValidatorSettings.cs
│   │   │   │   │   │   │   │   │   ├── ValidatorSettings.cs.meta
│   │   │   │   │   │   │   │   │   ├── ValidatorTest.cs
│   │   │   │   │   │   │   │   │   ├── ValidatorTest.cs.meta
│   │   │   │   │   │   │   │   │   ├── ValidatorTestGroup.cs
│   │   │   │   │   │   │   │   │   └── ValidatorTestGroup.cs.meta
│   │   │   │   │   │   │   │   ├── Data.meta
│   │   │   │   │   │   │   │   ├── Elements/
│   │   │   │   │   │   │   │   │   ├── ValidatorButtonElement.cs
│   │   │   │   │   │   │   │   │   ├── ValidatorButtonElement.cs.meta
│   │   │   │   │   │   │   │   │   ├── ValidatorDescriptionElement.cs
│   │   │   │   │   │   │   │   │   ├── ValidatorDescriptionElement.cs.meta
│   │   │   │   │   │   │   │   │   ├── ValidatorPathsElement.cs
│   │   │   │   │   │   │   │   │   ├── ValidatorPathsElement.cs.meta
│   │   │   │   │   │   │   │   │   ├── ValidatorResultsElement.cs
│   │   │   │   │   │   │   │   │   ├── ValidatorResultsElement.cs.meta
│   │   │   │   │   │   │   │   │   ├── ValidatorSettingsElement.cs
│   │   │   │   │   │   │   │   │   ├── ValidatorSettingsElement.cs.meta
│   │   │   │   │   │   │   │   │   ├── ValidatorTestElement.cs
│   │   │   │   │   │   │   │   │   ├── ValidatorTestElement.cs.meta
│   │   │   │   │   │   │   │   │   ├── ValidatorTestGroupElement.cs
│   │   │   │   │   │   │   │   │   └── ValidatorTestGroupElement.cs.meta
│   │   │   │   │   │   │   │   ├── Elements.meta
│   │   │   │   │   │   │   │   ├── ValidatorWindow.cs
│   │   │   │   │   │   │   │   ├── ValidatorWindow.cs.meta
│   │   │   │   │   │   │   │   ├── Views/
│   │   │   │   │   │   │   │   │   ├── ValidatorTestsView.cs
│   │   │   │   │   │   │   │   │   └── ValidatorTestsView.cs.meta
│   │   │   │   │   │   │   │   └── Views.meta
│   │   │   │   │   │   │   ├── UI.meta
│   │   │   │   │   │   │   ├── Utility/
│   │   │   │   │   │   │   │   ├── ValidatorUtility.cs
│   │   │   │   │   │   │   │   └── ValidatorUtility.cs.meta
│   │   │   │   │   │   │   ├── Utility.meta
│   │   │   │   │   │   │   ├── ValidatorBase.cs
│   │   │   │   │   │   │   └── ValidatorBase.cs.meta
│   │   │   │   │   │   ├── Scripts.meta
│   │   │   │   │   │   ├── Styles/
│   │   │   │   │   │   │   ├── Style.uss
│   │   │   │   │   │   │   ├── Style.uss.meta
│   │   │   │   │   │   │   ├── ThemeDark.uss
│   │   │   │   │   │   │   ├── ThemeDark.uss.meta
│   │   │   │   │   │   │   ├── ThemeLight.uss
│   │   │   │   │   │   │   └── ThemeLight.uss.meta
│   │   │   │   │   │   ├── Styles.meta
│   │   │   │   │   │   ├── Tests/
│   │   │   │   │   │   │   ├── Generic/
│   │   │   │   │   │   │   │   ├── Check Animation Clips.asset.meta
│   │   │   │   │   │   │   │   ├── Check Audio Clipping.asset.meta
│   │   │   │   │   │   │   │   ├── Check Colliders.asset.meta
│   │   │   │   │   │   │   │   ├── Check Compressed Files.asset.meta
│   │   │   │   │   │   │   │   ├── Check Empty Prefabs.asset.meta
│   │   │   │   │   │   │   │   ├── Check File Menu Names.asset.meta
│   │   │   │   │   │   │   │   ├── Check LODs.asset.meta
│   │   │   │   │   │   │   │   ├── Check Line Endings.asset.meta
│   │   │   │   │   │   │   │   ├── Check Mesh Prefabs.asset.meta
│   │   │   │   │   │   │   │   ├── Check Missing Components in Assets.asset.meta
│   │   │   │   │   │   │   │   ├── Check Missing Components in Scenes.asset.meta
│   │   │   │   │   │   │   │   ├── Check Model Import Logs.asset.meta
│   │   │   │   │   │   │   │   ├── Check Model Orientation.asset.meta
│   │   │   │   │   │   │   │   ├── Check Model Types.asset.meta
│   │   │   │   │   │   │   │   ├── Check Normal Map Textures.asset.meta
│   │   │   │   │   │   │   │   ├── Check Package Naming.asset.meta
│   │   │   │   │   │   │   │   ├── Check Particle Systems.asset.meta
│   │   │   │   │   │   │   │   ├── Check Path Lengths.asset.meta
│   │   │   │   │   │   │   │   ├── Check Prefab Transforms.asset.meta
│   │   │   │   │   │   │   │   ├── Check Script Compilation.asset.meta
│   │   │   │   │   │   │   │   ├── Check Shader Compilation.asset.meta
│   │   │   │   │   │   │   │   ├── Check Texture Dimensions.asset.meta
│   │   │   │   │   │   │   │   ├── Check Type Namespaces.asset.meta
│   │   │   │   │   │   │   │   ├── Remove Executable Files.asset.meta
│   │   │   │   │   │   │   │   ├── Remove JPG Files.asset.meta
│   │   │   │   │   │   │   │   ├── Remove JavaScript Files.asset.meta
│   │   │   │   │   │   │   │   ├── Remove Lossy Audio Files.asset.meta
│   │   │   │   │   │   │   │   ├── Remove Mixamo Files.asset.meta
│   │   │   │   │   │   │   │   ├── Remove SpeedTree Files.asset.meta
│   │   │   │   │   │   │   │   └── Remove Video Files.asset.meta
│   │   │   │   │   │   │   ├── Generic.meta
│   │   │   │   │   │   │   ├── UnityPackage/
│   │   │   │   │   │   │   │   ├── Check Demo Scenes.asset.meta
│   │   │   │   │   │   │   │   ├── Check Documentation.asset.meta
│   │   │   │   │   │   │   │   ├── Check Package Size.asset.meta
│   │   │   │   │   │   │   │   └── Check Project Template Assets.asset.meta
│   │   │   │   │   │   │   └── UnityPackage.meta
│   │   │   │   │   │   └── Tests.meta
│   │   │   │   │   └── Validator.meta
│   │   │   │   ├── Editor.meta
│   │   │   │   ├── LICENSE.md
│   │   │   │   ├── LICENSE.md.meta
│   │   │   │   ├── package.json
│   │   │   │   └── package.json.meta
│   │   │   ├── manifest.json
│   │   │   └── packages-lock.json
│   │   └── ProjectSettings/
│   │       ├── BurstAotSettings_StandaloneWindows.json
│   │       ├── CommonBurstAotSettings.json
│   │       ├── ProjectVersion.txt
│   │       └── SceneTemplateSettings.json
│   └── UnityMCPTests/
│       ├── .gitignore
│       ├── Assets/
│       │   ├── Packages.meta
│       │   ├── Scenes/
│       │   │   ├── SampleScene.unity
│       │   │   ├── SampleScene.unity.meta
│       │   │   ├── Test.unity/
│       │   │   │   ├── Test.unity
│       │   │   │   └── Test.unity.meta
│       │   │   └── Test.unity.meta
│       │   ├── Scenes.meta
│       │   ├── Scripts/
│       │   │   ├── Bouncer.cs
│       │   │   ├── Bouncer.cs.meta
│       │   │   ├── Hello.cs
│       │   │   ├── Hello.cs.meta
│       │   │   ├── LongUnityScriptClaudeTest.cs
│       │   │   ├── LongUnityScriptClaudeTest.cs.meta
│       │   │   ├── TestAsmdef/
│       │   │   │   ├── CustomComponent.cs
│       │   │   │   ├── CustomComponent.cs.meta
│       │   │   │   ├── TestAsmdef.asmdef
│       │   │   │   ├── TestAsmdef.asmdef.meta
│       │   │   │   ├── UnityEventTestComponent.cs
│       │   │   │   └── UnityEventTestComponent.cs.meta
│       │   │   └── TestAsmdef.meta
│       │   ├── Scripts.meta
│       │   ├── Temp.meta
│       │   ├── TestMat.mat
│       │   ├── TestMat.mat.meta
│       │   ├── Tests/
│       │   │   ├── EditMode/
│       │   │   │   ├── Helpers/
│       │   │   │   │   ├── AssetPathUtilityOfflineTests.cs
│       │   │   │   │   ├── AssetPathUtilityOfflineTests.cs.meta
│       │   │   │   │   ├── CodexConfigHelperTests.cs
│       │   │   │   │   ├── CodexConfigHelperTests.cs.meta
│       │   │   │   │   ├── Matrix4x4ConverterTests.cs
│       │   │   │   │   ├── Matrix4x4ConverterTests.cs.meta
│       │   │   │   │   ├── PaginationTests.cs
│       │   │   │   │   ├── PaginationTests.cs.meta
│       │   │   │   │   ├── ToolParamsTests.cs
│       │   │   │   │   ├── ToolParamsTests.cs.meta
│       │   │   │   │   ├── WriteToConfigTests.cs
│       │   │   │   │   └── WriteToConfigTests.cs.meta
│       │   │   │   ├── Helpers.meta
│       │   │   │   ├── MCPForUnityTests.Editor.asmdef
│       │   │   │   ├── MCPForUnityTests.Editor.asmdef.meta
│       │   │   │   ├── Resources/
│       │   │   │   │   ├── GetMenuItemsTests.cs
│       │   │   │   │   └── GetMenuItemsTests.cs.meta
│       │   │   │   ├── Resources.meta
│       │   │   │   ├── Services/
│       │   │   │   │   ├── Characterization/
│       │   │   │   │   │   ├── ServerManagementServiceCharacterizationTests.cs
│       │   │   │   │   │   ├── ServerManagementServiceCharacterizationTests.cs.meta
│       │   │   │   │   │   ├── Services_Characterization.cs
│       │   │   │   │   │   └── Services_Characterization.cs.meta
│       │   │   │   │   ├── Characterization.meta
│       │   │   │   │   ├── EditorConfigurationCacheTests.cs
│       │   │   │   │   ├── EditorConfigurationCacheTests.cs.meta
│       │   │   │   │   ├── PackageUpdateServiceTests.cs
│       │   │   │   │   ├── PackageUpdateServiceTests.cs.meta
│       │   │   │   │   ├── PortManagerTests.cs
│       │   │   │   │   ├── PortManagerTests.cs.meta
│       │   │   │   │   ├── Server/
│       │   │   │   │   │   ├── PidFileManagerTests.cs
│       │   │   │   │   │   ├── PidFileManagerTests.cs.meta
│       │   │   │   │   │   ├── ProcessDetectorTests.cs
│       │   │   │   │   │   ├── ProcessDetectorTests.cs.meta
│       │   │   │   │   │   ├── ProcessTerminatorTests.cs
│       │   │   │   │   │   ├── ProcessTerminatorTests.cs.meta
│       │   │   │   │   │   ├── ServerCommandBuilderTests.cs
│       │   │   │   │   │   ├── ServerCommandBuilderTests.cs.meta
│       │   │   │   │   │   ├── TerminalLauncherTests.cs
│       │   │   │   │   │   └── TerminalLauncherTests.cs.meta
│       │   │   │   │   ├── Server.meta
│       │   │   │   │   ├── StdioBridgeReconnectTests.cs
│       │   │   │   │   ├── StdioBridgeReconnectTests.cs.meta
│       │   │   │   │   ├── ToolDiscoveryServiceTests.cs
│       │   │   │   │   ├── ToolDiscoveryServiceTests.cs.meta
│       │   │   │   │   ├── WebSocketTransportClientTests.cs
│       │   │   │   │   └── WebSocketTransportClientTests.cs.meta
│       │   │   │   ├── Services.meta
│       │   │   │   ├── TestUtilities.cs
│       │   │   │   ├── TestUtilities.cs.meta
│       │   │   │   ├── Tools/
│       │   │   │   │   ├── AIPropertyMatchingTests.cs
│       │   │   │   │   ├── AIPropertyMatchingTests.cs.meta
│       │   │   │   │   ├── BatchExecuteKeyPreservationTests.cs
│       │   │   │   │   ├── BatchExecuteKeyPreservationTests.cs.meta
│       │   │   │   │   ├── Characterization/
│       │   │   │   │   │   ├── EditorTools_Characterization.cs
│       │   │   │   │   │   └── EditorTools_Characterization.cs.meta
│       │   │   │   │   ├── Characterization.meta
│       │   │   │   │   ├── CommandRegistryTests.cs
│       │   │   │   │   ├── CommandRegistryTests.cs.meta
│       │   │   │   │   ├── ComponentOpsUnityEventTests.cs
│       │   │   │   │   ├── ComponentOpsUnityEventTests.cs.meta
│       │   │   │   │   ├── ComponentResolverTests.cs
│       │   │   │   │   ├── ComponentResolverTests.cs.meta
│       │   │   │   │   ├── DomainReloadResilienceTests.cs
│       │   │   │   │   ├── DomainReloadResilienceTests.cs.meta
│       │   │   │   │   ├── ExecuteMenuItemTests.cs
│       │   │   │   │   ├── ExecuteMenuItemTests.cs.meta
│       │   │   │   │   ├── Fixtures/
│       │   │   │   │   │   ├── ManageScriptableObjectTestDefinition.cs
│       │   │   │   │   │   ├── ManageScriptableObjectTestDefinition.cs.meta
│       │   │   │   │   │   ├── ManageScriptableObjectTestDefinitionBase.cs
│       │   │   │   │   │   ├── ManageScriptableObjectTestDefinitionBase.cs.meta
│       │   │   │   │   │   ├── StressTestSOs/
│       │   │   │   │   │   │   ├── ArrayStressSO.cs
│       │   │   │   │   │   │   ├── ArrayStressSO.cs.meta
│       │   │   │   │   │   │   ├── ComplexStressSO.cs
│       │   │   │   │   │   │   ├── ComplexStressSO.cs.meta
│       │   │   │   │   │   │   ├── DeepStressSO.cs
│       │   │   │   │   │   │   └── DeepStressSO.cs.meta
│       │   │   │   │   │   └── StressTestSOs.meta
│       │   │   │   │   ├── Fixtures.meta
│       │   │   │   │   ├── GameObjectAPIStressTests.cs
│       │   │   │   │   ├── GameObjectAPIStressTests.cs.meta
│       │   │   │   │   ├── GameObjectComponentHelpersErrorTests.cs
│       │   │   │   │   ├── GameObjectComponentHelpersErrorTests.cs.meta
│       │   │   │   │   ├── MCPToolParameterTests.cs
│       │   │   │   │   ├── MCPToolParameterTests.cs.meta
│       │   │   │   │   ├── ManageAnimationTests.cs
│       │   │   │   │   ├── ManageAnimationTests.cs.meta
│       │   │   │   │   ├── ManageGameObjectCreateTests.cs
│       │   │   │   │   ├── ManageGameObjectCreateTests.cs.meta
│       │   │   │   │   ├── ManageGameObjectDeleteTests.cs
│       │   │   │   │   ├── ManageGameObjectDeleteTests.cs.meta
│       │   │   │   │   ├── ManageGameObjectModifyTests.cs
│       │   │   │   │   ├── ManageGameObjectModifyTests.cs.meta
│       │   │   │   │   ├── ManageGameObjectTests.cs
│       │   │   │   │   ├── ManageGameObjectTests.cs.meta
│       │   │   │   │   ├── ManageGraphicsTests.cs
│       │   │   │   │   ├── ManageMaterialPropertiesTests.cs
│       │   │   │   │   ├── ManageMaterialPropertiesTests.cs.meta
│       │   │   │   │   ├── ManageMaterialReproTests.cs
│       │   │   │   │   ├── ManageMaterialReproTests.cs.meta
│       │   │   │   │   ├── ManageMaterialStressTests.cs
│       │   │   │   │   ├── ManageMaterialStressTests.cs.meta
│       │   │   │   │   ├── ManageMaterialTests.cs
│       │   │   │   │   ├── ManageMaterialTests.cs.meta
│       │   │   │   │   ├── ManagePrefabsCrudTests.cs
│       │   │   │   │   ├── ManagePrefabsCrudTests.cs.meta
│       │   │   │   │   ├── ManageProBuilderTests.cs
│       │   │   │   │   ├── ManageProBuilderTests.cs.meta
│       │   │   │   │   ├── ManageSceneHierarchyPagingTests.cs
│       │   │   │   │   ├── ManageSceneHierarchyPagingTests.cs.meta
│       │   │   │   │   ├── ManageScriptDelimiterTests.cs
│       │   │   │   │   ├── ManageScriptDelimiterTests.cs.meta
│       │   │   │   │   ├── ManageScriptValidationTests.cs
│       │   │   │   │   ├── ManageScriptValidationTests.cs.meta
│       │   │   │   │   ├── ManageScriptableObjectStressTests.cs
│       │   │   │   │   ├── ManageScriptableObjectStressTests.cs.meta
│       │   │   │   │   ├── ManageScriptableObjectTests.cs
│       │   │   │   │   ├── ManageScriptableObjectTests.cs.meta
│       │   │   │   │   ├── ManageUITests.cs
│       │   │   │   │   ├── ManageUITests.cs.meta
│       │   │   │   │   ├── MaterialDirectPropertiesTests.cs
│       │   │   │   │   ├── MaterialDirectPropertiesTests.cs.meta
│       │   │   │   │   ├── MaterialMeshInstantiationTests.cs
│       │   │   │   │   ├── MaterialMeshInstantiationTests.cs.meta
│       │   │   │   │   ├── MaterialParameterToolTests.cs
│       │   │   │   │   ├── MaterialParameterToolTests.cs.meta
│       │   │   │   │   ├── PropertyConversionErrorHandlingTests.cs
│       │   │   │   │   ├── PropertyConversionErrorHandlingTests.cs.meta
│       │   │   │   │   ├── PropertyConversion_ArrayForFloat_Test.cs
│       │   │   │   │   ├── PropertyConversion_ArrayForFloat_Test.cs.meta
│       │   │   │   │   ├── ReadConsoleTests.cs
│       │   │   │   │   ├── ReadConsoleTests.cs.meta
│       │   │   │   │   ├── RunTestsTests.cs
│       │   │   │   │   ├── RunTestsTests.cs.meta
│       │   │   │   │   ├── UIDocumentSerializationTests.cs
│       │   │   │   │   ├── UIDocumentSerializationTests.cs.meta
│       │   │   │   │   ├── UnityReflectTests.cs
│       │   │   │   │   └── UnityReflectTests.cs.meta
│       │   │   │   ├── Tools.meta
│       │   │   │   ├── Windows/
│       │   │   │   │   ├── Characterization/
│       │   │   │   │   │   ├── Windows_Characterization.cs
│       │   │   │   │   │   └── Windows_Characterization.cs.meta
│       │   │   │   │   └── Characterization.meta
│       │   │   │   └── Windows.meta
│       │   │   ├── EditMode.meta
│       │   │   ├── Editor.meta
│       │   │   ├── PlayMode/
│       │   │   │   ├── MCPForUnityTests.PlayMode.asmdef
│       │   │   │   ├── MCPForUnityTests.PlayMode.asmdef.meta
│       │   │   │   ├── PlayModeBasicTests.cs
│       │   │   │   └── PlayModeBasicTests.cs.meta
│       │   │   └── PlayMode.meta
│       │   ├── Tests.meta
│       │   ├── UI Toolkit/
│       │   │   ├── UnityThemes/
│       │   │   │   ├── UnityDefaultRuntimeTheme.tss
│       │   │   │   └── UnityDefaultRuntimeTheme.tss.meta
│       │   │   └── UnityThemes.meta
│       │   └── UI Toolkit.meta
│       ├── Packages/
│       │   └── manifest.json
│       └── ProjectSettings/
│           ├── Packages/
│           │   └── com.unity.testtools.codecoverage/
│           │       └── Settings.json
│           ├── ProjectVersion.txt
│           └── SceneTemplateSettings.json
├── docker-compose.yml
├── docs/
│   ├── development/
│   │   ├── README-DEV-zh.md
│   │   └── README-DEV.md
│   ├── feature-roadmap-2026.md
│   ├── guides/
│   │   ├── CLI_EXAMPLE.md
│   │   ├── CLI_USAGE.md
│   │   ├── CURSOR_HELP.md
│   │   ├── MCP_CLIENT_CONFIGURATORS.md
│   │   ├── RELEASING.md
│   │   └── REMOTE_SERVER_AUTH.md
│   ├── i18n/
│   │   └── README-zh.md
│   ├── migrations/
│   │   ├── v5_MIGRATION.md
│   │   ├── v6_NEW_UI_CHANGES.md
│   │   └── v8_NEW_NETWORKING_SETUP.md
│   └── reference/
│       ├── CUSTOM_TOOLS.md
│       ├── REMOTE_SERVER_AUTH_ARCHITECTURE.md
│       └── TELEMETRY.md
├── manifest.json
├── mcp_source.py
├── scripts/
│   └── validate-nlt-coverage.sh
├── tools/
│   ├── UPDATE_DOCS_PROMPT.md
│   ├── docker_publish.sh
│   ├── generate_mcpb.py
│   ├── prepare_unity_asset_store_release.py
│   ├── pypi_publish.sh
│   ├── stress_editor_state.py
│   ├── stress_mcp.py
│   ├── tests/
│   │   ├── __init__.py
│   │   └── test_build_release_characterization.py
│   ├── update_fork.bat
│   ├── update_fork.sh
│   └── update_versions.py
└── unity-mcp-skill/
    ├── SKILL.md
    └── references/
        ├── probuilder-guide.md
        ├── resources-reference.md
        ├── tools-reference.md
        └── workflows.md
Download .txt
Showing preview only (752K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (7715 symbols across 759 files)

FILE: .github/scripts/mark_skipped.py
  function should_skip (line 33) | def should_skip(msg: str) -> bool:
  function summarize_counts (line 43) | def summarize_counts(ts: ET.Element):
  function main (line 59) | def main(path: str) -> int:

FILE: CustomTools/RoslynRuntimeCompilation/ManageRuntimeCompilation.cs
  class ManageRuntimeCompilation (line 24) | [McpForUnityTool(
    class LoadedAssemblyInfo (line 32) | private class LoadedAssemblyInfo
    method HandleCommand (line 41) | public static object HandleCommand(JObject @params)
    method CompileAndLoad (line 78) | private static object CompileAndLoad(JObject @params)
    method ListLoadedAssemblies (line 233) | private static object ListLoadedAssemblies()
    method GetAssemblyTypes (line 251) | private static object GetAssemblyTypes(JObject @params)
    method ExecuteWithRoslyn (line 288) | private static object ExecuteWithRoslyn(JObject @params)
    method GetCompilationHistory (line 364) | private static object GetCompilationHistory()
    method SaveCompilationHistory (line 399) | private static object SaveCompilationHistory()
    method ClearCompilationHistory (line 427) | private static object ClearCompilationHistory()
    method GetDefaultReferences (line 444) | private static List<MetadataReference> GetDefaultReferences()
    method FindGameObjectByPath (line 480) | private static GameObject FindGameObjectByPath(string path)
    method GetOrCreateRoslynCompiler (line 510) | private static RoslynRuntimeCompiler GetOrCreateRoslynCompiler()

FILE: CustomTools/RoslynRuntimeCompilation/RoslynRuntimeCompiler.cs
  class RoslynRuntimeCompiler (line 44) | public class RoslynRuntimeCompiler : MonoBehaviour
    class CompilationHistoryEntry (line 82) | [System.Serializable]
    method CompileInMemory (line 100) | public bool CompileInMemory(out string diagnostics)
    method InvokeEntry (line 204) | public bool InvokeEntry(GameObject host, out string runtimeError)
    method AttachMonoBehaviour (line 276) | public bool AttachMonoBehaviour(GameObject host, out string runtimeError)
    method InvokeCoroutine (line 328) | public bool InvokeCoroutine(MonoBehaviour host, out string runtimeError)
    method CompileAndExecute (line 394) | public bool CompileAndExecute(
    method CompileAndExecute (line 499) | public bool CompileAndExecute(string sourceCode, string typeName, Game...
    method CompileAndAttachToSelf (line 509) | public bool CompileAndAttachToSelf(string sourceCode, string typeName,...
    method CompileAndRunOnSelf (line 515) | public void CompileAndRunOnSelf()
    method AddHistoryEntry (line 568) | private void AddHistoryEntry(string sourceCode, string typeName, strin...
    method SaveHistoryToFile (line 595) | public bool SaveHistoryToFile(out string savedPath, out string error)
    method SaveHistoryEntryAsScript (line 631) | public bool SaveHistoryEntryAsScript(int index, out string savedPath, ...
    method ClearHistory (line 676) | public void ClearHistory()
    class HistoryWrapper (line 682) | [System.Serializable]
  class RoslynMCPHelper (line 692) | public static class RoslynMCPHelper
    method GetOrCreateCompiler (line 699) | private static RoslynRuntimeCompiler GetOrCreateCompiler()
    method CompileAndAttach (line 729) | public static bool CompileAndAttach(string sourceCode, string classNam...
    method CompileAndExecuteStatic (line 786) | public static bool CompileAndExecuteStatic(string sourceCode, string c...
    method QuickAttachScript (line 832) | public static string QuickAttachScript(string sourceCode, string class...
    method ExecuteCode (line 841) | public static string ExecuteCode(string sourceCode, string className =...
  class RoslynRuntimeCompilerWindow (line 850) | public class RoslynRuntimeCompilerWindow : EditorWindow
    method ShowWindow (line 868) | [MenuItem("Window/Roslyn Runtime Compiler")]
    method OnEnable (line 875) | void OnEnable()
    method OnDisable (line 897) | void OnDisable()
    method OnDestroy (line 910) | void OnDestroy()
    method OnGUI (line 920) | void OnGUI()
    method DrawCompilerTab (line 970) | void DrawCompilerTab()
    method DrawHistoryTab (line 1058) | void DrawHistoryTab()
    method ApplyToHelper (line 1195) | void ApplyToHelper()

FILE: MCPForUnity/Editor/Clients/Configurators/AntigravityConfigurator.cs
  class AntigravityConfigurator (line 10) | public class AntigravityConfigurator : JsonFileMcpConfigurator
    method AntigravityConfigurator (line 12) | public AntigravityConfigurator() : base(new McpClient
    method GetInstallationSteps (line 24) | public override IList<string> GetInstallationSteps() => new List<string>

FILE: MCPForUnity/Editor/Clients/Configurators/CherryStudioConfigurator.cs
  class CherryStudioConfigurator (line 11) | public class CherryStudioConfigurator : JsonFileMcpConfigurator
    method CherryStudioConfigurator (line 15) | public CherryStudioConfigurator() : base(new McpClient
    method GetInstallationSteps (line 27) | public override IList<string> GetInstallationSteps() => new List<string>
    method CheckStatus (line 43) | public override McpStatus CheckStatus(bool attemptAutoRewrite = true)
    method Configure (line 49) | public override void Configure()
    method GetManualSnippet (line 57) | public override string GetManualSnippet()

FILE: MCPForUnity/Editor/Clients/Configurators/ClaudeCodeConfigurator.cs
  class ClaudeCodeConfigurator (line 12) | public class ClaudeCodeConfigurator : ClaudeCliMcpConfigurator
    method ClaudeCodeConfigurator (line 14) | public ClaudeCodeConfigurator() : base(new McpClient
    method GetSkillInstallPath (line 23) | public override string GetSkillInstallPath()
    method GetInstallationSteps (line 29) | public override IList<string> GetInstallationSteps() => new List<string>

FILE: MCPForUnity/Editor/Clients/Configurators/ClaudeDesktopConfigurator.cs
  class ClaudeDesktopConfigurator (line 11) | public class ClaudeDesktopConfigurator : JsonFileMcpConfigurator
    method ClaudeDesktopConfigurator (line 15) | public ClaudeDesktopConfigurator() : base(new McpClient
    method GetSkillInstallPath (line 28) | public override string GetSkillInstallPath()
    method GetInstallationSteps (line 34) | public override IList<string> GetInstallationSteps() => new List<string>
    method Configure (line 42) | public override void Configure()
    method GetManualSnippet (line 53) | public override string GetManualSnippet()

FILE: MCPForUnity/Editor/Clients/Configurators/ClineConfigurator.cs
  class ClineConfigurator (line 8) | public class ClineConfigurator : JsonFileMcpConfigurator
    method ClineConfigurator (line 10) | public ClineConfigurator() : base(new McpClient
    method GetInstallationSteps (line 20) | public override IList<string> GetInstallationSteps() => new List<string>

FILE: MCPForUnity/Editor/Clients/Configurators/CodeBuddyCliConfigurator.cs
  class CodeBuddyCliConfigurator (line 11) | public class CodeBuddyCliConfigurator : JsonFileMcpConfigurator
    method CodeBuddyCliConfigurator (line 13) | public CodeBuddyCliConfigurator() : base(new McpClient
    method GetInstallationSteps (line 22) | public override IList<string> GetInstallationSteps() => new List<string>

FILE: MCPForUnity/Editor/Clients/Configurators/CodexConfigurator.cs
  class CodexConfigurator (line 8) | public class CodexConfigurator : CodexMcpConfigurator
    method CodexConfigurator (line 10) | public CodexConfigurator() : base(new McpClient
    method GetSkillInstallPath (line 21) | public override string GetSkillInstallPath()
    method GetInstallationSteps (line 27) | public override IList<string> GetInstallationSteps() => new List<string>

FILE: MCPForUnity/Editor/Clients/Configurators/CopilotCliConfigurator.cs
  class CopilotCliConfigurator (line 8) | public class CopilotCliConfigurator : JsonFileMcpConfigurator
    method CopilotCliConfigurator (line 10) | public CopilotCliConfigurator() : base(new McpClient
    method GetInstallationSteps (line 19) | public override IList<string> GetInstallationSteps() => new List<string>

FILE: MCPForUnity/Editor/Clients/Configurators/CursorConfigurator.cs
  class CursorConfigurator (line 8) | public class CursorConfigurator : JsonFileMcpConfigurator
    method CursorConfigurator (line 10) | public CursorConfigurator() : base(new McpClient
    method GetInstallationSteps (line 19) | public override IList<string> GetInstallationSteps() => new List<string>

FILE: MCPForUnity/Editor/Clients/Configurators/GeminiCliConfigurator.cs
  class GeminiCliConfigurator (line 10) | public class GeminiCliConfigurator : JsonFileMcpConfigurator
    method GeminiCliConfigurator (line 12) | public GeminiCliConfigurator() : base(new McpClient
    method GetInstallationSteps (line 22) | public override IList<string> GetInstallationSteps() => new List<string>

FILE: MCPForUnity/Editor/Clients/Configurators/KiloCodeConfigurator.cs
  class KiloCodeConfigurator (line 8) | public class KiloCodeConfigurator : JsonFileMcpConfigurator
    method KiloCodeConfigurator (line 10) | public KiloCodeConfigurator() : base(new McpClient
    method GetInstallationSteps (line 20) | public override IList<string> GetInstallationSteps() => new List<string>

FILE: MCPForUnity/Editor/Clients/Configurators/KiroConfigurator.cs
  class KiroConfigurator (line 8) | public class KiroConfigurator : JsonFileMcpConfigurator
    method KiroConfigurator (line 10) | public KiroConfigurator() : base(new McpClient
    method GetInstallationSteps (line 21) | public override IList<string> GetInstallationSteps() => new List<string>

FILE: MCPForUnity/Editor/Clients/Configurators/OpenCodeConfigurator.cs
  class OpenCodeConfigurator (line 15) | public class OpenCodeConfigurator : McpClientConfiguratorBase
    method OpenCodeConfigurator (line 20) | public OpenCodeConfigurator() : base(new McpClient
    method BuildConfigPath (line 29) | private static string BuildConfigPath()
    method GetConfigPath (line 38) | public override string GetConfigPath() => CurrentOsPath();
    method TryLoadConfig (line 46) | private JObject TryLoadConfig(string path)
    method CheckStatus (line 78) | public override McpStatus CheckStatus(bool attemptAutoRewrite = true)
    method Configure (line 123) | public override void Configure()
    method GetManualSnippet (line 154) | public override string GetManualSnippet()
    method GetInstallationSteps (line 163) | public override IList<string> GetInstallationSteps() => new List<string>
    method BuildServerEntry (line 171) | private static JObject BuildServerEntry() => new JObject

FILE: MCPForUnity/Editor/Clients/Configurators/QwenCodeConfigurator.cs
  class QwenCodeConfigurator (line 17) | public class QwenCodeConfigurator : JsonFileMcpConfigurator
    method QwenCodeConfigurator (line 19) | public QwenCodeConfigurator() : base(new McpClient
    method GetInstallationSteps (line 31) | public override IList<string> GetInstallationSteps() => new List<string>

FILE: MCPForUnity/Editor/Clients/Configurators/RiderConfigurator.cs
  class RiderConfigurator (line 8) | public class RiderConfigurator : JsonFileMcpConfigurator
    method RiderConfigurator (line 10) | public RiderConfigurator() : base(new McpClient
    method GetInstallationSteps (line 20) | public override IList<string> GetInstallationSteps() => new List<string>

FILE: MCPForUnity/Editor/Clients/Configurators/TraeConfigurator.cs
  class TraeConfigurator (line 8) | public class TraeConfigurator : JsonFileMcpConfigurator
    method TraeConfigurator (line 10) | public TraeConfigurator() : base(new McpClient
    method GetInstallationSteps (line 19) | public override IList<string> GetInstallationSteps() => new List<string>

FILE: MCPForUnity/Editor/Clients/Configurators/VSCodeConfigurator.cs
  class VSCodeConfigurator (line 8) | public class VSCodeConfigurator : JsonFileMcpConfigurator
    method VSCodeConfigurator (line 10) | public VSCodeConfigurator() : base(new McpClient
    method GetInstallationSteps (line 20) | public override IList<string> GetInstallationSteps() => new List<string>

FILE: MCPForUnity/Editor/Clients/Configurators/VSCodeInsidersConfigurator.cs
  class VSCodeInsidersConfigurator (line 8) | public class VSCodeInsidersConfigurator : JsonFileMcpConfigurator
    method VSCodeInsidersConfigurator (line 10) | public VSCodeInsidersConfigurator() : base(new McpClient
    method GetInstallationSteps (line 20) | public override IList<string> GetInstallationSteps() => new List<string>

FILE: MCPForUnity/Editor/Clients/Configurators/WindsurfConfigurator.cs
  class WindsurfConfigurator (line 8) | public class WindsurfConfigurator : JsonFileMcpConfigurator
    method WindsurfConfigurator (line 10) | public WindsurfConfigurator() : base(new McpClient
    method GetInstallationSteps (line 22) | public override IList<string> GetInstallationSteps() => new List<string>

FILE: MCPForUnity/Editor/Clients/IMcpClientConfigurator.cs
  type IMcpClientConfigurator (line 9) | public interface IMcpClientConfigurator
    method GetConfigureActionLabel (line 30) | string GetConfigureActionLabel();
    method GetConfigPath (line 33) | string GetConfigPath();
    method CheckStatus (line 36) | McpStatus CheckStatus(bool attemptAutoRewrite = true);
    method Configure (line 39) | void Configure();
    method GetManualSnippet (line 42) | string GetManualSnippet();
    method GetInstallationSteps (line 45) | System.Collections.Generic.IList<string> GetInstallationSteps();
    method GetSkillInstallPath (line 51) | string GetSkillInstallPath();

FILE: MCPForUnity/Editor/Clients/McpClientConfiguratorBase.cs
  class McpClientConfiguratorBase (line 17) | public abstract class McpClientConfiguratorBase : IMcpClientConfigurator
    method McpClientConfiguratorBase (line 21) | protected McpClientConfiguratorBase(McpClient client)
    method GetConfigureActionLabel (line 34) | public virtual string GetConfigureActionLabel() => "Configure";
    method GetSkillInstallPath (line 35) | public virtual string GetSkillInstallPath() => null;
    method GetConfigPath (line 37) | public abstract string GetConfigPath();
    method CheckStatus (line 38) | public abstract McpStatus CheckStatus(bool attemptAutoRewrite = true);
    method Configure (line 39) | public abstract void Configure();
    method GetManualSnippet (line 40) | public abstract string GetManualSnippet();
    method GetInstallationSteps (line 41) | public abstract IList<string> GetInstallationSteps();
    method GetUvxPathOrError (line 43) | protected string GetUvxPathOrError()
    method CurrentOsPath (line 53) | protected string CurrentOsPath()
    method UrlsEqual (line 62) | protected bool UrlsEqual(string a, string b)
    method GetExpectedPackageSourceForValidation (line 89) | protected static string GetExpectedPackageSourceForValidation()
    method IsBetaPackageSource (line 102) | protected static bool IsBetaPackageSource(string packageSource)
  class JsonFileMcpConfigurator (line 128) | public abstract class JsonFileMcpConfigurator : McpClientConfiguratorBase
    method JsonFileMcpConfigurator (line 130) | public JsonFileMcpConfigurator(McpClient client) : base(client) { }
    method GetConfigPath (line 132) | public override string GetConfigPath() => CurrentOsPath();
    method CheckStatus (line 134) | public override McpStatus CheckStatus(bool attemptAutoRewrite = true)
    method Configure (line 320) | public override void Configure()
    method GetManualSnippet (line 336) | public override string GetManualSnippet()
    method GetInstallationSteps (line 350) | public override IList<string> GetInstallationSteps() => new List<strin...
  class CodexMcpConfigurator (line 354) | public abstract class CodexMcpConfigurator : McpClientConfiguratorBase
    method CodexMcpConfigurator (line 356) | public CodexMcpConfigurator(McpClient client) : base(client) { }
    method GetConfigPath (line 358) | public override string GetConfigPath() => CurrentOsPath();
    method CheckStatus (line 360) | public override McpStatus CheckStatus(bool attemptAutoRewrite = true)
    method Configure (line 498) | public override void Configure()
    method GetManualSnippet (line 514) | public override string GetManualSnippet()
    method GetInstallationSteps (line 527) | public override IList<string> GetInstallationSteps() => new List<string>
  class ClaudeCliMcpConfigurator (line 536) | public abstract class ClaudeCliMcpConfigurator : McpClientConfiguratorBase
    method ClaudeCliMcpConfigurator (line 538) | public ClaudeCliMcpConfigurator(McpClient client) : base(client) { }
    method GetConfigureActionLabel (line 541) | public override string GetConfigureActionLabel() => client.status == M...
    method GetConfigPath (line 543) | public override string GetConfigPath() => "Managed via Claude CLI";
    method GetClientProjectDir (line 553) | internal static string GetClientProjectDir()
    method CheckStatus (line 575) | public override McpStatus CheckStatus(bool attemptAutoRewrite = true)
    method CheckStatusWithProjectDir (line 598) | internal McpStatus CheckStatusWithProjectDir(
    method Configure (line 757) | public override void Configure()
    method ConfigureWithCapturedValues (line 773) | public void ConfigureWithCapturedValues(
    method RegisterWithCapturedValues (line 795) | private void RegisterWithCapturedValues(
    method UnregisterWithCapturedValues (line 846) | private void UnregisterWithCapturedValues(string projectDir, string cl...
    method Register (line 862) | private void Register()
    method Unregister (line 948) | private void Unregister()
    method GetManualSnippet (line 978) | public override string GetManualSnippet()
    method GetInstallationSteps (line 1021) | public override IList<string> GetInstallationSteps() => new List<string>
    method RemoveFromAllScopes (line 1034) | private static void RemoveFromAllScopes(string claudePath, string proj...
    method RemoveLegacyUserConfigEntries (line 1062) | private static void RemoveLegacyUserConfigEntries(string projectDir)
    method SanitizeShellHeaderValue (line 1131) | private static string SanitizeShellHeaderValue(string value)
    method ExtractPackageSourceFromCliOutput (line 1161) | private static string ExtractPackageSourceFromCliOutput(string cliOutput)
    method ReadClaudeCodeConfig (line 1209) | private static (JObject serverConfig, string error) ReadClaudeCodeConf...
    method ReadLocalScopeConfig (line 1234) | private static (JObject serverConfig, string error) ReadLocalScopeConf...
    method ReadUserScopeConfig (line 1271) | private static (JObject serverConfig, string error) ReadUserScopeConfi...
    method NormalizePath (line 1338) | private static string NormalizePath(string path)
    method ExtractPackageSourceFromConfig (line 1351) | private static string ExtractPackageSourceFromConfig(JObject serverCon...

FILE: MCPForUnity/Editor/Clients/McpClientRegistry.cs
  class McpClientRegistry (line 13) | public static class McpClientRegistry
    method BuildRegistry (line 29) | private static List<IMcpClientConfigurator> BuildRegistry()

FILE: MCPForUnity/Editor/Constants/AuthConstants.cs
  class AuthConstants (line 6) | internal static class AuthConstants

FILE: MCPForUnity/Editor/Constants/EditorPrefKeys.cs
  class EditorPrefKeys (line 7) | internal static class EditorPrefKeys

FILE: MCPForUnity/Editor/Constants/HealthStatus.cs
  class HealthStatus (line 7) | public static class HealthStatus

FILE: MCPForUnity/Editor/Dependencies/DependencyManager.cs
  class DependencyManager (line 16) | public static class DependencyManager
    method GetCurrentPlatformDetector (line 30) | public static IPlatformDetector GetCurrentPlatformDetector()
    method CheckAllDependencies (line 46) | public static DependencyCheckResult CheckAllDependencies()
    method GetInstallationRecommendations (line 82) | public static string GetInstallationRecommendations()
    method GetInstallationUrls (line 98) | public static (string pythonUrl, string uvUrl) GetInstallationUrls()
    method GenerateRecommendations (line 111) | private static void GenerateRecommendations(DependencyCheckResult resu...

FILE: MCPForUnity/Editor/Dependencies/Models/DependencyCheckResult.cs
  class DependencyCheckResult (line 10) | [Serializable]
    method DependencyCheckResult (line 48) | public DependencyCheckResult()
    method GetMissingDependencies (line 58) | public List<DependencyStatus> GetMissingDependencies()
    method GetMissingRequired (line 66) | public List<DependencyStatus> GetMissingRequired()
    method GenerateSummary (line 74) | public void GenerateSummary()

FILE: MCPForUnity/Editor/Dependencies/Models/DependencyStatus.cs
  class DependencyStatus (line 8) | [Serializable]
    method DependencyStatus (line 51) | public DependencyStatus(string name, bool isRequired = true)
    method ToString (line 58) | public override string ToString()

FILE: MCPForUnity/Editor/Dependencies/PlatformDetectors/IPlatformDetector.cs
  type IPlatformDetector (line 8) | public interface IPlatformDetector
    method DetectPython (line 23) | DependencyStatus DetectPython();
    method DetectUv (line 28) | DependencyStatus DetectUv();
    method GetInstallationRecommendations (line 33) | string GetInstallationRecommendations();
    method GetPythonInstallUrl (line 38) | string GetPythonInstallUrl();
    method GetUvInstallUrl (line 43) | string GetUvInstallUrl();

FILE: MCPForUnity/Editor/Dependencies/PlatformDetectors/LinuxPlatformDetector.cs
  class LinuxPlatformDetector (line 15) | public class LinuxPlatformDetector : PlatformDetectorBase
    method DetectPython (line 21) | public override DependencyStatus DetectPython()
    method GetPythonInstallUrl (line 66) | public override string GetPythonInstallUrl()
    method GetUvInstallUrl (line 71) | public override string GetUvInstallUrl()
    method GetInstallationRecommendations (line 76) | public override string GetInstallationRecommendations()
    method DetectUv (line 95) | public override DependencyStatus DetectUv()
    method TryValidatePython (line 138) | private bool TryValidatePython(string pythonPath, out string version, ...
    method BuildAugmentedPath (line 179) | protected string BuildAugmentedPath()
    method GetPathAdditions (line 188) | private string[] GetPathAdditions()
    method TryFindInPath (line 201) | protected override bool TryFindInPath(string executable, out string fu...

FILE: MCPForUnity/Editor/Dependencies/PlatformDetectors/MacOSPlatformDetector.cs
  class MacOSPlatformDetector (line 15) | public class MacOSPlatformDetector : PlatformDetectorBase
    method DetectPython (line 21) | public override DependencyStatus DetectPython()
    method GetPythonInstallUrl (line 66) | public override string GetPythonInstallUrl()
    method GetUvInstallUrl (line 71) | public override string GetUvInstallUrl()
    method GetInstallationRecommendations (line 76) | public override string GetInstallationRecommendations()
    method DetectUv (line 93) | public override DependencyStatus DetectUv()
    method TryValidatePython (line 136) | private bool TryValidatePython(string pythonPath, out string version, ...
    method BuildAugmentedPath (line 177) | protected string BuildAugmentedPath()
    method GetPathAdditions (line 186) | private string[] GetPathAdditions()
    method TryFindInPath (line 200) | protected override bool TryFindInPath(string executable, out string fu...

FILE: MCPForUnity/Editor/Dependencies/PlatformDetectors/PlatformDetectorBase.cs
  class PlatformDetectorBase (line 11) | public abstract class PlatformDetectorBase : IPlatformDetector
    method DetectPython (line 16) | public abstract DependencyStatus DetectPython();
    method GetPythonInstallUrl (line 17) | public abstract string GetPythonInstallUrl();
    method GetUvInstallUrl (line 18) | public abstract string GetUvInstallUrl();
    method GetInstallationRecommendations (line 19) | public abstract string GetInstallationRecommendations();
    method DetectUv (line 21) | public virtual DependencyStatus DetectUv()
    method TryParseVersion (line 67) | protected bool TryParseVersion(string version, out int major, out int ...
    method TryValidateUvWithPath (line 88) | protected bool TryValidateUvWithPath(string command, string augmentedP...
    method TryFindInPath (line 135) | protected abstract bool TryFindInPath(string executable, out string fu...

FILE: MCPForUnity/Editor/Dependencies/PlatformDetectors/WindowsPlatformDetector.cs
  class WindowsPlatformDetector (line 17) | public class WindowsPlatformDetector : PlatformDetectorBase
    method DetectPython (line 23) | public override DependencyStatus DetectPython()
    method GetPythonInstallUrl (line 78) | public override string GetPythonInstallUrl()
    method GetUvInstallUrl (line 83) | public override string GetUvInstallUrl()
    method GetInstallationRecommendations (line 88) | public override string GetInstallationRecommendations()
    method DetectUv (line 103) | public override DependencyStatus DetectUv()
    method TryFindPythonViaUv (line 155) | private bool TryFindPythonViaUv(out string version, out string fullPath)
    method TryValidatePython (line 195) | private bool TryValidatePython(string pythonPath, out string version, ...
    method TryFindInPath (line 236) | protected override bool TryFindInPath(string executable, out string fu...
    method BuildAugmentedPath (line 242) | protected string BuildAugmentedPath()
    method GetPathAdditions (line 251) | private string[] GetPathAdditions()

FILE: MCPForUnity/Editor/External/Tommy.cs
  class TomlNode (line 42) | public abstract class TomlNode : IEnumerable
    method GetEnumerator (line 91) | public IEnumerator GetEnumerator() => Children.GetEnumerator();
    method TryGetNode (line 93) | public virtual bool TryGetNode(string key, out TomlNode node)
    method HasKey (line 99) | public virtual bool HasKey(string key) => false;
    method HasItemAt (line 101) | public virtual bool HasItemAt(int index) => false;
    method Add (line 103) | public virtual void Add(string key, TomlNode node) { }
    method Add (line 105) | public virtual void Add(TomlNode node) { }
    method Delete (line 107) | public virtual void Delete(TomlNode node) { }
    method Delete (line 109) | public virtual void Delete(string key) { }
    method Delete (line 111) | public virtual void Delete(int index) { }
    method AddRange (line 113) | public virtual void AddRange(IEnumerable<TomlNode> nodes)
    method WriteTo (line 118) | public virtual void WriteTo(TextWriter tw, string name = null) => tw.W...
    method ToInlineToml (line 120) | public virtual string ToInlineToml() => ToString();
  class TomlString (line 168) | public class TomlString : TomlNode
    method ToString (line 178) | public override string ToString() => Value;
    method ToInlineToml (line 180) | public override string ToInlineToml()
  class TomlInteger (line 195) | public class TomlInteger : TomlNode
    type Base (line 197) | public enum Base
    method ToString (line 211) | public override string ToString() => Value.ToString();
    method ToInlineToml (line 213) | public override string ToInlineToml() =>
  class TomlFloat (line 219) | public class TomlFloat : TomlNode, IFormattable
    method ToString (line 226) | public override string ToString() => Value.ToString(CultureInfo.Invari...
    method ToString (line 228) | public string ToString(string format, IFormatProvider formatProvider) ...
    method ToString (line 230) | public string ToString(IFormatProvider formatProvider) => Value.ToStri...
    method ToInlineToml (line 232) | public override string ToInlineToml() =>
  class TomlBoolean (line 242) | public class TomlBoolean : TomlNode
    method ToString (line 249) | public override string ToString() => Value.ToString();
    method ToInlineToml (line 251) | public override string ToInlineToml() => Value ? TomlSyntax.TRUE_VALUE...
  class TomlDateTime (line 254) | public class TomlDateTime : TomlNode, IFormattable
    method ToString (line 258) | public virtual string ToString(string format, IFormatProvider formatPr...
    method ToString (line 259) | public virtual string ToString(IFormatProvider formatProvider) => stri...
    method ToInlineTomlInternal (line 260) | protected virtual string ToInlineTomlInternal() => string.Empty;
    method ToInlineToml (line 262) | public override string ToInlineToml() => ToInlineTomlInternal()
  class TomlDateTimeOffset (line 267) | public class TomlDateTimeOffset : TomlDateTime
    method ToString (line 272) | public override string ToString() => Value.ToString(CultureInfo.Curren...
    method ToString (line 273) | public override string ToString(IFormatProvider formatProvider) => Val...
    method ToString (line 275) | public override string ToString(string format, IFormatProvider formatP...
    method ToInlineTomlInternal (line 278) | protected override string ToInlineTomlInternal() => Value.ToString(Tom...
  class TomlDateTimeLocal (line 281) | public class TomlDateTimeLocal : TomlDateTime
    type DateTimeStyle (line 283) | public enum DateTimeStyle
    method ToString (line 294) | public override string ToString() => Value.ToString(CultureInfo.Curren...
    method ToString (line 296) | public override string ToString(IFormatProvider formatProvider) => Val...
    method ToString (line 298) | public override string ToString(string format, IFormatProvider formatP...
    method ToInlineToml (line 301) | public override string ToInlineToml() =>
  class TomlArray (line 310) | public class TomlArray : TomlNode
    method Add (line 342) | public override void Add(TomlNode node) => RawArray.Add(node);
    method AddRange (line 344) | public override void AddRange(IEnumerable<TomlNode> nodes) => RawArray...
    method Delete (line 346) | public override void Delete(TomlNode node) => RawArray.Remove(node);
    method Delete (line 348) | public override void Delete(int index) => RawArray.RemoveAt(index);
    method ToString (line 350) | public override string ToString() => ToString(false);
    method ToString (line 352) | public string ToString(bool multiline)
    method WriteTo (line 369) | public override void WriteTo(TextWriter tw, string name = null)
  class TomlTable (line 421) | public class TomlTable : TomlNode
    method HasKey (line 446) | public override bool HasKey(string key) => RawTable.ContainsKey(key);
    method Add (line 447) | public override void Add(string key, TomlNode node) => RawTable.Add(ke...
    method TryGetNode (line 448) | public override bool TryGetNode(string key, out TomlNode node) => RawT...
    method Delete (line 449) | public override void Delete(TomlNode node) => RawTable.Remove(RawTable...
    method Delete (line 450) | public override void Delete(string key) => RawTable.Remove(key);
    method ToString (line 452) | public override string ToString()
    method CollectCollapsedItems (line 472) | private LinkedList<KeyValuePair<string, TomlNode>> CollectCollapsedIte...
    method WriteTo (line 504) | public override void WriteTo(TextWriter tw, string name = null) => Wri...
    method WriteTo (line 506) | internal void WriteTo(TextWriter tw, string name, bool writeSectionName)
  class TomlLazy (line 562) | internal class TomlLazy : TomlNode
    method TomlLazy (line 567) | public TomlLazy(TomlNode parent) => this.parent = parent;
    method Add (line 581) | public override void Add(TomlNode node) => Set<TomlArray>().Add(node);
    method Add (line 583) | public override void Add(string key, TomlNode node) => Set<TomlTable>(...
    method AddRange (line 585) | public override void AddRange(IEnumerable<TomlNode> nodes) => Set<Toml...
    method Set (line 587) | private TomlNode Set<T>() where T : TomlNode, new()
  class TOMLParser (line 623) | public class TOMLParser : IDisposable
    type ParseState (line 625) | public enum ParseState
    method TOMLParser (line 638) | public TOMLParser(TextReader reader)
    method Dispose (line 646) | public void Dispose() => reader?.Dispose();
    method Parse (line 648) | public TomlTable Parse()
    method AddError (line 854) | private bool AddError(string message, bool skipLine = true)
    method AdvanceLine (line 867) | private void AdvanceLine(int startCol = 0)
    method ConsumeChar (line 873) | private int ConsumeChar()
    method ReadKeyValuePair (line 890) | private TomlNode ReadKeyValuePair(List<string> keyParts)
    method ReadValue (line 939) | private TomlNode ReadValue(bool skipNewlines = false)
    method ReadKeyName (line 1018) | private bool ReadKeyName(ref List<string> parts, char until)
    method ReadRawValue (line 1104) | private string ReadRawValue()
    method ReadTomlValue (line 1131) | private TomlNode ReadTomlValue()
    method ReadArray (line 1215) | private TomlArray ReadArray()
    method ReadInlineTable (line 1293) | private TomlNode ReadInlineTable()
    method IsTripleQuote (line 1384) | private bool IsTripleQuote(char quote, out char excess)
    method ProcessQuotedValueCharacter (line 1416) | private bool ProcessQuotedValueCharacter(char quote,
    method ReadQuotedValueSingleLine (line 1462) | private string ReadQuotedValueSingleLine(char quote, char initialData ...
    method ReadQuotedValueMultiLine (line 1520) | private string ReadQuotedValueMultiLine(char quote)
    method InsertNode (line 1638) | private bool InsertNode(TomlNode node, TomlNode root, IList<string> path)
    method CreateTable (line 1668) | private TomlTable CreateTable(TomlNode root, IList<string> path, bool ...
    method ParseComment (line 1763) | private string ParseComment()
  class TOML (line 1776) | public static class TOML
    method Parse (line 1780) | public static TomlTable Parse(TextReader reader)
  class TomlFormatException (line 1789) | public class TomlFormatException : Exception
    method TomlFormatException (line 1791) | public TomlFormatException(string message) : base(message) { }
  class TomlParseException (line 1794) | public class TomlParseException : Exception
    method TomlParseException (line 1796) | public TomlParseException(TomlTable parsed, IEnumerable<TomlSyntaxExce...
  class TomlSyntaxException (line 1808) | public class TomlSyntaxException : Exception
    method TomlSyntaxException (line 1810) | public TomlSyntaxException(string message, TOMLParser.ParseState state...
  class TomlSyntax (line 1828) | internal static class TomlSyntax
    method IsBoolean (line 1841) | public static bool IsBoolean(string s) => s is TRUE_VALUE or FALSE_VALUE;
    method IsPosInf (line 1843) | public static bool IsPosInf(string s) => s is INF_VALUE or POS_INF_VALUE;
    method IsNegInf (line 1845) | public static bool IsNegInf(string s) => s == NEG_INF_VALUE;
    method IsNaN (line 1847) | public static bool IsNaN(string s) => s is NAN_VALUE or POS_NAN_VALUE ...
    method IsInteger (line 1849) | public static bool IsInteger(string s) => IntegerPattern.IsMatch(s);
    method IsFloat (line 1851) | public static bool IsFloat(string s) => FloatPattern.IsMatch(s);
    method IsIntegerWithBase (line 1853) | public static bool IsIntegerWithBase(string s, out int numberBase)
    method IsQuoted (line 1965) | public static bool IsQuoted(char c) => c is BASIC_STRING_SYMBOL or LIT...
    method IsWhiteSpace (line 1967) | public static bool IsWhiteSpace(char c) => c is ' ' or '\t';
    method IsNewLine (line 1969) | public static bool IsNewLine(char c) => c is NEWLINE_CHARACTER or NEWL...
    method IsLineBreak (line 1971) | public static bool IsLineBreak(char c) => c == NEWLINE_CHARACTER;
    method IsEmptySpace (line 1973) | public static bool IsEmptySpace(char c) => IsWhiteSpace(c) || IsNewLin...
    method IsBareKey (line 1975) | public static bool IsBareKey(char c) =>
    method MustBeEscaped (line 1978) | public static bool MustBeEscaped(char c, bool allowNewLines = false)
    method IsValueSeparator (line 1986) | public static bool IsValueSeparator(char c) =>
  class StringUtils (line 1992) | internal static class StringUtils
    method AsKey (line 1994) | public static string AsKey(this string key)
    method Join (line 2000) | public static string Join(this string self, IEnumerable<string> subItems)
    method TryParseDateTime (line 2017) | public static bool TryParseDateTime<T>(string s,
    method AsComment (line 2037) | public static void AsComment(this string self, TextWriter tw)
    method RemoveAll (line 2043) | public static string RemoveAll(this string txt, char toRemove)
    method Escape (line 2051) | public static string Escape(this string txt, bool escapeNewlines = true)
    method TryUnescape (line 2080) | public static bool TryUnescape(this string txt, out string unescaped, ...
    method Unescape (line 2096) | public static string Unescape(this string txt)

FILE: MCPForUnity/Editor/Helpers/AssetPathUtility.cs
  class AssetPathUtility (line 16) | public static class AssetPathUtility
    method NormalizeSeparators (line 22) | public static string NormalizeSeparators(string path)
    method SanitizeAssetPath (line 33) | public static string SanitizeAssetPath(string path)
    method IsValidAssetPath (line 66) | public static bool IsValidAssetPath(string path)
    method GetMcpPackageRootPath (line 106) | public static string GetMcpPackageRootPath()
    method GetPackageJson (line 152) | public static JObject GetPackageJson()
    method GetMcpServerPackageSource (line 213) | public static string GetMcpServerPackageSource()
    method ResolveLocalServerPath (line 254) | internal static string ResolveLocalServerPath(string path)
    method GetMcpServerGitUrl (line 304) | [System.Obsolete("Use GetMcpServerPackageSource() instead")]
    method GetUvxCommandParts (line 311) | public static (string uvxPath, string fromUrl, string packageName) Get...
    method GetBetaServerFromArgs (line 330) | public static string GetBetaServerFromArgs(bool quoteFromPath = false)
    method GetBetaServerFromArgs (line 344) | public static string GetBetaServerFromArgs(string gitUrlOverride, stri...
    method GetBetaServerFromArgsList (line 381) | public static System.Collections.Generic.IList<string> GetBetaServerFr...
    method GetBetaServerFromArgsList (line 394) | public static System.Collections.Generic.IList<string> GetBetaServerFr...
    method ShouldForceUvxRefresh (line 434) | public static bool ShouldForceUvxRefresh()
    method ShouldUseUvxOffline (line 459) | public static bool ShouldUseUvxOffline()
    method GetCachedOfflineProbeResult (line 466) | private static bool GetCachedOfflineProbeResult()
    method RunOfflineProbe (line 478) | private static bool RunOfflineProbe()
    method GetUvxDevFlags (line 505) | public static string GetUvxDevFlags()
    method GetUvxDevFlags (line 515) | public static string GetUvxDevFlags(bool forceRefresh, bool useOffline)
    method GetUvxDevFlagsList (line 527) | public static IReadOnlyList<string> GetUvxDevFlagsList()
    method IsLocalServerPath (line 538) | public static bool IsLocalServerPath()
    method GetLocalServerPath (line 563) | public static string GetLocalServerPath()
    method CleanLocalServerBuildArtifacts (line 584) | public static bool CleanLocalServerBuildArtifacts()
    method GetPackageVersion (line 614) | public static string GetPackageVersion()
    method IsPreReleaseVersion (line 638) | public static bool IsPreReleaseVersion()
    method IsSemVerPreRelease (line 654) | private static bool IsSemVerPreRelease(string version)

FILE: MCPForUnity/Editor/Helpers/CodexConfigHelper.cs
  class CodexConfigHelper (line 18) | public static class CodexConfigHelper
    method AddUvxModeFlags (line 20) | private static void AddUvxModeFlags(TomlArray args)
    method BuildCodexServerBlock (line 27) | public static string BuildCodexServerBlock(string uvPath)
    method UpsertCodexServerBlock (line 86) | public static string UpsertCodexServerBlock(string existingToml, strin...
    method TryParseCodexServer (line 114) | public static bool TryParseCodexServer(string toml, out string command...
    method TryParseCodexServer (line 119) | public static bool TryParseCodexServer(string toml, out string command...
    method TryParseToml (line 157) | private static TomlTable TryParseToml(string toml)
    method CreateUnityMcpTable (line 184) | private static TomlTable CreateUnityMcpTable(string uvPath)
    method EnsureRmcpClientFeature (line 235) | private static void EnsureRmcpClientFeature(TomlTable root)
    method TryGetTable (line 248) | private static bool TryGetTable(TomlTable parent, string key, out Toml...
    method GetTomlString (line 275) | private static string GetTomlString(TomlTable table, string key)
    method GetTomlStringArray (line 285) | private static string[] GetTomlStringArray(TomlTable table, string key)

FILE: MCPForUnity/Editor/Helpers/ComponentOps.cs
  class ComponentOps (line 15) | public static class ComponentOps
    method AddComponent (line 24) | public static Component AddComponent(GameObject target, Type component...
    method RemoveComponent (line 98) | public static bool RemoveComponent(GameObject target, Type componentTy...
    method SetProperty (line 148) | public static bool SetProperty(Component component, string propertyNam...
    method TrySetViaReflection (line 196) | private static bool TrySetViaReflection(object component, Type type, s...
    method GetAccessibleMembers (line 298) | public static List<string> GetAccessibleMembers(Type componentType)
    method FindSerializedFieldInHierarchy (line 350) | internal static FieldInfo FindSerializedFieldInHierarchy(Type type, st...
    method CheckPhysicsConflict (line 376) | private static string CheckPhysicsConflict(GameObject target, Type com...
    method ApplyDefaultValues (line 404) | private static void ApplyDefaultValues(Component component)
    method AllowsMultiple (line 413) | private static bool AllowsMultiple(GameObject target, Type componentType)
    method ResolveMemberType (line 430) | private static Type ResolveMemberType(Type componentType, string prope...
    method SetViaSerializedProperty (line 452) | private static bool SetViaSerializedProperty(Component component, stri...
    method SetSerializedPropertyRecursive (line 491) | private static bool SetSerializedPropertyRecursive(SerializedProperty ...
    method SetObjectReference (line 595) | private static bool SetObjectReference(SerializedProperty prop, JToken...
    method AssignObjectReference (line 754) | private static bool AssignObjectReference(SerializedProperty prop, Uni...
    method ResolveSceneObjectByName (line 813) | private static bool ResolveSceneObjectByName(SerializedProperty prop, ...
    method FindPropertyRelativeFuzzy (line 847) | private static SerializedProperty FindPropertyRelativeFuzzy(Serialized...
    method SetEnum (line 873) | private static bool SetEnum(SerializedProperty prop, JToken value, out...
    method GetSpriteFileId (line 908) | private static long GetSpriteFileId(Sprite sprite)

FILE: MCPForUnity/Editor/Helpers/ConfigJsonBuilder.cs
  class ConfigJsonBuilder (line 14) | public static class ConfigJsonBuilder
    method BuildManualConfigJson (line 16) | public static string BuildManualConfigJson(string uvPath, McpClient cl...
    method ApplyUnityServerToExistingConfig (line 30) | public static JObject ApplyUnityServerToExistingConfig(JObject root, s...
    method PopulateUnityNode (line 49) | private static void PopulateUnityNode(JObject unity, string uvPath, Mc...
    method EnsureObject (line 152) | private static JObject EnsureObject(JObject parent, string name)
    method BuildUvxArgs (line 160) | private static IList<string> BuildUvxArgs(string fromUrl, string packa...

FILE: MCPForUnity/Editor/Helpers/EditorWindowScreenshotUtility.cs
  class EditorWindowScreenshotUtility (line 17) | internal static class EditorWindowScreenshotUtility
    method CaptureSceneViewViewportToAssets (line 43) | public static ScreenshotCaptureResult CaptureSceneViewViewportToAssets(
    method FocusAndRepaint (line 117) | private static void FocusAndRepaint(SceneView sceneView)
    method GetSceneViewViewportPixelRect (line 143) | private static Rect GetSceneViewViewportPixelRect(SceneView sceneView)
    method GetViewportLocalRectPoints (line 157) | private static Rect GetViewportLocalRectPoints(SceneView sceneView, fl...
    method CaptureViewRect (line 180) | private static Texture2D CaptureViewRect(SceneView sceneView, Rect vie...
    method GetHostView (line 239) | private static object GetHostView(EditorWindow window)
    method GetRectProperty (line 257) | private static Rect? GetRectProperty(object instance, string propertyN...
    method InvokeMethodIfExists (line 278) | private static void InvokeMethodIfExists(object instance, string metho...
    method FlipTextureVertically (line 297) | private static void FlipTextureVertically(Texture2D texture)
    method PrepareCaptureResult (line 320) | private static ScreenshotCaptureResult PrepareCaptureResult(string fil...
    method BuildFileName (line 338) | private static string BuildFileName(string fileName)
    method NormalizeSceneViewSuperSize (line 350) | private static int NormalizeSceneViewSuperSize(int superSize)
    method SanitizeFileName (line 361) | private static string SanitizeFileName(string fileName)
    method EnsureUnique (line 396) | private static string EnsureUnique(string fullPath)
    method DestroyTexture (line 415) | private static void DestroyTexture(Texture2D texture)

FILE: MCPForUnity/Editor/Helpers/ExecPath.cs
  class ExecPath (line 12) | internal static class ExecPath
    method ResolveClaude (line 17) | internal static string ResolveClaude()
    method ResolveClaudeFromNvm (line 98) | private static string ResolveClaudeFromNvm(string home)
    method SetClaudeCliPath (line 141) | internal static void SetClaudeCliPath(string absolutePath)
    method ClearClaudeCliPath (line 154) | internal static void ClearClaudeCliPath()
    method TryRun (line 166) | internal static bool TryRun(
    method FindInPath (line 238) | internal static string FindInPath(string executable, string extraPathP...
    method Which (line 250) | private static string Which(string exe, string prependPath)
    method FindInPathWindows (line 285) | internal static string FindInPathWindows(string exe, string extraPathP...

FILE: MCPForUnity/Editor/Helpers/GameObjectLookup.cs
  class GameObjectLookup (line 16) | public static class GameObjectLookup
    type SearchMethod (line 21) | public enum SearchMethod
    method ParseSearchMethod (line 34) | public static SearchMethod ParseSearchMethod(string method)
    method FindByTarget (line 58) | public static GameObject FindByTarget(JToken target, string searchMeth...
    method ResolveInstanceID (line 70) | public static UnityEngine.Object ResolveInstanceID(int instanceId)
    method FindById (line 82) | public static GameObject FindById(int instanceId)
    method SearchGameObjects (line 95) | public static List<int> SearchGameObjects(string searchMethod, string ...
    method SearchGameObjects (line 109) | public static List<int> SearchGameObjects(SearchMethod method, string ...
    method SearchByName (line 150) | private static IEnumerable<int> SearchByName(string name, bool include...
    method SearchByPath (line 161) | private static IEnumerable<int> SearchByPath(string path, bool include...
    method SearchByTag (line 205) | private static IEnumerable<int> SearchByTag(string tag, bool includeIn...
    method SearchByLayer (line 237) | private static IEnumerable<int> SearchByLayer(string layerName, bool i...
    method SearchByComponent (line 261) | private static IEnumerable<int> SearchByComponent(string componentType...
    method GetAllSceneObjects (line 289) | public static IEnumerable<GameObject> GetAllSceneObjects(bool includeI...
    method GetObjectAndDescendants (line 318) | private static IEnumerable<GameObject> GetObjectAndDescendants(GameObj...
    method FindComponentType (line 340) | public static Type FindComponentType(string typeName)
    method MatchesPath (line 348) | internal static bool MatchesPath(GameObject go, string path)
    method GetGameObjectPath (line 360) | public static string GetGameObjectPath(GameObject obj)

FILE: MCPForUnity/Editor/Helpers/GameObjectSerializer.cs
  class GameObjectSerializer (line 17) | public static class GameObjectSerializer
    method GetGameObjectData (line 24) | public static object GetGameObjectData(GameObject go)
    class CachedMetadata (line 102) | private class CachedMetadata
      method CachedMetadata (line 107) | public CachedMetadata(List<PropertyInfo> properties, List<FieldInfo>...
    method IsOrDerivedFrom (line 121) | private static bool IsOrDerivedFrom(Type type, string baseTypeFullName)
    method SerializeAssetReference (line 140) | private static Dictionary<string, object> SerializeAssetReference(Unit...
    method GetComponentData (line 164) | public static object GetComponentData(Component c, bool includeNonPubl...
    method AddSerializableValue (line 547) | private static void AddSerializableValue(Dictionary<string, object> di...
    method ConvertJTokenToPlainObject (line 575) | private static object ConvertJTokenToPlainObject(JToken token)
    method CreateTokenFromValue (line 652) | private static JToken CreateTokenFromValue(object value, Type type)

FILE: MCPForUnity/Editor/Helpers/HttpEndpointUtility.cs
  class HttpEndpointUtility (line 18) | public static class HttpEndpointUtility
    method GetBaseUrl (line 29) | public static string GetBaseUrl()
    method SaveBaseUrl (line 37) | public static void SaveBaseUrl(string userValue)
    method GetLocalBaseUrl (line 52) | public static string GetLocalBaseUrl()
    method SaveLocalBaseUrl (line 61) | public static void SaveLocalBaseUrl(string userValue)
    method GetRemoteBaseUrl (line 71) | public static string GetRemoteBaseUrl()
    method SaveRemoteBaseUrl (line 84) | public static void SaveRemoteBaseUrl(string userValue)
    method GetMcpRpcUrl (line 98) | public static string GetMcpRpcUrl()
    method GetLocalMcpRpcUrl (line 106) | public static string GetLocalMcpRpcUrl()
    method GetRemoteMcpRpcUrl (line 115) | public static string GetRemoteMcpRpcUrl()
    method GetRegisterToolsUrl (line 124) | public static string GetRegisterToolsUrl()
    method IsRemoteScope (line 132) | public static bool IsRemoteScope()
    method GetCurrentServerTransport (line 143) | public static ConfiguredTransport GetCurrentServerTransport()
    method AllowLanHttpBind (line 154) | public static bool AllowLanHttpBind()
    method AllowInsecureRemoteHttp (line 163) | public static bool AllowInsecureRemoteHttp()
    method IsLoopbackHost (line 171) | public static bool IsLoopbackHost(string host)
    method IsBindAllInterfacesHost (line 195) | public static bool IsBindAllInterfacesHost(string host)
    method IsHttpLocalUrlAllowedForLaunch (line 215) | public static bool IsHttpLocalUrlAllowedForLaunch(string url, out stri...
    method IsRemoteUrlAllowed (line 256) | public static bool IsRemoteUrlAllowed(string remoteBaseUrl, out string...
    method IsCurrentRemoteUrlAllowed (line 294) | public static bool IsCurrentRemoteUrlAllowed(out string error)
    method GetHttpLocalHostRequirementText (line 302) | public static string GetHttpLocalHostRequirementText()
    method NormalizeBaseUrl (line 312) | private static string NormalizeBaseUrl(string value, string defaultUrl...
    method AppendPathSegment (line 342) | private static string AppendPathSegment(string baseUrl, string segment)

FILE: MCPForUnity/Editor/Helpers/MaterialOps.cs
  class MaterialOps (line 12) | public static class MaterialOps
    method ApplyProperties (line 17) | public static bool ApplyProperties(Material mat, JObject properties, J...
    method ResolvePropertyName (line 160) | public static string ResolvePropertyName(Material mat, string name)
    method GetMainColorPropertyName (line 189) | public static string GetMainColorPropertyName(Material mat)
    method TrySetShaderProperty (line 207) | public static bool TrySetShaderProperty(Material material, string prop...
    method ParseColor (line 345) | public static Color ParseColor(JToken token, JsonSerializer serializer)

FILE: MCPForUnity/Editor/Helpers/McpConfigurationHelper.cs
  class McpConfigurationHelper (line 22) | public static class McpConfigurationHelper
    method WriteMcpConfiguration (line 30) | public static string WriteMcpConfiguration(string configPath, McpClien...
    method ConfigureCodexClient (line 122) | public static string ConfigureCodexClient(string configPath, McpClient...
    method GetClientConfigPath (line 169) | public static string GetClientConfigPath(McpClient mcpClient)
    method EnsureConfigDirectoryExists (line 194) | public static void EnsureConfigDirectoryExists(string configPath)
    method ExtractUvxUrl (line 199) | public static string ExtractUvxUrl(string[] args)
    method PathsEqual (line 212) | public static bool PathsEqual(string a, string b)
    method WriteAtomicFile (line 231) | public static void WriteAtomicFile(string path, string contents)

FILE: MCPForUnity/Editor/Helpers/McpJobStateStore.cs
  class McpJobStateStore (line 12) | public static class McpJobStateStore
    method GetStatePath (line 14) | private static string GetStatePath(string toolName)
    method SaveState (line 26) | public static void SaveState<T>(string toolName, T state)
    method LoadState (line 34) | public static T LoadState<T>(string toolName)
    method ClearState (line 53) | public static void ClearState(string toolName)

FILE: MCPForUnity/Editor/Helpers/McpLog.cs
  class McpLog (line 7) | internal static class McpLog
    method IsDebugEnabled (line 16) | private static bool IsDebugEnabled() => _debugEnabled;
    method ReadDebugPreference (line 18) | private static bool ReadDebugPreference()
    method SetDebugLoggingEnabled (line 24) | public static void SetDebugLoggingEnabled(bool enabled)
    method Debug (line 31) | public static void Debug(string message)
    method Info (line 37) | public static void Info(string message, bool always = true)
    method Warn (line 43) | public static void Warn(string message)
    method Error (line 48) | public static void Error(string message)

FILE: MCPForUnity/Editor/Helpers/McpLogRecord.cs
  class McpLogRecord (line 11) | internal static class McpLogRecord
    method Log (line 25) | internal static void Log(string commandType, JObject parameters, strin...
    method RotateAndAppend (line 80) | private static void RotateAndAppend(string path, string line)
    method RotateIfNeeded (line 86) | private static void RotateIfNeeded(string path)

FILE: MCPForUnity/Editor/Helpers/ObjectResolver.cs
  class ObjectResolver (line 13) | public static class ObjectResolver
    method Resolve (line 21) | public static T Resolve<T>(JObject instruction) where T : UnityEngine....
    method Resolve (line 32) | public static UnityEngine.Object Resolve(JObject instruction, Type tar...
    method ResolveGameObject (line 110) | public static GameObject ResolveGameObject(JToken target, string searc...
    method ResolveMaterial (line 134) | public static Material ResolveMaterial(string pathOrName)
    method ResolveTexture (line 146) | public static Texture ResolveTexture(string pathOrName)
    method IsAssetType (line 157) | private static bool IsAssetType(Type type)
    method TryLoadAsset (line 170) | private static UnityEngine.Object TryLoadAsset(string findTerm, Type t...

FILE: MCPForUnity/Editor/Helpers/Pagination.cs
  class PaginationRequest (line 11) | public class PaginationRequest
    method FromParams (line 28) | public static PaginationRequest FromParams(JObject @params, int defaul...
  class PaginationResponse (line 73) | public class PaginationResponse<T>
    method Create (line 117) | public static PaginationResponse<T> Create(IList<T> allItems, Paginati...

FILE: MCPForUnity/Editor/Helpers/ParamCoercion.cs
  class ParamCoercion (line 11) | public static class ParamCoercion
    method CoerceInt (line 19) | public static int CoerceInt(JToken token, int defaultValue)
    method CoerceLong (line 50) | public static long CoerceLong(JToken token, long defaultValue)
    method CoerceIntNullable (line 84) | public static int? CoerceIntNullable(JToken token)
    method CoerceBool (line 118) | public static bool CoerceBool(JToken token, bool defaultValue)
    method CoerceBoolNullable (line 155) | public static bool? CoerceBoolNullable(JToken token)
    method CoerceFloat (line 192) | public static float CoerceFloat(JToken token, float defaultValue)
    method CoerceFloatNullable (line 223) | public static float? CoerceFloatNullable(JToken token)
    method CoerceString (line 254) | public static string CoerceString(JToken token, string defaultValue = ...
    method CoerceEnum (line 270) | public static T CoerceEnum<T>(JToken token, T defaultValue) where T : ...
    method IsNumericToken (line 298) | public static bool IsNumericToken(JToken token)
    method ValidateNumericField (line 311) | public static bool ValidateNumericField(JObject obj, string fieldName,...
    method ValidateIntegerField (line 335) | public static bool ValidateIntegerField(JObject obj, string fieldName,...
    method NormalizePropertyName (line 362) | public static string NormalizePropertyName(string input)

FILE: MCPForUnity/Editor/Helpers/PortManager.cs
  class PortManager (line 18) | public static class PortManager
    method IsDebugEnabled (line 20) | private static bool IsDebugEnabled()
    class PortConfig (line 30) | [Serializable]
    method GetPortWithFallback (line 42) | public static int GetPortWithFallback()
    method DiscoverNewPort (line 59) | public static int DiscoverNewPort()
    method SetPreferredPort (line 71) | public static int SetPreferredPort(int port)
    method FindAvailablePort (line 91) | private static int FindAvailablePort()
    method IsPortAvailable (line 120) | public static bool IsPortAvailable(int port)
    method IsPortUsedByMCPForUnity (line 148) | public static bool IsPortUsedByMCPForUnity(int port)
    method WaitForPortRelease (line 173) | private static bool WaitForPortRelease(int port, int timeoutMs)
    method SavePort (line 201) | private static void SavePort(int port)
    method LoadStoredPort (line 235) | private static int LoadStoredPort()
    method GetStoredPortConfig (line 268) | public static PortConfig GetStoredPortConfig()
    method GetRegistryDirectory (line 295) | private static string GetRegistryDirectory()
    method GetRegistryFilePath (line 300) | private static string GetRegistryFilePath()
    method ComputeProjectHash (line 308) | private static string ComputeProjectHash(string input)

FILE: MCPForUnity/Editor/Helpers/PrefabUtilityHelper.cs
  class PrefabUtilityHelper (line 11) | public static class PrefabUtilityHelper
    method GetPrefabGUID (line 18) | public static string GetPrefabGUID(string assetPath)
    method GetVariantInfo (line 41) | public static (bool isVariant, string parentPath, string parentGuid) G...
    method GetComponentTypeNames (line 79) | public static List<string> GetComponentTypeNames(GameObject obj)
    method CountChildrenRecursive (line 112) | public static int CountChildrenRecursive(Transform transform)
    method GetNestedPrefabPath (line 132) | public static string GetNestedPrefabPath(GameObject gameObject)
    method GetPrefabNestingDepth (line 163) | public static int GetPrefabNestingDepth(GameObject gameObject, Transfo...
    method GetParentPrefabPath (line 199) | public static string GetParentPrefabPath(GameObject gameObject, Transf...

FILE: MCPForUnity/Editor/Helpers/ProjectIdentityUtility.cs
  class ProjectIdentityUtility (line 15) | [InitializeOnLoad]
    method ProjectIdentityUtility (line 25) | static ProjectIdentityUtility()
    method ScheduleCacheRefresh (line 31) | private static void ScheduleCacheRefresh()
    method CacheIdentityOnMainThread (line 42) | private static void CacheIdentityOnMainThread()
    method UpdateIdentityCache (line 49) | private static void UpdateIdentityCache()
    method GetProjectHash (line 72) | public static string GetProjectHash()
    method GetProjectName (line 82) | public static string GetProjectName()
    method ComputeProjectHash (line 88) | private static string ComputeProjectHash(string dataPath)
    method ComputeProjectName (line 108) | private static string ComputeProjectName(string dataPath)
    method SetSessionId (line 132) | public static void SetSessionId(string sessionId)
    method GetOrCreateSessionId (line 158) | public static string GetOrCreateSessionId()
    method ResetSessionId (line 189) | public static void ResetSessionId()
    method EnsureIdentityCache (line 216) | private static void EnsureIdentityCache()
    method TryComputeFallbackProjectHash (line 240) | private static string TryComputeFallbackProjectHash()

FILE: MCPForUnity/Editor/Helpers/PropertyConversion.cs
  class PropertyConversion (line 14) | public static class PropertyConversion
    method ConvertToType (line 22) | public static object ConvertToType(JToken token, Type targetType)
    method TryConvertToType (line 50) | public static object TryConvertToType(JToken token, Type targetType)
    method ConvertTo (line 65) | public static T ConvertTo<T>(JToken token)
    method LoadAssetFromToken (line 76) | public static UnityEngine.Object LoadAssetFromToken(JToken token, Type...

FILE: MCPForUnity/Editor/Helpers/RenderPipelineUtility.cs
  class RenderPipelineUtility (line 9) | internal static class RenderPipelineUtility
    type PipelineKind (line 11) | internal enum PipelineKind
    type VFXComponentType (line 19) | internal enum VFXComponentType
    method GetActivePipeline (line 42) | internal static PipelineKind GetActivePipeline()
    method ResolveShader (line 66) | internal static Shader ResolveShader(string requestedNameOrAlias)
    method ResolveDefaultLitShader (line 102) | internal static Shader ResolveDefaultLitShader(PipelineKind pipeline)
    method ResolveDefaultUnlitShader (line 113) | internal static Shader ResolveDefaultUnlitShader(PipelineKind pipeline)
    method ResolveAlias (line 124) | private static Shader ResolveAlias(string alias, PipelineKind pipeline)
    method TryFindShader (line 157) | private static Shader TryFindShader(params string[] shaderNames)
    method WarnIfPipelineMismatch (line 170) | private static void WarnIfPipelineMismatch(string shaderName, Pipeline...
    method IsMaterialInvalidForActivePipeline (line 214) | internal static bool IsMaterialInvalidForActivePipeline(Material mater...
    method IsErrorShader (line 246) | private static bool IsErrorShader(Shader shader)
    method IsPipelineMismatch (line 262) | private static bool IsPipelineMismatch(string shaderName, PipelineKind...
    method GetOrCreateDefaultVFXMaterial (line 284) | internal static Material GetOrCreateDefaultVFXMaterial(VFXComponentTyp...
    method ResolveDefaultVFXShader (line 361) | private static Shader ResolveDefaultVFXShader(PipelineKind pipeline, V...
    method LooksLikeBuiltInShader (line 381) | private static bool LooksLikeBuiltInShader(string lowerName, bool shad...
    method GetOrCreateDefaultSceneMaterial (line 406) | internal static Material GetOrCreateDefaultSceneMaterial()

FILE: MCPForUnity/Editor/Helpers/RendererHelpers.cs
  class RendererHelpers (line 13) | public static class RendererHelpers
    type EnsureMaterialResult (line 15) | public readonly struct EnsureMaterialResult
      method EnsureMaterialResult (line 17) | public EnsureMaterialResult(bool materialReplaced, string replacemen...
    method EnsureMaterial (line 32) | public static EnsureMaterialResult EnsureMaterial(Renderer renderer)
    method IsUsableMaterial (line 70) | private static bool IsUsableMaterial(Material material)
    method ResolveReplacementMaterial (line 92) | private static Material ResolveReplacementMaterial(Renderer renderer)
    method ApplyCommonRendererProperties (line 113) | public static void ApplyCommonRendererProperties(Renderer renderer, JO...
    method GetCommonRendererInfo (line 143) | public static object GetCommonRendererInfo(Renderer renderer)
    method ApplyWidthProperties (line 168) | public static void ApplyWidthProperties(JObject @params, List<string> ...
    method ApplyColorProperties (line 197) | public static void ApplyColorProperties(JObject @params, List<string> ...
    method SetRendererMaterial (line 224) | public static object SetRendererMaterial(Renderer renderer, JObject @p...
    method ApplyLineTrailProperties (line 280) | public static void ApplyLineTrailProperties(JObject @params, List<stri...
    method SetSensibleParticleDefaults (line 301) | public static void SetSensibleParticleDefaults(ParticleSystem ps)

FILE: MCPForUnity/Editor/Helpers/Response.cs
  type IMcpResponse (line 5) | public interface IMcpResponse
  class SuccessResponse (line 11) | public sealed class SuccessResponse : IMcpResponse
    method SuccessResponse (line 28) | public SuccessResponse(string message, object data = null)
  class ErrorResponse (line 35) | public sealed class ErrorResponse : IMcpResponse
    method ErrorResponse (line 61) | public ErrorResponse(string messageOrCode, object data = null)
  class PendingResponse (line 69) | public sealed class PendingResponse : IMcpResponse
    method PendingResponse (line 101) | public PendingResponse(string message = "", double pollIntervalSeconds...

FILE: MCPForUnity/Editor/Helpers/StringCaseUtility.cs
  class StringCaseUtility (line 12) | public static class StringCaseUtility
    method IsBuiltInMcpType (line 19) | public static bool IsBuiltInMcpType(Type type, string assemblyName, st...
    method ToSnakeCase (line 42) | public static string ToSnakeCase(string str)
    method ToCamelCase (line 56) | public static string ToCamelCase(string str)

FILE: MCPForUnity/Editor/Helpers/TelemetryHelper.cs
  class TelemetryHelper (line 14) | public static class TelemetryHelper
    method GetCustomerUUID (line 58) | public static string GetCustomerUUID()
    method DisableTelemetry (line 72) | public static void DisableTelemetry()
    method EnableTelemetry (line 80) | public static void EnableTelemetry()
    method RecordEvent (line 89) | public static void RecordEvent(string eventType, Dictionary<string, ob...
    method RegisterTelemetrySender (line 128) | public static void RegisterTelemetrySender(Action<Dictionary<string, o...
    method UnregisterTelemetrySender (line 133) | public static void UnregisterTelemetrySender()
    method RecordBridgeStartup (line 141) | public static void RecordBridgeStartup()
    method RecordBridgeConnection (line 153) | public static void RecordBridgeConnection(bool success, string error =...
    method RecordToolExecution (line 171) | public static void RecordToolExecution(string toolName, bool success, ...
    method SendTelemetryToMcpServer (line 188) | private static void SendTelemetryToMcpServer(Dictionary<string, object...
    method IsDebugEnabled (line 214) | private static bool IsDebugEnabled()

FILE: MCPForUnity/Editor/Helpers/TextureOps.cs
  class TextureOps (line 9) | public static class TextureOps
    method EncodeTexture (line 11) | public static byte[] EncodeTexture(Texture2D texture, string assetPath)
    method FillTexture (line 36) | public static void FillTexture(Texture2D texture, Color32 color)
    method ParseColor32 (line 49) | public static Color32 ParseColor32(JArray colorArray)
    method ParsePalette (line 62) | public static List<Color32> ParsePalette(JArray paletteArray)
    method ApplyPixelData (line 78) | public static void ApplyPixelData(Texture2D texture, JToken pixelsToke...
    method ApplyPixelDataToRegion (line 83) | public static void ApplyPixelDataToRegion(Texture2D texture, JToken pi...

FILE: MCPForUnity/Editor/Helpers/ToolParams.cs
  class ToolParams (line 12) | public class ToolParams
    method ToolParams (line 16) | public ToolParams(JObject @params)
    method GetRequired (line 24) | public Result<string> GetRequired(string key, string errorMessage = null)
    method Get (line 40) | public string Get(string key, string defaultValue = null)
    method GetInt (line 48) | public int? GetInt(string key, int? defaultValue = null)
    method GetBool (line 59) | public bool GetBool(string key, bool defaultValue = false)
    method GetFloat (line 67) | public float? GetFloat(string key, float? defaultValue = null)
    method Has (line 78) | public bool Has(string key)
    method GetRaw (line 87) | public JToken GetRaw(string key)
    method GetStringArray (line 97) | public string[] GetStringArray(string key)
    method CoerceStringArray (line 106) | internal static string[] CoerceStringArray(JToken token)
    method GetToken (line 169) | private JToken GetToken(string key)
    method GetString (line 193) | private string GetString(string key)
    method ToSnakeCase (line 217) | private static string ToSnakeCase(string str) => StringCaseUtility.ToS...
    method ToCamelCase (line 219) | private static string ToCamelCase(string str) => StringCaseUtility.ToC...
  class Result (line 225) | public class Result<T>
    method Result (line 231) | private Result(bool isSuccess, T value, string errorMessage)
    method Success (line 238) | public static Result<T> Success(T value) => new Result<T>(true, value,...
    method Error (line 239) | public static Result<T> Error(string errorMessage) => new Result<T>(fa...
    method GetOrError (line 244) | public object GetOrError(out T value)

FILE: MCPForUnity/Editor/Helpers/UnityJsonSerializer.cs
  class UnityJsonSerializer (line 11) | public static class UnityJsonSerializer

FILE: MCPForUnity/Editor/Helpers/UnityTypeResolver.cs
  class UnityTypeResolver (line 18) | public static class UnityTypeResolver
    method TryResolve (line 32) | public static bool TryResolve(string typeName, out Type type, out stri...
    method ResolveComponent (line 103) | public static Type ResolveComponent(string typeName)
    method ResolveScriptableObject (line 113) | public static Type ResolveScriptableObject(string typeName)
    method ResolveAny (line 123) | public static Type ResolveAny(string typeName)
    method PassesConstraint (line 132) | private static bool PassesConstraint(Type type, Type requiredBaseType)
    method NamesMatch (line 139) | private static bool NamesMatch(Type t, string query) =>
    method Cache (line 143) | private static void Cache(Type t)
    method FindCandidates (line 150) | private static List<Type> FindCandidates(string query, Type requiredBa...
    method SafeGetTypes (line 187) | private static IEnumerable<Type> SafeGetTypes(System.Reflection.Assemb...
    method PreferPlayer (line 194) | private static IEnumerable<Type> PreferPlayer(IEnumerable<Type> types)
    method FormatAmbiguityError (line 209) | private static string FormatAmbiguityError(string query, List<Type> ca...

FILE: MCPForUnity/Editor/Helpers/VectorParsing.cs
  class VectorParsing (line 12) | public static class VectorParsing
    method ParseVector3 (line 19) | public static Vector3? ParseVector3(JToken token)
    method ParseVector3OrDefault (line 57) | public static Vector3 ParseVector3OrDefault(JToken token, Vector3 defa...
    method ParseVector2 (line 67) | public static Vector2? ParseVector2(JToken token)
    method ParseVector4 (line 105) | public static Vector4? ParseVector4(JToken token)
    method ParseQuaternion (line 152) | public static Quaternion? ParseQuaternion(JToken token, bool asEulerAn...
    method ParseColor (line 221) | public static Color? ParseColor(JToken token)
    method ParseColorOrDefault (line 274) | public static Color ParseColorOrDefault(JToken token) => ParseColor(to...
    method ParseColorOrDefault (line 279) | public static Color ParseColorOrDefault(JToken token, Color defaultVal...
    method ParseVector4OrDefault (line 285) | public static Vector4 ParseVector4OrDefault(JToken token, Vector4 defa...
    method ParseGradient (line 299) | public static Gradient ParseGradient(JToken token)
    method ParseGradientOrDefault (line 378) | public static Gradient ParseGradientOrDefault(JToken token)
    method ParseAnimationCurve (line 415) | public static AnimationCurve ParseAnimationCurve(JToken token)
    method ParseAnimationCurveOrDefault (line 471) | public static AnimationCurve ParseAnimationCurveOrDefault(JToken token...
    method ValidateAnimationCurveFormat (line 490) | public static bool ValidateAnimationCurveFormat(JToken valueToken, out...
    method ValidateQuaternionFormat (line 571) | public static bool ValidateQuaternionFormat(JToken valueToken, out str...
    method ParseRect (line 666) | public static Rect? ParseRect(JToken token)
    method ParseBounds (line 708) | public static Bounds? ParseBounds(JToken token)

FILE: MCPForUnity/Editor/McpCiBoot.cs
  class McpCiBoot (line 8) | public static class McpCiBoot
    method StartStdioForCi (line 10) | public static void StartStdioForCi()

FILE: MCPForUnity/Editor/MenuItems/MCPForUnityMenu.cs
  class MCPForUnityMenu (line 8) | public static class MCPForUnityMenu
    method ToggleMCPWindow (line 10) | [MenuItem("Window/MCP For Unity/Toggle MCP Window %#m", priority = 1)]
    method ShowSetupWindow (line 23) | [MenuItem("Window/MCP For Unity/Local Setup Window", priority = 2)]
    method ShowEditorPrefsWindow (line 30) | [MenuItem("Window/MCP For Unity/Edit EditorPrefs", priority = 3)]

FILE: MCPForUnity/Editor/Migrations/LegacyServerSrcMigration.cs
  class LegacyServerSrcMigration (line 13) | [InitializeOnLoad]
    method LegacyServerSrcMigration (line 19) | static LegacyServerSrcMigration()
    method RunMigrationIfNeeded (line 27) | private static void RunMigrationIfNeeded()

FILE: MCPForUnity/Editor/Migrations/StdIoVersionMigration.cs
  class StdIoVersionMigration (line 18) | [InitializeOnLoad]
    method StdIoVersionMigration (line 23) | static StdIoVersionMigration()
    method RunMigrationIfNeeded (line 31) | private static void RunMigrationIfNeeded()
    method ConfigUsesStdIo (line 115) | private static bool ConfigUsesStdIo(McpClient client)
    method JsonConfigUsesStdIo (line 120) | private static bool JsonConfigUsesStdIo(McpClient client)

FILE: MCPForUnity/Editor/Models/Command.cs
  class Command (line 8) | public class Command

FILE: MCPForUnity/Editor/Models/MCPConfigServer.cs
  class McpConfigServer (line 6) | [Serializable]

FILE: MCPForUnity/Editor/Models/MCPConfigServers.cs
  class McpConfigServers (line 6) | [Serializable]

FILE: MCPForUnity/Editor/Models/McpClient.cs
  class McpClient (line 5) | public class McpClient
    method GetStatusDisplayString (line 24) | public string GetStatusDisplayString()
    method SetStatus (line 44) | public void SetStatus(McpStatus newStatus, string errorDetails = null)

FILE: MCPForUnity/Editor/Models/McpConfig.cs
  class McpConfig (line 6) | [Serializable]

FILE: MCPForUnity/Editor/Models/McpStatus.cs
  type McpStatus (line 4) | public enum McpStatus
  type ConfiguredTransport (line 23) | public enum ConfiguredTransport

FILE: MCPForUnity/Editor/Resources/Editor/ActiveTool.cs
  class ActiveTool (line 11) | [McpForUnityResource("get_active_tool")]
    method HandleCommand (line 14) | public static object HandleCommand(JObject @params)
  class EditorTools (line 53) | internal static class EditorTools
    method GetActiveToolName (line 55) | public static string GetActiveToolName()

FILE: MCPForUnity/Editor/Resources/Editor/EditorState.cs
  class EditorState (line 11) | [McpForUnityResource("get_editor_state")]
    method HandleCommand (line 14) | public static object HandleCommand(JObject @params)

FILE: MCPForUnity/Editor/Resources/Editor/Selection.cs
  class Selection (line 12) | [McpForUnityResource("get_selection")]
    method HandleCommand (line 15) | public static object HandleCommand(JObject @params)

FILE: MCPForUnity/Editor/Resources/Editor/ToolStates.cs
  class ToolStates (line 13) | [McpForUnityResource("get_tool_states")]
    method HandleCommand (line 16) | public static object HandleCommand(JObject @params)

FILE: MCPForUnity/Editor/Resources/Editor/Windows.cs
  class Windows (line 13) | [McpForUnityResource("get_windows")]
    method HandleCommand (line 16) | public static object HandleCommand(JObject @params)

FILE: MCPForUnity/Editor/Resources/McpForUnityResourceAttribute.cs
  class McpForUnityResourceAttribute (line 9) | [AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
    method McpForUnityResourceAttribute (line 28) | public McpForUnityResourceAttribute()
    method McpForUnityResourceAttribute (line 37) | public McpForUnityResourceAttribute(string resourceName)

FILE: MCPForUnity/Editor/Resources/MenuItems/GetMenuItems.cs
  class GetMenuItems (line 13) | [McpForUnityResource("get_menu_items")]
    method BuildCache (line 18) | [InitializeOnLoadMethod]
    method HandleCommand (line 21) | public static object HandleCommand(JObject @params)
    method GetMenuItemsInternal (line 39) | internal static List<string> GetMenuItemsInternal(bool forceRefresh)
    method Refresh (line 49) | private static void Refresh()

FILE: MCPForUnity/Editor/Resources/Project/Layers.cs
  class Layers (line 12) | [McpForUnityResource("get_layers")]
    method HandleCommand (line 17) | public static object HandleCommand(JObject @params)

FILE: MCPForUnity/Editor/Resources/Project/ProjectInfo.cs
  class ProjectInfo (line 15) | [McpForUnityResource("get_project_info")]
    method HandleCommand (line 18) | public static object HandleCommand(JObject @params)
    method GetActiveInputHandler (line 58) | private static string GetActiveInputHandler()
    method IsPackageInstalled (line 84) | private static bool IsPackageInstalled(string packageName)

FILE: MCPForUnity/Editor/Resources/Project/Tags.cs
  class Tags (line 11) | [McpForUnityResource("get_tags")]
    method HandleCommand (line 14) | public static object HandleCommand(JObject @params)

FILE: MCPForUnity/Editor/Resources/Scene/CamerasResource.cs
  class CamerasResource (line 11) | [McpForUnityResource("get_cameras")]
    method HandleCommand (line 14) | public static object HandleCommand(JObject @params)

FILE: MCPForUnity/Editor/Resources/Scene/GameObjectResource.cs
  class GameObjectResource (line 17) | [McpForUnityResource("get_gameobject")]
    method HandleCommand (line 20) | public static object HandleCommand(JObject @params)
    method SerializeGameObject (line 70) | public static object SerializeGameObject(GameObject go)
    method SerializeVector3 (line 116) | private static object SerializeVector3(Vector3 v)
  class GameObjectComponentsResource (line 127) | [McpForUnityResource("get_gameobject_components")]
    method HandleCommand (line 130) | public static object HandleCommand(JObject @params)
  class GameObjectComponentResource (line 213) | [McpForUnityResource("get_gameobject_component")]
    method HandleCommand (line 216) | public static object HandleCommand(JObject @params)

FILE: MCPForUnity/Editor/Resources/Scene/RendererFeaturesResource.cs
  class RendererFeaturesResource (line 8) | [McpForUnityResource("get_renderer_features")]
    method HandleCommand (line 11) | public static object HandleCommand(JObject @params)

FILE: MCPForUnity/Editor/Resources/Scene/RenderingStatsResource.cs
  class RenderingStatsResource (line 8) | [McpForUnityResource("get_rendering_stats")]
    method HandleCommand (line 11) | public static object HandleCommand(JObject @params)

FILE: MCPForUnity/Editor/Resources/Scene/VolumesResource.cs
  class VolumesResource (line 8) | [McpForUnityResource("get_volumes")]
    method HandleCommand (line 11) | public static object HandleCommand(JObject @params)

FILE: MCPForUnity/Editor/Resources/Tests/GetTests.cs
  class GetTests (line 23) | [McpForUnityResource("get_tests")]
    method HandleCommand (line 29) | public static async Task<object> HandleCommand(JObject @params)
  class GetTestsForMode (line 111) | [McpForUnityResource("get_tests_for_mode")]
    method HandleCommand (line 117) | public static async Task<object> HandleCommand(JObject @params)
  class ModeParser (line 188) | internal static class ModeParser
    method TryParse (line 190) | internal static bool TryParse(string modeStr, out TestMode? mode, out ...

FILE: MCPForUnity/Editor/Services/BridgeControlService.cs
  class BridgeControlService (line 15) | public class BridgeControlService : IBridgeControlService
    method BridgeControlService (line 20) | public BridgeControlService()
    method ResolvePreferredMode (line 25) | private TransportMode ResolvePreferredMode()
    method BuildVerificationResult (line 32) | private static BridgeVerificationResult BuildVerificationResult(Transp...
    method StartAsync (line 80) | public async Task<bool> StartAsync()
    method StopAsync (line 117) | public async Task StopAsync()
    method VerifyAsync (line 130) | public async Task<BridgeVerificationResult> VerifyAsync()
    method Verify (line 138) | public BridgeVerificationResult Verify(int port)

FILE: MCPForUnity/Editor/Services/ClientConfigurationService.cs
  class ClientConfigurationService (line 13) | public class ClientConfigurationService : IClientConfigurationService
    method ClientConfigurationService (line 17) | public ClientConfigurationService()
    method GetAllClients (line 22) | public IReadOnlyList<IMcpClientConfigurator> GetAllClients() => config...
    method ConfigureClient (line 24) | public void ConfigureClient(IMcpClientConfigurator configurator)
    method ConfigureAllDetectedClients (line 36) | public ClientConfigurationSummary ConfigureAllDetectedClients()
    method CheckClientStatus (line 65) | public bool CheckClientStatus(IMcpClientConfigurator configurator, boo...

FILE: MCPForUnity/Editor/Services/EditorConfigurationCache.cs
  class EditorConfigurationCache (line 16) | public class EditorConfigurationCache
    method EditorConfigurationCache (line 120) | private EditorConfigurationCache()
    method Refresh (line 129) | public void Refresh()
    method SetUseHttpTransport (line 146) | public void SetUseHttpTransport(bool value)
    method SetDebugLogs (line 159) | public void SetDebugLogs(bool value)
    method SetDevModeForceServerRefresh (line 172) | public void SetDevModeForceServerRefresh(bool value)
    method SetUvxPathOverride (line 185) | public void SetUvxPathOverride(string value)
    method SetGitUrlOverride (line 199) | public void SetGitUrlOverride(string value)
    method SetHttpBaseUrl (line 213) | public void SetHttpBaseUrl(string value)
    method SetHttpRemoteBaseUrl (line 227) | public void SetHttpRemoteBaseUrl(string value)
    method SetClaudeCliPathOverride (line 241) | public void SetClaudeCliPathOverride(string value)
    method SetHttpTransportScope (line 255) | public void SetHttpTransportScope(string value)
    method SetUnitySocketPort (line 269) | public void SetUnitySocketPort(int value)
    method InvalidateKey (line 283) | public void InvalidateKey(string keyName)

FILE: MCPForUnity/Editor/Services/EditorPrefsWindowService.cs
  class EditorPrefsWindowService (line 11) | public class EditorPrefsWindowService
    method Initialize (line 33) | public static void Initialize()
    method EditorPrefsWindowService (line 41) | private EditorPrefsWindowService()
    method ShowWindow (line 49) | public void ShowWindow()

FILE: MCPForUnity/Editor/Services/EditorStateCache.cs
  class EditorStateCache (line 17) | [InitializeOnLoad]
    class EditorStateSnapshot (line 47) | private sealed class EditorStateSnapshot
    class EditorStateUnity (line 83) | private sealed class EditorStateUnity
    class EditorStateEditor (line 101) | private sealed class EditorStateEditor
    class EditorStatePlayMode (line 113) | private sealed class EditorStatePlayMode
    class EditorStateActiveScene (line 125) | private sealed class EditorStateActiveScene
    class EditorStateActivity (line 137) | private sealed class EditorStateActivity
    class EditorStateCompilation (line 149) | private sealed class EditorStateCompilation
    class EditorStateAssets (line 170) | private sealed class EditorStateAssets
    class EditorStateRefresh (line 191) | private sealed class EditorStateRefresh
    class EditorStateTests (line 203) | private sealed class EditorStateTests
    class EditorStateLastRun (line 224) | private sealed class EditorStateLastRun
    class EditorStateTransport (line 236) | private sealed class EditorStateTransport
    class EditorStateSettings (line 245) | private sealed class EditorStateSettings
    method EditorStateCache (line 251) | static EditorStateCache()
    method OnUpdate (line 281) | private static void OnUpdate()
    method ForceUpdate (line 361) | private static void ForceUpdate(string reason)
    method BuildSnapshot (line 369) | private static JObject BuildSnapshot(string reason)
    method GetSnapshot (line 504) | public static JObject GetSnapshot()
    method GetActualIsCompiling (line 537) | private static bool GetActualIsCompiling()

FILE: MCPForUnity/Editor/Services/HttpAutoStartHandler.cs
  class HttpAutoStartHandler (line 17) | [InitializeOnLoad]
    method HttpAutoStartHandler (line 22) | static HttpAutoStartHandler()
    method OnEditorReady (line 45) | private static void OnEditorReady()
    method AutoStartAsync (line 66) | private static async Task AutoStartAsync()
    method WaitForServerAndConnectAsync (line 113) | private static async Task WaitForServerAndConnectAsync()
    method ConnectBridgeAsync (line 161) | private static async Task ConnectBridgeAsync()

FILE: MCPForUnity/Editor/Services/HttpBridgeReloadHandler.cs
  class HttpBridgeReloadHandler (line 14) | [InitializeOnLoad]
    method HttpBridgeReloadHandler (line 27) | static HttpBridgeReloadHandler()
    method OnBeforeAssemblyReload (line 33) | private static void OnBeforeAssemblyReload()
    method OnAfterAssemblyReload (line 62) | private static void OnAfterAssemblyReload()
    method ResumeHttpWithRetriesAsync (line 109) | private static async Task ResumeHttpWithRetriesAsync()

FILE: MCPForUnity/Editor/Services/IBridgeControlService.cs
  type IBridgeControlService (line 9) | public interface IBridgeControlService
    method StartAsync (line 35) | Task<bool> StartAsync();
    method StopAsync (line 40) | Task StopAsync();
    method Verify (line 47) | BridgeVerificationResult Verify(int port);
    method VerifyAsync (line 53) | Task<BridgeVerificationResult> VerifyAsync();
  class BridgeVerificationResult (line 60) | public class BridgeVerificationResult

FILE: MCPForUnity/Editor/Services/IClientConfigurationService.cs
  type IClientConfigurationService (line 10) | public interface IClientConfigurationService
    method ConfigureClient (line 16) | void ConfigureClient(IMcpClientConfigurator configurator);
    method ConfigureAllDetectedClients (line 22) | ClientConfigurationSummary ConfigureAllDetectedClients();
    method CheckClientStatus (line 30) | bool CheckClientStatus(IMcpClientConfigurator configurator, bool attem...
    method GetAllClients (line 33) | IReadOnlyList<IMcpClientConfigurator> GetAllClients();
  class ClientConfigurationSummary (line 39) | public class ClientConfigurationSummary
    method GetSummaryMessage (line 64) | public string GetSummaryMessage()

FILE: MCPForUnity/Editor/Services/IPackageDeploymentService.cs
  type IPackageDeploymentService (line 5) | public interface IPackageDeploymentService
    method GetStoredSourcePath (line 7) | string GetStoredSourcePath();
    method SetStoredSourcePath (line 8) | void SetStoredSourcePath(string path);
    method ClearStoredSourcePath (line 9) | void ClearStoredSourcePath();
    method GetTargetPath (line 11) | string GetTargetPath();
    method GetTargetDisplayPath (line 12) | string GetTargetDisplayPath();
    method GetLastBackupPath (line 14) | string GetLastBackupPath();
    method HasBackup (line 15) | bool HasBackup();
    method DeployFromStoredSource (line 17) | PackageDeploymentResult DeployFromStoredSource();
    method RestoreLastBackup (line 18) | PackageDeploymentResult RestoreLastBackup();
  class PackageDeploymentResult (line 21) | public class PackageDeploymentResult

FILE: MCPForUnity/Editor/Services/IPackageUpdateService.cs
  type IPackageUpdateService (line 6) | public interface IPackageUpdateService
    method CheckForUpdate (line 13) | UpdateCheckResult CheckForUpdate(string currentVersion);
    method IsNewerVersion (line 21) | bool IsNewerVersion(string version1, string version2);
    method IsGitInstallation (line 27) | bool IsGitInstallation();
    method ClearCache (line 32) | void ClearCache();
  class UpdateCheckResult (line 38) | public class UpdateCheckResult

FILE: MCPForUnity/Editor/Services/IPathResolverService.cs
  type IPathResolverService (line 6) | public interface IPathResolverService
    method GetUvxPath (line 12) | string GetUvxPath();
    method GetClaudeCliPath (line 18) | string GetClaudeCliPath();
    method IsPythonDetected (line 24) | bool IsPythonDetected();
    method IsClaudeCliDetected (line 30) | bool IsClaudeCliDetected();
    method SetUvxPathOverride (line 36) | void SetUvxPathOverride(string path);
    method SetClaudeCliPathOverride (line 42) | void SetClaudeCliPathOverride(string path);
    method ClearUvxPathOverride (line 47) | void ClearUvxPathOverride();
    method ClearClaudeCliPathOverride (line 52) | void ClearClaudeCliPathOverride();
    method TryValidateUvxExecutable (line 75) | bool TryValidateUvxExecutable(string uvPath, out string version);

FILE: MCPForUnity/Editor/Services/IPlatformService.cs
  type IPlatformService (line 6) | public interface IPlatformService
    method IsWindows (line 12) | bool IsWindows();
    method GetSystemRoot (line 18) | string GetSystemRoot();

FILE: MCPForUnity/Editor/Services/IResourceDiscoveryService.cs
  class ResourceMetadata (line 8) | public class ResourceMetadata
  type IResourceDiscoveryService (line 21) | public interface IResourceDiscoveryService
    method DiscoverAllResources (line 26) | List<ResourceMetadata> DiscoverAllResources();
    method GetResourceMetadata (line 31) | ResourceMetadata GetResourceMetadata(string resourceName);
    method GetEnabledResources (line 36) | List<ResourceMetadata> GetEnabledResources();
    method IsResourceEnabled (line 41) | bool IsResourceEnabled(string resourceName);
    method SetResourceEnabled (line 46) | void SetResourceEnabled(string resourceName, bool enabled);
    method InvalidateCache (line 51) | void InvalidateCache();

FILE: MCPForUnity/Editor/Services/IServerManagementService.cs
  type IServerManagementService (line 6) | public interface IServerManagementService
    method ClearUvxCache (line 12) | bool ClearUvxCache();
    method StartLocalHttpServer (line 20) | bool StartLocalHttpServer(bool quiet = false);
    method StopLocalHttpServer (line 25) | bool StopLocalHttpServer();
    method StopManagedLocalHttpServer (line 31) | bool StopManagedLocalHttpServer();
    method IsLocalHttpServerRunning (line 37) | bool IsLocalHttpServerRunning();
    method IsLocalHttpServerReachable (line 43) | bool IsLocalHttpServerReachable();
    method TryGetLocalHttpServerCommand (line 51) | bool TryGetLocalHttpServerCommand(out string command, out string error);
    method IsLocalUrl (line 57) | bool IsLocalUrl();
    method CanStartLocalServer (line 63) | bool CanStartLocalServer();

FILE: MCPForUnity/Editor/Services/ITestRunnerService.cs
  class TestFilterOptions (line 11) | public class TestFilterOptions
  type ITestRunnerService (line 37) | public interface ITestRunnerService
    method GetTestsAsync (line 43) | Task<IReadOnlyList<Dictionary<string, string>>> GetTestsAsync(TestMode...
    method RunTestsAsync (line 50) | Task<TestRunResult> RunTestsAsync(TestMode mode, TestFilterOptions fil...

FILE: MCPForUnity/Editor/Services/IToolDiscoveryService.cs
  class ToolMetadata (line 8) | public class ToolMetadata
  class ParameterMetadata (line 27) | public class ParameterMetadata
  type IToolDiscoveryService (line 39) | public interface IToolDiscoveryService
    method DiscoverAllTools (line 44) | List<ToolMetadata> DiscoverAllTools();
    method GetToolMetadata (line 49) | ToolMetadata GetToolMetadata(string toolName);
    method GetEnabledTools (line 54) | List<ToolMetadata> GetEnabledTools();
    method IsToolEnabled (line 59) | bool IsToolEnabled(string toolName);
    method SetToolEnabled (line 64) | void SetToolEnabled(string toolName, bool enabled);
    method InvalidateCache (line 69) | void InvalidateCache();

FILE: MCPForUnity/Editor/Services/MCPServiceLocator.cs
  class MCPServiceLocator (line 11) | public static class MCPServiceLocator
    method Register (line 42) | public static void Register<T>(T implementation) where T : class
    method Reset (line 71) | public static void Reset()

FILE: MCPForUnity/Editor/Services/McpEditorShutdownCleanup.cs
  class McpEditorShutdownCleanup (line 15) | [InitializeOnLoad]
    method McpEditorShutdownCleanup (line 18) | static McpEditorShutdownCleanup()
    method OnEditorQuitting (line 25) | private static void OnEditorQuitting()

FILE: MCPForUnity/Editor/Services/PackageDeploymentService.cs
  class PackageDeploymentService (line 14) | public class PackageDeploymentService : IPackageDeploymentService
    method GetStoredSourcePath (line 18) | public string GetStoredSourcePath()
    method SetStoredSourcePath (line 23) | public void SetStoredSourcePath(string path)
    method ClearStoredSourcePath (line 29) | public void ClearStoredSourcePath()
    method GetTargetPath (line 34) | public string GetTargetPath()
    method GetTargetDisplayPath (line 69) | public string GetTargetDisplayPath()
    method GetLastBackupPath (line 78) | public string GetLastBackupPath()
    method HasBackup (line 83) | public bool HasBackup()
    method DeployFromStoredSource (line 89) | public PackageDeploymentResult DeployFromStoredSource()
    method RestoreLastBackup (line 140) | public PackageDeploymentResult RestoreLastBackup()
    method CopyCoreFolders (line 179) | private void CopyCoreFolders(string sourceRoot, string targetRoot)
    method ReplaceDirectory (line 188) | private static void ReplaceDirectory(string source, string destination)
    method CreateBackup (line 198) | private string CreateBackup(string targetPath)
    method ValidateSource (line 215) | private static string ValidateSource(string sourcePath, bool throwOnEr...
    method MakeAbsolute (line 254) | private static string MakeAbsolute(string assetPath)
    method GetProjectRoot (line 271) | private static string GetProjectRoot()
    method PathsEqual (line 276) | private static bool PathsEqual(string a, string b)
    method Success (line 283) | private static PackageDeploymentResult Success(string message, string ...
    method Fail (line 295) | private static PackageDeploymentResult Fail(string message)

FILE: MCPForUnity/Editor/Services/PackageJobManager.cs
  type PackageJobStatus (line 12) | internal enum PackageJobStatus { Running, Succeeded, Failed }
  class PackageJob (line 14) | internal sealed class PackageJob
  class PackageJobManager (line 28) | internal static class PackageJobManager
    method PackageJobManager (line 37) | static PackageJobManager()
    class PersistedState (line 42) | private sealed class PersistedState
    class PersistedJob (line 47) | private sealed class PersistedJob
    method ParseStatus (line 61) | private static PackageJobStatus ParseStatus(string status)
    method TryRestoreFromSessionState (line 74) | private static void TryRestoreFromSessionState()
    method TryRecoverJob (line 126) | internal static void TryRecoverJob(PackageJob job, long nowMs)
    method FindPackageInfo (line 182) | private static PackageInfo FindPackageInfo(PackageInfo[] allPackages, ...
    method ExtractPackageName (line 207) | internal static string ExtractPackageName(string packageIdentifier)
    method PersistToSessionState (line 221) | internal static void PersistToSessionState()
    method StartJob (line 257) | public static string StartJob(string operation, string package)
    method CompleteJob (line 284) | public static void CompleteJob(string jobId, bool success, string erro...
    method GetJob (line 303) | public static PackageJob GetJob(string jobId)
    method GetLatestJob (line 315) | public static PackageJob GetLatestJob()
    method ToSerializable (line 325) | public static object ToSerializable(PackageJob job)

FILE: MCPForUnity/Editor/Services/PackageUpdateService.cs
  class PackageUpdateService (line 15) | public class PackageUpdateService : IPackageUpdateService
    method CheckForUpdate (line 28) | public UpdateCheckResult CheckForUpdate(string currentVersion)
    method IsNewerVersion (line 85) | public bool IsNewerVersion(string version1, string version2)
    method CompareVersions (line 95) | private static int CompareVersions(ParsedVersion left, ParsedVersion r...
    method GetPrereleaseRank (line 120) | private static int GetPrereleaseRank(string label)
    method TryParseVersion (line 145) | private static bool TryParseVersion(string version, out ParsedVersion ...
    method IsPreReleaseVersion (line 189) | private static bool IsPreReleaseVersion(string version)
    method GetGitUpdateBranch (line 199) | private static string GetGitUpdateBranch(string currentVersion)
    method IsGitInstallation (line 225) | public virtual bool IsGitInstallation()
    method ClearCache (line 242) | public void ClearCache()
    method FetchLatestVersionFromGitHub (line 255) | protected virtual string FetchLatestVersionFromGitHub(string branch)
    type ParsedVersion (line 290) | private struct ParsedVersion
    method FetchLatestVersionFromAssetStoreJson (line 303) | protected virtual string FetchLatestVersionFromAssetStoreJson()

FILE: MCPForUnity/Editor/Services/PathResolverService.cs
  class PathResolverService (line 17) | public class PathResolverService : IPathResolverService
    method GetUvxPath (line 25) | public string GetUvxPath()
    method ResolveUvxFromSystem (line 65) | private static string ResolveUvxFromSystem()
    method GetClaudeCliPath (line 95) | public string GetClaudeCliPath()
    method IsPythonDetected (line 166) | public bool IsPythonDetected()
    method IsClaudeCliDetected (line 177) | public bool IsClaudeCliDetected()
    method SetUvxPathOverride (line 182) | public void SetUvxPathOverride(string path)
    method SetClaudeCliPathOverride (line 198) | public void SetClaudeCliPathOverride(string path)
    method ClearUvxPathOverride (line 214) | public void ClearUvxPathOverride()
    method ClearClaudeCliPathOverride (line 219) | public void ClearClaudeCliPathOverride()
    method TryValidateUvxExecutable (line 230) | public bool TryValidateUvxExecutable(string uvxPath, out string version)
    method FindUvxExecutableInPath (line 286) | private string FindUvxExecutableInPath(string commandName)
    method EnumerateCommandCandidates (line 311) | private static IEnumerable<string> EnumerateCommandCandidates(string c...

FILE: MCPForUnity/Editor/Services/PlatformService.cs
  class PlatformService (line 8) | public class PlatformService : IPlatformService
    method IsWindows (line 14) | public bool IsWindows()
    method GetSystemRoot (line 23) | public string GetSystemRoot()

FILE: MCPForUnity/Editor/Services/ResourceDiscoveryService.cs
  class ResourceDiscoveryService (line 12) | public class ResourceDiscoveryService : IResourceDiscoveryService
    method DiscoverAllResources (line 16) | public List<ResourceMetadata> DiscoverAllResources()
    method GetResourceMetadata (line 60) | public ResourceMetadata GetResourceMetadata(string resourceName)
    method GetEnabledResources (line 75) | public List<ResourceMetadata> GetEnabledResources()
    method IsResourceEnabled (line 82) | public bool IsResourceEnabled(string resourceName)
    method SetResourceEnabled (line 99) | public void SetResourceEnabled(string resourceName, bool enabled)
    method InvalidateCache (line 110) | public void InvalidateCache()
    method ExtractResourceMetadata (line 115) | private ResourceMetadata ExtractResourceMetadata(Type type, McpForUnit...
    method EnsurePreferenceInitialized (line 148) | private void EnsurePreferenceInitialized(ResourceMetadata metadata)
    method GetResourcePreferenceKey (line 162) | private static string GetResourcePreferenceKey(string resourceName)

FILE: MCPForUnity/Editor/Services/Server/IPidFileManager.cs
  type IPidFileManager (line 7) | public interface IPidFileManager
    method GetPidDirectory (line 13) | string GetPidDirectory();
    method GetPidFilePath (line 20) | string GetPidFilePath(int port);
    method TryReadPid (line 28) | bool TryReadPid(string pidFilePath, out int pid);
    method TryGetPortFromPidFilePath (line 36) | bool TryGetPortFromPidFilePath(string pidFilePath, out int port);
    method DeletePidFile (line 42) | void DeletePidFile(string pidFilePath);
    method StoreHandshake (line 49) | void StoreHandshake(string pidFilePath, string instanceToken);
    method TryGetHandshake (line 57) | bool TryGetHandshake(out string pidFilePath, out string instanceToken);
    method StoreTracking (line 65) | void StoreTracking(int pid, int port, string argsHash = null);
    method TryGetStoredPid (line 74) | bool TryGetStoredPid(int expectedPort, out int pid);
    method GetStoredArgsHash (line 80) | string GetStoredArgsHash();
    method ClearTracking (line 85) | void ClearTracking();
    method ComputeShortHash (line 92) | string ComputeShortHash(string input);

FILE: MCPForUnity/Editor/Services/Server/IProcessDetector.cs
  type IProcessDetector (line 10) | public interface IProcessDetector
    method LooksLikeMcpServerProcess (line 18) | bool LooksLikeMcpServerProcess(int pid);
    method TryGetProcessCommandLine (line 26) | bool TryGetProcessCommandLine(int pid, out string argsLower);
    method GetListeningProcessIdsForPort (line 33) | List<int> GetListeningProcessIdsForPort(int port);
    method GetCurrentProcessId (line 39) | int GetCurrentProcessId();
    method ProcessExists (line 46) | bool ProcessExists(int pid);
    method NormalizeForMatch (line 53) | string NormalizeForMatch(string input);

FILE: MCPForUnity/Editor/Services/Server/IProcessTerminator.cs
  type IProcessTerminator (line 7) | public interface IProcessTerminator
    method Terminate (line 16) | bool Terminate(int pid);

FILE: MCPForUnity/Editor/Services/Server/IServerCommandBuilder.cs
  type IServerCommandBuilder (line 7) | public interface IServerCommandBuilder
    method TryBuildCommand (line 17) | bool TryBuildCommand(out string fileName, out string arguments, out st...
    method BuildUvPathFromUvx (line 24) | string BuildUvPathFromUvx(string uvxPath);
    method GetPlatformSpecificPathPrepend (line 30) | string GetPlatformSpecificPathPrepend();
    method QuoteIfNeeded (line 37) | string QuoteIfNeeded(string input);

FILE: MCPForUnity/Editor/Services/Server/ITerminalLauncher.cs
  type ITerminalLauncher (line 9) | public interface ITerminalLauncher
    method CreateTerminalProcessStartInfo (line 17) | ProcessStartInfo CreateTerminalProcessStartInfo(string command);
    method GetProjectRootPath (line 23) | string GetProjectRootPath();

FILE: MCPForUnity/Editor/Services/Server/PidFileManager.cs
  class PidFileManager (line 17) | public class PidFileManager : IPidFileManager
    method GetPidDirectory (line 20) | public string GetPidDirectory()
    method GetPidFilePath (line 26) | public string GetPidFilePath(int port)
    method TryReadPid (line 34) | public bool TryReadPid(string pidFilePath, out int pid)
    method TryGetPortFromPidFilePath (line 68) | public bool TryGetPortFromPidFilePath(string pidFilePath, out int port)
    method DeletePidFile (line 101) | public void DeletePidFile(string pidFilePath)
    method StoreHandshake (line 114) | public void StoreHandshake(string pidFilePath, string instanceToken)
    method TryGetHandshake (line 136) | public bool TryGetHandshake(out string pidFilePath, out string instanc...
    method StoreTracking (line 161) | public void StoreTracking(int pid, int port, string argsHash = null)
    method TryGetStoredPid (line 181) | public bool TryGetStoredPid(int expectedPort, out int pid)
    method GetStoredArgsHash (line 216) | public string GetStoredArgsHash()
    method ClearTracking (line 229) | public void ClearTracking()
    method ComputeShortHash (line 240) | public string ComputeShortHash(string input)
    method GetProjectRootPath (line 262) | private static string GetProjectRootPath()

FILE: MCPForUnity/Editor/Services/Server/ProcessDetector.cs
  class ProcessDetector (line 14) | public class ProcessDetector : IProcessDetector
    method NormalizeForMatch (line 17) | public string NormalizeForMatch(string input)
    method GetCurrentProcessId (line 30) | public int GetCurrentProcessId()
    method ProcessExists (line 37) | public bool ProcessExists(int pid)
    method TryGetProcessCommandLine (line 63) | public bool TryGetProcessCommandLine(int pid, out string argsLower)
    method GetListeningProcessIdsForPort (line 103) | public List<int> GetListeningProcessIdsForPort(int port)
    method LooksLikeMcpServerProcess (line 174) | public bool LooksLikeMcpServerProcess(int pid)

FILE: MCPForUnity/Editor/Services/Server/ProcessTerminator.cs
  class ProcessTerminator (line 11) | public class ProcessTerminator : IProcessTerminator
    method ProcessTerminator (line 19) | public ProcessTerminator(IProcessDetector processDetector)
    method Terminate (line 25) | public bool Terminate(int pid)

FILE: MCPForUnity/Editor/Services/Server/ServerCommandBuilder.cs
  class ServerCommandBuilder (line 16) | public class ServerCommandBuilder : IServerCommandBuilder
    method TryBuildCommand (line 19) | public bool TryBuildCommand(out string fileName, out string arguments,...
    method BuildUvPathFromUvx (line 70) | public string BuildUvPathFromUvx(string uvxPath)
    method GetPlatformSpecificPathPrepend (line 87) | public string GetPlatformSpecificPathPrepend()
    method QuoteIfNeeded (line 126) | public string QuoteIfNeeded(string input)

FILE: MCPForUnity/Editor/Services/Server/TerminalLauncher.cs
  class TerminalLauncher (line 12) | public class TerminalLauncher : ITerminalLauncher
    method GetProjectRootPath (line 15) | public string GetProjectRootPath()
    method CreateTerminalProcessStartInfo (line 29) | public System.Diagnostics.ProcessStartInfo CreateTerminalProcessStartI...

FILE: MCPForUnity/Editor/Services/ServerManagementService.cs
  class ServerManagementService (line 17) | public class ServerManagementService : IServerManagementService
    method ServerManagementService (line 28) | public ServerManagementService() : this(null, null, null, null, null) { }
    method ServerManagementService (line 38) | public ServerManagementService(
    method QuoteIfNeeded (line 52) | private string QuoteIfNeeded(string s)
    method NormalizeForMatch (line 57) | private string NormalizeForMatch(string s)
    method ClearLocalServerPidTracking (line 62) | private void ClearLocalServerPidTracking()
    method StoreLocalHttpServerHandshake (line 67) | private void StoreLocalHttpServerHandshake(string pidFilePath, string ...
    method TryGetLocalHttpServerHandshake (line 72) | private bool TryGetLocalHttpServerHandshake(out string pidFilePath, ou...
    method GetLocalHttpServerPidFilePath (line 77) | private string GetLocalHttpServerPidFilePath(int port)
    method TryReadPidFromPidFile (line 82) | private bool TryReadPidFromPidFile(string pidFilePath, out int pid)
    method TryProcessCommandLineContainsInstanceToken (line 87) | private bool TryProcessCommandLineContainsInstanceToken(int pid, strin...
    method ComputeShortHash (line 121) | private string ComputeShortHash(string input)
    method TryGetStoredLocalServerPid (line 126) | private bool TryGetStoredLocalServerPid(int expectedPort, out int pid)
    method GetStoredArgsHash (line 131) | private string GetStoredArgsHash()
    method ClearUvxCache (line 140) | public bool ClearUvxCache()
    method ExecuteUvCommand (line 190) | private bool ExecuteUvCommand(string uvCommand, string args, out strin...
    method BuildUvPathFromUvx (line 222) | private string BuildUvPathFromUvx(string uvxPath)
    method GetPlatformSpecificPathPrepend (line 227) | private string GetPlatformSpecificPathPrepend()
    method StartLocalHttpServer (line 236) | public bool StartLocalHttpServer(bool quiet = false)
    method StopLocalHttpServer (line 347) | public bool StopLocalHttpServer()
    method StopManagedLocalHttpServer (line 352) | public bool StopManagedLocalHttpServer()
    method IsLocalHttpServerRunning (line 379) | public bool IsLocalHttpServerRunning()
    method IsLocalHttpServerReachable (line 441) | public bool IsLocalHttpServerReachable()
    method TryConnectToLocalPort (line 464) | private static bool TryConnectToLocalPort(string host, int port, int t...
    method BuildLocalProbeHosts (line 495) | private static IReadOnlyList<string> BuildLocalProbeHosts(string host)
    method AddHostCandidate (line 529) | private static void AddHostCandidate(List<string> hosts, string candid...
    method StopLocalHttpServerInternal (line 544) | private bool StopLocalHttpServerInternal(bool quiet, int? portOverride...
    method TryGetUnixProcessArgs (line 839) | private bool TryGetUnixProcessArgs(int pid, out string argsLower)
    method TryGetPortFromPidFilePath (line 844) | private bool TryGetPortFromPidFilePath(string pidFilePath, out int port)
    method DeletePidFile (line 849) | private void DeletePidFile(string pidFilePath)
    method GetListeningProcessIdsForPort (line 854) | private List<int> GetListeningProcessIdsForPort(int port)
    method GetCurrentProcessIdSafe (line 859) | private int GetCurrentProcessIdSafe()
    method LooksLikeMcpServerProcess (line 864) | private bool LooksLikeMcpServerProcess(int pid)
    method TerminateProcess (line 869) | private bool TerminateProcess(int pid)
    method TryGetLocalHttpServerCommand (line 877) | public bool TryGetLocalHttpServerCommand(out string command, out strin...
    method TryGetLocalHttpServerCommandParts (line 891) | private bool TryGetLocalHttpServerCommandParts(out string fileName, ou...
    method IsLocalUrl (line 899) | public bool IsLocalUrl()
    method IsLocalUrl (line 909) | private static bool IsLocalUrl(string url)
    method CanStartLocalServer (line 928) | public bool CanStartLocalServer()
    method CreateTerminalProcessStartInfo (line 940) | private System.Diagnostics.ProcessStartInfo CreateTerminalProcessStart...

FILE: MCPForUnity/Editor/Services/StdioBridgeReloadHandler.cs
  class StdioBridgeReloadHandler (line 16) | [InitializeOnLoad]
    method StdioBridgeReloadHandler (line 31) | static StdioBridgeReloadHandler()
    method CancelRetries (line 38) | private static void CancelRetries()
    method OnBeforeAssemblyReload (line 43) | private static void OnBeforeAssemblyReload()
    method OnAfterAssemblyReload (line 91) | private static void OnAfterAssemblyReload()
    method ResumeStdioWithRetriesAsync (line 139) | private static async Task ResumeStdioWithRetriesAsync()

FILE: MCPForUnity/Editor/Services/TestJobManager.cs
  type TestJobStatus (line 13) | internal enum TestJobStatus
  class TestJobFailure (line 20) | internal sealed class TestJobFailure
  class TestJob (line 26) | internal sealed class TestJob
  class TestJobManager (line 48) | internal static class TestJobManager
    method TestJobManager (line 66) | static TestJobManager()
    method ClearStuckJob (line 93) | public static bool ClearStuckJob()
    class PersistedState (line 120) | private sealed class PersistedState
    class PersistedJob (line 126) | private sealed class PersistedJob
    method ParseStatus (line 144) | private static TestJobStatus ParseStatus(string status)
    method TryRestoreFromSessionState (line 160) | private static void TryRestoreFromSessionState()
    method PersistToSessionState (line 243) | private static void PersistToSessionState(bool force = false)
    method StartJob (line 297) | public static string StartJob(TestMode mode, TestFilterOptions filterO...
    method FinalizeCurrentJobFromRunFinished (line 357) | public static void FinalizeCurrentJobFromRunFinished(TestRunResult res...
    method OnRunStarted (line 380) | public static void OnRunStarted(int? totalTests)
    method OnTestStarted (line 403) | public static void OnTestStarted(string testFullName)
    method OnLeafTestFinished (line 425) | public static void OnLeafTestFinished(string testFullName, bool isFail...
    method OnRunFinished (line 456) | public static void OnRunFinished()
    method GetJob (line 472) | internal static TestJob GetJob(string jobId)
    method ToSerializable (line 519) | internal static object ToSerializable(TestJob job, bool includeDetails...
    method GetBlockedReason (line 559) | private static string GetBlockedReason(TestJob job)
    method IsStuck (line 590) | private static bool IsStuck(TestJob job)
    method BuildFailuresPayload (line 606) | private static object[] BuildFailuresPayload(List<TestJobFailure> fail...
    method FinalizeFromTask (line 622) | private static void FinalizeFromTask(string jobId, Task<TestRunResult>...

FILE: MCPForUnity/Editor/Services/TestRunStatus.cs
  class TestRunStatus (line 10) | internal static class TestRunStatus
    method MarkStarted (line 39) | public static void MarkStarted(TestMode mode)
    method MarkFinished (line 50) | public static void MarkFinished()

FILE: MCPForUnity/Editor/Services/TestRunnerNoThrottle.cs
  class TestRunnerNoThrottle (line 27) | [InitializeOnLoad]
    method TestRunnerNoThrottle (line 42) | static TestRunnerNoThrottle()
    method IsTestRunActive (line 65) | private static bool IsTestRunActive() => SessionState.GetBool(SessionK...
    method SetTestRunActive (line 66) | private static void SetTestRunActive(bool active) => SessionState.SetB...
    method AreSettingsCaptured (line 67) | private static bool AreSettingsCaptured() => SessionState.GetBool(Sess...
    method SetSettingsCaptured (line 68) | private static void SetSettingsCaptured(bool captured) => SessionState...
    method GetPrevIdleTime (line 69) | private static int GetPrevIdleTime() => SessionState.GetInt(SessionKey...
    method SetPrevIdleTime (line 70) | private static void SetPrevIdleTime(int value) => SessionState.SetInt(...
    method GetPrevInteractionMode (line 71) | private static int GetPrevInteractionMode() => SessionState.GetInt(Ses...
    method SetPrevInteractionMode (line 72) | private static void SetPrevInteractionMode(int value) => SessionState....
    method ApplyNoThrottlingPreemptive (line 81) | public static void ApplyNoThrottlingPreemptive()
    method ApplyNoThrottling (line 87) | private static void ApplyNoThrottling()
    method RestoreThrottling (line 104) | private static void RestoreThrottling()
    method ForceEditorToApplyInteractionPrefs (line 117) | private static void ForceEditorToApplyInteractionPrefs()
    class TestCallbacks (line 133) | private sealed class TestCallbacks : ICallbacks
      method RunStarted (line 135) | public void RunStarted(ITestAdaptor testsToRun)
      method RunFinished (line 141) | public void RunFinished(ITestResultAdaptor result)
      method TestStarted (line 146) | public void TestStarted(ITestAdaptor test) { }
      method TestFinished (line 147) | public void TestFinished(ITestResultAdaptor result) { }

FILE: MCPForUnity/Editor/Services/TestRunnerService.cs
  class PlayModeOptionsGuard (line 26) | [InitializeOnLoad]
    method PlayModeOptionsGuard (line 36) | static PlayModeOptionsGuard()
    method Save (line 48) | internal static void Save(bool originalEnabled, EnterPlayModeOptions o...
    method Restore (line 66) | internal static void Restore()
    method Clear (line 79) | internal static void Clear()
    method TryLoad (line 99) | private static bool TryLoad(out bool originalEnabled, out EnterPlayMod...
  class TestRunnerService (line 146) | internal sealed class TestRunnerService : ITestRunnerService, ICallbacks...
    method TestRunnerService (line 155) | public TestRunnerService()
    method GetTestsAsync (line 161) | public async Task<IReadOnlyList<Dictionary<string, string>>> GetTestsA...
    method RunTestsAsync (line 188) | public async Task<TestRunResult> RunTestsAsync(TestMode mode, TestFilt...
    method Dispose (line 281) | public void Dispose()
    method RunStarted (line 302) | public void RunStarted(ITestAdaptor testsToRun)
    method RunFinished (line 321) | public void RunFinished(ITestResultAdaptor result)
    method TestStarted (line 351) | public void TestStarted(ITestAdaptor test)
    method TestFinished (line 369) | public void TestFinished(ITestResultAdaptor result)
    method CountLeafTests (line 416) | private static int CountLeafTests(ITestAdaptor node)
    method EnsurePlayModeRunsWithoutDomainReload (line 445) | private static bool EnsurePlayModeRunsWithoutDomainReload(
    method RestoreEnterPlayModeOptions (line 472) | private static void RestoreEnterPlayModeOptions(bool originalEnabled, ...
    method SaveDirtyScenesIfNeeded (line 479) | private static void SaveDirtyScenesIfNeeded()
    method RetrieveTestRootAsync (line 506) | private async Task<ITestAdaptor> RetrieveTestRootAsync(TestMode mode)
    method CollectFromNode (line 536) | private static void CollectFromNode(
  class TestRunResult (line 593) | public sealed class TestRunResult
    method TestRunResult (line 595) | internal TestRunResult(TestRunSummary summary, IReadOnlyList<TestRunTe...
    method ToSerializable (line 609) | public object ToSerializable(string mode, bool includeDetails = false,...
    method Create (line 639) | internal static TestRunResult Create(ITestResultAdaptor summary, IRead...
  class TestRunSummary (line 667) | public sealed class TestRunSummary
    method TestRunSummary (line 669) | internal TestRunSummary(int total, int passed, int failed, int skipped...
    method ToSerializable (line 686) | internal object ToSerializable()
  class TestRunTestResult (line 700) | public sealed class TestRunTestResult
    method TestRunTestResult (line 702) | internal TestRunTestResult(
    method ToSerializable (line 728) | internal object ToSerializable()
    method FromAdaptor (line 742) | internal static TestRunTestResult FromAdaptor(ITestResultAdaptor adaptor)

FILE: MCPForUnity/Editor/Services/ToolDiscoveryService.cs
  class ToolDiscoveryService (line 12) | public class ToolDiscoveryService : IToolDiscoveryService
    method DiscoverAllTools (line 17) | public List<ToolMetadata> DiscoverAllTools()
    method GetToolMetadata (line 61) | public ToolMetadata GetToolMetadata(string toolName)
    method GetEnabledTools (line 71) | public List<ToolMetadata> GetEnabledTools()
    method IsToolEnabled (line 78) | public bool IsToolEnabled(string toolName)
    method SetToolEnabled (line 95) | public void SetToolEnabled(string toolName, bool enabled)
    method ExtractToolMetadata (line 106) | private ToolMetadata ExtractToolMetadata(Type type, McpForUnityToolAtt...
    method ExtractParameters (line 152) | private List<ParameterMetadata> ExtractParameters(Type type)
    method GetParameterType (line 188) | private string GetParameterType(Type type)
    method ConvertToSnakeCase (line 211) | private string ConvertToSnakeCase(string input) => StringCaseUtility.T...
    method InvalidateCache (line 213) | public void InvalidateCache()
    method EnsurePreferenceInitialized (line 218) | private void EnsurePreferenceInitialized(ToolMetadata metadata)
    method GetToolPreferenceKey (line 233) | private static string GetToolPreferenceKey(string toolName)

FILE: MCPForUnity/Editor/Services/Transport/IMcpTransportClient.cs
  type IMcpTransportClient (line 8) | public interface IMcpTransportClient
    method StartAsync (line 14) | Task<bool> StartAsync();
    method StopAsync (line 15) | Task StopAsync();
    method VerifyAsync (line 16) | Task<bool> VerifyAsync();
    method ReregisterToolsAsync (line 17) | Task ReregisterToolsAsync();

FILE: MCPForUnity/Editor/Services/Transport/TransportCommandDispatcher.cs
  class TransportCommandDispatcher (line 20) | [InitializeOnLoad]
    class PendingCommand (line 27) | private sealed class PendingCommand
      method PendingCommand (line 29) | public PendingCommand(
      method Dispose (line 49) | public void Dispose()
      method TrySetResult (line 54) | public void TrySetResult(string payload)
      method TrySetCanceled (line 59) | public void TrySetCanceled()
    method TransportCommandDispatcher (line 70) | static TransportCommandDispatcher()
    method ExecuteCommandJsonAsync (line 90) | public static Task<string> ExecuteCommandJsonAsync(string commandJson,...
    method RunOnMainThreadAsync (line 121) | internal static Task<T> RunOnMainThreadAsync<T>(Func<T> func, Cancella...
    method RequestMainThreadPump (line 170) | private static void RequestMainThreadPump()
    method EnsureInitialised (line 196) | private static void EnsureInitialised()
    method HookUpdate (line 207) | private static void HookUpdate()
    method UnhookUpdateIfIdle (line 215) | private static void UnhookUpdateIfIdle()
    method ProcessQueue (line 222) | private static void ProcessQueue()
    method ProcessCommand (line 271) | private static void ProcessCommand(string id, PendingCommand pending)
    method CancelPending (line 427) | private static void CancelPending(string id, CancellationToken token)
    method RemovePending (line 442) | private static void RemovePending(string id, PendingCommand pending)
    method SerializeError (line 453) | private static string SerializeError(string message, string commandTyp...
    method IsValidJson (line 465) | private static bool IsValidJson(string text)

FILE: MCPForUnity/Editor/Services/Transport/TransportManager.cs
  class TransportManager (line 11) | public class TransportManager
    method TransportManager (line 20) | public TransportManager()
    method Configure (line 27) | public void Configure(
    method GetOrCreateClient (line 35) | private IMcpTransportClient GetOrCreateClient(TransportMode mode)
    method StartAsync (line 45) | public async Task<bool> StartAsync(TransportMode mode)
    method StopAsync (line 68) | public async Task StopAsync(TransportMode? mode = null)
    method VerifyAsync (line 95) | public async Task<bool> VerifyAsync(TransportMode mode)
    method GetState (line 109) | public TransportState GetState(TransportMode mode)
    method IsRunning (line 119) | public bool IsRunning(TransportMode mode) => GetState(mode).IsConnected;
    method ForceStop (line 124) | public void ForceStop(TransportMode mode)
    method GetClient (line 160) | public IMcpTransportClient GetClient(TransportMode mode)
    method UpdateState (line 170) | private void UpdateState(TransportMode mode, TransportState state)
  type TransportMode (line 186) | public enum TransportMode

FILE: MCPForUnity/Editor/Services/Transport/TransportState.cs
  class TransportState (line 6) | public sealed class TransportState
    method TransportState (line 15) | private TransportState(
    method Connected (line 31) | public static TransportState Connected(
    method Disconnected (line 38) | public static TransportState Disconnected(
    method WithError (line 44) | public TransportState WithError(string error) => new TransportState(

FILE: MCPForUnity/Editor/Services/Transport/Transports/StdioBridgeHost.cs
  class QueuedCommand (line 24) | class QueuedCommand
  class StdioBridgeHost (line 32) | [InitializeOnLoad]
    method IoInfo (line 60) | private static void IoInfo(string s) { McpLog.Info(s, always: false); }
    method IsDebugEnabled (line 62) | private static bool IsDebugEnabled()
    method LogBreadcrumb (line 67) | private static void LogBreadcrumb(string stage)
    method GetCurrentPort (line 76) | public static int GetCurrentPort() => currentUnityPort;
    method IsAutoConnectMode (line 77) | public static bool IsAutoConnectMode() => isAutoConnectMode;
    method StartAutoConnect (line 79) | public static void StartAutoConnect()
    method FolderExists (line 99) | public static bool FolderExists(string path)
    method StdioBridgeHost (line 118) | static StdioBridgeHost()
    method InitializeAfterCompilation (line 145) | private static void InitializeAfterCompilation()
    method ScheduleInitRetry (line 165) | private static void ScheduleInitRetry()
    method ShouldAutoStartBridge (line 181) | private static bool ShouldAutoStartBridge()
    method EnsureStartedOnEditorIdle (line 194) | private static void EnsureStartedOnEditorIdle()
    method IsCompiling (line 234) | private static bool IsCompiling()
    method Start (line 253) | public static void Start()
    method CreateConfiguredListener (line 334) | private static TcpListener CreateConfiguredListener(int port)
    method Stop (line 355) | public static void Stop()
    method ListenerLoopAsync (line 430) | private static async Task ListenerLoopAsync(CancellationToken token)
    method HandleClientAsync (line 468) | private static async Task HandleClientAsync(TcpClient client, Cancella...
    method ReadExactAsync (line 657) | private static async Task<byte[]> ReadExactAsync(NetworkStream stream,...
    method WriteFrameAsync (line 703) | private static Task WriteFrameAsync(NetworkStream stream, byte[] payload)
    method WriteFrameAsync (line 709) | private static async Task WriteFrameAsync(NetworkStream stream, byte[]...
    method ReadFrameAsUtf8Async (line 730) | private static async Task<string> ReadFrameAsUtf8Async(NetworkStream s...
    method ReadUInt64BigEndian (line 749) | private static ulong ReadUInt64BigEndian(byte[] buffer)
    method WriteUInt64BigEndian (line 762) | private static void WriteUInt64BigEndian(byte[] dest, ulong value)
    method ProcessCommands (line 778) | private static void ProcessCommands()
    method ExecuteQueuedCommand (line 890) | private static void ExecuteQueuedCommand(string commandId, string payl...
    method InvokeOnMainThreadWithTimeout (line 934) | private static object InvokeOnMainThreadWithTimeout(Func<object> func,...
    method IsValidJson (line 989) | private static bool IsValidJson(string text)
    method WriteHeartbeat (line 1018) | public static void WriteHeartbeat(bool reloading, string reason = null)
    method ComputeProjectHash (line 1068) | private static string ComputeProjectHash(string input)

FILE: MCPForUnity/Editor/Services/Transport/Transports/StdioTransportClient.cs
  class StdioTransportClient (line 10) | public class StdioTransportClient : IMcpTransportClient
    method StartAsync (line 18) | public Task<bool> StartAsync()
    method StopAsync (line 33) | public Task StopAsync()
    method VerifyAsync (line 40) | public Task<bool> VerifyAsync()
    method ReregisterToolsAsync (line 49) | public Task ReregisterToolsAsync()

FILE: MCPForUnity/Editor/Services/Transport/Transports/WebSocketTransportClient.cs
  class WebSocketTransportClient (line 25) | public class WebSocketTransportClient : IMcpTransportClient, IDisposable
    method WebSocketTransportClient (line 64) | public WebSocketTransportClient(IToolDiscoveryService toolDiscoverySer...
    method GetEnabledToolsOnMainThreadAsync (line 73) | private Task<List<ToolMetadata>> GetEnabledToolsOnMainThreadAsync(Canc...
    method StartAsync (line 80) | public async Task<bool> StartAsync()
    method StopAsync (line 132) | public async Task StopAsync()
    method ForceStop (line 176) | public void ForceStop()
    method VerifyAsync (line 200) | public async Task<bool> VerifyAsync()
    method Dispose (line 226) | public void Dispose()
    method EstablishConnectionAsync (line 249) | private async Task<bool> EstablishConnectionAsync(CancellationToken to...
    method StopConnectionLoopsAsync (line 328) | private async Task StopConnectionLoopsAsync(bool awaitTasks = true)
    method StartBackgroundLoops (line 368) | private void StartBackgroundLoops(CancellationToken token)
    method ReceiveLoopAsync (line 379) | private async Task ReceiveLoopAsync(CancellationToken token)
    method ReceiveMessageAsync (line 411) | private async Task<string> ReceiveMessageAsync(CancellationToken token)
    method HandleMessageAsync (line 458) | private async Task HandleMessageAsync(string message, CancellationToke...
    method ApplyWelcome (line 493) | private void ApplyWelcome(JObject payload)
    method HandleRegisteredAsync (line 511) | private async Task HandleRegisteredAsync(JObject payload, Cancellation...
    method SendRegisterToolsAsync (line 525) | private async Task SendRegisterToolsAsync(CancellationToken token)
    method ReregisterToolsAsync (line 576) | public async Task ReregisterToolsAsync()
    method HandleExecuteAsync (line 599) | private async Task HandleExecuteAsync(JObject payload, CancellationTok...
    method KeepAliveLoopAsync (line 666) | private async Task KeepAliveLoopAsync(CancellationToken token)
    method SendRegisterAsync (line 692) | private async Task SendRegisterAsync(CancellationToken token)
    method SendPongAsync (line 707) | private Task SendPongAsync(CancellationToken token)
    method SendJsonAsync (line 717) | private async Task SendJsonAsync(JObject payload, CancellationToken to...
    method HandleSocketClosureAsync (line 744) | private async Task HandleSocketClosureAsync(string reason)
    method AttemptReconnectAsync (line 769) | private async Task AttemptReconnectAsync(CancellationToken token)
    method BuildWebSocketUri (line 821) | private static Uri BuildWebSocketUri(string baseUrl)
    method BuildConnectionCandidateUris (line 852) | private static List<Uri> BuildConnectionCandidateUris(Uri endpointUri)
    method TryAddCandidate (line 873) | private static void TryAddCandidate(List<Uri> candidates, Uri template...

FILE: MCPForUnity/Editor/Setup/McpForUnitySkillInstaller.cs
  class McpForUnitySkillInstaller (line 11) | public class McpForUnitySkillInstaller : EditorWindow
    method OpenWindow (line 31) | [MenuItem("Window/MCP For Unity/Install(Sync) MCP Skill")]
    method OnEnable (line 37) | private void OnEnable()
    method OnDisable (line 55) | private void OnDisable()
    method OnGUI (line 64) | private void OnGUI()
    method OnEditorUpdate (line 128) | private void OnEditorUpdate()
    method RunSyncLatest (line 137) | private void RunSyncLatest()
    method TryApplyCliDefaultInstallPath (line 161) | private void TryApplyCliDefaultInstallPath(string previousCli, string ...
    method GetDefaultInstallDir (line 173) | private static string GetDefaultInstallDir(string userHome, string cli...
    method IsClaudeCli (line 179) | private static bool IsClaudeCli(string cliType)
    method PathsEqual (line 184) | private static bool PathsEqual(string left, string right)
    method AppendLineImmediate (line 204) | private void AppendLineImmediate(string line)
    method FlushPendingLogs (line 217) | private bool FlushPendingLogs()
    method SanitizeLogLine (line 234) | private static string SanitizeLogLine(string line)

FILE: MCPForUnity/Editor/Setup/RoslynInstaller.cs
  class RoslynInstaller (line 10) | public static class RoslynInstaller
    method InstallViaMenu (line 22) | [MenuItem("Window/MCP For Unity/Install Roslyn DLLs", priority = 20)]
    method IsInstalled (line 28) | public static bool IsInstalled()
    method Install (line 39) | public static void Install(bool interactive = true)
    method ExtractFileFromZip (line 130) | private static byte[] ExtractFileFromZip(byte[] zipBytes, string entry...

FILE: MCPForUnity/Editor/Setup/SetupWindowService.cs
  class SetupWindowService (line 15) | [InitializeOnLoad]
    method SetupWindowService (line 26) | static SetupWindowService()
    method CheckSetupNeeded (line 39) | private static void CheckSetupNeeded()
    method ShowSetupWindow (line 79) | public static void ShowSetupWindow(DependencyCheckResult dependencyRes...
    method MarkSetupCompleted (line 95) | public static void MarkSetupCompleted()
    method MarkSetupDismissed (line 104) | public static void MarkSetupDismissed()

FILE: MCPForUnity/Editor/Setup/SkillSyncService.cs
  class SkillSyncService (line 14) | public static class SkillSyncService
    class SyncResult (line 21) | public sealed class SyncResult
    method SyncAsync (line 31) | public static void SyncAsync(string installDir, string branch, Action<...
    method SyncAsync (line 36) | public static void SyncAsync(string repoUrl, string installDir, string...
    method RunSync (line 65) | private static SyncResult RunSync(string repoUrl, string installDir, s...
    method GetLastSyncedCommitKey (line 114) | private static string GetLastSyncedCommitKey(string repoUrl, string br...
    method TryParseGitHubRepository (line 123) | internal static bool TryParseGitHubRepository(string url, out GitHubRe...
    method TryParseOwnerAndRepo (line 152) | private static bool TryParseOwnerAndRepo(string path, out GitHubRepoIn...
    method FetchRemoteSnapshot (line 177) | private static RemoteSnapshot FetchRemoteSnapshot(GitHubRepoInfo repoI...
    method FetchBranchHeadCommitSha (line 246) | private static string FetchBranchHeadCommitSha(HttpClient client, GitH...
    method BuildBranchApiUrl (line 261) | private static string BuildBranchApiUrl(GitHubRepoInfo repoInfo, strin...
    method BuildTreeApiUrl (line 266) | private static string BuildTreeApiUrl(GitHubRepoInfo repoInfo, string ...
    method BuildRawFileUrl (line 271) | private static string BuildRawFileUrl(GitHubRepoInfo repoInfo, string ...
    method CreateGitHubClient (line 280) | internal static HttpClient CreateGitHubClient()
    method DownloadString (line 291) | internal static string DownloadString(HttpClient client, string url)
    method DownloadBytes (line 303) | private static byte[] DownloadBytes(HttpClient client, string url)
    method NormalizeRemotePath (line 315) | internal static string NormalizeRemotePath(string path)
    method CombineRemotePath (line 325) | private static string CombineRemotePath(string left, string right)
    method TryNormalizeRelativePath (line 342) | internal static bool TryNormalizeRelativePath(string relativePath, out...
    method ResolvePathUnderRoot (line 371) | internal static string ResolvePathUnderRoot(string root, string relati...
    method EnsureTrailingDirectorySeparator (line 389) | private static string EnsureTrailingDirectorySeparator(string path)
    method BuildPlan (line 394) | internal static SyncPlan BuildPlan(Dictionary<string, string> remoteFi...
    method ApplyPlan (line 436) | private static void ApplyPlan(GitHubRepoInfo repoInfo, string commitSh...
    method ValidateFileHashes (line 467) | private static void ValidateFileHashes(string installRoot, Dictionary<...
    method ComputeGitBlobSha1 (line 490) | internal static string ComputeGitBlobSha1(string filePath)
    method ComputeGitBlobSha1 (line 496) | internal static string ComputeGitBlobSha1(byte[] bytes)
    method ListFiles (line 505) | internal static Dictionary<string, string> ListFiles(string root)
    method EnsureManagedInstallRoot (line 528) | private static void EnsureManagedInstallRoot(
    method CanAdoptLegacyManagedRoot (line 550) | private static bool CanAdoptLegacyManagedRoot(
    method GetTopLevelSegment (line 593) | private static string GetTopLevelSegment(string relativePath)
    method GetPathComparison (line 605) | internal static StringComparison GetPathComparison(string root)
    method GetPathComparer (line 610) | internal static StringComparer GetPathComparer(StringComparison pathCo...
    method IsCaseSensitiveFileSystem (line 617) | private static bool IsCaseSensitiveFileSystem(string root)
    method RemoveEmptyDirectories (line 643) | private static void RemoveEmptyDirectories(string root)
    method ResolveAndValidateInstallPath (line 663) | internal static string ResolveAndValidateInstallPath(string installDir)
    method ExpandPath (line 694) | internal static string ExpandPath(string path)
    method ShortCommit (line 711) | private static string ShortCommit(string commit)
    method ShortHash (line 721) | private static string ShortHash(string hash)
    method LogPlanDetails (line 731) | private static void LogPlanDetails(SyncPlan plan, Action<string> log)
    type GitHubRepoInfo (line 755) | internal readonly struct GitHubRepoInfo
      method GitHubRepoInfo (line 757) | public GitHubRepoInfo(string owner, string repo)
    type RemoteSnapshot (line 767) | internal readonly struct RemoteSnapshot
      method RemoteSnapshot (line 769) | public RemoteSnapshot(string commitSha, string subdirPath, Dictionar...
    class GitHubTreeResponse (line 781) | [Serializable]
    class GitHubBranchResponse (line 789) | [Serializable]
    class GitHubBranchCommit (line 795) | [Serializable]
    class GitHubTreeEntry (line 801) | [Serializable]
    class SyncPlan (line 809) | internal sealed class SyncPlan

FILE: MCPForUnity/Editor/Tools/Animation/AnimatorControl.cs
  class AnimatorControl (line 10) | internal static class AnimatorControl
    method Play (line 12) | public static object Play(JObject @params)
    method Crossfade (line 34) | public static object Crossfade(JObject @params)
    method SetParameter (line 57) | public static object SetParameter(JObject @params)
    method SetSpeed (line 188) | public static object SetSpeed(JObject @params)
    method SetEnabled (line 206) | public static object SetEnabled(JObject @params)

FILE: MCPForUnity/Editor/Tools/Animation/AnimatorRead.cs
  class AnimatorRead (line 9) | internal static class AnimatorRead
    method GetInfo (line 11) | public static object GetInfo(JObject @params)
    method GetParameter (line 92) | public static object GetParameter(JObject @params)

FILE: MCPForUnity/Editor/Tools/Animation/ClipCreate.cs
  class ClipCreate (line 12) | internal static class ClipCreate
    method Create (line 14) | public static object Create(JObject @params)
    method GetInfo (line 86) | public static object GetInfo(JObject @params)
    method AddCurve (line 145) | public static object AddCurve(JObject @params)
    method SetCurve (line 150) | public static object SetCurve(JObject @params)
    method SetOrAddCurve (line 155) | private static object SetOrAddCurve(JObject @params, bool append)
    method SetVectorCurve (line 226) | public static object SetVectorCurve(JObject @params)
    method Assign (line 327) | public static object Assign(JObject @params)
    method SetupLegacyClip (line 403) | private static void SetupLegacyClip(AnimationClip clip)
    method ParseKeyframes (line 433) | private static Keyframe[] ParseKeyframes(JToken keysToken)
    method ResolveType (line 474) | private static Type ResolveType(string typeName)
    method AddEvent (line 506) | public static object AddEvent(JObject @params)
    method RemoveEvent (line 557) | public static object RemoveEvent(JObject @params)
    method CreateFoldersRecursive (line 618) | private static void CreateFoldersRecursive(string folderPath)

FILE: MCPForUnity/Editor/Tools/Animation/ClipPresets.cs
  class ClipPresets (line 10) | internal static class ClipPresets
    method CreatePreset (line 14) | public static object CreatePreset(JObject @params)
    method ApplyBounce (line 145) | private static void ApplyBounce(AnimationClip clip, float duration, fl...
    method ApplyRotate (line 159) | private static void ApplyRotate(AnimationClip clip, float duration, fl...
    method ApplyPulse (line 174) | private static void ApplyPulse(AnimationClip clip, float duration, flo...
    method ApplyFade (line 189) | private static void ApplyFade(AnimationClip clip, float duration)
    method ApplyShake (line 200) | private static void ApplyShake(AnimationClip clip, float duration, flo...
    method ApplyHover (line 226) | private static void ApplyHover(AnimationClip clip, float duration, flo...
    method ApplySpin (line 240) | private static void ApplySpin(AnimationClip clip, float duration, floa...
    method ApplySway (line 254) | private static void ApplySway(AnimationClip clip, float duration, floa...
    method ApplyBob (line 268) | private static void ApplyBob(AnimationClip clip, float duration, float...
    method ApplyWiggle (line 282) | private static void ApplyWiggle(AnimationClip clip, float duration, fl...
    method ApplyBlink (line 301) | private static void ApplyBlink(AnimationClip clip, float duration)
    method ApplySlideIn (line 315) | private static void ApplySlideIn(AnimationClip clip, float duration, f...
    method ApplyElastic (line 330) | private static void ApplyElastic(AnimationClip clip, float duration, f...
    method ApplyGrow (line 347) | private static void ApplyGrow(AnimationClip clip, float duration, floa...
    method ApplyShrink (line 361) | private static void ApplyShrink(AnimationClip clip, float duration, fl...
    method SetTransformCurve (line 381) | private static void SetTransformCurve(AnimationClip clip, string prope...
    method CreateFoldersRecursive (line 387) | private static void CreateFoldersRecursive(string folderPath)

FILE: MCPForUnity/Editor/Tools/Animation/ControllerBlendTrees.cs
  class ControllerBlendTrees (line 10) | internal static class ControllerBlendTrees
    method CreateBlendTree1D (line 12) | public static object CreateBlendTree1D(JObject @params)
    method CreateBlendTree2D (line 73) | public static object CreateBlendTree2D(JObject @params)
    method AddBlendTreeChild (line 145) | public static object AddBlendTreeChild(JObject @params)

FILE: MCPForUnity/Editor/Tools/Animation/ControllerCreate.cs
  class ControllerCreate (line 13) | internal static class ControllerCreate
    method Create (line 15) | public static object Create(JObject @params)
    method AddState (line 53) | public static object AddState(JObject @params)
    method AddTransition (line 116) | public static object AddTransition(JObject @params)
    method AddParameter (line 230) | public static object AddParameter(JObject @params)
    method GetInfo (line 303) | public static object GetInfo(JObject @params)
    method AssignToGameObject (line 390) | public static object AssignToGameObject(JObject @params)
    method LoadController (line 425) | private static AnimatorController LoadController(JObject @params)
    method ControllerNotFoundError (line 438) | private static object ControllerNotFoundError(JObject @params)
    method CreateFoldersRecursive (line 444) | private static void CreateFoldersRecursive(string folderPath)

FILE: MCPForUnity/Editor/Tools/Animation/ControllerLayers.cs
  class ControllerLayers (line 9) | internal static class ControllerLayers
    method AddLayer (line 11) | public static object AddLayer(JObject @params)
    method RemoveLayer (line 64) | public static object RemoveLayer(JObject @params)
    method SetLayerWeight (line 133) | public static object SetLayerWeight(JObject @params)

FILE: MCPForUnity/Editor/Tools/Animation/ManageAnimation.cs
  class ManageAnimation (line 10) | [McpForUnityTool("manage_animation", AutoRegister = false, Group = "anim...
    method NormalizeParams (line 42) | private static JObject NormalizeParams(JObject source)
    method ExtractProperties (line 71) | private static JObject ExtractProperties(JObject source)
    method NormalizeKey (line 110) | private static string NormalizeKey(string key, bool allowAliases)
    method NormalizeToken (line 131) | private static JToken NormalizeToken(JToken token)
    method HandleCommand (line 161) | public static object HandleCommand(JObject @params)
    method HandleAnimatorAction (line 198) | private static object HandleAnimatorAction(JObject @params, string act...
    method HandleControllerAction (line 214) | private static object HandleControllerAction(JObject @params, string a...
    method HandleClipAction (line 235) | private static object HandleClipAction(JObject @params, string action)

FILE: MCPForUnity/Editor/Tools/BatchExecute.cs
  class BatchExecute (line 16) | [McpForUnityTool("batch_execute", AutoRegister = false)]
    method GetMaxCommandsPerBatch (line 28) | internal static int GetMaxCommandsPerBatch()
    method HandleCommand (line 34) | public static async Task<object> HandleCommand(JObject @params)
    method DetermineCallSucceeded (line 184) | private static bool DetermineCallSucceeded(object result)
    method NormalizeParameterKeys (line 217) | private static JObject NormalizeParameterKeys(JObject source)
    method ToCamelCase (line 233) | private static string ToCamelCase(string key) => StringCaseUtility.ToC...

FILE: MCPForUnity/Editor/Tools/Cameras/CameraConfigure.cs
  class CameraConfigure (line 10) | internal static class CameraConfigure
    method SetBasicCameraTarget (line 14) | internal static object SetBasicCameraTarget(JObject @params)
    method SetBasicCameraLens (line 43) | internal static object SetBasicCameraLens(JObject @params)
    method SetBasicCameraPriority (line 72) | internal static object SetBasicCameraPriority(JObject @params)
    method SetCinemachineTarget (line 99) | internal static object SetCinemachineTarget(JObject @params)
    method SetCinemachineLens (line 123) | internal static object SetCinemachineLens(JObject @params)
    method SetCinemachinePriority (line 154) | internal static object SetCinemachinePriority(JObject @params)
    method SetBody (line 188) | internal static object SetBody(JObject @params)
    method SetAim (line 225) | internal static object SetAim(JObject @params)
    method SetNoise (line 260) | internal static object SetNoise(JObject @params)
    method AddExtension (line 295) | internal static object AddExtension(JObject @params)
    method RemoveExtension (line 327) | internal static object RemoveExtension(JObject @params)
    method SetFloatSubProp (line 362) | private static void SetFloatSubProp(SerializedProperty parent, string ...
    method SwapPipelineComponent (line 371) | private static Component SwapPipelineComponent(GameObject go, string s...
    method SetComponentProperties (line 393) | private static void SetComponentProperties(Component component, JObjec...

FILE: MCPForUnity/Editor/Tools/Cameras/CameraControl.cs
  class CameraControl (line 12) | internal static class CameraControl
    method ListCameras (line 14) | internal static object ListCameras(JObject @params)
    method GetBrainStatus (line 133) | internal static object GetBrainStatus(JObject @params)
    method SetBlend (line 175) | internal static object SetBlend(JObject @params)
    method ForceCamera (line 226) | internal static object ForceCamera(JObject @params)
    method ReleaseOverride (line 293) | internal static object ReleaseOverride(JObject @params)

FILE: MCPForUnity/Editor/Tools/Cameras/CameraCreate.cs
  class CameraCreate (line 11) | internal static class CameraCreate
    method CreateBasicCamera (line 24) | internal static object CreateBasicCamera(JObject @params)
    method CreateCinemachineCamera (line 72) | internal static object CreateCinemachineCamera(JObject @params)
    method EnsureBrain (line 162) | internal static object EnsureBrain(JObject @params)

FILE: MCPForUnity/Editor/Tools/Cameras/CameraHelpers.cs
  class CameraHelpers (line 12) | internal static class CameraHelpers
    method DetectCinemachine (line 48) | private static void DetectCinemachine()
    method GetCinemachineVersion (line 55) | internal static string GetCinemachineVersion()
    method FindTargetGameObject (line 72) | internal static GameObject FindTargetGameObject(JObject @params)
    method ResolveGameObjectRef (line 97) | internal static GameObject ResolveGameObjectRef(object reference)
    method FindCinemachineCamera (line 132) | internal static Component FindCinemachineCamera(JObject @params)
    method FindBrain (line 139) | internal static Component FindBrain()
    method FindMainCamera (line 151) | internal static UnityEngine.Camera FindMainCamera()
    method ExtractProperties (line 164) | internal static JObject ExtractProperties(JObject @params)
    method GetReflectionProperty (line 179) | internal static object GetReflectionProperty(Component component, stri...
    method ReadCinemachinePriority (line 188) | internal static int ReadCinemachinePriority(Component cmCamera)
    method SetReflectionProperty (line 200) | internal static bool SetReflectionProperty(Component component, string...
    method SetTransformTarget (line 210) | internal static void SetTransformTarget(Component cmCamera, string pro...
    method ResolveComponentType (line 225) | internal static Type ResolveComponentType(string typeName)
    method GetPipelineComponent (line 230) | internal static Component GetPipelineComponent(Component cmCamera, str...
    method GetFallbackSuggestion (line 253) | internal static string GetFallbackSuggestion(string action)
    method MarkDirty (line 266) | internal static void MarkDirty(GameObject go)

FILE: MCPForUnity/Editor/Tools/Cameras/ManageCamera.cs
  class ManageCamera (line 7) | [McpForUnityTool("manage_camera", AutoRegister = false)]
    method HandleCommand (line 10) | public static object HandleCommand(JObject @params)

FILE: MCPForUnity/Editor/Tools/CommandRegistry.cs
  class HandlerInfo (line 16) | class HandlerInfo
    method HandlerInfo (line 24) | public HandlerInfo(string commandName, Func<JObject, object> syncHandl...
  class CommandRegistry (line 36) | public static class CommandRegistry
    method Initialize (line 45) | public static void Initialize()
    method ToSnakeCase (line 53) | private static string ToSnakeCase(string name) => StringCaseUtility.To...
    method AutoDiscoverCommands (line 58) | private static void AutoDiscoverCommands()
    method RegisterCommandType (line 101) | private static bool RegisterCommandType(Type type, bool isResource)
    method GetHandlerInfo (line 182) | private static HandlerInfo GetHandlerInfo(string commandName)
    method GetHandler (line 200) | public static Func<JObject, object> GetHandler(string commandName)
    method ExecuteCommand (line 221) | public static object ExecuteCommand(string commandName, JObject @param...
    method InvokeCommandAsync (line 245) | public static Task<object> InvokeCommandAsync(string commandName, JObj...
    method CreateAsyncHandlerDelegate (line 277) | private static Func<JObject, Task<object>> CreateAsyncHandlerDelegate(...
    method ExecuteAsyncHandler (line 320) | private static void ExecuteAsyncHandler(
    method CompleteAsyncCommand (line 371) | private static void CompleteAsyncCommand(string commandName, TaskCompl...
    method ReportAsyncFailure (line 397) | private static void ReportAsyncFailure(string commandName, TaskComplet...

FILE: MCPForUnity/Editor/Tools/ExecuteMenuItem.cs
  class ExecuteMenuItem (line 9) | [McpForUnityTool("execute_menu_item", AutoRegister = false)]
    method HandleCommand (line 22) | public static object HandleCommand(JObject @params)

FILE: MCPForUnity/Editor/Tools/FindGameObjects.cs
  class FindGameObjects (line 16) | [McpForUnityTool("find_gameobjects")]
    method HandleCommand (line 24) | public static object HandleCommand(JObject @params)

FILE: MCPForUnity/Editor/Tools/GameObjects/ComponentResolver.cs
  class ComponentResolver (line 15) | internal static class ComponentResolver
    method TryResolve (line 21) | public static bool TryResolve(string nameOrFullName, out Type type, ou...
    method GetAllComponentProperties (line 29) | public static List<string> GetAllComponentProperties(Type componentType)
    method GetFuzzyPropertySuggestions (line 53) | public static List<string> GetFuzzyPropertySuggestions(string userInpu...
    method GetRuleBasedSuggestions (line 81) | private static List<string> GetRuleBasedSuggestions(string userInput, ...
    method LevenshteinDistance (line 117) | private static int LevenshteinDistance(string s1, string s2)

FILE: MCPForUnity/Editor/Tools/GameObjects/GameObjectComponentHelpers.cs
  class GameObjectComponentHelpers (line 16) | internal static class GameObjectComponentHelpers
    method AddComponentInternal (line 18) | internal static object AddComponentInternal(GameObject targetGo, strin...
    method AllowsMultiple (line 101) | private static bool AllowsMultiple(Type componentType)
    method RemoveComponentInternal (line 111) | internal static object RemoveComponentInternal(GameObject targetGo, st...
    method SetComponentPropertiesInternal (line 146) | internal static object SetComponentPropertiesInternal(GameObject targe...
    method SetNestedProperty (line 220) | private static bool SetNestedProperty(object target, string path, JTok...
    method SplitPropertyPath (line 380) | private static string[] SplitPropertyPath(string path)
    method ConvertJTokenToType (line 411) | private static object ConvertJTokenToType(JToken token, Type targetTyp...
    method FindType (line 416) | private static Type FindType(string typeName)

FILE: MCPForUnity/Editor/Tools/GameObjects/GameObjectCreate.cs
  class GameObjectCreate (line 13) | internal static class GameObjectCreate
    method Handle (line 15) | internal static object Handle(JObject @params)

FILE: MCPForUnity/Editor/Tools/GameObjects/GameObjectDelete.cs
  class GameObjectDelete (line 10) | internal static class GameObjectDelete
    method Handle (line 12) | internal static object Handle(JToken targetToken, string searchMethod)

FILE: MCPForUnity/Editor/Tools/GameObjects/GameObjectDuplicate.cs
  class GameObjectDuplicate (line 10) | internal static class GameObjectDuplicate
    method Handle (line 12) | internal static object Handle(JObject @params, JToken targetToken, str...

FILE: MCPForUnity/Editor/Tools/GameObjects/GameObjectHandlers.cs
  class GameObjectHandlers (line 6) | internal static class GameObjectHandlers
    method Create (line 8) | internal static object Create(JObject @params) => GameObjectCreate.Han...
    method Modify (line 10) | internal static object Modify(JObject @params, JToken targetToken, str...
    method Delete (line 13) | internal static object Delete(JToken targetToken, string searchMethod)
    method Duplicate (line 16) | internal static object Duplicate(JObject @params, JToken targetToken, ...
    method MoveRelative (line 19) | internal static object MoveRelative(JObject @params, JToken targetToke...

FILE: MCPForUnity/Editor/Tools/GameObjects/GameObjectLookAt.cs
  class GameObjectLookAt (line 9) | internal static class GameObjectLookAt
    method Handle (line 18) | internal static object Handle(JObject @params, JToken targetToken, str...

FILE: MCPForUnity/Editor/Tools/GameObjects/GameObjectModify.cs
  class GameObjectModify (line 14) | internal static class GameObjectModify
    method Handle (line 16) | internal static object Handle(JObject @params, JToken targetToken, str...

FILE: MCPForUnity/Editor/Tools/GameObjects/GameObjectMoveRelative.cs
  class GameObjectMoveRelative (line 10) | internal static class GameObjectMoveRelative
    method Handle (line 12) | internal static object Handle(JObject @params, JToken targetToken, str...
    method GetDirectionVector (line 81) | private static Vector3 GetDirectionVector(string direction, Transform ...

FILE: MCPForUnity/Editor/Tools/GameObjects/ManageGameObject.cs
  class ManageGameObject (line 16) | [McpForUnityTool("manage_gameobject", AutoRegister = false)]
    method HandleCommand (line 21) | public static object HandleCommand(JObject @params)

FILE: MCPForUnity/Editor/Tools/GameObjects/ManageGameObjectCommon.cs
  class ManageGameObjectCommon (line 14) | internal static class ManageGameObjectCommon
    method FindObjectInternal (line 16) | internal static GameObject FindObjectInternal(JToken targetToken, stri...
    method FindObjectsInternal (line 32) | internal static List<GameObject> FindObjectsInternal(
    method GetAllSceneObjects (line 217) | private static IEnumerable<GameObject> GetAllSceneObjects(bool include...
    method FindType (line 223) | private static Type FindType(string typeName)

FILE: MCPForUnity/Editor/Tools/GetTestJob.cs
  class GetTestJob (line 11) | [McpForUnityTool("get_test_job", AutoRegister = false, Group = "testing")]
    method HandleCommand (line 14) | public static object HandleCommand(JObject @params)

FILE: MCPForUnity/Editor/Tools/Graphics/GraphicsHelpers.cs
  class GraphicsHelpers (line 12) | internal static class GraphicsHelpers
    method DetectPackages (line 71) | private static void DetectPackages()
    method ResolveVolumeComponentType (line 80) | internal static Type ResolveVolumeComponentType(string effectName)
    method GetAvailableEffectTypes (line 95) | internal static List<Type> GetAvailableEffectTypes()
    method FindVolume (line 106) | internal static Component FindVolume(JObject @params)
    method GetPipelineName (line 132) | internal static string GetPipelineName()
    method ReadSerializedValue (line 144) | internal static object ReadSerializedValue(SerializedProperty prop)
    method SetSerializedValue (line 170) | internal static bool SetSerializedValue(SerializedProperty prop, JToke...
    method MarkDirty (line 257) | internal static void MarkDirty(UnityEngine.Object obj)

FILE: MCPForUnity/Editor/Tools/Graphics/LightBakingOps.cs
  class LightBakingOps (line 13) | internal static class LightBakingOps
    method StartBake (line 17) | internal static object StartBake(JObject @params)
    method CancelBake (line 49) | internal static object CancelBake(JObject @params)
    method GetStatus (line 60) | internal static object GetStatus(JObject @params)
    method ClearBake (line 78) | internal static object ClearBake(JObject @params)
    method BakeReflectionProbe (line 91) | internal static object BakeReflectionProbe(JObject @params)
    method GetSettings (line 133) | internal static object GetSettings(JObject @params)
    method SetSettings (line 171) | internal static object SetSettings(JObject @params)
    method CreateLightProbeGroup (line 226) | internal static object CreateLightProbeGroup(JObject @params)
    method CreateReflectionProbe (line 288) | internal static object CreateReflectionProbe(JObject @params)
    method SetProbePositions (line 343) | internal static object SetProbePositions(JObject @params)
    method EnsureLightingSettings (line 393) | private static LightingSettings EnsureLightingSettings()
    method FindGameObject (line 412) | private static GameObject FindGameObject(string target)
    method ReadBounceCount (line 427) | private static void ReadBounceCount(LightingSettings settings, Diction...
    method TrySetLightingSetting (line 446) | private static bool TrySetLightingSetting(LightingSettings settings, s...
    method TrySetBounceCount (line 539) | private static bool TrySetBounceCount(LightingSettings settings, int v...
    method TryParseEnum (line 563) | private static bool TryParseEnum<T>(JToken value, out T result) where ...

FILE: MCPForUnity/Editor/Tools/Graphics/ManageGraphics.cs
  class ManageGraphics (line 7) | [McpForUnityTool("manage_graphics", AutoRegister = false, Group = "core")]
    method HandleCommand (line 10) | public static object HandleCommand(JObject @params)

FILE: MCPForUnity/Editor/Tools/Graphics/RenderPipelineOps.cs
  class RenderPipelineOps (line 12) | internal static class RenderPipelineOps
    method GetInfo (line 16) | internal static object GetInfo(JObject @params)
    method SetQuality (line 68) | internal static object SetQuality(JObject @params)
    method GetSettings (line 122) | internal static object GetSettings(JObject @params)
    method SetSettings (line 177) | internal static object SetSettings(JObject @params)
    method ConvertPropertyValue (line 252) | private static object ConvertPropertyValue(JToken value, Type targetType)
    method TryReadProperty (line 270) | private static void TryReadProperty(object obj, string propertyName, D...

FILE: MCPForUnity/Editor/Tools/Graphics/RendererFeatureOps.cs
  class RendererFeatureOps (line 13) | internal static class RendererFeatureOps
    method EnsureTypes (line 21) | private static void EnsureTypes()
    method ListFeatures (line 35) | internal static object ListFeatures(JObject @params)
    method AddFeature (line 82) | internal static object AddFeature(JObject @params)
    method RemoveFeature (line 171) | internal static object RemoveFeature(JObject @params)
    method ConfigureFeature (line 240) | internal static object ConfigureFeature(JObject @params)
    method ToggleFeature (line 283) | internal static object ToggleFeature(JObject @params)
    method ReorderFeatures (line 329) | internal static object ReorderFeatures(JObject @params)
    method GetRendererData (line 402) | private static object GetRendererData(JObject @params)
    method ResolveFeatureType (line 448) | private static Type ResolveFeatureType(string typeName)
    method GetAvailableFeatureTypes (line 472) | private static List<Type> GetAvailableFeatureTypes()
    method ResolveFeatureIndex (line 483) | private static int ResolveFeatureIndex(System.Collections.IList featur...
    method GetFeatureProperties (line 503) | private static Dictionary<string, object> GetFeatureProperties(Scripta...
    method ApplyFeatureProperties (line 524) | private static (List<string> changed, List<string> failed) ApplyFeatur...
    method TrySetMaterial (line 559) | private static void TrySetMaterial(ScriptableObject feature, string ma...

FILE: MCPForUnity/Editor/Tools/Graphics/RenderingStatsOps.cs
  class RenderingStatsOps (line 14) | internal static class RenderingStatsOps
    method GetStats (line 39) | internal static object GetStats(JObject @params)
    method ListCounters (line 58) | internal static object ListCounters(JObject @params)
    method SetSceneDebugMode (line 92) | internal static object SetSceneDebugMode(JObject @params)
    method GetMemory (line 125) | internal static object GetMemory(JObject @params)
    method TryResolveCategory (line 146) | private static ProfilerCategory TryResolveCategory(string name)

FILE: MCPForUnity/Editor/Tools/Graphics/SkyboxOps.cs
  class SkyboxOps (line 11) | internal static class SkyboxOps
    method GetEnvironment (line 32) | public static object GetEnvironment(JObject @params)
    method SetMaterial (line 104) | public static object SetMaterial(JObject @params)
    method SetMaterialProperties (line 134) | public static object SetMaterialProperties(JObject @params)
    method SetAmbient (line 184) | public static object SetAmbient(JObject @params)
    method SetFog (line 234) | public static object SetFog(JObject @params)
    method SetReflection (line 289) | public static object SetReflection(JObject @params)
    method SetSun (line 347) | public static object SetSun(JObject @params)
    method ColorToArray (line 386) | private static float[] ColorToArray(Color c)
    method ArrayToColor (line 391) | private static Color ArrayToColor(float[] arr)
    method ParseColorToken (line 398) | private static Color? ParseColorToken(JToken token)
    method ReadMaterialProperty (line 410) | private static object ReadMaterialProperty(Material mat, string propNa...
    method SetMaterialProperty (line 432) | private static bool SetMaterialProperty(Material mat, string propName,...
    method MarkSceneDirty (line 490) | private static void MarkSceneDirty()

FILE: MCPForUnity/Editor/Tools/Graphics/VolumeOps.cs
  class VolumeOps (line 12) | internal static class VolumeOps
    method CreateVolume (line 18) | internal static object CreateVolume(JObject @params)
    method AddEffect (line 139) | internal static object AddEffect(JObject @params)
    method SetEffect (line 198) | internal static object SetEffect(JObject @params)
    method RemoveEffect (line 267) | internal static object RemoveEffect(JObject @params)
    method GetInfo (line 324) | internal static object GetInfo(JObject @params)
    method SetProperties (line 342) | internal static object SetProperties(JObject @params)
    method ListEffects (line 388) | internal static object ListEffects(JObject @params)
    method CreateProfile (line 408) | internal static object CreateProfile(JObject @params)
    method ListVolumes (line 452) | internal static object ListVolumes(JObject @params)
    method BuildVolumeInfo (line 478) | private static object BuildVolumeInfo(object volumeComponent)
    method SetVolumeParameter (line 545) | internal static bool SetVolumeParameter(object component, string field...
    method ConvertToParameterType (line 586) | private static object ConvertToParameterType(JToken value, Type target...
    method GetProperty (line 673) | private static object GetProperty(object obj, string name)
    method GetPropertyValue (line 685) | private static T GetPropertyValue<T>(object obj, string name, T defaul...
    method SetProperty (line 692) | private static void SetProperty(object obj, string name, object value)

FILE: MCPForUnity/Editor/Tools/JsonUtil.cs
  class JsonUtil (line 7) | internal static class JsonUtil
    method CoerceJsonStringParameter (line 13) | internal static void CoerceJsonStringParameter(JObject @params, string...

FILE: MCPForUnity/Editor/Tools/ManageAsset.cs
  class ManageAsset (line 25) | [McpForUnityTool("manage_asset", AutoRegister = false)]
    method HandleCommand (line 46) | public static object HandleCommand(JObject @params)
    method ReimportAsset (line 131) | private static object ReimportAsset(string path, JObject properties)
    method CreateAsset (line 163) | private static object CreateAsset(JObject @params)
    method CreateFolder (line 279) | private static object CreateFolder(string path)
    method ModifyAsset (line 334) | private static object ModifyAsset(string path, JObject properties)
    method DeleteAsset (line 495) | private static object DeleteAsset(string path)
    method DuplicateAsset (line 525) | private static object DuplicateAsset(string path, string destinationPath)
    method MoveOrRenameAsset (line 573) | private static object MoveOrRenameAsset(string path, string destinatio...
    method SearchAssets (line 627) | private static object SearchAssets(JObject @params)
    method GetAssetInfo (line 732) | private static object GetAssetInfo(string path, bool generatePreview)
    method GetComponentsFromAsset (line 758) | private static object GetComponentsFromAsset(string path)
    method AssetExists (line 836) | private static bool AssetExists(string sanitizedPath)
    method EnsureDirectoryExists (line 864) | private static void EnsureDirectoryExists(string directoryPath)
    method ApplyPhysicsMaterialProperties (line 881) | private static bool ApplyPhysicsMaterialProperties(PhysicsMaterialType...
    method ApplyObjectProperties (line 952) | private static bool ApplyObjectProperties(UnityEngine.Object target, J...
    method SetPropertyOrField (line 974) | private static bool SetPropertyOrField(
    method GetAssetData (line 1033) | private static object GetAssetData(string path, bool generatePreview =...

FILE: MCPForUnity/Editor/Tools/ManageComponents.cs
  class ManageComponents (line 20) | [McpForUnityTool("manage_components")]
    method HandleCommand (line 28) | public static object HandleCommand(JObject @params)
    method AddComponent (line 69) | private static object AddComponent(JObject @params, JToken targetToken...
    method RemoveComponent (line 128) | private static object RemoveComponent(JObject @params, JToken targetTo...
    method SetProperty (line 170) | private static object SetProperty(JObject @params, JToken targetToken,...
    method EnsureVfxRendererMaterial (line 281) | private static void EnsureVfxRendererMaterial(GameObject go, Component...
    method MarkOwningSceneDirty (line 313) | private static void MarkOwningSceneDirty(GameObject targetGo)
    method FindTarget (line 326) | private static GameObject FindTarget(JToken targetToken, string search...
    method SetPropertiesOnComponent (line 352) | private static void SetPropertiesOnComponent(Component component, JObj...
    method TrySetProperty (line 375) | private static string TrySetProperty(Component component, string prope...

FILE: MCPForUnity/Editor/Tools/ManageEditor.cs
  class ManageEditor (line 15) | [McpForUnityTool("manage_editor", AutoRegister = false)]
    method HandleCommand (line 27) | public static object HandleCommand(JObject @params)
    method SetActiveTool (line 157) | private static object SetActiveTool(string toolName)
    method AddTag (line 194) | private static object AddTag(string tagName)
    method RemoveTag (line 219) | private static object RemoveTag(string tagName)
    method AddLayer (line 249) | private static object AddLayer(string layerName)
    method RemoveLayer (line 314) | private static object RemoveLayer(string layerName)
    method ClosePrefabStage (line 372) | private static object ClosePrefabStage()
    method DeployPackage (line 394) | private static object DeployPackage()
    method RestorePackage (line 415) | private static object RestorePackage()
    method GetTagManager (line 440) | private static SerializedObject GetTagManager()

FILE: MCPForUnity/Editor/Tools/ManageMaterial.cs
  class ManageMaterial (line 11) | [McpForUnityTool("manage_material", AutoRegister = false)]
    method HandleCommand (line 14) | public static object HandleCommand(JObject @params)
    method NormalizePath (line 57) | private static string NormalizePath(string path)
    method SetMaterialShaderProperty (line 73) | private static object SetMaterialShaderProperty(JObject @params)
    method SetMaterialColor (line 128) | private static object SetMaterialColor(JObject @params)
    method AssignMaterialToRenderer (line 196) | private static object AssignMaterialToRenderer(JObject @params)
    method SetRendererColor (line 245) | private static object SetRendererColor(JObject @params)
    method EnsureAssetFolderExists (line 370) | private static void EnsureAssetFolderExists(string assetFolderPath)
    method SetColorProperties (line 386) | private static void SetColorProperties(Material mat, Color color)
    method CreateUniqueAndAssign (line 406) | private static object CreateUniqueAndAssign(Renderer renderer, GameObj...
    method GetMaterialInfo (line 468) | private static object GetMaterialInfo(JObject @params)
    method CreateMaterial (line 585) | private static object CreateMaterial(JObject @params)

FILE: MCPForUnity/Editor/Tools/ManagePackages.cs
  class ManagePackages (line 18) | [McpForUnityTool("manage_packages", AutoRegister = false, Group = "core"...
    method HandleCommand (line 28) | public static object HandleCommand(JObject @params)
    method AddPackage (line 81) | private static object AddPackage(ToolParams p)
    method RemovePackage (line 116) | private static object RemovePackage(ToolParams p)
    method GetStatus (line 165) | private static object GetStatus(ToolParams p)
    method ListPackages (line 236) | private static object ListPackages(ToolParams p)
    method CheckListRequest (line 260) | private static object CheckListRequest(string jobId, ListRequest request)
    method SearchPackages (line 293) | private static object SearchPackages(ToolParams p)
    method CheckSearchRequest (line 320) | private static object CheckSearchRequest(string jobId, SearchRequest r...
    method GetPackageInfo (line 353) | private static object GetPackageInfo(ToolParams p)
    method ListRegistries (line 397) | private static object ListRegistries()
    method AddRegistry (line 427) | private static object AddRegistry(ToolParams p)
    method RemoveRegistry (line 493) | private static object RemoveRegistry(ToolParams p)
    method EmbedPackage (line 551) | private static object EmbedPackage(ToolParams p)
    method ResolvePackages (line 578) | private static object ResolvePackages()
    method Ping (line 592) | private static object Ping()
    method RegisterCompletionCallback (line 616) | private static void RegisterCompletionCallback(string jobId, Request r...
    method FinalizeRequest (line 636) | private static void FinalizeRequest(string jobId, Request request)
    method GetManifestPath (line 664) | private static string GetManifestPath()
    method TruncateDescription (line 669) | private static string TruncateDescription(string description, int maxL...
    method ValidatePackageIdentifier (line 677) | private static (bool isValid, string warning, string normalized) Valid...
    method GetDependentPackages (line 718) | private static string[] GetDependentPackages(string packageName)

FILE: MCPForUnity/Editor/Tools/ManageScene.cs
  class ManageScene (line 18) | [McpForUnityTool("manage_scene", AutoRegister = false)]
    class SceneCommand (line 21) | private sealed class SceneCommand
    method ParseFloatArray (line 59) | private static float[] ParseFloatArray(JToken token)
    method ToSceneCommand (line 85) | private static SceneCommand ToSceneCommand(JObject p)
    method HandleCommand (line 131) | public static object HandleCommand(JObject @params)
    method ExecuteScreenshot (line 240) | public static object ExecuteScreenshot(string fileName = null, int? su...
    method ExecuteSceneViewScreenshot (line 254) | public static object ExecuteSceneViewScreenshot(string fileName = null)
    method ExecuteMultiviewScreenshot (line 260) | public static object ExecuteMultiviewScreenshot(int maxResolution = 480)
    method CreateScene (line 266) | private static object CreateScene(string fullPath, string relativePath)
    method LoadScene (line 304) | private static object LoadScene(string relativePath)
    method LoadScene (line 350) | private static object LoadScene(int buildIndex)
    method SaveScene (line 389) | private static object SaveScene(string fullPath, string relativePath)
    method CaptureScreenshot (line 445) | private static object CaptureScreenshot(SceneCommand cmd)
    method CaptureSceneViewScreenshot (line 629) | private static object CaptureSceneViewScreenshot(
    method CaptureSurroundBatch (line 712) | private static object CaptureSurroundBatch(SceneCommand cmd)
    method CaptureOrbitBatch (line 855) | private static object CaptureOrbitBatch(SceneCommand cmd)
    method CapturePositionedScreenshot (line 1008) | private static object CapturePositionedScreenshot(SceneCommand cmd)
    method GetDirectionLabel (line 1120) | private static string GetDirectionLabel(float azimuthDeg)
    method ResolveCamera (line 1136) | private static Camera ResolveCamera(string cameraRef)
    method FrameSceneView (line 1177) | private static object FrameSceneView(SceneCommand cmd)
    method CalculateFrameBounds (line 1226) | private static Bounds CalculateFrameBounds(GameObject target)
    method TryGetRectTransformBounds (line 1243) | private static bool TryGetRectTransformBounds(GameObject target, out B...
    method TryGetRendererBounds (line 1279) | private static bool TryGetRendererBounds(GameObject target, out Bounds...
    method TryGetColliderBounds (line 1303) | private static bool TryGetColliderBounds(GameObject target, out Bounds...
    method EnsureGameView (line 1344) | private static void EnsureGameView()
    method ScheduleAssetImportWhenFileExists (line 1394) | private static void ScheduleAssetImportWhenFileExists(string assetsRel...
    method GetActiveSceneInfo (line 1449) | private static object GetActiveSceneInfo()
    method GetBuildSettingsScenes (line 1480) | private static object GetBuildSettingsScenes()
    method GetSceneHierarchyPaged (line 1506) | private static object GetSceneHierarchyPaged(SceneCommand cmd)
    method ResolveGameObject (line 1608) | private static GameObject ResolveGameObject(JToken targetToken, Scene ...
    method BuildGameObjectSummary (line 1664) | private static object BuildGameObjectSummary(GameObject go, bool inclu...
    method GetGameObjectPath (line 1724) | private static string GetGameObjectPath(GameObject go)

FILE: MCPForUnity/Editor/Tools/ManageScript.cs
  class ManageScript (line 54) | [McpForUnityTool("manage_script", AutoRegister = false)]
    method TryResolveUnderAssets (line 61) | private static bool TryResolveUnderAssets(string relDir, out string fu...
    method HandleCommand (line 124) | public static object HandleCommand(JObject @params)
    method DecodeBase64 (line 320) | private static string DecodeBase64(string encoded)
    method EncodeBase64 (line 329) | private static string EncodeBase64(string text)
    method CreateScript (line 335) | private static object CreateScript(
    method ReadScript (line 403) | private static object ReadScript(string fullPath, string relativePath)
    method UpdateScript (line 438) | private static object UpdateScript(
    method ApplyTextEdits (line 518) | private static object ApplyTextEdits(
    method TryIndexFromLineCol (line 821) | private static bool TryIndexFromLineCol(string text, int line1, int co...
    method ComputeSha256 (line 856) | private static string ComputeSha256(string contents)
    type CSharpLexer (line 871) | private struct CSharpLexer
      method CSharpLexer (line 882) | public CSharpLexer(string text, int start = 0, int end = -1)
      method Advance (line 904) | public bool Advance(out char c)
      method SkipInterpolatedStringBody (line 1029) | private void SkipInterpolatedStringBody(bool isVerbatim)
      method SkipInterpolatedRawStringBody (line 1093) | private void SkipInterpolatedRawStringBody(int dollarCount, int quot...
    method CheckBalancedDelimiters (line 1173) | private static bool CheckBalancedDelimiters(string text, out int line,...
    method DeleteScript (line 1212) | private static object DeleteScript(string fullPath, string relativePath)
    method EditScript (line 1250) | private static object EditScript(
    method HasOverlaps (line 1718) | private static bool HasOverlaps(IEnumerable<(int start, int length, st...
    method ExtractReplacement (line 1729) | private static string ExtractReplacement(JObject op)
    method NormalizeNewlines (line 1743) | private static string NormalizeNewlines(string t)
    method ValidateClassSnippet (line 1749) | private static bool ValidateClassSnippet(string snippet, string expect...
    method TryComputeClassSpan (line 1769) | private static bool TryComputeClassSpan(string source, string classNam...
    method TryComputeClassSpanBalanced (line 1803) | private static bool TryComputeClassSpanBalanced(string source, string ...
    method TryComputeMethodSpan (line 1837) | private static bool TryComputeMethodSpan(
    method IndexOfTokenWithin (line 2036) | private static int IndexOfTokenWithin(string s, string token, int star...
    method TryFindClassInsertionPoint (line 2042) | private static bool TryFindClassInsertionPoint(string source, int clas...
    method FindBestAnchorMatch (line 2083) | private static Match FindBestAnchorMatch(MatchCollection matches, stri...
    method IndexOfClassToken (line 2139) | private static int IndexOfClassToken(string s, string className)
    method AppearsWithinNamespaceHeader (line 2178) | private static bool AppearsWithinNamespaceHeader(string s, int pos, st...
    method GenerateDefaultScriptContent (line 2188) | private static string GenerateDefaultScriptContent(
    method GetValidationLevelFromGUI (line 2250) | private static ValidationLevel GetValidationLevelFromGUI()
    method ValidateScriptSyntax (line 2259) | private static bool ValidateScriptSyntax(string contents)
    method ValidateScriptSyntax (line 2267) | private static bool ValidateScriptSyntax(string contents, ValidationLe...
    type ValidationLevel (line 2331) | private enum ValidationLevel
    method ValidateScriptSyntaxRoslyn (line 2350) | private static bool ValidateScriptSyntaxRoslyn(string contents, Valida...
    method ValidateScriptSemantics (line 2392) | private static bool ValidateScriptSemantics(string contents, System.Co...
    method GetCompilationReferences (line 2455) | private static System.Collections.Generic.List<MetadataReference> GetC...
    method ValidateScriptSyntaxRoslyn (line 2523) | private static bool ValidateScriptSyntaxRoslyn(string contents, Valida...
    method CountTopLevelParams (line 2530) | private static int CountTopLevelParams(string paramStr)
    method ExtractParamTypes (line 2547) | private static string ExtractParamTypes(string paramStr)
    method ValidateScriptSyntaxUnity (line 2585) | private static void ValidateScriptSyntaxUnity(string contents, System....
    method CheckDuplicateMethodSignatures (line 2652) | private static void CheckDuplicateMethodSignatures(string contents, Sy...
    method IsCSharpKeyword (line 2775) | private static bool IsCSharpKeyword(string name) => CSharpKeywords.Con...
    method ValidateSemanticRules (line 2780) | private static void ValidateSemanticRules(string contents, System.Coll...
  class RefreshDebounce (line 2909) | static class RefreshDebounce
    method Schedule (line 2921) | public static void Schedule(string relPath, TimeSpan window)
    method Tick (line 2944) | private static void Tick(TimeSpan window)
  class ManageScriptRefreshHelpers (line 2982) | static class ManageScriptRefreshHelpers
    method SanitizeAssetsPath (line 2984) | public static string SanitizeAssetsPath(string p)
    method ScheduleScriptRefresh (line 2997) | public static void ScheduleScriptRefresh(string relPath)
    method ImportAndRequestCompile (line 3003) | public static void ImportAndRequestCompile(string relPath, bool synchr...

FILE: MCPForUnity/Editor/Tools/ManageScriptableObject.cs
  class ManageScriptableObject (line 20) | [McpForUnityTool("manage_scriptable_object", AutoRegister = false, Group...
    method HandleCommand (line 40) | public static object HandleCommand(JObject @params)
    method HandleCreate (line 77) | private static object HandleCreate(JObject @params)
    method HandleModify (line 212) | private static object HandleModify(JObject @params)
    method ValidatePatches (line 269) | private static List<object> ValidatePatches(UnityEngine.Object target,...
    method ApplyPatches (line 441) | private static (List<object> results, List<string> warnings) ApplyPatc...
    method ApplyPatch (line 495) | private static object ApplyPatch(SerializedObject so, string propertyP...
    method NormalizePropertyPath (line 523) | private static string NormalizePropertyPath(string path)
    method EnsureArrayCapacity (line 565) | private static bool EnsureArrayCapacity(SerializedObject so, string pa...
    method ApplyArrayResize (line 602) | private static object ApplyArrayResize(SerializedObject so, string pro...
    method ApplySet (line 696) | private static object ApplySet(SerializedObject so, string propertyPat...
    method TrySetValue (line 812) | private static bool TrySetValue(SerializedProperty prop, JToken valueT...
    method TrySetValueRecursive (line 824) | private static bool TrySetValueRecursive(SerializedProperty prop, JTok...
    method TrySetEnum (line 1069) | private static bool TrySetEnum(SerializedProperty prop, JToken valueTo...
    method TrySetAnimationCurve (line 1122) | private static bool TrySetAnimationCurve(SerializedProperty prop, JTok...
    method TrySetQuaternion (line 1228) | private static bool TrySetQuaternion(SerializedProperty prop, JToken v...
    method TryResolveTarget (line 1317) | private static bool TryResolveTarget(JToken targetToken, out UnityEngi...
    method CoerceJsonStringArrayParameter (line 1362) | private static void CoerceJsonStringArrayParameter(JObject @params, st...
    method EnsureFolderExists (line 1382) | private static bool EnsureFolderExists(string folderPath, out string e...
    method SanitizeSlashes (line 1439) | private static string SanitizeSlashes(string path)
    method TryNormalizeFolderPath (line 1454) | private static bool TryNormalizeFolderPath(string folderPath, out stri...
    method NormalizeAction (line 1504) | private static string NormalizeAction(string raw)
    method IsCreateAction (line 1511) | private static bool IsCreateAction(string normalized)
    method ResolveType (line 1519) | private static Type ResolveType(string typeName)

FILE: MCPForUnity/Editor/Tools/ManageShader.cs
  class ManageShader (line 15) | [McpForUnityTool("manage_shader", AutoRegister = false, Group = "vfx")]
    method HandleCommand (line 21) | public static object HandleCommand(JObject @params)
    method DecodeBase64 (line 134) | private static string DecodeBase64(string encoded)
    method EncodeBase64 (line 143) | private static string EncodeBase64(string text)
    method CreateShader (line 149) | private static object CreateShader(
    method ReadShader (line 194) | private static object ReadShader(string fullPath, string relativePath)
    method UpdateShader (line 228) | private static object UpdateShader(
    method DeleteShader (line 262) | private static object DeleteShader(string fullPath, string relativePath)
    method GenerateDefaultShaderContent (line 294) | private static string GenerateDefaultShaderContent(string name)

FILE: MCPForUnity/Editor/Tools/ManageTexture.cs
  class ManageTexture (line 16) | [McpForUnityTool("manage_texture", AutoRegister = false, Group = "vfx")]
    method ValidateDimensions (line 33) | private static ErrorResponse ValidateDimensions(int width, int height,...
    method HandleCommand (line 46) | public static object HandleCommand(JObject @params)
    method CreateTexture (line 94) | private static object CreateTexture(JObject @params, bool asSprite)
    method ModifyTexture (line 245) | private static object ModifyTexture(JObject @params)
    method DeleteTexture (line 335) | private static object DeleteTexture(string path)
    method ApplyPattern (line 358) | private static object ApplyPattern(JObject @params)
    method ApplyGradient (line 364) | private static object ApplyGradient(JObject @params)
    method ApplyNoise (line 449) | private static object ApplyNoise(JObject @params)
    method ApplyPatternToTexture (line 532) | private static void ApplyPatternToTexture(Texture2D texture, string pa...
    method GetPatternColor (line 552) | private static Color32 GetPatternColor(int x, int y, string pattern, L...
    method ApplyLinearGradient (line 604) | private static void ApplyLinearGradient(Texture2D texture, List<Color3...
    method ApplyRadialGradient (line 628) | private static void ApplyRadialGradient(Texture2D texture, List<Color3...
    method LerpPalette (line 651) | private static Color32 LerpPalette(List<Color32> palette, float t)
    method ApplyPerlinNoise (line 671) | private static void ApplyPerlinNoise(Texture2D texture, List<Color32> ...
    method ConfigureAsSprite (line 706) | private static void ConfigureAsSprite(string path, JToken spriteSettings)
    method ConfigureTextureImporter (line 743) | private static void ConfigureTextureImporter(string path, JToken impor...
    method TryParseEnum (line 978) | private static bool TryParseEnum<T>(string value, out T result) where ...
    method AssetExists (line 997) | private static bool AssetExists(string path)
    method EnsureDirectoryExists (line 1002) | private static void EnsureDirectoryExists(string assetPath)
    method GetAbsolutePath (line 1012) | private static string GetAbsolutePath(string assetPath)
    method ResolveImagePath (line 1017) | private static string ResolveImagePath(string imagePath)

FILE: MCPForUnity/Editor/Tools/ManageUI.cs
  class ManageUI (line 16) | [McpForUnityTool("manage_ui", AutoRegister = false, Group = "ui")]
    method ManageUI (line 27) | static ManageUI()
    method CleanupRenderTextures (line 33) | private static void CleanupRenderTextures()
    method HandleCommand (line 48) | public static object HandleCommand(JObject @params)
    method ValidatePath (line 112) | private static string ValidatePath(string path, out string error)
    method CreateFile (line 138) | private static object CreateFile(JObject @params)
    method ReadFile (line 207) | private static object ReadFile(JObject @params)
    method UpdateFile (line 236) | private static object UpdateFile(JObject @params)
    method AttachUIDocument (line 299) | private static object AttachUIDocument(JObject @params)
    method CreatePanelSettings (line 395) | private static object CreatePanelSettings(JObject @params)
    method UpdatePanelSettings (line 462) | private static object UpdatePanelSettings(JObject @params)
    method CreateDefaultPanelSettings (line 498) | private static PanelSettings CreateDefaultPanelSettings(string path)
    method ApplyPanelSettingsProperties (line 521) | private static void ApplyPanelSettingsProperties(PanelSettings ps, JOb...
    method ApplyDynamicAtlasSettings (line 607) | private static void ApplyDynamicAtlasSettings(PanelSettings ps, JObjec...
    method NormalizeKey (line 626) | private static string NormalizeKey(string key)
    method TryParseEnum (line 633) | private static bool TryParseEnum<T>(JToken token, out T result) where ...
    method TryFloat (line 640) | private static bool TryFloat(JToken token, out float result)
    method TryInt (line 652) | private static bool TryInt(JToken token, out int result)
    method TryParseColor (line 664) | private static bool TryParseColor(JToken token, out Color color)
    method EnsureFolderExists (line 689) | private static void EnsureFolderExists(string assetFolderPath)
    method GetVisualTree (line 707) | private static object GetVisualTree(JObject @params)
    method SerializeVisualElement (line 757) | private static object SerializeVisualElement(VisualElement element, in...
    class MCP_ScreenCapturer (line 820) | private sealed class MCP_ScreenCapturer : MonoBehaviour
      method Start (line 822) | private System.Collections.IEnumerator Start()
    method RenderUI (line 852) | private static object RenderUI(JObject @params)
    method LinkStylesheet (line 1217) | private static object LinkStylesheet(JObject @params)
    method DeleteFile (line 1274) | private static object DeleteFile(JObject @params)
    method ListUIAssets (line 1314) | private static object ListUIAssets(JObject @params)
    method DetachUIDocument (line 1415) | private static object DetachUIDocument(JObject @params)
    method ModifyVisualElement (line 1453) | private static object ModifyVisualElement(JObject @params)
    method ApplyInlineStyles (line 1610) | private static void ApplyInlineStyles(VisualElement element, JObject s...
    method GetNullableBool (line 1750) | private static bool? GetNullableBool(this ToolParams p, string key)
    method FindUxmlBodyStart (line 1764) | private static int FindUxmlBodyStart(string content)
    method EnsureUniqueFilePath (line 1798) | private static string EnsureUniqueFilePath(string path)
    method ColorToHex (line 1814) | private static string ColorToHex(Color c)
    method GetDecodedContents (line 1819) | private static string GetDecodedContents(ToolParams p)
    method EnsureEditorExtensionMode (line 1856) | private static string EnsureEditorExtensionMode(string contents)
    method ValidateUxmlContent (line 1879) | private static string ValidateUxmlContent(string contents, List<string...
    method ValidateUxmlPostImport (line 1927) | private static void ValidateUxmlPostImport(string assetPath, List<stri...

FILE: MCPForUnity/Editor/Tools/McpForUnityToolAttribute.cs
  class McpForUnityToolAttribute (line 8) | [AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
    method McpForUnityToolAttribute (line 70) | public McpForUnityToolAttribute()
    method McpForUnityToolAttribute (line 79) | public McpForUnityToolAttribute(string name = null)
  class ToolParameterAttribute (line 88) | [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, Allo...
    method ToolParameterAttribute (line 111) | public ToolParameterAttribute(string description)

FILE: MCPForUnity/Editor/Tools/Prefabs/ManagePrefabs.cs
  class ManagePrefabs (line 14) | [McpForUnityTool("manage_prefabs", AutoRegister = false)]
    method HandleCommand (line 28) | public static object HandleCommand(JObject @params)
    method CreatePrefabFromGameObject (line 69) | private static object CreatePrefabFromGameObject(JObject @params)
    method ValidateCreatePrefabParams (line 170) | private static (bool isValid, string errorMessage, string targetName, ...
    method ValidateSourceObjectForPrefab (line 215) | private static (bool isValid, string errorMessage, bool shouldUnlink, ...
    method CreatePrefabAsset (line 251) | private static GameObject CreatePrefabAsset(GameObject sourceObject, s...
    method PersistRuntimeMaterials (line 276) | private static (int count, List<string> paths) PersistRuntimeMaterials...
    method EnsureAssetFolderExists (line 371) | private static void EnsureAssetFolderExists(string assetFolderPath)
    method HasPropertyBlockColors (line 387) | private static bool HasPropertyBlockColors(Renderer renderer, int slot)
    method ApplyPropertyBlockToMaterial (line 397) | private static void ApplyPropertyBlockToMaterial(Renderer renderer, in...
    method EnsureAssetDirectoryExists (line 418) | private static void EnsureAssetDirectoryExists(string assetPath)
    method FindSceneObjectByName (line 443) | private static GameObject FindSceneObjectByName(string name, bool incl...
    method GetInfo (line 486) | private static object GetInfo(JObject @params)
    method GetHierarchy (line 532) | private static object GetHierarchy(JObject @params)
    method ModifyContents (line 583) | private static object ModifyContents(JObject @params)
    method FindInPrefabContents (line 677) | private static GameObject FindInPrefabContents(GameObject prefabConten...
    method ApplyModificationsToPrefabObject (line 728) | private static (bool modified, ErrorResponse error) ApplyModifications...
    method CreateSingleChildInPrefab (line 960) | private static (bool created, ErrorResponse error) CreateSingleChildIn...
    method BuildHierarchyItems (line 1111) | private static List<object> BuildHierarchyItems(Transform root, string...
    method BuildHierarchyItemsRecursive (line 1126) | private static void BuildHierarchyItemsRecursive(Transform transform, ...

FILE: MCPForUnity/Editor/Tools/ProBuilder/ManageProBuilder.cs
  class ManageProBuilder (line 58) | [McpForUnityTool("manage_probuilder", AutoRegister = false, Group = "pro...
    method EnsureProBuilder (line 87) | private static bool EnsureProBuilder()
    method PatchProBuilderDefaultMaterial (line 152) | private static void PatchProBuilderDefaultMaterial()
    method HandleCommand (line 179) | public static object HandleCommand(JObject @params)
    method FindTarget (line 265) | internal static GameObject FindTarget(JObject @params)
    method GetProBuilderMesh (line 270) | private static Component GetProBuilderMesh(GameObject go)
    method RequireProBuilderMesh (line 275) | internal static Component RequireProBuilderMesh(JObject @params)
    method RefreshMesh (line 286) | internal static void RefreshMesh(Component pbMesh)
    method GetFacesArray (line 313) | internal static object GetFacesArray(Component pbMesh)
    method GetFacesByIndices (line 319) | internal static Array GetFacesByIndices(Component pbMesh, JToken faceI...
    method ExtractProperties (line 347) | internal static JObject ExtractProperties(JObject @params)
    method ParseVector3 (line 361) | private static Vector3 ParseVector3(JToken token)
    method GetFaceCount (line 366) | internal static int GetFaceCount(Component pbMesh)
    method GetVertexCount (line 372) | internal static int GetVertexCount(Component pbMesh)
    method GetPivotCenter (line 378) | private static object GetPivotCenter()
    method InvokeGenerator (line 385) | private static Component InvokeGenerator(string methodName, Type[] par...
    method GetEdgeVertexA (line 398) | private static int GetEdgeVertexA(object edge)
    method GetEdgeVertexB (line 406) | private static int GetEdgeVertexB(object edge)
    method CreateEdge (line 414) | private static object CreateEdge(int a, int b)
    method ToTypedFaceList (line 424) | private static System.Collections.IList ToTypedFaceList(Array faces)
    method CollectUniqueEdges (line 437) | internal static List<object> CollectUniqueEdges(Component pbMesh)
    method BuildSharedVertexLookup (line 469) | private static Dictionary<int, int> BuildSharedVertexLookup(Component ...
    method ResolveEdges (line 492) | private static Array ResolveEdges(Component pbMesh, JObject props, out...
    method ToTypedEdgeList (line 536) | private static System.Collections.IList ToTypedEdgeList(Array edgeArray)
    method CreateShape (line 549) | private static object CreateShape(JObject @params)
    method CreateShapeViaGenerator (line 605) | private static Component CreateShapeViaGenerator(string shapeType, JOb...
    method CreateShapeGeneric (line 809) | private static Component CreateShapeGeneric(string shapeTypeStr)
    method CreatePolyShape (line 851) | private static object CreatePolyShape(JObject @params)
    method ExtrudeFaces (line 914) | private static object ExtrudeFaces(JObject @params)
    method ExtrudeEdges (line 955) | private static object ExtrudeEdges(JObject @params)
    method BevelEdges (line 996) | private static object BevelEdges(JObject @params)
    method Subdivide (line 1038) | private static object Subdivide(JObject @params)
    method DeleteFaces (line 1073) | private static object DeleteFaces(JObject @params)
    method BridgeEdges (line 1138) | private static object BridgeEdges(JObject @params)
    method ConnectElements (line 1203) | private static object ConnectElements(JObject @params)
    method DetachFaces (line 1270) | private static object DetachFaces(JObject @params)
    method FlipNormals (line 1322) | private static object FlipNormals(JObject @params)
    method MergeFaces (line 1345) | private static object MergeFaces(JObject @params)
    method CombineMeshes (line 1375) | private static object CombineMeshes(JObject @params)
    method ConvertToProBuilderInternal (line 1426) | private static Component ConvertToProBuilderInternal(GameObject go)
    method MergeObjects (line 1463) | private static object MergeObjects(JObject @params)
    method DuplicateAndFlip (line 1533) | private static object DuplicateAndFlip(JObject @params)
    method CreatePolygon (line 1565) | private static object CreatePolygon(JObject @params)
    method MergeVertices (line 1608) | private static object MergeVertices(JObject @params)
    method WeldVertices (line 1645) | private static object WeldVertices(JObject @params)
    method SplitVertices (line 1685) | private static object SplitVertices(JObject @params)
    method MoveVertices (line 1728) | private static object MoveVertices(JObject @params)
    method InsertVertex (line 1802) | private static object InsertVertex(JObject @params)
    method AppendVerticesToEdge (line 1873) | private static object AppendVerticesToEdge(JObject @params)
    method SelectFaces (line 1933) | private static object SelectFaces(JObject @params)
    method IndexOfFace (line 2065) | private static int IndexOfFace(System.Collections.IList facesList, obj...
    method SetFaceMaterial (line 2079) | private static object SetFaceMaterial(JObject @params)
    method SetFaceColor (line 2149) | private static object SetFaceColor(JObject @params)
    method SetFaceUVs (line 2200) | private static object SetFaceUVs(JObject @params)
    method GetMeshInfo (line 2275) | private static object GetMeshInfo(JObject @params)
    method ComputeFaceNormal (line 2387) | private static Vector3 ComputeFaceNormal(Component pbMesh, object face,
    method ComputeFaceCenter (line 2410) | private static Vector3 ComputeFaceCenter(Component pbMesh, object face,
    method ClassifyDirection (line 2433) | private static string ClassifyDirection(Vector3 normal)
    method Round (line 2453) | internal static float Round(float v) => (float)Math.Round(v, 4);
    method ConvertToProBuilder (line 2455) | private static object ConvertToProBuilder(JObject @params)

FILE: MCPForUnity/Editor/Tools/ProBuilder/ProBuilderMeshUtils.cs
  class ProBuilderMeshUtils (line 11) | internal static class ProBuilderMeshUtils
    method CenterPivot (line 13) | internal static object CenterPivot(JObject @params)
    method FreezeTransform (line 65) | internal static object FreezeTransform(JObject @params)
    method ValidateMesh (line 98) | internal static object ValidateMesh(JObject @p
Condensed preview — 1717 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (7,604K chars).
[
  {
    "path": ".dockerignore",
    "chars": 52,
    "preview": "Server/build\n.git\n.venv\n__pycache__\n*.pyc\n.DS_Store\n"
  },
  {
    "path": ".github/actions/publish-docker/action.yml",
    "chars": 3980,
    "preview": "name: Publish Docker image\ndescription: Build and push the Docker image to Docker Hub\ninputs:\n  docker_username:\n    req"
  },
  {
    "path": ".github/actions/publish-pypi/action.yml",
    "chars": 679,
    "preview": "name: Publish Python distribution to PyPI\ndescription: Build and publish the Python package from Server/ to PyPI\nruns:\n "
  },
  {
    "path": ".github/pull_request_template.md",
    "chars": 1130,
    "preview": "## Description\n<!-- Provide a brief description of your changes -->\n\n## Type of Change\n<!-- Save the type of change you "
  },
  {
    "path": ".github/scripts/mark_skipped.py",
    "chars": 3615,
    "preview": "#!/usr/bin/env python3\n\"\"\"\nPost-processes a JUnit XML so that \"expected\"/environmental failures\n(e.g., permission prompt"
  },
  {
    "path": ".github/workflows/beta-release.yml",
    "chars": 8477,
    "preview": "name: Beta Release (PyPI Pre-release)\n\nconcurrency:\n  group: beta-release\n  cancel-in-progress: true\n\non:\n  push:\n    br"
  },
  {
    "path": ".github/workflows/claude-nl-suite.yml",
    "chars": 71040,
    "preview": "name: Claude NL/T Full Suite (Unity live)\n\non: [workflow_dispatch]\n\npermissions:\n  contents: read\n  checks: write\n  id-t"
  },
  {
    "path": ".github/workflows/github-repo-stats.yml",
    "chars": 576,
    "preview": "name: github-repo-stats\n\non:\n  # schedule:\n    # Run this once per day, towards the end of the day for keeping the most\n"
  },
  {
    "path": ".github/workflows/python-tests.yml",
    "chars": 1293,
    "preview": "name: Python Tests\n\non:\n  push:\n    branches: [\"**\"]\n    paths:\n      - Server/**\n      - .github/workflows/python-tests"
  },
  {
    "path": ".github/workflows/release.yml",
    "chars": 18825,
    "preview": "name: Release\n\nconcurrency:\n  group: release-main\n  cancel-in-progress: false\n\non:\n  workflow_dispatch:\n    inputs:\n    "
  },
  {
    "path": ".github/workflows/unity-tests.yml",
    "chars": 3075,
    "preview": "name: Unity Tests\n\non:\n  workflow_dispatch: {}\n  push:\n    branches: [\"**\"]\n    paths:\n      - TestProjects/UnityMCPTest"
  },
  {
    "path": ".gitignore",
    "chars": 1013,
    "preview": "# AI-related files (user-specific)\n.cursorrules\n.cursorignore\n.windsurf\n.codeiumignore\n.kiro\n\n# Code-copy related files\n"
  },
  {
    "path": ".mcpbignore",
    "chars": 1109,
    "preview": "# MCPB Ignore File\n# This bundle uses uvx pattern - package downloaded from PyPI at runtime\n# Only manifest.json, icon.p"
  },
  {
    "path": "CLAUDE.md",
    "chars": 7186,
    "preview": "# CLAUDE.md\n\nThis file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.\n\n## "
  },
  {
    "path": "CustomTools/RoslynRuntimeCompilation/ManageRuntimeCompilation.cs",
    "chars": 20840,
    "preview": "#nullable disable\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Refle"
  },
  {
    "path": "CustomTools/RoslynRuntimeCompilation/ManageRuntimeCompilation.cs.meta",
    "chars": 59,
    "preview": "fileFormatVersion: 2\nguid: 1c3b2419382faa04481f4a631c510ee6"
  },
  {
    "path": "CustomTools/RoslynRuntimeCompilation/RoslynRuntimeCompiler.cs",
    "chars": 46844,
    "preview": "// RoslynRuntimeCompiler.cs\n// Single-file Unity tool for Editor+PlayMode dynamic C# compilation using Roslyn.\n// Featur"
  },
  {
    "path": "CustomTools/RoslynRuntimeCompilation/RoslynRuntimeCompiler.cs.meta",
    "chars": 59,
    "preview": "fileFormatVersion: 2\nguid: 97f1198c66ce56043a3c8a5e05ba0150"
  },
  {
    "path": "LICENSE",
    "chars": 1066,
    "preview": "MIT License\n\nCopyright (c) 2025 CoplayDev\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\n"
  },
  {
    "path": "MCPForUnity/Editor/AssemblyInfo.cs",
    "chars": 100,
    "preview": "using System.Runtime.CompilerServices;\n\n[assembly: InternalsVisibleTo(\"MCPForUnityTests.EditMode\")]\n"
  },
  {
    "path": "MCPForUnity/Editor/AssemblyInfo.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: be61633e00d934610ac1ff8192ffbe3d\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "MCPForUnity/Editor/Clients/Configurators/AntigravityConfigurator.cs",
    "chars": 1363,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing MCPForUnity.Editor.Constants;\nusing MCPForUnity.E"
  },
  {
    "path": "MCPForUnity/Editor/Clients/Configurators/AntigravityConfigurator.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: 331b33961513042e3945d0a1d06615b5\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "MCPForUnity/Editor/Clients/Configurators/CherryStudioConfigurator.cs",
    "chars": 4152,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing MCPForUnity.Editor.Constants;\nusing MCPForUnity.E"
  },
  {
    "path": "MCPForUnity/Editor/Clients/Configurators/CherryStudioConfigurator.cs.meta",
    "chars": 242,
    "preview": "fileFormatVersion: 2\nguid: 6de06c6bb0399154d840a1e4c84be869\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "MCPForUnity/Editor/Clients/Configurators/ClaudeCodeConfigurator.cs",
    "chars": 1279,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing MCPForUnity.Editor.Models;\n\nnamespace MCPForUnity"
  },
  {
    "path": "MCPForUnity/Editor/Clients/Configurators/ClaudeCodeConfigurator.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: d0d22681fc594475db1c189f2d9abdf7\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "MCPForUnity/Editor/Clients/Configurators/ClaudeDesktopConfigurator.cs",
    "chars": 2524,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing MCPForUnity.Editor.Constants;\nusing MCPForUnity.E"
  },
  {
    "path": "MCPForUnity/Editor/Clients/Configurators/ClaudeDesktopConfigurator.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: d5e5d87c9db57495f842dc366f1ebd65\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "MCPForUnity/Editor/Clients/Configurators/ClineConfigurator.cs",
    "chars": 1535,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing MCPForUnity.Editor.Models;\n\nnamespace MCPForUnity"
  },
  {
    "path": "MCPForUnity/Editor/Clients/Configurators/ClineConfigurator.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: 6b8abf0951c7413d9ff97a053b0adf2d\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "MCPForUnity/Editor/Clients/Configurators/CodeBuddyCliConfigurator.cs",
    "chars": 1179,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing MCPForUnity.Editor.Models;\n\nnamespace MCPForUnity"
  },
  {
    "path": "MCPForUnity/Editor/Clients/Configurators/CodeBuddyCliConfigurator.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: 923728a98c8c74cfaa6e9203c408f34e\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "MCPForUnity/Editor/Clients/Configurators/CodexConfigurator.cs",
    "chars": 1328,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing MCPForUnity.Editor.Models;\n\nnamespace MCPForUnity"
  },
  {
    "path": "MCPForUnity/Editor/Clients/Configurators/CodexConfigurator.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: c7037ef8b168e49f79247cb31c3be75a\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "MCPForUnity/Editor/Clients/Configurators/CopilotCliConfigurator.cs",
    "chars": 1189,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing MCPForUnity.Editor.Models;\n\nnamespace MCPForUnity"
  },
  {
    "path": "MCPForUnity/Editor/Clients/Configurators/CopilotCliConfigurator.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: 14a4b9a7f749248d496466c2a3a53e56\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "MCPForUnity/Editor/Clients/Configurators/CursorConfigurator.cs",
    "chars": 1092,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing MCPForUnity.Editor.Models;\n\nnamespace MCPForUnity"
  },
  {
    "path": "MCPForUnity/Editor/Clients/Configurators/CursorConfigurator.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: b708eda314746481fb8f4a1fb0652b03\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "MCPForUnity/Editor/Clients/Configurators/GeminiCliConfigurator.cs",
    "chars": 1277,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing MCPForUnity.Editor.Constants;\nusing MCPForUnity.E"
  },
  {
    "path": "MCPForUnity/Editor/Clients/Configurators/GeminiCliConfigurator.cs.meta",
    "chars": 481,
    "preview": "fileFormatVersion: 2\nguid: c5e9bbb45e552453ab5cb557a22d43e7\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "MCPForUnity/Editor/Clients/Configurators/KiloCodeConfigurator.cs",
    "chars": 1488,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing MCPForUnity.Editor.Models;\n\nnamespace MCPForUnity"
  },
  {
    "path": "MCPForUnity/Editor/Clients/Configurators/KiloCodeConfigurator.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: 3286d62ffe5644f5ea60488fd7e6513d\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "MCPForUnity/Editor/Clients/Configurators/KiroConfigurator.cs",
    "chars": 1213,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing MCPForUnity.Editor.Models;\n\nnamespace MCPForUnity"
  },
  {
    "path": "MCPForUnity/Editor/Clients/Configurators/KiroConfigurator.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: e9b73ff071a6043dda1f2ec7d682ef71\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "MCPForUnity/Editor/Clients/Configurators/OpenCodeConfigurator.cs",
    "chars": 6392,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing MCPForUnity.Editor.Helpers;\nusing MCPForUnity.Edi"
  },
  {
    "path": "MCPForUnity/Editor/Clients/Configurators/OpenCodeConfigurator.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: 489f99ffb7e6743e88e3203552c8b37b\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "MCPForUnity/Editor/Clients/Configurators/QwenCodeConfigurator.cs",
    "chars": 2092,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing MCPForUnity.Editor.Models;\n\nnamespace MCPForUnity"
  },
  {
    "path": "MCPForUnity/Editor/Clients/Configurators/QwenCodeConfigurator.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: 46891bcdb00e468cbd04afbfb8f3095e\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "MCPForUnity/Editor/Clients/Configurators/RiderConfigurator.cs",
    "chars": 1200,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing MCPForUnity.Editor.Models;\n\nnamespace MCPForUnit"
  },
  {
    "path": "MCPForUnity/Editor/Clients/Configurators/RiderConfigurator.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: 2511b0d05271d486bb61f8cc9fd11363\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "MCPForUnity/Editor/Clients/Configurators/TraeConfigurator.cs",
    "chars": 1261,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing MCPForUnity.Editor.Models;\n\nnamespace MCPForUnity"
  },
  {
    "path": "MCPForUnity/Editor/Clients/Configurators/TraeConfigurator.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: b3ab39e22ae0948ab94beae307f9902e\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "MCPForUnity/Editor/Clients/Configurators/VSCodeConfigurator.cs",
    "chars": 1149,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing MCPForUnity.Editor.Models;\n\nnamespace MCPForUnity"
  },
  {
    "path": "MCPForUnity/Editor/Clients/Configurators/VSCodeConfigurator.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: bcc7ead475a4d4ea2978151c217757b8\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "MCPForUnity/Editor/Clients/Configurators/VSCodeInsidersConfigurator.cs",
    "chars": 1237,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing MCPForUnity.Editor.Models;\n\nnamespace MCPForUnity"
  },
  {
    "path": "MCPForUnity/Editor/Clients/Configurators/VSCodeInsidersConfigurator.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: 2c4a1b0d3b34489cbf0f8c40c49c4f3b\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "MCPForUnity/Editor/Clients/Configurators/WindsurfConfigurator.cs",
    "chars": 1315,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing MCPForUnity.Editor.Models;\n\nnamespace MCPForUnity"
  },
  {
    "path": "MCPForUnity/Editor/Clients/Configurators/WindsurfConfigurator.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: b528971e189f141d38db577f155bd222\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "MCPForUnity/Editor/Clients/Configurators.meta",
    "chars": 172,
    "preview": "fileFormatVersion: 2\nguid: 59ff83375c2c74c8385c4a22549778dd\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  us"
  },
  {
    "path": "MCPForUnity/Editor/Clients/IMcpClientConfigurator.cs",
    "chars": 2111,
    "preview": "using MCPForUnity.Editor.Models;\n\nnamespace MCPForUnity.Editor.Clients\n{\n    /// <summary>\n    /// Contract for MCP clie"
  },
  {
    "path": "MCPForUnity/Editor/Clients/IMcpClientConfigurator.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: f5a5078d9e6e14027a1abfebf4018634\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "MCPForUnity/Editor/Clients/McpClientConfiguratorBase.cs",
    "chars": 61968,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Runtime.InteropServices;\nusing MCPForUnity"
  },
  {
    "path": "MCPForUnity/Editor/Clients/McpClientConfiguratorBase.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: 8d408fd7733cb4a1eb80f785307db2ff\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "MCPForUnity/Editor/Clients/McpClientRegistry.cs",
    "chars": 1846,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing MCPForUnity.Editor.Helpers;\nusing UnityEditor;\n"
  },
  {
    "path": "MCPForUnity/Editor/Clients/McpClientRegistry.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: 4ce08555f995e4e848a826c63f18cb35\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "MCPForUnity/Editor/Clients.meta",
    "chars": 172,
    "preview": "fileFormatVersion: 2\nguid: c9d47f01d06964ee7843765d1bd71205\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  us"
  },
  {
    "path": "MCPForUnity/Editor/Constants/AuthConstants.cs",
    "chars": 251,
    "preview": "namespace MCPForUnity.Editor.Constants\n{\n    /// <summary>\n    /// Protocol-level constants for API key authentication.\n"
  },
  {
    "path": "MCPForUnity/Editor/Constants/AuthConstants.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: 96844bc39e9a94cf18b18f8127f3854f\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "MCPForUnity/Editor/Constants/EditorPrefKeys.cs",
    "chars": 4983,
    "preview": "namespace MCPForUnity.Editor.Constants\n{\n    /// <summary>\n    /// Centralized list of EditorPrefs keys used by the MCP "
  },
  {
    "path": "MCPForUnity/Editor/Constants/EditorPrefKeys.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: 7317786cfb9304b0db20ca73a774b9fa\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "MCPForUnity/Editor/Constants/HealthStatus.cs",
    "chars": 471,
    "preview": "namespace MCPForUnity.Editor.Constants\n{\n    /// <summary>\n    /// Constants for health check status values.\n    /// Use"
  },
  {
    "path": "MCPForUnity/Editor/Constants/HealthStatus.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: c15ed2426f43860479f1b8a99a343d16\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "MCPForUnity/Editor/Constants.meta",
    "chars": 172,
    "preview": "fileFormatVersion: 2\nguid: f7e009cbf3e74f6c987331c2b438ec59\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  us"
  },
  {
    "path": "MCPForUnity/Editor/Dependencies/DependencyManager.cs",
    "chars": 5048,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Runtime.InteropServices;\nusing MCPForUni"
  },
  {
    "path": "MCPForUnity/Editor/Dependencies/DependencyManager.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: 4a6d2236d370b4f1db4d0e3d3ce0dcac\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "MCPForUnity/Editor/Dependencies/Models/DependencyCheckResult.cs",
    "chars": 3126,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace MCPForUnity.Editor.Dependencies.Models\n{\n "
  },
  {
    "path": "MCPForUnity/Editor/Dependencies/Models/DependencyCheckResult.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: f6df82faa423f4e9ebb13a3dcee8ba19\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "MCPForUnity/Editor/Dependencies/Models/DependencyStatus.cs",
    "chars": 1828,
    "preview": "using System;\n\nnamespace MCPForUnity.Editor.Dependencies.Models\n{\n    /// <summary>\n    /// Represents the status of a d"
  },
  {
    "path": "MCPForUnity/Editor/Dependencies/Models/DependencyStatus.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: ddeeeca2f876f4083a84417404175199\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "MCPForUnity/Editor/Dependencies/Models.meta",
    "chars": 172,
    "preview": "fileFormatVersion: 2\nguid: 4c0f2e87395b4c6c9df8c21b6d0fae13\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  us"
  },
  {
    "path": "MCPForUnity/Editor/Dependencies/PlatformDetectors/IPlatformDetector.cs",
    "chars": 1249,
    "preview": "using MCPForUnity.Editor.Dependencies.Models;\n\nnamespace MCPForUnity.Editor.Dependencies.PlatformDetectors\n{\n    /// <su"
  },
  {
    "path": "MCPForUnity/Editor/Dependencies/PlatformDetectors/IPlatformDetector.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: 67d73d0e8caef4e60942f4419c6b76bf\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "MCPForUnity/Editor/Dependencies/PlatformDetectors/LinuxPlatformDetector.cs",
    "chars": 7441,
    "preview": "using System;\nusing System.Diagnostics;\nusing System.IO;\nusing System.Runtime.InteropServices;\nusing MCPForUnity.Editor."
  },
  {
    "path": "MCPForUnity/Editor/Dependencies/PlatformDetectors/LinuxPlatformDetector.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: b682b492eb80d4ed6834b76f72c9f0f3\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "MCPForUnity/Editor/Dependencies/PlatformDetectors/MacOSPlatformDetector.cs",
    "chars": 7537,
    "preview": "using System;\nusing System.Diagnostics;\nusing System.IO;\nusing System.Runtime.InteropServices;\nusing MCPForUnity.Editor."
  },
  {
    "path": "MCPForUnity/Editor/Dependencies/PlatformDetectors/MacOSPlatformDetector.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: c6f602b0a8ca848859197f9a949a7a5d\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "MCPForUnity/Editor/Dependencies/PlatformDetectors/PlatformDetectorBase.cs",
    "chars": 4950,
    "preview": "using System;\nusing MCPForUnity.Editor.Dependencies.Models;\nusing MCPForUnity.Editor.Helpers;\nusing MCPForUnity.Editor.S"
  },
  {
    "path": "MCPForUnity/Editor/Dependencies/PlatformDetectors/PlatformDetectorBase.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: 44d715aedea2b8b41bf914433bbb2c49\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "MCPForUnity/Editor/Dependencies/PlatformDetectors/WindowsPlatformDetector.cs",
    "chars": 11350,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.IO;\nusing System.Linq;\nusing Syst"
  },
  {
    "path": "MCPForUnity/Editor/Dependencies/PlatformDetectors/WindowsPlatformDetector.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: 1aedc29caa5704c07b487d20a27e9334\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "MCPForUnity/Editor/Dependencies/PlatformDetectors.meta",
    "chars": 172,
    "preview": "fileFormatVersion: 2\nguid: bdbaced669d14798a4ceeebfbff2b22c\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  us"
  },
  {
    "path": "MCPForUnity/Editor/Dependencies.meta",
    "chars": 172,
    "preview": "fileFormatVersion: 2\nguid: 221a4d6e595be6897a5b17b77aedd4d0\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  us"
  },
  {
    "path": "MCPForUnity/Editor/External/Tommy.cs",
    "chars": 77096,
    "preview": "#region LICENSE\n\n/*\n * MIT License\n * \n * Copyright (c) 2020 Denis Zhidkikh\n * \n * Permission is hereby granted, free of"
  },
  {
    "path": "MCPForUnity/Editor/External/Tommy.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: ea652131dcdaa44ca8cb35cd1191be3f\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "MCPForUnity/Editor/External.meta",
    "chars": 172,
    "preview": "fileFormatVersion: 2\nguid: c11944bcfb9ec4576bab52874b7df584\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  us"
  },
  {
    "path": "MCPForUnity/Editor/Helpers/AssetPathUtility.cs",
    "chars": 28076,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing MCPForUnity.Editor.Constants;\nusing MCPForUnity.E"
  },
  {
    "path": "MCPForUnity/Editor/Helpers/AssetPathUtility.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: 1d42f5b5ea5d4d43ad1a771e14bda2a0\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "MCPForUnity/Editor/Helpers/CodexConfigHelper.cs",
    "chars": 11165,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing MCPForUnity.Editor.Constants;\n"
  },
  {
    "path": "MCPForUnity/Editor/Helpers/CodexConfigHelper.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: b3e68082ffc0b4cd39d3747673a4cc22\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "MCPForUnity/Editor/Helpers/ComponentOps.cs",
    "chars": 38341,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Reflection;\nusing Newtonsoft.Json.Linq;\nusing UnityEditor;\n"
  },
  {
    "path": "MCPForUnity/Editor/Helpers/ComponentOps.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: 13dead161bc4540eeb771961df437779\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "MCPForUnity/Editor/Helpers/ConfigJsonBuilder.cs",
    "chars": 7237,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing MCPForUnity.Editor.Constants;\nusing MCPForUnity"
  },
  {
    "path": "MCPForUnity/Editor/Helpers/ConfigJsonBuilder.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: 5c07c3369f73943919d9e086a81d1dcc\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "MCPForUnity/Editor/Helpers/EditorWindowScreenshotUtility.cs",
    "chars": 17287,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Reflection;\nusing System.Runtime.Exception"
  },
  {
    "path": "MCPForUnity/Editor/Helpers/EditorWindowScreenshotUtility.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: b73350febfd6534436726d19b4d270fd\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "MCPForUnity/Editor/Helpers/ExecPath.cs",
    "chars": 13437,
    "preview": "using System;\nusing System.Diagnostics;\nusing System.IO;\nusing System.Linq;\nusing System.Runtime.InteropServices;\nusing "
  },
  {
    "path": "MCPForUnity/Editor/Helpers/ExecPath.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: 8f2b7b3e9c3e4a0f9b2a1d4c7e6f5a12\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "MCPForUnity/Editor/Helpers/GameObjectLookup.cs",
    "chars": 13513,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing Newtonsoft.Json.Linq;\nusing UnityEditor;\nusing "
  },
  {
    "path": "MCPForUnity/Editor/Helpers/GameObjectLookup.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: 4964205faa8dd4f8a960e58fd8c0d4f7\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "MCPForUnity/Editor/Helpers/GameObjectSerializer.cs",
    "chars": 32259,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Reflection;\nusing MCPForUnity.Runtime.Se"
  },
  {
    "path": "MCPForUnity/Editor/Helpers/GameObjectSerializer.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: 64b8ff807bc9a401c82015cbafccffac\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "MCPForUnity/Editor/Helpers/HttpEndpointUtility.cs",
    "chars": 12367,
    "preview": "using System;\nusing System.Net;\nusing MCPForUnity.Editor.Constants;\nusing MCPForUnity.Editor.Models;\nusing MCPForUnity.E"
  },
  {
    "path": "MCPForUnity/Editor/Helpers/HttpEndpointUtility.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: 2051d90316ea345c09240c80c7138e3b\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "MCPForUnity/Editor/Helpers/MaterialOps.cs",
    "chars": 16477,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing MCPForUnity.Editor.Tools;\nusing Newtonsoft.Json"
  },
  {
    "path": "MCPForUnity/Editor/Helpers/MaterialOps.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: a59e8545e32664dae9a696d449f82c3d\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "MCPForUnity/Editor/Helpers/McpConfigurationHelper.cs",
    "chars": 9994,
    "preview": "using System;\nusing System.IO;\nusing System.Linq;\nusing System.Runtime.InteropServices;\nusing System.Text;\nusing MCPForU"
  },
  {
    "path": "MCPForUnity/Editor/Helpers/McpConfigurationHelper.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: e45ac2a13b4c1ba468b8e3aa67b292ca\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "MCPForUnity/Editor/Helpers/McpJobStateStore.cs",
    "chars": 1867,
    "preview": "using System;\nusing System.IO;\nusing Newtonsoft.Json;\nusing UnityEngine;\n\nnamespace MCPForUnity.Editor.Helpers\n{\n    ///"
  },
  {
    "path": "MCPForUnity/Editor/Helpers/McpJobStateStore.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: 28912085dd68342f8a9fda8a43c83a59\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "MCPForUnity/Editor/Helpers/McpLog.cs",
    "chars": 1729,
    "preview": "using MCPForUnity.Editor.Constants;\nusing UnityEditor;\nusing UnityEngine;\n\nnamespace MCPForUnity.Editor.Helpers\n{\n    in"
  },
  {
    "path": "MCPForUnity/Editor/Helpers/McpLog.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: 9e2c3f8a4f4f48d8a4c1b7b8e3f5a1c2\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "MCPForUnity/Editor/Helpers/McpLogRecord.cs",
    "chars": 3466,
    "preview": "using System;\nusing System.IO;\nusing MCPForUnity.Editor.Constants;\nusing Newtonsoft.Json;\nusing Newtonsoft.Json.Linq;\nus"
  },
  {
    "path": "MCPForUnity/Editor/Helpers/McpLogRecord.cs.meta",
    "chars": 59,
    "preview": "fileFormatVersion: 2\nguid: 925ef3d40ecf53649a6af9e94df6114b"
  },
  {
    "path": "MCPForUnity/Editor/Helpers/ObjectResolver.cs",
    "chars": 8107,
    "preview": "using System;\nusing MCPForUnity.Editor.Helpers;\nusing Newtonsoft.Json.Linq;\nusing UnityEditor;\nusing UnityEngine;\n\nnames"
  },
  {
    "path": "MCPForUnity/Editor/Helpers/ObjectResolver.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: ad678f7b0a2e6458bbdb38a15d857acf\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "MCPForUnity/Editor/Helpers/Pagination.cs",
    "chars": 5130,
    "preview": "using System.Collections.Generic;\nusing Newtonsoft.Json;\nusing Newtonsoft.Json.Linq;\n\nnamespace MCPForUnity.Editor.Helpe"
  },
  {
    "path": "MCPForUnity/Editor/Helpers/Pagination.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: 745564d5894d74c0ca24db39c77bab2c\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "MCPForUnity/Editor/Helpers/ParamCoercion.cs",
    "chars": 14168,
    "preview": "using System;\nusing System.Globalization;\nusing Newtonsoft.Json.Linq;\n\nnamespace MCPForUnity.Editor.Helpers\n{\n    /// <s"
  },
  {
    "path": "MCPForUnity/Editor/Helpers/ParamCoercion.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: db54fbbe3ac7f429fbf808f72831374a\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "MCPForUnity/Editor/Helpers/PortManager.cs",
    "chars": 11527,
    "preview": "using System;\nusing System.IO;\nusing System.Net;\nusing System.Net.Sockets;\nusing System.Security.Cryptography;\nusing Sys"
  },
  {
    "path": "MCPForUnity/Editor/Helpers/PortManager.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: 28c39813a10b4331afc764a04089cbef\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "MCPForUnity/Editor/Helpers/PrefabUtilityHelper.cs",
    "chars": 8061,
    "preview": "using System;\nusing System.Collections.Generic;\nusing UnityEditor;\nusing UnityEngine;\n\nnamespace MCPForUnity.Editor.Help"
  },
  {
    "path": "MCPForUnity/Editor/Helpers/PrefabUtilityHelper.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: ebe2be77e64f4d4f811614b198210017\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "MCPForUnity/Editor/Helpers/ProjectIdentityUtility.cs",
    "chars": 8620,
    "preview": "using System;\nusing System.IO;\nusing System.Security.Cryptography;\nusing System.Text;\nusing MCPForUnity.Editor.Constants"
  },
  {
    "path": "MCPForUnity/Editor/Helpers/ProjectIdentityUtility.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: 936e878ce1275453bae5e0cf03bd9d30\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "MCPForUnity/Editor/Helpers/PropertyConversion.cs",
    "chars": 3365,
    "preview": "using System;\nusing Newtonsoft.Json;\nusing Newtonsoft.Json.Linq;\nusing MCPForUnity.Editor.Helpers;\nusing UnityEditor;\nus"
  },
  {
    "path": "MCPForUnity/Editor/Helpers/PropertyConversion.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: 4b4187d5b338a453fbe0baceaeea6bcd\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "MCPForUnity/Editor/Helpers/RenderPipelineUtility.cs",
    "chars": 17610,
    "preview": "using System;\nusing System.Collections.Generic;\nusing UnityEngine;\nusing UnityEngine.Rendering;\nusing UnityEditor;\n\nname"
  },
  {
    "path": "MCPForUnity/Editor/Helpers/RenderPipelineUtility.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: 5a0a1cfd55ab4bc99c74c52854f6bdf3\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "MCPForUnity/Editor/Helpers/RendererHelpers.cs",
    "chars": 16784,
    "preview": "using System;\nusing System.Collections.Generic;\nusing Newtonsoft.Json.Linq;\nusing UnityEngine;\nusing UnityEditor;\n\nnames"
  },
  {
    "path": "MCPForUnity/Editor/Helpers/RendererHelpers.cs.meta",
    "chars": 244,
    "preview": "fileFormatVersion: 2\nguid: 8f3a7e2d5c1b4a9e6d0f8c3b2a1e5d7c\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "MCPForUnity/Editor/Helpers/Response.cs",
    "chars": 2964,
    "preview": "using Newtonsoft.Json;\n\nnamespace MCPForUnity.Editor.Helpers\n{\n    public interface IMcpResponse\n    {\n        [JsonProp"
  },
  {
    "path": "MCPForUnity/Editor/Helpers/Response.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: 80c09a76b944f8c4691e06c4d76c4be8\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "MCPForUnity/Editor/Helpers/StringCaseUtility.cs",
    "chars": 2793,
    "preview": "using System;\nusing System.Linq;\nusing System.Text.RegularExpressions;\n\nnamespace MCPForUnity.Editor.Helpers\n{\n    /// <"
  },
  {
    "path": "MCPForUnity/Editor/Helpers/StringCaseUtility.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: f22b312318ade42c4bb6b5dfddacecfa\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "MCPForUnity/Editor/Helpers/TelemetryHelper.cs",
    "chars": 7679,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Threading;\nusing MCPForUnity.Editor.Constants;\nusing MCPFor"
  },
  {
    "path": "MCPForUnity/Editor/Helpers/TelemetryHelper.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: b8f3c2d1e7a94f6c8a9b5e3d2c1a0f9e\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "MCPForUnity/Editor/Helpers/TextureOps.cs",
    "chars": 6275,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing Newtonsoft.Json.Linq;\nusing UnityEngine;\n\nnamespa"
  },
  {
    "path": "MCPForUnity/Editor/Helpers/TextureOps.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: 864ea682d797466a84b6b951f6c4e4ba\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "MCPForUnity/Editor/Helpers/ToolParams.cs",
    "chars": 8874,
    "preview": "using System.Linq;\nusing Newtonsoft.Json;\nusing Newtonsoft.Json.Linq;\nusing System;\n\nnamespace MCPForUnity.Editor.Helper"
  },
  {
    "path": "MCPForUnity/Editor/Helpers/ToolParams.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: 404b09ea3e2714e1babd16f5705ac788\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "MCPForUnity/Editor/Helpers/UnityJsonSerializer.cs",
    "chars": 1085,
    "preview": "using System.Collections.Generic;\nusing Newtonsoft.Json;\nusing MCPForUnity.Runtime.Serialization;\n\nnamespace MCPForUnity"
  },
  {
    "path": "MCPForUnity/Editor/Helpers/UnityJsonSerializer.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: 24d94c9c030bd4ff1ab208c748f26b01\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "MCPForUnity/Editor/Helpers/UnityTypeResolver.cs",
    "chars": 8435,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Reflection;\nusing UnityEngine;\n#if UNITY"
  },
  {
    "path": "MCPForUnity/Editor/Helpers/UnityTypeResolver.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: 2cdf06f869b124741af31f27b25742db\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "MCPForUnity/Editor/Helpers/VectorParsing.cs",
    "chars": 30402,
    "preview": "using System;\nusing System.Collections.Generic;\nusing Newtonsoft.Json.Linq;\nusing UnityEngine;\n\nnamespace MCPForUnity.Ed"
  },
  {
    "path": "MCPForUnity/Editor/Helpers/VectorParsing.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: ca2205caede3744aebda9f6da2fa2c22\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "MCPForUnity/Editor/Helpers.meta",
    "chars": 172,
    "preview": "fileFormatVersion: 2\nguid: 94cb070dc5e15024da86150b27699ca0\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  us"
  },
  {
    "path": "MCPForUnity/Editor/MCPForUnity.Editor.asmdef",
    "chars": 458,
    "preview": "{\n    \"name\": \"MCPForUnity.Editor\",\n    \"rootNamespace\": \"MCPForUnity.Editor\",\n    \"references\": [\n        \"MCPForUnity."
  },
  {
    "path": "MCPForUnity/Editor/MCPForUnity.Editor.asmdef.meta",
    "chars": 166,
    "preview": "fileFormatVersion: 2\nguid: 98f702da6ca044be59a864a9419c4eab\nAssemblyDefinitionImporter:\n  externalObjects: {}\n  userData"
  },
  {
    "path": "MCPForUnity/Editor/McpCiBoot.cs",
    "chars": 478,
    "preview": "using System;\nusing MCPForUnity.Editor.Constants;\nusing MCPForUnity.Editor.Services.Transport.Transports;\nusing UnityEdi"
  },
  {
    "path": "MCPForUnity/Editor/McpCiBoot.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: ef9dca277ab34ba1b136d8dcd45de948\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "MCPForUnity/Editor/MenuItems/MCPForUnityMenu.cs",
    "chars": 977,
    "preview": "using MCPForUnity.Editor.Setup;\nusing MCPForUnity.Editor.Windows;\nusing UnityEditor;\nusing UnityEngine;\n\nnamespace MCPFo"
  },
  {
    "path": "MCPForUnity/Editor/MenuItems/MCPForUnityMenu.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: 42b27c415aa084fe6a9cc6cf03979d36\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "MCPForUnity/Editor/MenuItems.meta",
    "chars": 172,
    "preview": "fileFormatVersion: 2\nguid: 9e7f37616736f4d3cbd8bdbc626f5ab9\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  us"
  },
  {
    "path": "MCPForUnity/Editor/Migrations/LegacyServerSrcMigration.cs",
    "chars": 2755,
    "preview": "using System;\nusing MCPForUnity.Editor.Constants;\nusing MCPForUnity.Editor.Helpers;\nusing MCPForUnity.Editor.Services;\nu"
  },
  {
    "path": "MCPForUnity/Editor/Migrations/LegacyServerSrcMigration.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: 4436b2149abf4b0d8014f81cd29a2bd0\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "MCPForUnity/Editor/Migrations/StdIoVersionMigration.cs",
    "chars": 5372,
    "preview": "using System;\nusing System.IO;\nusing System.Linq;\nusing MCPForUnity.Editor.Clients;\nusing MCPForUnity.Editor.Constants;\n"
  },
  {
    "path": "MCPForUnity/Editor/Migrations/StdIoVersionMigration.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: f1d589c8c8684e6f919ffb393c4b4db5\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "MCPForUnity/Editor/Migrations.meta",
    "chars": 172,
    "preview": "fileFormatVersion: 2\nguid: 8bb6a578d4df4e2daa0bd1aa1fa492d5\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  us"
  },
  {
    "path": "MCPForUnity/Editor/Models/Command.cs",
    "chars": 465,
    "preview": "using Newtonsoft.Json.Linq;\n\nnamespace MCPForUnity.Editor.Models\n{\n    /// <summary>\n    /// Represents a command receiv"
  },
  {
    "path": "MCPForUnity/Editor/Models/Command.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: 6754c84e5deb74749bc3a19e0c9aa280\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "MCPForUnity/Editor/Models/MCPConfigServer.cs",
    "chars": 595,
    "preview": "using System;\nusing Newtonsoft.Json;\n\nnamespace MCPForUnity.Editor.Models\n{\n    [Serializable]\n    public class McpConfi"
  },
  {
    "path": "MCPForUnity/Editor/Models/MCPConfigServer.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: 5fae9d995f514e9498e9613e2cdbeca9\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "MCPForUnity/Editor/Models/MCPConfigServers.cs",
    "chars": 219,
    "preview": "using System;\nusing Newtonsoft.Json;\n\nnamespace MCPForUnity.Editor.Models\n{\n    [Serializable]\n    public class McpConfi"
  },
  {
    "path": "MCPForUnity/Editor/Models/MCPConfigServers.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: bcb583553e8173b49be71a5c43bd9502\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "MCPForUnity/Editor/Models/McpClient.cs",
    "chars": 2533,
    "preview": "using System.Collections.Generic;\n\nnamespace MCPForUnity.Editor.Models\n{\n    public class McpClient\n    {\n        public"
  },
  {
    "path": "MCPForUnity/Editor/Models/McpClient.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: b1afa56984aec0d41808edcebf805e6a\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "MCPForUnity/Editor/Models/McpConfig.cs",
    "chars": 217,
    "preview": "using System;\nusing Newtonsoft.Json;\n\nnamespace MCPForUnity.Editor.Models\n{\n    [Serializable]\n    public class McpConfi"
  },
  {
    "path": "MCPForUnity/Editor/Models/McpConfig.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: c17c09908f0c1524daa8b6957ce1f7f5\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "MCPForUnity/Editor/Models/McpStatus.cs",
    "chars": 1230,
    "preview": "namespace MCPForUnity.Editor.Models\n{\n    // Enum representing the various status states for MCP clients\n    public enum"
  },
  {
    "path": "MCPForUnity/Editor/Models/McpStatus.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: aa63057c9e5282d4887352578bf49971\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "MCPForUnity/Editor/Models.meta",
    "chars": 172,
    "preview": "fileFormatVersion: 2\nguid: 16d3ab36890b6c14f9afeabee30e03e3\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  us"
  },
  {
    "path": "MCPForUnity/Editor/Resources/Editor/ActiveTool.cs",
    "chars": 2274,
    "preview": "using System;\nusing MCPForUnity.Editor.Helpers;\nusing Newtonsoft.Json.Linq;\nusing UnityEditor;\n\nnamespace MCPForUnity.Ed"
  },
  {
    "path": "MCPForUnity/Editor/Resources/Editor/ActiveTool.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: 6e78b6227ab7742a8a4f679ee6a8a212\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "MCPForUnity/Editor/Resources/Editor/EditorState.cs",
    "chars": 782,
    "preview": "using System;\nusing MCPForUnity.Editor.Helpers;\nusing MCPForUnity.Editor.Services;\nusing Newtonsoft.Json.Linq;\n\nnamespac"
  },
  {
    "path": "MCPForUnity/Editor/Resources/Editor/EditorState.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: f7c6df54e014c44fdb0cd3f65a479e37\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "MCPForUnity/Editor/Resources/Editor/Selection.cs",
    "chars": 1937,
    "preview": "using System;\nusing System.Linq;\nusing MCPForUnity.Editor.Helpers;\nusing Newtonsoft.Json.Linq;\nusing UnityEditor;\n\nnames"
  },
  {
    "path": "MCPForUnity/Editor/Resources/Editor/Selection.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: c7ea869623e094599a70be086ab4fc0e\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "MCPForUnity/Editor/Resources/Editor/ToolStates.cs",
    "chars": 1910,
    "preview": "using System;\nusing System.Linq;\nusing MCPForUnity.Editor.Helpers;\nusing MCPForUnity.Editor.Services;\nusing Newtonsoft.J"
  },
  {
    "path": "MCPForUnity/Editor/Resources/Editor/ToolStates.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: 0f77d36b37ba4526ad30b3c84e3e752c\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "MCPForUnity/Editor/Resources/Editor/Windows.cs",
    "chars": 2044,
    "preview": "using System;\nusing System.Collections.Generic;\nusing MCPForUnity.Editor.Helpers;\nusing Newtonsoft.Json.Linq;\nusing Unit"
  },
  {
    "path": "MCPForUnity/Editor/Resources/Editor/Windows.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: 58a341e64bea440b29deaf859aaea552\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "MCPForUnity/Editor/Resources/Editor.meta",
    "chars": 172,
    "preview": "fileFormatVersion: 2\nguid: 266967ec2e1df44209bf46ec6037d61d\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  us"
  },
  {
    "path": "MCPForUnity/Editor/Resources/McpForUnityResourceAttribute.cs",
    "chars": 1521,
    "preview": "using System;\n\nnamespace MCPForUnity.Editor.Resources\n{\n    /// <summary>\n    /// Marks a class as an MCP resource handl"
  },
  {
    "path": "MCPForUnity/Editor/Resources/McpForUnityResourceAttribute.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: 4c2d60f570f3d4bd2a6a2c1293094be3\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "MCPForUnity/Editor/Resources/MenuItems/GetMenuItems.cs",
    "chars": 2265,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing MCPForUnity.Editor.Helpers;\nusing Newtonsoft.Js"
  },
  {
    "path": "MCPForUnity/Editor/Resources/MenuItems/GetMenuItems.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: 04eeea61eb5c24033a88013845d25f23\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "MCPForUnity/Editor/Resources/MenuItems.meta",
    "chars": 172,
    "preview": "fileFormatVersion: 2\nguid: bca79cd3ef8ed466f9e50e2dc7850e46\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  us"
  }
]

// ... and 1517 more files (download for full content)

About this extraction

This page contains the full source code of the CoplayDev/unity-mcp GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 1717 files (6.8 MB), approximately 1.9M tokens, and a symbol index with 7715 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!