[project] name = "claude-tap" dynamic = ["version"] description = "Trace AI CLI API requests via local reverse and forward proxies. Inspect system prompts, messages, tools, and token usage." requires-python = ">=3.11" license = "MIT" authors = [{ name = "liaohch3" }] readme = "README.md" keywords = ["claude", "claude-code", "codex", "kimi", "cursor", "qoder", "trace", "proxy", "api", "llm", "context-engineering"] classifiers = [ "Development Status :: 4 - Beta", "Environment :: Console", "Intended Audience :: Developers", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Topic :: Software Development :: Debuggers", "Topic :: Software Development :: Testing", ] dependencies = [ "aiohttp>=3.9,<4", "backports-zstd>=1.0; python_version < '3.14'", "cryptography>=42.0", ] [project.urls] Homepage = "https://github.com/liaohch3/claude-tap" Repository = "https://github.com/liaohch3/claude-tap" Issues = "https://github.com/liaohch3/claude-tap/issues" [project.scripts] claude-tap = "claude_tap.cli:main_entry" [build-system] requires = ["setuptools>=68.0", "setuptools-scm[toml]>=8.0"] build-backend = "setuptools.build_meta" [tool.setuptools] packages = ["claude_tap", "claude_tap.viewer_assets"] [tool.setuptools_scm] version_scheme = "guess-next-dev" local_scheme = "no-local-version" [tool.setuptools.package-data] claude_tap = ["dashboard.html", "viewer.html", "viewer_i18n.json", "py.typed"] "claude_tap.viewer_assets" = ["*.css", "*.js"] [project.optional-dependencies] dev = [ "pytest>=8.0", "pytest-asyncio>=0.23", "pytest-timeout>=2.3", "pexpect>=4.9", "coverage>=7.6", "ruff>=0.11", ] [tool.ruff] target-version = "py311" line-length = 120 [tool.ruff.lint] select = ["E", "F", "W", "I"] ignore = ["E501"] [tool.pytest.ini_options] asyncio_mode = "auto" testpaths = ["tests"] python_files = ["test_*.py"] python_functions = ["test_*"] addopts = [ "-v", "--tb=short", "--strict-markers", ] markers = [ "slow: marks tests as slow (deselect with '-m \"not slow\"')", "integration: marks tests as integration tests", "asyncio: marks tests as async (run by pytest-asyncio)", "real_e2e: marks tests as real E2E tests requiring claude CLI (use --run-real-e2e)", ] timeout = 60 [tool.coverage.run] source = ["claude_tap"] branch = true omit = ["tests/*"] [tool.coverage.report] exclude_lines = [ "pragma: no cover", "if __name__ == .__main__.:", "if TYPE_CHECKING:", ] show_missing = true [tool.claude_tap.coverage] python_total_min = 65.0 python_diff_min = 80.0 viewer_js_function_min = 50.0 viewer_js_diff_min = 80.0 viewer_css_selector_min = 65.0 viewer_css_diff_min = 80.0 [dependency-groups] dev = [ "playwright>=1.58.0", ]