- 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天积累的肩膀上。
188 lines
5.6 KiB
Python
188 lines
5.6 KiB
Python
#!/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("未知操作")
|