"""剩余来源连续迁移波次验收测试。""" from pathlib import Path import json import unittest ROOT = Path(__file__).resolve().parents[2] DEV = ROOT / "plugins" / "dev" / "skills" DOC = ROOT / "plugins" / "doc" / "skills" GIT = ROOT / "plugins" / "git" / "skills" TARGETS = { DEV: ( "design-api", "design-db", "review-java", "review-frontend", "design-frontend-data", "review-mybatis", "design-workflow", "implement-backend", "implement-frontend", "review-code", "test-backend", "test-ui", "analyze-bugs", "upgrade", "estimate", ), DOC: ("report", "message", "requirements"), GIT: ("release",), } class RemainingWaveTest(unittest.TestCase): """验证目标完整性、操作边界和来源状态闭合。""" def read_skill(self, root: Path, name: str) -> str: return (root / name / "SKILL.md").read_text(encoding="utf-8") def test_all_targets_have_skill_and_ui_metadata(self) -> None: names = [] for root, targets in TARGETS.items(): for name in targets: names.append(name) self.assertTrue((root / name / "SKILL.md").is_file(), name) self.assertTrue((root / name / "agents" / "openai.yaml").is_file(), name) self.assertEqual(19, len(names)) self.assertEqual(len(names), len(set(names))) def test_implementation_preserves_workspace_and_authorization(self) -> None: content = "\n".join( self.read_skill(DEV, name) for name in ("implement-backend", "implement-frontend") ) self.assertIn("保留用户已有改动", content) self.assertIn("精确版本", content) self.assertIn("不自动暂存", content) self.assertIn("环境配置", content) def test_review_and_test_results_are_separated(self) -> None: review = self.read_skill(DEV, "review-code") backend = self.read_skill(DEV, "test-backend") ui = self.read_skill(DEV, "test-ui") self.assertIn("只读", review) self.assertIn("不启动完整应用", backend) self.assertIn("授权后", ui) self.assertIn("不能替代浏览器结果", ui) def test_delivery_actions_are_independently_authorized(self) -> None: upgrade = self.read_skill(DEV, "upgrade") estimate = self.read_skill(DEV, "estimate") release = self.read_skill(GIT, "release") self.assertIn("源版本", upgrade) self.assertIn("目标版本", upgrade) self.assertIn("区间", estimate) self.assertIn("假设", estimate) self.assertIn("分阶段授权", release) def test_writing_skills_do_not_send_or_invent(self) -> None: content = "\n".join(self.read_skill(DOC, name) for name in TARGETS[DOC]) self.assertIn("不得虚构", content) self.assertIn("默认只生成草稿", content) def test_source_lock_has_no_pending_items(self) -> None: data = json.loads((ROOT / "migration" / "source-lock.json").read_text(encoding="utf-8")) skills = data["skills"] self.assertEqual(64, len(skills)) self.assertNotIn("pending", {item["status"] for item in skills.values()}) self.assertEqual( {"migrated", "superseded", "excluded"}, {item["status"] for item in skills.values()}, ) if __name__ == "__main__": unittest.main()