Files
nickol-knx-mcp/pyproject.toml
T
Nikolay Miroshnichenko 264767f91f ci: ruff + mypy gates, Python 3.13/3.14 in the matrix, Dependabot
The CI ran tests only. Added a lint job with two narrow gates:

ruff with select = E9,F — syntax errors and pyflakes (undefined names, unused
imports, broken f-strings). Style rules are deliberately off: the full default
set flagged 202 things, almost all cosmetic, and a gate nobody reads is not a
gate. Fixed the 9 findings it did have (8 unused imports, 1 empty f-string).

mypy, clean at 13 errors fixed. None of the 13 was a live bug, so every fix is
an annotation or a local rename: the two accumulators in advanced, the block map
in appprog_parser, a reused loop name in project and in repair, a TypedDict lost
through dict(), a mixed-type summary dict in handover. Two are worth naming.
_CH_TOKEN_RE now captures the letter prefix directly instead of re-matching its
own capture, which removes an unguarded .group() on a possibly-None match; the
regex accepts exactly the same strings. repair's status-DPT lookup now spells out
the None case, which is what dict.get already did since None is not a key there.

Verified the fixes moved nothing: the full suite passes, and the corpus guard
reports no drift across all six real projects, the 3646-GA one included.

Matrix extended to 3.13 and 3.14; both were smoke-tested locally first.
Dependabot config for pip and github-actions, weekly and grouped so a quiet week
is one PR. Dependabot security updates and CodeQL default setup enabled in the
repository settings.
2026-09-12 21:36:23 +02:00

61 lines
2.0 KiB
TOML

[project]
name = "nickol-knx-mcp"
version = "0.8.1"
description = "Design-time KNX/ETS6 project assistant as an MCP server (parse .knxproj, validate, generate HA YAML + ETS CSV/XML). No live bus access."
readme = "README.md"
requires-python = ">=3.10"
license = { text = "MIT" }
authors = [{ name = "Nikolay Miroshnichenko" }]
keywords = ["knx", "ets", "ets6", "home-assistant", "mcp", "model-context-protocol", "smart-home", "home-automation"]
classifiers = [
"Development Status :: 4 - Beta",
"Intended Audience :: Developers",
"License :: OSI Approved :: MIT License",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Topic :: Home Automation",
"Topic :: Software Development :: Libraries",
]
dependencies = [
"mcp>=1.10,<2", # v2 renames mcp.server.fastmcp.FastMCP -> mcp.server.MCPServer (breaking)
"xknxproject>=3.8",
"PyYAML>=6.0",
"defusedxml>=0.7", # hardened XML parsing of untrusted .knxproj (XXE/billion-laughs)
]
[project.urls]
Homepage = "https://github.com/NickoScope/nickol-knx-mcp"
Repository = "https://github.com/NickoScope/nickol-knx-mcp"
Issues = "https://github.com/NickoScope/nickol-knx-mcp/issues"
Changelog = "https://github.com/NickoScope/nickol-knx-mcp/blob/main/CHANGELOG.md"
[project.scripts]
nickol-knx-mcp = "nickol_knx_mcp.server:main"
[build-system]
requires = ["setuptools>=68"]
build-backend = "setuptools.build_meta"
[tool.setuptools]
packages = ["nickol_knx_mcp"]
[tool.setuptools.package-data]
nickol_knx_mcp = ["room_templates/*.yaml", "room_templates/*.md"]
[tool.ruff]
target-version = "py310"
line-length = 110
[tool.ruff.lint]
# Deliberately narrow: real errors, not style. E9 = syntax/IO errors, F = pyflakes
# (undefined names, unused imports, broken f-strings). Style rules are left off so the
# gate stays meaningful instead of noisy.
select = ["E9", "F"]
[tool.mypy]
python_version = "3.10"
ignore_missing_imports = true
files = ["nickol_knx_mcp"]