chore: sync before memory update

This commit is contained in:
SkyJourney
2026-05-01 12:04:12 +08:00
parent 1b3ae007ee
commit 0c46ed0306
22 changed files with 1850 additions and 20 deletions
@@ -0,0 +1,7 @@
{
"name": "memcore",
"description": "Claude Code 记忆体系核心引擎。提供三层技能:memory-sync(全量同步编排)、memory-update(增量写入)、memory-lint(健康校验)。让项目记忆跨会话、跨机器保持一致。",
"author": {
"name": "蚁熊团队"
}
}
+217
View File
@@ -0,0 +1,217 @@
---
name: memory-lint
description: 检查本地记忆文件的健康状况。AUTO-FIX类问题直接修改本地文件,NEED-HUMAN类问题写入lint_report.md。以本地.claude/memory/为唯一权威,不推送远程。可独立执行,也作为/memory-sync流程的一部分。调用命令: /memory-lint
---
# memory-lint
健康检查 `.claude/memory/`AUTO-FIX 直修,NEED-HUMAN 写入 `lint_report.md`。**本地权威,不推送远程**。会话目录 = `$PROJECT_DIR`
目录不存在 → 输出 `⚠ 未找到 .claude/memory/,建议先执行 /memory-sync` 并终止。
---
## Phase 0 — 读取状态
```bash
cat "$PROJECT_DIR/.claude/memory/MEMORY.md"
ls "$PROJECT_DIR/.claude/memory/"*.md
```
提取 `$INDEX_FILES`(索引中的 `[filename.md]`/ `$DISK_FILES`(磁盘文件)/ `$ANCHOR_COMMIT` / `$LAST_SYNCED`
---
## Phase 1-2 — 孤儿与幽灵检测
| Phase | 定义 | 级别 | AUTO-FIX |
|-------|------|------|---------|
| 1 孤儿 | 索引有 → 磁盘无 | ERROR | 从 MEMORY.md 删该条目 |
| 2 幽灵 | 磁盘有 → 索引无(排除 MEMORY.md / lint_report.md | WARN | 补入索引(类型推断见下) |
幽灵类型推断:`user_*` → user / `project_*``decisions.md` → project / `feedback*` → feedback / `reference*` → reference / `synthesis_*` → synthesis / 其他默认 project。
---
## Phase 3 — 交叉引用完整性
### 3A 存在性检测 + 引用计数构建
扫描所有 `[[filename.md#section]]`,构建:
- **引用表** `源文件#源章节 → 目标文件#目标章节`
- **`$REF_COUNT`**:文件级被引用计数(按源文件去重,不含自引用)→ Phase 7 写入 MEMORY.md「引用」列
- **`$ITEM_REF_COUNT`**`decisions.md` / `feedback*.md` 中每个 `## 条目`的被引用计数(按源文件去重)→ Phase 8 写入 lint_report.md,供 `/memory-update` 反向触发消费
| 情况 | 级别 | 动作 |
|------|------|-----|
| 目标文件不存在 | ERROR | NEED-HUMAN |
| 章节缺失 + 高相似度匹配(疑似重命名) | WARN | AUTO-FIX 更新引用 |
| 章节缺失 + 无相似项 | WARN | NEED-HUMAN |
### 3B 对称性检测(双链闭环)
复用 3A 引用表,对每条 `A#α → B#β` 检查 B 的 `## β` 是否含任意 `[[A` 引用(不要求精确章节)。
- 级别:WARN
- AUTO-FIX:B 的目标章节末尾追加 `**See Also** [[A#α]]`
- 边界:`lint_report.md` 不参与;B 整文件无对 A 任何引用 → AUTO-FIX;B 有引用但不在目标章节 → 仅 WARN 不自动修改
---
## Phase 4-6 — NEED-HUMAN 检测族
三类全部为 NEED-HUMAN,写入 lint_report.md 时**必须附带 3 问 yes/no checklist + 决策矩阵**Phase 8 模板)。
### Phase 4 内容矛盾
| 维度 | 检查 |
|------|------|
| decisions vs feedback | 决策与规范逻辑冲突 |
| decisions vs 架构文件 | 与 pom.xml / package.json / requirements.txt 实际依赖不一致 |
| 多 feedback 文件 | feedback.md 与 feedback_{topic}.md 重复或矛盾 |
| synthesis vs decisions | synthesis 结论与决策抵触 |
```bash
cat "$PROJECT_DIR/pom.xml" || cat "$PROJECT_DIR/package.json" || cat "$PROJECT_DIR/requirements.txt"
```
### Phase 5 过期检测
阈值:WARN ≥30 天 / ERROR ≥90 天(可由 MEMORY.md 头部 `<!-- lint-stale-warn: N -->` 覆盖)。
```bash
git -C "$PROJECT_DIR" log --oneline --since="$last_updated" -- .
```
### Phase 6 可推断内容污染
污染特征:大量文件路径、git 流水账、方法签名/SQL、可从依赖文件直读的版本号列表。
**边界(关键)**:架构层级("认证模块在 auth/,提供 JWT + OAuth2 双协议"**保留**;具体类名/方法/路径列表(`AuthFilter.java`**删除**。
---
## Phase 7 — 执行 AUTO-FIX
按顺序修改本地文件:
1. MEMORY.md 移除孤儿(Phase 1
2. MEMORY.md 补入幽灵(Phase 2
3. 更新断链引用(Phase 3A 重命名匹配)
4. 追加反向链接(Phase 3B
5. **刷新 MEMORY.md 索引「引用」列**(基于 `$REF_COUNT`):
- 表格统一 5 列:`| 文件 | 描述 | 类型 | 引用 | Commit |`
- 「引用」值 ≥3 加 `*`(如 `5*`)、<3 显示数字(如 `2``0`
- **按引用次数倒序排列**(同次数按类型序:user → project → feedback → reference → synthesis → lint
- 旧版 `## 核心枢纽节点` 段落自动删除(已合并到主表)
---
## Phase 8 — 生成 lint_report.md
```markdown
---
name: 记忆健康检查报告
description: memory-lint 最新一次执行的检查结果与待处理项
type: lint
last_updated: YYYY-MM-DD
---
# 记忆健康检查报告
> _执行时间: YYYY-MM-DD | Base commit: `HASH` | Last synced: DATE_
## 健康概览
| 检查项 | AUTO-FIX | NEED-HUMAN |
|--------|---------|-----------|
| 1 孤儿 / 2 幽灵 / 3A 引用 / 3B 双链 | N / N / N / N | — / — / N / N |
| 4 矛盾 / 5 过期 / 6 污染 | — | N / N / N |
**AUTO-FIX 已执行 N 项 | NEED-HUMAN 待处理 N 项**
---
## AUTO-FIX 已执行清单
- [x] 移除孤儿:`synthesis_xxx.md`
- [x] 补入幽灵:`feedback_api.md`feedback
- [x] 更新断链:`[[feedback.md#API 认证规范]]``[[feedback.md#API 鉴权约束]]`
- [x] MEMORY.md「引用」列已刷新(22 文件,倒序)
---
## 条目级高频引用 Top(供 /memory-update 消费)
跨 ≥3 个不同源文件被引用的 decisions/feedback 条目。无候选时保留标题 + "无候选"。
| 条目 | 跨文件次数 | 建议 |
|------|----------|------|
| `architecture_decisions.md#动态API normalizeParams 类型转型` | 4 | 升级为 synthesis_arch_dynamic_api.md |
| `feedback_code_quality.md#JWT 密钥安全` | 3 | 升级为 synthesis_security_jwt.md |
---
## NEED-HUMAN 待处理清单
每项附 3 问 yes/no checklist + 决策矩阵,避免模糊判断。
### [ERROR] 引用断链 — 目标文件不存在
- **位置**`decisions.md → ## 数据库选型``[[synthesis_arch_xxx.md]]`
- **Checklist**
- Q1:内容是否真实归档过?
- Q2git history 能否找到删除/重命名证据?
- Q3:该引用是「锦上添花」还是「核心支撑」?
- **矩阵**Q1+Q2 = 是 → 恢复文件;Q1 是 + Q2 否 → 重新归档;Q1 否 → 删引用;Q3 核心 → 必须二选一不允许保留断链
### [WARN] 内容矛盾 — 跨文件表述冲突
- **A**`decisions.md → ## 数据库选型` PostgreSQLlast_updated: 2026-04-22
- **B**`project_overview.md → ## 技术栈` MySQL 8.0last_updated: 2026-02-10
- **Checklist**
- Q1:当前代码/配置(pom.xml / docker-compose)实际指向?
- Q2:另一方是「计划未实施」还是「过时记录」?
- Q3:近 30 天 git log 有迁移提交?
- **矩阵**:Q1 答案 = 当前权威;Q2 过时 → 直接更新另一方;Q2 计划 → 末尾标 `**Status:** planned, target HASH`Q3 有迁移 → 用迁移时间反推
### [WARN] 过期记忆 — last_updated 超阈值
- **文件**`project_progress.md`last_updated: 2026-01-15,过期 86 天)
- **Checklist**
- Q1:覆盖领域近 90 天有里程碑变更?
- Q2:现有内容是否仍可指导决策?
- Q3:是否有继任 synthesis_* 已分担其职责?
- **矩阵**Q1 是 + Q2 否 → 触发 `/memory-update`Q2 是(仅日期老)→ 仅刷新 `last_updated`;Q3 是 → 归档/删除,索引指向继任者
### [WARN] 可推断内容污染 — 疑似从代码可 grep 的明细
- **文件**`project_overview.md` 第 N 行(疑似具体类/路径列表)
- **Checklist**
- Q1:能否通过 grep / find / git log 直接还原?
- Q2:删除后剩余内容是否仍清晰描述「为什么/约束/边界」?
- Q3:是否承载 git history 抓不到的语义?(如「曾选 A 后改 B 因 X」)
- **矩阵**Q1+Q2 = 是 + Q3 否 → 安全删除;Q3 是 → 改写为决策格式迁到 decisions.md(保留 Why);Q2 否 → 保留架构层级描述但删具体路径
```
---
## Phase 9 — 输出摘要
`/memory-sync` 调用:
```
🔍 memory-lintAUTO-FIX N 项,NEED-HUMAN N 项(详见 lint_report.md
```
独立调用:扩展输出已修复 / 待处理清单 + 报告路径;全通过则 `✅ 记忆体系健康,已更新执行时间`
每次执行必须更新 lint_report.md(即使全通过也刷新执行时间)。
---
## 执行约束
1. **AUTO-FIX 边界严格** — 只修结构性错误(孤儿、幽灵、断链、双链),不改业务内容
2. **NEED-HUMAN 完整记录** — 每项含 checklist + 决策矩阵
3. **矛盾检测宁缺勿滥** — 措辞不一致 ≠ 矛盾,宁漏报不误报
4. **污染检测边界**(重申)— 架构层级保留 / 具体类名路径删除
5. **被调用静默返回**`/memory-sync` 内 Phase 9 不输出收尾
+190
View File
@@ -0,0 +1,190 @@
---
name: memory-sync
description: 项目记忆体系完整同步。Git检查→远程补充本地→增量更新记忆文件→lint收敛→CLAUDE.md注入→本地权威推送远程。以本地.claude/memory/为唯一权威基准。调用命令: /memory-sync
---
# memory-sync
记忆体系完整同步周期。**本地 `.claude/memory/` 是唯一权威**,远程为镜像。会话目录 = `$PROJECT_DIR`
```
Phase 0-4 前置(git + 锚点 + 远程→本地补充 + 多机检测 + diff)
Phase 5 /memory-update(本地写入)
Phase 6 /memory-lint(收敛)
Phase 7-9 CLAUDE.md 维护与记忆引导区块注入
Phase 10 本地 → 远程权威推送
Phase 11 完成报告
```
---
## Phase 0 — Git 检查
```bash
git -C "$PROJECT_DIR" status --short
```
- 有未提交变更 → 展示文件、询问 commit message(默认 `chore: sync before memory update`)→ `git add .claude/memory/ && git commit -m "<msg>"` → 记新 hash
- 干净 → `git rev-parse --short HEAD``$HEAD_HASH`
- 非 git 仓库 → 跳过 Phase 0commit 字段填 `N/A`
---
## Phase 1 — 远程路径
```
$REMOTE_MEMORY = ~/.claude/projects/{PROJECT_KEY}/memory/
PROJECT_KEY = $PROJECT_DIR 中所有 `:` `\` `/` 替换为 `-`
例:C:\Users\skyji\work\api → C--Users-skyji-work-api
```
---
## Phase 2 — 本地目录初始化
```bash
ls "$PROJECT_DIR/.claude/memory/" 2>/dev/null
```
- 不存在 → `mkdir -p` 后跳到 Phase 3(全量从远程拉,跳过差量)
- 存在 → 提取 `MEMORY.md` 头部 `Base commit: \`HASH\`` → `$ANCHOR_COMMIT`(无则空 = 全量)
---
## Phase 3 — 远程 → 本地(只补不覆)
```bash
for f in ~/.claude/projects/{PROJECT_KEY}/memory/*.md; do
fn=$(basename "$f"); local="$PROJECT_DIR/.claude/memory/$fn"
[ ! -f "$local" ] && cp -p "$f" "$local"
done
```
### 多机不同步检测
两边都存在的文件,对比 mtime
```bash
for f in ~/.claude/projects/{PROJECT_KEY}/memory/*.md; do
local="$PROJECT_DIR/.claude/memory/$(basename "$f")"
[ ! -f "$local" ] && continue
rm=$(stat -c %Y "$f" 2>/dev/null || stat -f %m "$f")
lm=$(stat -c %Y "$local" 2>/dev/null || stat -f %m "$local")
diff_days=$(( (rm - lm) / 86400 ))
[ $diff_days -ge 7 ] && echo "$(basename "$f") 远程比本地新 $diff_days"
done
```
≥1 个警告 → 提示 `检测到 N 个文件远程比本地新 ≥7 天,可能多机不同步。继续?(y/n)`
- `n` → 终止整个 sync 流程
- `y` → 继续(Phase 10 仍按本地权威覆盖远程)
---
## Phase 4 — diff 范围
```bash
[ -n "$ANCHOR_COMMIT" ] && git diff --name-only $ANCHOR_COMMIT..HEAD # → $CHANGED_FILES
```
空锚点 → `$CHANGED_FILES = 全量`
---
## Phase 5 — 执行 /memory-update
按 git diff 增量更新记忆文件 + MEMORY.md 索引。**完成立即继续 Phase 6,不暂停不收尾**。
---
## Phase 6 — 执行 /memory-lint
全量健康检查:AUTO-FIX 直修,NEED-HUMAN 写 `lint_report.md`。**完成立即继续 Phase 7,不暂停不收尾**。
---
## Phase 7 — CLAUDE.md 新建(若不存在)
执行 `/init` → 文件顶部加 `<!-- Last updated: YYYY-MM-DD | Commit: HASH -->` → 跳到 Phase 9。**简体中文,仅命令/代码保留原文**。
---
## Phase 8 — CLAUDE.md 增量更新(若已存在)
1. 提取顶部 `<!-- Last updated: ... | Commit: HASH -->` 的 HASH → `$CLAUDE_MD_COMMIT`
2. `git diff $CLAUDE_MD_COMMIT..HEAD -- .`
3. 按 diff 内容针对性修改章节(技术栈/模块/命令变化等),不重写全文
4. 更新顶部元数据日期与 commit
**简体中文,仅命令/代码保留原文**
---
## Phase 9 — 记忆引导区块注入
`MEMORY.md` 索引,按以下骨架生成区块(动态填充清单);CLAUDE.md 已含 `## 记忆体系(会话启动必读)` → 整块替换,否则追加末尾。
```markdown
## 记忆体系(会话启动必读)
> 每次新会话或长会话压缩后,必须先读 `MEMORY.md` 索引再按需加载文件。代码与记忆冲突 → 以代码为准并更新记忆。
### 读取流程
1. `cat .claude/memory/MEMORY.md` 获取清单
2. **必读**type=`project`/`feedback`):decisions.md / feedback.md / project_progress.md(按 MEMORY.md 实际动态生成)
3. **按需**type=`user`/`reference`/`synthesis`/`lint`):架构讨论时读 project_overview.md / 个性化时读 user_profile.md / 外部集成读 reference.md / 特定主题读 feedback_{topic}.md / 技术决策读 synthesis_*.md
### 记忆目录骨架
.claude/memory/
├── MEMORY.md / decisions.md / feedback*.md / project_*.md / reference.md
├── user_profile.md
├── synthesis_*.md(按需)
└── lint_report.md(按需)
```
**动态调整**:从 MEMORY.md 表格筛 `project`/`feedback` → 必读;`user`/`reference`/`synthesis`/`lint` → 按需。区块清单必须与索引严格一致。
---
## Phase 10 — 本地 → 远程推送(权威覆盖)
```bash
mkdir -p ~/.claude/projects/{PROJECT_KEY}/memory/
cp -pf "$PROJECT_DIR/.claude/memory/"*.md ~/.claude/projects/{PROJECT_KEY}/memory/
```
统一推送 update + lint 的全部本地结果。
---
## Phase 11 — 完成报告
```
✓ memory-sync 完成
📋 CLAUDE.md [已更新 / 已新建 / 无变更]
📖 记忆引导区块 [已注入 / 已刷新 / 无变更]
🧠 memory-updateN 个文件已更新(commit HASH
🔍 memory-lintAUTO-FIX N 项 / NEED-HUMAN N 项(详见 lint_report.md
🌟 核心枢纽节点(被引用 ≥3 次的 Top3,源:MEMORY.md「引用」列):
- architecture_decisions.md (5*)
- dev_workflow.md (4*)
📊 高频引用条目候选 synthesis 升级(源:lint_report.md「条目级高频引用 Top」;本段是聚合):
- architecture_decisions.md#动态API normalizeParams 类型转型 (跨 4 文件)
📤 已同步 N 个文件到远程
🔗 Base commit: HASH
```
---
## 执行约束
1. **Phase 0 最先** — 有未提交代码不允许跳过
2. **方向严格区分** — Phase 3 只补充 / Phase 10 才覆盖
3. **顺序固定** — Phase 5update)→ Phase 6lint);lint 在 update 写入完毕后检查
4. **统一推送** — update + lint 修改全部本地完成后由 Phase 10 一次推
5. **记忆引导区块强制存在** — 每次 sync 后 CLAUDE.md 必须含最新区块,文件清单与 MEMORY.md 严格一致
@@ -0,0 +1,141 @@
---
name: memory-update
description: 根据git diff增量范围,更新本地记忆文件和MEMORY.md索引。以本地.claude/memory/为唯一权威,不推送远程。可独立执行,也作为/memory-sync流程的一部分。调用命令: /memory-update
---
# memory-update
按 git diff 增量更新本地 `.claude/memory/`。**本地权威,仅操作本地文件**。会话目录 = `$PROJECT_DIR`;目录不存在则 `mkdir -p`
---
## Phase 1 — 读取增量锚点
```bash
# MEMORY.md 头部 _Last synced: DATE | Base commit: `HASH`_ → $ANCHOR_COMMIT(无则空=全量)
git -C "$PROJECT_DIR" rev-parse --short HEAD # → $HEAD_HASH(非 git 仓库填 N/A
```
---
## Phase 2 — 计算变更范围
```bash
[ -n "$ANCHOR_COMMIT" ] && git diff --name-only $ANCHOR_COMMIT..HEAD # → $CHANGED_FILES
```
空锚点 → 全量审查。
---
## Phase 3 — 更新记忆文件
### 维度路由($CHANGED_FILES → 目标文件)
| 变更内容 | 写入到 |
|---------|-------|
| 业务代码(`*.java/py/ts/vue` | `project_overview.md` `decisions.md` |
| 依赖文件(pom.xml / requirements.txt / package.json | `project_overview.md` |
| 进度信号(功能完成、Issue 关闭) | `project_progress.md` |
| 协作反馈(用户纠正、规范变更) | `feedback.md``feedback_{topic}.md` |
| 外部 URL | `reference.md` |
| 用户偏好/风格 | `user_profile.md` |
### 文件职责边界
| 文件 | 类型 | 写 | 不写 |
|------|------|---|------|
| `user_profile.md` | user | 角色、背景、偏好 | 任务进度 |
| `project_overview.md` | project | 技术栈、架构、目录、约定 | 可推断细节 |
| `project_progress.md` | project | 阶段、待办、里程碑 | git 历史 |
| `decisions.md` | project | Why 格式决策 | 实现细节 |
| `feedback*.md` | feedback | 协作规范(含 Why + How to apply | 一次性修复 |
| `reference.md` | reference | 外部 URL/用途 | 本地路径 |
| `synthesis_*.md` | synthesis | 高价值分析归档 | 对话逐字记录 |
### 统一 frontmatter
```markdown
---
name: 文件标题
description: 一句话描述(影响未来加载判断)
type: user | project | feedback | reference | synthesis
last_updated: YYYY-MM-DD
commit: HASH
---
```
### 条目格式(decisions / feedback 通用骨架)
```markdown
## 标题
**结论**feedback 改为规范描述):xxx
**Why** 背景、约束、历史教训
**How to apply** 何时适用、边界
**See Also** [[file.md#标题]]
```
`synthesis_*.md` 是完整文件而非条目,含 4 段:`## 背景` / `## 分析过程`(提炼,非逐字记录)/ `## 结论`(含 Why + How to apply/ `## See Also`
### 交叉引用(双向)
新增 decisions / feedback 条目时:
1. 扫描其他记忆文件标题
2. 主题相关 → 新条目末尾追加 `[[file.md#标题]]`
3. **反向也补**:被引用的旧条目末尾补充对新条目的引用
### synthesis 双触发模式
**A. 会话内主动**:会话出现技术选型对比 / Bug 根因 / 架构演进 / 性能安全分析时,主动提议归档为 `synthesis_{type}_{topic}.md`
**B. 反向引用触发**
1.`lint_report.md`「条目级高频引用 Top」段(≥3 跨文件 = 候选)
2. 检查候选是否已有对应 `synthesis_*`(前缀匹配 + 标题语义)
3. 未升级候选 → 提议:
```
📊 高频引用候选升级 synthesis:
[条目](被 N 文件引用)→ 建议归档为 synthesis_xxx.md
是否归档?(y/n/skip-all)
```
4. `y` → 创建文件 + 在原条目末尾加 `**Synthesized:** [[xxx.md]]`
5. `n` → 原条目末尾加 `<!-- synthesis-decline: YYYY-MM-DD -->`30 天免打扰
6. `skip-all` → 本次不再提议
### 写入要点
- 仅更新有变化维度,不重写无关文件
- frontmatter 的 `last_updated` 改今日,`commit` 改 `$HEAD_HASH`
- 追加为主,不删已有内容(除非过时/冲突)
---
## Phase 4 — 更新 MEMORY.md 索引
```markdown
# Memory Index
> _Last synced: YYYY-MM-DD | Base commit: `HASH`_
| 文件 | 描述 | 类型 | 引用 | Commit |
|------|------|------|------|--------|
```
更新规则:
- 改过的文件 → 同步「Commit」列
- 头部 `Last synced` / `Base commit` 改为今日 / `$HEAD_HASH`
- 新增文件 → 「引用」列占位 `0`(实际值由 `/memory-lint` Phase 7 刷新)
- 「引用」列语义:≥3 加 `*`(如 `5*`)、<3 显示数字
- 表格排序由 lint 重排,本 Phase 不强制
被 `/memory-sync` 调用 → 不输出收尾;独立调用 → 输出完整摘要。
---
## 执行约束
1. **最小化更新** — 不写无变化维度
2. **不记录可推断内容** — 实现细节、文件路径、git 历史不入库
3. **feedback 拆分** — 同主题 >5 条规则 → 拆出 `feedback_{topic}.md`
4. **See Also 双向同步** — 新增时扫关联并双向补
5. **synthesis 双触发** — 会话主动 + lint Top 反向;`**Synthesized:**` 标记不可覆盖;`<!-- synthesis-decline -->` 标记 30 天免打扰
6. **被调用静默返回** — `/memory-sync` 内执行不输出收尾