Understudy — desktop RPA by demonstration. Single-file reference README embeds the complete source (modules, tests, marketing site) + architecture, provider & computer-vision pipeline, and CLI.
Drift inferred · capture-to-capture
No drift recorded — single capability capture; advisories appear once its surface changes.
transport stdio counts 39 tools · 0 res
· 0 prompts
permission surface via code analysis
tools
-
board_get
-
click
-
double_click
-
drag
-
dryrun_start
-
find_element
-
focus_window
-
get_accessibility_tree
-
hotkey
-
launch_app
-
list_windows
-
move
-
press_key
-
read_clipboard
-
recording_start
-
recording_status
-
recording_stop
-
resume
-
right_click
-
screenshot
-
scroll
-
step_decision
-
step_propose
-
stop
-
stop_status
-
task_create
-
task_get
-
task_list
-
task_run
-
task_update_status
-
type_text
-
undo_last
-
wait_for
-
workflow_get
-
workflow_list
-
workflow_normalize
-
workflow_save
-
workflow_set_status
-
write_clipboard
evidence-backed
findings quoted directly from the published source artifact — not inferred
code files: 62
filesystem 5
- fs Farfive-understudy-AI-a2b4543/src/myrpa/config.py :7
from pathlib import Path - fs Farfive-understudy-AI-a2b4543/src/myrpa/control/screen.py :6
from pathlib import Path - fs Farfive-understudy-AI-a2b4543/src/myrpa/os_backends/linux.py :9
import shutil - fs Farfive-understudy-AI-a2b4543/src/myrpa/recording/events.py :6
from pathlib import Path - fs Farfive-understudy-AI-a2b4543/src/myrpa/security.py :9
from pathlib import Path
shell / exec 3
- shell Farfive-understudy-AI-a2b4543/src/myrpa/os_backends/linux.py :10
import subprocess - shell Farfive-understudy-AI-a2b4543/src/myrpa/os_backends/macos.py :9
import subprocess - shell Farfive-understudy-AI-a2b4543/src/myrpa/os_backends/windows.py :8
import subprocess
network 1
- net Farfive-understudy-AI-a2b4543/src/myrpa/providers/ollama_provider.py :11
import httpx
secrets 2
- secrets Farfive-understudy-AI-a2b4543/src/myrpa/config.py :117
anthropic_api_key=os.environ.get("ANTHROPIC_API_KEY") or None, - secrets Farfive-understudy-AI-a2b4543/src/myrpa/providers/anthropic_provider.py :32
or os.environ.get("ANTHROPIC_API_KEY")
database 3
- db Farfive-understudy-AI-a2b4543/src/myrpa/db/models.py :11
from sqlalchemy import ( - db Farfive-understudy-AI-a2b4543/src/myrpa/db/repo.py :11
from sqlalchemy import select - db Farfive-understudy-AI-a2b4543/src/myrpa/db/session.py :7
from sqlalchemy import create_engine
tool registrations 39
- screenshot Farfive-understudy-AI-a2b4543/src/myrpa/tools/control.py :20
- click Farfive-understudy-AI-a2b4543/src/myrpa/tools/control.py :37
- double_click Farfive-understudy-AI-a2b4543/src/myrpa/tools/control.py :42
- right_click Farfive-understudy-AI-a2b4543/src/myrpa/tools/control.py :47
- move Farfive-understudy-AI-a2b4543/src/myrpa/tools/control.py :52
- drag Farfive-understudy-AI-a2b4543/src/myrpa/tools/control.py :57
- scroll Farfive-understudy-AI-a2b4543/src/myrpa/tools/control.py :62
- type_text Farfive-understudy-AI-a2b4543/src/myrpa/tools/control.py :67
- press_key Farfive-understudy-AI-a2b4543/src/myrpa/tools/control.py :72
- hotkey Farfive-understudy-AI-a2b4543/src/myrpa/tools/control.py :77
- dryrun_start Farfive-understudy-AI-a2b4543/src/myrpa/tools/dryrun.py :11
- step_propose Farfive-understudy-AI-a2b4543/src/myrpa/tools/dryrun.py :16
- step_decision Farfive-understudy-AI-a2b4543/src/myrpa/tools/dryrun.py :27
- list_windows Farfive-understudy-AI-a2b4543/src/myrpa/tools/inspect.py :29
- focus_window Farfive-understudy-AI-a2b4543/src/myrpa/tools/inspect.py :35
- launch_app Farfive-understudy-AI-a2b4543/src/myrpa/tools/inspect.py :41
- get_accessibility_tree Farfive-understudy-AI-a2b4543/src/myrpa/tools/inspect.py :49
- find_element Farfive-understudy-AI-a2b4543/src/myrpa/tools/inspect.py :54
- wait_for Farfive-understudy-AI-a2b4543/src/myrpa/tools/inspect.py :60
- read_clipboard Farfive-understudy-AI-a2b4543/src/myrpa/tools/inspect.py :66
- write_clipboard Farfive-understudy-AI-a2b4543/src/myrpa/tools/inspect.py :71
- task_create Farfive-understudy-AI-a2b4543/src/myrpa/tools/kanban.py :12
- task_list Farfive-understudy-AI-a2b4543/src/myrpa/tools/kanban.py :18
- task_get Farfive-understudy-AI-a2b4543/src/myrpa/tools/kanban.py :23
- task_update_status Farfive-understudy-AI-a2b4543/src/myrpa/tools/kanban.py :29
- board_get Farfive-understudy-AI-a2b4543/src/myrpa/tools/kanban.py :35
- task_run Farfive-understudy-AI-a2b4543/src/myrpa/tools/kanban.py :40
- recording_start Farfive-understudy-AI-a2b4543/src/myrpa/tools/recording.py :8
- recording_stop Farfive-understudy-AI-a2b4543/src/myrpa/tools/recording.py :17
- recording_status Farfive-understudy-AI-a2b4543/src/myrpa/tools/recording.py :22
- stop Farfive-understudy-AI-a2b4543/src/myrpa/tools/safety.py :11
- resume Farfive-understudy-AI-a2b4543/src/myrpa/tools/safety.py :22
- stop_status Farfive-understudy-AI-a2b4543/src/myrpa/tools/safety.py :28
- undo_last Farfive-understudy-AI-a2b4543/src/myrpa/tools/safety.py :33
- workflow_normalize Farfive-understudy-AI-a2b4543/src/myrpa/tools/workflow.py :10
- workflow_save Farfive-understudy-AI-a2b4543/src/myrpa/tools/workflow.py :25
- workflow_list Farfive-understudy-AI-a2b4543/src/myrpa/tools/workflow.py :32
- workflow_get Farfive-understudy-AI-a2b4543/src/myrpa/tools/workflow.py :37
- workflow_set_status Farfive-understudy-AI-a2b4543/src/myrpa/tools/workflow.py :43
declared dependencies 20
- mcp@>=1.2.0
- SQLAlchemy@>=2.0
- pydantic@>=2.6
- typer@>=0.12
- textual@>=0.60
- httpx@>=0.27
- python-dotenv@>=1.0
- mss@>=9.0
- pillow@>=10.0
- pyautogui@>=0.9.54
- pynput@>=1.7
- anthropic@>=0.40
- atomacos@>=3.3
- pyobjc-framework-Quartz@>=10.0
- pyobjc-framework-Cocoa@>=10.0
- uiautomation@>=2.0
- pywin32@>=306
- PyGObject@>=3.42
- pytest@>=8.0
- pytest-asyncio@>=0.23
clipboard 2
- clipboard shell call Farfive-understudy-AI-a2b4543/src/myrpa/os_backends/linux.py :76
for cmd in (["xclip", "-selection", "clipboard", "-o"], - clipboard shell call Farfive-understudy-AI-a2b4543/src/myrpa/os_backends/macos.py :74
out = subprocess.run(["pbpaste"], capture_output=True, text=True)