mirror of
https://github.com/hanzoai/python-sdk.git
synced 2026-10-23 20:23:00 +00:00
- todo.md: Task management with list, add, update, remove, clear actions - computer.md: pyautogui Mac automation (mouse, keyboard, screenshots, windows) - config.md: Git-style configuration and 700+ programmer personas
272 lines
6.3 KiB
Markdown
272 lines
6.3 KiB
Markdown
# hanzo-tools-computer
|
|
|
|
Computer control via pyautogui for comprehensive Mac automation. Mouse, keyboard, screenshots, window management.
|
|
|
|
## Installation
|
|
|
|
```bash
|
|
pip install hanzo-tools-computer
|
|
```
|
|
|
|
Or as part of the full toolkit:
|
|
|
|
```bash
|
|
pip install hanzo-mcp[tools-all]
|
|
```
|
|
|
|
## Overview
|
|
|
|
`hanzo-tools-computer` provides desktop automation:
|
|
|
|
- **Mouse** - click, drag, scroll, move
|
|
- **Keyboard** - type, press, hotkey
|
|
- **Screen** - screenshots, display info
|
|
- **Windows** - focus, list, get active
|
|
- **Image Location** - find UI elements
|
|
- **Regions** - named areas for targeting
|
|
|
|
## Quick Start
|
|
|
|
```python
|
|
# Click at coordinates
|
|
computer(action="click", x=100, y=200)
|
|
|
|
# Type text
|
|
computer(action="type", text="Hello, World!")
|
|
|
|
# Press keys
|
|
computer(action="press", key="enter")
|
|
computer(action="hotkey", keys=["command", "c"])
|
|
|
|
# Screenshot
|
|
computer(action="screenshot")
|
|
|
|
# Get screen info
|
|
computer(action="info")
|
|
```
|
|
|
|
## Actions Reference
|
|
|
|
### Mouse Actions
|
|
|
|
```python
|
|
# Click
|
|
computer(action="click", x=100, y=200)
|
|
computer(action="double_click", x=100, y=200)
|
|
computer(action="right_click", x=100, y=200)
|
|
computer(action="middle_click", x=100, y=200)
|
|
|
|
# Move
|
|
computer(action="move", x=100, y=200, duration=0.5)
|
|
computer(action="move_relative", dx=50, dy=-30)
|
|
|
|
# Drag
|
|
computer(action="drag", x=300, y=400, duration=0.5)
|
|
computer(action="drag_relative", dx=100, dy=0)
|
|
|
|
# Scroll
|
|
computer(action="scroll", amount=5) # Scroll up
|
|
computer(action="scroll", amount=-5) # Scroll down
|
|
computer(action="scroll", amount=3, x=500, y=300) # At position
|
|
```
|
|
|
|
### Keyboard Actions
|
|
|
|
```python
|
|
# Type text (character by character)
|
|
computer(action="type", text="Hello!", interval=0.05)
|
|
|
|
# Write text (instant, can clear first)
|
|
computer(action="write", text="Instant text", clear=True)
|
|
|
|
# Press single key
|
|
computer(action="press", key="enter")
|
|
computer(action="press", key="tab")
|
|
computer(action="press", key="escape")
|
|
|
|
# Key combinations
|
|
computer(action="hotkey", keys=["command", "c"]) # Copy
|
|
computer(action="hotkey", keys=["command", "v"]) # Paste
|
|
computer(action="hotkey", keys=["command", "shift", "s"]) # Save as
|
|
|
|
# Hold/release keys
|
|
computer(action="key_down", key="shift")
|
|
computer(action="key_up", key="shift")
|
|
```
|
|
|
|
### Screen Actions
|
|
|
|
```python
|
|
# Full screenshot (returns base64)
|
|
computer(action="screenshot")
|
|
|
|
# Region screenshot
|
|
computer(action="screenshot_region", region=[100, 100, 500, 300])
|
|
|
|
# Get all displays
|
|
computer(action="get_screens")
|
|
|
|
# Get screen size
|
|
computer(action="screen_size")
|
|
|
|
# Current mouse position
|
|
computer(action="position")
|
|
|
|
# Full info
|
|
computer(action="info")
|
|
```
|
|
|
|
### Image Location
|
|
|
|
Find UI elements by image matching:
|
|
|
|
```python
|
|
# Find image on screen (returns center point)
|
|
computer(action="locate", image_path="button.png")
|
|
|
|
# Find all matches
|
|
computer(action="locate_all", image_path="icon.png")
|
|
|
|
# Get center point
|
|
computer(action="locate_center", image_path="submit.png")
|
|
|
|
# Wait for image to appear
|
|
computer(action="wait_for_image", image_path="loading.png", timeout=10)
|
|
|
|
# Wait while image is visible
|
|
computer(action="wait_while_image", image_path="spinner.png", timeout=30)
|
|
```
|
|
|
|
### Pixel Operations
|
|
|
|
```python
|
|
# Get pixel color at point
|
|
computer(action="pixel", x=100, y=200)
|
|
|
|
# Check if pixel matches color
|
|
computer(action="pixel_matches", x=100, y=200, color=[255, 0, 0], tolerance=10)
|
|
```
|
|
|
|
### Window Management
|
|
|
|
```python
|
|
# Get active window info
|
|
computer(action="get_active_window")
|
|
|
|
# List all windows
|
|
computer(action="list_windows")
|
|
|
|
# Focus window by title
|
|
computer(action="focus_window", title="Terminal")
|
|
computer(action="focus_window", title=".*Code.*", use_regex=True)
|
|
```
|
|
|
|
### Named Regions
|
|
|
|
Define reusable screen regions:
|
|
|
|
```python
|
|
# Define a region
|
|
computer(action="define_region", name="toolbar", x=0, y=0, width=1920, height=60)
|
|
|
|
# Screenshot region
|
|
computer(action="region_screenshot", name="toolbar")
|
|
|
|
# Locate image within region
|
|
computer(action="region_locate", name="toolbar", image_path="save_button.png")
|
|
```
|
|
|
|
### Timing & Flow
|
|
|
|
```python
|
|
# Sleep
|
|
computer(action="sleep", value=2.0)
|
|
|
|
# Countdown with output
|
|
computer(action="countdown", value=5)
|
|
|
|
# Set global pause between actions
|
|
computer(action="set_pause", value=0.2)
|
|
|
|
# Enable/disable fail-safe (corner abort)
|
|
computer(action="set_failsafe", value=True)
|
|
```
|
|
|
|
### Batch Operations
|
|
|
|
Execute multiple actions in sequence:
|
|
|
|
```python
|
|
computer(action="batch", actions=[
|
|
{"action": "click", "x": 100, "y": 200},
|
|
{"action": "type", "text": "Hello"},
|
|
{"action": "press", "key": "enter"}
|
|
])
|
|
```
|
|
|
|
## Examples
|
|
|
|
### UI Automation
|
|
|
|
```python
|
|
# Click button and fill form
|
|
computer(action="click", x=500, y=300) # Click form field
|
|
computer(action="write", text="[email protected]", clear=True)
|
|
computer(action="press", key="tab")
|
|
computer(action="write", text="password123")
|
|
computer(action="press", key="enter")
|
|
```
|
|
|
|
### Screenshot Workflow
|
|
|
|
```python
|
|
# Take screenshot, find element, click it
|
|
computer(action="screenshot")
|
|
result = computer(action="locate", image_path="login_button.png")
|
|
if result["found"]:
|
|
computer(action="click", x=result["x"], y=result["y"])
|
|
```
|
|
|
|
### Window Management
|
|
|
|
```python
|
|
# Focus app and interact
|
|
computer(action="focus_window", title="Safari")
|
|
computer(action="hotkey", keys=["command", "l"]) # Focus URL bar
|
|
computer(action="write", text="https://example.com", clear=True)
|
|
computer(action="press", key="enter")
|
|
```
|
|
|
|
### Wait for UI State
|
|
|
|
```python
|
|
# Wait for loading to finish
|
|
computer(action="wait_while_image", image_path="spinner.png", timeout=30)
|
|
|
|
# Then continue
|
|
computer(action="click", x=500, y=400)
|
|
```
|
|
|
|
## Performance Features
|
|
|
|
- **Lazy loading** - pyautogui loads on first use (150ms+ startup savings)
|
|
- **Cached screen info** - Display info cached for 5 seconds
|
|
- **Thread pool executor** - All blocking operations run in threads
|
|
- **Batch operations** - Multiple actions in single call
|
|
|
|
## Fail-Safe
|
|
|
|
By default, moving the mouse to any corner of the screen will raise an exception, allowing you to abort automation. Disable with:
|
|
|
|
```python
|
|
computer(action="set_failsafe", value=False)
|
|
```
|
|
|
|
## Best Practices
|
|
|
|
1. **Use image location over coordinates** - More robust across resolutions
|
|
2. **Add waits for UI transitions** - Use `wait_for_image` after actions
|
|
3. **Define named regions** - Improves code readability
|
|
4. **Enable fail-safe** - Keep the corner abort enabled during development
|
|
5. **Use batch for sequences** - More efficient than individual calls
|