[project] name = "minitap-mobile-use" version = "3.6.3" description = "AI-powered multi-agent system that automates real Android and iOS devices through low-level control using LangGraph." readme = "README.md" license = { file = "LICENSE" } authors = [ { name = "Pierre-Louis Favreau" }, { name = "Jean-Pierre Lo" }, { name = "Nicolas Dehandschoewercker" }, ] requires-python = ">=3.12" dependencies = [ "langgraph>=1.0.2,<2.0.0", "adbutils==2.9.3", "langchain-google-genai>=4.0.0", "langchain>=1.0.0", "langchain-core>=1.0.0", "jinja2==3.1.6", "python-dotenv==1.1.1", "pydantic-settings==2.10.1", "langchain-mcp-adapters>=0.2.0", "langchain-openai>=1.0.0", "typer==0.16.0", "langchain-cerebras>=0.8.0", "inquirer>=3.4.0", "sseclient-py>=1.8.0", "fastapi>=0.111.0", "uvicorn[standard]>=0.30.1", "colorama>=0.4.6", "psutil>=5.9.0", "langchain-google-vertexai>=3.0.0", "httpx>=0.28.1", "uiautomator2>=3.5.0", "fb-idb>=1.1.7", "facebook-wda>=1.5.4", "Appium-Python-Client>=5.0.0", "posthog>=7.4.2", "uuid-utils>=0.12.0", "limrun-api>=0.1.0", "websockets>=12.0", ] [project.optional-dependencies] dev = [ "ruff>=0.15.2", "pytest>=8.4.1", "pytest-cov>=5.0.0", "pyright>=1.1.405" ] [project.scripts] mobile-use = "minitap.mobile_use.main:cli" [project.urls] "Homepage" = "https://minitap.ai/" "Source" = "https://github.com/minitap-ai/mobile-use" [build-system] requires = ["uv_build>=0.7.20,<0.8.0"] build-backend = "uv_build" [tool.uv.build-backend] module-root = "" module-name = "minitap.mobile_use" [tool.ruff] # Exclude a variety of commonly ignored directories. exclude = [ ".bzr", ".direnv", ".eggs", ".git", ".git-rewrite", ".hg", ".ipynb_checkpoints", ".mypy_cache", ".nox", ".pants.d", ".pyenv", ".pytest_cache", ".pytype", ".ruff_cache", ".svn", ".tox", ".venv", ".vscode", "__pypackages__", "_build", "buck-out", "build", "dist", "node_modules", "site-packages", "venv", ] # Same as Black. line-length = 100 indent-width = 4 target-version = "py312" [tool.ruff.lint] # Enable Pyflakes (`F`) and a subset of the pycodestyle (`E`) codes by default. # Also enable TID (flake8-tidy-imports) to enforce absolute imports select = ["E", "F", "TID", "UP"] # Allow fix for all enabled rules (when `--fix`) is provided. fixable = ["ALL"] unfixable = [] # Allow unused variables when underscore-prefixed. dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$" [tool.ruff.lint.flake8-tidy-imports] # Ban relative imports ban-relative-imports = "all" [tool.ruff.format] # Like Black, use double quotes for strings. quote-style = "double" # Like Black, indent with spaces, rather than tabs. indent-style = "space" # Like Black, respect magic trailing commas. skip-magic-trailing-comma = false # Like Black, automatically detect the appropriate line ending. line-ending = "auto" [tool.pytest.ini_options] # Add project root to Python path for absolute imports pythonpath = [ "." ] # Specify test discovery patterns testpaths = [ "minitap", "tests" ] python_files = [ "*.test.py", "test_*.py", "*_test.py" ] python_functions = [ "test_*" ] python_classes = [ "Test*" ] # Add useful options addopts = [ "-v", # verbose output "--tb=short", # shorter traceback format "--strict-markers", # strict marker checking "--disable-warnings", # disable warnings for cleaner output ] markers = [ "ios_simulator: tests requiring iOS simulator (run on macOS with IDB)", "android: tests requiring Android device or emulator", ] [dependency-groups] dev = [ "ruff>=0.15.2", "pytest>=8.4.1", "pytest-asyncio>=1.2.0", "pytest-cov>=5.0.0", "pyright>=1.1.389", "pre-commit>=3.5.0", ]