60 lines
2.4 KiB
Python
60 lines
2.4 KiB
Python
"""验证知识管理批次的职责边界、中性模板和模式路由。"""
|
|
|
|
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()
|