@alpsckr/unitycli 0.4.2 → 0.4.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -5
- package/contracts/command-contract.json +109 -217
- package/contracts/package-files.json +374 -294
- package/contracts/stable-session/direct-call-semantics.json +8 -2
- package/contracts/tool-completion-contract.json +148 -672
- package/dist/bridge/admission.d.ts +17 -1
- package/dist/bridge/admission.js +2 -0
- package/dist/bridge/admission.js.map +1 -1
- package/dist/bridge/domains/asset.js +3 -1
- package/dist/bridge/domains/asset.js.map +1 -1
- package/dist/bridge/domains/camera.js +39 -7
- package/dist/bridge/domains/camera.js.map +1 -1
- package/dist/bridge/domains/console.js +2 -1
- package/dist/bridge/domains/console.js.map +1 -1
- package/dist/bridge/domains/doctor.d.ts +3 -0
- package/dist/bridge/domains/doctor.js +8 -0
- package/dist/bridge/domains/doctor.js.map +1 -0
- package/dist/bridge/domains/editor.js +0 -4
- package/dist/bridge/domains/editor.js.map +1 -1
- package/dist/bridge/domains/game-object.js +4 -12
- package/dist/bridge/domains/game-object.js.map +1 -1
- package/dist/bridge/domains/graphics.js +1 -16
- package/dist/bridge/domains/graphics.js.map +1 -1
- package/dist/bridge/domains/object.js +3 -0
- package/dist/bridge/domains/object.js.map +1 -1
- package/dist/bridge/domains/physics.js +1 -2
- package/dist/bridge/domains/physics.js.map +1 -1
- package/dist/bridge/domains/profiler.js +18 -7
- package/dist/bridge/domains/profiler.js.map +1 -1
- package/dist/bridge/domains/project-tool.js +4 -0
- package/dist/bridge/domains/project-tool.js.map +1 -1
- package/dist/bridge/domains/reflection.js +10 -2
- package/dist/bridge/domains/reflection.js.map +1 -1
- package/dist/bridge/domains/runtime-tool.js +3 -0
- package/dist/bridge/domains/runtime-tool.js.map +1 -1
- package/dist/bridge/domains/scene.js +3 -8
- package/dist/bridge/domains/scene.js.map +1 -1
- package/dist/bridge/domains/screenshot.js +30 -6
- package/dist/bridge/domains/screenshot.js.map +1 -1
- package/dist/bridge/domains/ui.js +3 -1
- package/dist/bridge/domains/ui.js.map +1 -1
- package/dist/bridge/index.d.ts +5 -5
- package/dist/bridge/index.js +6 -9
- package/dist/bridge/index.js.map +1 -1
- package/dist/bridge/registry.js +3 -5
- package/dist/bridge/registry.js.map +1 -1
- package/dist/bridge/session-supervisor.d.ts +6 -3
- package/dist/bridge/session-supervisor.js +122 -34
- package/dist/bridge/session-supervisor.js.map +1 -1
- package/dist/bridge/types.d.ts +6 -5
- package/dist/bridge/types.js +16 -2
- package/dist/bridge/types.js.map +1 -1
- package/dist/catalog-protocol.d.ts +64 -0
- package/dist/catalog-protocol.js +460 -0
- package/dist/catalog-protocol.js.map +1 -0
- package/dist/cli-commands/command.js +84 -61
- package/dist/cli-commands/command.js.map +1 -1
- package/dist/cli-commands/extensions.js +70 -50
- package/dist/cli-commands/extensions.js.map +1 -1
- package/dist/cli-commands/instances.js +1 -1
- package/dist/cli-commands/instances.js.map +1 -1
- package/dist/cli-process-owners.d.ts +6 -0
- package/dist/cli-process-owners.js +27 -0
- package/dist/cli-process-owners.js.map +1 -0
- package/dist/cli.d.ts +1 -1
- package/dist/cli.js +20 -5
- package/dist/cli.js.map +1 -1
- package/dist/contracts/command-contract.js +14 -4
- package/dist/contracts/command-contract.js.map +1 -1
- package/dist/doctor.d.ts +4 -6
- package/dist/doctor.js +429 -398
- package/dist/doctor.js.map +1 -1
- package/dist/editor-blocker-observer.d.ts +2 -1
- package/dist/editor-blocker-observer.js +40 -13
- package/dist/editor-blocker-observer.js.map +1 -1
- package/dist/extension-availability.d.ts +27 -9
- package/dist/extension-availability.js +96 -56
- package/dist/extension-availability.js.map +1 -1
- package/dist/extensions/descriptor-loader.d.ts +2 -2
- package/dist/extensions/descriptor-loader.js +3 -4
- package/dist/extensions/descriptor-loader.js.map +1 -1
- package/dist/extensions/index.d.ts +1 -1
- package/dist/extensions/index.js +1 -1
- package/dist/extensions/index.js.map +1 -1
- package/dist/extensions/installer.d.ts +24 -7
- package/dist/extensions/installer.js +142 -66
- package/dist/extensions/installer.js.map +1 -1
- package/dist/extensions/registry.js +3 -5
- package/dist/extensions/registry.js.map +1 -1
- package/dist/extensions/state-contract.d.ts +11 -0
- package/dist/extensions/state-contract.js +50 -0
- package/dist/extensions/state-contract.js.map +1 -0
- package/dist/instances.d.ts +13 -1
- package/dist/instances.js +26 -0
- package/dist/instances.js.map +1 -1
- package/dist/package-manager.d.ts +0 -24
- package/dist/package-manager.js +5 -58
- package/dist/package-manager.js.map +1 -1
- package/dist/project-tool-discovery.d.ts +5 -2
- package/dist/project-tool-discovery.js +22 -18
- package/dist/project-tool-discovery.js.map +1 -1
- package/dist/runtime-code.js +1 -1
- package/dist/runtime-code.js.map +1 -1
- package/dist/tool-name.d.ts +4 -0
- package/dist/tool-name.js +15 -0
- package/dist/tool-name.js.map +1 -0
- package/dist/tools/.generated-completion-registry.d.ts +2 -0
- package/dist/tools/.generated-completion-registry.js +763 -325
- package/dist/tools/.generated-completion-registry.js.map +1 -1
- package/dist/tools/.generated-registry.d.ts +6 -11
- package/dist/tools/.generated-registry.js +6 -11
- package/dist/tools/.generated-registry.js.map +1 -1
- package/dist/tools/.generated-schemas.js +11 -16
- package/dist/tools/.generated-schemas.js.map +1 -1
- package/dist/tools/asset/refresh-status.d.ts +3 -0
- package/dist/tools/asset/refresh-status.js +12 -0
- package/dist/tools/asset/refresh-status.js.map +1 -0
- package/dist/tools/asset/refresh.js +7 -3
- package/dist/tools/asset/refresh.js.map +1 -1
- package/dist/tools/build/player-status.d.ts +3 -0
- package/dist/tools/build/player-status.js +12 -0
- package/dist/tools/build/player-status.js.map +1 -0
- package/dist/tools/build/run.js +1 -1
- package/dist/tools/build/run.js.map +1 -1
- package/dist/tools/catalog-control.d.ts +22 -0
- package/dist/tools/catalog-control.js +335 -0
- package/dist/tools/catalog-control.js.map +1 -0
- package/dist/tools/catalog.d.ts +7 -9
- package/dist/tools/catalog.js +66 -45
- package/dist/tools/catalog.js.map +1 -1
- package/dist/tools/commands.d.ts +1 -1
- package/dist/tools/commands.js +44 -11
- package/dist/tools/commands.js.map +1 -1
- package/dist/tools/define.js +3 -2
- package/dist/tools/define.js.map +1 -1
- package/dist/tools/dispatcher.d.ts +53 -6
- package/dist/tools/dispatcher.js +277 -108
- package/dist/tools/dispatcher.js.map +1 -1
- package/dist/tools/editor/compile.js +1 -1
- package/dist/tools/editor/compile.js.map +1 -1
- package/dist/tools/editor/play-mode-status.d.ts +3 -0
- package/dist/tools/editor/play-mode-status.js +12 -0
- package/dist/tools/editor/play-mode-status.js.map +1 -0
- package/dist/tools/editor/readiness.d.ts +0 -1
- package/dist/tools/editor/readiness.js +0 -1
- package/dist/tools/editor/readiness.js.map +1 -1
- package/dist/tools/editor/refresh.d.ts +7 -3
- package/dist/tools/editor/refresh.js +20 -15
- package/dist/tools/editor/refresh.js.map +1 -1
- package/dist/tools/editor/state.d.ts +2 -2
- package/dist/tools/editor/state.js +13 -12
- package/dist/tools/editor/state.js.map +1 -1
- package/dist/tools/metadata/derived.js +1 -7
- package/dist/tools/metadata/derived.js.map +1 -1
- package/dist/tools/metadata/status.js +1 -12
- package/dist/tools/metadata/status.js.map +1 -1
- package/dist/tools/metadata/types.d.ts +0 -2
- package/dist/tools/navmesh/live.js +1 -1
- package/dist/tools/navmesh/live.js.map +1 -1
- package/dist/tools/occlusion/live.js +1 -1
- package/dist/tools/occlusion/live.js.map +1 -1
- package/dist/tools/package/deploy.js +2 -2
- package/dist/tools/package/deploy.js.map +1 -1
- package/dist/tools/package/embed.js +1 -1
- package/dist/tools/package/embed.js.map +1 -1
- package/dist/tools/package/install-status.d.ts +3 -0
- package/dist/tools/package/install-status.js +12 -0
- package/dist/tools/package/install-status.js.map +1 -0
- package/dist/tools/package/install.js +3 -3
- package/dist/tools/package/install.js.map +1 -1
- package/dist/tools/package/live-resolve.js +45 -12
- package/dist/tools/package/live-resolve.js.map +1 -1
- package/dist/tools/package/registry-clear.js.map +1 -1
- package/dist/tools/package/registry-set.js.map +1 -1
- package/dist/tools/package/remove-status.d.ts +3 -0
- package/dist/tools/package/remove-status.js +12 -0
- package/dist/tools/package/remove-status.js.map +1 -0
- package/dist/tools/package/remove.js +3 -3
- package/dist/tools/package/remove.js.map +1 -1
- package/dist/tools/package/resolve.js +3 -3
- package/dist/tools/package/resolve.js.map +1 -1
- package/dist/tools/package/restore.js +2 -2
- package/dist/tools/package/restore.js.map +1 -1
- package/dist/tools/package/scoped-registry-add.js.map +1 -1
- package/dist/tools/status/support.d.ts +13 -0
- package/dist/tools/status/support.js +28 -0
- package/dist/tools/status/support.js.map +1 -0
- package/dist/tools/test/cancel.js +2 -2
- package/dist/tools/test/cancel.js.map +1 -1
- package/dist/tools/test/run-status.d.ts +3 -0
- package/dist/tools/test/run-status.js +12 -0
- package/dist/tools/test/run-status.js.map +1 -0
- package/dist/tools/test/run.js +7 -4
- package/dist/tools/test/run.js.map +1 -1
- package/dist/tools/tools/group-summaries.js +10 -14
- package/dist/tools/tools/group-summaries.js.map +1 -1
- package/docs/architecture.md +4 -4
- package/docs/availability-differences.md +4 -4
- package/docs/command-execution.md +4 -3
- package/docs/error-codes.md +13 -5
- package/docs/extensions.md +1 -7
- package/docs/risk-and-side-effects.md +4 -3
- package/docs/safety-boundaries.md +3 -1
- package/docs/target-and-instance.md +1 -1
- package/docs/tool-discovery.md +17 -10
- package/docs/tool-execution.md +18 -7
- package/extensions/cinemachine/unitypkg/Editor/UnityCliExtensionAssembly.cs +3 -0
- package/extensions/hdrp/unitypkg/Editor/UnityCliExtensionAssembly.cs +3 -0
- package/extensions/probuilder/unitypkg/Editor/UnityCliExtensionAssembly.cs +3 -0
- package/extensions/urp/unitypkg/Editor/UnityCliExtensionAssembly.cs +3 -0
- package/extensions/vfx-graph/unitypkg/Editor/UnityCliExtensionAssembly.cs +3 -0
- package/package.json +2 -4
- package/skills/unitycli/SKILL.md +35 -42
- package/skills/unitycli/manifest.json +1 -1
- package/skills/unitycli/references/operation-protocol.md +3 -3
- package/unitypkg/Editor/AssemblyInfo.cs +5 -0
- package/unitypkg/Editor/Bridge/BridgeCommandRegistry.cs +49 -14
- package/unitypkg/Editor/Bridge/BridgeHttpServer.cs +9 -35
- package/unitypkg/Editor/Bridge/BridgeQueueState.cs +672 -0
- package/unitypkg/Editor/Bridge/BridgeWorkQueue.cs +970 -120
- package/unitypkg/Editor/BridgeStartupStateMachine.cs +59 -1
- package/unitypkg/Editor/Commands/ProjectToolCommands.cs +4 -0
- package/unitypkg/Editor/Commands/RuntimeToolCommands.cs +3 -0
- package/unitypkg/Editor/Generated/UnityCliToolCompletionRegistry.g.cs +379 -14
- package/unitypkg/Editor/Infrastructure/CodeExecSupport.cs +28 -13
- package/unitypkg/Editor/Infrastructure/RegistryOwnershipResolver.cs +132 -105
- package/unitypkg/Editor/Infrastructure/UnityCliActiveOperation.cs +138 -29
- package/unitypkg/Editor/Infrastructure/UnityCliAdmission.cs +1856 -237
- package/unitypkg/Editor/Infrastructure/UnityCliDoctorDiagnostics.cs +220 -0
- package/unitypkg/Editor/Infrastructure/UnityCliDurableStatusCoordinator.cs +118 -0
- package/unitypkg/Editor/Infrastructure/UnityCliEditorStateSnapshot.cs +2 -1
- package/unitypkg/Editor/Infrastructure/UnityCliHierarchyPager.cs +203 -0
- package/unitypkg/Editor/Infrastructure/UnityCliInstanceCleanup.cs +2 -1
- package/unitypkg/Editor/Infrastructure/UnityCliInstanceRegistry.cs +201 -63
- package/unitypkg/Editor/Infrastructure/UnityCliJson.cs +2 -3
- package/unitypkg/Editor/Infrastructure/UnityCliLiveBuildCoordinator.cs +289 -46
- package/unitypkg/Editor/Infrastructure/UnityCliLiveRefreshCoordinator.cs +87 -53
- package/unitypkg/Editor/Infrastructure/UnityCliNavMeshBakeCoordinator.cs +4 -4
- package/unitypkg/Editor/Infrastructure/UnityCliObjectRef.cs +128 -25
- package/unitypkg/Editor/Infrastructure/UnityCliObjectSerializer.cs +435 -327
- package/unitypkg/Editor/Infrastructure/UnityCliOcclusionBakeCoordinator.cs +4 -4
- package/unitypkg/Editor/Infrastructure/UnityCliOperationCoordinator.cs +351 -53
- package/unitypkg/Editor/Infrastructure/UnityCliPackageResolveCoordinator.cs +118 -18
- package/unitypkg/Editor/Infrastructure/UnityCliPackageResolveState.cs +20 -1
- package/unitypkg/Editor/Infrastructure/UnityCliReadGeneration.cs +97 -0
- package/unitypkg/Editor/Infrastructure/UnityCliReflection.cs +644 -133
- package/unitypkg/Editor/Infrastructure/UnityCliReloadOperation.cs +128 -41
- package/unitypkg/Editor/Infrastructure/UnityCliRuntimeExecutor.cs +14 -84
- package/unitypkg/Editor/Infrastructure/UnityCliSerializer.cs +220 -0
- package/unitypkg/Editor/Infrastructure/UnityCliSessionMutationLease.cs +69 -29
- package/unitypkg/Editor/Infrastructure/UnityCliTestRunCoordinator.cs +440 -54
- package/unitypkg/Editor/Infrastructure/UnityCliWaiter.cs +128 -35
- package/unitypkg/Editor/ProjectTools/IUnityCliTool.cs +9 -1
- package/unitypkg/Editor/ProjectTools/OfficialAttributeToolRegistry.cs +32 -31
- package/unitypkg/Editor/ProjectTools/ProjectToolRegistry.cs +607 -458
- package/unitypkg/Editor/ProjectTools/ProjectToolSchemaValidator.cs +35 -7
- package/unitypkg/Editor/ProjectTools/RegisteredTool.cs +501 -60
- package/unitypkg/Editor/ProjectTools/UnityCliProjectToolContext.cs +21 -0
- package/unitypkg/Editor/ProjectTools/UnityCliSchemaDeriver.cs +36 -7
- package/unitypkg/Editor/ProjectTools/UnityCliToolName.cs +30 -0
- package/unitypkg/Editor/Properties/AssemblyInfo.cs +3 -0
- package/unitypkg/Editor/Tools/asset/get-data.cs +16 -7
- package/unitypkg/Editor/Tools/build/BuildSceneStateTool.cs +23 -3
- package/unitypkg/Editor/Tools/build/BuildToolDtos.cs +2 -1
- package/unitypkg/Editor/Tools/build/scene/add.cs +6 -3
- package/unitypkg/Editor/Tools/build/scene/disable.cs +1 -1
- package/unitypkg/Editor/Tools/build/scene/enable.cs +1 -1
- package/unitypkg/Editor/Tools/build/scene/list.cs +1 -1
- package/unitypkg/Editor/Tools/build/scene/remove.cs +13 -3
- package/unitypkg/Editor/Tools/camera/CameraToolSupport.cs +38 -38
- package/unitypkg/Editor/Tools/camera/multiview.cs +13 -6
- package/unitypkg/Editor/Tools/camera/screenshot.cs +14 -7
- package/unitypkg/Editor/Tools/component/get.cs +16 -9
- package/unitypkg/Editor/Tools/component/modify.cs +6 -4
- package/unitypkg/Editor/Tools/console/clear.cs +7 -6
- package/unitypkg/Editor/Tools/console/get.cs +48 -16
- package/unitypkg/Editor/Tools/editor/EditorToolSupport.cs +143 -28
- package/unitypkg/Editor/Tools/editor/menu-items.cs +1 -1
- package/unitypkg/Editor/Tools/editor/play.cs +2 -11
- package/unitypkg/Editor/Tools/editor/selection.cs +1 -1
- package/unitypkg/Editor/Tools/editor/stop.cs +2 -11
- package/unitypkg/Editor/Tools/editor/windows.cs +1 -1
- package/unitypkg/Editor/Tools/go/GameObjectToolSupport.cs +54 -4
- package/unitypkg/Editor/Tools/go/delete.cs +1 -1
- package/unitypkg/Editor/Tools/go/find.cs +167 -70
- package/unitypkg/Editor/Tools/graphics/GraphicsToolSupport.cs +25 -0
- package/unitypkg/Editor/Tools/graphics/light-probe-group.cs +9 -3
- package/unitypkg/Editor/Tools/graphics/pipeline-info.cs +1 -1
- package/unitypkg/Editor/Tools/graphics/pipeline-settings.cs +1 -1
- package/unitypkg/Editor/Tools/graphics/quality.cs +2 -2
- package/unitypkg/Editor/Tools/graphics/reflection-probe.cs +3 -3
- package/unitypkg/Editor/Tools/graphics/stats.cs +1 -1
- package/unitypkg/Editor/Tools/object/ObjectToolSupport.cs +4 -4
- package/unitypkg/Editor/Tools/object/get-data.cs +9 -7
- package/unitypkg/Editor/Tools/object/modify.cs +7 -5
- package/unitypkg/Editor/Tools/physics/raycast.cs +24 -6
- package/unitypkg/Editor/Tools/prefab/stage.cs +1 -1
- package/unitypkg/Editor/Tools/profiler/ProfilerFrameDebuggerSupport.cs +94 -21
- package/unitypkg/Editor/Tools/profiler/ProfilerMemorySnapshotSupport.cs +397 -10
- package/unitypkg/Editor/Tools/profiler/ProfilerToolSupport.cs +18 -4
- package/unitypkg/Editor/Tools/profiler/frame-debugger/enable.cs +1 -1
- package/unitypkg/Editor/Tools/profiler/frame-debugger/events.cs +88 -87
- package/unitypkg/Editor/Tools/profiler/hierarchy.cs +278 -112
- package/unitypkg/Editor/Tools/profiler/memory-snapshot/compare.cs +9 -5
- package/unitypkg/Editor/Tools/profiler/memory-snapshot/list.cs +37 -35
- package/unitypkg/Editor/Tools/profiler/memory-snapshot/take.cs +99 -97
- package/unitypkg/Editor/Tools/project/info.cs +1 -1
- package/unitypkg/Editor/Tools/project/layers.cs +1 -1
- package/unitypkg/Editor/Tools/project/tags.cs +1 -1
- package/unitypkg/Editor/Tools/reflection/method/call.cs +9 -7
- package/unitypkg/Editor/Tools/reflection/method/find.cs +27 -37
- package/unitypkg/Editor/Tools/reflection/type/schema.cs +24 -28
- package/unitypkg/Editor/Tools/scene/gameobject/component.cs +8 -5
- package/unitypkg/Editor/Tools/scene/gameobject/components.cs +10 -7
- package/unitypkg/Editor/Tools/scene/gameobject-support.cs +104 -8
- package/unitypkg/Editor/Tools/scene/gameobject.cs +37 -16
- package/unitypkg/Editor/Tools/scene/hierarchy.cs +146 -142
- package/unitypkg/Editor/Tools/screenshot/EditorElementCaptureToolSupport.cs +77 -25
- package/unitypkg/Editor/Tools/screenshot/ScreenshotToolSupport.cs +315 -95
- package/unitypkg/Editor/Tools/screenshot/editor-element.cs +7 -5
- package/unitypkg/Editor/Tools/screenshot/game-view.cs +35 -21
- package/unitypkg/Editor/Tools/screenshot/isolated-object.cs +29 -23
- package/unitypkg/Editor/Tools/screenshot/orbit.cs +37 -25
- package/unitypkg/Editor/Tools/screenshot/scene-view.cs +25 -18
- package/unitypkg/Editor/Tools/screenshot/screen.cs +177 -17
- package/unitypkg/Editor/Tools/screenshot/surround.cs +83 -79
- package/unitypkg/Editor/Tools/ui/render-preview.cs +16 -11
- package/unitypkg/Editor/UnityCliBridge.cs +97 -34
- package/unitypkg/Runtime/Infrastructure/UnityCliRuntimeBridge.cs +753 -122
- package/unitypkg/Runtime/Properties/AssemblyInfo.cs +5 -0
- package/unitypkg/Runtime/UnityCli.Runtime.asmdef +1 -1
- package/unitypkg/Shared/AssemblyInfo.cs +4 -0
- package/unitypkg/Shared/UnityCliAdmissionPool.cs +265 -75
- package/unitypkg/Shared/UnityCliBridgeQueuePolicy.cs +410 -0
- package/unitypkg/Shared/UnityCliBridgeWorkItemState.cs +47 -0
- package/unitypkg/Shared/UnityCliExceptionProjection.cs +151 -0
- package/unitypkg/Shared/UnityCliQueuePublication.cs +30 -0
- package/unitypkg/Shared/UnityCliRequestBudget.cs +352 -0
- package/unitypkg/Shared/UnityCliRuntimeRequestPublication.cs +107 -0
- package/unitypkg/Tests/Editor/UnityCli.Editor.Tests.asmdef +2 -2
- package/unitypkg/Tests/Editor/UnityCliAdmissionCoordinatorIntegrationTests.cs +1329 -0
- package/unitypkg/Tests/Editor/UnityCliAdmissionPoolTests.cs +311 -114
- package/unitypkg/Tests/Editor/UnityCliAdmissionRepairStateTests.cs +94 -0
- package/unitypkg/Tests/Editor/UnityCliBridgeAdmissionIntegrationTests.cs +1229 -0
- package/unitypkg/Tests/Editor/UnityCliBridgeQueuePolicyTests.cs +412 -0
- package/unitypkg/Tests/Editor/UnityCliContinuationIntegrationTests.cs +292 -0
- package/unitypkg/Tests/Editor/UnityCliDiagnosticBoundaryTests.cs +120 -0
- package/unitypkg/Tests/Editor/UnityCliDurableStatusTests.cs +84 -0
- package/unitypkg/Tests/Editor/UnityCliExceptionProjectionTests.cs +72 -0
- package/unitypkg/Tests/Editor/UnityCliInstancePublicationRetryTests.cs +180 -97
- package/unitypkg/Tests/Editor/UnityCliMemoryReflectionIntegrationTests.cs +434 -0
- package/unitypkg/Tests/Editor/UnityCliRequestBudgetTests.cs +615 -0
- package/unitypkg/Tests/Editor/UnityCliRuntimeBridgeIntegrationTests.cs +520 -0
- package/unitypkg/Tests/Editor/UnityCliToolCatalogTests.cs +562 -0
- package/unitypkg/Tests/Runtime/UnityCli.Runtime.Tests.asmdef +23 -0
- package/unitypkg/Tests/Runtime/UnityCliRuntimeCatalogValidationTests.cs +29 -0
- package/unitypkg/package.json +1 -1
- package/contracts/static-capability-catalog.json +0 -48226
- package/dist/bridge/domains/diagnose.d.ts +0 -2
- package/dist/bridge/domains/diagnose.js +0 -11
- package/dist/bridge/domains/diagnose.js.map +0 -1
- package/dist/bridge/domains/extension.d.ts +0 -8
- package/dist/bridge/domains/extension.js +0 -20
- package/dist/bridge/domains/extension.js.map +0 -1
- package/dist/capabilities.d.ts +0 -5
- package/dist/capabilities.js +0 -84
- package/dist/capabilities.js.map +0 -1
- package/dist/static-capability-catalog.d.ts +0 -13
- package/dist/static-capability-catalog.js +0 -41
- package/dist/static-capability-catalog.js.map +0 -1
- package/dist/tools/diagnose/capabilities.d.ts +0 -13
- package/dist/tools/diagnose/capabilities.js +0 -34
- package/dist/tools/diagnose/capabilities.js.map +0 -1
- package/dist/tools/package/info.d.ts +0 -19
- package/dist/tools/package/info.js +0 -27
- package/dist/tools/package/info.js.map +0 -1
- package/dist/tools/package/list.d.ts +0 -27
- package/dist/tools/package/list.js +0 -21
- package/dist/tools/package/list.js.map +0 -1
- package/dist/tools/package/registry-get.d.ts +0 -10
- package/dist/tools/package/registry-get.js +0 -22
- package/dist/tools/package/registry-get.js.map +0 -1
- package/dist/tools/package/scoped-registry-list.d.ts +0 -14
- package/dist/tools/package/scoped-registry-list.js +0 -22
- package/dist/tools/package/scoped-registry-list.js.map +0 -1
- package/dist/tools/package/search.d.ts +0 -17
- package/dist/tools/package/search.js +0 -39
- package/dist/tools/package/search.js.map +0 -1
- package/dist/tools/package/status.d.ts +0 -21
- package/dist/tools/package/status.js +0 -37
- package/dist/tools/package/status.js.map +0 -1
- package/dist/tools/tools/describe.d.ts +0 -27
- package/dist/tools/tools/describe.js +0 -35
- package/dist/tools/tools/describe.js.map +0 -1
- package/dist/tools/tools/group-list.d.ts +0 -16
- package/dist/tools/tools/group-list.js +0 -38
- package/dist/tools/tools/group-list.js.map +0 -1
- package/dist/tools/tools/group.d.ts +0 -13
- package/dist/tools/tools/group.js +0 -34
- package/dist/tools/tools/group.js.map +0 -1
- package/dist/tools/tools/pagination.d.ts +0 -17
- package/dist/tools/tools/pagination.js +0 -28
- package/dist/tools/tools/pagination.js.map +0 -1
- package/dist/tools/tools/search.d.ts +0 -15
- package/dist/tools/tools/search.js +0 -42
- package/dist/tools/tools/search.js.map +0 -1
- package/unitypkg/Editor/Tools/diagnose/preflight.cs +0 -269
- package/unitypkg/Editor/Tools/editor/console.cs +0 -26
- package/unitypkg/Editor/Tools/extension/status.cs +0 -87
- package/unitypkg/Editor/Tools/go/inspect.cs +0 -49
- package/unitypkg/Editor/Tools/graphics/pipeline-quality.cs +0 -24
- package/unitypkg/Editor/Tools/graphics/probe-positions.cs +0 -58
- package/unitypkg/Editor/Tools/graphics/settings.cs +0 -104
- package/unitypkg/Editor/Tools/graphics/stats-counters.cs +0 -28
- package/unitypkg/Editor/Tools/graphics/stats-memory.cs +0 -21
- package/unitypkg/Editor/Tools/instances/list.cs +0 -71
- package/unitypkg/Editor/Tools/physics/raycast-all.cs +0 -67
- package/unitypkg/Editor/Tools/scene/build-settings.cs +0 -69
- package/unitypkg/Editor/Tools/scene/data.cs +0 -125
- package/unitypkg/Editor/Tools/tests/list.cs +0 -98
package/skills/unitycli/SKILL.md
CHANGED
|
@@ -1,70 +1,63 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: unitycli
|
|
3
|
-
description: 所有涉及 Unity
|
|
3
|
+
description: 所有涉及 Unity、Unity Editor 或 UnityPipeline 的任务都优先使用本 Skill,用于判断直接处理项目文件,或通过`unitycli` 入口发现当前 Editor 能力。
|
|
4
4
|
---
|
|
5
|
-
|
|
6
5
|
# UnityCLI
|
|
7
6
|
|
|
8
7
|
FeedbackMode: off
|
|
9
8
|
|
|
10
|
-
`unitycli` 是 AI 操作已打开 Unity Editor
|
|
9
|
+
`unitycli` 是 AI 操作已打开 Unity Editor 的运行时导航入口,不是固定工具手册。根据任务发现当前 catalog,读取所选 descriptor,再构造调用。
|
|
11
10
|
|
|
12
11
|
## 路由
|
|
13
12
|
|
|
14
|
-
-
|
|
15
|
-
-
|
|
16
|
-
-
|
|
17
|
-
-
|
|
18
|
-
- Extension 管理只用 `extensions list`、`extensions install`、`extensions remove`、`extensions doctor`。
|
|
19
|
-
- 已连接实例的目录同时包含 built-in、Extension、project、Editor 和 Runtime 能力,不按 `source` 或当前模式过滤。
|
|
20
|
-
- 完全兼容 Unity 官方 CLI 特性体系:项目与第三方 Package 中以官方 `[CliCommand]`/`[CliArg]`/`IStructuredCommandInput` 声明的命令直接进入同一 catalog,固定投影为 `UnityPipeline_<原名>`、group `UnityPipeline`,用 `command <原名>` 或完整前缀名调用;`com.unity.pipeline` 包自身命令已由 native 能力吸收并按 provider identity 抑制。native 精确重名优先。
|
|
21
|
-
|
|
22
|
-
## 安装协议
|
|
13
|
+
- 需要 Unity 内存、Editor API、导入/编译、PlayMode 或业务效果证明时使用 CLI。
|
|
14
|
+
- Unity 动作与观察能力都从同一 Tool catalog 发现。公开顶层只有 `tools`、`command`、`init`、`extensions`、`target`、`instances`、`doctor`;不要猜 Unity 能力域是顶层命令。
|
|
15
|
+
- 不知道能力领域时可看 group,已有业务关键词时可 search,得到 exact Tool 名后 describe。返回的 `name` 是调用名,group 和 `source` 不参与名称拼接或 owner 路由。
|
|
16
|
+
- `tools run` 与 `command` 复用同一 descriptor 和 schema。`[CliCommand("name")]` 投影为 `UnityPipeline_name`,也可由 `command name` 选择;native exact name 优先。
|
|
23
17
|
|
|
24
|
-
|
|
18
|
+
## 发现与调用
|
|
25
19
|
|
|
26
20
|
```powershell
|
|
27
|
-
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
严格执行返回的版本化`aiInstructions`,不要依赖本Skill记忆安装步骤。先运行`init discover`;当前目录只有一个Unity项目时直接采用,用户已经指定的项目、scope、host或Skill目录都是最终决定,不得重复询问。未指定Skill目录时使用发现结果的当前workspace推荐目标;明确目录使用`init skill --target <SkillDirectory>`。准确目标Unity正在运行时只询问一次是否正常关闭;同意后使用`init package --close-editor`,不得强制终止,也不得替用户决定未保存场景弹窗。Bridge与Skill是独立授权效果,一个失败只阻断自身检查,不阻断另一个;每个成功效果都立即执行对应`--check`并最终汇总全部状态。安装流程不得启动或重启Unity。用户安装请求授权所选效果,除关闭Editor外不增加确认。
|
|
31
|
-
|
|
32
|
-
## 执行骨架
|
|
33
|
-
|
|
34
|
-
```powershell
|
|
35
|
-
# 默认隐藏 offline;仅审计完整历史集合时使用 instances list --all
|
|
21
|
+
# 目标未知、需要审计当前连接或错误要求检查实例时
|
|
36
22
|
unitycli instances list
|
|
37
|
-
|
|
38
|
-
unitycli instances prune --instance <id|projectPath|alias>
|
|
23
|
+
|
|
39
24
|
unitycli tools group --instance <id|projectPath|alias>
|
|
40
|
-
unitycli tools group list <group> --
|
|
41
|
-
unitycli tools search '<k1|k2|...>' --
|
|
25
|
+
unitycli tools group list <group> --instance <id|projectPath|alias>
|
|
26
|
+
unitycli tools search '<k1|k2|...>' --instance <id|projectPath|alias>
|
|
42
27
|
unitycli tools describe <tool> --instance <id|projectPath|alias>
|
|
43
28
|
unitycli tools run <tool> --input '<json>' --instance <id|projectPath|alias>
|
|
29
|
+
unitycli extensions list
|
|
30
|
+
unitycli extensions install <extension>
|
|
31
|
+
unitycli extensions remove <extension>
|
|
32
|
+
unitycli extensions doctor
|
|
44
33
|
|
|
45
|
-
|
|
46
|
-
unitycli command --project-path <projectPath> --page-size 20
|
|
34
|
+
unitycli command --project-path <projectPath>
|
|
47
35
|
unitycli command <name> --field <value> --instance <id|projectPath|alias>
|
|
48
36
|
```
|
|
49
37
|
|
|
50
|
-
|
|
38
|
+
用户已给出目标或当前 Unity 项目 CWD 能唯一解析时可以直接使用;需要 selector 时优先只传一种,冲突的 `--instance` 与 `command --project-path` 会失败。不了解能力领域时可先看 group,已有业务关键词时可直接 search,第一次执行不了解的 Tool 前先 describe。
|
|
39
|
+
|
|
40
|
+
PowerShell 中以单引号包住内联 JSON 和 `tools search '<k1|k2|...>'`。任务明确要求的业务值优先于 schema default 和 example;default/example只说明合法形状,不能把default/example当作连通性或probe调用,也不作为 smoke 调用。分页、artifact、大输出、弹窗和 host 等待按需读取 `references/operation-protocol.md`。
|
|
41
|
+
|
|
42
|
+
- 等待 CLI 进程退出;`--timeout-ms` 应为 host 保留至少 5000 ms 的进程退出时间。不得手工每100毫秒循环轮询;超时不会停止 Unity、已开始的 effect 或 C# 工作。
|
|
43
|
+
- `instances list` 默认过滤 offline 实例并只列出可用实例;需要完整盘点时使用 `instances list --all`,并读取 `invalidRecordCount`。旧、损坏或不可读记录由 CLI 隔离,不要读取、删除或改写内部记录文件;需要清理时使用 `instances prune --instance <id>`,依据返回的 `removed`、`deferred`、`remaining` 计数。启动、编译或 reload 后只等待有界 readiness。
|
|
44
|
+
- `extensions list` 查看浅状态,`extensions install/remove` 管理安装,`extensions doctor` 执行完整检查;不要把 extension 文件系统检查当成普通 Tool 执行的隐式 probe。
|
|
45
|
+
- `auth`、Unity Hub、Cloud、License 和 proxy 属于外部控制面,不由 `unitycli` 代管。
|
|
46
|
+
|
|
47
|
+
## 通用规则
|
|
51
48
|
|
|
52
|
-
|
|
49
|
+
- descriptor 是输入、风险、availability、PlayMode 和依赖的当前契约;根据任务决定是否切换状态、预览或改用其他能力。
|
|
50
|
+
- 调用公开 Tool 或 CLI 控制面即为授权。风险 metadata 只描述效果与可选 dry-run;Skill 不增加确认或预定义操作范围。
|
|
51
|
+
- 等待 CLI 进程退出。`ok:true` 后检查任务相关的关键业务字段;返回结果不足或任务明确要求验证时,再使用只读 Tool 或业务 readback。
|
|
52
|
+
- 失败时根据结构化 error 和 `nextActions` 形成恢复决策。`transient:true` 与 `nextActions` 仍是建议,不构成额外授权门。
|
|
53
|
+
- `E_EXECUTION_TIMEOUT`、放行后连接丢失或缺少可信 terminal envelope只表示没有可信终态。对于`asset.refresh`、player build、Play Mode、Package install/remove/update和`test.run`,先按需发现对应域的`.status` Tool并只传原root `requestId`读取同一Editor session的active phase或exact terminal;status不重放effect。其他能力使用只读Tool或业务readback形成新的业务决策;CLI不自动重放,首次mutation POST后Editor session改变时也不会向新session重投。
|
|
54
|
+
- 状态观察使用 `instances`、`doctor` 或 `editor.state`,不操作内部 registry 或 transport。
|
|
53
55
|
|
|
54
|
-
|
|
56
|
+
## 能力扩展
|
|
55
57
|
|
|
56
|
-
|
|
58
|
+
现有 Tool 不适合时,先判断是否真的需要 Unity 侧执行。普通源码或文本仍可直接处理;有界的临时 Unity 内存或 Editor API 逻辑可以考虑 `code.exec`。同步 C# 开始后不能由 CLI timeout 中止,复杂等待或不确定终态先读 `references/operation-protocol.md`。
|
|
57
59
|
|
|
58
|
-
|
|
59
|
-
- 建议通过 `instances`、`doctor`、`tools run editor.state` 观察状态,不读取内部 Bridge 注册文件、端口或 URL,也不直接 ping transport。
|
|
60
|
-
- CLI会在发送Unity业务请求前自行等待首次ready记录、编译/导入/重载完成和target session任务池放行;不得手工每100毫秒循环调用,也不得读取或操作内部状态。`--timeout-ms T`分别提供最多`T`的准入等待与放行后最多`T`的业务执行。
|
|
61
|
-
- 准入deadline返回的`E_UNITY_BUSY`会明确证明`no business request was sent`,effect未开始,可以稍后提交新root。已进入池后的mutation lease busy不得解释为effect未开始。
|
|
62
|
-
- `E_EXECUTION_TIMEOUT`、放行后连接丢失或缺少可信terminal envelope只表示没有可信终态。先用只读Tool或业务readback观察并形成新的业务决策;CLI不自动重放,首次mutation POST后Editor session改变时也不会向新session重投。`transient:true`与`nextActions`仍是建议,不构成额外授权门。
|
|
63
|
-
- 运行公开CLI时必须等待该进程退出,不得后台分离。传入`--timeout-ms T`时,命令host至少等待`2 * T + 5000`毫秒;CLI在stdout完成或最多1秒后退出。host提前超时不等于CLI、准入grant或Unity effect已经停止。
|
|
64
|
-
- `available:false`、`unavailableReason` 和 `playModeSupport` 说明当前可执行性;`source` 不参与路由。
|
|
65
|
-
- blocker 在 `error.details.blockers` 时,可先读 `editor.dialogs`,再按返回的 dialogId 与 enabled button 调用 `editor.dialog.click`。
|
|
66
|
-
- 大输出、envelope、artifact、分页、host等待预算和 session 说明见 `references/operation-protocol.md`。
|
|
67
|
-
- 内置能力不足时,一次性操作可使用 `code.exec`;反复需要再读 `references/custom-tools.md`。`code.exec`不限制提交的同步C#,也不会拒绝死循环、长时间sleep、阻塞等待、锁等待或长期占用Unity API的代码。提交这类代码前必须先判断它对当前结果是否确有必要,并考虑有界写法或现有Tool能否达到同一结果;确有必要时可以原样执行。代码一旦在Unity主线程开始,`--timeout-ms`只能停止CLI等待,不能中止代码;Unity可能无响应、mutation owner不能收尾、业务状态部分改变或未知,恢复可能需要结束Editor进程。timeout不证明代码已停止,重试前必须观察业务状态。`--dry-run`只预览source hash,不编译、不执行,也不证明代码会结束。
|
|
60
|
+
当能力需要稳定发现、typed schema、结构化结果、明确副作用、重复使用或团队共享时,读取 `references/custom-tools.md` 并实现项目自定义 `IUnityCliTool<TReq,TRes>`。自定义 Tool 仍从当前 catalog 发现、describe 和调用,不假设名称、group 或输入。
|
|
68
61
|
|
|
69
62
|
## 问题反馈
|
|
70
63
|
|
|
@@ -48,11 +48,11 @@ Tool descriptor 常用字段:
|
|
|
48
48
|
|
|
49
49
|
每个live Editor或Development Player session拥有独立任务池,默认达到5个active root时关闭准入,降到4仍关闭,降到3才重开。CLI在业务请求前自动等待;AI不手工轮询、不读取active count,也不管理内部token。统一catalog在Editor和Runtime同时在线时,会分别经过两个session的准入后才返回完整结果。
|
|
50
50
|
|
|
51
|
-
`--timeout-ms T`先提供一份最多`T`的准入预算。CLI在其中等待首次ready记录、当前编译/导入/重载和任务池;证明Unity未运行时立即返回。准入deadline的`E_UNITY_BUSY`明确证明业务Bridge请求未发送、effect未开始,可以稍后提交新root。获得grant后再创建一份完整`T`的execution预算;token重取、status、rebind、reload
|
|
51
|
+
`--timeout-ms T`先提供一份最多`T`的准入预算。CLI在其中等待首次ready记录、当前编译/导入/重载和任务池;证明Unity未运行时立即返回。准入deadline的`E_UNITY_BUSY`明确证明业务Bridge请求未发送、effect未开始,可以稍后提交新root。获得grant后再创建一份完整`T`的execution预算;token重取、status、rebind、reload、terminal recovery和blocker诊断都只能消费该预算,不能刷新第三份预算。blocker补充最多把现有deadline缩短到10秒;没有剩余时间或没有proof时保持主错误不变。
|
|
52
52
|
|
|
53
53
|
`E_EXECUTION_TIMEOUT`、放行后的transport丢失、进程中断或没有可信terminal envelope时,只能确定本次调用没有返回可信终态,不能据此判断mutation是否发生。先读取对象、场景、Package、build/test状态或artifact manifest;只有形成新的业务决策后才提交新请求,不把outcome unknown自动重放。
|
|
54
54
|
|
|
55
|
-
调用公开CLI的命令host必须等待进程退出;传入`--timeout-ms T`时至少等待`2 * T + 5000`毫秒,不得后台分离。CLI
|
|
55
|
+
调用公开CLI的命令host必须等待进程退出;传入`--timeout-ms T`时至少等待`2 * T + 5000`毫秒,不得后台分离。CLI只输出一个terminal envelope,并在stdout完成且已注册的local owner都settle后退出,或在唯一的1000ms宽限期到达时退出;local settlement cleanup只处理仍未消费的lease,永不settle的本地Promise不能延长该宽限。CLI timeout不会强停Unity中已开始的effect,host提前退出也不能作为停止证明。
|
|
56
56
|
|
|
57
57
|
compile、import、domain reload和listener generation交接由session supervisor在同一execution absolute deadline内处理。同一次调用仅在`editorSessionId`未改变时,才能用完全相同的request bytes续接durable terminal;首次mutation POST后若session改变,CLI禁止向新session再次POST并返回`E_EXECUTION_TIMEOUT`。
|
|
58
58
|
|
|
@@ -67,7 +67,7 @@ compile、import、domain reload和listener generation交接由session superviso
|
|
|
67
67
|
|
|
68
68
|
## 弹窗与长操作
|
|
69
69
|
|
|
70
|
-
`editor.state`公开状态固定为`ready|transitioning|blocked|unresponsive|unverifiable|offline|conflict`。它与`editor.dialogs`、`editor.dialog.click
|
|
70
|
+
`editor.state`公开状态固定为`ready|transitioning|blocked|unresponsive|unverifiable|offline|conflict`。它与`editor.dialogs`、`editor.dialog.click`是仅有的三个exact观察名称:使用冻结本地descriptor进入统一dispatcher,不依赖可能被阻断的Live catalog或普通业务admission;alias、group、handler和其他offline Tool不继承该路径。`tools describe`可精确学习这三个descriptor。三者仍执行schema、availability、completion和结果校验,共用从dispatch开始的一份absolute deadline;`editor.state`只可发出一次private snapshot观察,dialogs仅Windows可用。`conflict`只表示至少两个verified live claim;身份读取失败使用`unverifiable`,transport存在但主线程不推进使用`unresponsive`。原错误包含`details.blockers`时,先`tools run editor.dialogs`。点击前使用当前返回的dialogId和规范化button label;只能选择当前可见且enabled的按钮。点击会保留最小pre-effect预算,deadline先到会关闭首次effect barrier;点击后必须证明弹窗消失或状态改变。
|
|
71
71
|
|
|
72
72
|
`build.run`、`test.run`、`editor.refresh`、`code.exec` 和需要刷新 Editor 的 Package Tool 在一次调用内等待最终业务结果。超时只表示该次调用没有可信终态,后续动作由调用方决定。`code.exec`的同步C#一旦在Unity主线程开始,timeout不能中止它;死循环、阻塞等待或长期Unity API调用可继续占用Editor。调用方应先判断这类代码是否确有必要;决定执行后应把timeout视为outcome unknown并在重试前观察业务状态。
|
|
73
73
|
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
#if UNITY_EDITOR
|
|
2
2
|
using System;
|
|
3
3
|
using System.Collections.Generic;
|
|
4
|
-
using System.Reflection;
|
|
5
4
|
using System.Threading;
|
|
6
5
|
using System.Threading.Tasks;
|
|
7
6
|
|
|
@@ -18,17 +17,34 @@ namespace UnityCli
|
|
|
18
17
|
string domain,
|
|
19
18
|
bool destructive,
|
|
20
19
|
int timeoutMs,
|
|
21
|
-
Func<TInput, CancellationToken, ValueTask<object>> handler
|
|
20
|
+
Func<TInput, CancellationToken, ValueTask<object>> handler,
|
|
21
|
+
UnityCliBridgeQueuePolicy.WorkClass? queueClass = null)
|
|
22
22
|
{
|
|
23
23
|
if (string.IsNullOrWhiteSpace(command)) throw new ArgumentException("Bridge command registration requires a command name.", "command");
|
|
24
24
|
if (handler == null) throw new ArgumentNullException("handler");
|
|
25
25
|
if (commands.ContainsKey(command)) throw new InvalidOperationException("Duplicate bridge command registration: " + command);
|
|
26
|
+
var registeredQueueClass = queueClass;
|
|
27
|
+
if (!registeredQueueClass.HasValue && command.StartsWith("internal.", StringComparison.Ordinal))
|
|
28
|
+
registeredQueueClass = UnityCliBridgeQueuePolicy.IsSafeStatusCommand(command)
|
|
29
|
+
? UnityCliBridgeQueuePolicy.WorkClass.SafeStatus
|
|
30
|
+
: UnityCliBridgeQueuePolicy.WorkClass.Mutation;
|
|
31
|
+
if (registeredQueueClass == UnityCliBridgeQueuePolicy.WorkClass.SafeStatus && !UnityCliBridgeQueuePolicy.IsSafeStatusCommand(command))
|
|
32
|
+
throw new InvalidOperationException("Only exact SafeStatus commands may use SafeStatus classification: " + command);
|
|
33
|
+
if (registeredQueueClass == UnityCliBridgeQueuePolicy.WorkClass.Control && !UnityCliBridgeQueuePolicy.IsDurableControlCommand(command))
|
|
34
|
+
throw new InvalidOperationException("Only exact durable control commands may use Control classification: " + command);
|
|
35
|
+
if (UnityCliBridgeQueuePolicy.IsDurableControlCommand(command) && registeredQueueClass != UnityCliBridgeQueuePolicy.WorkClass.Control)
|
|
36
|
+
throw new InvalidOperationException("Durable control command must use Control classification: " + command);
|
|
37
|
+
if (command.StartsWith("internal.", StringComparison.Ordinal)
|
|
38
|
+
&& registeredQueueClass == UnityCliBridgeQueuePolicy.WorkClass.OrdinaryRead
|
|
39
|
+
&& !UnityCliBridgeQueuePolicy.IsOrdinaryReadInternalCommand(command))
|
|
40
|
+
throw new InvalidOperationException("Only exact observation commands may use OrdinaryRead classification: " + command);
|
|
26
41
|
commands.Add(command, new BridgeCommandDefinition(
|
|
27
42
|
command,
|
|
28
43
|
domain,
|
|
29
44
|
destructive,
|
|
30
45
|
timeoutMs,
|
|
31
46
|
typeof(TInput),
|
|
47
|
+
registeredQueueClass,
|
|
32
48
|
async (input, cancellationToken) => await handler((TInput)input, cancellationToken)));
|
|
33
49
|
}
|
|
34
50
|
|
|
@@ -58,17 +74,39 @@ namespace UnityCli
|
|
|
58
74
|
BridgeCommandDefinition definition;
|
|
59
75
|
return command != null && commands.TryGetValue(command, out definition) && definition.Destructive;
|
|
60
76
|
}
|
|
77
|
+
|
|
78
|
+
public bool TryGetQueueClass(string command, out UnityCliBridgeQueuePolicy.WorkClass workClass)
|
|
79
|
+
{
|
|
80
|
+
BridgeCommandDefinition definition;
|
|
81
|
+
if (command != null && commands.TryGetValue(command, out definition) && definition.QueueClass.HasValue)
|
|
82
|
+
{
|
|
83
|
+
workClass = definition.QueueClass.Value;
|
|
84
|
+
return true;
|
|
85
|
+
}
|
|
86
|
+
workClass = default(UnityCliBridgeQueuePolicy.WorkClass);
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
internal IReadOnlyDictionary<string, UnityCliBridgeQueuePolicy.WorkClass> InternalQueueClasses()
|
|
91
|
+
{
|
|
92
|
+
var result = new Dictionary<string, UnityCliBridgeQueuePolicy.WorkClass>(StringComparer.Ordinal);
|
|
93
|
+
foreach (var pair in commands)
|
|
94
|
+
if (pair.Key.StartsWith("internal.", StringComparison.Ordinal) && pair.Value.QueueClass.HasValue)
|
|
95
|
+
result.Add(pair.Key, pair.Value.QueueClass.Value);
|
|
96
|
+
return result;
|
|
97
|
+
}
|
|
61
98
|
}
|
|
62
99
|
|
|
63
100
|
private sealed class BridgeCommandDefinition
|
|
64
101
|
{
|
|
65
|
-
public BridgeCommandDefinition(string command, string domain, bool destructive, int timeoutMs, Type inputType, Func<object, CancellationToken, ValueTask<object>> handler)
|
|
102
|
+
public BridgeCommandDefinition(string command, string domain, bool destructive, int timeoutMs, Type inputType, UnityCliBridgeQueuePolicy.WorkClass? queueClass, Func<object, CancellationToken, ValueTask<object>> handler)
|
|
66
103
|
{
|
|
67
104
|
Command = command;
|
|
68
105
|
Domain = domain;
|
|
69
106
|
Destructive = destructive;
|
|
70
107
|
TimeoutMs = timeoutMs;
|
|
71
108
|
InputType = inputType;
|
|
109
|
+
QueueClass = queueClass;
|
|
72
110
|
Handler = handler;
|
|
73
111
|
}
|
|
74
112
|
|
|
@@ -77,16 +115,23 @@ namespace UnityCli
|
|
|
77
115
|
public bool Destructive { get; private set; }
|
|
78
116
|
public int TimeoutMs { get; private set; }
|
|
79
117
|
public Type InputType { get; private set; }
|
|
118
|
+
public UnityCliBridgeQueuePolicy.WorkClass? QueueClass { get; private set; }
|
|
80
119
|
public Func<object, CancellationToken, ValueTask<object>> Handler { get; private set; }
|
|
81
120
|
}
|
|
82
121
|
|
|
122
|
+
internal static IReadOnlyDictionary<string, UnityCliBridgeQueuePolicy.WorkClass> InternalQueueClassesForTests()
|
|
123
|
+
{
|
|
124
|
+
return CommandRegistry.InternalQueueClasses();
|
|
125
|
+
}
|
|
126
|
+
|
|
83
127
|
private static BridgeCommandRegistry CreateCommandRegistry()
|
|
84
128
|
{
|
|
85
129
|
var registry = new BridgeCommandRegistry();
|
|
86
|
-
RegisterInstalledExtensionCommands(registry);
|
|
87
130
|
RegisterCodeExecCommand(registry);
|
|
88
131
|
RegisterEditorStateSnapshotCommand(registry);
|
|
132
|
+
RegisterDoctorDiagnosticCommands(registry);
|
|
89
133
|
RegisterInstanceCleanupCommand(registry);
|
|
134
|
+
UnityCliDurableStatusCoordinator.Register(registry);
|
|
90
135
|
UnityCliCompileCoordinator.Register(registry);
|
|
91
136
|
UnityCliLiveBuildCoordinator.Register(registry);
|
|
92
137
|
UnityCliLiveRefreshCoordinator.Register(registry);
|
|
@@ -158,16 +203,6 @@ namespace UnityCli
|
|
|
158
203
|
return result;
|
|
159
204
|
}
|
|
160
205
|
|
|
161
|
-
private static void RegisterInstalledExtensionCommands(BridgeCommandRegistry registry)
|
|
162
|
-
{
|
|
163
|
-
var methodNames = Array.Empty<string>();
|
|
164
|
-
foreach (var methodName in methodNames)
|
|
165
|
-
{
|
|
166
|
-
var method = typeof(UnityCliBridge).GetMethod(methodName, BindingFlags.Static | BindingFlags.NonPublic);
|
|
167
|
-
if (method == null) throw new InvalidOperationException("Installed extension bridge registration method is missing: " + methodName);
|
|
168
|
-
method.Invoke(null, new object[] { registry });
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
206
|
}
|
|
172
207
|
}
|
|
173
208
|
#endif
|
|
@@ -403,24 +403,15 @@ namespace UnityCli
|
|
|
403
403
|
nextActions: new[] { "Inspect editor.state and retry only after Unity is responsive." })), 200);
|
|
404
404
|
return;
|
|
405
405
|
}
|
|
406
|
-
AdmissionOwnerIdentity admissionOwner;
|
|
407
|
-
try { admissionOwner = AuthorizeAdmission(context.Request, request, rawBody); }
|
|
408
|
-
catch (BridgeCommandException exception)
|
|
409
|
-
{
|
|
410
|
-
WriteJson(context, SerializeBridgeExceptionEnvelope(request.RequestId, exception), 200);
|
|
411
|
-
return;
|
|
412
|
-
}
|
|
413
406
|
WriteLog("bridge_request_body_read requestId=" + request.RequestId + " command=" + request.Command + " bytes=" + rawBody.Length.ToString(CultureInfo.InvariantCulture));
|
|
414
407
|
|
|
415
|
-
//
|
|
416
|
-
// During compile/import/domain reload, immediately return a transient error
|
|
417
|
-
// so the CLI can retry-after instead of waiting 60s for a timeout.
|
|
408
|
+
// 所有瞬态Editor gate必须在token消费前完成,拒绝路径对active pool零影响。
|
|
418
409
|
if (domainReloading)
|
|
419
410
|
{
|
|
420
411
|
WriteJson(context, SerializeTransientErrorEnvelope(request.RequestId, "E_UNITY_DOMAIN_RELOAD", "Unity Editor is reloading assemblies (domain reload).", "Wait for domain reload to complete and retry.", 10000), 200);
|
|
421
412
|
return;
|
|
422
413
|
}
|
|
423
|
-
var allowedDuringCompileOrImport = UnityCliCompileCoordinator.IsCommand(request.Command) || UnityCliLiveRefreshCoordinator.IsCommand(request.Command) || UnityCliAssetRefreshCoordinator.IsCommand(request.Command) || UnityCliPackageEmbedCoordinator.IsCommand(request.Command) || UnityCliPackageResolveCoordinator.IsCommand(request.Command) || UnityCliTestRunCoordinator.IsCommand(request.Command) || UnityCliNavMeshBakeCoordinator.IsCommand(request.Command) || UnityCliOcclusionBakeCoordinator.IsCommand(request.Command) || IsEditorStateSnapshotCommand(request.Command);
|
|
414
|
+
var allowedDuringCompileOrImport = UnityCliDurableStatusCoordinator.IsCommand(request.Command) || UnityCliCompileCoordinator.IsCommand(request.Command) || UnityCliLiveRefreshCoordinator.IsCommand(request.Command) || UnityCliAssetRefreshCoordinator.IsCommand(request.Command) || UnityCliPackageEmbedCoordinator.IsCommand(request.Command) || UnityCliPackageResolveCoordinator.IsCommand(request.Command) || UnityCliTestRunCoordinator.IsCommand(request.Command) || UnityCliNavMeshBakeCoordinator.IsCommand(request.Command) || UnityCliOcclusionBakeCoordinator.IsCommand(request.Command) || IsEditorStateSnapshotCommand(request.Command) || IsProjectToolCatalogReadCommand(request.Command) || IsDoctorAdmissionBypassCommand(request.Command);
|
|
424
415
|
if (cachedIsCompiling && !allowedDuringCompileOrImport)
|
|
425
416
|
{
|
|
426
417
|
WriteJson(context, SerializeTransientErrorEnvelope(request.RequestId, "E_UNITY_COMPILING", "Unity Editor is compiling scripts.", "Wait for Unity to finish compiling and retry.", 5000), 200);
|
|
@@ -435,16 +426,13 @@ namespace UnityCli
|
|
|
435
426
|
{
|
|
436
427
|
// 只在 PlayMode 切换期限制高风险命令;稳定运行态允许 CLI 工具继续入队执行。
|
|
437
428
|
// 这里必须与 UnityCliBridge.Execute() 的切换期 allowlist 保持一致。
|
|
438
|
-
var allowedDuringPlayModeTransition = UnityCliCompileCoordinator.IsCommand(request.Command) || UnityCliLiveRefreshCoordinator.IsCommand(request.Command) || UnityCliAssetRefreshCoordinator.IsCommand(request.Command) || UnityCliPackageEmbedCoordinator.IsCommand(request.Command) || UnityCliPackageResolveCoordinator.IsCommand(request.Command) || UnityCliTestRunCoordinator.IsCommand(request.Command) || UnityCliNavMeshBakeCoordinator.IsCommand(request.Command) || UnityCliOcclusionBakeCoordinator.IsCommand(request.Command)
|
|
429
|
+
var allowedDuringPlayModeTransition = UnityCliDurableStatusCoordinator.IsCommand(request.Command) || UnityCliCompileCoordinator.IsCommand(request.Command) || UnityCliLiveRefreshCoordinator.IsCommand(request.Command) || UnityCliAssetRefreshCoordinator.IsCommand(request.Command) || UnityCliPackageEmbedCoordinator.IsCommand(request.Command) || UnityCliPackageResolveCoordinator.IsCommand(request.Command) || UnityCliTestRunCoordinator.IsCommand(request.Command) || UnityCliNavMeshBakeCoordinator.IsCommand(request.Command) || UnityCliOcclusionBakeCoordinator.IsCommand(request.Command)
|
|
439
430
|
|| IsEditorStateSnapshotCommand(request.Command)
|
|
440
|
-
|| request.Command == "editor.console"
|
|
441
431
|
|| request.Command == "editor.pause"
|
|
442
432
|
|| request.Command == "editor.stop"
|
|
443
|
-
|| request.Command
|
|
433
|
+
|| IsProjectToolCatalogReadCommand(request.Command)
|
|
444
434
|
|| request.Command == "runtime-tool.run"
|
|
445
|
-
|| request.Command
|
|
446
|
-
|| request.Command == "diagnose.preflight"
|
|
447
|
-
|| request.Command == "extension.status";
|
|
435
|
+
|| IsDoctorAdmissionBypassCommand(request.Command);
|
|
448
436
|
|
|
449
437
|
WriteLog("http_play_mode_guard requestId=" + request.RequestId + " command=" + request.Command + " cachedIsPlayingOrWillChange=" + Bool(cachedIsPlayingOrWillChangePlaymode) + " cachedIsPlaying=" + Bool(cachedIsPlaying) + " transitionAllowed=" + Bool(allowedDuringPlayModeTransition));
|
|
450
438
|
|
|
@@ -460,10 +448,7 @@ namespace UnityCli
|
|
|
460
448
|
BridgeWorkItem item;
|
|
461
449
|
bool created;
|
|
462
450
|
int queueDepth;
|
|
463
|
-
try
|
|
464
|
-
{
|
|
465
|
-
item = EnqueueOrAttach(request, rawBody, ListenerId, CurrentListenerGeneration(), admissionOwner, out created, out queueDepth);
|
|
466
|
-
}
|
|
451
|
+
try { item = EnqueueOrAttach(context.Request, request, rawBody, ListenerId, CurrentListenerGeneration(), out created, out queueDepth); }
|
|
467
452
|
catch (BridgeCommandException exception)
|
|
468
453
|
{
|
|
469
454
|
WriteJson(context, SerializeBridgeExceptionEnvelope(request.RequestId, exception), 200);
|
|
@@ -477,19 +462,10 @@ namespace UnityCli
|
|
|
477
462
|
var queueSignal = WaitHandle.WaitAny(new[] { item.Started.WaitHandle, item.Completed.WaitHandle }, queueRemainingMs);
|
|
478
463
|
if (queueSignal == WaitHandle.WaitTimeout)
|
|
479
464
|
{
|
|
480
|
-
|
|
481
|
-
{
|
|
482
|
-
WriteLog("bridge_queue_start_timeout requestId=" + request.RequestId + " command=" + request.Command);
|
|
483
|
-
WriteJson(context, UnityCliSerializer.Serialize(UnityCli.Protocol.ProtocolEnvelopeFactory.Error(
|
|
484
|
-
request.RequestId,
|
|
485
|
-
"E_EXECUTION_TIMEOUT",
|
|
486
|
-
"Unity Editor did not start the bridge request before the immutable deadline.",
|
|
487
|
-
nextActions: new[] { "Inspect editor.state and retry only after Unity is responsive." })), 200);
|
|
488
|
-
return;
|
|
489
|
-
}
|
|
465
|
+
// HTTP deadline只结束当前响应;WorkItem identity继续留在map,由主线程统一裁决是否开始或收敛。
|
|
490
466
|
WriteLog("bridge_queue_start_timeout requestId=" + request.RequestId + " command=" + request.Command);
|
|
491
467
|
WriteJson(context, ResolveStartedTimeoutResponse(item, request,
|
|
492
|
-
"The immutable deadline elapsed
|
|
468
|
+
"The immutable deadline elapsed before Unity confirmed the request start."), 200);
|
|
493
469
|
return;
|
|
494
470
|
}
|
|
495
471
|
if (queueSignal == 1)
|
|
@@ -502,7 +478,6 @@ namespace UnityCli
|
|
|
502
478
|
if (!request.TryDeadlineRemainingMs(out executionRemainingMs)) executionRemainingMs = 0;
|
|
503
479
|
if (!item.Completed.Wait(TimeSpan.FromMilliseconds(executionRemainingMs)))
|
|
504
480
|
{
|
|
505
|
-
item.Cancel();
|
|
506
481
|
WriteLog("bridge_execution_timeout requestId=" + request.RequestId + " command=" + request.Command);
|
|
507
482
|
WriteJson(context, ResolveStartedTimeoutResponse(item, request,
|
|
508
483
|
"The immutable deadline elapsed after Unity started the request."), 200);
|
|
@@ -521,8 +496,7 @@ namespace UnityCli
|
|
|
521
496
|
// CompleteWorkItem/Response 可能恰好在上述读取后发生;再读一次避免丢失已完成结果。
|
|
522
497
|
if (item.Completed.Wait(0) && item.Response != null) return item.Response;
|
|
523
498
|
|
|
524
|
-
//
|
|
525
|
-
item.CancelBeforeAcceptance();
|
|
499
|
+
// HTTP timeout不改变WorkItem acceptance、Completed或map;同identity attach仍返回同一个对象。
|
|
526
500
|
return UnityCliSerializer.Serialize(UnityCli.Protocol.ProtocolEnvelopeFactory.Error(
|
|
527
501
|
request.RequestId,
|
|
528
502
|
"E_EXECUTION_TIMEOUT",
|