# Knowledge Update

> 知识迭代与沉淀技能。每当 Agent 完成一次工作后，如果发现用户提供了新的模板或格式要求、纠正了输出方向、产生了可复用的经验或规律，必须使用本 Skill 生成知识提案并提交给 Knowledge Curator 审查。适用于所有角色完成任务后的知识沉淀环节，以及 Knowledge Curator 执行审查时。

- Skill: `rowankid/knowledge-update` (Agent Skill)
- Install (CLI): `npx skillmds@latest add rowankid/knowledge-update`
- Raw SKILL.md: https://api.skillmd.com/api/skills/rowankid/knowledge-update/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: AI & ML
- Author: rowankid (https://skillmd.com/u/rowankid)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/rowankid/knowledge-update

---


# Knowledge Update Skill — 知识迭代技能

## 概述

本 Skill 负责整个 AI Team 的知识自进化机制，包含两个核心动作：
1. **提案生成**：任意 Agent 工作结束后，判断并生成知识提案
2. **提案审查**：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 模板）：

```markdown
---
提案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 — 通过时**：

```python
# scripts/apply_update.py 执行逻辑（手动操作参考）

# 1. 将内容追加到目标文件
# 2. 在目标文件的"变更记录"表格追加一行
# 3. 将提案文件移动到 memory/proposals/archived/
# 4. 输出通知
```

追加到目标文件的格式：
```markdown

---
<!-- 来源: {提案ID} | 时间: {YYYY-MM-DD} | 来源Agent: {agent} -->
{提案中的变更内容}
```

通知格式：
```
✅ 知识已更新
━━━━━━━━━━━━━━━━━━━━━━
提案来源: {来源Agent}
写入位置: {文件路径}
内容摘要: {一句话摘要}
━━━━━━━━━━━━━━━━━━━━━━
如需撤销，请手动删除上述文件中对应条目（以提案ID为标识）。
```

**Step 4b — 拒绝时**：
- 填写拒绝理由到提案文件
- 移动到 `memory/proposals/archived/`
- 静默处理，不输出通知

---

## 辅助脚本说明

### scripts/submit_proposal.py

```python
#!/usr/bin/env python3
"""
提交知识提案脚本
用法: 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

```python
#!/usr/bin/env python3
"""
审查知识提案脚本（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
#!/usr/bin/env python3
"""
写入知识更新并通知用户
用法: 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 提交提案（手动方式）
```bash
# 1. 编写提案内容到临时文件
echo "新增：客户技术方案必须包含成本估算章节" > /tmp/proposal_content.md

# 2. 提交提案
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 审查提案
```bash
python skills/knowledge-update/scripts/review_proposal.py \
  --proposal memory/proposals/20240115-143200_cto_客户技术方案模板.md \
  --result 通过 \
  --reason "CTO 角色高频场景，有明确复用价值" \
  --target memory/agents/cto/learnings.md
```

