PyMemoryEditor 3.0.0__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.0 → pymemoryeditor-3.0.2}/Makefile +1 -1
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/PKG-INFO +3 -1
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/PyMemoryEditor/__init__.py +1 -1
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/PyMemoryEditor/app/application.py +13 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/README.md +2 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/docs/api/index.md +15 -1
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/docs/conf.py +1 -1
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/docs/index.md +57 -17
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/docs/installation.md +1 -1
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/docs/mcp.md +3 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/pyproject.toml +1 -0
- pymemoryeditor-3.0.2/tests/mcp_server/test_registry.py +88 -0
- pymemoryeditor-3.0.0/docs/guide/index.md +0 -53
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/.flake8 +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/.gitignore +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/.readthedocs.yaml +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/CODE_OF_CONDUCT.md +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/CONTRIBUTING.md +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/LICENSE +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/PyMemoryEditor/__main__.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/PyMemoryEditor/app/__init__.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/PyMemoryEditor/app/_auto_refresh_dialog.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/PyMemoryEditor/app/_icon.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/PyMemoryEditor/app/_widgets.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/PyMemoryEditor/app/assets/icon.svg +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/PyMemoryEditor/app/cheat_entry.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/PyMemoryEditor/app/cheat_poll_worker.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/PyMemoryEditor/app/cheat_table.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/PyMemoryEditor/app/log_console_dialog.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/PyMemoryEditor/app/main_window.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/PyMemoryEditor/app/memory_map_dialog.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/PyMemoryEditor/app/memory_viewer_dialog.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/PyMemoryEditor/app/modules_dialog.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/PyMemoryEditor/app/open_process_dialog.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/PyMemoryEditor/app/pointer_chain_dialog.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/PyMemoryEditor/app/pointer_scan_dialog.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/PyMemoryEditor/app/results_view.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/PyMemoryEditor/app/scan_types.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/PyMemoryEditor/app/scan_worker.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/PyMemoryEditor/app/scanner_panel.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/PyMemoryEditor/app/threads_dialog.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/PyMemoryEditor/app/value_types.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/PyMemoryEditor/enums.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/PyMemoryEditor/linux/functions.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/PyMemoryEditor/linux/libc.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/PyMemoryEditor/linux/process.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/PyMemoryEditor/linux/types.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/PyMemoryEditor/macos/__init__.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/PyMemoryEditor/macos/functions.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/PyMemoryEditor/macos/libsystem.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/PyMemoryEditor/macos/process.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/PyMemoryEditor/macos/types.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/PyMemoryEditor/mcp/__init__.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/PyMemoryEditor/mcp/__main__.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/PyMemoryEditor/mcp/config.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/PyMemoryEditor/mcp/policy.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/PyMemoryEditor/mcp/server.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/PyMemoryEditor/mcp/session.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/PyMemoryEditor/mcp/toolset.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/PyMemoryEditor/process/__init__.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/PyMemoryEditor/process/abstract.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/PyMemoryEditor/process/errors.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/PyMemoryEditor/process/info.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/PyMemoryEditor/process/module_info.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/PyMemoryEditor/process/pointer_scan.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/PyMemoryEditor/process/region.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/PyMemoryEditor/process/remote_pointer.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/PyMemoryEditor/process/scanning.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/PyMemoryEditor/process/thread_info.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/PyMemoryEditor/process/util.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/PyMemoryEditor/py.typed +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/PyMemoryEditor/util/__init__.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/PyMemoryEditor/util/convert.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/PyMemoryEditor/util/pattern.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/PyMemoryEditor/util/scan.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/PyMemoryEditor/util/scan_numpy.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/PyMemoryEditor/win32/enums/__init__.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/PyMemoryEditor/win32/enums/memory_allocation_states.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/PyMemoryEditor/win32/enums/memory_protections.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/PyMemoryEditor/win32/enums/memory_types.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/PyMemoryEditor/win32/enums/process_operations.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/PyMemoryEditor/win32/enums/standard_access_rights.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/PyMemoryEditor/win32/functions.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/PyMemoryEditor/win32/process.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/PyMemoryEditor/win32/types.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/SECURITY.md +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/assets/screenshots/app.png +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/assets/social-preview.html +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/assets/social-preview.png +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/docs/_static/.gitkeep +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/docs/_static/custom.css +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/docs/_templates/layout.html +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/docs/api/enums.md +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/docs/api/errors.md +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/docs/api/memory-region.md +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/docs/api/module-info.md +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/docs/api/openprocess.md +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/docs/api/pointer-path.md +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/docs/api/remote-pointer.md +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/docs/api/thread-info.md +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/docs/api/utilities.md +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/docs/app.md +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/docs/contributing.md +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/docs/funding.md +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/docs/glossary.md +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/docs/guide/allocate-free.md +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/docs/guide/logging.md +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/docs/guide/memory-regions.md +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/docs/guide/modules-threads.md +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/docs/guide/opening-process.md +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/docs/guide/pattern-scan.md +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/docs/guide/pointer-scan.md +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/docs/guide/pointers.md +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/docs/guide/read-write.md +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/docs/guide/searching.md +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/docs/license.md +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/docs/platform-notes.md +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/docs/quickstart.md +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/docs/requirements.txt +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/docs/troubleshooting.md +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/docs/why.md +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/tests/app/__init__.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/tests/app/test_app_cheat_entry.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/tests/app/test_app_pointer_parsing.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/tests/app/test_app_scan_request.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/tests/app/test_app_smoke.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/tests/app/test_app_value_types.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/tests/app/test_app_widgets.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/tests/app/test_auto_refresh_dialog.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/tests/app/test_cheat_poll_worker.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/tests/app/test_open_process_dialog.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/tests/app/test_refine_scan_worker.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/tests/conftest.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/tests/core/__init__.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/tests/core/test_errors.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/tests/core/test_logger.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/tests/mcp_server/__init__.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/tests/mcp_server/conftest.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/tests/mcp_server/test_argument_fuzz.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/tests/mcp_server/test_fake_fidelity.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/tests/mcp_server/test_live.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/tests/mcp_server/test_parsing.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/tests/mcp_server/test_policy.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/tests/mcp_server/test_server.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/tests/mcp_server/test_session.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/tests/mcp_server/test_toolset.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/tests/memory/__init__.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/tests/memory/test_allocate_free.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/tests/memory/test_bufflength_inference.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/tests/memory/test_editor.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/tests/memory/test_narrow_width_consistency.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/tests/memory/test_partial_io.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/tests/memory/test_read_into.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/tests/memory/test_str_boundary.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/tests/memory/test_str_decode_consistency.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/tests/memory/test_typed_accessors.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/tests/memory/test_write_safety.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/tests/memory/test_write_span.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/tests/memory/test_write_str_bytes_width.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/tests/platforms/__init__.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/tests/platforms/test_bitness.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/tests/platforms/test_bitness_fallback_warns.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/tests/platforms/test_linux_types.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/tests/platforms/test_macos_protect.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/tests/platforms/test_macos_transient_reads.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/tests/platforms/test_win32_permissions.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/tests/pointer/__init__.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/tests/pointer/test_pointer_chain.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/tests/pointer/test_pointer_scan.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/tests/pointer/test_remote_pointer.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/tests/process/__init__.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/tests/process/test_memory_region.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/tests/process/test_module_enumeration.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/tests/process/test_partial_name_match.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/tests/process/test_process_enumeration.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/tests/process/test_process_lookup.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/tests/process/test_thread_enumeration.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/tests/scan/__init__.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/tests/scan/test_chunking_integration.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/tests/scan/test_pattern_compile.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/tests/scan/test_pattern_scan.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/tests/scan/test_region_snapshot.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/tests/scan/test_scan.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/tests/scan/test_scan_numpy.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/tests/scan/test_scan_properties.py +0 -0
- {pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/tests/scan/test_scanning_helper.py +0 -0
|
@@ -229,7 +229,7 @@ security:
|
|
|
229
229
|
@echo "$(GREEN)Security audit completed!$(NC)"
|
|
230
230
|
|
|
231
231
|
# Install the dependencies needed to build the documentation (Sphinx + MyST +
|
|
232
|
-
#
|
|
232
|
+
# the Read the Docs theme + extensions, listed in docs/requirements.txt). Also installs the
|
|
233
233
|
# package itself in editable mode so autodoc can import it.
|
|
234
234
|
.PHONY: install-docs
|
|
235
235
|
install-docs:
|
|
@@ -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
|
---
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
# API Reference
|
|
2
2
|
|
|
3
3
|
Every public class, method and helper PyMemoryEditor exposes. For
|
|
4
|
-
task-oriented walkthroughs,
|
|
4
|
+
task-oriented walkthroughs, start at
|
|
5
|
+
[Opening a process](../guide/opening-process.md).
|
|
5
6
|
|
|
6
7
|
## At a glance
|
|
7
8
|
|
|
@@ -20,14 +21,27 @@ task-oriented walkthroughs, see the [User Guide](../guide/index.md).
|
|
|
20
21
|
|
|
21
22
|
```{toctree}
|
|
22
23
|
:maxdepth: 1
|
|
24
|
+
:caption: The Entry Point
|
|
23
25
|
|
|
24
26
|
openprocess
|
|
25
27
|
enums
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
```{toctree}
|
|
31
|
+
:maxdepth: 1
|
|
32
|
+
:caption: Objects You Get Back
|
|
33
|
+
|
|
26
34
|
memory-region
|
|
27
35
|
remote-pointer
|
|
28
36
|
pointer-path
|
|
29
37
|
module-info
|
|
30
38
|
thread-info
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
```{toctree}
|
|
42
|
+
:maxdepth: 1
|
|
43
|
+
:caption: Errors and Helpers
|
|
44
|
+
|
|
31
45
|
errors
|
|
32
46
|
utilities
|
|
33
47
|
```
|
|
@@ -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 = "
|
|
26
|
+
release = "3.0.2"
|
|
27
27
|
|
|
28
28
|
version = ".".join(release.split(".")[:2])
|
|
29
29
|
|
|
@@ -31,7 +31,8 @@ scans, freezing values) to a small, friendly API that works **identically on
|
|
|
31
31
|
Windows, Linux and macOS**.
|
|
32
32
|
|
|
33
33
|
Get going with the [Installation](installation.md) and [Quick Start](quickstart.md)
|
|
34
|
-
pages, then
|
|
34
|
+
pages, then work through the guide itself, starting at
|
|
35
|
+
[Opening a process](guide/opening-process.md).
|
|
35
36
|
Prefer to click rather than type? The bundled [GUI app](app.md) gives you a
|
|
36
37
|
Cheat Engine-style interface for free.
|
|
37
38
|
|
|
@@ -100,48 +101,87 @@ explore, scan and freeze values by clicking.
|
|
|
100
101
|
</tr>
|
|
101
102
|
</table>
|
|
102
103
|
|
|
103
|
-
##
|
|
104
|
+
## Documentation
|
|
104
105
|
|
|
105
|
-
|
|
106
|
-
|
|
106
|
+
Every workflow is covered, from opening a process to following multi-level
|
|
107
|
+
pointer chains — plus the bundled GUI app, the MCP server for AI assistants,
|
|
108
|
+
and the reference for every public symbol. Each group below stands on its own,
|
|
109
|
+
so you can start wherever your question is.
|
|
107
110
|
|
|
108
111
|
```{toctree}
|
|
109
|
-
:maxdepth:
|
|
112
|
+
:maxdepth: 1
|
|
113
|
+
:caption: Getting Started
|
|
110
114
|
|
|
111
115
|
why
|
|
112
116
|
installation
|
|
113
117
|
quickstart
|
|
114
|
-
guide/index
|
|
115
|
-
app
|
|
116
|
-
mcp
|
|
117
118
|
```
|
|
118
119
|
|
|
119
|
-
|
|
120
|
+
```{toctree}
|
|
121
|
+
:maxdepth: 1
|
|
122
|
+
:caption: Core Workflow
|
|
120
123
|
|
|
121
|
-
|
|
122
|
-
|
|
124
|
+
guide/opening-process
|
|
125
|
+
guide/read-write
|
|
126
|
+
guide/searching
|
|
127
|
+
guide/pattern-scan
|
|
128
|
+
```
|
|
123
129
|
|
|
124
130
|
```{toctree}
|
|
125
|
-
:maxdepth:
|
|
131
|
+
:maxdepth: 1
|
|
132
|
+
:caption: Inspecting the Process
|
|
126
133
|
|
|
127
|
-
|
|
134
|
+
guide/memory-regions
|
|
135
|
+
guide/modules-threads
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
```{toctree}
|
|
139
|
+
:maxdepth: 1
|
|
140
|
+
:caption: Pointers
|
|
141
|
+
|
|
142
|
+
guide/pointers
|
|
143
|
+
guide/pointer-scan
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
```{toctree}
|
|
147
|
+
:maxdepth: 1
|
|
148
|
+
:caption: Memory Allocation
|
|
149
|
+
|
|
150
|
+
guide/allocate-free
|
|
128
151
|
```
|
|
129
152
|
|
|
130
|
-
|
|
153
|
+
```{toctree}
|
|
154
|
+
:maxdepth: 1
|
|
155
|
+
:caption: Tools
|
|
131
156
|
|
|
132
|
-
|
|
133
|
-
|
|
157
|
+
app
|
|
158
|
+
mcp
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
```{toctree}
|
|
162
|
+
:maxdepth: 2
|
|
163
|
+
:caption: API Reference
|
|
164
|
+
|
|
165
|
+
api/index
|
|
166
|
+
```
|
|
134
167
|
|
|
135
168
|
```{toctree}
|
|
136
169
|
:maxdepth: 1
|
|
170
|
+
:caption: Additional Notes
|
|
137
171
|
|
|
138
172
|
platform-notes
|
|
139
173
|
troubleshooting
|
|
140
174
|
guide/logging
|
|
175
|
+
glossary
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
```{toctree}
|
|
179
|
+
:maxdepth: 1
|
|
180
|
+
:caption: Project
|
|
181
|
+
|
|
141
182
|
contributing
|
|
142
183
|
funding
|
|
143
184
|
license
|
|
144
|
-
glossary
|
|
145
185
|
```
|
|
146
186
|
|
|
147
187
|
## Project links
|
|
@@ -18,7 +18,7 @@ any platform.
|
|
|
18
18
|
pip install PyMemoryEditor
|
|
19
19
|
```
|
|
20
20
|
|
|
21
|
-
## Install with the bundled GUI app
|
|
21
|
+
## Install with the bundled GUI (`app`)
|
|
22
22
|
|
|
23
23
|
The library ships an optional Cheat Engine-style GUI built on **PySide6
|
|
24
24
|
(Qt for Python)**. To install it, use the `app` extra:
|
|
@@ -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"]]
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
# User Guide
|
|
2
|
-
|
|
3
|
-
Task-oriented walkthroughs of every PyMemoryEditor workflow, from opening a
|
|
4
|
-
process to following multi-level pointer chains. Each page is self-contained
|
|
5
|
-
and cross-links to the relevant [API reference](../api/index.md).
|
|
6
|
-
|
|
7
|
-
New here? Read the [Quick Start](../quickstart.md) first, then come back for
|
|
8
|
-
the in-depth version.
|
|
9
|
-
|
|
10
|
-
## What's covered
|
|
11
|
-
|
|
12
|
-
- **Core workflow** — open a process, read/write values, and find addresses by
|
|
13
|
-
value or byte pattern. This is the classic Cheat Engine loop.
|
|
14
|
-
- **Inspecting the process** — enumerate memory regions, loaded modules and
|
|
15
|
-
threads.
|
|
16
|
-
- **Pointers** — walk pointer chains you know, and reverse-scan to discover the
|
|
17
|
-
chains that survive a restart.
|
|
18
|
-
- **Advanced** — reserve and release memory inside the target.
|
|
19
|
-
|
|
20
|
-
For diagnostics, see [Logging](logging.md) in the Reference section.
|
|
21
|
-
|
|
22
|
-
```{toctree}
|
|
23
|
-
:caption: Core workflow
|
|
24
|
-
:maxdepth: 1
|
|
25
|
-
|
|
26
|
-
opening-process
|
|
27
|
-
read-write
|
|
28
|
-
searching
|
|
29
|
-
pattern-scan
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
```{toctree}
|
|
33
|
-
:caption: Inspecting the process
|
|
34
|
-
:maxdepth: 1
|
|
35
|
-
|
|
36
|
-
memory-regions
|
|
37
|
-
modules-threads
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
```{toctree}
|
|
41
|
-
:caption: Pointers
|
|
42
|
-
:maxdepth: 1
|
|
43
|
-
|
|
44
|
-
pointers
|
|
45
|
-
pointer-scan
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
```{toctree}
|
|
49
|
-
:caption: Advanced
|
|
50
|
-
:maxdepth: 1
|
|
51
|
-
|
|
52
|
-
allocate-free
|
|
53
|
-
```
|
|
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.0 → pymemoryeditor-3.0.2}/PyMemoryEditor/win32/enums/memory_allocation_states.py
RENAMED
|
File without changes
|
{pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/PyMemoryEditor/win32/enums/memory_protections.py
RENAMED
|
File without changes
|
|
File without changes
|
{pymemoryeditor-3.0.0 → pymemoryeditor-3.0.2}/PyMemoryEditor/win32/enums/process_operations.py
RENAMED
|
File without changes
|
{pymemoryeditor-3.0.0 → 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
|
{pymemoryeditor-3.0.0 → 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
|