ok-script 2.0.17__tar.gz → 2.0.19__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.
Files changed (398) hide show
  1. {ok_script-2.0.17 → ok_script-2.0.19}/.agents/skills/develop/SKILL.md +9 -1
  2. {ok_script-2.0.17 → ok_script-2.0.19}/.agents/skills/generate-templates/SKILL.md +17 -1
  3. ok_script-2.0.19/.agents/skills/setup-env/SKILL.md +76 -0
  4. ok_script-2.0.19/.agents/skills/setup-env/assets/ok-script-develop/SKILL.md +84 -0
  5. ok_script-2.0.19/.agents/skills/setup-project/SKILL.md +115 -0
  6. {ok_script-2.0.17 → ok_script-2.0.19}/.agents/skills/write-test/SKILL.md +10 -1
  7. {ok_script-2.0.17 → ok_script-2.0.19}/MANIFEST.in +1 -0
  8. {ok_script-2.0.17 → ok_script-2.0.19}/PKG-INFO +10 -1
  9. {ok_script-2.0.17 → ok_script-2.0.19}/README.md +8 -0
  10. ok_script-2.0.19/docs/agent-setup.md +108 -0
  11. {ok_script-2.0.17 → ok_script-2.0.19}/docs/feature-crops.md +13 -0
  12. {ok_script-2.0.17 → ok_script-2.0.19}/docs/mcp.md +11 -0
  13. {ok_script-2.0.17 → ok_script-2.0.19}/ok/__init__.py +3 -2
  14. ok_script-2.0.19/ok/assets/default-icon.png +0 -0
  15. {ok_script-2.0.17 → ok_script-2.0.19}/ok/capture/adb/nemu_ipc.py +8 -5
  16. {ok_script-2.0.17 → ok_script-2.0.19}/ok/core/mcp_server.py +8 -0
  17. {ok_script-2.0.17 → ok_script-2.0.19}/ok/core/ui_config.py +8 -0
  18. {ok_script-2.0.17 → ok_script-2.0.19}/ok/device/capture_methods/nemu_ipc.py +10 -3
  19. {ok_script-2.0.17 → ok_script-2.0.19}/ok/util/window.py +4 -0
  20. {ok_script-2.0.17 → ok_script-2.0.19}/ok_script.egg-info/PKG-INFO +10 -1
  21. {ok_script-2.0.17 → ok_script-2.0.19}/ok_script.egg-info/SOURCES.txt +3 -0
  22. {ok_script-2.0.17 → ok_script-2.0.19}/pyproject.toml +4 -0
  23. {ok_script-2.0.17 → ok_script-2.0.19}/setup.py +2 -1
  24. ok_script-2.0.19/tests/test_nemu_ipc_capture.py +84 -0
  25. {ok_script-2.0.17 → ok_script-2.0.19}/tests/test_skills.py +3 -0
  26. {ok_script-2.0.17 → ok_script-2.0.19}/tests/test_ui_config.py +19 -1
  27. ok_script-2.0.17/.agents/skills/setup-env/SKILL.md +0 -36
  28. ok_script-2.0.17/.agents/skills/setup-project/SKILL.md +0 -76
  29. ok_script-2.0.17/tests/test_nemu_ipc_capture.py +0 -40
  30. {ok_script-2.0.17 → ok_script-2.0.19}/.agents/skills/develop/agents/openai.yaml +0 -0
  31. {ok_script-2.0.17 → ok_script-2.0.19}/.agents/skills/develop/references/windows-input.md +0 -0
  32. {ok_script-2.0.17 → ok_script-2.0.19}/.agents/skills/reload-tasks/SKILL.md +0 -0
  33. {ok_script-2.0.17 → ok_script-2.0.19}/.agents/skills/reload-tasks/agents/openai.yaml +0 -0
  34. {ok_script-2.0.17 → ok_script-2.0.19}/.agents/skills/setup-env/agents/openai.yaml +0 -0
  35. {ok_script-2.0.17 → ok_script-2.0.19}/.agents/skills/setup-project/agents/openai.yaml +0 -0
  36. {ok_script-2.0.17 → ok_script-2.0.19}/.agents/skills/use_venv/SKILL.md +0 -0
  37. {ok_script-2.0.17 → ok_script-2.0.19}/.agents/skills/write-test/agents/openai.yaml +0 -0
  38. {ok_script-2.0.17 → ok_script-2.0.19}/LICENSE.txt +0 -0
  39. {ok_script-2.0.17 → ok_script-2.0.19}/diagnostics/qq_trace.py +0 -0
  40. {ok_script-2.0.17 → ok_script-2.0.19}/examples/mcp_observe.py +0 -0
  41. {ok_script-2.0.17 → ok_script-2.0.19}/ok/__main__.py +0 -0
  42. {ok_script-2.0.17 → ok_script-2.0.19}/ok/alas/__init__.py +0 -0
  43. {ok_script-2.0.17 → ok_script-2.0.19}/ok/alas/emulator_base.py +0 -0
  44. {ok_script-2.0.17 → ok_script-2.0.19}/ok/alas/emulator_windows.py +0 -0
  45. {ok_script-2.0.17 → ok_script-2.0.19}/ok/alas/platform_windows.py +0 -0
  46. {ok_script-2.0.17 → ok_script-2.0.19}/ok/alas/utils.py +0 -0
  47. {ok_script-2.0.17 → ok_script-2.0.19}/ok/capture/__init__.py +0 -0
  48. {ok_script-2.0.17 → ok_script-2.0.19}/ok/capture/adb/__init__.py +0 -0
  49. {ok_script-2.0.17 → ok_script-2.0.19}/ok/capture/adb/deep.py +0 -0
  50. {ok_script-2.0.17 → ok_script-2.0.19}/ok/capture/adb/minitouch.py +0 -0
  51. {ok_script-2.0.17 → ok_script-2.0.19}/ok/capture/adb/nemu_utils.py +0 -0
  52. {ok_script-2.0.17 → ok_script-2.0.19}/ok/capture/adb/pool.py +0 -0
  53. {ok_script-2.0.17 → ok_script-2.0.19}/ok/capture/adb/timer.py +0 -0
  54. {ok_script-2.0.17 → ok_script-2.0.19}/ok/capture/adb/util.py +0 -0
  55. {ok_script-2.0.17 → ok_script-2.0.19}/ok/capture/windows/__init__.py +0 -0
  56. {ok_script-2.0.17 → ok_script-2.0.19}/ok/capture/windows/d3d11.py +0 -0
  57. {ok_script-2.0.17 → ok_script-2.0.19}/ok/capture/windows/dump.py +0 -0
  58. {ok_script-2.0.17 → ok_script-2.0.19}/ok/cli.py +0 -0
  59. {ok_script-2.0.17 → ok_script-2.0.19}/ok/core/__init__.py +0 -0
  60. {ok_script-2.0.17 → ok_script-2.0.19}/ok/core/capture_labels.py +0 -0
  61. {ok_script-2.0.17 → ok_script-2.0.19}/ok/core/code_runner.py +0 -0
  62. {ok_script-2.0.17 → ok_script-2.0.19}/ok/core/config_schema.py +0 -0
  63. {ok_script-2.0.17 → ok_script-2.0.19}/ok/core/downloads.py +0 -0
  64. {ok_script-2.0.17 → ok_script-2.0.19}/ok/core/events.py +0 -0
  65. {ok_script-2.0.17 → ok_script-2.0.19}/ok/core/icons.py +0 -0
  66. {ok_script-2.0.17 → ok_script-2.0.19}/ok/core/mcp_runner.py +0 -0
  67. {ok_script-2.0.17 → ok_script-2.0.19}/ok/core/notifications.py +0 -0
  68. {ok_script-2.0.17 → ok_script-2.0.19}/ok/core/plugin_staging.py +0 -0
  69. {ok_script-2.0.17 → ok_script-2.0.19}/ok/core/plugins.py +0 -0
  70. {ok_script-2.0.17 → ok_script-2.0.19}/ok/core/screenshot.py +0 -0
  71. {ok_script-2.0.17 → ok_script-2.0.19}/ok/core/script_editing.py +0 -0
  72. {ok_script-2.0.17 → ok_script-2.0.19}/ok/core/script_packager.py +0 -0
  73. {ok_script-2.0.17 → ok_script-2.0.19}/ok/core/script_templates.py +0 -0
  74. {ok_script-2.0.17 → ok_script-2.0.19}/ok/core/skills.py +0 -0
  75. {ok_script-2.0.17 → ok_script-2.0.19}/ok/core/start_controller.py +0 -0
  76. {ok_script-2.0.17 → ok_script-2.0.19}/ok/core/task_manager.py +0 -0
  77. {ok_script-2.0.17 → ok_script-2.0.19}/ok/core/template_store.py +0 -0
  78. {ok_script-2.0.17 → ok_script-2.0.19}/ok/core/translation.py +0 -0
  79. {ok_script-2.0.17 → ok_script-2.0.19}/ok/device/DeviceManager.py +0 -0
  80. {ok_script-2.0.17 → ok_script-2.0.19}/ok/device/__init__.py +0 -0
  81. {ok_script-2.0.17 → ok_script-2.0.19}/ok/device/capture.py +0 -0
  82. {ok_script-2.0.17 → ok_script-2.0.19}/ok/device/capture_methods/__init__.py +0 -0
  83. {ok_script-2.0.17 → ok_script-2.0.19}/ok/device/capture_methods/adb.py +0 -0
  84. {ok_script-2.0.17 → ok_script-2.0.19}/ok/device/capture_methods/base.py +0 -0
  85. {ok_script-2.0.17 → ok_script-2.0.19}/ok/device/capture_methods/bitblt.py +0 -0
  86. {ok_script-2.0.17 → ok_script-2.0.19}/ok/device/capture_methods/bitblt_utils.py +0 -0
  87. {ok_script-2.0.17 → ok_script-2.0.19}/ok/device/capture_methods/browser.py +0 -0
  88. {ok_script-2.0.17 → ok_script-2.0.19}/ok/device/capture_methods/desktop_duplication.py +0 -0
  89. {ok_script-2.0.17 → ok_script-2.0.19}/ok/device/capture_methods/hwnd_window.py +0 -0
  90. {ok_script-2.0.17 → ok_script-2.0.19}/ok/device/capture_methods/image.py +0 -0
  91. {ok_script-2.0.17 → ok_script-2.0.19}/ok/device/capture_methods/types.py +0 -0
  92. {ok_script-2.0.17 → ok_script-2.0.19}/ok/device/capture_methods/update.py +0 -0
  93. {ok_script-2.0.17 → ok_script-2.0.19}/ok/device/capture_methods/windows_graphics.py +0 -0
  94. {ok_script-2.0.17 → ok_script-2.0.19}/ok/device/capture_methods/windows_graphics_hdr.py +0 -0
  95. {ok_script-2.0.17 → ok_script-2.0.19}/ok/device/interaction.py +0 -0
  96. {ok_script-2.0.17 → ok_script-2.0.19}/ok/device/interaction_methods/__init__.py +0 -0
  97. {ok_script-2.0.17 → ok_script-2.0.19}/ok/device/interaction_methods/adb.py +0 -0
  98. {ok_script-2.0.17 → ok_script-2.0.19}/ok/device/interaction_methods/base.py +0 -0
  99. {ok_script-2.0.17 → ok_script-2.0.19}/ok/device/interaction_methods/browser.py +0 -0
  100. {ok_script-2.0.17 → ok_script-2.0.19}/ok/device/interaction_methods/do_nothing.py +0 -0
  101. {ok_script-2.0.17 → ok_script-2.0.19}/ok/device/interaction_methods/foreground_post_message.py +0 -0
  102. {ok_script-2.0.17 → ok_script-2.0.19}/ok/device/interaction_methods/genshin.py +0 -0
  103. {ok_script-2.0.17 → ok_script-2.0.19}/ok/device/interaction_methods/keys.py +0 -0
  104. {ok_script-2.0.17 → ok_script-2.0.19}/ok/device/interaction_methods/post_message.py +0 -0
  105. {ok_script-2.0.17 → ok_script-2.0.19}/ok/device/interaction_methods/pydirect.py +0 -0
  106. {ok_script-2.0.17 → ok_script-2.0.19}/ok/device/interaction_methods/pynput.py +0 -0
  107. {ok_script-2.0.17 → ok_script-2.0.19}/ok/device/interaction_methods/swipe.py +0 -0
  108. {ok_script-2.0.17 → ok_script-2.0.19}/ok/device/intercation.py +0 -0
  109. {ok_script-2.0.17 → ok_script-2.0.19}/ok/feature/Box.py +0 -0
  110. {ok_script-2.0.17 → ok_script-2.0.19}/ok/feature/Feature.py +0 -0
  111. {ok_script-2.0.17 → ok_script-2.0.19}/ok/feature/FeatureSet.py +0 -0
  112. {ok_script-2.0.17 → ok_script-2.0.19}/ok/feature/__init__.py +0 -0
  113. {ok_script-2.0.17 → ok_script-2.0.19}/ok/gui/__init__.py +0 -0
  114. {ok_script-2.0.17 → ok_script-2.0.19}/ok/gui/util/pyappify_startup.py +0 -0
  115. {ok_script-2.0.17 → ok_script-2.0.19}/ok/notification/__init__.py +0 -0
  116. {ok_script-2.0.17 → ok_script-2.0.19}/ok/notification/manager.py +0 -0
  117. {ok_script-2.0.17 → ok_script-2.0.19}/ok/notification/messenger_images.py +0 -0
  118. {ok_script-2.0.17 → ok_script-2.0.19}/ok/notification/pipeline.py +0 -0
  119. {ok_script-2.0.17 → ok_script-2.0.19}/ok/notification/ppocr.py +0 -0
  120. {ok_script-2.0.17 → ok_script-2.0.19}/ok/notification/providers.py +0 -0
  121. {ok_script-2.0.17 → ok_script-2.0.19}/ok/notification/system.py +0 -0
  122. {ok_script-2.0.17 → ok_script-2.0.19}/ok/notification/windows_messenger.py +0 -0
  123. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ocr/__init__.py +0 -0
  124. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ocr/download_paddle_model.py +0 -0
  125. {ok_script-2.0.17 → ok_script-2.0.19}/ok/rotypes/Windows/Foundation/Collections.py +0 -0
  126. {ok_script-2.0.17 → ok_script-2.0.19}/ok/rotypes/Windows/Foundation/__init__.py +0 -0
  127. {ok_script-2.0.17 → ok_script-2.0.19}/ok/rotypes/Windows/Globalization/__init__.py +0 -0
  128. {ok_script-2.0.17 → ok_script-2.0.19}/ok/rotypes/Windows/Graphics/Capture/__init__.py +0 -0
  129. {ok_script-2.0.17 → ok_script-2.0.19}/ok/rotypes/Windows/Graphics/DirectX/Direct3D11/__init__.py +0 -0
  130. {ok_script-2.0.17 → ok_script-2.0.19}/ok/rotypes/Windows/Graphics/DirectX/__init__.py +0 -0
  131. {ok_script-2.0.17 → ok_script-2.0.19}/ok/rotypes/Windows/Graphics/Imaging/__init__.py +0 -0
  132. {ok_script-2.0.17 → ok_script-2.0.19}/ok/rotypes/Windows/Graphics/__init__.py +0 -0
  133. {ok_script-2.0.17 → ok_script-2.0.19}/ok/rotypes/Windows/Media/Ocr/__init__.py +0 -0
  134. {ok_script-2.0.17 → ok_script-2.0.19}/ok/rotypes/Windows/Media/__init__.py +0 -0
  135. {ok_script-2.0.17 → ok_script-2.0.19}/ok/rotypes/Windows/Security/Cryptography/__init__.py +0 -0
  136. {ok_script-2.0.17 → ok_script-2.0.19}/ok/rotypes/Windows/Security/__init__.py +0 -0
  137. {ok_script-2.0.17 → ok_script-2.0.19}/ok/rotypes/Windows/Storage/Streams/__init__.py +0 -0
  138. {ok_script-2.0.17 → ok_script-2.0.19}/ok/rotypes/Windows/Storage/__init__.py +0 -0
  139. {ok_script-2.0.17 → ok_script-2.0.19}/ok/rotypes/Windows/UI/ViewManagement/__init__.py +0 -0
  140. {ok_script-2.0.17 → ok_script-2.0.19}/ok/rotypes/Windows/UI/__init__.py +0 -0
  141. {ok_script-2.0.17 → ok_script-2.0.19}/ok/rotypes/Windows/__init__.py +0 -0
  142. {ok_script-2.0.17 → ok_script-2.0.19}/ok/rotypes/__init__.py +0 -0
  143. {ok_script-2.0.17 → ok_script-2.0.19}/ok/rotypes/delegate.py +0 -0
  144. {ok_script-2.0.17 → ok_script-2.0.19}/ok/rotypes/export.py +0 -0
  145. {ok_script-2.0.17 → ok_script-2.0.19}/ok/rotypes/idldsl.py +0 -0
  146. {ok_script-2.0.17 → ok_script-2.0.19}/ok/rotypes/inspectable.py +0 -0
  147. {ok_script-2.0.17 → ok_script-2.0.19}/ok/rotypes/roapi.py +0 -0
  148. {ok_script-2.0.17 → ok_script-2.0.19}/ok/rotypes/types.py +0 -0
  149. {ok_script-2.0.17 → ok_script-2.0.19}/ok/rotypes/winstring.py +0 -0
  150. {ok_script-2.0.17 → ok_script-2.0.19}/ok/task/DiagnosisTask.py +0 -0
  151. {ok_script-2.0.17 → ok_script-2.0.19}/ok/task/TaskExecutor.py +0 -0
  152. {ok_script-2.0.17 → ok_script-2.0.19}/ok/task/__init__.py +0 -0
  153. {ok_script-2.0.17 → ok_script-2.0.19}/ok/task/exceptions.py +0 -0
  154. {ok_script-2.0.17 → ok_script-2.0.19}/ok/task/task.py +0 -0
  155. {ok_script-2.0.17 → ok_script-2.0.19}/ok/test/OKTestRunner.py +0 -0
  156. {ok_script-2.0.17 → ok_script-2.0.19}/ok/test/RunTests.py +0 -0
  157. {ok_script-2.0.17 → ok_script-2.0.19}/ok/test/TaskTestCase.py +0 -0
  158. {ok_script-2.0.17 → ok_script-2.0.19}/ok/test/__init__.py +0 -0
  159. {ok_script-2.0.17 → ok_script-2.0.19}/ok/third_party/__init__.py +0 -0
  160. {ok_script-2.0.17 → ok_script-2.0.19}/ok/third_party/paperclip.py +0 -0
  161. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/__init__.py +0 -0
  162. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/overlay/__init__.py +0 -0
  163. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/overlay/win32_gdi.py +0 -0
  164. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/Communicate.py +0 -0
  165. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/MainWindow.py +0 -0
  166. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/MessageWindow.py +0 -0
  167. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/StartController.py +0 -0
  168. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/TabTitles.py +0 -0
  169. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/__init__.py +0 -0
  170. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/about/AboutTab.py +0 -0
  171. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/about/HttpTextEdit.py +0 -0
  172. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/about/LinksBar.py +0 -0
  173. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/about/ProjectCard.py +0 -0
  174. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/about/UpdateCard.py +0 -0
  175. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/about/VersionCard.py +0 -0
  176. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/about/__init__.py +0 -0
  177. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/common/OKIcon.py +0 -0
  178. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/common/__init__.py +0 -0
  179. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/common/accent_color.py +0 -0
  180. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/common/config.py +0 -0
  181. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/common/design_system.py +0 -0
  182. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/common/icons.py +0 -0
  183. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/common/style_sheet.py +0 -0
  184. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/debug/DebugTab.py +0 -0
  185. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/debug/JobControls.py +0 -0
  186. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/debug/OverlayWidget.py +0 -0
  187. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/debug/RunCodeTab.py +0 -0
  188. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/debug/Screenshot.py +0 -0
  189. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/debug/__init__.py +0 -0
  190. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/events.py +0 -0
  191. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/i18n/GettextTranslator.py +0 -0
  192. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/i18n/__init__.py +0 -0
  193. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/i18n/en_US.qm +0 -0
  194. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/i18n/en_US.ts +0 -0
  195. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/i18n/es_ES.qm +0 -0
  196. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/i18n/es_ES.ts +0 -0
  197. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/i18n/ja_JP.qm +0 -0
  198. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/i18n/ja_JP.ts +0 -0
  199. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/i18n/ko_KR.qm +0 -0
  200. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/i18n/ko_KR.ts +0 -0
  201. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/i18n/path.py +0 -0
  202. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/i18n/update.py +0 -0
  203. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/i18n/zh_CN.qm +0 -0
  204. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/i18n/zh_CN.ts +0 -0
  205. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/i18n/zh_TW.qm +0 -0
  206. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/i18n/zh_TW.ts +0 -0
  207. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/overlay/OverlayWindow.py +0 -0
  208. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/overlay/__init__.py +0 -0
  209. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/plugins/PluginTab.py +0 -0
  210. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/plugins/__init__.py +0 -0
  211. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/plugins/imported_tabs.py +0 -0
  212. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/qss/__init__.py +0 -0
  213. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/qss/dark/card.qss +0 -0
  214. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/qss/dark/discord.svg +0 -0
  215. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/qss/dark/heart.svg +0 -0
  216. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/qss/dark/message_window.qss +0 -0
  217. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/qss/dark/setting_interface.qss +0 -0
  218. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/qss/dark/status_bar.qss +0 -0
  219. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/qss/dark/stop.svg +0 -0
  220. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/qss/dark/tab.qss +0 -0
  221. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/qss/light/card.qss +0 -0
  222. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/qss/light/discord.svg +0 -0
  223. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/qss/light/heart.svg +0 -0
  224. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/qss/light/message_window.qss +0 -0
  225. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/qss/light/setting_interface.qss +0 -0
  226. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/qss/light/status_bar.qss +0 -0
  227. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/qss/light/stop.svg +0 -0
  228. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/qss/light/tab.qss +0 -0
  229. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/qt.qrc +0 -0
  230. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/resources.py +0 -0
  231. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/settings/GlobalConfigCard.py +0 -0
  232. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/settings/GlobalConfigTab.py +0 -0
  233. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/settings/SettingTab.py +0 -0
  234. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/settings/__init__.py +0 -0
  235. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/start/LogWindow.py +0 -0
  236. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/start/SelectCaptureListView.py +0 -0
  237. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/start/SelectInteractionListView.py +0 -0
  238. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/start/StartCard.py +0 -0
  239. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/start/StartTab.py +0 -0
  240. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/start/__init__.py +0 -0
  241. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/tasks/ConfigCard.py +0 -0
  242. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/tasks/ConfigItemFactory.py +0 -0
  243. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/tasks/ConfigLabelAndWidget.py +0 -0
  244. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/tasks/EditTaskTab.py +0 -0
  245. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/tasks/LabelAndButtons.py +0 -0
  246. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/tasks/LabelAndDoubleSpinBox.py +0 -0
  247. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/tasks/LabelAndDropDown.py +0 -0
  248. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/tasks/LabelAndFileSelector.py +0 -0
  249. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/tasks/LabelAndGlobal.py +0 -0
  250. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/tasks/LabelAndLineEdit.py +0 -0
  251. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/tasks/LabelAndList.py +0 -0
  252. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/tasks/LabelAndMcpServer.py +0 -0
  253. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/tasks/LabelAndMultiSelection.py +0 -0
  254. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/tasks/LabelAndSpinBox.py +0 -0
  255. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/tasks/LabelAndSwitchButton.py +0 -0
  256. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/tasks/LabelAndTextEdit.py +0 -0
  257. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/tasks/LabelAndWidget.py +0 -0
  258. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/tasks/MarkUpWindow.py +0 -0
  259. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/tasks/ModifyListDialog.py +0 -0
  260. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/tasks/ModifyListItem.py +0 -0
  261. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/tasks/OneTimeTaskTab.py +0 -0
  262. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/tasks/PythonHighlighter.py +0 -0
  263. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/tasks/RecordScript.py +0 -0
  264. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/tasks/ScheduleTaskTab.py +0 -0
  265. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/tasks/ScriptPackager.py +0 -0
  266. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/tasks/StartButton.py +0 -0
  267. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/tasks/TaskCard.py +0 -0
  268. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/tasks/TaskManger.py +0 -0
  269. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/tasks/TaskOpButton.py +0 -0
  270. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/tasks/TaskTab.py +0 -0
  271. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/tasks/TemplateFactory.py +0 -0
  272. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/tasks/TemplateTab.py +0 -0
  273. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/tasks/TooltipTableWidget.py +0 -0
  274. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/tasks/TriggerTaskTab.py +0 -0
  275. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/tasks/__init__.py +0 -0
  276. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/tasks/schedule_index_sync.py +0 -0
  277. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/util/Alert.py +0 -0
  278. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/util/InitWorker.py +0 -0
  279. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/util/__init__.py +0 -0
  280. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/util/app.py +0 -0
  281. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/util/download.py +0 -0
  282. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/util/pip_util.py +0 -0
  283. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/util/pyappify_startup.py +0 -0
  284. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/util/touch_scroll.py +0 -0
  285. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/util/windows_thumbnail.py +0 -0
  286. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/widget/BaseLoading.py +0 -0
  287. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/widget/BaseWindow.py +0 -0
  288. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/widget/Card.py +0 -0
  289. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/widget/CustomTab.py +0 -0
  290. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/widget/EmptyCard.py +0 -0
  291. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/widget/ExpandCardLayout.py +0 -0
  292. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/widget/FlowLayout.py +0 -0
  293. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/widget/FramelessDialog.py +0 -0
  294. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/widget/ImageWidget.py +0 -0
  295. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/widget/ImportWarningDialog.py +0 -0
  296. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/widget/ListTableWidgetItem.py +0 -0
  297. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/widget/NumericTableWidgetItem.py +0 -0
  298. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/widget/OkCompactSpinBox.py +0 -0
  299. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/widget/SortingTableWidgetItem.py +0 -0
  300. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/widget/StartLoadingDialog.py +0 -0
  301. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/widget/StatusBar.py +0 -0
  302. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/widget/Tab.py +0 -0
  303. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/widget/TabWidget.py +0 -0
  304. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/widget/UpdateConfigWidgetItem.py +0 -0
  305. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/widget/WidgetWithVLabel.py +0 -0
  306. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/widget/YesNonWidgetItem.py +0 -0
  307. {ok_script-2.0.17 → ok_script-2.0.19}/ok/ui/qt/widget/__init__.py +0 -0
  308. {ok_script-2.0.17 → ok_script-2.0.19}/ok/update/__init__.py +0 -0
  309. {ok_script-2.0.17 → ok_script-2.0.19}/ok/update/copy_ok_folder.py +0 -0
  310. {ok_script-2.0.17 → ok_script-2.0.19}/ok/update/inline_ok_requirements.py +0 -0
  311. {ok_script-2.0.17 → ok_script-2.0.19}/ok/util/Analytics.py +0 -0
  312. {ok_script-2.0.17 → ok_script-2.0.19}/ok/util/GlobalConfig.py +0 -0
  313. {ok_script-2.0.17 → ok_script-2.0.19}/ok/util/__init__.py +0 -0
  314. {ok_script-2.0.17 → ok_script-2.0.19}/ok/util/blur.py +0 -0
  315. {ok_script-2.0.17 → ok_script-2.0.19}/ok/util/clazz.py +0 -0
  316. {ok_script-2.0.17 → ok_script-2.0.19}/ok/util/collection.py +0 -0
  317. {ok_script-2.0.17 → ok_script-2.0.19}/ok/util/color.py +0 -0
  318. {ok_script-2.0.17 → ok_script-2.0.19}/ok/util/config.py +0 -0
  319. {ok_script-2.0.17 → ok_script-2.0.19}/ok/util/explorer.py +0 -0
  320. {ok_script-2.0.17 → ok_script-2.0.19}/ok/util/file.py +0 -0
  321. {ok_script-2.0.17 → ok_script-2.0.19}/ok/util/gpu_driver_settings.py +0 -0
  322. {ok_script-2.0.17 → ok_script-2.0.19}/ok/util/handler.py +0 -0
  323. {ok_script-2.0.17 → ok_script-2.0.19}/ok/util/i18n.py +0 -0
  324. {ok_script-2.0.17 → ok_script-2.0.19}/ok/util/logger.py +0 -0
  325. {ok_script-2.0.17 → ok_script-2.0.19}/ok/util/partial_sync_repo.py +0 -0
  326. {ok_script-2.0.17 → ok_script-2.0.19}/ok/util/print_hwnd.py +0 -0
  327. {ok_script-2.0.17 → ok_script-2.0.19}/ok/util/process.py +0 -0
  328. {ok_script-2.0.17 → ok_script-2.0.19}/ok/util/version.py +0 -0
  329. {ok_script-2.0.17 → ok_script-2.0.19}/ok/util/windows_schedule.py +0 -0
  330. {ok_script-2.0.17 → ok_script-2.0.19}/ok_script.egg-info/dependency_links.txt +0 -0
  331. {ok_script-2.0.17 → ok_script-2.0.19}/ok_script.egg-info/entry_points.txt +0 -0
  332. {ok_script-2.0.17 → ok_script-2.0.19}/ok_script.egg-info/not-zip-safe +0 -0
  333. {ok_script-2.0.17 → ok_script-2.0.19}/ok_script.egg-info/requires.txt +0 -0
  334. {ok_script-2.0.17 → ok_script-2.0.19}/ok_script.egg-info/top_level.txt +0 -0
  335. {ok_script-2.0.17 → ok_script-2.0.19}/setup.cfg +0 -0
  336. {ok_script-2.0.17 → ok_script-2.0.19}/tests/test_accent_color.py +0 -0
  337. {ok_script-2.0.17 → ok_script-2.0.19}/tests/test_app.py +0 -0
  338. {ok_script-2.0.17 → ok_script-2.0.19}/tests/test_base_interaction.py +0 -0
  339. {ok_script-2.0.17 → ok_script-2.0.19}/tests/test_blur.py +0 -0
  340. {ok_script-2.0.17 → ok_script-2.0.19}/tests/test_box.py +0 -0
  341. {ok_script-2.0.17 → ok_script-2.0.19}/tests/test_capture_update.py +0 -0
  342. {ok_script-2.0.17 → ok_script-2.0.19}/tests/test_cli.py +0 -0
  343. {ok_script-2.0.17 → ok_script-2.0.19}/tests/test_config_card.py +0 -0
  344. {ok_script-2.0.17 → ok_script-2.0.19}/tests/test_core_events.py +0 -0
  345. {ok_script-2.0.17 → ok_script-2.0.19}/tests/test_core_ui_services.py +0 -0
  346. {ok_script-2.0.17 → ok_script-2.0.19}/tests/test_debug_job_controls.py +0 -0
  347. {ok_script-2.0.17 → ok_script-2.0.19}/tests/test_device_manager.py +0 -0
  348. {ok_script-2.0.17 → ok_script-2.0.19}/tests/test_executor_jobs.py +0 -0
  349. {ok_script-2.0.17 → ok_script-2.0.19}/tests/test_expand_card_layout.py +0 -0
  350. {ok_script-2.0.17 → ok_script-2.0.19}/tests/test_explorer.py +0 -0
  351. {ok_script-2.0.17 → ok_script-2.0.19}/tests/test_global_config.py +0 -0
  352. {ok_script-2.0.17 → ok_script-2.0.19}/tests/test_gpu_driver_settings.py +0 -0
  353. {ok_script-2.0.17 → ok_script-2.0.19}/tests/test_handler.py +0 -0
  354. {ok_script-2.0.17 → ok_script-2.0.19}/tests/test_headless_imports.py +0 -0
  355. {ok_script-2.0.17 → ok_script-2.0.19}/tests/test_inline_ok_requirements.py +0 -0
  356. {ok_script-2.0.17 → ok_script-2.0.19}/tests/test_logger.py +0 -0
  357. {ok_script-2.0.17 → ok_script-2.0.19}/tests/test_main_window_notifications.py +0 -0
  358. {ok_script-2.0.17 → ok_script-2.0.19}/tests/test_main_window_startup_tab.py +0 -0
  359. {ok_script-2.0.17 → ok_script-2.0.19}/tests/test_main_window_system_theme.py +0 -0
  360. {ok_script-2.0.17 → ok_script-2.0.19}/tests/test_mcp_runner.py +0 -0
  361. {ok_script-2.0.17 → ok_script-2.0.19}/tests/test_mcp_server.py +0 -0
  362. {ok_script-2.0.17 → ok_script-2.0.19}/tests/test_mcp_setting.py +0 -0
  363. {ok_script-2.0.17 → ok_script-2.0.19}/tests/test_missing_frame.py +0 -0
  364. {ok_script-2.0.17 → ok_script-2.0.19}/tests/test_navigation_state.py +0 -0
  365. {ok_script-2.0.17 → ok_script-2.0.19}/tests/test_notifications.py +0 -0
  366. {ok_script-2.0.17 → ok_script-2.0.19}/tests/test_ok_mutex.py +0 -0
  367. {ok_script-2.0.17 → ok_script-2.0.19}/tests/test_overlay_custom_draw.py +0 -0
  368. {ok_script-2.0.17 → ok_script-2.0.19}/tests/test_overlay_lifecycle.py +0 -0
  369. {ok_script-2.0.17 → ok_script-2.0.19}/tests/test_package_metadata.py +0 -0
  370. {ok_script-2.0.17 → ok_script-2.0.19}/tests/test_plugin_staging.py +0 -0
  371. {ok_script-2.0.17 → ok_script-2.0.19}/tests/test_plugin_tabs.py +0 -0
  372. {ok_script-2.0.17 → ok_script-2.0.19}/tests/test_plugins.py +0 -0
  373. {ok_script-2.0.17 → ok_script-2.0.19}/tests/test_process.py +0 -0
  374. {ok_script-2.0.17 → ok_script-2.0.19}/tests/test_process_mutex.py +0 -0
  375. {ok_script-2.0.17 → ok_script-2.0.19}/tests/test_pyappify_startup_update.py +0 -0
  376. {ok_script-2.0.17 → ok_script-2.0.19}/tests/test_qt_events.py +0 -0
  377. {ok_script-2.0.17 → ok_script-2.0.19}/tests/test_qt_legacy_imports.py +0 -0
  378. {ok_script-2.0.17 → ok_script-2.0.19}/tests/test_qt_page_layout.py +0 -0
  379. {ok_script-2.0.17 → ok_script-2.0.19}/tests/test_runtime_startup.py +0 -0
  380. {ok_script-2.0.17 → ok_script-2.0.19}/tests/test_schedule_startup.py +0 -0
  381. {ok_script-2.0.17 → ok_script-2.0.19}/tests/test_schedule_task_index_sync.py +0 -0
  382. {ok_script-2.0.17 → ok_script-2.0.19}/tests/test_screenshot_naming.py +0 -0
  383. {ok_script-2.0.17 → ok_script-2.0.19}/tests/test_screenshot_rendering.py +0 -0
  384. {ok_script-2.0.17 → ok_script-2.0.19}/tests/test_start_controller.py +0 -0
  385. {ok_script-2.0.17 → ok_script-2.0.19}/tests/test_start_tab_overlay.py +0 -0
  386. {ok_script-2.0.17 → ok_script-2.0.19}/tests/test_task_executor_queue.py +0 -0
  387. {ok_script-2.0.17 → ok_script-2.0.19}/tests/test_task_reloading.py +0 -0
  388. {ok_script-2.0.17 → ok_script-2.0.19}/tests/test_task_ui.py +0 -0
  389. {ok_script-2.0.17 → ok_script-2.0.19}/tests/test_template_compression.py +0 -0
  390. {ok_script-2.0.17 → ok_script-2.0.19}/tests/test_template_generation.py +0 -0
  391. {ok_script-2.0.17 → ok_script-2.0.19}/tests/test_template_tab.py +0 -0
  392. {ok_script-2.0.17 → ok_script-2.0.19}/tests/test_touch_scroll.py +0 -0
  393. {ok_script-2.0.17 → ok_script-2.0.19}/tests/test_translation_fallback.py +0 -0
  394. {ok_script-2.0.17 → ok_script-2.0.19}/tests/test_version.py +0 -0
  395. {ok_script-2.0.17 → ok_script-2.0.19}/tests/test_windows_graphics_capture.py +0 -0
  396. {ok_script-2.0.17 → ok_script-2.0.19}/tests/test_windows_graphics_hdr.py +0 -0
  397. {ok_script-2.0.17 → ok_script-2.0.19}/tests/test_windows_schedule_target_parse.py +0 -0
  398. {ok_script-2.0.17 → ok_script-2.0.19}/tests/test_windows_schedule_xml.py +0 -0
@@ -11,7 +11,15 @@ Do not use Computer Use skills, plugins, or tools for this workflow, including t
11
11
 
12
12
  Read [docs/mcp.md](../../../docs/mcp.md) for the current server, tools, task contract, and artifacts. The coding agent already has local file and process access: write code and read logs/images directly. Use [setup-env](../setup-env/SKILL.md) or [setup-project](../setup-project/SKILL.md) only when setup is missing.
13
13
 
14
- For screenshot annotations and named template features, use [generate-templates](../generate-templates/SKILL.md): retain originals and COCO annotations in `ok_templates`, export individual PNGs with `generate_templates` into `assets/templates`, and verify `find_feature`/`find_one` using the original feature names. Existing packed COCO assets and `coco_feature_json` remain supported. The split loader reports malformed filenames; fix the indicated asset instead of lowering matching thresholds or ignoring the error.
14
+ Before creating or changing named image features, read [generate-templates](../generate-templates/SKILL.md) and use the library's authoring/export pipeline:
15
+
16
+ 1. Retain full original screenshots in `ok_templates/` and record feature rectangles and names in `ok_templates/coco_annotations.json` using `CocoTemplateStore`.
17
+ 2. Call `ok.feature.FeatureSet.generate_templates` to export split PNGs into `assets/templates/` (or `ok_tasks/assets/templates/` for custom scripts). Let the exporter write the geometry-bearing filenames.
18
+ 3. Configure `template_matching.template_folder` and use `find_feature`/`find_one` with the original feature names in task code.
19
+
20
+ Do not replace this pipeline with hand-cropped runtime PNGs, a custom template registry, or a parallel `cv2.matchTemplate` loader for named features. Crop previews are diagnostics, not runtime assets. Existing packed COCO assets and `coco_feature_json` remain supported. The split loader reports malformed filenames; fix the source annotation and regenerate instead of renaming crops or ignoring the error.
21
+
22
+ The full screenshots in `ok_templates/` can also serve directly as regression-test fixtures. Follow [write-test](../write-test/SKILL.md) to exercise real task recognition with `TaskTestCase.set_image()` or the exported assets with `FeatureSet`; there is no need to duplicate these images under `tests/images/`. A source-image self-match checks the export path; add independent positive and negative screenshots when available to check recognition robustness.
15
23
 
16
24
  For existing registered tasks, prefer [reload-tasks](../reload-tasks/SKILL.md): discover their source with `list_tasks()`, edit it in place, call `reload_tasks(task_ids=[...])`, and wait for a successful reload before testing. Keep automation behavior in its existing module; use temporary MCP files only as thin validation harnesses. Create new task implementations when the requested functionality is new.
17
25
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: generate-templates
3
- description: Create template matching assets for a third-party ok-script application from its screenshots and COCO annotations, then verify them with find_feature or find_one.
3
+ description: Create or change named image features using ok-script's ok_templates screenshots, COCO annotations, and split exporter; verify them with find_feature or find_one and reuse screenshots in tests.
4
4
  ---
5
5
 
6
6
  # Generate and use templates
@@ -15,6 +15,13 @@ split runtime assets. Keep source screenshots intact so both agents and the
15
15
  Template tab can inspect and reannotate them. The old compression APIs and dialog
16
16
  option are obsolete; use the split exporter for new or regenerated assets.
17
17
 
18
+ For new named features, do not write standalone runtime crops into `assets/`,
19
+ invent a template metadata format, or implement a separate `cv2.matchTemplate`
20
+ registry/loader. Use `CocoTemplateStore` for authoring, `generate_templates` for
21
+ runtime exports, and the library's named-feature matching APIs in tasks. A crop
22
+ preview may be written outside the export folder for inspection, but it does not
23
+ replace the source screenshot, COCO annotation, or generated split asset.
24
+
18
25
  Run from the automation project's root using its interpreter, following
19
26
  [use-venv](../use_venv/SKILL.md). For live capture and task execution follow
20
27
  [develop](../develop/SKILL.md), including reset, baseline verification, and
@@ -172,6 +179,15 @@ prove recognition is robust. Use the project's actual threshold, preprocessing,
172
179
  and anchor settings for representative verification. Keep evidence of what was
173
180
  tested and what remains unverified.
174
181
 
182
+ Full screenshots in `ok_templates/` are also reusable offline test fixtures.
183
+ Pass their paths directly to `TaskTestCase.set_image()` to test the application's
184
+ real recognition methods, or load them as frames for `FeatureSet` tests using
185
+ the generated runtime assets. Keep referenced screenshots with the project so
186
+ tests remain reproducible; copying them to `tests/images/` is unnecessary.
187
+ Retain independent positive/negative captures when available, and assert the
188
+ expected state or match geometry rather than only checking that an image loads.
189
+ Follow [write-test](../write-test/SKILL.md) for harness setup and isolation.
190
+
175
191
  In task code, use the existing methods:
176
192
 
177
193
  ```python
@@ -0,0 +1,76 @@
1
+ ---
2
+ name: setup-env
3
+ description: Install the ok-script Python package and create or repair a consuming application's virtual environment, including dependencies for its GUI or MCP server.
4
+ ---
5
+
6
+ # Set Up the Local Environment
7
+
8
+ Work in the consuming application's directory and use its configured environment or `.venv`. Inspect its requirements, lockfile, supported Python versions, and installed packages before changing dependencies. Installing and using ok-script does not require a library source checkout.
9
+
10
+ Use this skill for requests such as "install ok-script and set up its environment", even before an MCP server exists. Read this file directly from the repository or installed package; starting MCP is not a prerequisite. After installation and verification, generate the local development skill before the project-creation handoff below.
11
+
12
+ ## Interpreter and dependencies
13
+
14
+ - Resolve an existing `.venv\Scripts\python.exe` before any Python command. Use an absolute path when commands change directories. Use `-m pip`, `-m pytest`, and `-m py_compile` through that interpreter.
15
+ - If a new environment is needed, create it with an available interpreter compatible with the application's requirements and its chosen ok-script release. Current releases require Windows and Python 3.11 or later. Inspect installed distribution metadata with `importlib.metadata` when needed. Do not recreate a working environment just to install missing packages.
16
+ - Prefer the application's requirements or lockfile and preserve its chosen ok-script version. Select `default` for the normal vision/capture stack, `qt` for the desktop GUI, `adb` for Android targets, and `ocr` when required. A GUI application tested through MCP normally needs `default` and `qt`. MCP is a required dependency starting in ok-script 2.0.17; older pinned releases may still need their `mcp` extra. Install application test dependencies only when its tests need them.
17
+ - OpenCV is deliberately separate from these profiles. Inspect the installed `opencv-*` packages and choose exactly one compatible variant. Reuse the project's existing choice when suitable; do not install multiple variants that all provide `cv2`.
18
+
19
+ For an installed release, select the extras actually needed, for example:
20
+
21
+ ```powershell
22
+ $projectPy = (Resolve-Path .\.venv\Scripts\python.exe).Path
23
+ & $projectPy -m pip install 'ok-script[default,qt]'
24
+ ```
25
+
26
+ Run this from the application's root. Install the chosen OpenCV variant separately if it is absent.
27
+
28
+ Record the selected ok-script version or constraint, extras, and OpenCV variant in the application's existing dependency manifest or lockfile using its package manager. Keep setup reproducible without replacing unrelated dependencies.
29
+
30
+ If the application intentionally uses an existing editable library installation or `ok` source link, preserve that arrangement and install its required dependencies in the application's environment. A source link alone does not install dependencies. Modify the application's tasks and configuration; library source changes are outside this skill's scope.
31
+
32
+ Use the normal package index first. If downloads stall, a reachable alternate index can be supplied to the individual pip command; do not change persistent pip configuration as a side effect of setup.
33
+
34
+ ## Verify the environment
35
+
36
+ Run `& $projectPy -m pip check`. Smoke-test `import ok, cv2, mcp` and the selected optional stacks, and verify `ok.__file__` resolves to the intended checkout or installed package. For Qt, check `from PySide6 import QtCore` and `import qfluentwidgets`.
37
+
38
+ If the application already has a launcher, run it with its environment to catch runtime imports that dependency metadata alone cannot verify. Compile changed application scripts and run its existing tests when relevant.
39
+
40
+ Report the environment path, dependency profiles, OpenCV choice, and verification outcome.
41
+
42
+ ## Generate the project-local development skill
43
+
44
+ After successful installation, create
45
+ `<cwd>/.agents/skills/ok-script-develop/SKILL.md` in the consuming workspace where
46
+ the user requested setup. This is part of agent setup, including installation-only
47
+ requests; it does not depend on accepting project creation or starting MCP. When
48
+ repairing an environment, add the skill if it is missing.
49
+
50
+ Use [the generic development skill template](assets/ok-script-develop/SKILL.md)
51
+ as the initial content. Prefer the template shipped with the selected installed
52
+ release; locate this `setup-env` skill through `ok.core.skills.list_skills()` and
53
+ resolve `assets/ok-script-develop/SKILL.md` from its parent directory. If the
54
+ installed release predates the template, use the template accompanying these
55
+ setup instructions without upgrading the dependency.
56
+
57
+ Create the destination directory as needed and write the template as UTF-8. If
58
+ the destination already exists, read it first and preserve its project-specific
59
+ guidance; merge missing discovery instructions only when needed. Do not replace
60
+ a customized skill with the generic template. Keep the template's generic name
61
+ and description for new skills; do not copy game-specific observations, fixed
62
+ machine paths, or unrelated application skills from another project.
63
+
64
+ The generated skill discovers the library's version-matched instructions in place;
65
+ do not copy the full consumer skill catalog into the application. Verify the
66
+ generated file has its `name` and `description` frontmatter, and that its discovery
67
+ instructions locate this environment's `develop/SKILL.md`. Report the generated
68
+ or reused skill's path with the environment results.
69
+
70
+ ## Offer to create a project
71
+
72
+ After a successful initial installation, ask whether the user wants to create an automation project and which game or app it should target. For example: "ok-script is installed. Would you like to create an automation project now? If so, which game or app, and is it a Windows app or an Android device/emulator?" Wait for the answer before creating a project that has not already been requested.
73
+
74
+ If project creation was already requested, continue with [setup-project](../setup-project/SKILL.md) and ask only for missing target/configuration details. That skill creates each project in its own subfolder with its own config and start scripts. Reuse the environment just prepared when compatible, adding any target-specific dependencies that become necessary.
75
+
76
+ Do not repeat this offer when repairing an existing project's environment, returning to an ongoing `setup-project` workflow, or when the user has explicitly declined project creation. An installation request by itself should receive the offer; a running MCP server is not required for this conversation.
@@ -0,0 +1,84 @@
1
+ ---
2
+ name: ok-script-develop
3
+ description: Develop and debug an application's automation with ok-script, including tasks, configuration, recognition assets, and tests. Discover the selected library's consumer skills and apply the project's conventions.
4
+ ---
5
+
6
+ # Develop with ok-script
7
+
8
+ Work in the consuming application's project and use its configured Python
9
+ environment. This skill provides discovery and project integration for any game
10
+ or app using ok-script; the selected library supplies the development workflow
11
+ and API contracts. Library maintenance is outside this skill's scope.
12
+
13
+ ## Locate the library instructions
14
+
15
+ Before changing automation behavior, locate the consumer skills matching the
16
+ library this application actually uses:
17
+
18
+ 1. Check the project's local `ok` directory or configured source link. Resolve
19
+ symlinks and junctions. A source checkout keeps skills at
20
+ `<resolved-ok>/../.agents/skills`; a packaged directory keeps them at
21
+ `<resolved-ok>/agent_resources/.agents/skills`.
22
+ 2. If that source has no consumer skills, use the application's interpreter and
23
+ `importlib.metadata.distribution('ok-script').locate_file('ok')` to locate its
24
+ installed package, then check `agent_resources/.agents/skills` there. Do not
25
+ use another environment's global installation.
26
+ 3. Read `develop/SKILL.md` in the selected skill directory. Resolve its links
27
+ relative to that original file, including the MCP guide and input references.
28
+ Read `reload-tasks` for registered tasks, `generate-templates` for visual
29
+ assets, and `write-test` for tests. Read setup skills when environment or
30
+ runtime setup is needed.
31
+
32
+ When available, the selected package's `core/skills.py` provides `list_skills()`
33
+ and `get_skill()` with absolute source paths. Load that file with
34
+ `runpy.run_path` to discover instructions without importing the GUI runtime.
35
+ For example, with a local `ok` directory, run this using the project interpreter
36
+ from the application root:
37
+
38
+ ```python
39
+ from pathlib import Path
40
+ import runpy
41
+
42
+ catalog = runpy.run_path(str(Path('ok').resolve() / 'core' / 'skills.py'))
43
+ for skill in catalog['list_skills']():
44
+ print(skill['id'], skill['path'])
45
+ ```
46
+
47
+ Keep the library's detailed instructions in their original location so they
48
+ follow its installed version. Inspect that version's source and signatures for
49
+ API details. If no consumer skills are available, report the missing resources
50
+ and use the project's setup guidance; do not invent MCP tools or silently upgrade
51
+ the dependency just to obtain instructions.
52
+
53
+ ## Apply the workflow to this project
54
+
55
+ Follow the selected library's development skill for MCP startup, connection
56
+ discovery, task recovery, reloads, and runtime validation. Use ok-script APIs and
57
+ MCP for target capture and interaction. Do not use Computer Use skills, plugins,
58
+ or tools for this workflow.
59
+
60
+ Inspect the project's instructions, config, launchers, existing tasks, and local
61
+ skills before implementing changes. Reuse its task bases, registration style,
62
+ recovery helpers, assets, and localization conventions. Keep behavior in permanent
63
+ application modules and use thin MCP harnesses to exercise those implementations.
64
+
65
+ For new or changed named image features, read the library's `generate-templates`
66
+ skill before creating assets. Keep full screenshots in `ok_templates/`, annotate
67
+ them in `ok_templates/coco_annotations.json` with `CocoTemplateStore`, and call
68
+ `generate_templates` to produce split features in `assets/templates/` (or
69
+ `ok_tasks/assets/templates/` for custom scripts). Use the original names through
70
+ `find_feature`/`find_one`. Do not substitute hand-cropped runtime PNGs, a custom
71
+ template registry, or a separate `cv2.matchTemplate` loader for this pipeline.
72
+
73
+ The full images in `ok_templates/` can also be used directly as regression-test
74
+ fixtures with `TaskTestCase.set_image()` or `FeatureSet`. Read the library's
75
+ `write-test` skill, exercise real recognition with generated assets, and retain
76
+ independent positive/negative screenshots when available. The source-image
77
+ self-match alone verifies export consistency, not recognition robustness.
78
+
79
+ Use the configured project environment even when it is shared from a parent
80
+ workspace. Reuse this project's live runtime when suitable and follow the
81
+ library's process ownership rules when a restart is required. Validate observable
82
+ target behavior and relevant GUI lifecycle paths as described by the library.
83
+ If the target is unavailable, continue useful code and offline checks and report
84
+ the specific runtime checks that remain unverified.
@@ -0,0 +1,115 @@
1
+ ---
2
+ name: setup-project
3
+ description: Create or configure an ok-script automation project, collect missing game or app details, and give each project its own subfolder, config, GUI and MCP start scripts, and Windows shortcut.
4
+ ---
5
+
6
+ # Set Up a Local Automation Project
7
+
8
+ Work in the consuming application's directory at the user's requested location. Inspect an existing project before adding files. Use [setup-env](../setup-env/SKILL.md) when its environment needs preparation, and [docs/mcp.md](../../../docs/mcp.md) for current CLI and server configuration. Configure the application through the installed library's APIs; no ok-script source checkout is required.
9
+
10
+ ## Collect the target details
11
+
12
+ When following an installation-only request, first ask whether the user wants a project, as described in `setup-env`. If they already requested a project, proceed without asking for the same confirmation again. Reuse details from the request and existing project, and ask a short grouped question for missing information:
13
+
14
+ - Which game or app should this project automate, and is it a Windows application or an Android device/emulator?
15
+ - For Windows, which installed executable or running window is the target? Inspect running processes and windows when possible; ask for the executable path or window choice when the target cannot be identified unambiguously. Determine whether the launcher should open the target or attach to an already-running instance. Automatic startup requires its actual launch path or command.
16
+ - For Android, which device or emulator and which app should be targeted? Inspect available devices and the installed library's configuration before asking for identifiers the agent can discover itself. Ask the user to choose when multiple targets match.
17
+
18
+ Use a sensible project folder name derived from the app unless the user supplies one. Use the current workspace as the parent unless another location was requested. Ask about additional requirements, such as background operation, only when they affect the requested setup. Select and verify capture/input backends using the installed APIs; the user need not know their technical names.
19
+
20
+ Wait for essential target details before writing target-dependent configuration. Do not use example executable names or window titles as if they were verified. If environment setup is still needed, it can proceed while the target question is pending.
21
+
22
+ ## Layout and source access
23
+
24
+ Create each new automation project in its own named subfolder under the workspace. Each project must have its own `config.py`, `start_gui.py`, and `start_mcp.py` inside that subfolder. Keep its task modules, assets, mutable configuration, logs, and screenshots there too. For example:
25
+
26
+ ```text
27
+ workspace/
28
+ .venv/
29
+ my-game/
30
+ config.py
31
+ start_gui.py
32
+ start_mcp.py
33
+ tasks/
34
+ assets/
35
+ configs/
36
+ logs/
37
+ screenshots/
38
+ another-app/
39
+ config.py
40
+ start_gui.py
41
+ start_mcp.py
42
+ ```
43
+
44
+ Create supporting directories as needed. Reuse a matching existing project folder; if the current directory is already that project's folder, edit it in place rather than nesting another copy. Keep separate projects' config and launch scripts separate, even when they target the same app.
45
+
46
+ Ensure each application's root has `.agents/skills/ok-script-develop/SKILL.md`,
47
+ following the local skill generation instructions in [setup-env](../setup-env/SKILL.md).
48
+ Do this even when its environment is shared with the parent workspace, so an agent
49
+ opened directly in the application folder can discover development guidance.
50
+ Preserve existing project-specific skill content.
51
+
52
+ Projects may share the workspace environment just installed when their dependencies are compatible, or use a project-local environment when required. Record the chosen interpreter and use its absolute path in shortcuts and run instructions. Target launchers must work when invoked by absolute path from another working directory: resolve paths from `__file__`, make the project's task modules and config importable, and set the working directory to that project's subfolder before starting the runtime. Resolve mutable paths under that same folder so projects do not share settings, logs, or MCP ownership accidentally.
53
+
54
+ Prefer the application's installed ok-script dependency. If the user explicitly requests a source link to an existing library installation, link `<project-root>\ok` to that checkout's `ok` directory and add the link's parent to `sys.path` before importing `ok`. Prefer a directory symbolic link; if Windows denies symlink privileges, use a directory junction. Verify existing destinations and resolved paths before replacing anything; never recursively delete through the link. This is dependency access, not permission to modify library code.
55
+
56
+ When obtaining a requested test application, record its source and checksum, verify the file type, and preserve existing downloads. Reuse an existing process only when its resolved executable path matches the intended target.
57
+
58
+ ## Application config
59
+
60
+ Build a project-local config using the actual target's executable, title, capture backend, and interaction backend. Resolve mutable paths under the target folder. A Windows GUI project commonly has:
61
+
62
+ ```python
63
+ from pathlib import Path
64
+
65
+ ROOT = Path(__file__).resolve().parent
66
+ config = {
67
+ 'version': '0.1.0',
68
+ 'gui_title': 'Automation Playground',
69
+ 'gui': {'type': 'qt'},
70
+ 'debug': False,
71
+ 'config_folder': str(ROOT / 'configs'),
72
+ 'screenshots_folder': str(ROOT / 'screenshots'),
73
+ 'windows': {
74
+ 'exe': ['target.exe'],
75
+ 'title': 'Target Window',
76
+ 'capture_method': ['BitBlt'],
77
+ 'interaction': 'PostMessage',
78
+ 'start_exe': True,
79
+ 'calculate_pc_exe_path': str(ROOT / 'target.exe'),
80
+ },
81
+ 'onetime_tasks': [],
82
+ 'trigger_tasks': [],
83
+ 'mcp': {
84
+ 'enabled': False,
85
+ 'port': 8765,
86
+ 'artifact_directory': str(ROOT / 'logs' / 'mcp'),
87
+ },
88
+ }
89
+ ```
90
+
91
+ Adapt this example. BitBlt and PostMessage are initial candidates, not proof of target compatibility. Register a completed task as `['task_module', 'Task']` in `onetime_tasks`, using an import path available to both launchers.
92
+
93
+ If the task needs named template matching, add `template_matching` with
94
+ `'template_folder': str(ROOT / 'assets' / 'templates')` and the project's matching
95
+ settings. Keep an existing `coco_feature_json` entry when packed assets are still
96
+ used; both sources can coexist. Keep editable screenshots and COCO annotations
97
+ under `ok_templates`, separate from exported crops. Follow
98
+ [generate-templates](../generate-templates/SKILL.md) for export and verification.
99
+
100
+ ## Separate launchers
101
+
102
+ - `start_gui.py` is the user entry point. Explicitly select the Qt GUI and disable MCP. Launch it with the project's `pythonw.exe`. Redirect absent stdout/stderr to a local startup log so startup errors remain observable without a console.
103
+ - `start_mcp.py` is the coding agent entry point. Enable MCP and normally run headless; support a configurable port when useful. If GUI-assisted development is needed, keep that entry point separate from the user launcher. The agent can start the process itself; do not require the user to open a console.
104
+ - Keep both scripts in the project's subfolder and load that project's `config.py`. Share path setup and target process startup in a project-local launcher helper when useful. Copy config before applying mode-specific overrides. Clean up the runtime on exit.
105
+ - A user `.lnk` targets the absolute venv `pythonw.exe`, passes a quoted absolute `start_gui.py` path, and sets the working directory. Use a custom shortcut icon when one is supplied. A hidden `python.exe` console does not replace `pythonw.exe` for the user shortcut.
106
+
107
+ Starting a GUI replaces the registered console owner for the same working directory, closing that console's MCP server. Keep both launchers in the same target directory so project ownership matches. Close the GUI before starting a console development session. Never kill arbitrary Python processes to free a port; identify the owning project and PID.
108
+
109
+ ## Verify against the real target
110
+
111
+ Start the development launcher and inspect an MCP screenshot for a complete, current target image. Test reset, left/right clicks, keys, or other required input against observable UI changes. Prioritize PostMessage, checking background operation while the target is unfocused or covered and confirming that foreground focus and the cursor remain undisturbed. Do not infer minimized-window support from those checks.
112
+
113
+ If capture is cropped or stale, inspect backend behavior and DPI/coordinate scaling before changing recognition code. For a legacy application, a child-only `HIGHDPIAWARE` compatibility environment may help; apply it only when verified, rather than globally changing Windows settings.
114
+
115
+ Launch the actual user shortcut: confirm the GUI opens without a console or MCP listener and loads this project's config. When a task was also requested and implemented, confirm it appears with a useful name and its Start action runs successfully; see [develop](../develop/SKILL.md) for task lifecycle and retry behavior. A new project without tasks should still open successfully. Report the project folder, config, selected interpreter, concrete launcher paths, and the interaction/capture behavior that was tested.
@@ -27,7 +27,7 @@ Import `TaskTestCase` from `ok.test.TaskTestCase`; set class attributes `task_cl
27
27
 
28
28
  The current harness initializes one task per test class, replaces capture with `ImageCaptureMethod`, and uses `DoNothingInteraction`. `set_image(path)` advances the frame and checks template sizing; `set_images(*paths)` installs a sequence and advances its first frame. Read the capture implementation when testing frame progression rather than assuming repeated reads advance it.
29
29
 
30
- - Store reproducible screenshots under the target project's `tests/images/`, or reuse an existing tracked `ok_templates` source when appropriate. Confirm each fixture exists and loads.
30
+ - Reuse full source screenshots in the target project's `ok_templates/` directly as test fixtures, including screenshots used to author COCO annotations and split features. Pass their paths to `set_image()`; no copy into `tests/images/` is required. Keep referenced images with the project and confirm they exist and load. Additional test-only captures may live under `tests/images/` or the project's existing fixture directory.
31
31
  - Load the image before calling the recognition method. Exercise real recognition rather than mocking the method being tested.
32
32
  - Assert the detected state, value, feature name, confidence, or box geometry as appropriate. Include an absent or negative case when it distinguishes the regression.
33
33
  - For scaling bugs, use representative resolutions and aspect ratios with `subTest`; preserve the intended center/right anchors and allow a justified pixel tolerance. Include positive matches and blank-frame negatives when relevant.
@@ -35,6 +35,15 @@ The current harness initializes one task per test class, replaces capture with `
35
35
  - Do not treat no-op input as proof that an in-game click worked. Test action intent with mocks; use the [develop skill](../develop/SKILL.md) when actual GUI/MCP interaction is part of the request.
36
36
  - For fixture annotation or named feature creation, follow [generate-templates](../generate-templates/SKILL.md).
37
37
 
38
+ For example, in a `TaskTestCase` method, call
39
+ `self.set_image(str(project_root / "ok_templates" / "settings-open.png"))`, then
40
+ invoke the real task recognition method and assert its result. Resolve
41
+ `project_root` from the test file or the project's existing test configuration.
42
+ Use the generated `assets/templates` features through the real application
43
+ config. Matching a feature against its own authoring screenshot verifies the
44
+ annotation/export/load path; include independent positives and negatives when
45
+ available to catch false matches and appearance changes.
46
+
38
47
  For direct split-template tests, construct `FeatureSet(False, None, 0.002, 0.002,
39
48
  template_folder=<absolute export folder>)`. For packed COCO tests, pass the JSON
40
49
  path as the second argument. Match using the original feature name, without the
@@ -1,6 +1,7 @@
1
1
  recursive-include ok *
2
2
  recursive-include .agents/skills *
3
3
  include docs/mcp.md
4
+ include docs/agent-setup.md
4
5
  include docs/feature-crops.md
5
6
  include examples/mcp_observe.py
6
7
  global-exclude *.pyc
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ok-script
3
- Version: 2.0.17
3
+ Version: 2.0.19
4
4
  Summary: Automation with Computer Vision for Python
5
5
  Author-email: ok-oldking <firedcto@gmail.com>
6
6
  License: ok-script License
@@ -79,6 +79,7 @@ License: ok-script License
79
79
 
80
80
  Project-URL: Homepage, https://github.com/ok-oldking/ok-script
81
81
  Project-URL: Repository, https://github.com/ok-oldking/ok-script
82
+ Project-URL: Agent setup, https://github.com/ok-oldking/ok-script/blob/master/docs/agent-setup.md
82
83
  Classifier: Programming Language :: Python :: 3
83
84
  Classifier: Programming Language :: Python :: 3.11
84
85
  Classifier: Programming Language :: Python :: 3.12
@@ -140,6 +141,14 @@ ok-script 支持 Windows 应用和游戏、安卓模拟器及 ADB 设备,提
140
141
 
141
142
  ## 可以这样告诉编程代理
142
143
 
144
+ 首次安装环境:
145
+
146
+ > 在当前项目中安装 ok-script 并配置运行环境。先读取 https://raw.githubusercontent.com/ok-oldking/ok-script/master/docs/agent-setup.md ,按照其中的安装技能操作,保留项目现有的依赖约束。
147
+
148
+ [代理安装指南(英文)](docs/agent-setup.md)提供可添加到应用项目 `AGENTS.md` 的简短指令,让后续安装请求也能找到这些技能,无需先安装包或启动 MCP。
149
+
150
+ 开发自动化任务:
151
+
143
152
  > 连接这个项目的 ok-script MCP 服务,读取开发技能。检查已安装的截图、匹配和输入 API,给出准确签名和源码位置。开发可复用 Python 任务:打开设置、启用“显示详情”、保存并验证结果。每次尝试前恢复并验证起始界面,测试重复运行,代码保存到项目中。使用 ok-script API 和 MCP,不使用 Computer Use 工具。最后给出不依赖代理或大模型调用的准确运行命令。
144
153
 
145
154
  ## 特性
@@ -14,6 +14,14 @@ ok-script 支持 Windows 应用和游戏、安卓模拟器及 ADB 设备,提
14
14
 
15
15
  ## 可以这样告诉编程代理
16
16
 
17
+ 首次安装环境:
18
+
19
+ > 在当前项目中安装 ok-script 并配置运行环境。先读取 https://raw.githubusercontent.com/ok-oldking/ok-script/master/docs/agent-setup.md ,按照其中的安装技能操作,保留项目现有的依赖约束。
20
+
21
+ [代理安装指南(英文)](docs/agent-setup.md)提供可添加到应用项目 `AGENTS.md` 的简短指令,让后续安装请求也能找到这些技能,无需先安装包或启动 MCP。
22
+
23
+ 开发自动化任务:
24
+
17
25
  > 连接这个项目的 ok-script MCP 服务,读取开发技能。检查已安装的截图、匹配和输入 API,给出准确签名和源码位置。开发可复用 Python 任务:打开设置、启用“显示详情”、保存并验证结果。每次尝试前恢复并验证起始界面,测试重复运行,代码保存到项目中。使用 ok-script API 和 MCP,不使用 Computer Use 工具。最后给出不依赖代理或大模型调用的准确运行命令。
18
26
 
19
27
  ## 特性
@@ -0,0 +1,108 @@
1
+ # Set up ok-script with a coding agent
2
+
3
+ Use this entry point when asked to install the `ok-script` Python package, prepare
4
+ its environment, or set up an automation project that uses it. Work in the
5
+ consuming application's folder. The library source does not need to be cloned.
6
+
7
+ ## Give the agent an entry point
8
+
9
+ For a one-time setup, tell your coding agent:
10
+
11
+ > Install ok-script and set up this project's environment. First read https://raw.githubusercontent.com/ok-oldking/ok-script/master/docs/agent-setup.md and follow the relevant setup skills linked there. Preserve this project's existing dependency constraints.
12
+
13
+ For future requests such as "install ok-script and set up its environment", add
14
+ the following to the consuming project's `AGENTS.md`, or the instruction file
15
+ your coding agent reads:
16
+
17
+ ```markdown
18
+ ## ok-script setup
19
+
20
+ When asked to install, configure, or repair ok-script or its Python environment,
21
+ read https://raw.githubusercontent.com/ok-oldking/ok-script/master/docs/agent-setup.md
22
+ and follow the relevant setup skills before changing the environment.
23
+ Use this project's virtual environment and preserve its dependency constraints.
24
+ After installation, generate .agents/skills/ok-script-develop/SKILL.md in the
25
+ current workspace using the setup-env template, preserving any existing custom skill.
26
+ After installation, offer to create an automation project and ask for missing
27
+ game/app details. Give each project its own subfolder, config, and start scripts.
28
+ ```
29
+
30
+ Installing a Python package does not register its instructions with a coding
31
+ agent. The prompt or project instruction supplies the discovery link; after
32
+ installation, the package also provides local copies of the skills. The coding
33
+ agent then generates a discoverable development skill in the consuming workspace;
34
+ `pip install` alone does not write project instructions. No MCP server is needed
35
+ to read the setup instructions or generate this local skill.
36
+
37
+ ## Instructions for the coding agent
38
+
39
+ 1. Inspect the consuming project's instructions, Python requirements, lockfile,
40
+ existing environment, and requested outcome. This is application setup, not
41
+ development of the ok-script library. For a new environment, ok-script
42
+ currently requires Windows and Python 3.11 or later; check the selected
43
+ release's package metadata for its requirements.
44
+ 2. Read the
45
+ [setup-env skill](https://github.com/ok-oldking/ok-script/blob/master/.agents/skills/setup-env/SKILL.md)
46
+ before installing or repairing dependencies. It covers environment creation,
47
+ optional dependency profiles, the separate OpenCV choice, and verification.
48
+ If reading remotely, resolve that skill's relative links against its location
49
+ in this repository. Preserve existing pins and use instructions from the
50
+ matching release or local package when available.
51
+ 3. Install in the application's environment and record the chosen dependencies
52
+ in its existing dependency manifest or lockfile. Follow its package manager's
53
+ workflow. Select only the profiles the requested application needs; a desktop
54
+ GUI commonly uses `default,qt`, with exactly one compatible OpenCV variant
55
+ installed separately. Verify the environment before offering project creation.
56
+ 4. After installation, generate
57
+ `<cwd>/.agents/skills/ok-script-develop/SKILL.md` using the generic template
58
+ linked from `setup-env`. This step also applies to installation-only requests;
59
+ preserve and merge an existing customized skill rather than overwriting it.
60
+ Verify it can locate the selected library's consumer development instructions.
61
+ The skill applies to any consuming game or app and discovers the library's
62
+ instructions in place instead of duplicating them.
63
+ 5. After a successful initial installation, ask: "Would you like to create an
64
+ automation project now? Which game or app should it automate, and is it a
65
+ Windows app or an Android device/emulator?" If the user already requested a
66
+ project, ask only for missing details. Skip this offer when repairing an
67
+ existing project or when the user has explicitly declined project creation.
68
+ 6. When project creation is requested, read the
69
+ [setup-project skill](https://github.com/ok-oldking/ok-script/blob/master/.agents/skills/setup-project/SKILL.md).
70
+ Identify the actual executable/window or device/app from the user's answers
71
+ and local inspection. Ask for any required details that remain ambiguous;
72
+ wait for those answers before writing target-dependent config. Create each
73
+ project in its own named workspace subfolder, containing its own `config.py`,
74
+ `start_gui.py`, and `start_mcp.py`. Keep its tasks, assets, settings, and logs
75
+ in that folder too. Ensure its root also has the local `ok-script-develop`
76
+ skill, even if it shares the workspace environment. Omit `gui_icon` to use the
77
+ default `OK` PNG bundled with
78
+ the Python package; set it only when supplying a custom application icon.
79
+ Reuse an existing project in place. Projects may share
80
+ the prepared environment when compatible. Use the installed version's APIs
81
+ and verify that launchers work when invoked from outside their subfolder.
82
+ 7. Run the checks in the relevant skills. Report the environment path, installed
83
+ ok-script version, dependency profiles, OpenCV choice, and verification
84
+ results, plus the generated or reused development skill path. For application
85
+ setup, also report the project folder, config,
86
+ launcher paths, and which target capture/input checks succeeded.
87
+
88
+ ## Read skills from an installed package
89
+
90
+ Use the selected environment's interpreter to obtain skill metadata and absolute
91
+ source paths without starting the GUI or MCP server. This example runs from the
92
+ workspace containing `.venv`; a project subfolder can use that same interpreter
93
+ by its resolved absolute path:
94
+
95
+ ```powershell
96
+ $projectPy = (Resolve-Path .\.venv\Scripts\python.exe).Path
97
+ & $projectPy -c "from ok.core.skills import list_skills; import json; print(json.dumps(list_skills(), indent=2))"
98
+ ```
99
+
100
+ Read the returned `setup-env` or `setup-project` path and resolve relative links
101
+ from that file. These local copies match the installed package. If an older
102
+ release does not include skills, use this repository's instructions and inspect
103
+ the installed APIs rather than upgrading just to obtain instructions.
104
+
105
+ Once a requested MCP runtime is running, `list_skills()` and
106
+ `get_skill("setup-project")` expose the same instructions. See the
107
+ [MCP guide](mcp.md) for connection details and the
108
+ [development prompts](en/agent-prompts.md) for subsequent task implementation.
@@ -14,6 +14,11 @@ Use Split for new exports. Existing COCO assets remain readable.
14
14
  Keep the original screenshots and COCO annotations in `ok_templates` for editing
15
15
  and future exports. Split exports require only the PNG files at runtime.
16
16
 
17
+ Coding agents should use this same pipeline: author with `CocoTemplateStore`,
18
+ export with `generate_templates`, and match named features with
19
+ `find_feature`/`find_one`. Hand-cropped runtime PNGs and a custom OpenCV template
20
+ loader bypass the library's annotation, scaling, and export workflow.
21
+
17
22
  ## Configuration
18
23
 
19
24
  Add `template_folder` alongside the existing configuration; all variance,
@@ -106,6 +111,14 @@ boxes = features.find_feature(frame, 'settings_save', threshold=0.95)
106
111
  assert len(boxes) == 1, boxes
107
112
  ```
108
113
 
114
+ Full screenshots in `ok_templates` can also serve directly as regression-test
115
+ fixtures. Pass a screenshot path to `TaskTestCase.set_image()` to exercise the
116
+ application's real recognition methods, or load it for a `FeatureSet` test as
117
+ above. Keep referenced screenshots with the project; no duplicate under
118
+ `tests/images` is needed. A self-match on the authoring image verifies the export
119
+ path. Add independent positive and negative screenshots when available to test
120
+ recognition robustness, using the application's actual matching settings.
121
+
109
122
  Also verify representative screenshots at the supported resolutions. The GUI
110
123
  Save action reloads its feature set. After programmatic export, refresh cached
111
124
  features with `feature_set.process_data()` on the executor thread, or restart the
@@ -12,8 +12,19 @@ The agent writes and edits project files, starts the local runtime, and reads lo
12
12
 
13
13
  MCP supplies skills and task execution, not a Python API catalog or `get_api` tool. Use the application's interpreter and inspect its installed package for exact signatures, docstrings, inherited methods, and return behavior. No library checkout is needed. See [agent prompts](en/agent-prompts.md) for API-only discovery and existing-task repair examples.
14
14
 
15
+ The server's connection instructions direct agents to `get_skill("generate-templates")`
16
+ before creating named image features: keep full screenshots and COCO annotations
17
+ in `ok_templates`, export split features with `generate_templates`, and use
18
+ `find_feature`/`find_one` in tasks. Those full screenshots can also be used directly
19
+ as regression-test fixtures; `get_skill("write-test")` describes the test workflow.
20
+ These instructions and skills come from the server's installed ok-script version.
21
+
15
22
  ## Install and start
16
23
 
24
+ If the project has no environment or MCP runtime yet, start with the
25
+ [agent setup guide](agent-setup.md). Its setup skills can be read before
26
+ installation, without connecting to a running server.
27
+
17
28
  MCP is a required dependency of ok-script starting in 2.0.17. Install the capture
18
29
  and OCR profiles your project needs; no separate MCP extra is required.
19
30
  Use the project's virtual environment when one exists:
@@ -14,7 +14,7 @@ from typing import TYPE_CHECKING
14
14
  from ok.util.handler import Handler, ExitEvent
15
15
  from ok.util.logger import Logger
16
16
  from ok.util.file import get_path_relative_to_exe
17
- from ok.core.ui_config import resolve_ui_config, resolve_window_size
17
+ from ok.core.ui_config import resolve_gui_icon, resolve_ui_config, resolve_window_size
18
18
  os.environ["PYTHONIOENCODING"] = "utf-8"
19
19
 
20
20
  if TYPE_CHECKING:
@@ -333,7 +333,7 @@ class App(_OverlayConfigMixin):
333
333
  self.overlay_window = None
334
334
  self.main_window = None
335
335
  self.exit_event = exit_event
336
- self.icon = QIcon(get_path_relative_to_exe(config.get('gui_icon')) or ":/icon/icon.ico")
336
+ self.icon = QIcon(get_path_relative_to_exe(resolve_gui_icon(config)))
337
337
 
338
338
  from ok.core.start_controller import StartController
339
339
  self.start_controller = StartController(self.config, exit_event)
@@ -654,6 +654,7 @@ class OK:
654
654
  import pyappify
655
655
  from ok.util.config import Config
656
656
 
657
+ config['gui_icon'] = resolve_gui_icon(config)
657
658
  self.config = config
658
659
  check_mutex_fn = _resolve('check_mutex')
659
660
  config_logger_fn = _resolve('config_logger')