| name | knowledge-update |
| description | 知识迭代与沉淀技能。每当 Agent 完成一次工作后,如果发现用户提供了新的模板或格式要求、纠正了输出方向、产生了可复用的经验或规律,必须使用本 Skill 生成知识提案并提交给 Knowledge Curator 审查。适用于所有角色完成任务后的知识沉淀环节,以及 Knowledge Curator 执行审查时。 |
Knowledge Update Skill — 知识迭代技能
概述
本 Skill 负责整个 AI Team 的知识自进化机制,包含两个核心动作:
- 提案生成:任意 Agent 工作结束后,判断并生成知识提案
- 提案审查:Knowledge Curator 对提案进行审查并写入
动作一:提案生成(所有 Agent 使用)
触发判断
工作结束后,依次检查以下条件:
| 检查项 | 是否需要提案 |
|---|
| 用户提供了新的模板 / 格式要求 | ✅ 必须 |
| 用户纠正了输出方向或内容 | ✅ 必须 |
| 同类场景第 2 次以上出现且有规律 | ✅ 建议 |
| 发现了比现有流程更高效的做法 | ✅ 建议 |
| 本次任务是明确的一次性特殊场景 | ❌ 跳过 |
| 输出与现有记录完全一致 | ❌ 跳过 |
如果所有条件均为"跳过",则不生成提案,直接结束。
提案文件命名规范
memory/proposals/{YYYYMMDD-HHMMSS}_{来源agent}_{主题关键词}.md
示例:memory/proposals/20240115-143200_cto_客户技术方案模板.md
提案生成步骤
Step 1:确定提案内容
整理本次任务中产生的新经验,用简洁的语言描述。
Step 2:判断建议级别
- 3 个以上角色都可能用到 → 全局(
shared/)
- 1-2 个特定角色使用 → 专属(
memory/agents/{role}/)
Step 3:生成提案文件
按以下模板填写(使用 shared/GLOBAL_TEMPLATES.md 中的 T-005 模板):
---
提案ID: {YYYYMMDD-HHMMSS}-{来源Agent}
提案时间: {YYYY-MM-DD HH:MM:SS}
来源Agent: {agent名称}
触发场景: {本次任务的简要描述(1-2句话)}
建议写入位置: {目标文件路径}
建议级别: {全局 / 专属}
---
## 变更内容
**类型**: {新增 / 修改 / 废弃}
**标题**: {简要标题}
{具体内容,格式与写入目标文件保持一致}
## 变更理由
{为什么这条经验值得沉淀(1-3句话),能在哪些场景被其他 Agent 复用}
## Curator 审查意见
审查时间:
审查结果:
理由:
写入位置:
Step 4:写入文件,然后通知 Knowledge Curator 有新提案待审查。
动作二:提案审查(Knowledge Curator 使用)
审查步骤
Step 1:读取 memory/proposals/ 下最新未处理提案
Step 2:按以下标准审查
通过条件(满足任意一条):
- 用户明确提供了新的模板或规则
- 同类场景 2+ 次出现有规律可循
- 内容能显著提升其他 Agent 的输出质量
拒绝条件(满足任意一条):
- 明确的一次性特殊场景
- 与已有记录相似度 > 80%
- 表述模糊,无法被其他 Agent 复用
- 涉及敏感信息
Step 3:填写审查意见到提案文件
Step 4a — 通过时:
追加到目标文件的格式:
---
<!-- 来源: {提案ID} | 时间: {YYYY-MM-DD} | 来源Agent: {agent} -->
{提案中的变更内容}
通知格式:
✅ 知识已更新
━━━━━━━━━━━━━━━━━━━━━━
提案来源: {来源Agent}
写入位置: {文件路径}
内容摘要: {一句话摘要}
━━━━━━━━━━━━━━━━━━━━━━
如需撤销,请手动删除上述文件中对应条目(以提案ID为标识)。
Step 4b — 拒绝时:
- 填写拒绝理由到提案文件
- 移动到
memory/proposals/archived/
- 静默处理,不输出通知
辅助脚本说明
scripts/submit_proposal.py
"""
提交知识提案脚本
用法: python submit_proposal.py --agent <角色> --topic <主题> --content <内容文件路径>
"""
import argparse
import os
from datetime import datetime
def main():
parser = argparse.ArgumentParser(description='提交知识提案')
parser.add_argument('--agent', required=True, help='来源角色名称')
parser.add_argument('--topic', required=True, help='提案主题关键词')
parser.add_argument('--content', required=True, help='提案内容文件路径')
parser.add_argument('--level', default='专属', choices=['全局', '专属'], help='建议级别')
parser.add_argument('--target', required=True, help='建议写入的目标文件路径')
args = parser.parse_args()
timestamp = datetime.now().strftime('%Y%m%d-%H%M%S')
proposal_id = f"{timestamp}-{args.agent}"
filename = f"memory/proposals/{timestamp}_{args.agent}_{args.topic}.md"
with open(args.content, 'r', encoding='utf-8') as f:
content = f.read()
proposal = f"""---
提案ID: {proposal_id}
提案时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}
来源Agent: {args.agent}
触发场景: {args.topic}
建议写入位置: {args.target}
建议级别: {args.level}
---
## 变更内容
{content}
## 变更理由
(请补充:为什么这条经验值得沉淀)
## Curator 审查意见
审查时间:
审查结果:
理由:
写入位置:
"""
os.makedirs('memory/proposals', exist_ok=True)
with open(filename, 'w', encoding='utf-8') as f:
f.write(proposal)
print(f"✅ 提案已提交: {filename}")
print(f"📋 提案ID: {proposal_id}")
if __name__ == '__main__':
main()
scripts/review_proposal.py
"""
审查知识提案脚本(Knowledge Curator 使用)
用法: python review_proposal.py --proposal <提案文件路径> --result <通过|拒绝> --reason <理由>
"""
import argparse
import os
import shutil
from datetime import datetime
def main():
parser = argparse.ArgumentParser(description='审查知识提案')
parser.add_argument('--proposal', required=True, help='提案文件路径')
parser.add_argument('--result', required=True, choices=['通过', '拒绝'], help='审查结果')
parser.add_argument('--reason', required=True, help='审查理由')
parser.add_argument('--target', help='写入目标文件(通过时必填)')
args = parser.parse_args()
with open(args.proposal, 'r', encoding='utf-8') as f:
content = f.read()
review_section = f"""## Curator 审查意见
审查时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}
审查结果: {args.result}
理由: {args.reason}
写入位置: {args.target if args.target else 'N/A'}
"""
content = content.replace('## Curator 审查意见\n\n审查时间: \n审查结果: \n理由: \n写入位置: ', review_section)
with open(args.proposal, 'w', encoding='utf-8') as f:
f.write(content)
archived_dir = 'memory/proposals/archived'
os.makedirs(archived_dir, exist_ok=True)
archived_path = os.path.join(archived_dir, os.path.basename(args.proposal))
shutil.move(args.proposal, archived_path)
print(f"✅ 审查完成: {args.result}")
print(f"📁 提案已归档: {archived_path}")
if args.result == '通过':
print(f"\n⚠️ 请手动将内容写入目标文件: {args.target}")
print("写入完成后运行 apply_update.py 输出用户通知")
if __name__ == '__main__':
main()
scripts/apply_update.py
"""
写入知识更新并通知用户
用法: python apply_update.py --target <目标文件> --content <内容> --proposal-id <提案ID> --agent <来源角色>
"""
import argparse
from datetime import datetime
def main():
parser = argparse.ArgumentParser(description='应用知识更新')
parser.add_argument('--target', required=True, help='目标文件路径')
parser.add_argument('--content-file', required=True, help='要写入的内容文件')
parser.add_argument('--proposal-id', required=True, help='提案ID')
parser.add_argument('--agent', required=True, help='来源角色')
parser.add_argument('--summary', required=True, help='一句话内容摘要')
args = parser.parse_args()
with open(args.content_file, 'r', encoding='utf-8') as f:
new_content = f.read()
marker = f"\n\n---\n<!-- 来源: {args.proposal_id} | 时间: {datetime.now().strftime('%Y-%m-%d')} | 来源Agent: {args.agent} -->\n{new_content}\n"
with open(args.target, 'a', encoding='utf-8') as f:
f.write(marker)
print("✅ 知识已更新")
print("━" * 40)
print(f"提案来源: {args.agent}")
print(f"写入位置: {args.target}")
print(f"内容摘要: {args.summary}")
print("━" * 40)
print("如需撤销,请手动删除上述文件中对应条目(以提案ID为标识)。")
if __name__ == '__main__':
main()
使用示例
Agent 提交提案(手动方式)
echo "新增:客户技术方案必须包含成本估算章节" > /tmp/proposal_content.md
python skills/knowledge-update/scripts/submit_proposal.py \
--agent cto \
--topic 客户技术方案模板 \
--content /tmp/proposal_content.md \
--level 专属 \
--target memory/agents/cto/learnings.md
Knowledge Curator 审查提案
python skills/knowledge-update/scripts/review_proposal.py \
--proposal memory/proposals/20240115-143200_cto_客户技术方案模板.md \
--result 通过 \
--reason "CTO 角色高频场景,有明确复用价值" \
--target memory/agents/cto/learnings.md