mcpywrap 0.6.3__tar.gz → 0.6.4__tar.gz
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.
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/CHANGELOG.md +8 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/PKG-INFO +2 -2
- mcpywrap-0.6.4/core/mcpywrap_core/_version.py +1 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/desktop/mcpywrap.egg-info/PKG-INFO +2 -2
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/desktop/mcpywrap.egg-info/SOURCES.txt +8 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/desktop/mcpywrap.egg-info/requires.txt +1 -1
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/desktop/mcpywrap_assets/bridge_payload/Injector.exe +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/desktop/mcpywrap_assets/bridge_payload/Loader.dll +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/desktop/mcpywrap_assets/bridge_payload/McpyMcsAuth.dll +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/desktop/mcpywrap_assets/bridge_payload/manifest.json +3 -3
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/desktop/mcpywrap_assets/window_activation/manifest.json +1 -1
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/desktop/mcpywrap_assets/window_activation/mcpy-window-activation.dll +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/desktop/mcpywrap_assets/window_capture/manifest.json +1 -1
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/desktop/mcpywrap_assets/window_capture/mcpy-window-capture.exe +0 -0
- mcpywrap-0.6.4/docs/dependency-packaging-design.md +62 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/docs/git-dependencies.md +8 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/docs/local-dependencies.md +8 -0
- mcpywrap-0.6.4/native/tracy_profiler/README.md +52 -0
- mcpywrap-0.6.4/native/tracy_profiler/apply.py +41 -0
- mcpywrap-0.6.4/native/tracy_profiler/client-tracy.patch +41 -0
- mcpywrap-0.6.4/native/tracy_profiler/libc-shim-host-info.patch +213 -0
- mcpywrap-0.6.4/native/tracy_profiler/manifest-tracy.patch +99 -0
- mcpywrap-0.6.4/native/tracy_profiler/probe.py +54 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/skills/mcpywrap/SKILL.md +1 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/skills/mcpywrap/references/consumer-prepare.md +2 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/skills/mcpywrap/references/macos-local.md +3 -2
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/skills/mcpywrap/references/project-dependencies.md +29 -1
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/skills/mcpywrap/references/project-workflow.md +2 -2
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/skills/mcpywrap/scripts/bootstrap.py +2 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/README.md +3 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/test_core_api.py +8 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/test_mobile_host.py +35 -8
- mcpywrap-0.6.4/tests/test_unbundled_dependencies.py +476 -0
- mcpywrap-0.6.3/core/mcpywrap_core/_version.py +0 -1
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/CONTRIBUTING.md +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/LICENSE +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/MANIFEST.in +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/README.md +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/RELEASING.md +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/THIRD_PARTY_NOTICES.md +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/desktop/mcpywrap.egg-info/dependency_links.txt +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/desktop/mcpywrap.egg-info/entry_points.txt +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/desktop/mcpywrap.egg-info/top_level.txt +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/desktop/mcpywrap_assets/__init__.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/desktop/mcpywrap_assets/bridge_payload/publisher.cer +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/docs/code-libraries.md +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/docs/deployment-recovery.md +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/docs/engine-discovery.md +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/docs/game-backends.md +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/docs/input-sequence.md +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/docs/instance-world-settings.md +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/docs/launcher-client-python.md +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/docs/macos-resource-reload.md +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/docs/mcs-auth.md +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/docs/project-scripts.md +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/docs/qt6-development.md +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/docs/qumod.md +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/docs/runtime-debug.md +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/docs/runtime-input.md +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/docs/runtime-player.md +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/docs/runtime-ui.md +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/docs/shared-core.md +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/docs/shared-log-ui.md +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/docs/windows-local-multiplayer.md +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/examples/consumer_prepare/README.md +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/native/background_window/README.md +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/native/background_window/apply.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/native/background_window/client-background.patch +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/native/background_window/game-window-background.patch +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/native/background_window/libc-shim-background.patch +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/native/background_window/manifest-background.patch +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/native/background_window/test_window.cpp +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/native/mcs_auth/Bridge.cs +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/native/mcs_auth/Injector.cs +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/native/mcs_auth/Loader.c +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/native/mcs_auth/publisher.cer +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/native/mcs_auth/publisher.json +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/native/runtime_input/README.md +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/native/runtime_input/launcher-monotonic.patch +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/native/runtime_input/manifest-monotonic.patch +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/native/runtime_input/steady_clock.h +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/native/window_activation/README.md +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/native/window_activation/window_activation.cpp +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/native/window_capture/ocr.h +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/native/window_capture/video_capture.h +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/native/window_capture/window_capture.cpp +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/pyproject.toml +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/scripts/build_all_native.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/scripts/build_app_icon.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/scripts/build_distributions.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/scripts/build_mcs_auth_bridge.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/scripts/build_window_activation.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/scripts/build_window_capture.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/scripts/check_mcs_auth_bridge.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/scripts/check_release.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/scripts/check_window_activation.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/scripts/check_window_capture.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/scripts/pypi_release.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/scripts/sign_mcs_auth_ci.ps1 +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/scripts/verify_core_release.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/scripts/verify_distributions.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/scripts/version.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/setup.cfg +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/setup.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/skills/mcpywrap/agents/openai.yaml +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/skills/mcpywrap/assets/consumer-prepare/framework/behavior_pack/CatalogRuntime/__init__.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/skills/mcpywrap/assets/consumer-prepare/framework/behavior_pack/manifest.json +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/skills/mcpywrap/assets/consumer-prepare/framework/build_tools/example.toml +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/skills/mcpywrap/assets/consumer-prepare/framework/build_tools/prepare.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/skills/mcpywrap/assets/consumer-prepare/framework/build_tools/schema.json +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/skills/mcpywrap/assets/consumer-prepare/framework/pyproject.toml +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/skills/mcpywrap/assets/consumer-prepare/game/.gitignore +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/skills/mcpywrap/assets/consumer-prepare/game/behavior_pack/manifest.json +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/skills/mcpywrap/assets/consumer-prepare/game/data/items.json +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/skills/mcpywrap/assets/consumer-prepare/game/pyproject.toml +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/skills/mcpywrap/assets/consumer-prepare/game/resource_pack/manifest.json +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/skills/mcpywrap/references/application-host.md +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/skills/mcpywrap/references/capture.md +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/skills/mcpywrap/references/consumer-prepare-author.md +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/skills/mcpywrap/references/dual-clients.md +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/skills/mcpywrap/references/input-sequence.md +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/skills/mcpywrap/references/input-writing.md +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/skills/mcpywrap/references/instance-world-settings.md +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/skills/mcpywrap/references/local-development.md +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/skills/mcpywrap/references/network-sessions.md +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/skills/mcpywrap/references/project-scripts.md +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/skills/mcpywrap/references/remote-testing.md +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/skills/mcpywrap/references/runtime-debug.md +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/skills/mcpywrap/references/runtime-input.md +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/skills/mcpywrap/references/runtime-key-timeline.md +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/skills/mcpywrap/references/runtime-player.md +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/skills/mcpywrap/references/runtime-ui.md +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/skills/mcpywrap/references/script-example.md +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/skills/mcpywrap/references/setup.md +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/skills/mcpywrap/references/troubleshooting.md +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/skills/mcpywrap/scripts/bootstrap.ps1 +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/skills/mcpywrap/scripts/game_window.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/skills/mcpywrap/scripts/smoke.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/core_fixture.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/embedded_upgrade_probe.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/manual/consumer_prepare_acceptance.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/manual/lifecycle_dependency_audit.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/manual/runtime_controls/README.md +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/manual/runtime_controls/client_probe.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/manual/runtime_controls/input_probe.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/manual/runtime_controls/key_timeline_probe.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/manual/runtime_controls/movement.json +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/manual/runtime_controls/run.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/manual/runtime_controls/server_fixture.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/manual/runtime_controls/support.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/manual_background_launch.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/manual_dependency_boundaries.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/manual_input_window.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/manual_integration.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/manual_native_recording.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/manual_remote_recording.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/manual_runtime_input.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/manual_runtime_input_unified.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/manual_runtime_key_timeline.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/manual_runtime_player.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/manual_runtime_ui.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/manual_windows_local_groups.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/runtime_support.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/test_application_icons.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/test_auth_interaction.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/test_automation.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/test_build_replace_retry.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/test_builder_import_boundary.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/test_code_libraries.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/test_consumer_prepare.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/test_core_updates.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/test_dependency_boundaries.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/test_deployment_cli.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/test_deployment_encoding.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/test_deployment_recovery.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/test_distribution_layout.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/test_engine_backends.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/test_engine_compatibility.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/test_engine_discovery.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/test_engine_install.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/test_execution_boundaries.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/test_game_window_skill.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/test_git_projects.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/test_host_input.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/test_host_services.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/test_input_sequence.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/test_instance_cppconfig.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/test_launch_encoding.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/test_launcher_python.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/test_lifecycle_audit.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/test_lifecycle_races.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/test_local_auth_session.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/test_local_dependencies.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/test_lock_storage.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/test_log_query.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/test_log_stream.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/test_macos_network.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/test_manual_runtime_controls.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/test_mcs_auth.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/test_mobile_diagnostics.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/test_mobile_pairing.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/test_modsdk_environment.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/test_mouse.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/test_native_input_sequence.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/test_native_preferences.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/test_native_recording.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/test_network.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/test_network_sessions.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/test_pack_uuid_conflicts.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/test_package.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/test_project_scripts.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/test_qt_sessions.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/test_qumod_workflow.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/test_recordings.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/test_remote.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/test_remote_scripts.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/test_resource_reload.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/test_restricted_process_identity.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/test_runtime_debug.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/test_runtime_deployment.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/test_runtime_groups.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/test_runtime_input.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/test_runtime_key_timeline.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/test_runtime_player.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/test_runtime_profiles.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/test_runtime_ui.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/test_runtime_ui_outline.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/test_screenshot.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/test_session_capabilities.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/test_shared_logs.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/test_skill_workflows.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/test_unified_skill_contract.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/test_window_activation.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/test_window_focus.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/test_window_policy.py +0 -0
- {mcpywrap-0.6.3 → mcpywrap-0.6.4}/tests/test_windows_lan.py +0 -0
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
# 更新记录
|
|
2
2
|
|
|
3
|
+
## 0.6.4
|
|
4
|
+
|
|
5
|
+
- 游戏依赖新增 `unbundled` 布尔标记,默认 false;设为 true 时 dev/run 照常加载,build/package 排除,支持本地 Addon 与通用 Git Addon/code。
|
|
6
|
+
- 新增依赖图只读预览和仅恢复打包依赖的同步选项,按引用链保留共享节点;Git 锁区分新标记并兼容既有普通依赖,未安装的不打包节点不阻塞发布。
|
|
7
|
+
- Qt 依赖管理提供“不随构建打包”复选框、已有依赖设置修改和发布预览;CLI、JSON 与内置 Skill 使用同一概念,配对 App 的预览保持相同结果结构。
|
|
8
|
+
- dev 与 build 的同目标写入互斥,完整构建清除旧开发产物;阻止不随发布的代码覆盖发布模块,并明确消费者准备的适用边界。
|
|
9
|
+
- macOS 默认运行包升级到 0.4.7:修复兼容层 `uname` 布局越界与 `getlogin`/`sysinfo` 缺失,游戏内置 Tracy 由引擎自行启动并默认仅监听 `127.0.0.1:8086`;终止桩不再覆盖已实现的接口。旧实例保留原运行包绑定。
|
|
10
|
+
|
|
3
11
|
## 0.6.3
|
|
4
12
|
|
|
5
13
|
- Windows `run --clients 2` 默认自动加入并校验双方玩家;提供 `--join-mode manual` 保留手动操作,状态、Qt 会话页和 smoke 验收支持自动加入阶段。
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mcpywrap
|
|
3
|
-
Version: 0.6.
|
|
3
|
+
Version: 0.6.4
|
|
4
4
|
Summary: Complete mcpy desktop tools, powered by the shared mcpywrap-core
|
|
5
5
|
Author-email: boybook <boybook@easecation.net>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -10,7 +10,7 @@ Requires-Python: >=3.9
|
|
|
10
10
|
Description-Content-Type: text/markdown
|
|
11
11
|
License-File: LICENSE
|
|
12
12
|
License-File: THIRD_PARTY_NOTICES.md
|
|
13
|
-
Requires-Dist: mcpywrap-core==0.6.
|
|
13
|
+
Requires-Dist: mcpywrap-core==0.6.4
|
|
14
14
|
Requires-Dist: pip>=23
|
|
15
15
|
Requires-Dist: build>=1.0
|
|
16
16
|
Requires-Dist: watchdog>=2.0.0
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = '0.6.4'
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mcpywrap
|
|
3
|
-
Version: 0.6.
|
|
3
|
+
Version: 0.6.4
|
|
4
4
|
Summary: Complete mcpy desktop tools, powered by the shared mcpywrap-core
|
|
5
5
|
Author-email: boybook <boybook@easecation.net>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -10,7 +10,7 @@ Requires-Python: >=3.9
|
|
|
10
10
|
Description-Content-Type: text/markdown
|
|
11
11
|
License-File: LICENSE
|
|
12
12
|
License-File: THIRD_PARTY_NOTICES.md
|
|
13
|
-
Requires-Dist: mcpywrap-core==0.6.
|
|
13
|
+
Requires-Dist: mcpywrap-core==0.6.4
|
|
14
14
|
Requires-Dist: pip>=23
|
|
15
15
|
Requires-Dist: build>=1.0
|
|
16
16
|
Requires-Dist: watchdog>=2.0.0
|
|
@@ -25,6 +25,7 @@ desktop/mcpywrap_assets/window_activation/mcpy-window-activation.dll
|
|
|
25
25
|
desktop/mcpywrap_assets/window_capture/manifest.json
|
|
26
26
|
desktop/mcpywrap_assets/window_capture/mcpy-window-capture.exe
|
|
27
27
|
docs/code-libraries.md
|
|
28
|
+
docs/dependency-packaging-design.md
|
|
28
29
|
docs/deployment-recovery.md
|
|
29
30
|
docs/engine-discovery.md
|
|
30
31
|
docs/game-backends.md
|
|
@@ -62,6 +63,12 @@ native/runtime_input/README.md
|
|
|
62
63
|
native/runtime_input/launcher-monotonic.patch
|
|
63
64
|
native/runtime_input/manifest-monotonic.patch
|
|
64
65
|
native/runtime_input/steady_clock.h
|
|
66
|
+
native/tracy_profiler/README.md
|
|
67
|
+
native/tracy_profiler/apply.py
|
|
68
|
+
native/tracy_profiler/client-tracy.patch
|
|
69
|
+
native/tracy_profiler/libc-shim-host-info.patch
|
|
70
|
+
native/tracy_profiler/manifest-tracy.patch
|
|
71
|
+
native/tracy_profiler/probe.py
|
|
65
72
|
native/window_activation/README.md
|
|
66
73
|
native/window_activation/window_activation.cpp
|
|
67
74
|
native/window_capture/ocr.h
|
|
@@ -208,6 +215,7 @@ tests/test_screenshot.py
|
|
|
208
215
|
tests/test_session_capabilities.py
|
|
209
216
|
tests/test_shared_logs.py
|
|
210
217
|
tests/test_skill_workflows.py
|
|
218
|
+
tests/test_unbundled_dependencies.py
|
|
211
219
|
tests/test_unified_skill_contract.py
|
|
212
220
|
tests/test_window_activation.py
|
|
213
221
|
tests/test_window_focus.py
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -11,9 +11,9 @@
|
|
|
11
11
|
"Loader.c": "f2f1f781ce82fc30c62a6ce22bb048d3b023f6ff500e6ec8228da28b4dbf1b4a"
|
|
12
12
|
},
|
|
13
13
|
"files": {
|
|
14
|
-
"Injector.exe": "
|
|
15
|
-
"Loader.dll": "
|
|
16
|
-
"McpyMcsAuth.dll": "
|
|
14
|
+
"Injector.exe": "ae038837e14f65131827b8e1a6aeaabc48a29c5513aa4506c8d0c6fd4613728f",
|
|
15
|
+
"Loader.dll": "ce459eab2daa5266302ff0f4449fe6124e4c38f86956ea20cdb1a29a58540432",
|
|
16
|
+
"McpyMcsAuth.dll": "3cb99a76bae9a655b321ef8dc698531dd093dfd7f725021a84d7d905621cbf09",
|
|
17
17
|
"publisher.cer": "e5aa2ac39df40804ed8b08fe8e43c4a2b8923f0d02a360708486b2db5b6303d7"
|
|
18
18
|
}
|
|
19
19
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"background_window_protocol": 1,
|
|
3
3
|
"architecture": "x64",
|
|
4
|
-
"dll_sha256": "
|
|
4
|
+
"dll_sha256": "21bb7012d92f556aa5572eb2b24d15ee9508e592cb0c0841797dbdd1f640b807",
|
|
5
5
|
"source_sha256": "03c1aab9e8d46c162e11f9448903c4907fbe3b87d1e77d8118b72c3e6b250ec5"
|
|
6
6
|
}
|
|
Binary file
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"executable_sha256": "
|
|
2
|
+
"executable_sha256": "e3bc6c8b8c45df6c8e07655dc207921ae6908a4a9d397471d359d1269bf126d4",
|
|
3
3
|
"source_sha256": "64c9db4f31031fc794e4a41a3287a8382c5ac5599244824b6fd7d44971d68f05",
|
|
4
4
|
"sources": {
|
|
5
5
|
"ocr.h": "0b62eed9a41cdeec451283c24b140da4f333a47b59c581e26dd8f0d803e9cfd6",
|
{mcpywrap-0.6.3 → mcpywrap-0.6.4}/desktop/mcpywrap_assets/window_capture/mcpy-window-capture.exe
RENAMED
|
Binary file
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# 依赖的 unbundled 打包标记
|
|
2
|
+
|
|
3
|
+
状态:已实现。默认 `unbundled = false`。日期:2026-10-30。
|
|
4
|
+
|
|
5
|
+
## 契约
|
|
6
|
+
|
|
7
|
+
`unbundled` 是依赖引用上的布尔值。false 表示随 build/package 发布;true 表示 dev/run 照常加载,但 build/package 排除。旧字符串形式的本地依赖、未填标记的 Git 依赖都默认 false。
|
|
8
|
+
|
|
9
|
+
```toml
|
|
10
|
+
[tool.mcpywrap]
|
|
11
|
+
local_dependencies = ["../shared", { path = "../test-helper", unbundled = true }]
|
|
12
|
+
|
|
13
|
+
[[tool.mcpywrap.git_dependencies]]
|
|
14
|
+
name = "test-helper"
|
|
15
|
+
git = "https://example.com/team/test-helper.git"
|
|
16
|
+
rev = "0123456789abcdef0123456789abcdef01234567"
|
|
17
|
+
unbundled = true
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
不引入 main/dev 依赖类别,避免与 dev 命令混淆;也不使用 Java 中通常表示合并依赖的 Shadow/Shade 命名。该标记只控制是否随产物发布,不表示 optional、外部宿主提供、源码替换或独立 Addon 加载。
|
|
21
|
+
|
|
22
|
+
## 入口与反馈
|
|
23
|
+
|
|
24
|
+
- `add --path/--git --unbundled` 设置 true;`--bundled` 设置 false。新依赖省略时默认 false;更新已有依赖省略时保留原值。
|
|
25
|
+
- `dev`、本地 `run`、本地双客户端组和 Windows edit 选择运行图,包含根项目的 unbundled 引用。
|
|
26
|
+
- `build`、`package` 选择发布图,组装前排除 unbundled 引用。package 从源码独立组装。
|
|
27
|
+
- `deps --json` 只读预览运行图;`deps --bundled-only --json` 预览发布图。
|
|
28
|
+
- 默认 sync 准备运行图;`sync --bundled-only` 恢复已锁定的发布图,保留未安装节点的锁记录。
|
|
29
|
+
- 网络连接和远程运行保持原有端侧限制,不因这个标记自动向服务器安装依赖。
|
|
30
|
+
|
|
31
|
+
UI 使用默认不勾选的“不随构建打包(unbundled)”复选框,列表显示是否随构建打包,允许修改已有设置与查看发布引用链。Python 工具包不显示此选项。
|
|
32
|
+
|
|
33
|
+
add JSON 返回 `unbundled`、`previous_unbundled`、`included_in_release`。有效图包含 `purpose`(runtime/release)、`includes_unbundled`、节点 `unbundled`、`via` 和 `excluded`。节点布尔值由当前根项目的有效引用关系决定。
|
|
34
|
+
|
|
35
|
+
## 传递与共享节点
|
|
36
|
+
|
|
37
|
+
只有当前根项目的 unbundled 引用在运行图中启用。进入依赖项目后只跟随普通打包引用,不加载该依赖自己的 unbundled 辅助工具。
|
|
38
|
+
|
|
39
|
+
```text
|
|
40
|
+
P --false--> A --false--> C
|
|
41
|
+
P --true---> B --false--> C
|
|
42
|
+
+--false--> D
|
|
43
|
+
A --true---> A-helper
|
|
44
|
+
B --true---> B-helper
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
运行图为 A、B、C、D;发布图为 A、C。A-helper、B-helper 不自动启用。B 所需的 D 必须加载,“unbundled 不向消费者传递”不能被解释成 B 的正常子依赖也被排除。
|
|
48
|
+
|
|
49
|
+
C 即使经不打包路径可达,也因为存在普通打包路径而进入发布。去重不能掩盖这条路径;预览必须解释它为什么仍会发布。相同源码但安装 target 不同,仍可成为不同安装节点。
|
|
50
|
+
|
|
51
|
+
## 鲁棒性
|
|
52
|
+
|
|
53
|
+
1. **先选择图。** 发布不读取未选中依赖的内容、校验其本地副本或发现其准备入口。未安装的 unbundled 路径和私有副本不阻塞发布;配置语法和锁拓扑仍需校验。
|
|
54
|
+
2. **严格布尔值。** 拒绝 `"true"`、1、空值、错误字段与旧 scope 语法,不把输入错误当作 false。来源类型与打包标记独立;宿主 Python 包不使用此字段。
|
|
55
|
+
3. **统一用途上下文。** 解析结果携带根项目与 runtime/release 用途,构建器拒绝复用错误项目或错误用途的 manager。准备、组装、部署和监控使用同一有效图。
|
|
56
|
+
4. **Git 注册保留语义。** 同步时过滤上游自身 unbundled 引用;源码和安装节点身份不包含根引用上的标记。含新语义的锁用 v3,普通旧项目仍为 v2。
|
|
57
|
+
5. **一份锁,按图恢复。** 运行图与发布图共享锁;部分恢复不删除、伪造或要求安装未选中的 unbundled 节点。build/package/run 不隐式联网、不更新版本。
|
|
58
|
+
6. **防止残留和竞争。** build 完整替换输出,清理 dev 留下的不发布内容;dev 与 build 不能同时写同一目标。watcher 的增量和完整重建都保持运行图。package 独立组装。
|
|
59
|
+
7. **保护正式模块。** unbundled 独占内容不能覆盖随发布的 Python 模块,已有代码 target 冲突规则继续生效;标记不改变现有资源合并和包身份规则。
|
|
60
|
+
8. **限制有副作用的准备。** unbundled 独占依赖暂不支持 consumer_prepare;否则生成到主源码包的文件会绕过图筛选进入发布。未来支持需先提供输出归属、隔离和安全清理。根 hooks 的副作用仍需单独验收。
|
|
61
|
+
9. **固定会话选择。** 热更沿用会话运行图,修改依赖或打包标记仍按生命周期重启。去掉依赖不会清除其写入世界的实体、方块和业务数据。
|
|
62
|
+
10. **检查最终产物。** Python 动态导入无法全部静态验证。正式代码不能依赖被排除的模块,运行组装成功不代表 ZIP 已独立验收。
|
|
@@ -83,3 +83,11 @@ v2 锁使用相同的大小写敏感路径排序;源码由 Git archive 提取
|
|
|
83
83
|
终端只显示同步进度、结果和必要操作;`mcpy sync --json` 返回结构化结果。`--migrate-windows-lock` 和 JSON 中始终为空的 `git_lock_migrations` 仅保留旧脚本兼容。团队各设备应使用包含此修复的版本,并提交 sync 更新后的锁文件。
|
|
84
84
|
|
|
85
85
|
测试入口见[测试说明](../tests/README.md)。
|
|
86
|
+
|
|
87
|
+
## 不随构建打包:unbundled
|
|
88
|
+
|
|
89
|
+
通用 Git Addon/code 支持布尔标记 `unbundled`,默认 false。它属于依赖引用,不参与源码或安装节点身份计算。true 时仅随运行图加载;发布图排除该引用,但仍保留其他普通路径需要的共享节点。
|
|
90
|
+
|
|
91
|
+
含新标记语义的锁使用 v3;旧项目继续使用 v2。默认 sync 恢复完整运行图,部分恢复只安装发布节点并保留其余锁记录;build/package 只校验有效节点。上游项目自身的 unbundled 引用不自动获取。旧 code_libraries 和生成业务入口的框架快捷依赖继续随发布。
|
|
92
|
+
|
|
93
|
+
CLI、配置和预览用法统一见 [Skill 的 unbundled 指引](../skills/mcpywrap/references/project-dependencies.md#不随构建打包unbundled)。
|
|
@@ -39,3 +39,11 @@ shared-addon/
|
|
|
39
39
|
这不代表游戏运行时的资源包优先级。修改依赖声明后重启 `mcpy dev`。
|
|
40
40
|
|
|
41
41
|
遇到结构错误先核对目录和清单;查看参数使用 `mcpy add --help`。
|
|
42
|
+
|
|
43
|
+
## 不随构建打包的运行依赖
|
|
44
|
+
|
|
45
|
+
本地引用可带布尔标记 `unbundled`,默认 false。true 时 dev/run 仍加载,build/package 在组装前排除;普通字符串引用保持旧行为。该依赖正常需要的子依赖随运行加载,上游自身的不打包引用不向消费者传递;被普通发布路径同时引用的共享节点仍随发布。
|
|
46
|
+
|
|
47
|
+
发布不要求被排除的本地路径存在。更改标记后需重启会话;停止 dev 后 build 完整替换输出,package 独立组装。仅通过 unbundled 引用的依赖暂不支持 consumer_prepare,以防生成文件残留到源码包。
|
|
48
|
+
|
|
49
|
+
CLI、配置示例和 JSON 判断方法统一见 [Skill 的 unbundled 指引](../skills/mcpywrap/references/project-dependencies.md#不随构建打包unbundled)。
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# macOS 运行包内置 Tracy 分析器
|
|
2
|
+
|
|
3
|
+
运行包 0.4.7 起包含本目录补丁。网易开发者版 `libminecraftpe.so` 内置 Tracy 客户端,按 `TRACY_MANUAL_LIFETIME` 构建。引擎在首次给线程命名时自行调用 `tracy::StartupProfiler()`,没有配置开关,因此运行包只需要提供正确的宿主接口,不需要也不应主动启动。启动器再调用一次 `___tracy_startup_profiler` 会产生第二个独立实例并占用下一个端口。
|
|
4
|
+
|
|
5
|
+
## 旧运行包的问题
|
|
6
|
+
|
|
7
|
+
Tracy 工作线程在监听前依次调用 `uname`、`gethostname`、`getlogin`、`sysinfo`。旧运行包中:
|
|
8
|
+
|
|
9
|
+
- `uname` 直接透传 Darwin 实现,按 5×256 字节布局写入 Bionic 调用方的 390 字节缓冲,造成栈溢出,工作线程卡死。
|
|
10
|
+
- `getlogin`、`sysinfo` 是 DeveloperCompat 终止桩,调用即以 53 结束进程。
|
|
11
|
+
|
|
12
|
+
结果是 `___tracy_profiler_started` 为 1 但端口从不监听。socket 层本身可用,不需要改动。
|
|
13
|
+
|
|
14
|
+
## 补丁
|
|
15
|
+
|
|
16
|
+
- `libc-shim-host-info.patch`:新增独立的 `src/host_info.cpp`(不与 `common.cpp` 共享 Darwin `sys/param.h` 宏环境)。`uname` 按字段截断转换为 Bionic 6×65 布局;新增 `sysinfo`(Darwin 取自 sysctl、Mach 虚拟内存统计与 libproc,Linux 宿主逐字段复制,其他宿主返回 `ENOSYS`);`getlogin` 使用宿主实现。均经过 errno 转换。
|
|
17
|
+
- `client-tracy.patch`:DeveloperCompat 终止桩改为只填补 libc-shim 缺失的接口,已提供 ABI 转换的实现不再被覆盖;加载游戏库前默认设置 `TRACY_ONLY_LOCALHOST=1`、`TRACY_ONLY_IPV4=1`,已存在的环境变量优先。
|
|
18
|
+
- `manifest-tracy.patch`:`tests/libc_host_info.cpp` 以保护区校验三个接口不越界写入并返回有效值,纳入构建脚本的 CTest。
|
|
19
|
+
- `apply.py`:三份补丁全部预检后才应用,已应用项跳过,失败回滚;不下载、构建或启动游戏。
|
|
20
|
+
|
|
21
|
+
修复按符号进行,不含游戏版本相关的地址或偏移;新 APK 只要通过标准 libc 导入调用这些接口即可直接受益。
|
|
22
|
+
|
|
23
|
+
核对基线:manifest `8b624579618a121c345dd4ff05748d426a0141fa`,client `350eb36f499fbb4bc2bcaf413bd7b2fefa1fb782`,libc-shim `8ca149814eba0c42fa0c1f945b76fb526f6f0694`。可与 [后台窗口补丁](../background_window/README.md) 同时应用,两者不修改相同的位置。
|
|
24
|
+
|
|
25
|
+
## 构建
|
|
26
|
+
|
|
27
|
+
源码准备与 [后台窗口补丁](../background_window/README.md#在-mac-构建测试包) 相同,额外执行:
|
|
28
|
+
|
|
29
|
+
```sh
|
|
30
|
+
python3 native/tracy_profiler/apply.py --manifest /path/to/runtime-source
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
然后用 `tools/build_macos_runtime.py` 构建新的运行包。Xcode SDK 升级后,旧 CMake 构建目录可能仍引用已删除的 SDK 路径,此时使用新的 `--build-dir`。
|
|
34
|
+
|
|
35
|
+
## 连接与安全
|
|
36
|
+
|
|
37
|
+
- 默认监听 `127.0.0.1:8086`;端口被占用时顺延到 8087–8105(例如多个本地实例)。
|
|
38
|
+
- 需要从其他设备连接时,显式以 `TRACY_ONLY_LOCALHOST=0 TRACY_ONLY_IPV4=0` 启动;这会对所有网卡开放分析端口并发送 UDP 发现广播,只在可信网络使用。
|
|
39
|
+
- viewer 版本必须与游戏内置 Tracy 的协议一致,协议随游戏版本变化。`probe.py` 是可选手动工具,列出本机端点及其协议号:
|
|
40
|
+
|
|
41
|
+
```sh
|
|
42
|
+
python3 native/tracy_profiler/probe.py
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
开发者包 3.9.100.297020 内置 Tracy 0.11.1,协议 69。
|
|
46
|
+
|
|
47
|
+
## Mac 验收
|
|
48
|
+
|
|
49
|
+
1. 用新运行包创建独立实例,确认引擎日志中没有 `Unimplemented Android interface`。
|
|
50
|
+
2. `lsof -nP -a -p <pid> -iTCP -sTCP:LISTEN` 只出现 `127.0.0.1:8086`(单实例)。
|
|
51
|
+
3. `probe.py` 返回 `status=welcome` 及协议号;用对应版本的 Tracy viewer 连接 `127.0.0.1` 并看到帧与区段数据。
|
|
52
|
+
4. 以 `TRACY_ONLY_LOCALHOST=0` 启动时监听地址变为通配地址,未设置时不会出现。
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"""Apply the Tracy host-interface patches to an initialized runtime source tree."""
|
|
2
|
+
import argparse
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
import subprocess
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def apply(manifest):
|
|
8
|
+
root = Path(manifest).resolve(strict=True)
|
|
9
|
+
patches = Path(__file__).resolve().parent
|
|
10
|
+
targets = [(root/'libc-shim', patches/'libc-shim-host-info.patch'),
|
|
11
|
+
(root/'mcpelauncher-client', patches/'client-tracy.patch'),
|
|
12
|
+
(root, patches/'manifest-tracy.patch')]
|
|
13
|
+
pending = []
|
|
14
|
+
for repo, patch in targets:
|
|
15
|
+
if not (repo/'.git').exists():
|
|
16
|
+
raise RuntimeError('Initialize the Git checkout/submodule first: ' + str(repo))
|
|
17
|
+
command = ['git', '-C', str(repo), 'apply']
|
|
18
|
+
# 已应用的补丁跳过;其余全部预检通过后才写入
|
|
19
|
+
if subprocess.run(command + ['--reverse', '--check', str(patch)], capture_output=True).returncode == 0:
|
|
20
|
+
continue
|
|
21
|
+
result = subprocess.run(command + ['--check', str(patch)], capture_output=True, text=True)
|
|
22
|
+
if result.returncode:
|
|
23
|
+
raise RuntimeError('Patch preflight failed: ' + str(patch) + '\n' + result.stderr)
|
|
24
|
+
pending.append((command, patch))
|
|
25
|
+
applied = []
|
|
26
|
+
try:
|
|
27
|
+
for command, patch in pending:
|
|
28
|
+
subprocess.run(command + [str(patch)], check=True)
|
|
29
|
+
applied.append((command, patch))
|
|
30
|
+
except BaseException:
|
|
31
|
+
for command, patch in reversed(applied):
|
|
32
|
+
subprocess.run(command + ['--reverse', str(patch)], check=True)
|
|
33
|
+
raise
|
|
34
|
+
return len(applied)
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
if __name__ == '__main__':
|
|
38
|
+
parser = argparse.ArgumentParser(description=__doc__)
|
|
39
|
+
parser.add_argument('--manifest', required=True, type=Path)
|
|
40
|
+
args = parser.parse_args()
|
|
41
|
+
print('Applied', apply(args.manifest), 'patches; build a new runtime before testing.')
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
diff --git a/src/developer_compat.h b/src/developer_compat.h
|
|
2
|
+
index aa4b983..d4a7c2d 100644
|
|
3
|
+
--- a/src/developer_compat.h
|
|
4
|
+
+++ b/src/developer_compat.h
|
|
5
|
+
@@ -57,9 +57,10 @@ inline void addLibCBindings(std::unordered_map<std::string, void*>& libC) {
|
|
6
|
+
// Deliberately terminating diagnostic bindings, not API emulation.
|
|
7
|
+
// These allow relocation to proceed without silently accepting calls
|
|
8
|
+
// for which Bionic/Darwin structures or semantics differ.
|
|
9
|
+
-#define UNIMPLEMENTED_ANDROID(name) libC[#name] = (void*)+[]() { \
|
|
10
|
+
+ // libc-shim 已提供 ABI 转换的接口优先,终止桩只填补缺口。
|
|
11
|
+
+#define UNIMPLEMENTED_ANDROID(name) libC.emplace(#name, (void*)+[]() { \
|
|
12
|
+
Log::error("DeveloperCompat", "Unimplemented Android interface: " #name); \
|
|
13
|
+
- std::fflush(nullptr); _Exit(53); };
|
|
14
|
+
+ std::fflush(nullptr); _Exit(53); });
|
|
15
|
+
UNIMPLEMENTED_ANDROID(__libc_current_sigrtmin)
|
|
16
|
+
UNIMPLEMENTED_ANDROID(__libc_current_sigrtmax)
|
|
17
|
+
UNIMPLEMENTED_ANDROID(ttyname)
|
|
18
|
+
@@ -68,8 +69,6 @@ inline void addLibCBindings(std::unordered_map<std::string, void*>& libC) {
|
|
19
|
+
UNIMPLEMENTED_ANDROID(getservbyport)
|
|
20
|
+
UNIMPLEMENTED_ANDROID(getprotobyname)
|
|
21
|
+
UNIMPLEMENTED_ANDROID(__get_h_errno)
|
|
22
|
+
- UNIMPLEMENTED_ANDROID(getlogin)
|
|
23
|
+
- UNIMPLEMENTED_ANDROID(sysinfo)
|
|
24
|
+
#undef UNIMPLEMENTED_ANDROID
|
|
25
|
+
libC["pthread_sigmask"] = (void*)+[](int, const void*, void*) -> int {
|
|
26
|
+
Log::error("DeveloperCompat", "Unimplemented Android interface: pthread_sigmask");
|
|
27
|
+
diff --git a/src/main.cpp b/src/main.cpp
|
|
28
|
+
index 525cf9d..130cea8 100644
|
|
29
|
+
--- a/src/main.cpp
|
|
30
|
+
+++ b/src/main.cpp
|
|
31
|
+
@@ -438,6 +438,10 @@ Hardware : Qualcomm Technologies, Inc MSM8998
|
|
32
|
+
for(auto&& redir : shim::rewrite_filesystem_access) {
|
|
33
|
+
Log::trace("REDIRECT", "%s to %s", redir.first.data(), redir.second.data());
|
|
34
|
+
}
|
|
35
|
+
+ // 游戏内置的 Tracy 会在首次线程命名时自行启动;默认只监听本机 IPv4,
|
|
36
|
+
+ // 避免对局域网开放分析端口。显式设置的环境变量优先。
|
|
37
|
+
+ setenv("TRACY_ONLY_LOCALHOST", "1", 0);
|
|
38
|
+
+ setenv("TRACY_ONLY_IPV4", "1", 0);
|
|
39
|
+
auto libC = MinecraftUtils::getLibCSymbols();
|
|
40
|
+
ThreadMover::hookLibC(libC);
|
|
41
|
+
if(extendedBindings)
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
diff --git a/CMakeLists.txt b/CMakeLists.txt
|
|
2
|
+
index 44c6d1c..5f4dac0 100644
|
|
3
|
+
--- a/CMakeLists.txt
|
|
4
|
+
+++ b/CMakeLists.txt
|
|
5
|
+
@@ -2,7 +2,7 @@ cmake_minimum_required (VERSION 2.6...4.0.0)
|
|
6
|
+
|
|
7
|
+
project(libc-shim LANGUAGES C CXX)
|
|
8
|
+
|
|
9
|
+
-add_library(libc-shim src/common.cpp src/pthreads.cpp src/pthreads.h src/meta.h src/common.h src/semaphore.cpp src/semaphore.h src/network.cpp src/network.h src/dirent.cpp src/dirent.h src/cstdio.cpp src/cstdio.h src/errno.cpp src/errno.h src/ctype_data.h src/ctype_data.cpp src/bionic/strlcpy.cpp src/stat.cpp src/stat.h src/file_misc.cpp src/file_misc.h src/sysconf.cpp src/sysconf.h src/system_properties.cpp src/system_properties.h src/iorewrite.cpp src/iorewrite.h src/statvfs.h src/statvfs.cpp src/sched.h src/sched.cpp)
|
|
10
|
+
+add_library(libc-shim src/common.cpp src/pthreads.cpp src/pthreads.h src/meta.h src/common.h src/semaphore.cpp src/semaphore.h src/network.cpp src/network.h src/dirent.cpp src/dirent.h src/cstdio.cpp src/cstdio.h src/errno.cpp src/errno.h src/ctype_data.h src/ctype_data.cpp src/bionic/strlcpy.cpp src/stat.cpp src/stat.h src/file_misc.cpp src/file_misc.h src/sysconf.cpp src/sysconf.h src/host_info.cpp src/host_info.h src/system_properties.cpp src/system_properties.h src/iorewrite.cpp src/iorewrite.h src/statvfs.h src/statvfs.cpp src/sched.h src/sched.cpp)
|
|
11
|
+
target_include_directories(libc-shim PUBLIC include/)
|
|
12
|
+
target_link_libraries(libc-shim PRIVATE logger)
|
|
13
|
+
|
|
14
|
+
diff --git a/src/common.cpp b/src/common.cpp
|
|
15
|
+
index 7b631da..ebd80a1 100644
|
|
16
|
+
--- a/src/common.cpp
|
|
17
|
+
+++ b/src/common.cpp
|
|
18
|
+
@@ -14,6 +14,7 @@
|
|
19
|
+
#include "stat.h"
|
|
20
|
+
#include "file_misc.h"
|
|
21
|
+
#include "sysconf.h"
|
|
22
|
+
+#include "host_info.h"
|
|
23
|
+
#include "system_properties.h"
|
|
24
|
+
#include "sched.h"
|
|
25
|
+
#include <cmath>
|
|
26
|
+
@@ -1083,8 +1084,6 @@ void shim::add_setjmp_shimmed_symbols(std::vector<shim::shimmed_symbol> &list) {
|
|
27
|
+
|
|
28
|
+
void shim::add_misc_shimmed_symbols(std::vector<shim::shimmed_symbol> &list) {
|
|
29
|
+
list.insert(list.end(), {
|
|
30
|
+
- {"uname", uname}, // TODO: This may be wrong?
|
|
31
|
+
-
|
|
32
|
+
{"utime", utime},
|
|
33
|
+
|
|
34
|
+
{"writev", writev},
|
|
35
|
+
@@ -1131,6 +1130,7 @@ std::vector<shimmed_symbol> shim::get_shimmed_symbols() {
|
|
36
|
+
add_epoll_shimmed_symbols(ret);
|
|
37
|
+
add_misc_shimmed_symbols(ret);
|
|
38
|
+
add_sysconf_shimmed_symbols(ret);
|
|
39
|
+
+ add_host_info_shimmed_symbols(ret);
|
|
40
|
+
add_system_properties_shimmed_symbols(ret);
|
|
41
|
+
add_eventfd_shimmed_symbols(ret);
|
|
42
|
+
add_fnmatch_shimmed_symbols(ret);
|
|
43
|
+
diff --git a/src/host_info.h b/src/host_info.h
|
|
44
|
+
new file mode 100644
|
|
45
|
+
index 0000000..333260a
|
|
46
|
+
--- /dev/null
|
|
47
|
+
+++ b/src/host_info.h
|
|
48
|
+
@@ -0,0 +1,49 @@
|
|
49
|
+
+#pragma once
|
|
50
|
+
+
|
|
51
|
+
+#include <libc_shim.h>
|
|
52
|
+
+
|
|
53
|
+
+namespace shim {
|
|
54
|
+
+
|
|
55
|
+
+ namespace bionic {
|
|
56
|
+
+
|
|
57
|
+
+ // Bionic/Linux 内核布局:6 个 65 字节字段。Darwin 为 5 个 256 字节字段,不能直接透传。
|
|
58
|
+
+ struct utsname {
|
|
59
|
+
+ char sysname[65];
|
|
60
|
+
+ char nodename[65];
|
|
61
|
+
+ char release[65];
|
|
62
|
+
+ char version[65];
|
|
63
|
+
+ char machine[65];
|
|
64
|
+
+ char domainname[65];
|
|
65
|
+
+ };
|
|
66
|
+
+ static_assert(sizeof(utsname) == 390, "bionic utsname layout");
|
|
67
|
+
+
|
|
68
|
+
+ // Bionic/Linux 内核 struct sysinfo;内存字段以 mem_unit 为单位。
|
|
69
|
+
+ struct sysinfo {
|
|
70
|
+
+ long uptime;
|
|
71
|
+
+ unsigned long loads[3];
|
|
72
|
+
+ unsigned long totalram;
|
|
73
|
+
+ unsigned long freeram;
|
|
74
|
+
+ unsigned long sharedram;
|
|
75
|
+
+ unsigned long bufferram;
|
|
76
|
+
+ unsigned long totalswap;
|
|
77
|
+
+ unsigned long freeswap;
|
|
78
|
+
+ unsigned short procs;
|
|
79
|
+
+ unsigned short pad;
|
|
80
|
+
+ unsigned long totalhigh;
|
|
81
|
+
+ unsigned long freehigh;
|
|
82
|
+
+ unsigned int mem_unit;
|
|
83
|
+
+#if !defined(__LP64__)
|
|
84
|
+
+ char _f[20 - 2 * sizeof(long) - sizeof(int)];
|
|
85
|
+
+#endif
|
|
86
|
+
+ };
|
|
87
|
+
+ static_assert(sizeof(sysinfo) == (sizeof(long) == 8 ? 112 : 64), "bionic sysinfo layout");
|
|
88
|
+
+
|
|
89
|
+
+ }
|
|
90
|
+
+
|
|
91
|
+
+ int uname(bionic::utsname *buf);
|
|
92
|
+
+
|
|
93
|
+
+ int sysinfo(bionic::sysinfo *info);
|
|
94
|
+
+
|
|
95
|
+
+ void add_host_info_shimmed_symbols(std::vector<shimmed_symbol> &list);
|
|
96
|
+
+
|
|
97
|
+
+}
|
|
98
|
+
diff --git a/src/host_info.cpp b/src/host_info.cpp
|
|
99
|
+
new file mode 100644
|
|
100
|
+
index 0000000..4dbff5e
|
|
101
|
+
--- /dev/null
|
|
102
|
+
+++ b/src/host_info.cpp
|
|
103
|
+
@@ -0,0 +1,110 @@
|
|
104
|
+
+#include "no-fortify.h"
|
|
105
|
+
+#include "host_info.h"
|
|
106
|
+
+#include "common.h"
|
|
107
|
+
+#include "errno.h"
|
|
108
|
+
+
|
|
109
|
+
+#include <cerrno>
|
|
110
|
+
+#include <cstring>
|
|
111
|
+
+#include <ctime>
|
|
112
|
+
+#include <cstdlib>
|
|
113
|
+
+#include <unistd.h>
|
|
114
|
+
+#include <sys/utsname.h>
|
|
115
|
+
+#ifdef __linux__
|
|
116
|
+
+#include <sys/sysinfo.h>
|
|
117
|
+
+#endif
|
|
118
|
+
+#ifdef __APPLE__
|
|
119
|
+
+#include <libproc.h>
|
|
120
|
+
+#include <mach/mach.h>
|
|
121
|
+
+#include <sys/sysctl.h>
|
|
122
|
+
+#include <sys/time.h>
|
|
123
|
+
+#endif
|
|
124
|
+
+
|
|
125
|
+
+int shim::uname(bionic::utsname *buf) {
|
|
126
|
+
+ ::utsname host {};
|
|
127
|
+
+ if(::uname(&host) != 0)
|
|
128
|
+
+ return -1;
|
|
129
|
+
+ // 按字段截断复制,保证只写入调用方的 390 字节。
|
|
130
|
+
+ std::memset(buf, 0, sizeof(*buf));
|
|
131
|
+
+ bionic::strlcpy(buf->sysname, host.sysname, sizeof(buf->sysname));
|
|
132
|
+
+ bionic::strlcpy(buf->nodename, host.nodename, sizeof(buf->nodename));
|
|
133
|
+
+ bionic::strlcpy(buf->release, host.release, sizeof(buf->release));
|
|
134
|
+
+ bionic::strlcpy(buf->version, host.version, sizeof(buf->version));
|
|
135
|
+
+ bionic::strlcpy(buf->machine, host.machine, sizeof(buf->machine));
|
|
136
|
+
+#if defined(__linux__) && defined(_GNU_SOURCE)
|
|
137
|
+
+ bionic::strlcpy(buf->domainname, host.domainname, sizeof(buf->domainname));
|
|
138
|
+
+#endif
|
|
139
|
+
+ return 0;
|
|
140
|
+
+}
|
|
141
|
+
+
|
|
142
|
+
+int shim::sysinfo(bionic::sysinfo *info) {
|
|
143
|
+
+ if(!info) {
|
|
144
|
+
+ errno = EFAULT;
|
|
145
|
+
+ return -1;
|
|
146
|
+
+ }
|
|
147
|
+
+ std::memset(info, 0, sizeof(*info));
|
|
148
|
+
+#ifdef __linux__
|
|
149
|
+
+ struct ::sysinfo host {};
|
|
150
|
+
+ if(::sysinfo(&host) != 0)
|
|
151
|
+
+ return -1;
|
|
152
|
+
+ info->uptime = host.uptime;
|
|
153
|
+
+ for(int i = 0; i < 3; ++i)
|
|
154
|
+
+ info->loads[i] = host.loads[i];
|
|
155
|
+
+ info->totalram = host.totalram;
|
|
156
|
+
+ info->freeram = host.freeram;
|
|
157
|
+
+ info->sharedram = host.sharedram;
|
|
158
|
+
+ info->bufferram = host.bufferram;
|
|
159
|
+
+ info->totalswap = host.totalswap;
|
|
160
|
+
+ info->freeswap = host.freeswap;
|
|
161
|
+
+ info->procs = host.procs;
|
|
162
|
+
+ info->totalhigh = host.totalhigh;
|
|
163
|
+
+ info->freehigh = host.freehigh;
|
|
164
|
+
+ info->mem_unit = host.mem_unit;
|
|
165
|
+
+ return 0;
|
|
166
|
+
+#elif defined(__APPLE__)
|
|
167
|
+
+ // 字段取自宿主内核;无法获得的值保持 0,mem_unit 固定为 1 字节。
|
|
168
|
+
+ uint64_t memory = 0;
|
|
169
|
+
+ size_t size = sizeof(memory);
|
|
170
|
+
+ if(::sysctlbyname("hw.memsize", &memory, &size, nullptr, 0) != 0)
|
|
171
|
+
+ return -1;
|
|
172
|
+
+ info->totalram = (unsigned long)memory;
|
|
173
|
+
+ info->mem_unit = 1;
|
|
174
|
+
+ ::timeval boot {};
|
|
175
|
+
+ size = sizeof(boot);
|
|
176
|
+
+ int bootMib[2] = {CTL_KERN, KERN_BOOTTIME};
|
|
177
|
+
+ if(::sysctl(bootMib, 2, &boot, &size, nullptr, 0) == 0 && boot.tv_sec > 0)
|
|
178
|
+
+ info->uptime = (long)(::time(nullptr) - boot.tv_sec);
|
|
179
|
+
+ double loads[3];
|
|
180
|
+
+ if(::getloadavg(loads, 3) == 3) {
|
|
181
|
+
+ for(int i = 0; i < 3; ++i)
|
|
182
|
+
+ info->loads[i] = (unsigned long)(loads[i] * 65536.0); // SI_LOAD_SHIFT
|
|
183
|
+
+ }
|
|
184
|
+
+ mach_port_t host = mach_host_self();
|
|
185
|
+
+ vm_statistics64_data_t vm {};
|
|
186
|
+
+ mach_msg_type_number_t count = HOST_VM_INFO64_COUNT;
|
|
187
|
+
+ if(host_statistics64(host, HOST_VM_INFO64, (host_info64_t)&vm, &count) == KERN_SUCCESS)
|
|
188
|
+
+ info->freeram = (unsigned long)((uint64_t)vm.free_count * vm_kernel_page_size);
|
|
189
|
+
+ mach_port_deallocate(mach_task_self(), host);
|
|
190
|
+
+ xsw_usage swap {};
|
|
191
|
+
+ size = sizeof(swap);
|
|
192
|
+
+ if(::sysctlbyname("vm.swapusage", &swap, &size, nullptr, 0) == 0) {
|
|
193
|
+
+ info->totalswap = (unsigned long)swap.xsu_total;
|
|
194
|
+
+ info->freeswap = (unsigned long)swap.xsu_avail;
|
|
195
|
+
+ }
|
|
196
|
+
+ int processes = ::proc_listallpids(nullptr, 0);
|
|
197
|
+
+ if(processes > 0)
|
|
198
|
+
+ info->procs = (unsigned short)(processes > 0xffff ? 0xffff : processes);
|
|
199
|
+
+ return 0;
|
|
200
|
+
+#else
|
|
201
|
+
+ errno = ENOSYS;
|
|
202
|
+
+ return -1;
|
|
203
|
+
+#endif
|
|
204
|
+
+}
|
|
205
|
+
+
|
|
206
|
+
+void shim::add_host_info_shimmed_symbols(std::vector<shim::shimmed_symbol> &list) {
|
|
207
|
+
+ list.insert(list.end(), {
|
|
208
|
+
+ {"uname", WithErrnoUpdate(shim::uname)},
|
|
209
|
+
+ {"sysinfo", WithErrnoUpdate(shim::sysinfo)},
|
|
210
|
+
+ // char* 返回值与 Bionic ABI 一致,可直接使用宿主实现。
|
|
211
|
+
+ {"getlogin", WithErrnoUpdate(::getlogin)},
|
|
212
|
+
+ });
|
|
213
|
+
+}
|