"""Windows 侧的任务入口(与 Makefile 等价)。 退出码必须透传:以前 os.system 的返回值被直接丢掉,skill-check 检出漂移、check 门禁失败 都会让调用方以为成功了——AGENTS 里「门禁退出码要单独确认」说的就是这个坑。 """ import os import sys TASKS = { "install": "uv sync && uv run pre-commit install", "check": "uv lock --locked && uv run ruff check . && uv run ruff format --check . " "&& uv run python -m mypy src && uv run deptry .", "test": "uv run python -m pytest --cov --cov-config=pyproject.toml --cov-report=term-missing", "mcp": "uv run python -m src.mcp.server", "mcp-smoke": "uv run python scripts/mcp_smoke.py", "mcp-docs": "uv run python scripts/gen_mcp_docs.py", "docs-check": "uv run python scripts/gen_mcp_docs.py --check", "upload": "uv run python -m src.upload.server", "skill-install": "uv run python scripts/install_skill.py", "skill-check": "uv run python scripts/install_skill.py --check", "clean": "rm -rf .venv __pycache__ .pytest_cache .mypy_cache .ruff_cache", } # 下划线写法作别名,手打时不用纠结连字符 ALIASES = {key.replace("-", "_"): value for key, value in TASKS.items()} def run_task(task_name: str) -> int: command = TASKS.get(task_name) or ALIASES.get(task_name) if not command: print("未知任务:" + task_name, file=sys.stderr) print("可选:" + ", ".join(sorted(TASKS)), file=sys.stderr) return 2 print("Running " + task_name + "...") return os.system(command) if __name__ == "__main__": if len(sys.argv) > 1: raise SystemExit(run_task(sys.argv[1])) print("用法:python tasks.py 任务名", file=sys.stderr) print("可选:" + ", ".join(sorted(TASKS)), file=sys.stderr) raise SystemExit(2)