[project] name = "oterm" version = "0.23.0" description = "The terminal client for Ollama, OpenAI, Anthropic, and any pydantic-ai-supported provider." authors = [{ name = "Yiorgis Gozadinos", email = "ggozadinos@gmail.com" }] license = { text = "MIT" } readme = { file = "README.md", content-type = "text/markdown" } classifiers = [ "Development Status :: 4 - Beta", "Environment :: Console", "Intended Audience :: Developers", "Operating System :: Android", "Operating System :: Microsoft :: Windows :: Windows 10", "Operating System :: Microsoft :: Windows :: Windows 11", "Operating System :: MacOS", "Operating System :: POSIX :: Linux", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Programming Language :: Python :: 3.14", "Typing :: Typed", ] requires-python = ">=3.10" dependencies = [ "aiosql==15.0", "aiosqlite==0.22.1", "ollama==0.6.2", "packaging==26.2", "pillow==12.3.0", "pydantic==2.13.4", "pydantic-ai-harness==0.10.0", "pydantic-ai-slim[openai,anthropic,google,groq,mistral,cohere,bedrock,huggingface,mcp,logfire,duckduckgo,web-fetch]==2.17.0", "python-dotenv==1.2.2", "python-multipart>=0.0.32,<0.1", "textual==8.2.8", "textual-image==0.12.0", "textual-speedups==0.2.1", "textualeffects==0.2.0", "typer==0.26.8", ] [project.urls] Homepage = "https://github.com/ggozad/oterm" Repository = "https://github.com/ggozad/oterm" Issues = "https://github.com/ggozad/oterm/issues" Documentation = "https://ggozad.github.io/oterm/" [project.scripts] oterm = "oterm.cli.oterm:cli" [dependency-groups] dev = [ "ruff==0.15.12", "ty==0.0.32", "pdbpp==0.12.1", "pytest==9.0.3", "pytest-asyncio==1.3.0", "pytest-cov==7.1.0", "pytest-textual-snapshot==1.0.0", "pytest-xdist==3.8.0", "textual-dev==1.8.0", "homebrew-pypi-poet==0.10.0", "zensical", "pre-commit==4.6.0", ] [tool.pytest.ini_options] asyncio_mode = "auto" testpaths = ["tests"] filterwarnings = [ "ignore:coroutine 'Event.wait' was never awaited:RuntimeWarning", "ignore:coroutine 'DirectoryTree.watch_path' was never awaited:RuntimeWarning", "ignore:Image\\.Image\\.getdata is deprecated.*:DeprecationWarning:textual_image.*", ] [tool.coverage.run] branch = true source = ["src/oterm"] omit = ["src/oterm/cli/oterm.py", "src/oterm/log.py", "src/oterm/app/themes/*"] [tool.coverage.report] fail_under = 100 exclude_lines = [ "pragma: no cover", "if TYPE_CHECKING:", "raise NotImplementedError", ] [tool.uv] [tool.uv.sources] [tool.ruff] line-length = 88 [tool.ruff.lint] select = [ "E", "F", "UP", "I", ] # Enable Flake's "E" and "F" codes by default and "I" for sorting imports ignore = ["E501"] per-file-ignores = { "__init__.py" = ["F401", "F403"] } # Allow unused variables when underscore-prefixed. dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$" [tool.ruff.format] quote-style = "double" indent-style = "space" skip-magic-trailing-comma = false line-ending = "auto" [tool.ty.environment] python-version = "3.13" [project.entry-points."oterm.tools"] think = "oterm.tools.think:think" date_time = "oterm.tools.date_time:date_time" shell = "oterm.tools.shell:shell" generate_image = "oterm.tools.ollama_image:generate_image" [build-system] requires = ["hatchling"] build-backend = "hatchling.build" [tool.hatch.build.targets.sdist] exclude = ["/screenshots", "/examples"] [tool.hatch.build.targets.wheel] only-packages = true