@@ -20,13 +20,13 @@ iOS(WebDriverAgent)。核心能力是滑鼠/鍵盤控制、影像辨識、
2020| 指標 | 數值 |
2121| --- | ---: |
2222| Python 模組總數(含周邊子專案) | 1,215 |
23- | 程式碼總行數 | 181,185 |
23+ | 程式碼總行數 | 181,186 |
2424| ` je_auto_control/utils/ ` 子套件數 | 311 |
2525| ` AC_* ` 動作指令數(` known_commands() ` 實測) | 810 |
2626| 套件門面 ` __all__ ` 公開名稱數 | 1377 |
2727| GUI 分頁數(` main_widget ` 註冊) | 49 |
2828| MCP 工具數(` build_default_tool_registry() ` 實測) | 710 |
29- | ` test_*.py ` 測試檔/測試函式 | 836 / 8,743 |
29+ | ` test_*.py ` 測試檔/測試函式 | 837 / 8,748 |
3030| 範例腳本 | 42 |
3131
3232** 技術基線** :Python ≥ 3.10、MIT 授權、必要相依只有 ` je_open_cv ` /` opencv-python ` /` pillow ` /` mss ` /
@@ -234,7 +234,7 @@ socket server 有 8 MiB 讀取上限與 30 秒 handler timeout。
234234| ` uinput/keyboard.py ` | 44 | uinput 鍵盤後端,介面與 X11 版一致。 |
235235| ` uinput/mouse.py ` | 130 | uinput 滑鼠後端。 |
236236
237- #### Linux Wayland(` linux_wayland/ ` ,18 檔/3,138 行)
237+ #### Linux Wayland(` linux_wayland/ ` ,18 檔/3,139 行)
238238
239239| 模組 | 行數 | 職責 |
240240| --- | ---: | --- |
@@ -246,7 +246,7 @@ socket server 有 8 MiB 讀取上限與 30 秒 handler timeout。
246246| ` _select_input.py ` | 103 | 決定使用原生 libei 或 CLI shim;` active_backend() ` 是 keyboard/mouse 的唯一入口,` emitted() ` 僅容許未分類的選用後端缺席退回 CLI;明確原生選擇、權限/裝置/協定拒絕保持失敗。 |
247247| ` _layout.py ` | 83 | 版面原點的共用查詢。擷取與輸入不是同一個座標空間,差的就是這個原點: libei 的 region offset 是 ` uint32 ` (描述不了負原點),` ydotool mousemove --absolute ` 的原點是合成器夾取的那個角落——兩條路都要減掉它,所以放在這裡而不是各自複製。讀數快取一秒——擷取那一側刻意不快取,但 ydotool 每次絕對移動都會問,不快取等於每次移動多開一個 ` wlr-randr ` 行程。 |
248248| ` oeffis.py ` | 214 | liboeffis 綁定:跑完 RemoteDesktop portal 交握,交出 EIS fd;請求後的拒絕/逾時/失敗保留明確狀態。 |
249- | ` libei.py ` | 730 | libei 綁定、撤銷閂鎖與只快取中繼資料的失敗狀態;完整握手(seat 綁定能力 → 由事件取得 device → start_emulating → 每次發送後 frame)。另負責絕對指標的座標空間:讀回裝置的 region,把版面座標映射進去,沒有任何 region 涵蓋就拒絕(libei 對這種移動是靜靜丟掉的 )。 快取觀測不讀事件,完整就緒涵蓋全部請求的事件種類。 |
249+ | ` libei.py ` | 731 | libei 綁定、撤銷閂鎖與只快取中繼資料的失敗狀態;完整握手(seat 綁定能力 → 由事件取得 device → start_emulating → 每次發送後 frame)。另負責絕對指標的座標空間:讀回裝置的 region,把版面座標映射進去,沒有任何 region 涵蓋就以 failed 拒絕,停止隱含 CLI 備援與後續點擊(不撤銷 sender )。 快取觀測不讀事件,完整就緒涵蓋全部請求的事件種類。 |
250250| ` mouse.py ` | 387 | 滑鼠後端:移動、按鈕與捲動都 libei 優先,僅選用缺席時退回 ydotool;權限/裝置拒絕不重送;送往 libei 時垂直捲動軸取負(kernel ` REL_WHEEL ` 與 ` wl_pointer ` 正負號相反)。退到 ydotool 的絕對移動會先減掉版面原點(` --absolute ` 是相對於版面左上角,不是版面座標的 ` (0, 0) ` ),並依 ` pointer_accel_mode() ` 處理指標加速度——倍率讀不回來,只有操作者知道,所以由 ` JE_AUTOCONTROL_WAYLAND_POINTER_ACCEL ` 宣告:未設定=每個行程警告一次後照送、` flat ` =已關掉加速度故靜靜送出、` strict ` =拒絕這次移動。 |
251251| ` keyboard.py ` | 206 | 鍵盤後端:按鍵/組合鍵 libei 優先,權限拒絕不改走 CLI;中斷時逐一釋放原後端已按下的鍵。文字仍用 wtype。 |
252252| ` keymap.py ` | 155 | 友善鍵名 → evdev key code。 |
@@ -1161,7 +1161,7 @@ GUI 是**選用 extra**(`pip install je_auto_control[gui]`,只需要 PySide6
11611161| ` scripts/dev_release.py ` | 只用標準函式庫的發佈輔助腳本 | dev 通道(PyPI 的 ` je_auto_control_dev ` )的版本與比對:` prepare ` 把 ` dev.toml ` 寫成 ` pyproject.toml ` ,版本取 PyPI 最新一版加一個 patch(` dev.toml ` 的版本只是下限,不回寫 repo);` changed dist ` 把建好的 wheel 跟 PyPI 最新一版逐檔比對,內容沒變就不上傳。只給 ` dev.yml ` 的 ` publish-dev ` job 與拋棄式的 checkout 用,因為 ` prepare ` 會蓋掉 ` pyproject.toml ` 。 |
11621162| ` docs/ ` | Sphinx(` API ` /` Eng ` /` Zh ` /` getting_started ` ) | Read the Docs 文件。 |
11631163| ` architecture_diagram/ ` | drawio + png | 既有的架構圖原始檔。 |
1164- | ` test/ ` | ` unit_test/headless ` (主要)、` unit_test/flow_control ` 、` integrated_test ` 、` gui_test ` 、` manual_test ` 、` verify ` 、` test_source ` | 836 個 ` test_*.py ` /8,743 個測試函式。** 注意** :` test/unit_test/ ` 下的 ` *_test.py ` 是會真的驅動滑鼠鍵盤的手動示範腳本,因此 ` pyproject.toml ` 把 ` python_files ` 釘成 ` test_*.py ` 。` unit_test/headless/conftest.py ` 有一個 autouse fixture,每個測試結束都沖掉 Qt 排隊中的 ` deleteLater() ` ——不沖會讓殘留的 widget 在後面某個不相干的測試裡被銷毀,曾經整個直譯器 ` __fastfail ` 。` test_doc_counts.py ` 守住文件引用的指令/工具/子套件/範例數,` test_doc_line_counts.py ` 守住所有行數(` --fix ` 可一次重新產生)。 ` verify/macos_verify.py ` 是在真的 ` macos-14 ` runner 上量測 TCC 到底允許什麼的探針(macOS 是唯一沒有容器可用的支援平台),不被 pytest 收集。 |
1164+ | ` test/ ` | ` unit_test/headless ` (主要)、` unit_test/flow_control ` 、` integrated_test ` 、` gui_test ` 、` manual_test ` 、` verify ` 、` test_source ` | 837 個 ` test_*.py ` /8,748 個測試函式。** 注意** :` test/unit_test/ ` 下的 ` *_test.py ` 是會真的驅動滑鼠鍵盤的手動示範腳本,因此 ` pyproject.toml ` 把 ` python_files ` 釘成 ` test_*.py ` 。` unit_test/headless/conftest.py ` 有一個 autouse fixture,每個測試結束都沖掉 Qt 排隊中的 ` deleteLater() ` ——不沖會讓殘留的 widget 在後面某個不相干的測試裡被銷毀,曾經整個直譯器 ` __fastfail ` 。` test_doc_counts.py ` 守住文件引用的指令/工具/子套件/範例數,` test_doc_line_counts.py ` 守住所有行數(` --fix ` 可一次重新產生)。 ` verify/macos_verify.py ` 是在真的 ` macos-14 ` runner 上量測 TCC 到底允許什麼的探針(macOS 是唯一沒有容器可用的支援平台),不被 pytest 收集。 |
11651165
11661166---
11671167
@@ -1255,7 +1255,7 @@ socket 預設綁 `127.0.0.1`;資源一律用 `with`。
12551255| ` utils/rest_api/ ` | 8 | 2,064 |
12561256| ` utils/agent/ ` | 9 | 2,142 |
12571257| ` linux_with_x11/ ` | 19 | 1,281 |
1258- | ` linux_wayland/ ` | 18 | 3,138 |
1258+ | ` linux_wayland/ ` | 18 | 3,139 |
12591259| ` utils/triggers/ ` | 4 | 1,401 |
12601260| ` utils/ocr/ ` | 10 | 1,381 |
12611261| ` utils/usbip/ ` | 5 | 1,008 |
@@ -1264,5 +1264,5 @@ socket 預設綁 `127.0.0.1`;資源一律用 `with`。
12641264| ` autocontrol-lsp/ ` | 8 | 744 |
12651265| ` utils/hotkey/ ` | 7 | 861 |
12661266| 其餘模組(約 286 個 ` utils/ ` 子套件 + ` android/ ` /` ios/ ` /周邊小工具) | 794 | 71,242 |
1267- | ** 總計** | ** 1,208** | ** 181,098 ** |
1267+ | ** 總計** | ** 1,208** | ** 181,099 ** |
12681268
0 commit comments