[build-system] requires = ["hatchling"] build-backend = "hatchling.build" [project] name = "vmware-aiops" version = "2.5.0" description = "VMware vCenter/ESXi AI-powered VM lifecycle and deployment tool" readme = "README.md" license = "MIT" requires-python = ">=3.10" authors = [{ name = "Wei Zhou", email = "zhouwei008@gmail.com" }] dependencies = [ "pyvmomi>=8.0.3.0,<10.0", "pyaml>=24.0,<27.0", "typer>=0.12,<1.0", "rich>=13.0,<16.0", "apscheduler>=3.10,<4.0", "httpx>=0.27,<1.0", "certifi>=2026.10.19", # GHSA-6q48-6c7w-9gw2: exclude compromised emSign root "python-dotenv>=1.0,<2.0", "mcp[cli]>=1.30,<2.0", "vmware-policy>=1.25.0,<2.0", # Read-only cluster-health triage (summary + HTML snapshot) is owned by # vmware-monitor; AIops delegates to it so a conversation with the AIops # entry point can produce the same report without duplicating the code. "vmware-monitor>=2.4.2,<3.0", # unreadable host != down, login refused -> role error ] [project.urls] Homepage = "https://github.com/vmware-skills/VMware-AIops" Repository = "https://github.com/vmware-skills/VMware-AIops" Issues = "https://github.com/vmware-skills/VMware-AIops/issues" Changelog = "https://github.com/vmware-skills/VMware-AIops/blob/main/RELEASE_NOTES.md" [dependency-groups] dev = [ "pytest>=8.0,<10.0", "pytest-cov>=5.0,<8.0", "ruff>=0.5,<1.0", ] [project.scripts] vmware-aiops = "vmware_aiops.cli:app" vmware-aiops-mcp = "vmware_aiops.mcp_server.server:main" [tool.hatch.build.targets.wheel] packages = ["vmware_aiops"] # Dev-only: resolve vmware-monitor from the local workspace so the delegated # cluster-health summary uses the in-progress version. uv-specific and stripped # from the published wheel — the real requirement stays `vmware-monitor>=1.8.0` # in [project.dependencies]. Released together at the same family version. [tool.uv.sources] vmware-monitor = { path = "../VMware-Monitor", editable = true } [tool.ruff] line-length = 100 target-version = "py310" [tool.ruff.lint] select = ["E", "F", "I", "N", "W", "UP"] [tool.pytest.ini_options] testpaths = ["tests"] markers = [ "unit: Unit tests", "integration: Integration tests (require vCenter)", "capability: Capability evals — scored trends, not pass/fail gates. Excluded from the default run (they measure quality, so <100% is expected and must not read as a broken build). Run them with: pytest -m capability", ] # Capability evals are opt-in; see the marker description above. addopts = "-m 'not capability'"