"""验证知识管理批次的职责边界、中性模板和模式路由。""" from __future__ import annotations import unittest from pathlib import Path ROOT = Path(__file__).resolve().parents[2] KNOWLEDGE = ROOT / "plugins/knowledge/skills" class KnowledgeBatchTests(unittest.TestCase): """检查四个 Skill 不重叠,并保持项目知识目录一致。""" def read(self, relative: str) -> str: """读取待验证的 Skill 资源。""" return (KNOWLEDGE / relative).read_text(encoding="utf-8") def test_trace_is_evidence_based_and_does_not_auto_write(self) -> None: """偏离复盘应使用中性失效分类,不能自动修改规则。""" text = self.read("trace/SKILL.md") for value in ("missing", "unread", "mismatch", "misapplied", "insufficient", "尚未执行"): self.assertIn(value, text) self.assertNotIn("七问", text) def test_distill_routes_long_term_knowledge_and_excludes_handoff(self) -> None: """知识提炼和任务交接必须具有不同产物边界。""" text = self.read("distill/SKILL.md") routing = self.read("distill/references/routing.md") self.assertIn("不生成接续提示词", text) for path in (".craftkit/knowledge/pitfalls/", ".craftkit/knowledge/decisions/", ".craftkit/standards/"): self.assertIn(path, routing) def test_lessons_merges_full_lifecycle_without_fixed_categories(self) -> None: """经验初始化、维护、审计和提升应共享一个目录与中性模板。""" text = self.read("lessons/SKILL.md") for mode in ("`init`", "`curate`", "`audit`", "`promote`"): self.assertIn(mode, text) self.assertIn(".craftkit/knowledge/pitfalls/", text) index = self.read("lessons/assets/index.md") self.assertIn("当前尚未建立分类", index) self.assertNotIn("lowcode", index.casefold()) def test_worklog_requires_git_evidence_and_separate_write_permission(self) -> None: """工作日志不能推测工作量或自动写入日报文件。""" text = self.read("worklog/SKILL.md") self.assertIn("不把提交数量当作工作量", text) self.assertIn("范围内确实没有提交时如实说明", text) self.assertIn("需要新的明确授权", text) if __name__ == "__main__": unittest.main()