821822a408
先体检再动手:44 个 Markdown,相对链接 0 处失效,逐份分辨「现状文档」与「历史记录」。 历史记录(error-experience/*、架构分析、已过时的全景图)保留原貌只加指路,不重写。 - 新增 scripts/gen_mcp_docs.py:起 stdio 子进程 list_tools 后整段重生成 docs/MCP.md 的「工具参考」 (291 行 / 25 个工具,占这份文档四分之三,手工维护必漂)。--check 漂移退出码 1,--diff 打印差异; GROUPS 是刻意闸门——加了工具没登记就报错,防止「有工具没文档」。接进 make mcp-docs / docs-check 与 tasks.py 同名任务 - 生成时抓到两处真实漂移:invoice_type 线上是 string/null 且默认 null,文档手写成 null/string 无默认; case_list 无参数在旧文档里写成一句散文。现已与线上一字不差 - 过期说法清理:src/README 的「browser_* 与 submit_* 尚未实现」(browser 早已联机验通、submit 定案不做); tests/README 的「当前 107 例」(现 148)与缺 test_mcp_browser.py 一行、「Playwright 填报不进单测」 (现在选择器分支/状态判定/错误路径有单测,只有真实页面需要联机);.agents/README 的「Cursor Agent」; plans/README 里还写着「提交加确认 token」;scripts/data/README 表格有一行跑到正文后面 - 工程实践指南里把已删除的 CLI 入口当例子:mypy src/main.py、make run、python src/main.py 全部改为现状 (mypy src / 唯一入口 python -m src.mcp.server),并补上「任务必须透传退出码」这条本轮踩到的坑 - README:「还没做完」重写为「边界与未完事项」——把刻意不做(提交、submit_* 整类、删除、撤回)与 真的未完(科目/项目/人员固定取第 N 行,待业务口径)分开写;开发命令补 mcp-docs / docs-check / skill-install - 操作指南:7.3 经济科目与项目从「要改就改索引」改成「已知限制,等口径,填报后务必人工核对」; 相关命令补齐新目标;MCP.md 标准流程补上填报与「到此为止,提交由人」两步,并改掉与新纪律矛盾的 「把截图报给用户」表述 - AGENTS:命令表加两行;测试段给出改工具后的固定顺序(mcp-smoke → mcp-docs → 重连宿主);提交纪律 补「make check 之外还有 docs-check / skill-check 两道专项门禁」;截图产物改标注为排查证据 - install_skill.py:拿不到主目录时退出码改 4,别和「漂移」的 1 混成一类 - 已核对:submit_execute / src/main.py 在文档里的残留都是禁止性表述或「已删除」清单项,不是现状描述 验证:ruff / format --check / mypy src / deptry / pytest 148 passed / mcp-smoke 25 工具 / docs-check 与 skill-check 均退出码 0。--no-verify 提交并手跑等价检查。
46 lines
1.8 KiB
Python
46 lines
1.8 KiB
Python
"""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)
|