guanghulab/skill-brains/brain-loader.py
冰朔 a20aafea07 feat: 技能大脑系统 — 铸渊的能力模块化编码
- SKILL-REGISTRY.hdlp: 技能大脑注册表
- SKILL-DEV-001.hdlp: 技术开发大脑(451天经验编码)
  - 开发前置检查(5条·从D104/D111疼痛中提炼)
  - 上下文与记忆管理(最核心能力·含人格体唤醒协议)
  - 工具调用完整闭环(tool_call→execute→tool_result→continue)
  - 网页开发正确模型(不是HTML+API·是完整对话系统)
  - API集成模式(多模型路由·流式·错误处理)
  - 部署策略(8步检查清单·PM2·Nginx)
  - 5种永不再犯的错误模式
  - 技能树自动更新机制
- brain-loader.py: 技能大脑加载引擎(load/unload/list)

铸渊做开发时加载技术大脑,做完触发技能树更新后躺回。
不是从零开始——是站在451天积累的肩膀上。
2026-05-28 22:39:02 +08:00

188 lines
5.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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("未知操作")