# ============================================================ # M-D 黄金测试:Skill manifest 扩展(capabilities/ragScopes/version) # + 健康探测历史 + 旧配置自动升级 # ============================================================ from __future__ import annotations import json from server.agent_core.skills import SkillRegistry def test_default_manifest_has_md_fields(tmp_path): reg = SkillRegistry(path=str(tmp_path / "skills.json")) s = reg.get("algo.stub") assert s is not None assert s["version"] == "1.0" assert "flex_schedule" in s["capabilities"] assert set(s["ragScopes"]) == {"process", "sop"} def test_legacy_config_upgraded_with_new_fields(tmp_path): path = tmp_path / "skills.json" legacy = {"skills": [{ "skill_id": "algo.legacy", "name": "旧算法", "endpoint": "http://x:1", "auth": "", "max_power": "P1", "track": "flex", "enabled": True, "timeout_sec": 60.0, "description": "", "golden_tests": [], }]} path.write_text(json.dumps(legacy), encoding="utf-8") reg = SkillRegistry(path=str(path)) s = reg.get("algo.legacy") assert s["version"] == "1.0" assert s["capabilities"] == ["flex_schedule"] assert s["ragScopes"] == [] # 升级已落盘 saved = json.loads(path.read_text(encoding="utf-8")) assert saved["skills"][0]["capabilities"] == ["flex_schedule"] def test_health_probe_records_history(tmp_path): reg = SkillRegistry(path=str(tmp_path / "skills.json")) reg.health("algo.stub") reg.health("algo.stub") hist = reg.history("algo.stub") assert len(hist) == 2 assert all(h["ok"] for h in hist) assert all("ts" in h for h in hist) def test_upsert_keeps_rag_scopes(tmp_path): reg = SkillRegistry(path=str(tmp_path / "skills.json")) reg.upsert({"skill_id": "algo.opt", "name": "外部优化器", "endpoint": "http://127.0.0.1:9000", "ragScopes": ["process"], "capabilities": ["flex_schedule", "due_promise"], "version": "2.1"}) s = reg.get("algo.opt") assert s["version"] == "2.1" assert s["ragScopes"] == ["process"] assert "due_promise" in s["capabilities"]