mcqemu/pyproject.toml
Ryan Malloy ca105401c4 Release 2026.08.18: keep the docs site out of the sdist
The pre-publish audit caught the source distribution sweeping in the whole
docs-site tree, node_modules included: 7,178 files and 71 MB for a package
whose source is about thirty files. Excluded, which brings it back to 116 KB.

No secrets were exposed (no local .env exists), but this is exactly the case
the unpacked-sdist audit is meant to catch, and PyPI is immutable per version.
2026-08-18 13:22:51 -06:00

83 lines
2.2 KiB
TOML

[project]
name = "mcqemu"
version = "2026.08.18"
description = "MCP server for managing QEMU virtual machines"
readme = "README.md"
requires-python = ">=3.11"
authors = [{ name = "Ryan Malloy", email = "ryan@supported.systems" }]
license = "MIT"
keywords = ["mcp", "qemu", "qmp", "virtualization", "kvm", "sandbox"]
classifiers = [
"Development Status :: 4 - Beta",
"Intended Audience :: Developers",
"Intended Audience :: System Administrators",
"License :: OSI Approved :: MIT License",
"Operating System :: POSIX :: Linux",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.13",
"Topic :: System :: Emulators",
"Topic :: System :: Systems Administration",
]
dependencies = [
"fastmcp>=3.4.7,<4",
"qemu.qmp>=0.0.6",
]
[project.urls]
Documentation = "https://mcqemu.warehack.ing"
Repository = "https://git.supported.systems/warehack.ing/mcqemu"
[project.scripts]
mcqemu = "mcqemu.server:main"
[dependency-groups]
dev = [
"pytest>=8",
"pytest-asyncio>=1.0",
"ruff>=0.12",
]
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
[tool.hatch.build.targets.wheel]
packages = ["src/mcqemu"]
[tool.hatch.build.targets.sdist]
exclude = [
"CLAUDE.md",
".env",
".mcp.json",
"tests/",
# The docs site is a whole Astro project with its own node_modules; without
# this the sdist went from ~30 files to 7,178 and from kilobytes to 71 MB.
"docs-site/",
".venv/",
".pytest_cache/",
".ruff_cache/",
"dist/",
]
[tool.ruff]
line-length = 100
src = ["src", "tests"]
[tool.ruff.lint]
select = ["E", "F", "I", "UP", "B", "SIM", "ASYNC"]
# ASYNC109: `timeout` params here are deliberate LLM-facing tool parameters.
# ASYNC110: polling an external process's death has no event to await.
# ASYNC240: pathlib use is microsecond stat/exists checks, not bulk I/O.
# ASYNC230: the one blocking read is a bounded 256KB tail, not bulk I/O.
ignore = ["ASYNC109", "ASYNC110", "ASYNC230", "ASYNC240"]
[tool.pytest.ini_options]
asyncio_mode = "auto"
markers = [
"integration: boots real QEMU (run with '-m integration')",
]
addopts = "-m 'not integration'"