基于图像识别的自动化黑盒测试框架 | An automation black-box testing framework based on image recognition
This report summarizes scanner evidence for MaaXYZ/MaaFramework, a C++ project with 5,115 GitHub stars. SynthScan examined 128,168 lines of code across 680 source files, recording 316 pattern matches distributed across 14 syntactic categories. The legacy adjusted pattern signal is 3.8 (Low pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Payload schema: 1.0.0 · Engine: 2.0.0 · Scoring: heuristic-density-v1 · Scan date: 2026-10-31.
Can maintainers explain intent, assumptions, and trade-offs? 213 finding(s).
Are imports declared and package/API names verified? 26 finding(s).
Are wrappers, guards, and repeated structures necessary? 155 finding(s).
Which changes need focused human review? 316 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 316 distinct pattern matches across 14 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tools/ImageCropper/main.py | 49 | # ----------------------------------------------- | COMMENT |
| MEDIUM | tools/ImageCropper/main.py | 143 | # ----------------------------------------------- | COMMENT |
| MEDIUM⚡ | test/python/pipeline_test.py | 105 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | test/python/pipeline_test.py | 107 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | test/python/pipeline_test.py | 2052 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | test/python/pipeline_test.py | 2054 | # ============================================================================ | COMMENT |
| MEDIUM | test/python/pipeline_test.py | 248 | # ============================================================================ | COMMENT |
| MEDIUM | test/python/pipeline_test.py | 250 | # ============================================================================ | COMMENT |
| MEDIUM | test/python/pipeline_test.py | 1284 | # ============================================================================ | COMMENT |
| MEDIUM | test/python/pipeline_test.py | 1286 | # ============================================================================ | COMMENT |
| MEDIUM | test/python/pipeline_test.py | 1330 | # ============================================================================ | COMMENT |
| MEDIUM | test/python/pipeline_test.py | 1332 | # ============================================================================ | COMMENT |
| MEDIUM | test/python/pipeline_test.py | 1360 | # ============================================================================ | COMMENT |
| MEDIUM | test/python/pipeline_test.py | 1362 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | test/python/binding_test.py | 1251 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | test/python/binding_test.py | 1253 | # ============================================================================ | COMMENT |
| MEDIUM | test/python/binding_test.py | 69 | # ============================================================================ | COMMENT |
| MEDIUM | test/python/binding_test.py | 71 | # ============================================================================ | COMMENT |
| MEDIUM | test/python/binding_test.py | 99 | # ============================================================================ | COMMENT |
| MEDIUM | test/python/binding_test.py | 101 | # ============================================================================ | COMMENT |
| MEDIUM | test/python/binding_test.py | 268 | # ============================================================================ | COMMENT |
| MEDIUM | test/python/binding_test.py | 270 | # ============================================================================ | COMMENT |
| MEDIUM | test/python/binding_test.py | 432 | # ============================================================================ | COMMENT |
| MEDIUM | test/python/binding_test.py | 434 | # ============================================================================ | COMMENT |
| MEDIUM | test/python/binding_test.py | 513 | # ============================================================================ | COMMENT |
| MEDIUM | test/python/binding_test.py | 515 | # ============================================================================ | COMMENT |
| MEDIUM | test/python/binding_test.py | 584 | # ============================================================================ | COMMENT |
| MEDIUM | test/python/binding_test.py | 586 | # ============================================================================ | COMMENT |
| MEDIUM | test/python/binding_test.py | 731 | # ============================================================================ | COMMENT |
| MEDIUM | test/python/binding_test.py | 733 | # ============================================================================ | COMMENT |
| MEDIUM | test/python/binding_test.py | 1088 | # ============================================================================ | COMMENT |
| MEDIUM | test/python/binding_test.py | 1090 | # ============================================================================ | COMMENT |
| MEDIUM | test/agent/agent_child_test.py | 89 | # ============================================================ | COMMENT |
| MEDIUM | test/agent/agent_child_test.py | 91 | # ============================================================ | COMMENT |
| MEDIUM | test/agent/agent_child_test.py | 171 | # ============================================================ | COMMENT |
| MEDIUM | test/agent/agent_child_test.py | 173 | # ============================================================ | COMMENT |
| MEDIUM | test/agent/agent_child_test.py | 192 | # ============================================================ | COMMENT |
| MEDIUM | test/agent/agent_child_test.py | 194 | # ============================================================ | COMMENT |
| MEDIUM | test/agent/agent_child_test.py | 262 | # ============================================================ | COMMENT |
| MEDIUM | test/agent/agent_child_test.py | 264 | # ============================================================ | COMMENT |
| MEDIUM | test/agent/agent_child_test.py | 322 | # ============================================================ | COMMENT |
| MEDIUM | test/agent/agent_child_test.py | 324 | # ============================================================ | COMMENT |
| MEDIUM | test/agent/agent_child_test.py | 356 | # ============================================================ | COMMENT |
| MEDIUM | test/agent/agent_child_test.py | 358 | # ============================================================ | COMMENT |
| MEDIUM | test/agent/agent_child_test.py | 496 | # ============================================================================ | COMMENT |
| MEDIUM | test/agent/agent_child_test.py | 498 | # ============================================================================ | COMMENT |
| MEDIUM | test/agent/agent_main_test.py | 50 | # ============================================================ | COMMENT |
| MEDIUM | test/agent/agent_main_test.py | 52 | # ============================================================ | COMMENT |
| MEDIUM | test/agent/agent_main_test.py | 76 | # ============================================================ | COMMENT |
| MEDIUM | test/agent/agent_main_test.py | 78 | # ============================================================ | COMMENT |
| MEDIUM | test/agent/agent_main_test.py | 101 | # ============================================================ | COMMENT |
| MEDIUM | test/agent/agent_main_test.py | 103 | # ============================================================ | COMMENT |
| MEDIUM | test/agent/agent_main_test.py | 121 | # ============================================================ | COMMENT |
| MEDIUM | test/agent/agent_main_test.py | 123 | # ============================================================ | COMMENT |
| MEDIUM | test/agent/agent_tcp_main_test.py | 197 | # ============================================================ | COMMENT |
| MEDIUM | test/agent/agent_tcp_main_test.py | 199 | # ============================================================ | COMMENT |
| MEDIUM | test/agent/agent_tcp_main_test.py | 217 | # ============================================================ | COMMENT |
| MEDIUM | test/agent/agent_tcp_main_test.py | 219 | # ============================================================ | COMMENT |
| MEDIUM⚡ | test/agent/agent_tcp_main_test.py | 294 | # ============================================================ | COMMENT |
| MEDIUM⚡ | test/agent/agent_tcp_main_test.py | 296 | # ============================================================ | COMMENT |
| 2 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | test/pipeline/module/RunWithoutFile.cpp | 1 | #include "RunWithoutFile.h" | COMMENT |
| LOW | test/pipeline/module/PostStopInterrupt.cpp | 1 | #include "PostStopInterrupt.h" | COMMENT |
| LOW | test/linux_test/portal_fd_test.cpp | 1 | #include <atomic> | COMMENT |
| LOW | include/MaaToolkit/MaaToolkitAPI.h | 1 | #pragma once | COMMENT |
| LOW | include/MaaControlUnit/MaaControlUnitAPI.h | 1 | #pragma once | COMMENT |
| LOW | include/MaaFramework/MaaDef.h | 81 | /// value: string, eg: "C:\\Users\\Administrator\\Desktop\\log"; val_size: string length | COMMENT |
| LOW | include/MaaFramework/MaaDef.h | 101 | COMMENT | |
| LOW | include/MaaFramework/MaaDef.h | 161 | // used to be a coreml_flag from | COMMENT |
| LOW | include/MaaFramework/MaaDef.h | 181 | // MaaResOption_InferenceDevice: CPU / Auto -> NCNN CPU; GPU is not supported yet, other values fail the loading. | COMMENT |
| LOW | include/MaaFramework/MaaDef.h | 221 | COMMENT | |
| LOW | include/MaaFramework/MaaDef.h | 241 | /// | COMMENT |
| LOW | include/MaaFramework/MaaDef.h | 261 | COMMENT | |
| LOW | include/MaaFramework/MaaDef.h | 381 | */ | COMMENT |
| LOW | include/MaaFramework/MaaDef.h | 441 | * A minimized target must be restored before input. Screencap methods with pseudo-minimize do | COMMENT |
| LOW | include/MaaFramework/MaaDef.h | 581 | * | 0x0020 | SHARE | BACK | Share button | | COMMENT |
| LOW | include/MaaFramework/MaaDef.h | 601 | #define MaaGamepadButton_DPAD_RIGHT 0x0008 | COMMENT |
| LOW | include/MaaFramework/MaaPort.h | 1 | #pragma once | COMMENT |
| LOW | include/MaaFramework/MaaPort.h | 21 | #define MAA_DLL_IMPORT | COMMENT |
| LOW | include/MaaFramework/MaaPort.h | 41 | #else | COMMENT |
| LOW | source/MaaToolkit/Portal/PortalHelper.cpp | 21 | static constexpr int kDBusCallTimeoutMs = 10000; | COMMENT |
| LOW | source/MaaToolkit/API/MaaToolkitDesktopWindow.cpp | 1 | #include "MaaToolkit/DesktopWindow/MaaToolkitDesktopWindow.h" | COMMENT |
| LOW | source/MaaToolkit/Gamescope/GamescopeFinder.cpp | 1 | #if defined(__linux__) && !defined(ANDROID) | COMMENT |
| LOW | …aaToolkit/Gamescope/Protocol/gamescope-pipewire-priv.c | 21 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | COMMENT |
| LOW | source/MaaToolkit/AdbDevice/AdbDeviceFinder.h | 1 | #pragma once | COMMENT |
| LOW | source/include/Utils/VkToEvdev.h | 1 | #pragma once | COMMENT |
| LOW | source/include/Common/Conf.h | 21 | #define MAA_CTRL_NS MAA_NS::ControllerNS | COMMENT |
| LOW | source/include/MaaAgent/Transceiver.h | 1 | #pragma once | COMMENT |
| LOW | source/MaaRecordControlUnit/RecordController.h | 1 | #pragma once | COMMENT |
| LOW | source/MaaAgentClient/Client/AgentClient.cpp | 1 | #include "AgentClient.h" | COMMENT |
| LOW | source/binding/NodeJS/src/apis/index-server.d.ts | 1 | /// <reference path="./constant.d.ts" /> | COMMENT |
| LOW | source/binding/NodeJS/src/apis/client.h | 1 | #pragma once | COMMENT |
| LOW | source/binding/NodeJS/src/apis/resource.cpp | 121 | else if (provider == "WebGPU") { | COMMENT |
| LOW | source/binding/NodeJS/src/apis/controller.cpp | 1 | #include "controller.h" | COMMENT |
| LOW | source/binding/NodeJS/src/apis/index-client.d.ts | 1 | /// <reference path="./client.d.ts" /> | COMMENT |
| LOW | source/binding/NodeJS/src/plugin/runtime.cpp | 1 | #include "runtime.h" | COMMENT |
| LOW | source/binding/NodeJS/src/foundation/spec.h | 1 | #pragma once | COMMENT |
| LOW | source/binding/NodeJS/src/foundation/spec/async.h | 1 | #pragma once | COMMENT |
| LOW | source/binding/NodeJS/src/foundation/spec/class.h | 1 | #pragma once | COMMENT |
| LOW | source/binding/NodeJS/src/foundation/spec/callback.h | 1 | #pragma once | COMMENT |
| LOW | …e/binding/NodeJS/src/foundation/spec/quickjs/wrapper.h | 1 | #pragma once | COMMENT |
| LOW | source/binding/Python/pyproject.toml | 41 | reportMissingTypeStubs = "none" | COMMENT |
| LOW | source/binding/Python/maa/define.py | 201 | # is true. value: bool, eg: true; val_size: sizeof(bool) | COMMENT |
| LOW | source/binding/Python/maa/define.py | 241 | # Only one of long and short side can be set, and the other is automatically scaled according to | COMMENT |
| LOW | source/binding/Python/maa/define.py | 261 | MouseLockFollow = 4 | COMMENT |
| LOW | source/binding/Python/maa/define.py | 321 | # MaaResOption_InferenceDevice is the WebGPU device id. Auto uses device 0. | COMMENT |
| LOW | source/MaaLinuxControlUnit/Input/VkToEvdev.h | 1 | #pragma once | COMMENT |
| LOW | source/MaaLinuxControlUnit/Input/UInput.h | 1 | #pragma once | COMMENT |
| LOW | …inuxControlUnit/Wayland/Protocol/wlr-screencopy-priv.c | 21 | * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | COMMENT |
| LOW | …ontrolUnit/Wayland/Protocol/wlr-virtual-pointer-priv.c | 21 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | COMMENT |
| LOW | …inuxControlUnit/Wayland/Protocol/wlr-virtual-pointer.h | 101 | #endif /* ZWLR_VIRTUAL_POINTER_V1_ERROR_ENUM */ | COMMENT |
| LOW | …ce/MaaLinuxControlUnit/Screencap/PipeWireScreencap.cpp | 1 | #include "PipeWireScreencap.h" | COMMENT |
| LOW | …ce/MaaLinuxControlUnit/Screencap/PipeWireScreencap.cpp | 21 | #include <spa/param/video/raw.h> | COMMENT |
| LOW | source/AgentCommon/Transceiver.cpp | 1 | #include "MaaAgent/Transceiver.h" | COMMENT |
| LOW | source/MaaFramework/Vision/OCRer.h | 1 | #pragma once | COMMENT |
| LOW | source/MaaFramework/Vision/NeuralNetworkDetector.cpp | 1 | #include "NeuralNetworkDetector.h" | COMMENT |
| LOW | source/MaaFramework/Vision/OCRSession.h | 1 | #pragma once | COMMENT |
| LOW | source/MaaFramework/Vision/VisionUtils.hpp | 1 | #pragma once | COMMENT |
| LOW | source/MaaFramework/Controller/ControllerAgent.h | 1 | #pragma once | COMMENT |
| LOW | source/MaaFramework/Task/PipelineTask.cpp | 1 | #include "PipelineTask.h" | COMMENT |
| LOW | source/MaaFramework/Task/TaskBase.h | 1 | #pragma once | COMMENT |
| 48 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tools/check_interface_schema.py | 24 | def declared_importable_fields(main_schema): | CODE |
| LOW | tools/check_interface_schema.py | 49 | def accepted_top_level_fields(import_schema): | CODE |
| LOW | tools/migrate_pipeline_v5.py | 47 | def remove_jsonc_comments_for_parsing(text: str) -> str: | CODE |
| LOW | tools/migrate_pipeline_v5.py | 199 | def rebuild_json_with_comments( | CODE |
| LOW | tools/migrate_pipeline_v5.py | 501 | def add_prefix_to_specific_nodes(nodes: list, target_nodes: set, prefix: str) -> list: | CODE |
| LOW | tools/ImageCropper/colormatcher.py | 70 | def __count_non_zero_with_connected(bin): | CODE |
| LOW | tools/ImageCropper/main.py | 26 | def set_screenshot_target_side(c: Controller): | CODE |
| LOW | tools/ImageCropper/main.py | 316 | def get_amplified_roi_rectangle(roi: Roimage) -> list[int]: | CODE |
| LOW⚡ | test/python/pipeline_test.py | 110 | def test_resource_get_node_data(resource: Resource): | CODE |
| LOW⚡ | test/python/pipeline_test.py | 315 | def _test_context_get_node_data(self, context: Context): | CODE |
| LOW⚡ | test/python/pipeline_test.py | 324 | def _test_context_get_node_object(self, context: Context): | CODE |
| LOW⚡ | test/python/pipeline_test.py | 332 | def _test_context_override_pipeline(self, context: Context): | CODE |
| LOW⚡ | test/python/pipeline_test.py | 1547 | def test_default_directhit_box_stays_empty(self): | CODE |
| LOW⚡ | test/python/pipeline_test.py | 1557 | def test_targets_after_failed_screenshot(self): | CODE |
| LOW⚡ | test/python/pipeline_test.py | 1566 | def test_previous_node_and_anchor_without_screenshot(self): | CODE |
| LOW⚡ | test/python/pipeline_test.py | 1645 | def test_direct_action_without_screenshot(self): | CODE |
| LOW⚡ | test/python/pipeline_test.py | 1652 | def test_input_scaling_remains_lazy(self): | CODE |
| LOW⚡ | test/python/pipeline_test.py | 1659 | def test_screencap_without_cached_image(self): | CODE |
| LOW⚡ | test/python/pipeline_test.py | 2057 | def create_test_pipeline_resource(resource_dir: Path): | CODE |
| LOW | test/python/pipeline_test.py | 130 | def test_resource_get_node_object(resource: Resource): | CODE |
| LOW | test/python/pipeline_test.py | 160 | def test_and_sub_recognition_dumper_roundtrip(): | CODE |
| LOW | test/python/pipeline_test.py | 212 | def test_color_match_dumper_roundtrip(): | CODE |
| LOW | test/python/pipeline_test.py | 393 | def _test_context_override_next(self, context: Context): | CODE |
| LOW | test/python/pipeline_test.py | 427 | def _test_and_or_override_inheritance(self, context: Context): | CODE |
| LOW | test/python/pipeline_test.py | 497 | def _test_and_or_node_reference(self, context: Context): | CODE |
| LOW | test/python/pipeline_test.py | 1082 | def _test_anchor_object_format(self, context: Context): | CODE |
| LOW | test/python/pipeline_test.py | 1244 | def _test_context_vs_resource(self, context: Context): | CODE |
| LOW | test/python/pipeline_test.py | 1505 | def test_custom_without_screenshot(self): | CODE |
| LOW | test/python/pipeline_test.py | 1522 | def test_no_controller_uses_same_target_semantics(self): | CODE |
| LOW | test/python/pipeline_test.py | 1587 | def test_cached_image_normalization_is_preserved(self): | CODE |
| LOW | test/python/pipeline_test.py | 1606 | def test_input_actions_without_screenshot(self): | CODE |
| LOW | test/python/pipeline_test.py | 1670 | def test_screencap_reuses_cached_image(self): | CODE |
| LOW | test/python/pipeline_test.py | 1679 | def test_command_image_without_cache_and_reuses_cache(self): | CODE |
| LOW | test/python/pipeline_test.py | 1706 | def test_command_without_image_does_not_capture(self): | CODE |
| LOW | test/python/pipeline_test.py | 1723 | def test_image_actions_fail_when_capture_fails(self): | CODE |
| LOW | test/python/pipeline_test.py | 1754 | def test_direct_screencap_action_without_cache(self): | CODE |
| LOW | test/python/pipeline_test.py | 1793 | def test_wait_freezes_resolves_target_after_capture(self): | CODE |
| LOW | test/python/pipeline_test.py | 1813 | def test_wait_freezes_uses_new_image_size(self): | CODE |
| LOW | test/python/pipeline_test.py | 1819 | def test_wait_freezes_reresolves_roi_when_screenshot_size_changes(self): | CODE |
| LOW | test/python/pipeline_test.py | 1861 | def test_wait_freezes_empty_self_and_invalid_targets(self): | CODE |
| LOW | test/python/pipeline_test.py | 1870 | def test_pipeline_wait_freezes_phases(self): | CODE |
| LOW | test/python/pipeline_test.py | 1895 | def test_mixed_next_still_captures(self): | CODE |
| LOW | test/python/pipeline_test.py | 1921 | def run_directhit_target_tests(): | CODE |
| LOW | test/python/pipeline_test.py | 1928 | def test_negative_roi_and_target(context: Context): | CODE |
| LOW⚡ | test/python/binding_test.py | 1256 | def test_binding_init_thread_safety(): | CODE |
| LOW | test/python/binding_test.py | 885 | def _new_command_image_tasker() -> Tasker: | CODE |
| LOW | test/python/binding_test.py | 917 | def test_command_image_placeholder(): | CODE |
| LOW | test/python/binding_test.py | 986 | def test_template_override_across_bundles(): | CODE |
| LOW | test/python/binding_test.py | 1057 | def test_shell_api_declarations(): | CODE |
| LOW | test/python/binding_test.py | 1114 | def test_background_managed_keys_api(): | CODE |
| LOW | test/python/binding_test.py | 1205 | def test_kwin_controller_create(): | CODE |
| LOW | test/agent/agent_test_utils.py | 201 | def assert_stale_response_dropped(agent, tasker, report_file: Path) -> None: | CODE |
| LOW | test/agent/agent_test_utils.py | 218 | def assert_nested_response_kept(agent, tasker, report_file: Path) -> None: | CODE |
| LOW | test/agent/agent_tcp_main_test.py | 95 | def run_inactive_response_id_test(agent: AgentClient, socket_id: str, tasker: Tasker): | CODE |
| LOW | test/agent/agent_tcp_main_test.py | 263 | def run_numeric_identifier_flow(): | CODE |
| LOW | test/agent/agent_tcp_main_test.py | 269 | def run_numeric_identifier_flow_with_retry(max_attempts: int = 5): | CODE |
| LOW | source/binding/Python/maa/controller.py | 282 | def set_background_managed_keys(self, keys: Sequence[int]) -> bool: | CODE |
| LOW | source/binding/Python/maa/controller.py | 463 | def set_screenshot_target_long_side(self, long_side: int) -> bool: | CODE |
| LOW | source/binding/Python/maa/controller.py | 482 | def set_screenshot_target_short_side(self, short_side: int) -> bool: | CODE |
| LOW | source/binding/Python/maa/controller.py | 501 | def set_screenshot_target_expand(self, width: int, height: int) -> bool: | CODE |
| 18 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | source/binding/Python/maa/agent_client.py | 65 | 创建使用 TCP 连接的 Agent 客户端 / Create Agent client with TCP connection 客户端会监听 127.0.0.1 上的指定端口。如果传入 0 则自动选择可用端口。 | STRING |
| HIGH | source/binding/Python/maa/resource.py | 392 | 自定义识别器装饰器 / Custom recognition decorator Args: name: 识别器名称,需与 Pipeline 中的 custom_recognition 字段匹配 | STRING |
| HIGH | source/binding/Python/maa/resource.py | 479 | 自定义动作装饰器 / Custom action decorator Args: name: 动作名称,需与 Pipeline 中的 custom_action 字段匹配 A | STRING |
| HIGH | source/binding/Python/maa/buffer.py | 265 | 校验并归一化为三通道 BGR / Validate and normalize to three-channel BGR MaaFramework 的识别链路按 OpenCV 约定只接受三通道 BGR 图像(模板匹配要求图像与模板 | STRING |
| HIGH | source/binding/Python/maa/buffer.py | 360 | 设置图像数据 / Set image data Args: value: 图像数据,dtype 必须为 uint8。支持单通道 (height, width) 或 ( | STRING |
| HIGH | source/binding/Python/maa/buffer.py | 658 | 设置矩形数据 / Set rectangle data Args: value: 矩形数据,可以是 Rect、tuple、list 或 numpy.ndarray Recta | STRING |
| HIGH | source/binding/Python/maa/agent/agent_server.py | 39 | 自定义识别器装饰器 / Custom recognition decorator Args: name: 识别器名称,需与 Pipeline 中的 custom_recognition 字段匹配 | STRING |
| HIGH | source/binding/Python/maa/agent/agent_server.py | 101 | 自定义动作装饰器 / Custom action decorator Args: name: 动作名称,需与 Pipeline 中的 custom_action 字段匹配 A | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tools/pip_pack/pip_pack.py | 1 | CODE | |
| LOW | tools/ImageCropper/roi.py | 1 | CODE | |
| LOW | tools/ImageCropper/roimage.py | 1 | CODE | |
| LOW | test/python/pipeline_test.py | 50 | CODE | |
| LOW | test/python/pipeline_test.py | 52 | CODE | |
| LOW | test/python/pipeline_test.py | 52 | CODE | |
| LOW | test/agent/agent_tcp_child_test.py | 9 | CODE | |
| LOW | source/binding/Python/maa/custom_recognition.py | 11 | CODE | |
| LOW | source/binding/Python/maa/agent_client.py | 6 | CODE | |
| LOW | source/binding/Python/maa/controller.py | 16 | CODE | |
| LOW | source/binding/Python/maa/toolkit.py | 7 | CODE | |
| LOW | source/binding/Python/maa/library.py | 7 | CODE | |
| LOW | source/binding/Python/maa/tasker.py | 12 | CODE | |
| LOW | source/binding/Python/maa/tasker.py | 20 | CODE | |
| LOW | source/binding/Python/maa/job.py | 4 | CODE | |
| LOW | source/binding/Python/maa/resource.py | 11 | CODE | |
| LOW | source/binding/Python/maa/custom_action.py | 8 | CODE | |
| LOW | source/binding/Python/maa/context.py | 10 | CODE | |
| LOW | source/binding/Python/maa/buffer.py | 7 | CODE | |
| LOW | source/binding/Python/maa/agent/agent_server.py | 4 | CODE | |
| LOW | source/binding/Python/maa/agent/agent_server.py | 9 | CODE | |
| LOW | source/binding/Python/maa/agent/agent_server.py | 10 | CODE | |
| LOW | source/binding/Python/maa/agent/agent_server.py | 11 | CODE | |
| LOW | source/binding/Python/maa/agent/agent_server.py | 12 | CODE | |
| LOW | source/binding/Python/maa/agent/agent_server.py | 13 | CODE | |
| LOW | source/binding/Python/maa/agent/agent_server.py | 14 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tools/migrate_pipeline_v5.py | 47 | CODE | |
| LOW | tools/migrate_pipeline_v5.py | 101 | CODE | |
| LOW | tools/migrate_pipeline_v5.py | 199 | CODE | |
| LOW | tools/migrate_pipeline_v5.py | 512 | CODE | |
| LOW | tools/analyze_log.py | 34 | CODE | |
| LOW | tools/FormatCode/format_cpp.py | 110 | CODE | |
| LOW | tools/ImageCropper/main.py | 67 | CODE | |
| LOW | test/agent/agent_test_utils.py | 234 | CODE | |
| LOW | source/binding/Python/maa/define.py | 1334 | CODE | |
| LOW | source/binding/Python/maa/context.py | 724 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | test/python/binding_test.py | 568 | except TypeError: | CODE |
| HIGH | test/python/binding_test.py | 576 | except ValueError: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tools/migrate_pipeline_v5.py | 631 | except Exception as e: | CODE |
| LOW | tools/migrate_pipeline_v5.py | 717 | except Exception as e: | CODE |
| LOW | tools/analyze_log.py | 67 | except Exception as e: | CODE |
| LOW | tools/FormatCode/format_cpp.py | 106 | except Exception as e: | CODE |
| LOW | test/python/pipeline_test.py | 268 | except Exception as e: | CODE |
| LOW | test/python/binding_test.py | 1279 | except Exception: | STRING |
| LOW | test/agent/agent_test_utils.py | 63 | except Exception: | CODE |
| LOW | test/agent/agent_test_utils.py | 94 | except Exception: | CODE |
| LOW | source/binding/Python/maa/controller.py | 1676 | except Exception: | CODE |
| MEDIUM | source/binding/Python/maa/controller.py | 1017 | def _set_android_native_api_properties(self): | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | sample/cpp/main.cpp | 220 | // Step 1: output box | COMMENT |
| LOW⚡ | sample/cpp/main.cpp | 224 | // Step 2: output anything you want | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | sample/cpp/main.cpp | 220 | // Step 1: output box | COMMENT |
| LOW⚡ | sample/cpp/main.cpp | 224 | // Step 2: output anything you want | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | source/binding/Python/maa/define.py | 615 | # No bitwise OR, just set it | COMMENT |
| LOW | sample/python/demo1.py | 35 | # for demo, we just use the first device | COMMENT |
| LOW | sample/python/demo1.py | 54 | hwnd=all_windows[0].hwnd, # for demo, we just use the first Window | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | source/binding/Python/maa/controller.py | 21 | __all__ = [ | CODE |
| LOW | source/binding/Python/maa/library.py | 207 | def _set_api_properties(cls) -> None: | CODE |
| LOW | source/binding/Python/maa/define.py | 11 | __all__ = [ | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | sample/cpp/main.cpp | 232 | // don't forget to return true! | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | source/binding/Python/maa/context.py | 45 | def run_task(self, entry: str, pipeline_override: Optional[dict[str, Any]] = None) -> Optional[TaskDetail]: | CODE |