[build-system] requires = ["hatchling"] build-backend = "hatchling.build" [project] name = "clide" version = "1.0.0" description = "A TUI CLI IDE for Claude Code CLI" readme = "README.md" requires-python = ">=3.12" license = "MIT" authors = [ { name = "Jeroen Schweitzer", email = "you@example.com" } ] classifiers = [ "Development Status :: 3 - Alpha", "Environment :: Console", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Topic :: Software Development :: User Interfaces", ] dependencies = [ "textual>=0.50.0", "pyte>=0.8.0", "typer>=0.12.0", "pydantic>=2.0.0", "pydantic-settings>=2.0.0", "pluggy>=1.4.0", "rich>=13.0.0", "watchdog>=4.0.0", "wcwidth>=0.2.0", # Required by vendored pyte # Tree-sitter for syntax highlighting "tree-sitter>=0.21.0", "tree-sitter-python>=0.21.0", "tree-sitter-javascript>=0.21.0", "tree-sitter-typescript>=0.21.0", "tree-sitter-html>=0.21.0", "tree-sitter-css>=0.21.0", "tree-sitter-json>=0.21.0", "tree-sitter-yaml>=0.5.0", "tree-sitter-toml>=0.5.0", "tree-sitter-markdown>=0.2.0", "tree-sitter-rust>=0.21.0", "tree-sitter-go>=0.21.0", "tree-sitter-java>=0.21.0", "tree-sitter-bash>=0.21.0", ] [project.optional-dependencies] dev = [ "pytest>=8.0.0", "pytest-asyncio>=0.23.0", "pytest-textual-snapshot>=0.4.0", "pytest-cov>=4.0.0", "mypy>=1.8.0", "ruff>=0.3.0", "pre-commit>=3.0.0", ] build = [ "pyinstaller>=6.0.0", ] [project.scripts] clide = "clide.cli:app" [project.entry-points."clide.extensions"] # Built-in extensions registered here # example = "clide.extensions.builtin.example:ExampleExtension" [tool.hatch.build.targets.wheel] packages = ["clide"] [tool.pytest.ini_options] testpaths = ["tests"] asyncio_mode = "auto" asyncio_default_fixture_loop_scope = "function" addopts = [ "-v", "--tb=short", ] [tool.mypy] python_version = "3.12" strict = true warn_return_any = true warn_unused_configs = true exclude = ["tests", "dist", "build"] [tool.ruff] target-version = "py312" line-length = 100 src = ["clide", "tests"] [tool.ruff.lint] select = [ "E", # pycodestyle errors "W", # pycodestyle warnings "F", # Pyflakes "I", # isort "B", # flake8-bugbear "C4", # flake8-comprehensions "UP", # pyupgrade "ARG", # flake8-unused-arguments "SIM", # flake8-simplify "TCH", # flake8-type-checking "PTH", # flake8-use-pathlib "ASYNC", # flake8-async ] ignore = [ "E501", # line too long (handled by formatter) "ARG002", # unused method argument (Textual event handlers require these) "SIM102", # nested if (sometimes clearer) "SIM105", # contextlib.suppress (try-except-pass is clearer in context) "SIM115", # context handler for files (sometimes not applicable) "PTH123", # Path.open() vs open() (not always cleaner) ] [tool.ruff.lint.isort] known-first-party = ["clide"] [tool.coverage.run] source = ["clide"] branch = true [tool.coverage.report] exclude_lines = [ "pragma: no cover", "if TYPE_CHECKING:", "raise NotImplementedError", ]