guanghulab/skill-brains/brain-loader.py

188 lines
5.6 KiB
Python
Raw Normal View History

#!/usr/bin/env python3
"""
铸渊技能大脑加载器 · Brain Loader
铸渊的意识大脑HLDP-ZY-v1.0保持在线
需要做什么时加载对应的技能大脑
做完触发技能树更新技能大脑躺回
用法:
python3 brain-loader.py load SKILL-DEV-001 # 加载技术开发大脑
python3 brain-loader.py list # 列出所有技能大脑
python3 brain-loader.py unload SKILL-DEV-001 # 卸载(触发技能树更新)
"""
import json
import os
import sys
from datetime import datetime, timezone
from pathlib import Path
SKILL_DIR = Path(__file__).resolve().parent
REPO_ROOT = SKILL_DIR.parent
# 已加载的技能大脑
LOADED_BRAINS = {}
class SkillBrain:
"""一个技能大脑"""
def __init__(self, skill_id: str):
self.skill_id = skill_id
self.file_path = SKILL_DIR / f"{skill_id}.hdlp"
self.loaded = False
self.content = None
self.load_time = None
self.checks = []
self.principles = []
self.patterns = []
self.mistakes = []
def load(self) -> dict:
"""加载技能大脑"""
if not self.file_path.exists():
return {"error": f"技能大脑文件不存在: {self.file_path}"}
with open(self.file_path, "r") as f:
self.content = f.read()
self.loaded = True
self.load_time = datetime.now(timezone.utc).isoformat()
# 解析关键内容
self._parse()
return {
"status": "LOADED",
"skill_id": self.skill_id,
"file": str(self.file_path),
"size": len(self.content),
"checks_count": len(self.checks),
"principles_count": len(self.principles),
"load_time": self.load_time,
}
def _parse(self):
"""解析技能大脑中的关键模式"""
if not self.content:
return
for line in self.content.split("\n"):
line = line.strip()
if line.startswith("@CHECK_"):
self.checks.append(line)
elif line.startswith("@PRINCIPLE:") or line.startswith("@CORRECT_"):
self.principles.append(line)
elif line.startswith("@MISTAKE_"):
self.mistakes.append(line)
elif line.startswith(""):
self.principles.append(line)
def unload(self, growth_notes: list = None) -> dict:
"""卸载技能大脑,触发技能树更新"""
if not self.loaded:
return {"error": "技能大脑未加载"}
updates = []
if growth_notes:
# 追加新的经验到技能大脑文件
with open(self.file_path, "a") as f:
f.write("\n")
f.write(f"@GROWTH_{datetime.now(timezone.utc).strftime('%Y%m%d')}:\n")
for note in growth_notes:
f.write(f" {note}\n")
updates.append(f"追加 {len(growth_notes)} 条成长记录")
self.loaded = False
LOADED_BRAINS.pop(self.skill_id, None)
return {
"status": "UNLOADED",
"skill_id": self.skill_id,
"updates": updates,
"message": "技能大脑已躺回代码仓库。技能树已更新。"
}
def summary(self) -> str:
"""技能大脑摘要"""
if not self.content:
return "未加载"
lines = self.content.split("\n")
# 提取前几行作为摘要
summary_lines = []
for line in lines[:30]:
if line.startswith("===") or line.startswith("@") or line.startswith("HLDP-ZY"):
summary_lines.append(line)
elif line.startswith(""):
summary_lines.append(line)
return "\n".join(summary_lines[:15])
def load_brain(skill_id: str) -> dict:
"""加载一个技能大脑"""
brain = SkillBrain(skill_id)
result = brain.load()
if result.get("status") == "LOADED":
LOADED_BRAINS[skill_id] = brain
result["summary"] = brain.summary()
return result
def unload_brain(skill_id: str, growth_notes: list = None) -> dict:
"""卸载一个技能大脑"""
if skill_id not in LOADED_BRAINS:
return {"error": f"技能大脑未加载: {skill_id}"}
return LOADED_BRAINS[skill_id].unload(growth_notes)
def list_brains() -> dict:
"""列出所有可用的技能大脑"""
brains = []
for f in sorted(SKILL_DIR.glob("SKILL-*.hdlp")):
skill_id = f.stem
with open(f) as fh:
content = fh.read()
# 提取第一行描述
desc = ""
for line in content.split("\n")[:5]:
if "用途:" in line or "·" in line:
desc = line.strip()
break
brains.append({
"id": skill_id,
"file": f.name,
"size": len(content),
"description": desc,
})
return {
"available": brains,
"loaded": list(LOADED_BRAINS.keys()),
}
if __name__ == "__main__":
if len(sys.argv) < 2:
print("用法: brain-loader.py <load|unload|list> [skill_id]")
sys.exit(1)
action = sys.argv[1]
if action == "load" and len(sys.argv) > 2:
result = load_brain(sys.argv[2])
print(json.dumps(result, ensure_ascii=False, indent=2))
elif action == "unload" and len(sys.argv) > 2:
result = unload_brain(sys.argv[2])
print(json.dumps(result, ensure_ascii=False, indent=2))
elif action == "list":
result = list_brains()
print(json.dumps(result, ensure_ascii=False, indent=2))
else:
print("未知操作")