52 lines
1.9 KiB
Python
52 lines
1.9 KiB
Python
"""前端辅助 Skill 的结构与行为边界测试。"""
|
|
|
|
from pathlib import Path
|
|
import unittest
|
|
|
|
|
|
ROOT = Path(__file__).resolve().parents[2]
|
|
DEV_SKILLS = ROOT / "plugins" / "dev" / "skills"
|
|
|
|
|
|
def read_skill(name: str) -> str:
|
|
"""读取指定 Skill 的入口及引用文档。"""
|
|
folder = DEV_SKILLS / name
|
|
files = [folder / "SKILL.md", *sorted((folder / "references").glob("*.md"))]
|
|
return "\n".join(path.read_text(encoding="utf-8") for path in files)
|
|
|
|
|
|
class FrontendHelpersTest(unittest.TestCase):
|
|
"""验证三个 Skill 能互补协作且不恢复来源专有规则。"""
|
|
|
|
def test_component_requires_project_evidence(self) -> None:
|
|
content = read_skill("component")
|
|
self.assertIn(".craftkit/project.json", content)
|
|
self.assertIn(".craftkit/standards/frontend/components.md", content)
|
|
self.assertIn("不编造结论", content)
|
|
self.assertIn("官方文档", content)
|
|
self.assertIn("不复制依赖库文档", content)
|
|
|
|
def test_style_uses_existing_visual_authority(self) -> None:
|
|
content = read_skill("style")
|
|
self.assertIn("设计令牌", content)
|
|
self.assertIn("经用户确认后再修改", content)
|
|
self.assertIn("不内置固定矩阵", content)
|
|
|
|
def test_form_does_not_invent_business_rules(self) -> None:
|
|
content = read_skill("form")
|
|
self.assertIn("不自行确定字段必填", content)
|
|
self.assertIn("不设计接口", content)
|
|
self.assertIn("component", content)
|
|
|
|
def test_precise_skills_replace_router(self) -> None:
|
|
self.assertFalse((DEV_SKILLS / "guide").exists())
|
|
descriptions = {
|
|
name: (DEV_SKILLS / name / "SKILL.md").read_text(encoding="utf-8").split("---", 2)[1]
|
|
for name in ("component", "style", "form")
|
|
}
|
|
self.assertEqual(3, len(set(descriptions.values())))
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|