[project] name = "placeroot" version = "0.10.0" description = "Ground AI agents in open map data. MCP server for Overture Maps — compact answers, no API key." dynamic = ["readme"] license = "MIT" license-files = ["LICENSE"] requires-python = ">=3.11" authors = [{ name = "Vibe Mapper", email = "chuo.fringer@gmail.com" }] keywords = ["mcp", "overture-maps", "geospatial", "ai-agents", "openstreetmap", "duckdb"] classifiers = [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Topic :: Scientific/Engineering :: GIS", "Topic :: Software Development :: Libraries", "Operating System :: OS Independent", ] dependencies = [ "duckdb>=1.5.5", "mcp[cli]>=2.0.0", "tzfpy>=1.3.3", ] [project.urls] Homepage = "https://placeroot.dev" Repository = "https://github.com/chuofringer/placeroot" Issues = "https://github.com/chuofringer/placeroot/issues" Documentation = "https://placeroot.dev/how-it-works.html" Changelog = "https://github.com/chuofringer/placeroot/blob/main/CHANGELOG.md" [project.scripts] placeroot = "placeroot.server:main" [dependency-groups] dev = [ "pytest>=8.0.0", "ruff>=0.6.0", ] # Only installed by the CI browser-smoke job (and locally via # `uv sync --group browser`) — a real Chromium binary has no business in the # offline `uv sync` / default `pytest` path. See scripts/browser_smoke.py. browser = [ "playwright>=1.40.0", ] [build-system] requires = ["hatchling", "hatch-fancy-pypi-readme>=24.1.0"] build-backend = "hatchling.build" # PyPI renders the README standalone, so repo-relative links and image srcs # 404 there. This keeps README.md relative (correct on GitHub, including # branch views) and rewrites to absolute GitHub URLs only in the built # package metadata — same idea as scripts/sync_npm_readme.py for npm. # One exception: the hero banner and header links are absolute-to-main in # the source (so mcpservers.org, which renders the README off-GitHub, can # resolve them), at the cost that a branch view shows main's versions; the # last two substitutions below re-pin them to the tag. # URLs pin the release tag ($HFPR_VERSION, filled in at build time) rather # than the mutable main branch, so a published package's README keeps # pointing at the docs of the version it shipped with. The patterns are # kept character-identical to scripts/sync_npm_readme.py's; a test # (tests/test_npm_readme_sync.py) fails if the two copies drift. [tool.hatch.metadata.hooks.fancy-pypi-readme] content-type = "text/markdown" [[tool.hatch.metadata.hooks.fancy-pypi-readme.fragments]] path = "README.md" # GFM alerts ([!NOTE]) are GitHub-web-only; PyPI's renderer would print the # marker as literal text, so it becomes a plain bold blockquote lead-in. [[tool.hatch.metadata.hooks.fancy-pypi-readme.substitutions]] pattern = '> \[!NOTE\]' replacement = '> **Note:**' [[tool.hatch.metadata.hooks.fancy-pypi-readme.substitutions]] pattern = '\]\((?!https?://|#|mailto:)([^)]+)\)' replacement = '](https://github.com/chuofringer/placeroot/blob/v$HFPR_VERSION/\1)' [[tool.hatch.metadata.hooks.fancy-pypi-readme.substitutions]] pattern = 'src="(?!https?://)([^"]+)"' replacement = 'src="https://raw.githubusercontent.com/chuofringer/placeroot/v$HFPR_VERSION/\1"' [[tool.hatch.metadata.hooks.fancy-pypi-readme.substitutions]] pattern = 'srcset="(?!https?://)([^"]+)"' replacement = 'srcset="https://raw.githubusercontent.com/chuofringer/placeroot/v$HFPR_VERSION/\1"' [[tool.hatch.metadata.hooks.fancy-pypi-readme.substitutions]] pattern = 'href="(?!https?://|#|mailto:)([^"]+)"' replacement = 'href="https://github.com/chuofringer/placeroot/blob/v$HFPR_VERSION/\1"' # The hero banner and header links are absolute-to-main in the root # README so off-GitHub renderers (mcpservers.org shows the README on its # own domain) can resolve them; re-pin them here so published packages # keep the tag invariant. [[tool.hatch.metadata.hooks.fancy-pypi-readme.substitutions]] pattern = 'https://raw\.githubusercontent\.com/chuofringer/placeroot/main/' replacement = 'https://raw.githubusercontent.com/chuofringer/placeroot/v$HFPR_VERSION/' [[tool.hatch.metadata.hooks.fancy-pypi-readme.substitutions]] pattern = 'https://github\.com/chuofringer/placeroot/blob/main/' replacement = 'https://github.com/chuofringer/placeroot/blob/v$HFPR_VERSION/' [tool.hatch.build.targets.wheel] packages = ["src/placeroot"] # The sdist follows VCS-tracked files (so .claude/, .venv/, dist/ — all # gitignored — are already excluded, keeping a local `uv build` identical to # a clean CI checkout). Drop the couple of tracked dev-only files that add # nothing for someone installing from source. [tool.hatch.build.targets.sdist] exclude = [ ".gitignore", ".python-version", ".github", "npm", "scripts/browser_smoke.py", ] [tool.pytest.ini_options] addopts = "-m 'not live'" markers = [ "live: hits real Overture S3 data; excluded by default, run with -m live", ] [tool.ruff] line-length = 100 [tool.ruff.lint] select = ["E", "F", "I", "UP"]