mcpywrap 0.6.4__tar.gz → 0.7.0__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.4 → mcpywrap-0.7.0}/CHANGELOG.md +14 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/PKG-INFO +6 -2
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/README.md +4 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/RELEASING.md +4 -0
- mcpywrap-0.7.0/core/mcpywrap_core/_version.py +1 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/desktop/mcpywrap.egg-info/PKG-INFO +6 -2
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/desktop/mcpywrap.egg-info/SOURCES.txt +5 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/desktop/mcpywrap.egg-info/requires.txt +1 -1
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/desktop/mcpywrap_assets/bridge_payload/Injector.exe +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/desktop/mcpywrap_assets/bridge_payload/Loader.dll +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/desktop/mcpywrap_assets/bridge_payload/McpyMcsAuth.dll +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/desktop/mcpywrap_assets/bridge_payload/manifest.json +3 -3
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/desktop/mcpywrap_assets/window_activation/manifest.json +1 -1
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/desktop/mcpywrap_assets/window_activation/mcpy-window-activation.dll +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/desktop/mcpywrap_assets/window_capture/manifest.json +1 -1
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/desktop/mcpywrap_assets/window_capture/mcpy-window-capture.exe +0 -0
- mcpywrap-0.7.0/native/tracy_tools/README.md +31 -0
- mcpywrap-0.7.0/native/tracy_tools/build.py +164 -0
- mcpywrap-0.7.0/native/tracy_tools/report/src/report.cpp +414 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/skills/mcpywrap/SKILL.md +2 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/skills/mcpywrap/references/macos-local.md +4 -3
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/skills/mcpywrap/references/network-sessions.md +6 -0
- mcpywrap-0.7.0/skills/mcpywrap/references/profiling.md +70 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/test_macos_network.py +8 -0
- mcpywrap-0.7.0/tests/test_profiling.py +400 -0
- mcpywrap-0.6.4/core/mcpywrap_core/_version.py +0 -1
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/CONTRIBUTING.md +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/LICENSE +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/MANIFEST.in +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/THIRD_PARTY_NOTICES.md +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/desktop/mcpywrap.egg-info/dependency_links.txt +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/desktop/mcpywrap.egg-info/entry_points.txt +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/desktop/mcpywrap.egg-info/top_level.txt +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/desktop/mcpywrap_assets/__init__.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/desktop/mcpywrap_assets/bridge_payload/publisher.cer +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/docs/code-libraries.md +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/docs/dependency-packaging-design.md +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/docs/deployment-recovery.md +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/docs/engine-discovery.md +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/docs/game-backends.md +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/docs/git-dependencies.md +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/docs/input-sequence.md +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/docs/instance-world-settings.md +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/docs/launcher-client-python.md +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/docs/local-dependencies.md +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/docs/macos-resource-reload.md +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/docs/mcs-auth.md +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/docs/project-scripts.md +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/docs/qt6-development.md +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/docs/qumod.md +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/docs/runtime-debug.md +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/docs/runtime-input.md +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/docs/runtime-player.md +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/docs/runtime-ui.md +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/docs/shared-core.md +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/docs/shared-log-ui.md +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/docs/windows-local-multiplayer.md +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/examples/consumer_prepare/README.md +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/native/background_window/README.md +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/native/background_window/apply.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/native/background_window/client-background.patch +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/native/background_window/game-window-background.patch +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/native/background_window/libc-shim-background.patch +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/native/background_window/manifest-background.patch +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/native/background_window/test_window.cpp +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/native/mcs_auth/Bridge.cs +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/native/mcs_auth/Injector.cs +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/native/mcs_auth/Loader.c +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/native/mcs_auth/publisher.cer +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/native/mcs_auth/publisher.json +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/native/runtime_input/README.md +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/native/runtime_input/launcher-monotonic.patch +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/native/runtime_input/manifest-monotonic.patch +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/native/runtime_input/steady_clock.h +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/native/tracy_profiler/README.md +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/native/tracy_profiler/apply.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/native/tracy_profiler/client-tracy.patch +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/native/tracy_profiler/libc-shim-host-info.patch +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/native/tracy_profiler/manifest-tracy.patch +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/native/tracy_profiler/probe.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/native/window_activation/README.md +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/native/window_activation/window_activation.cpp +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/native/window_capture/ocr.h +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/native/window_capture/video_capture.h +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/native/window_capture/window_capture.cpp +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/pyproject.toml +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/scripts/build_all_native.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/scripts/build_app_icon.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/scripts/build_distributions.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/scripts/build_mcs_auth_bridge.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/scripts/build_window_activation.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/scripts/build_window_capture.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/scripts/check_mcs_auth_bridge.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/scripts/check_release.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/scripts/check_window_activation.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/scripts/check_window_capture.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/scripts/pypi_release.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/scripts/sign_mcs_auth_ci.ps1 +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/scripts/verify_core_release.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/scripts/verify_distributions.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/scripts/version.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/setup.cfg +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/setup.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/skills/mcpywrap/agents/openai.yaml +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/skills/mcpywrap/assets/consumer-prepare/framework/behavior_pack/CatalogRuntime/__init__.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/skills/mcpywrap/assets/consumer-prepare/framework/behavior_pack/manifest.json +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/skills/mcpywrap/assets/consumer-prepare/framework/build_tools/example.toml +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/skills/mcpywrap/assets/consumer-prepare/framework/build_tools/prepare.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/skills/mcpywrap/assets/consumer-prepare/framework/build_tools/schema.json +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/skills/mcpywrap/assets/consumer-prepare/framework/pyproject.toml +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/skills/mcpywrap/assets/consumer-prepare/game/.gitignore +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/skills/mcpywrap/assets/consumer-prepare/game/behavior_pack/manifest.json +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/skills/mcpywrap/assets/consumer-prepare/game/data/items.json +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/skills/mcpywrap/assets/consumer-prepare/game/pyproject.toml +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/skills/mcpywrap/assets/consumer-prepare/game/resource_pack/manifest.json +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/skills/mcpywrap/references/application-host.md +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/skills/mcpywrap/references/capture.md +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/skills/mcpywrap/references/consumer-prepare-author.md +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/skills/mcpywrap/references/consumer-prepare.md +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/skills/mcpywrap/references/dual-clients.md +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/skills/mcpywrap/references/input-sequence.md +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/skills/mcpywrap/references/input-writing.md +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/skills/mcpywrap/references/instance-world-settings.md +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/skills/mcpywrap/references/local-development.md +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/skills/mcpywrap/references/project-dependencies.md +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/skills/mcpywrap/references/project-scripts.md +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/skills/mcpywrap/references/project-workflow.md +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/skills/mcpywrap/references/remote-testing.md +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/skills/mcpywrap/references/runtime-debug.md +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/skills/mcpywrap/references/runtime-input.md +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/skills/mcpywrap/references/runtime-key-timeline.md +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/skills/mcpywrap/references/runtime-player.md +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/skills/mcpywrap/references/runtime-ui.md +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/skills/mcpywrap/references/script-example.md +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/skills/mcpywrap/references/setup.md +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/skills/mcpywrap/references/troubleshooting.md +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/skills/mcpywrap/scripts/bootstrap.ps1 +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/skills/mcpywrap/scripts/bootstrap.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/skills/mcpywrap/scripts/game_window.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/skills/mcpywrap/scripts/smoke.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/README.md +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/core_fixture.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/embedded_upgrade_probe.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/manual/consumer_prepare_acceptance.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/manual/lifecycle_dependency_audit.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/manual/runtime_controls/README.md +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/manual/runtime_controls/client_probe.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/manual/runtime_controls/input_probe.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/manual/runtime_controls/key_timeline_probe.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/manual/runtime_controls/movement.json +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/manual/runtime_controls/run.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/manual/runtime_controls/server_fixture.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/manual/runtime_controls/support.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/manual_background_launch.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/manual_dependency_boundaries.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/manual_input_window.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/manual_integration.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/manual_native_recording.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/manual_remote_recording.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/manual_runtime_input.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/manual_runtime_input_unified.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/manual_runtime_key_timeline.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/manual_runtime_player.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/manual_runtime_ui.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/manual_windows_local_groups.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/runtime_support.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/test_application_icons.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/test_auth_interaction.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/test_automation.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/test_build_replace_retry.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/test_builder_import_boundary.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/test_code_libraries.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/test_consumer_prepare.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/test_core_api.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/test_core_updates.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/test_dependency_boundaries.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/test_deployment_cli.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/test_deployment_encoding.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/test_deployment_recovery.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/test_distribution_layout.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/test_engine_backends.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/test_engine_compatibility.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/test_engine_discovery.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/test_engine_install.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/test_execution_boundaries.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/test_game_window_skill.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/test_git_projects.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/test_host_input.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/test_host_services.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/test_input_sequence.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/test_instance_cppconfig.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/test_launch_encoding.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/test_launcher_python.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/test_lifecycle_audit.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/test_lifecycle_races.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/test_local_auth_session.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/test_local_dependencies.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/test_lock_storage.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/test_log_query.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/test_log_stream.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/test_manual_runtime_controls.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/test_mcs_auth.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/test_mobile_diagnostics.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/test_mobile_host.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/test_mobile_pairing.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/test_modsdk_environment.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/test_mouse.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/test_native_input_sequence.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/test_native_preferences.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/test_native_recording.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/test_network.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/test_network_sessions.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/test_pack_uuid_conflicts.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/test_package.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/test_project_scripts.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/test_qt_sessions.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/test_qumod_workflow.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/test_recordings.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/test_remote.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/test_remote_scripts.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/test_resource_reload.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/test_restricted_process_identity.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/test_runtime_debug.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/test_runtime_deployment.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/test_runtime_groups.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/test_runtime_input.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/test_runtime_key_timeline.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/test_runtime_player.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/test_runtime_profiles.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/test_runtime_ui.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/test_runtime_ui_outline.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/test_screenshot.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/test_session_capabilities.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/test_shared_logs.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/test_skill_workflows.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/test_unbundled_dependencies.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/test_unified_skill_contract.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/test_window_activation.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/test_window_focus.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/test_window_policy.py +0 -0
- {mcpywrap-0.6.4 → mcpywrap-0.7.0}/tests/test_windows_lan.py +0 -0
|
@@ -1,5 +1,19 @@
|
|
|
1
1
|
# 更新记录
|
|
2
2
|
|
|
3
|
+
## 0.7.0
|
|
4
|
+
|
|
5
|
+
性能分析标准化:用游戏内置的 Tracy 定位到具体函数,取代在 Mod 代码中加时间戳打点。
|
|
6
|
+
|
|
7
|
+
- 新增 `mcpy profile`,基于 Windows MC Studio 引擎与 macOS 运行包(0.4.7+)内置的 Tracy 0.11.1(协议 69)。引擎为每个 Mod Python 函数记录区段(函数名、源文件、def 行号),无需修改代码。
|
|
8
|
+
- `profile install` 从固定发布地址下载同版本工具(分析器、采集、CSV 导出与 JSON 报告),按清单校验 SHA-256;支持多镜像、断点续传与退避重试,可用 `MCPY_TRACY_MIRROR` 指定镜像或 `--from` 导入已下载的工具包。Windows 工具静态链接运行库,只依赖系统 DLL。
|
|
9
|
+
- `profile open` 打开实时分析器连接游戏,或离线查看 `.tracy` 文件;`profile status` 列出工具状态与本机正在监听的游戏。
|
|
10
|
+
- `profile capture` 按会话定位端口、核对协议并检测已有分析器连接,无界面采集后生成报告:主循环与服务端 tick 分位数、脚本函数热点与尖峰(映射回项目源码与行号、调用者、线程)、引擎区段及最慢帧按线程归因。`profile report` 重新汇总已有文件,`profile diff` 按每秒耗时对比优化前后。
|
|
11
|
+
- 内置 Skill 新增性能分析参考,说明 Agent 的采集、解读与验证流程。
|
|
12
|
+
|
|
13
|
+
## 0.6.5
|
|
14
|
+
|
|
15
|
+
- macOS 默认运行包升级到 0.4.8:网络会话自动加载开发服下发的纯明文源码行为包,修复开发 APK 只认 `.mcs` 导致的 ImportError;审核后的 `.mcp` 包与混合包仍由游戏原流程加载。connect 结果新增 `plain_source_packs` 能力报告,游戏日志 `[PlainSourcePack]` 标明实际按明文加载的包。旧实例保留原运行包绑定。
|
|
16
|
+
|
|
3
17
|
## 0.6.4
|
|
4
18
|
|
|
5
19
|
- 游戏依赖新增 `unbundled` 布尔标记,默认 false;设为 true 时 dev/run 照常加载,build/package 排除,支持本地 Addon 与通用 Git Addon/code。
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mcpywrap
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.7.0
|
|
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.
|
|
13
|
+
Requires-Dist: mcpywrap-core==0.7.0
|
|
14
14
|
Requires-Dist: pip>=23
|
|
15
15
|
Requires-Dist: build>=1.0
|
|
16
16
|
Requires-Dist: watchdog>=2.0.0
|
|
@@ -132,6 +132,10 @@ Git 项目使用 `[[tool.mcpywrap.git_dependencies]]` 声明,支持 Addon 与
|
|
|
132
132
|
- 两名玩家、成员选择、组更新与重试:[双客户端联调](skills/mcpywrap/references/dual-clients.md)。
|
|
133
133
|
- 资源发现与平台差异:[安装与路由](skills/mcpywrap/references/setup.md)、[macOS 平台](skills/mcpywrap/references/macos-local.md)。
|
|
134
134
|
|
|
135
|
+
### 性能分析
|
|
136
|
+
|
|
137
|
+
开发版游戏自带 Tracy 0.11.1,会记录每个 Mod Python 函数的耗时。`mcpy profile install` 准备固定版本的工具,`mcpy profile open` 打开实时分析器或离线查看 `.tracy` 文件,`mcpy profile capture`、`report`、`diff` 采集并对比优化前后。用法与解读见 [性能分析](skills/mcpywrap/references/profiling.md)。
|
|
138
|
+
|
|
135
139
|
### 网络连接与登录身份
|
|
136
140
|
|
|
137
141
|
外部服务器连接、可选 MCS 身份与进服判断见 [网络会话](skills/mcpywrap/references/network-sessions.md)。需要另一台 Windows 执行游戏时,再按 [远程执行端](skills/mcpywrap/references/remote-testing.md) 配置服务。远程连接不部署本地 Mod,也不提供世界实例管理。
|
|
@@ -105,6 +105,10 @@ Git 项目使用 `[[tool.mcpywrap.git_dependencies]]` 声明,支持 Addon 与
|
|
|
105
105
|
- 两名玩家、成员选择、组更新与重试:[双客户端联调](skills/mcpywrap/references/dual-clients.md)。
|
|
106
106
|
- 资源发现与平台差异:[安装与路由](skills/mcpywrap/references/setup.md)、[macOS 平台](skills/mcpywrap/references/macos-local.md)。
|
|
107
107
|
|
|
108
|
+
### 性能分析
|
|
109
|
+
|
|
110
|
+
开发版游戏自带 Tracy 0.11.1,会记录每个 Mod Python 函数的耗时。`mcpy profile install` 准备固定版本的工具,`mcpy profile open` 打开实时分析器或离线查看 `.tracy` 文件,`mcpy profile capture`、`report`、`diff` 采集并对比优化前后。用法与解读见 [性能分析](skills/mcpywrap/references/profiling.md)。
|
|
111
|
+
|
|
108
112
|
### 网络连接与登录身份
|
|
109
113
|
|
|
110
114
|
外部服务器连接、可选 MCS 身份与进服判断见 [网络会话](skills/mcpywrap/references/network-sessions.md)。需要另一台 Windows 执行游戏时,再按 [远程执行端](skills/mcpywrap/references/remote-testing.md) 配置服务。远程连接不部署本地 Mod,也不提供世界实例管理。
|
|
@@ -40,6 +40,10 @@ PyPI 不提供两个包的原子发布。`scripts/pypi_release.py` 对重试逐
|
|
|
40
40
|
|
|
41
41
|
用户当前操作统一见 [内置 Skill](skills/mcpywrap/SKILL.md)。发布验证记录、候选核查和跨仓库推进计划放在被忽略的 `.local-notes/`,不随源码包分发;长期发行规则维护在本页。候选 CI 的未签名桥接不用于验证正式签名登录流程。
|
|
42
42
|
|
|
43
|
+
## Tracy 分析工具包
|
|
44
|
+
|
|
45
|
+
`mcpy profile` 使用的 Tracy 0.11.1 工具单独构建发布,不进入 wheel。构建与发布步骤见 [native/tracy_tools](native/tracy_tools/README.md);新的工具包发布后,把 `platforms.json` 写入 `core/mcpywrap_core/profiling/tools.json` 再随 mcpywrap 版本发布。
|
|
46
|
+
|
|
43
47
|
## Windows 全局部署恢复验收
|
|
44
48
|
|
|
45
49
|
涉及全局包发布或归属恢复时,除完整测试外,运行 `tests/manual/lifecycle_dependency_audit.py --migration`,使用新建的隔离资料目录预置历史父项目双包链接,验证完整冲突、确认迁移、新代码加载、启动失败回滚、依赖变化及世界保留。不得提前清理真实用户的冲突链接,也不能以全新空白资料目录的正常启动替代升级场景。
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = '0.7.0'
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mcpywrap
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.7.0
|
|
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.
|
|
13
|
+
Requires-Dist: mcpywrap-core==0.7.0
|
|
14
14
|
Requires-Dist: pip>=23
|
|
15
15
|
Requires-Dist: build>=1.0
|
|
16
16
|
Requires-Dist: watchdog>=2.0.0
|
|
@@ -132,6 +132,10 @@ Git 项目使用 `[[tool.mcpywrap.git_dependencies]]` 声明,支持 Addon 与
|
|
|
132
132
|
- 两名玩家、成员选择、组更新与重试:[双客户端联调](skills/mcpywrap/references/dual-clients.md)。
|
|
133
133
|
- 资源发现与平台差异:[安装与路由](skills/mcpywrap/references/setup.md)、[macOS 平台](skills/mcpywrap/references/macos-local.md)。
|
|
134
134
|
|
|
135
|
+
### 性能分析
|
|
136
|
+
|
|
137
|
+
开发版游戏自带 Tracy 0.11.1,会记录每个 Mod Python 函数的耗时。`mcpy profile install` 准备固定版本的工具,`mcpy profile open` 打开实时分析器或离线查看 `.tracy` 文件,`mcpy profile capture`、`report`、`diff` 采集并对比优化前后。用法与解读见 [性能分析](skills/mcpywrap/references/profiling.md)。
|
|
138
|
+
|
|
135
139
|
### 网络连接与登录身份
|
|
136
140
|
|
|
137
141
|
外部服务器连接、可选 MCS 身份与进服判断见 [网络会话](skills/mcpywrap/references/network-sessions.md)。需要另一台 Windows 执行游戏时,再按 [远程执行端](skills/mcpywrap/references/remote-testing.md) 配置服务。远程连接不部署本地 Mod,也不提供世界实例管理。
|
|
@@ -69,6 +69,9 @@ native/tracy_profiler/client-tracy.patch
|
|
|
69
69
|
native/tracy_profiler/libc-shim-host-info.patch
|
|
70
70
|
native/tracy_profiler/manifest-tracy.patch
|
|
71
71
|
native/tracy_profiler/probe.py
|
|
72
|
+
native/tracy_tools/README.md
|
|
73
|
+
native/tracy_tools/build.py
|
|
74
|
+
native/tracy_tools/report/src/report.cpp
|
|
72
75
|
native/window_activation/README.md
|
|
73
76
|
native/window_activation/window_activation.cpp
|
|
74
77
|
native/window_capture/ocr.h
|
|
@@ -113,6 +116,7 @@ skills/mcpywrap/references/instance-world-settings.md
|
|
|
113
116
|
skills/mcpywrap/references/local-development.md
|
|
114
117
|
skills/mcpywrap/references/macos-local.md
|
|
115
118
|
skills/mcpywrap/references/network-sessions.md
|
|
119
|
+
skills/mcpywrap/references/profiling.md
|
|
116
120
|
skills/mcpywrap/references/project-dependencies.md
|
|
117
121
|
skills/mcpywrap/references/project-scripts.md
|
|
118
122
|
skills/mcpywrap/references/project-workflow.md
|
|
@@ -194,6 +198,7 @@ tests/test_network.py
|
|
|
194
198
|
tests/test_network_sessions.py
|
|
195
199
|
tests/test_pack_uuid_conflicts.py
|
|
196
200
|
tests/test_package.py
|
|
201
|
+
tests/test_profiling.py
|
|
197
202
|
tests/test_project_scripts.py
|
|
198
203
|
tests/test_qt_sessions.py
|
|
199
204
|
tests/test_qumod_workflow.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": "9f80692ee5589715466a2fbc08a12650f70fb1088ccd8254114b0ada92271b6b",
|
|
15
|
+
"Loader.dll": "cfdae6b7e12eff13e6529792799db574d7ed0706043627f0b77355dcc49fdb9d",
|
|
16
|
+
"McpyMcsAuth.dll": "b9913e7ced63ce2089d981dc13448289807f36ba372bf44e7c82e29050005b85",
|
|
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": "70fcb1788b2a1209e69abbd9db671e240f45d023e7caa232f845df8464abc8d7",
|
|
5
5
|
"source_sha256": "03c1aab9e8d46c162e11f9448903c4907fbe3b87d1e77d8118b72c3e6b250ec5"
|
|
6
6
|
}
|
|
Binary file
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"executable_sha256": "
|
|
2
|
+
"executable_sha256": "5413bdf2c4e3b5d28cc53baa6f323eaa6e0f63cc7f796827bdb779c29ab222ed",
|
|
3
3
|
"source_sha256": "64c9db4f31031fc794e4a41a3287a8382c5ac5599244824b6fd7d44971d68f05",
|
|
4
4
|
"sources": {
|
|
5
5
|
"ocr.h": "0b62eed9a41cdeec451283c24b140da4f333a47b59c581e26dd8f0d803e9cfd6",
|
{mcpywrap-0.6.4 → mcpywrap-0.7.0}/desktop/mcpywrap_assets/window_capture/mcpy-window-capture.exe
RENAMED
|
Binary file
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# Tracy 分析工具包
|
|
2
|
+
|
|
3
|
+
`mcpy profile` 使用的分析器、采集和报告工具。游戏内置 Tracy 0.11.1(协议 69),分析器必须同版本,因此从固定源码构建、单独发布,由 mcpywrap 按 `core/mcpywrap_core/profiling/tools.json` 下载校验。用户用法见 [性能分析](../../skills/mcpywrap/references/profiling.md)。
|
|
4
|
+
|
|
5
|
+
## 内容
|
|
6
|
+
|
|
7
|
+
每个平台一个 ZIP(`mcpy-tracy-0.11.1-<构建号>-<平台>.zip`),根目录 `mcpy-tracy/`:
|
|
8
|
+
|
|
9
|
+
- `tracy-profiler`:实时与离线分析器界面。
|
|
10
|
+
- `tracy-capture`:无界面采集。
|
|
11
|
+
- `tracy-csvexport`:Tracy 自带 CSV 导出。
|
|
12
|
+
- `mcpy-tracy-report`:本目录 `report/` 的 JSON 报告工具,基于同版本 TracyServer,输出区段统计与分位数、调用边、线程、帧标记,以及主循环/服务端 tick 最慢实例内按线程的自身耗时归因。
|
|
13
|
+
- `LICENSE`(Tracy,BSD-3-Clause)与 `BUILDINFO.json`(版本、源码提交、协议、各文件 SHA-256)。
|
|
14
|
+
|
|
15
|
+
依赖(capstone、glfw、freetype)由 Tracy 的 CPM 下载并静态链接,不使用构建机上的 Homebrew/pkg-config 动态库。macOS 产物最低 13.0、ad-hoc 签名;Windows 静态链接 MSVC 运行库,只依赖系统 DLL。
|
|
16
|
+
|
|
17
|
+
## 构建
|
|
18
|
+
|
|
19
|
+
```sh
|
|
20
|
+
python native/tracy_tools/build.py --work <构建目录> --output <输出目录> [--source <Tracy 检出>] [--build 1]
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
源码不存在时按 `v0.11.1` 克隆,并核对提交 `5d542dc09f3d9378d005092a4ad446bd405f819a`。构建前只做编译兼容修正(`TracyView.hpp` 补充 `#include <chrono>`,新版 MSVC 需要),不改变行为,修正列表记录在 `BUILDINFO.json` 的 `source_fixes`。输出 ZIP 与同名 `.json`(平台、文件名、大小、sha256)。支持 Apple Silicon macOS 与 Windows x64。
|
|
24
|
+
|
|
25
|
+
## 发布
|
|
26
|
+
|
|
27
|
+
1. 工作流 [`tracy-tools.yml`](../../.github/workflows/tracy-tools.yml) 可手动运行,只构建并上传 artifact,用于验证。
|
|
28
|
+
2. 推送标签 `tracy-tools-0.11.1-<构建号>` 后两平台构建,并创建同名 GitHub Release(不标为 Latest),附 ZIP、`platforms.json` 与 `SHA256SUMS`。
|
|
29
|
+
3. 把 `platforms.json` 的内容写入 `tools.json` 的 `platforms`,`build` 与镜像地址同步为该构建号,随 mcpywrap 版本发布。已发布的 ZIP 不覆盖;变更内容使用新的构建号。
|
|
30
|
+
|
|
31
|
+
更换 Tracy 版本只在游戏内置版本变化时进行:同时更新 `build.py` 的版本、标签、提交和协议,`report.cpp` 的版本字符串,以及 `tools.json`。
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
"""从固定的 Tracy 0.11.1 源码构建 mcpy 分析工具包(分析器界面、采集、CSV 导出、JSON 报告)。
|
|
2
|
+
|
|
3
|
+
用法:
|
|
4
|
+
python native/tracy_tools/build.py --work <构建目录> --output <输出目录> [--source <Tracy 检出>] [--build 1]
|
|
5
|
+
|
|
6
|
+
源码不存在时按固定标签克隆并核对提交;构建依赖由 Tracy 自身的 CPM 下载。
|
|
7
|
+
输出 mcpy-tracy-<版本>-<构建号>-<平台>.zip 及同名 .json(文件名、大小、sha256),
|
|
8
|
+
用于发布后写入 core/mcpywrap_core/profiling/tools.json。不安装、不启动任何程序。
|
|
9
|
+
"""
|
|
10
|
+
import argparse
|
|
11
|
+
import hashlib
|
|
12
|
+
import json
|
|
13
|
+
import os
|
|
14
|
+
import platform
|
|
15
|
+
import shutil
|
|
16
|
+
import subprocess
|
|
17
|
+
import sys
|
|
18
|
+
import zipfile
|
|
19
|
+
from pathlib import Path
|
|
20
|
+
|
|
21
|
+
TRACY_VERSION = '0.11.1'
|
|
22
|
+
TRACY_TAG = 'v0.11.1'
|
|
23
|
+
TRACY_COMMIT = '5d542dc09f3d9378d005092a4ad446bd405f819a'
|
|
24
|
+
TRACY_PROTOCOL = 69
|
|
25
|
+
TRACY_REPOSITORY = 'https://github.com/wolfpld/tracy.git'
|
|
26
|
+
HERE = Path(__file__).resolve().parent
|
|
27
|
+
# 构建目标:Tracy 源码子目录 → 可执行文件名
|
|
28
|
+
TARGETS = {
|
|
29
|
+
'profiler': ('profiler', 'tracy-profiler'),
|
|
30
|
+
'capture': ('capture', 'tracy-capture'),
|
|
31
|
+
'csvexport': ('csvexport', 'tracy-csvexport'),
|
|
32
|
+
'report': ('mcpy-report', 'mcpy-tracy-report'),
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def platform_tag():
|
|
37
|
+
machine = platform.machine().lower()
|
|
38
|
+
if sys.platform == 'darwin' and machine == 'arm64':
|
|
39
|
+
return 'macos-arm64'
|
|
40
|
+
if os.name == 'nt' and machine in ('amd64', 'x86_64'):
|
|
41
|
+
return 'windows-x64'
|
|
42
|
+
raise SystemExit('不支持的构建平台:%s %s' % (sys.platform, machine))
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def run(command, **kwargs):
|
|
46
|
+
print('+ ' + ' '.join(str(part) for part in command), flush=True)
|
|
47
|
+
subprocess.run([str(part) for part in command], check=True, **kwargs)
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def prepare_source(source):
|
|
51
|
+
if not source.exists():
|
|
52
|
+
run(['git', 'clone', '--depth', '1', '--branch', TRACY_TAG, TRACY_REPOSITORY, source])
|
|
53
|
+
head = subprocess.run(['git', '-C', str(source), 'rev-parse', 'HEAD'], check=True,
|
|
54
|
+
capture_output=True, text=True).stdout.strip()
|
|
55
|
+
if head != TRACY_COMMIT:
|
|
56
|
+
raise SystemExit('Tracy 源码提交为 %s,应为 %s(%s)' % (head, TRACY_COMMIT, TRACY_TAG))
|
|
57
|
+
apply_source_fixes(source)
|
|
58
|
+
# 报告工具复用 Tracy 的 cmake 配置,需要位于源码根目录下
|
|
59
|
+
target = source/'mcpy-report'
|
|
60
|
+
shutil.rmtree(target, ignore_errors=True)
|
|
61
|
+
shutil.copytree(HERE/'report', target)
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
# 只修复与新编译器的兼容问题,不改变行为;记录在 BUILDINFO.json 中
|
|
65
|
+
SOURCE_FIXES = [
|
|
66
|
+
# 新版 MSVC STL 不再间接包含 <chrono>;上游后续版本同样补上了此包含
|
|
67
|
+
('profiler/src/profiler/TracyView.hpp', '#include <atomic>\n', '#include <atomic>\n#include <chrono>\n'),
|
|
68
|
+
]
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def apply_source_fixes(source):
|
|
72
|
+
for relative, old, new in SOURCE_FIXES:
|
|
73
|
+
path = source/relative
|
|
74
|
+
text = path.read_text(encoding='utf-8')
|
|
75
|
+
if new in text:
|
|
76
|
+
continue
|
|
77
|
+
if text.count(old) != 1:
|
|
78
|
+
raise SystemExit('源码修正位置不唯一:' + relative)
|
|
79
|
+
path.write_text(text.replace(old, new), encoding='utf-8')
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def build_target(source, work, name):
|
|
83
|
+
directory, executable = TARGETS[name]
|
|
84
|
+
build = work/name
|
|
85
|
+
configure = ['cmake', '-S', source/directory, '-B', build, '-DCMAKE_BUILD_TYPE=Release',
|
|
86
|
+
'-DNO_ISA_EXTENSIONS=ON', '-DCPM_SOURCE_CACHE=' + str(work/'cpm-cache'),
|
|
87
|
+
# 固定版本源码静态链接,不使用构建机上的 Homebrew/pkg-config 动态库
|
|
88
|
+
'-DDOWNLOAD_CAPSTONE=ON', '-DDOWNLOAD_GLFW=ON', '-DDOWNLOAD_FREETYPE=ON',
|
|
89
|
+
'-DFT_DISABLE_PNG=ON', '-DFT_DISABLE_BZIP2=ON', '-DFT_DISABLE_BROTLI=ON',
|
|
90
|
+
'-DFT_DISABLE_HARFBUZZ=ON', '-DBUILD_SHARED_LIBS=OFF',
|
|
91
|
+
# CMake 4 拒绝 freetype 2.13.2 等依赖声明的过旧最低版本;CMake 3 忽略此项
|
|
92
|
+
'-DCMAKE_POLICY_VERSION_MINIMUM=3.5']
|
|
93
|
+
if os.name == 'nt':
|
|
94
|
+
# 静态链接 MSVC 运行库,不依赖目标机的 VC++ 可再发行组件版本(如 MSVCP140_ATOMIC_WAIT.dll);
|
|
95
|
+
# 依赖子项目的最低版本较旧,需同时把 CMP0091 默认设为 NEW,保证全部目标一致
|
|
96
|
+
configure += ['-DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreaded', '-DCMAKE_POLICY_DEFAULT_CMP0091=NEW']
|
|
97
|
+
# Windows 只在已进入 MSVC 环境时用 Ninja,否则使用 Visual Studio 生成器
|
|
98
|
+
if shutil.which('ninja') and (os.name != 'nt' or os.environ.get('VCINSTALLDIR')):
|
|
99
|
+
configure[1:1] = ['-G', 'Ninja']
|
|
100
|
+
env = dict(os.environ)
|
|
101
|
+
if sys.platform == 'darwin':
|
|
102
|
+
env.setdefault('MACOSX_DEPLOYMENT_TARGET', '13.0')
|
|
103
|
+
run(configure, env=env)
|
|
104
|
+
run(['cmake', '--build', build, '--config', 'Release', '--parallel'], env=env)
|
|
105
|
+
suffix = '.exe' if os.name == 'nt' else ''
|
|
106
|
+
for candidate in (build/(executable+suffix), build/'Release'/(executable+suffix)):
|
|
107
|
+
if candidate.is_file():
|
|
108
|
+
return candidate
|
|
109
|
+
raise SystemExit('未找到构建产物:' + executable)
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
def sha256(path):
|
|
113
|
+
digest = hashlib.sha256()
|
|
114
|
+
with open(path, 'rb') as stream:
|
|
115
|
+
for block in iter(lambda: stream.read(1 << 20), b''):
|
|
116
|
+
digest.update(block)
|
|
117
|
+
return digest.hexdigest()
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
def package(source, binaries, output, build_number, tag):
|
|
121
|
+
output.mkdir(parents=True, exist_ok=True)
|
|
122
|
+
name = 'mcpy-tracy-%s-%s-%s' % (TRACY_VERSION, build_number, tag)
|
|
123
|
+
archive = output/(name+'.zip')
|
|
124
|
+
info = {'schema': 1, 'tracy_version': TRACY_VERSION, 'tracy_commit': TRACY_COMMIT,
|
|
125
|
+
'protocol': TRACY_PROTOCOL, 'build': build_number, 'platform': tag,
|
|
126
|
+
'source_fixes': [relative for relative, _, _ in SOURCE_FIXES],
|
|
127
|
+
'files': {path.name: sha256(path) for path in binaries}}
|
|
128
|
+
with zipfile.ZipFile(archive, 'w', zipfile.ZIP_DEFLATED) as bundle:
|
|
129
|
+
for path in binaries:
|
|
130
|
+
member = zipfile.ZipInfo('mcpy-tracy/'+path.name, date_time=(2024, 8, 22, 0, 0, 0))
|
|
131
|
+
member.external_attr = 0o100755 << 16
|
|
132
|
+
member.compress_type = zipfile.ZIP_DEFLATED
|
|
133
|
+
bundle.writestr(member, path.read_bytes())
|
|
134
|
+
bundle.write(source/'LICENSE', 'mcpy-tracy/LICENSE')
|
|
135
|
+
bundle.writestr('mcpy-tracy/BUILDINFO.json', json.dumps(info, indent=2, sort_keys=True))
|
|
136
|
+
entry = {'platform': tag, 'filename': archive.name, 'size': archive.stat().st_size, 'sha256': sha256(archive)}
|
|
137
|
+
(output/(name+'.json')).write_text(json.dumps(entry, indent=2) + '\n')
|
|
138
|
+
print(json.dumps(entry, indent=2))
|
|
139
|
+
return archive
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
def main():
|
|
143
|
+
parser = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter)
|
|
144
|
+
parser.add_argument('--source', type=Path, help='Tracy 源码检出目录,默认 <work>/tracy-src')
|
|
145
|
+
parser.add_argument('--work', type=Path, required=True)
|
|
146
|
+
parser.add_argument('--output', type=Path, required=True)
|
|
147
|
+
parser.add_argument('--build', default='1', help='同一 Tracy 版本的打包序号')
|
|
148
|
+
parser.add_argument('--targets', default=','.join(TARGETS))
|
|
149
|
+
args = parser.parse_args()
|
|
150
|
+
work = args.work.resolve()
|
|
151
|
+
source = (args.source or work/'tracy-src').resolve()
|
|
152
|
+
tag = platform_tag()
|
|
153
|
+
prepare_source(source)
|
|
154
|
+
binaries = []
|
|
155
|
+
for name in args.targets.split(','):
|
|
156
|
+
binary = build_target(source, work, name)
|
|
157
|
+
if sys.platform == 'darwin':
|
|
158
|
+
run(['codesign', '--force', '--sign', '-', binary])
|
|
159
|
+
binaries.append(binary)
|
|
160
|
+
package(source, binaries, args.output.resolve(), args.build, tag)
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
if __name__ == '__main__':
|
|
164
|
+
main()
|