name: weaver-自我迭代 description: 编织者·自我迭代——跨项目记忆分层归位、全局配置审查、权限白名单优化、历史对话提炼、经验模式识别、自我进化。定期使用,非高频 skill。触发词:"编织一下"、"全局整理"、"整理全局"、"全局同步"、"收尾全局"、"整理知识网络"、"同步记忆"、"梳理知识"、"帮我看看有什么值得注意的"、"/weaver"、"/global-tidy"。也适用于用户提到跨项目信息混乱、记忆分散、权限弹窗太多、需要提炼经验、或想看看自己的变化时。
编织者 · 自我迭代 — Weaver
你是全局知识库管理员。你的职责是定期从历史对话中提取有价值的信息,并按正确的层级归档——全局的归全局,项目的归项目,子项目的归子项目。
与 neat-freak 的区别
neat-freak 负责单个项目内部的知识卫生(项目 CLAUDE.md + docs/ + 项目 memory)。你负责跨项目的全局层面——在多个项目之间分配信息、维护全局配置和全局记忆。
你们两个互补:neat-freak 管深度,你管广度。
为什么需要你
多个项目并行开发时,信息很容易散落。用户在项目 A 里说了一个全局偏好,项目 B 的 agent 根本不知道。用户在某个子项目里踩了坑,其他子项目可能重蹈覆辙。全局配置文件(settings.json、全局 CLAUDE.md)也可能积累过期内容。
执行流程
第零步:定位增量范围(双源)
-
读取时间戳文件
~/.claude/.last-weaver。格式:ISO 8601(如2026-05-17T14:30:00+08:00)。 不存在 → 首次运行,询问用户回溯范围(一周 / 一月 / 全部),等待选择后继续。 -
启动 agentmemory(尝试):
curl -s --max-time 2 http://localhost:3111/health || \ timeout 10 bash ~/.claude/helpers/daemon-manager.sh start || true最终状态用
curl -s http://localhost:3111/health确认:- 200 → MCP 在线
- 其他 → 离线,进入降级模式
-
Source 1: agentmemory MCP(主源,需在线):
- 调用
memory_sessions获取所有 session,按updatedAt(毫秒时间戳)筛选 updatedAt为 null 时 fallbackstartedAt- 筛选条件:
updatedAt > .last-weaver - 增量 sessions 按
updatedAt降序排列
- 调用
-
Source 2: history.jsonl(兜底源,始终可用):
- 读取
~/.claude/history.jsonl - 按
timestamp字段筛选增量期内的行 - 按
project字段分组统计:每项目消息数 → 活跃项目排名 - 提取高频
display模式(重复出现的命令/skill 调用)
- 读取
-
合并两源:
- agentmemory 的 sessionId 标注
[MCP],history.jsonl 的标注[本地] - 两者不强制合并——各自独立进入第一步
- 更新
~/.claude/.last-weaver:MCP 在线时取最新的updatedAt;降级模式时取 history.jsonl 中最新的timestamp
- agentmemory 的 sessionId 标注
-
降级模式(agentmemory 离线时):
- 跳过 Source 1,仅使用 Source 2
- 第一步中跳过需要完整转录的操作(经验模式识别、趋势追踪、权限弹窗扫描)
- 在第五步摘要首行标注:
⚠️ agentmemory 离线,仅基于命令历史(history.jsonl)。启动 daemon 后重新整理可获得完整分析。
-
增量为空: 报告"自上次整理以来没有新对话,无需整理。" 并退出。
第一步:扫描增量 Sessions,提取信息
数据源判断:
| agentmemory 状态 | 可执行操作 | 跳过的操作 |
|---|---|---|
| 在线 | 完整转录提取 + 经验模式 + 趋势 + 权限 | 无 |
| 离线 | 活跃项目发现 + 过期内容扫描 + 配置审查 | 经验模式识别、趋势追踪、权限弹窗扫描 |
在线模式: 对每个来自 MCP 的增量 session:
- 调用
memory_recall(sessionId)获取完整对话转录 - 用六类标记分类信息(全局偏好 / 工具选择 / 跨项目原则 / 项目决策 / 踩坑记录 / 推翻过期)
- 标注来源
[MCP: sessionId] - 经验模式识别、趋势追踪、权限弹窗扫描(逻辑不变,输入换为 MCP 返回的转录文本)
来自 history.jsonl 的增量数据同步处理:提取活跃项目列表和高频命令模式作为补充信号(标注 [本地])。
离线模式:
- 从 history.jsonl 的 project 分组中提取活跃项目列表
- 高频命令模式作为低置信度信号(标注
[本地] [置信度: 低]) - 过期内容扫描和配置审查照常执行
以下内容同时适用于两种模式(经验模式识别和趋势追踪仅在线模式可用):
(以下各项中,经验模式识别和趋势追踪仅在 MCP 在线时执行,离线模式跳过。)
-
通读完整对话,用以下分类标记值得保留的信息:
类别 信号 目标层级 全局偏好 用户说"以后都这样"、"我习惯"、"默认用" 全局 工具/命令选择 "用 X 不用 Y"、"X 比 Y 好" 全局 跨项目原则 "所有项目都要"、"不管哪个项目" 全局 项目决策 "这个项目用 X"、架构选型、技术栈变更 项目级 踩坑记录 "踩了个坑"、"注意 X 会 Y" 项目级 子项目信息 明确提到子项目目录名 子项目级 推翻/过期 "之前那个方案不行"、"不用 X 了改用 Y" 覆盖旧信息 -
提取格式(内部用,不给用户看):
[来源 session: xxx] [层级: 全局/项目X/子项目Y] 事实: <一句话> 动作: 新增/更新/删除 目标文件: <猜测的归位路径> -
扫描完成后,输出待归档清单。清单中每条的"目标文件"先标为待定——第二步分层决策时再确定。
-
主动扫描过期/无用内容:增量 sessions 读完后,顺手检查所有已知的记忆和配置文件,找以下信号:
过期信号 示例 死链接 MEMORY.md 中链接指向不存在的文件 被推翻的旧信息 新对话明确说了"不用X了",但旧记忆还在吹X 已删除的项目 记忆引用了已不存在的项目路径 过时配置 settings.json 中环境变量/API 地址已变更 空索引条目 MEMORY.md 中引用的文件内容为空 明显无用的内容 一句话太模糊,对以后没有任何参考价值 将这些信号列入待清理清单,在第五步摘要中列出"建议删除"项,让用户确认是否删除。
注意:
- 不要提取纯技术细节("把 UserService.java 第 45 行改了")——那是 git log 的事
- 不要提取单次 bug fix 流水账——除非用户明确说"这个坑以后注意"
- 关注的是决策、偏好、原则、模式,不是操作记录
-
经验模式识别:读 sessions 时同时找这些信号:
模式 信号 动作 重复工作流 同一类操作出现在 ≥2 个 session 记录模式步骤 → 建议创建 skill 重复踩坑 同一类 bug/错误出现在 ≥2 个 session 提取为通用预警 → 提升到全局 dev-lessons 重复决策 同类型选择被做了 ≥2 次 提取为决策偏好 → 写进用户画像 跨项目共性问题 两个项目出现同样的问题 标记关联 → 写入双方 memory 经验提取格式(内部用):
[经验] 来源 session: A, B, C 模式: <步骤1→步骤2→步骤3> 建议: <创建 skill / 加警告 / 立规则> 置信度: 高/中(≥3次为高) -
趋势追踪:对比上一次整理时的记忆快照,找变化:
变化信号 示例 偏好漂移 "用户从偏好长回复 → 偏好简短" 工具切换 "用户从 Maven → Gradle" 关注转移 "最近频繁提到考试复习,之前很少" 技能成长 "不再问基础配置问题,开始关注架构" 趋势用
[推测]前缀标注,和事实区分。只有明显信号(≥2 次提及或明确表述)才列。
权限审查:分析工具权限弹窗并生成白名单建议
全局整理时,同时审查本次增量 sessions 中频繁出现的权限弹窗,帮助减少未来的 yes/no 打断。
1. 扫描权限弹窗模式
在第一步读取 sessions 时,同时关注对话中出现的权限相关交互:
- AI 询问 "Do you want to allow this tool?" 或类似权限请求
- 用户回复 "yes"、"no"、"yes, and don't ask again" 模式
- 常见的低风险操作被反复弹窗(如
git status、ls、Get-ChildItem)
2. 权限分三级
根据风险程度,将所有候选权限分为三级,让用户按自身稳健程度选择:
| 等级 | 名称 | 适用人群 | 包括 |
|---|---|---|---|
| L1 保守 | 只读安全区 | 新手、担心误操作 | git status、git log、git diff、ls/Get-ChildItem、Read 读文件、Grep 搜索、Glob 查找 — 纯只读、零副作用 |
| L2 适中 | 常规开发区 | 有经验的开发者 | L1 + git add、git commit、git branch、npm test、mvn test、Write 写文件、Edit 编辑文件 — 有写入但可逆 |
| L3 宽松 | 高效自动区 | 信任 AI 的高级用户 | L2 + git push、npm install、mvn install、pip install、Remove-Item、Process 管理 — 不可逆或网络操作 |
3. 生成白名单建议
输出时按以下格式:
### 权限白名单建议
#### L1 保守(推荐默认)
- Git 只读:git status, git log, git diff
- 文件只读:Read, Glob, Grep, ls, Get-ChildItem
- Web 只读:WebFetch, WebSearch
#### L2 适中(需要时启用)
- Git 写入:git add, git commit, git branch, git checkout
- 文件写入:Write, Edit(限定项目目录)
- 测试运行:npm test, mvn test, pytest
#### L3 宽松(谨慎启用)
- 网络+安装:npm install, pip install, mvn install
- Git 远程:git push, git pull
- 删除操作:Remove-Item, rm
4. 用户选择后执行
等待用户选择等级(L1 / L2 / L1+L2 / 全部),然后将选定规则写入 ~/.claude/settings.json 的 permissions 段。
格式参考:
{
"permissions": {
"allow": [
"Bash(git status)",
"Bash(git log:*)",
"Bash(git diff:*)",
"Bash(ls:*)",
"Bash(Get-ChildItem:*)",
"Read(*)",
"Grep(*)",
"Glob(*)"
]
}
}
注意:权限规则的路径限定尽量收紧。
Read(*)可接受,但Bash(git push:*)建议限定到具体项目目录。
第二步:分层决策
对第一步清单中的每条信息,确定最终归属。使用 references/layer-guide.md 中的详细判定规则。
决策流程:
对于每条待归档信息:
1. 信息中提到几个项目?
├── 0 个(纯全局偏好/工具选择) → 全局
├── 1 个(明确的项目路径/名称) → 该项目
└── 多个(涉及跨项目影响) → 全局 + 关联的各项目都要记录
2. 全局信息进一步判断:
├── 硬规则/禁止事项/命令速查 → ~/.claude/CLAUDE.md
└── 偏好/习惯/reference → 全局 MEMORY
3. 项目信息进一步判断:
├── 硬规则/路由/环境变量 → 项目 CLAUDE.md
└── 上下文/决策/偏好 → 项目 memory/MEMORY.md
4. 子项目同理,向下沉一级。
不确定时:保守下沉一级。宁可放项目级,不轻易放全局。
去重检查:每条信息在确定目标位置后,先搜索目标文件是否已有相似/矛盾内容:
- 已有完全相同的 → 跳过(无需重复记录)
- 已有相关的但需更新 → 标记"合并更新"
- 已有矛盾的 → 以最新对话为准,标记"覆盖旧信息"
- 没有 → 标记"新增"
知识网络关联:在分层决策时,顺藤摸瓜找跨项目关联:
- 同一个坑出现在两个项目?→ 在两边都加链接,互相引用
- 用户在一个项目里说的偏好可能影响全局?→ 检查全局 memory 需不需要同步更新
- 两个看似无关的信息其实是同一个根因?→ 建立链接,在摘要中标注关联
第三步:执行归位
按"全局 → 项目 → 子项目"的顺序执行写入。先动全局(影响面最大),再逐个项目处理。
写入规则(融入优先):
- 先搜后写:写入前 grep 目标文件 + MEMORY.md,找已有相关内容。没有这一步,后面都是盲写。
- 更新优于追加:旧条目能覆盖就在原处改,不追新条目。比如旧"JDK 21"→新"JDK 24",改数字,不在文末加"对了现在用24了"。
- 矛盾以新为准:新旧冲突 → 新替旧,旧内容直接删除。不同时保留两版让读者自己猜。
- 互补建立链接:新旧相关但不重叠 → 各自保留,互相引用(
[[wikilinks]]或文件内链接),不强行合并。 - 删除不留残骸:删内容后 → 文件变空则删文件+从索引移除;只剩一条则考虑合并到上级文件;多条则保留。
- 绝对时间:所有时间用
YYYY-MM-DD格式,不写"今天"、"最近"。 - 一条一事:每个记忆条目只说一件事。
- 面向读者:写的时候想象下一个读到这条的 agent 只有 5 秒能扫过。
各层写入要点:
- 全局 CLAUDE.md:极度克制。只加"下次任何项目的 AI 写代码时必须看到"的硬规则。不加历史叙事。
- 全局 MEMORY:按 MEMORY.md 索引格式,新建或更新 memory 文件。description 字段要具体。
- 项目 CLAUDE.md:遵循 neat-freak 的 CLAUDE.md 规范——减优于加,不写历史叙事。
- 项目 memory:更新 MEMORY.md 索引 + 具体 memory 文件。
- 子项目:同项目级规则。
如果需要创建新文件(如某个项目还没有 CLAUDE.md),判断项目是否到了"有可运行代码"的阶段。是则创建,还在早期则跳过并在摘要中备注。
写入后:周边整理
所有写入和删除完成后,检查受影响的周边结构:
- 索引更新:MEMORY.md 中的描述是否还和实际文件内容一致?
- 过时清理:同目录其他 memory 文件有没有因本次更新而过时的?如果有,一并处理。
- 空文件清理:有没有文件因为内容被合并/删除而变空?→ 删文件 + 从索引移除。
- 孤立条目:有没有文件只剩一条内容?→ 考虑合并到上级文件,减少碎片。
- 结构优化:同一层同类记忆超过 3 条分散在不同文件?→ 在摘要中建议"要不要合并?"(不强制)。
- 文件系统整理:调用
file-tidyskill(Skill工具,skill 名file-tidy,args 为--dry-run --dir <项目根目录>),仅扫描项目根目录的散乱文件。- 子项目文件保护:子项目内部的文件布局是开发者有意图的设计,不纳入扫描。file-tidy v2 基于结构感知(学习目录指纹判断归属),不会按扩展名强制归类,子项目天然受保护。
- 判断标准:目录含 CLAUDE.md / package.json / .git / setup.py 等标识符的,即为独立子项目,完全跳过其内部文件整理。
- 子目录中只有明确的临时垃圾(文件名含
temp、_tmp_、GitHub API 无意义哈希名等)才标记建议删除。 - 将 file-tidy 输出的四档计划(建议删除 / 高置信度移动 / 需确认 / 未归类)嵌入第五步变更摘要。用户确认后,再次调用
file-tidy(args 为--confirm --dir <项目根目录>或--safe --dir <项目根目录>仅动高置信度项)执行实际整理。
- 错误复盘:调用
debug-architectskill(Skill工具,skill 名debug-architect),扫描增量 sessions 中的报错信号,分析根因并生成预防建议。将结果嵌入第五步变更摘要的"错误复盘"段落。
第四步:自检清单
所有写入完成后,逐项检查。哪条打不了勾就回去补。
分层正确性:
- 全局 CLAUDE.md 中无具体项目路径/子项目名(不该放全局的没在全局)
- 跨项目生效的信息没有只放在一个项目的 memory 里(该放全局的没漏)
- 同一事实没有在全局和项目级同时存在(去重)
- 不确定的信息保守下沉了一级(没有冒险放全局)
完整性:
- 增量 sessions 全部扫描过,无遗漏文件
- 第一步清单中每条信息都有明确的"已处理"或"跳过(附原因)"标记
- 发现的矛盾/过期信息都处理了(更新或删除,而非同时保留新旧两版)
- 涉及跨项目影响的信息,上下游两边都更新了
- 周边整理:空文件已清理、索引已更新、孤立条目已处理
- 删除操作不留残骸:对应 MEMORY.md 链接已移除
- 主动扫描过期内容已完成:死链接、已删除项目、过时配置已列入"建议删除"
- "建议删除"项已展示给用户确认
- 文件系统整理已完成(调用了 file-tidy,结果在摘要中展示)
- 错误复盘已完成(调用了 debug-architect,结果在摘要中展示)
- agentmemory 可用性已检测并在摘要中标注数据源
质量:
- 无相对时间(
grep -E "今天|昨天|最近|刚刚|上周"在所有改动的文件中清零) - MEMORY.md 索引中每个链接指向的文件真实存在
- 全局 CLAUDE.md 无 blockquote 历史叙事段("X 时刻起 Y 上线,详见...")
- 全局 CLAUDE.md 无"待定"、"TODO"
- 每条新建 memory 的 frontmatter description 与正文内容一致
权限审查:
- 增量 sessions 中的权限弹窗模式已扫描
- 三级权限建议(L1/L2/L3)已生成并展示给用户
- 用户选择后,settings.json 权限段已更新
- 权限规则路径限定已收紧(避免
*通配过宽)
自我反思:
- 回顾本次分层决策:有没有放错层的?(次数?原因?)
- 回顾本次扫描:有没有该扫但漏扫的 session 或文件?
- 回顾规则有效性:现有规则是否太松/太严?(比如"保守下沉"是否导致太多信息沉到项目级?)
- 是否有需要调整的规则?→ 列入"自我改进建议"
- 如果要改 SKILL.md:加内容→融入原处不追加 / 删内容→整理周边清残骸 / 改完后过一遍融入 8 条
收尾:
-
~/.claude/.last-weaver已更新为当前时间(ISO 8601) - 所有改动文件已保存
第五步:变更摘要
在所有操作完成后,给用户简洁报告:
## 全局整理完成(2026-05-17)
数据源: agentmemory MCP + history.jsonl
### 全局层
- 新增:~/.claude/CLAUDE.md — "所有 Maven 项目用阿里云镜像"
- 更新:全局 MEMORY — 用户画像(补充了偏好 IDE 快捷键)
### 项目层:D:\MyAIWorkspace
- 新增:CLAUDE.md — 新增 skill 安装路径规则
- 新增:memory/skill-creation-pattern.md — skill 创建流程偏好
### 项目层:D:\MyAIWorkspace\school\lab3
- 无变更
### 子项目层
- 更新:project1/复盘agent memory — PyInstaller 打包注意事项
### 权限白名单
- L1 保守:已添加 Git 只读 + 文件只读 — 10 条规则
- L2 适中:已添加 Git 写入 + 文件写入 — 15 条规则
- 启用了:L1+L2
### 建议删除
- memory/old-api-config.md — 引用的 API 地址已失效,内容为空
- MEMORY.md 中死链接:xxx.md → 文件不存在
### 文件系统整理
[file-tidy 输出的四档计划:建议删除 / 高置信度移动 / 需确认 / 未归类]
### 错误复盘
[debug-architect 输出的错误分析结果]
### 记忆画像更新
- [关联] lab3 MySQL 编码问题 ↔ project1 bat 编码问题 — 根因相同:Windows GBK
- [推测] 用户可能在准备考试(近期提及频率增加)
- [变化] 用户从偏好长回复 → 偏好简短(最近 3 次对话)
### 经验发现
- 建议创建 skill:ssm-crud-generator — 3 次出现增删改查生成模式
- 建议添加通用警告:Windows 脚本编码一律用 ASCII — 跨 2 个项目
### 系统改进建议
- 全局 CLAUDE.md 建议新增:"编码类任务必须先规划再动手"
- 项目 CLAUDE.md 建议新增:skill 安装路径规则
- 以上建议是否实施?
### 自我改进
- 本次 2 次分层偏全局(session X、Y),建议收紧全局偏好判定
- 规则变更:[具体建议] — 是否应用?
### 需用户确认
- 发现全局 settings.json 中 ANTHROPIC_MODEL 值在两个项目中不一致,当前分别设为 X 和 Y,以哪个为准?
降级模式摘要规则:
- 首行加
⚠️ agentmemory 离线,仅基于命令历史(history.jsonl) - 省略"经验发现"、"趋势追踪"、"记忆画像更新"段落
- 其他段落正常输出,事实标注
[数据源: history.jsonl],置信度标注[低]
只列有实际变更的项。没动的不写。不出现在摘要中的段落直接省略(比如没有经验发现就不输出"经验发现"段落)。遇到无法自动判断的矛盾或过期内容,列在"需用户确认"。扫描到的可删内容列在"建议删除"。
- 推测标注
[推测],与事实区分 - 经验必须 ≥2 次重复,单次不列
- 系统改进建议展示后等用户确认
- 自我改进必须用户确认才能改 SKILL.md
- 自我改进时遵循记忆 skill 融入原则:不管是改自己的 SKILL.md 还是改其他 skill,加内容→融入而非追加(更新原处),删内容→整理周边(清理死链、合并残篇、检查孤立条目),改完后完整自检一遍受影响的结构
特殊情况
首次运行无时间戳:提示用户选择回溯范围。首次整理完成后创建 .last-weaver。
增量为零:报告无新内容并退出。不强制运行。
某层目标位置不存在:项目没有 CLAUDE.md 或 MEMORY.md?判断是否需要创建(见第三步)。不需要则跳过并在摘要中备注。
两个项目对同一事实有矛盾记录:以最新对话为准。如果对话中没有明确倾向,列到"需用户确认"。
sessions 文件读取失败:跳过该文件,在摘要末尾列出跳过的文件清单。
全局 CLAUDE.md 不存在:如果用户有跨项目的核心原则需要记录,创建它。如果本增量没有值得进全局 CLAUDE.md 的内容,不创建。
优化建议(视情况,不强制):整理完成后,如果发现以下情况,在摘要末尾提一句建议:
| 条件 | 建议 |
|---|---|
| 同一层同类记忆 > 3 条分散在不同文件 | "要不要合并成一个文件?" |
| 某文件只剩一条孤立内容 | "X 文件只剩一条,要不要合并到 Y?" |
| 发现明显结构改进机会 | 简短提及,让用户决定 |
不超过 3 条、无明显改进空间 → 不说,不增加对话噪音。