[build-system] requires = ["setuptools>=80", "wheel"] build-backend = "setuptools.build_meta" [project] name = "loushang" version = "0.1.0" license = "Apache-2.0" license-files = ["LICENSE", "NOTICE", "THIRD_PARTY_NOTICES.md"] requires-python = ">=3.11" dependencies = [ "anthropic>=0.89.0", "authlib>=1.6,<2", "cryptography<49; sys_platform == 'darwin' and platform_machine == 'x86_64'", "httpx>=0.28,<1", "markdown-it-py>=4.2,<5", "openai>=2.30.0", "packaging>=24,<27", "pillow>=12.2.0", "pygments>=2.19,<3", "wcwidth==0.8.2", ] [project.scripts] loushang = "loushang.coding.cli.__main__:main" loushang-tui = "loushang.coding.ui.cli:main" loushang-hosted = "loushang.coding.cli.hosted:main" loushang-hosted-tui = "loushang.coding.cli.hosted_client:main" loushang-mux = "loushang.coding.cli.mux:main" lmux = "loushang.coding.cli.lmux:main" loushang-plugin = "loushang.plugin.__main__:main" loushang-coding-plugin-smoke = "loushang.coding.plugin_author_smoke:main" loushang-coding-extension = "loushang.coding.extension_author:main" loushang-coding-plugin-status = "loushang.coding.plugin_support_status:main" loushang-package-cutover = "loushang.coding.cli.package_cutover:main" loushang-package-gc = "loushang.coding.cli.package_gc:main" loushang-package-repair = "loushang.coding.cli.package_repair:main" loushang-plugin-private-data = "loushang.coding.cli.plugin_private_data:main" loushang-worker-native = "loushang.coding.cli.package_worker_native:main" loushang-worker-windows-candidate = "loushang.coding.cli.package_worker_windows_candidate:main" [project.optional-dependencies] dev = [ "pytest>=8,<9", "pytest-cov>=7,<8", "ruff>=0.11,<1", "mypy>=1.15,<2", "types-Pygments>=2.19,<3", ] [tool.pytest.ini_options] pythonpath = ["src"] testpaths = ["tests"] addopts = ["--import-mode=importlib"] tmp_path_retention_count = 0 tmp_path_retention_policy = "none" markers = [ "e2e_smoke: focused cross-package end-to-end scenario for boundary changes", "live: real provider verification that may require network access and credentials", "requires_host_runtime: requires host loopback, process, or file-index capabilities unavailable in a restricted sandbox", "tui_render_contract: deterministic TUI render correctness, structural performance, and terminal-operation contract", "tui_terminal_backend: native POSIX PTY or Windows ConPTY driver conformance", "tui_terminal_contract: shared real CLI contract over the native terminal backend", "tui_tmux_integration: tmux pane, history, and scrollback integration contract", "vendor_verification: vendor or endpoint compatibility verification cases", ] [tool.ruff] target-version = "py311" [tool.ruff.lint] select = ["E4", "E7", "E9", "F", "I"] extend-select = ["B023", "RUF100", "SIM102", "SIM105", "UP006", "UP035"] [tool.ruff.lint.per-file-ignores] "examples/coding/*.py" = ["E402"] "examples/coding/extensions/*.py" = ["E402"] [tool.ruff.format] quote-style = "double" indent-style = "space" line-ending = "lf" [tool.mypy] python_version = "3.11" files = ["src/loushang/ai"] pretty = true show_error_codes = true show_column_numbers = true [[tool.mypy.overrides]] module = [ "loushang.ai", "loushang.ai.advanced.registry", "loushang.ai.structured", "loushang.ai.tool.*", ] disallow_untyped_defs = true [tool.setuptools] package-dir = {"" = "src"} [tool.setuptools.packages.find] where = ["src"] [tool.setuptools.package-data] "loushang" = ["py.typed"] "loushang.ai.model" = ["models.json"] "loushang.hosting" = ["native/*.c"] "loushang.coding._plugins.coding_lsp_default" = [ "plugin.json", "declarations/*.json", ] "loushang.coding._plugins.coding_arch_default" = [ "plugin.json", "declarations/*.json", ] "loushang.coding._plugins.coding_base" = [ "plugin.json", "declarations/*.json", "prompts/*.md", "skills/*/*.md", ] "loushang.harness.transcript.export" = ["*.html", "*.css", "*.js"]