- Showcase UI Reorganization: * Move web UI dashboard from root directory into apps/showcase_ui/ for cleaner project structure * Add 'artemis ui' CLI command (artemis/interfaces/cli/commands/ui.py) and launcher scripts for the interactive showcase console - Standalone MCP Server & Notifiers (mcp_server/): * Implement dedicated MCP server package with mobile automation tools (device_state, inspect_trace, task_manager, task_runner) * Add multi-channel notifiers (AgentAPI, Desktop notifications, Webhooks, File output, and Composite routing) * Introduce background task runner and trace store for autonomous mobile execution monitoring - Cross-Platform Runtime & Toolchain Support: * Add artemis/platform/ with OS-specific implementations for Linux, macOS (Darwin), and Windows * Add artemis/runtime/supervisor.py for resilient process and agent runtime supervision * Add artemis/toolchain/ with dependency resolution and SDK descriptors * Add cross-platform launcher scripts (start.sh, start.bat) and installer scripts (scripts/install_deps.*) - Core Enhancements & Diagnostics: * Enhance coordinate normalization, OCR API fallback, and perception pipeline * Add credential validation (credentials_validator.py) and system diagnostics * Update bilingual documentation (README.md, README_CN.md) and architecture diagrams - Test Suite Expansion: * Add integration tests for cloud gateway, remote ADB, and Artemis login * Add unit tests covering core diagnostics, platform detection, toolchain, credentials validator, optional OCR, and MCP tools
240 lines
5.6 KiB
TOML
240 lines
5.6 KiB
TOML
# Copyright 2026 Google LLC
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
|
|
[project]
|
|
name = "artemis"
|
|
version = "1.0"
|
|
description = "Autonomous AI Assistant for Mobile Automation"
|
|
|
|
authors = [
|
|
{ name = "Farley Wang", email="farleyw@google.com" },
|
|
]
|
|
|
|
requires-python = ">=3.12"
|
|
|
|
dependencies = [
|
|
# Orchestration & Framework
|
|
"langgraph>=1.0.2,<2.0.0",
|
|
"langchain>=1.0.0",
|
|
"langchain-core>=1.0.0",
|
|
"langchain-community>=0.4.1",
|
|
"langchain-mcp-adapters>=0.2.0",
|
|
"mcp>=1.26.0",
|
|
# LLM Providers & GenAI SDKs
|
|
"google-genai>=0.1.1",
|
|
"langchain-google-genai>=4.0.0",
|
|
"langchain-google-vertexai>=3.0.0",
|
|
"langchain-openai>=1.0.0",
|
|
# Configuration, Models & Validation
|
|
"pydantic>=2.7.0",
|
|
"pydantic-settings>=2.10.1",
|
|
"python-dotenv>=1.0.1",
|
|
"jinja2>=3.1.5",
|
|
"typing-extensions>=4.12.0",
|
|
# Android Automation & Device Subsystem
|
|
"adbutils>=2.12.0",
|
|
"uiautomator2>=3.5.0",
|
|
# CLI & Rich Terminal UI
|
|
"typer>=0.12.0",
|
|
"rich>=13.7.0",
|
|
"inquirer>=3.4.0",
|
|
"colorama>=0.4.6",
|
|
# Web, API & Networking
|
|
"fastapi>=0.111.0",
|
|
"uvicorn[standard]>=0.30.1",
|
|
"httpx>=0.28.1",
|
|
"requests>=2.31.0",
|
|
"websockets>=12.0",
|
|
"sseclient-py>=1.8.0",
|
|
# Image, Video & Multimodal Perception
|
|
"pillow>=10.0.0",
|
|
"opencv-python>=4.9.0.80",
|
|
"imageio-ffmpeg>=0.5.1",
|
|
"matplotlib>=3.8.0",
|
|
"numpy>=1.26.0",
|
|
"scipy>=1.13.0",
|
|
# System, Utilities & Telemetry
|
|
"psutil>=5.9.0",
|
|
"retry>=0.9.2",
|
|
"posthog>=3.5.0",
|
|
"uuid-utils>=0.9.0",
|
|
"jupyter-client>=8.6.0",
|
|
"ipykernel>=6.29.0",
|
|
"langchain-anthropic>=1.5.4",
|
|
]
|
|
|
|
[project.optional-dependencies]
|
|
dev = [
|
|
"ruff>=0.15.2",
|
|
"pytest>=8.4.1",
|
|
"pytest-asyncio>=0.23.0",
|
|
"pytest-cov>=5.0.0",
|
|
"syrupy>=4.0.0",
|
|
"pyright>=1.1.389",
|
|
"pre-commit>=3.5.0",
|
|
]
|
|
|
|
[project.scripts]
|
|
artemis = "artemis.interfaces.cli.main:cli"
|
|
artemis-admin = "apps.admin_console.server:main"
|
|
|
|
|
|
[build-system]
|
|
# requires = ["uv_build>=0.7.20,<0.8.0"]
|
|
# build-backend = "uv_build"
|
|
requires = ["setuptools>=61.0", "Cython"]
|
|
build-backend = "setuptools.build_meta"
|
|
|
|
[tool.uv.build-backend]
|
|
module-root = ""
|
|
module-name = "artemis"
|
|
|
|
[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"]
|
|
ignore = [
|
|
"E501", # Line too long
|
|
"E402", # Module level import not at top of file
|
|
"E712", # Avoid equality comparisons to True/False
|
|
"F401", # Unused imports
|
|
"F841", # Local variable is assigned to but never used
|
|
"UP035", # Deprecated import
|
|
"UP036", # Outdated version block
|
|
"UP042", # Class inherits from both str and enum.Enum
|
|
"UP046", # Generic class uses Generic subclass instead of type parameters
|
|
"UP047", # Generic function should use type parameters
|
|
]
|
|
|
|
# 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 and apps to Python path for clean absolute imports
|
|
pythonpath = [
|
|
".",
|
|
"apps",
|
|
"apps/admin_console",
|
|
]
|
|
|
|
|
|
# Specify test discovery patterns
|
|
testpaths = [
|
|
"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 = [
|
|
"android: tests requiring Android device or emulator",
|
|
]
|
|
|
|
[tool.pylint.master]
|
|
ignore = [".venv", "build", "dist"]
|
|
recursive = "yes"
|
|
|
|
[tool.pylint.messages_control]
|
|
disable = [
|
|
"C0114", # missing-module-docstring
|
|
"R0801", # duplicate-code
|
|
]
|
|
|
|
[tool.pyright]
|
|
exclude = [".venv/**"]
|
|
|
|
[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",
|
|
]
|
|
|