# Muse 安装、生成、检查、测试和构建入口。 # 每个声明命令都必须真实可执行(执行与验收.md:声明命令前验证它真实可执行)。 .PHONY: 安装 格式 格式写入 类型 检查 测试 数据库测试 宿主测试 前端安装 前端检查 前端测试 生成 构建 资源核对 # 安装:建立并锁定 Python 依赖环境 安装: uv sync --group dev 前端安装: pnpm --dir web install --frozen-lockfile 前端检查: pnpm --dir web run lint pnpm --dir web run typecheck pnpm --dir web exec tsc --noEmit --module esnext --moduleResolution bundler --target es2022 --skipLibCheck --typeRoots node_modules/@types --types node ../src/muse/基础设施/宿主/Pi工具桥.ts 前端测试: pnpm --dir web run test # 格式:静态检查(ruff lint + 格式校验;旧测试树由旧环境维护,不进入范围) 新测试目录 := $(shell for d in tests/单元 tests/契约 tests/集成 tests/架构; do [ -d "$$d" ] && printf '%s ' "$$d"; done) 格式: uv run ruff check src $(新测试目录) tests/conftest.py 工具 uv run ruff format --check src $(新测试目录) tests/conftest.py 工具 # 格式写入:按项目规则实际格式化 格式写入: uv run ruff check --fix src $(新测试目录) tests/conftest.py 工具 uv run ruff format src $(新测试目录) tests/conftest.py 工具 # 类型:pyright 类型检查 类型: uv run pyright # 检查:格式 + 类型 + 索引核对的统一入口 检查: 格式 类型 uv run python 工具/维护索引.py --检查 # 测试:默认离线(按标记剔除外部环境用例;未标记用例在 socket 防护下运行) # 用法:make 测试 全部离线用例 # make 测试 用例=TC-a5c7d4adafe3 按稳定用例 ID 选择 测试: uv run pytest -m "not 数据库 and not 网络 and not 真实模型 and not 浏览器 and not 宿主" $(if $(用例),--case $(用例),) # 数据库测试:需要 MUSE_TEST_DATABASE_URL;缺失即失败,不静默跳过 数据库测试: @test -n "$$MUSE_TEST_DATABASE_URL" || { echo "缺少 MUSE_TEST_DATABASE_URL(隔离库连接串);拒绝静默跳过" >&2; exit 1; } uv run pytest --外部环境 -m "数据库 and not 宿主" 宿主测试: @test -n "$$MUSE_TEST_DATABASE_URL" -a -n "$$MUSE_PI_NODE" -a -n "$$MUSE_PI_PACKAGE" || { echo "缺少隔离库或固定Pi/Node路径"; exit 1; } uv run pytest --外部环境 -m 宿主 # 迁移:对配置指向的目标库执行显式迁移(维护命令,不在启动时自动执行) 迁移: uv run python -m muse 迁移 $(配置) # 生成:资源包、接口合同与索引(生成物只由登记输入产生) 生成: uv run python 工具/生成接口.py cd web && pnpm exec openapi-typescript ../docs/接口契约/生成/openapi.generated.json -o src/接口/生成/类型.ts pnpm --dir web run build uv run python 工具/构建资源包.py uv run python 工具/维护索引.py --写入 # 构建:先保证生成物最新,再做可安装包 构建: 生成 uv build # 资源核对:安装包内资源与清单哈希一致 资源核对: uv run python -c "from muse.资源加载 import 核对资源; m = 核对资源(); print('资源清单发布身份:', m['发布身份'], '条目数:', len(m['资源']))"