PyMemoryEditor 3.0.1__tar.gz → 3.0.2__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.
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/PKG-INFO +3 -1
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/PyMemoryEditor/__init__.py +1 -1
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/PyMemoryEditor/app/application.py +13 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/README.md +2 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/docs/conf.py +1 -1
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/docs/mcp.md +3 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/pyproject.toml +1 -0
- pymemoryeditor-3.0.2/tests/mcp_server/test_registry.py +88 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/.flake8 +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/.gitignore +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/.readthedocs.yaml +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/CODE_OF_CONDUCT.md +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/CONTRIBUTING.md +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/LICENSE +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/Makefile +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/PyMemoryEditor/__main__.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/PyMemoryEditor/app/__init__.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/PyMemoryEditor/app/_auto_refresh_dialog.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/PyMemoryEditor/app/_icon.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/PyMemoryEditor/app/_widgets.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/PyMemoryEditor/app/assets/icon.svg +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/PyMemoryEditor/app/cheat_entry.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/PyMemoryEditor/app/cheat_poll_worker.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/PyMemoryEditor/app/cheat_table.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/PyMemoryEditor/app/log_console_dialog.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/PyMemoryEditor/app/main_window.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/PyMemoryEditor/app/memory_map_dialog.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/PyMemoryEditor/app/memory_viewer_dialog.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/PyMemoryEditor/app/modules_dialog.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/PyMemoryEditor/app/open_process_dialog.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/PyMemoryEditor/app/pointer_chain_dialog.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/PyMemoryEditor/app/pointer_scan_dialog.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/PyMemoryEditor/app/results_view.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/PyMemoryEditor/app/scan_types.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/PyMemoryEditor/app/scan_worker.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/PyMemoryEditor/app/scanner_panel.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/PyMemoryEditor/app/threads_dialog.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/PyMemoryEditor/app/value_types.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/PyMemoryEditor/enums.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/PyMemoryEditor/linux/functions.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/PyMemoryEditor/linux/libc.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/PyMemoryEditor/linux/process.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/PyMemoryEditor/linux/types.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/PyMemoryEditor/macos/__init__.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/PyMemoryEditor/macos/functions.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/PyMemoryEditor/macos/libsystem.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/PyMemoryEditor/macos/process.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/PyMemoryEditor/macos/types.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/PyMemoryEditor/mcp/__init__.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/PyMemoryEditor/mcp/__main__.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/PyMemoryEditor/mcp/config.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/PyMemoryEditor/mcp/policy.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/PyMemoryEditor/mcp/server.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/PyMemoryEditor/mcp/session.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/PyMemoryEditor/mcp/toolset.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/PyMemoryEditor/process/__init__.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/PyMemoryEditor/process/abstract.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/PyMemoryEditor/process/errors.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/PyMemoryEditor/process/info.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/PyMemoryEditor/process/module_info.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/PyMemoryEditor/process/pointer_scan.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/PyMemoryEditor/process/region.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/PyMemoryEditor/process/remote_pointer.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/PyMemoryEditor/process/scanning.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/PyMemoryEditor/process/thread_info.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/PyMemoryEditor/process/util.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/PyMemoryEditor/py.typed +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/PyMemoryEditor/util/__init__.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/PyMemoryEditor/util/convert.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/PyMemoryEditor/util/pattern.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/PyMemoryEditor/util/scan.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/PyMemoryEditor/util/scan_numpy.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/PyMemoryEditor/win32/enums/__init__.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/PyMemoryEditor/win32/enums/memory_allocation_states.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/PyMemoryEditor/win32/enums/memory_protections.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/PyMemoryEditor/win32/enums/memory_types.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/PyMemoryEditor/win32/enums/process_operations.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/PyMemoryEditor/win32/enums/standard_access_rights.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/PyMemoryEditor/win32/functions.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/PyMemoryEditor/win32/process.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/PyMemoryEditor/win32/types.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/SECURITY.md +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/assets/screenshots/app.png +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/assets/social-preview.html +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/assets/social-preview.png +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/docs/_static/.gitkeep +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/docs/_static/custom.css +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/docs/_templates/layout.html +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/docs/api/enums.md +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/docs/api/errors.md +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/docs/api/index.md +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/docs/api/memory-region.md +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/docs/api/module-info.md +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/docs/api/openprocess.md +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/docs/api/pointer-path.md +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/docs/api/remote-pointer.md +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/docs/api/thread-info.md +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/docs/api/utilities.md +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/docs/app.md +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/docs/contributing.md +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/docs/funding.md +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/docs/glossary.md +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/docs/guide/allocate-free.md +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/docs/guide/logging.md +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/docs/guide/memory-regions.md +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/docs/guide/modules-threads.md +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/docs/guide/opening-process.md +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/docs/guide/pattern-scan.md +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/docs/guide/pointer-scan.md +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/docs/guide/pointers.md +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/docs/guide/read-write.md +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/docs/guide/searching.md +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/docs/index.md +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/docs/installation.md +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/docs/license.md +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/docs/platform-notes.md +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/docs/quickstart.md +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/docs/requirements.txt +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/docs/troubleshooting.md +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/docs/why.md +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/tests/app/__init__.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/tests/app/test_app_cheat_entry.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/tests/app/test_app_pointer_parsing.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/tests/app/test_app_scan_request.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/tests/app/test_app_smoke.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/tests/app/test_app_value_types.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/tests/app/test_app_widgets.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/tests/app/test_auto_refresh_dialog.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/tests/app/test_cheat_poll_worker.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/tests/app/test_open_process_dialog.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/tests/app/test_refine_scan_worker.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/tests/conftest.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/tests/core/__init__.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/tests/core/test_errors.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/tests/core/test_logger.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/tests/mcp_server/__init__.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/tests/mcp_server/conftest.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/tests/mcp_server/test_argument_fuzz.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/tests/mcp_server/test_fake_fidelity.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/tests/mcp_server/test_live.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/tests/mcp_server/test_parsing.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/tests/mcp_server/test_policy.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/tests/mcp_server/test_server.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/tests/mcp_server/test_session.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/tests/mcp_server/test_toolset.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/tests/memory/__init__.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/tests/memory/test_allocate_free.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/tests/memory/test_bufflength_inference.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/tests/memory/test_editor.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/tests/memory/test_narrow_width_consistency.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/tests/memory/test_partial_io.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/tests/memory/test_read_into.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/tests/memory/test_str_boundary.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/tests/memory/test_str_decode_consistency.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/tests/memory/test_typed_accessors.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/tests/memory/test_write_safety.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/tests/memory/test_write_span.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/tests/memory/test_write_str_bytes_width.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/tests/platforms/__init__.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/tests/platforms/test_bitness.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/tests/platforms/test_bitness_fallback_warns.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/tests/platforms/test_linux_types.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/tests/platforms/test_macos_protect.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/tests/platforms/test_macos_transient_reads.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/tests/platforms/test_win32_permissions.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/tests/pointer/__init__.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/tests/pointer/test_pointer_chain.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/tests/pointer/test_pointer_scan.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/tests/pointer/test_remote_pointer.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/tests/process/__init__.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/tests/process/test_memory_region.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/tests/process/test_module_enumeration.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/tests/process/test_partial_name_match.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/tests/process/test_process_enumeration.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/tests/process/test_process_lookup.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/tests/process/test_thread_enumeration.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/tests/scan/__init__.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/tests/scan/test_chunking_integration.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/tests/scan/test_pattern_compile.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/tests/scan/test_pattern_scan.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/tests/scan/test_region_snapshot.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/tests/scan/test_scan.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/tests/scan/test_scan_numpy.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/tests/scan/test_scan_properties.py +0 -0
- {pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/tests/scan/test_scanning_helper.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: PyMemoryEditor
|
|
3
|
-
Version: 3.0.
|
|
3
|
+
Version: 3.0.2
|
|
4
4
|
Summary: Read, write and scan process memory in a few lines of Python — Cheat Engine-style scans, pointer chains and AOB search on Windows, Linux and macOS.
|
|
5
5
|
Project-URL: Homepage, https://github.com/JeanExtreme002/PyMemoryEditor
|
|
6
6
|
Project-URL: Documentation, https://pymemoryeditor.readthedocs.io
|
|
@@ -61,6 +61,8 @@ Description-Content-Type: text/markdown
|
|
|
61
61
|
|
|
62
62
|
# PyMemoryEditor
|
|
63
63
|
|
|
64
|
+
<!-- mcp-name: io.github.JeanExtreme002/PyMemoryEditor -->
|
|
65
|
+
|
|
64
66
|
A pure-Python library (built on [ctypes](https://docs.python.org/3/library/ctypes.html)) that lets you **inspect, modify and search the memory of any running process in a few lines of Python** — Cheat Engine workflows on Windows, Linux and macOS!
|
|
65
67
|
|
|
66
68
|
---
|
|
@@ -559,7 +559,20 @@ def main_cli(argv=None):
|
|
|
559
559
|
|
|
560
560
|
Kept separate from :func:`main` so that process-wide change only happens
|
|
561
561
|
when the app *is* the process, never when it is embedded in someone else's.
|
|
562
|
+
|
|
563
|
+
``pymemoryeditor mcp [flags]`` runs the MCP server instead, the same as
|
|
564
|
+
``pymemoryeditor-mcp [flags]``. MCP registries launch a PyPI package by its
|
|
565
|
+
project name (``uvx --from "PyMemoryEditor[mcp]" pymemoryeditor mcp``), so
|
|
566
|
+
this is the only command they can reach. It never touches Qt, and the
|
|
567
|
+
server keeps its own signal handling.
|
|
562
568
|
"""
|
|
569
|
+
if argv is None:
|
|
570
|
+
argv = sys.argv
|
|
571
|
+
if len(argv) > 1 and argv[1].strip() == "mcp":
|
|
572
|
+
from PyMemoryEditor.mcp.server import main as mcp_main
|
|
573
|
+
|
|
574
|
+
return mcp_main(argv[2:])
|
|
575
|
+
|
|
563
576
|
with _scoped_signal_handler(signal.SIGINT, signal.SIG_DFL):
|
|
564
577
|
return main(argv)
|
|
565
578
|
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# PyMemoryEditor
|
|
2
2
|
|
|
3
|
+
<!-- mcp-name: io.github.JeanExtreme002/PyMemoryEditor -->
|
|
4
|
+
|
|
3
5
|
A pure-Python library (built on [ctypes](https://docs.python.org/3/library/ctypes.html)) that lets you **inspect, modify and search the memory of any running process in a few lines of Python** — Cheat Engine workflows on Windows, Linux and macOS!
|
|
4
6
|
|
|
5
7
|
---
|
|
@@ -23,7 +23,7 @@ copyright = f"{datetime.now().year}, {author}"
|
|
|
23
23
|
try:
|
|
24
24
|
from PyMemoryEditor import __version__ as release
|
|
25
25
|
except Exception: # pragma: no cover - docs can build without the package installed
|
|
26
|
-
release = "3.0.
|
|
26
|
+
release = "3.0.2"
|
|
27
27
|
|
|
28
28
|
version = ".".join(release.split(".")[:2])
|
|
29
29
|
|
|
@@ -85,6 +85,9 @@ pymemoryeditor-mcp --allow-process game.exe # never asks for game.exe
|
|
|
85
85
|
pymemoryeditor-mcp --allow-any-process # never asks at all (scripts/CI)
|
|
86
86
|
```
|
|
87
87
|
|
|
88
|
+
`pymemoryeditor mcp` is the same command, flags included: it is how clients
|
|
89
|
+
that install from the MCP Registry start the server.
|
|
90
|
+
|
|
88
91
|
## Flags
|
|
89
92
|
|
|
90
93
|
<table>
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
|
|
3
|
+
"""
|
|
4
|
+
The MCP Registry listing (server.json) and the command it makes clients run.
|
|
5
|
+
|
|
6
|
+
A registry client starts a PyPI server as ``uvx <runtime args> <identifier>
|
|
7
|
+
<package args>``, with the identifier being the PyPI project. So the listing
|
|
8
|
+
only works while four things agree: the server name in server.json and the
|
|
9
|
+
``mcp-name`` marker in the README that PyPI shows (the registry's ownership
|
|
10
|
+
check), the versions in server.json and the package, and the console script
|
|
11
|
+
the identifier names, which must start the server when given ``mcp``.
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
import json
|
|
15
|
+
import re
|
|
16
|
+
import sys
|
|
17
|
+
from pathlib import Path
|
|
18
|
+
|
|
19
|
+
import pytest
|
|
20
|
+
|
|
21
|
+
import PyMemoryEditor
|
|
22
|
+
|
|
23
|
+
ROOT = Path(__file__).resolve().parents[2]
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
@pytest.fixture(scope="module")
|
|
27
|
+
def server():
|
|
28
|
+
return json.loads((ROOT / "server.json").read_text(encoding="utf-8"))
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
@pytest.fixture(scope="module")
|
|
32
|
+
def package(server):
|
|
33
|
+
(package,) = server["packages"]
|
|
34
|
+
return package
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def test_readme_carries_the_registry_name(server):
|
|
38
|
+
readme = (ROOT / "README.md").read_text(encoding="utf-8")
|
|
39
|
+
|
|
40
|
+
assert re.findall(r"mcp-name: (\S+) -->", readme) == [server["name"]]
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def test_versions_follow_the_package(server, package):
|
|
44
|
+
version = PyMemoryEditor.__version__
|
|
45
|
+
|
|
46
|
+
assert server["version"] == package["version"] == version
|
|
47
|
+
assert {"type": "named", "name": "--from"}.items() <= package["runtimeArguments"][0].items()
|
|
48
|
+
assert package["runtimeArguments"][0]["value"] == "PyMemoryEditor[mcp]==" + version
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def test_the_command_a_client_builds_starts_the_server(package):
|
|
52
|
+
pyproject = (ROOT / "pyproject.toml").read_text(encoding="utf-8")
|
|
53
|
+
scripts = re.search(r"\[project\.scripts\](.*?)\n\[", pyproject, re.S).group(1)
|
|
54
|
+
|
|
55
|
+
# uvx looks the executable up by its exact name, and the console scripts
|
|
56
|
+
# are lowercase: "PyMemoryEditor" would not be found on Linux.
|
|
57
|
+
assert re.search(r'^{} = "PyMemoryEditor\.app\.application:main_cli"$'.format(package["identifier"]), scripts, re.M)
|
|
58
|
+
assert package["runtimeHint"] == "uvx"
|
|
59
|
+
assert package["packageArguments"] == [{"type": "positional", "value": "mcp"}]
|
|
60
|
+
assert package["transport"] == {"type": "stdio"}
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def test_description_fits_the_registry_limit(server):
|
|
64
|
+
# The registry rejects a description over 100 characters at publish time.
|
|
65
|
+
assert len(server["description"]) <= 100
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def test_mcp_subcommand_runs_the_server_without_qt(monkeypatch):
|
|
69
|
+
from PyMemoryEditor.app import application
|
|
70
|
+
from PyMemoryEditor.mcp import server as mcp_server
|
|
71
|
+
|
|
72
|
+
received = []
|
|
73
|
+
monkeypatch.setattr(mcp_server, "main", lambda argv: received.append(list(argv)) or 0)
|
|
74
|
+
monkeypatch.setattr(application, "main", lambda argv: pytest.fail("the Qt app started"))
|
|
75
|
+
monkeypatch.setitem(sys.modules, "PySide6", None) # any Qt import would raise
|
|
76
|
+
|
|
77
|
+
assert application.main_cli(["pymemoryeditor", "mcp", "--read-only", "--allow-process", "game.exe"]) == 0
|
|
78
|
+
assert received == [["--read-only", "--allow-process", "game.exe"]]
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
def test_other_arguments_still_reach_the_app(monkeypatch):
|
|
82
|
+
from PyMemoryEditor.app import application
|
|
83
|
+
|
|
84
|
+
received = []
|
|
85
|
+
monkeypatch.setattr(application, "main", lambda argv: received.append(argv))
|
|
86
|
+
|
|
87
|
+
application.main_cli(["pymemoryeditor", "--version"])
|
|
88
|
+
assert received == [["pymemoryeditor", "--version"]]
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/PyMemoryEditor/win32/enums/memory_allocation_states.py
RENAMED
|
File without changes
|
{pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/PyMemoryEditor/win32/enums/memory_protections.py
RENAMED
|
File without changes
|
|
File without changes
|
{pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/PyMemoryEditor/win32/enums/process_operations.py
RENAMED
|
File without changes
|
{pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/PyMemoryEditor/win32/enums/standard_access_rights.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pymemoryeditor-3.0.1 → pymemoryeditor-3.0.2}/tests/platforms/test_bitness_fallback_warns.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|