[project] name = "comfyui-openclaw" description = "Your own personal AIGC Factory. Any picture. Any reel. The Comfy way.©️" version = "1.0.7" license = {text = "MIT"} readme = "README.md" requires-python = ">=3.10" # S57: cryptography is required for Fernet AEAD secrets-at-rest encryption. # S85: defusedxml is required for scanner-recognized fail-closed WeChat XML parsing. dependencies = ["cryptography>=41.0", "defusedxml>=0.7.1"] [project.optional-dependencies] # WeChat AES encrypted ingress mode (R82) — lazy-imported, only needed when encrypt_type=aes wechat-aes = ["pycryptodomex>=3.20"] [project.urls] Repository = "https://github.com/rookiestar28/ComfyUI-OpenClaw" Documentation = "https://github.com/rookiestar28/ComfyUI-OpenClaw#readme" "Bug Tracker" = "https://github.com/rookiestar28/ComfyUI-OpenClaw/issues" [tool.comfy] PublisherId = "rookiestar" DisplayName = "ComfyUI OpenClaw" Icon = "" # ======================================== # Development Tools Configuration # ======================================== [tool.ruff] # Ruff replaces flake8, isort, and other linters target-version = "py310" line-length = 88 indent-width = 4 [tool.ruff.lint] # Enable pycodestyle (E, W), Pyflakes (F), isort (I), and more select = [ "E", # pycodestyle errors "W", # pycodestyle warnings "F", # Pyflakes "I", # isort "N", # pep8-naming "UP", # pyupgrade "B", # flake8-bugbear "C4", # flake8-comprehensions "SIM", # flake8-simplify "RUF", # Ruff-specific rules ] ignore = [ "E501", # Line too long (handled by formatter) "B008", # Do not perform function call in argument defaults "B904", # Within an except clause, raise exceptions with from err ] [tool.ruff.lint.per-file-ignores] "__init__.py" = ["F401"] # Allow unused imports in __init__.py "tests/*" = ["S101"] # Allow assert statements in tests [tool.ruff.format] quote-style = "double" indent-style = "space" skip-magic-trailing-comma = false line-ending = "lf" [tool.black] line-length = 88 target-version = ["py310"] [tool.mypy] python_version = "3.10" warn_return_any = true warn_unused_configs = false disallow_untyped_defs = false # Start lenient, can tighten later disallow_any_unimported = false explicit_package_bases = true no_site_packages = true ignore_missing_imports = true no_implicit_optional = true warn_redundant_casts = true warn_unused_ignores = true warn_no_return = true check_untyped_defs = true strict_equality = true # Production paths governed by tests/static_analysis_policy.json. files = [ "__init__.py", "config.py", "api", "connector", "models", "nodes", "services", "scripts", ] # Ignore missing imports for ComfyUI and external packages [[tool.mypy.overrides]] module = [ "aiohttp.*", "server", "folder_paths", ] ignore_missing_imports = true [tool.pytest.ini_options] testpaths = ["tests"] python_files = ["test_*.py"] python_classes = ["Test*"] python_functions = ["test_*"] norecursedirs = [".git", ".tox", "dist", "build", "*.egg", "patterns"] addopts = [ "-v", "--strict-markers", "--tb=short", "--ignore=__init__.py", # "--cov=.", # "--cov-report=term-missing", # "--cov-report=html", # "--cov-report=xml", ] markers = [ "slow: marks tests as slow (deselect with '-m \"not slow\"')", "integration: marks tests as integration tests", "unit: marks tests as unit tests", "asyncio: marks tests as async (pytest-asyncio)", ] [tool.coverage.run] source = ["."] omit = [ "tests/*", "**/test_*.py", "**/__pycache__/*", ".venv/*", "venv/*", ] [tool.coverage.report] fail_under = 55.0 show_missing = true skip_covered = true precision = 2 exclude_lines = [ "pragma: no cover", "def __repr__", "raise AssertionError", "raise NotImplementedError", "if __name__ == .__main__.:", "if TYPE_CHECKING:", "@abstractmethod", ] [tool.isort] profile = "black" line_length = 88