CommunityArte y diseñogithub.com

2021291696/weaver-evolve

跨项目知识库整理 Skill:信息分层归位、权限白名单优化、历史对话提炼。Claude Code 全局整理工具。

Compatible conClaude Code~Codex CLI~Cursor
npx skills add 2021291696/weaver-evolve

Documentación


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)也可能积累过期内容。

执行流程

第零步:定位增量范围(双源)

  1. 读取时间戳文件 ~/.claude/.last-weaver。格式:ISO 8601(如 2026-05-17T14:30:00+08:00)。 不存在 → 首次运行,询问用户回溯范围(一周 / 一月 / 全部),等待选择后继续。

  2. 启动 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 在线
    • 其他 → 离线,进入降级模式
  3. Source 1: agentmemory MCP(主源,需在线):

    • 调用 memory_sessions 获取所有 session,按 updatedAt(毫秒时间戳)筛选
    • updatedAt 为 null 时 fallback startedAt
    • 筛选条件:updatedAt > .last-weaver
    • 增量 sessions 按 updatedAt 降序排列
  4. Source 2: history.jsonl(兜底源,始终可用):

    • 读取 ~/.claude/history.jsonl
    • timestamp 字段筛选增量期内的行
    • project 字段分组统计:每项目消息数 → 活跃项目排名
    • 提取高频 display 模式(重复出现的命令/skill 调用)
  5. 合并两源:

    • agentmemory 的 sessionId 标注 [MCP],history.jsonl 的标注 [本地]
    • 两者不强制合并——各自独立进入第一步
    • 更新 ~/.claude/.last-weaver:MCP 在线时取最新的 updatedAt;降级模式时取 history.jsonl 中最新的 timestamp
  6. 降级模式(agentmemory 离线时):

    • 跳过 Source 1,仅使用 Source 2
    • 第一步中跳过需要完整转录的操作(经验模式识别、趋势追踪、权限弹窗扫描)
    • 在第五步摘要首行标注:⚠️ agentmemory 离线,仅基于命令历史(history.jsonl)。启动 daemon 后重新整理可获得完整分析。
  7. 增量为空: 报告"自上次整理以来没有新对话,无需整理。" 并退出。

第一步:扫描增量 Sessions,提取信息

数据源判断:

agentmemory 状态可执行操作跳过的操作
在线完整转录提取 + 经验模式 + 趋势 + 权限
离线活跃项目发现 + 过期内容扫描 + 配置审查经验模式识别、趋势追踪、权限弹窗扫描

在线模式: 对每个来自 MCP 的增量 session:

  1. 调用 memory_recall(sessionId) 获取完整对话转录
  2. 用六类标记分类信息(全局偏好 / 工具选择 / 跨项目原则 / 项目决策 / 踩坑记录 / 推翻过期)
  3. 标注来源 [MCP: sessionId]
  4. 经验模式识别、趋势追踪、权限弹窗扫描(逻辑不变,输入换为 MCP 返回的转录文本)

来自 history.jsonl 的增量数据同步处理:提取活跃项目列表和高频命令模式作为补充信号(标注 [本地])。

离线模式:

  1. 从 history.jsonl 的 project 分组中提取活跃项目列表
  2. 高频命令模式作为低置信度信号(标注 [本地] [置信度: 低]
  3. 过期内容扫描和配置审查照常执行

以下内容同时适用于两种模式(经验模式识别和趋势追踪仅在线模式可用):

(以下各项中,经验模式识别和趋势追踪仅在 MCP 在线时执行,离线模式跳过。)

  1. 通读完整对话,用以下分类标记值得保留的信息:

    类别信号目标层级
    全局偏好用户说"以后都这样"、"我习惯"、"默认用"全局
    工具/命令选择"用 X 不用 Y"、"X 比 Y 好"全局
    跨项目原则"所有项目都要"、"不管哪个项目"全局
    项目决策"这个项目用 X"、架构选型、技术栈变更项目级
    踩坑记录"踩了个坑"、"注意 X 会 Y"项目级
    子项目信息明确提到子项目目录名子项目级
    推翻/过期"之前那个方案不行"、"不用 X 了改用 Y"覆盖旧信息
  2. 提取格式(内部用,不给用户看):

    [来源 session: xxx] [层级: 全局/项目X/子项目Y]
    事实: <一句话>
    动作: 新增/更新/删除
    目标文件: <猜测的归位路径>
    
  3. 扫描完成后,输出待归档清单。清单中每条的"目标文件"先标为待定——第二步分层决策时再确定。

  4. 主动扫描过期/无用内容:增量 sessions 读完后,顺手检查所有已知的记忆和配置文件,找以下信号:

    过期信号示例
    死链接MEMORY.md 中链接指向不存在的文件
    被推翻的旧信息新对话明确说了"不用X了",但旧记忆还在吹X
    已删除的项目记忆引用了已不存在的项目路径
    过时配置settings.json 中环境变量/API 地址已变更
    空索引条目MEMORY.md 中引用的文件内容为空
    明显无用的内容一句话太模糊,对以后没有任何参考价值

    将这些信号列入待清理清单,在第五步摘要中列出"建议删除"项,让用户确认是否删除。

注意

  • 不要提取纯技术细节("把 UserService.java 第 45 行改了")——那是 git log 的事
  • 不要提取单次 bug fix 流水账——除非用户明确说"这个坑以后注意"
  • 关注的是决策、偏好、原则、模式,不是操作记录
  1. 经验模式识别:读 sessions 时同时找这些信号:

    模式信号动作
    重复工作流同一类操作出现在 ≥2 个 session记录模式步骤 → 建议创建 skill
    重复踩坑同一类 bug/错误出现在 ≥2 个 session提取为通用预警 → 提升到全局 dev-lessons
    重复决策同类型选择被做了 ≥2 次提取为决策偏好 → 写进用户画像
    跨项目共性问题两个项目出现同样的问题标记关联 → 写入双方 memory

    经验提取格式(内部用):

    [经验] 来源 session: A, B, C
    模式: <步骤1→步骤2→步骤3>
    建议: <创建 skill / 加警告 / 立规则>
    置信度: 高/中(≥3次为高)
    
  2. 趋势追踪:对比上一次整理时的记忆快照,找变化:

    变化信号示例
    偏好漂移"用户从偏好长回复 → 偏好简短"
    工具切换"用户从 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 statuslsGet-ChildItem

2. 权限分三级

根据风险程度,将所有候选权限分为三级,让用户按自身稳健程度选择:

等级名称适用人群包括
L1 保守只读安全区新手、担心误操作git statusgit loggit diffls/Get-ChildItemRead 读文件、Grep 搜索、Glob 查找 — 纯只读、零副作用
L2 适中常规开发区有经验的开发者L1 + git addgit commitgit branchnpm testmvn testWrite 写文件、Edit 编辑文件 — 有写入但可逆
L3 宽松高效自动区信任 AI 的高级用户L2 + git pushnpm installmvn installpip installRemove-ItemProcess 管理 — 不可逆或网络操作

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.jsonpermissions 段。

格式参考:

{
  "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 需不需要同步更新
  • 两个看似无关的信息其实是同一个根因?→ 建立链接,在摘要中标注关联

第三步:执行归位

按"全局 → 项目 → 子项目"的顺序执行写入。先动全局(影响面最大),再逐个项目处理。

写入规则(融入优先):

  1. 先搜后写:写入前 grep 目标文件 + MEMORY.md,找已有相关内容。没有这一步,后面都是盲写。
  2. 更新优于追加:旧条目能覆盖就在原处改,不追新条目。比如旧"JDK 21"→新"JDK 24",改数字,不在文末加"对了现在用24了"。
  3. 矛盾以新为准:新旧冲突 → 新替旧,旧内容直接删除。不同时保留两版让读者自己猜。
  4. 互补建立链接:新旧相关但不重叠 → 各自保留,互相引用([[wikilinks]] 或文件内链接),不强行合并。
  5. 删除不留残骸:删内容后 → 文件变空则删文件+从索引移除;只剩一条则考虑合并到上级文件;多条则保留。
  6. 绝对时间:所有时间用 YYYY-MM-DD 格式,不写"今天"、"最近"。
  7. 一条一事:每个记忆条目只说一件事。
  8. 面向读者:写的时候想象下一个读到这条的 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-tidy skill(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-architect skill(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 条、无明显改进空间 → 不说,不增加对话噪音。

Skills relacionados