# muse 应用包:安装、命令、依赖与检查配置。 # 边界:只约束安装、构建或编辑配置;不规范化作者正文、不替代业务权限与验收。 # 运行时依赖:数据库、模型传输、HTTP 服务等。 [build-system] requires = ["hatchling==1.32.0"] build-backend = "hatchling.build" [project] name = "muse" version = "0.1.0" description = "Muse:AI 驱动的长篇创作工具(单作者模块化单体)" requires-python = ">=3.12" dependencies = [ "fastapi>=0.115", "httpx>=0.28", "itsdangerous>=2.2", "jsonschema>=4.23", "referencing>=0.28.4", "psycopg[binary,pool]>=3.2", "pydantic>=2.0", "pyyaml>=6.0", "uvicorn>=0.30", ] [project.scripts] muse = "muse.__main__:main" [dependency-groups] dev = [ "pytest>=8.3", "pytest-timeout>=2.3", "ruff>=0.8", "pyright>=1.1.390", ] # 资源发布包(运行资源.zip、清单.json、工作台/)是 gitignore 的生成物: # 存在时打入 sdist/wheel(artifacts 同时作用于两目标),未生成时不阻塞全新环境安装。 [tool.hatch.build] # 迁移仅由数据库/迁移强制映射进入轮子,排除可编辑安装的同名投影。 exclude = ["src/muse/资源/迁移/**"] artifacts = ["src/muse/资源/**", "!src/muse/资源/迁移/**"] [tool.hatch.build.targets.sdist] include = ["/src", "/数据库/迁移", "/数据库/初始化", "/pyproject.toml", "/uv.lock", "/README.md"] [tool.hatch.build.targets.wheel.force-include] "数据库/迁移" = "muse/资源/迁移" [tool.hatch.build.targets.wheel] packages = ["src/muse"] [tool.pytest.ini_options] # 只收集新版用例目录;旧实现与旧测试树已退出本仓,不参与同一收集。 testpaths = ["tests/单元", "tests/契约", "tests/集成", "tests/架构", "tests/迁移", "tests/端到端", "tests/真实调用"] # 独立维护脚本以其目录为导入根;不把旧 muse 树加入路径。 pythonpath = ["src", "工具", "数据库/旧库迁移"] # 架构/契约/集成/单元 是目录级组织;完整用例身份绑定登记文件与符号。 addopts = "--strict-markers --timeout=120" markers = [ "安装包: 实际wheel/发布资源验收,不属于无包开发层", "case_id(id): 源码中的稳定用例身份与人工语义", "数据库: 显式外部执行需要 MUSE_TEST_DATABASE_URL;缺配置失败", "网络: 需要真实网络访问;必须显式标记", "真实模型: 需要真实模型调用与预算授权;必须显式标记", "浏览器: 需要真实浏览器与后端;必须显式标记", "宿主: 需要固定真实宿主与隔离数据库;必须显式选择", "慢: 单例超过三分钟的真实链用例;发现期默认排除,最终全量才跑", ] [tool.ruff] line-length = 100 target-version = "py312" src = ["src", "tests", "工具", "数据库/旧库迁移"] [tool.ruff.lint] select = ["E", "F", "W", "I", "B", "UP"] [tool.pyright] venvPath = "." venv = ".venv" include = ["src", "工具", "数据库/旧库迁移"] extraPaths = ["src", "工具", "数据库/旧库迁移"] pythonVersion = "3.12" typeCheckingMode = "standard"