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
+10 -5
View File
@@ -1,14 +1,19 @@
{
"name": "yixiong-tools",
"name": "yixiong-claude-hub",
"owner": {
"name": "蚁熊团队"
},
"description": "蚁熊公司内部 Claude Code 技能市场",
"description": "蚁熊官方出品的 Claude Code 能力增强平台。这里汇聚了团队在工程实践中沉淀的精选技能与工作流插件——从代码审查到数据工程,从项目管理到 AI 辅助写作,每一个插件都源自真实业务场景的打磨。装上它,让 Claude Code 更懂蚁熊。",
"plugins": [
{
"name": "example-skill",
"source": "./plugins/example-skill",
"description": "示例插件,演示 Plugin 结构"
"name": "huanxi",
"source": "./plugins/huanxi",
"description": "寰汐企业管理系统插件:日报/负责人日报/周报/任务管理/组织查询,含 MCP Server 自动配置(Bearer Token 直连)"
},
{
"name": "memcore",
"source": "./plugins/memcore",
"description": "记忆体系核心引擎:memory-sync(全量同步)、memory-update(增量写入)、memory-lint(健康校验)"
}
]
}
+87
View File
@@ -0,0 +1,87 @@
# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## 项目概述
蚁熊公司内部 Claude Code Plugin Marketplace(技能市场)。开发者在此仓库中维护供全员安装使用的 Claude Code 插件(Plugin)和技能(Skill)。
## 目录结构
```
.claude-plugin/
└── marketplace.json # 市场索引:声明本仓库包含哪些插件
plugins/
└── <plugin-name>/ # 每个插件独占一个子目录
├── .claude-plugin/
│ └── plugin.json # 插件元数据(name, description, version, author
└── skills/
└── <skill-name>/
└── SKILL.md # 技能实现(frontmatter + Markdown 指令)
```
## 核心文件格式
### marketplace.json(市场索引)
```json
{
"name": "yixiong-claude-hub",
"owner": { "name": "蚁熊团队" },
"description": "...",
"plugins": [
{ "name": "<plugin-name>", "source": "./plugins/<plugin-name>", "description": "..." }
]
}
```
每新增一个插件,必须在 `plugins` 数组中追加对应条目。
### plugin.json(插件元数据)
```json
{
"name": "plugin-name",
"description": "...",
"version": "1.0.0",
"author": { "name": "蚁熊团队" }
}
```
版本遵循 SemVer:修改技能内容 → patch,新增技能 → minor,破坏性变更 → major。
### SKILL.md(技能实现)
```markdown
---
description: 一句话说明该技能的用途(Claude 用此判断何时触发该技能)
---
技能的具体指令内容…
```
`description` 字段是触发判据,务必精确描述使用场景,避免与其他技能产生歧义。
## 新增插件流程
1.`plugins/` 下创建目录 `plugins/<plugin-name>/`
2. 创建 `plugins/<plugin-name>/.claude-plugin/plugin.json`
3.`plugins/<plugin-name>/skills/<skill-name>/SKILL.md` 编写技能
4.`.claude-plugin/marketplace.json``plugins` 数组中追加该插件条目
## 已发布插件
| 插件 | 技能 | 说明 |
|------|------|------|
| `huanxi` | `/huanxi-shared` `/huanxi-report` `/huanxi-leader` `/huanxi-task` `/huanxi-weekly` `/huanxi-org` | 寰汐企业管理系统完整工作流,含 MCP Server 自动配置 |
| `memcore` | `/memory-sync` `/memory-update` `/memory-lint` | 项目记忆体系核心引擎 |
### memcore 技能调用关系
```
/memory-sync ← 总编排(11 phases),调用下面两个技能
├── /memory-update ← 增量写入,可独立执行
└── /memory-lint ← 健康校验,可独立执行
```
@@ -1,8 +0,0 @@
{
"name": "example-skill",
"description": "示例插件",
"version": "1.0.0",
"author": {
"name": "蚁熊团队"
}
}
@@ -1,7 +0,0 @@
---
description: 示例技能,用于验证 marketplace 安装流程是否正常
---
这是一个示例技能。当你成功安装并调用它时,说明你的公司内部 marketplace 已经配置成功。
请回复:marketplace 安装验证通过!
+24
View File
@@ -0,0 +1,24 @@
{
"name": "huanxi",
"description": "寰汐企业管理系统 Claude Code 插件。集成日报、负责人日报、周报、任务管理、组织查询六大工作流技能,并自动配置寰汐 MCP Server 连接(Bearer Token 直连模式)。",
"author": {
"name": "蚁熊团队"
},
"userConfig": {
"token": {
"type": "string",
"title": "寰汐 Personal Token",
"description": "在寰汐系统后台「设置 → Personal Token」生成,hxp_ 前缀",
"sensitive": true
}
},
"mcpServers": {
"huanxi": {
"type": "http",
"url": "https://pm.yixiong.com/mcp/",
"headers": {
"Authorization": "Bearer ${user_config.token}"
}
}
}
}
@@ -0,0 +1,99 @@
---
name: huanxi-leader
description: "寰汐负责人日报工作流:查看下属汇报情况(+check)、AI 生成并保存草稿(+draft)、提交负责人日报(+submit)、撤回(+withdraw)。当用户说"查看下属汇报"、"写负责人日报"、"汇总下属情况"、"负责人日报"时触发。"
---
# 寰汐负责人日报
**前置条件:先 Read `../huanxi-shared/SKILL.md`(缓存规则 + TTL 策略)**
---
## 标准工作流(完整流程)
```
Step 0: 确认身份和负责的模块
→ Read ~/.claude/huanxi-cache/me.json(永久缓存)
→ Read ~/.claude/huanxi-cache/modules.json24h 缓存)
→ 筛选 my_role == 'leader' 的模块
→ 若有多个 leader 模块,询问用户选择哪个(或所有)
Step 1: 获取并展示下属汇报汇总
→ 单模块:mcp__huanxi__leader_report_get_subordinates(date=今日, module_id)
→ 多模块:mcp__huanxi__leader_report_get_batch(date=今日, module_ids=[...])
再按模块逐一展示
→ 展示结构化汇总:
✅ 已提交(N人):[姓名] + 汇报内容摘要
⏳ 未提交(M人):[姓名]
→ 若有未提交成员:告知用户(供参考,不强制等待)
Step 2: 询问是否 AI 汇总
→ 展示已提交成员的汇报内容后,询问:
"是否需要 AI 根据以上下属汇报自动生成今日负责人日报?"
→ 用户同意 → mcp__huanxi__llm_generate_leader_summary(module_id, date=今日)
→ 展示 AI 生成的汇总报告,供用户审阅和修改
→ 用户拒绝 → 引导用户手动填写报告内容
Step 3: 保存草稿
→ 详见 references/leader-summary.md
→ mcp__huanxi__leader_report_save(report_date, content=<确认后内容>, module_id)
Step 4: 确认并提交
→ 展示最终内容,等待用户明确确认("确认"/"提交"/"好的"等)
→ ⚠️ 未收到确认前,禁止调用 leader_report_submit
→ mcp__huanxi__leader_report_submit(report_date, module_id)
```
---
## Shortcuts
| 指令 | 说明 |
|------|------|
| `+check` | 查看指定日期下属提交情况 |
| [`+draft`](references/leader-summary.md) | AI 生成草稿并保存(需用户确认内容) |
| `+submit` | 提交负责人日报(必须先确认) |
| `+withdraw` | 撤回已提交负责人日报 |
---
## +check:查看下属汇报
```
1. 确定模块(从 modules.json 缓存中取 leader 身份的模块)
2. mcp__huanxi__leader_report_get_subordinates(date, module_id)
3. 展示:
✅ 已提交(N人):张三、李四、...
⏳ 未提交(M人):王五、...
(非工作日时:提示"今日非工作日,成员无需强制提交")
```
---
## +withdraw:撤回负责人日报
```
1. 确认当前已提交状态
2. 告知撤回影响,等待用户确认
3. mcp__huanxi__leader_report_withdraw(report_date, module_id)
```
---
## 多模块处理
若用户有多个 leader 模块:
```
- 默认展示全部模块的下属情况(+check)
- 提交时需逐模块操作:每个模块单独调用 leader_report_save + submit
- 可用 leader_report_get_batch(date, module_ids) 批量拉取数据
```
---
## 关键约束
- **禁止自动提交**`leader_report_submit(report_date, module_id)` 前必须展示内容并等待用户确认
- **成员未提交不阻塞**:负责人日报不依赖所有成员提交,可随时填写
- 若当前用户不是任何模块的 leader,告知用户并建议使用 `/huanxi-report` 填写员工日报
@@ -0,0 +1,74 @@
# 负责人日报草稿(+draft
## 两种草稿模式
### 模式 AAI 自动生成
```
1. mcp__huanxi__llm_generate_leader_summary(module_id=<模块ID>, date=<日期>)
2. 展示 AI 生成的草稿内容给用户审阅
3. 询问用户:"是否采用此草稿?或需要修改?"
4. 用户确认/修改完成后 → 执行保存步骤
```
### 模式 B:用户手动撰写
```
1. 展示下属汇报摘要(来自 leader_report_get_subordinates 结果)
2. 基于摘要,引导用户填写:
- 本模块今日整体进展
- 遇到的问题与风险
- 明日计划
3. 拼合用户输入内容 → 执行保存步骤
```
---
## 保存草稿
```
mcp__huanxi__leader_report_save(
report_date = "YYYY-MM-DD", ← 日期格式
module_id = "<模块ID>", ← 从 modules.json 缓存取
content = "<正文内容>" ← 支持 Markdown
)
```
**返回值**:保存成功后返回草稿 ID,告知用户已保存,询问是否立即提交。
---
## 多模块批量操作
若用户负责多个模块:
```
1. mcp__huanxi__leader_report_get_batch(date, module_ids=[...])
→ 一次获取所有模块的下属汇报情况
2. 逐模块调用 llm_generate_leader_summary 生成草稿
3. 逐模块调用 leader_report_save 保存
4. 统一确认后逐模块提交
```
---
## 内容格式建议(供 AI 生成参考)
```markdown
## 今日进展
- [任务A] 完成 XX 功能开发,进度 80%
- [任务B] 完成接口联调,已提测
## 问题与风险
- 暂无阻塞性问题
## 明日计划
- 继续推进 [任务C]
- 协助 [成员] 解决 XX 问题
```
+133
View File
@@ -0,0 +1,133 @@
---
name: huanxi-org
description: "寰汐组织/模块/人员查询。当用户说"我有哪些模块"、"查一下某人账号/ID"、"刷新一下缓存"、"看组织架构"、"谁在哪个模块"、"帮我找一下XXX的用户ID"时触发。提供名字→ID 解析(+resolve)、缓存刷新(+sync)、当前用户(+me)、模块列表(+modules)、组织树(+tree)。"
---
# 寰汐组织与人员查询
**前置条件:先 Read `../huanxi-shared/SKILL.md`(缓存规则 + TTL 策略)**
---
## 核心能力
本技能提供「名字 → ID」解析能力,是所有其他 huanxi-* 技能的依赖。所有操作**缓存优先**。
---
## Shortcuts
| 指令 | 说明 |
|------|------|
| [`+me`](references/resolve-ids.md#me) | 查看当前用户身份(读 me.json,缓存永久) |
| [`+modules`](references/resolve-ids.md#modules) | 列出我参与的所有模块(24h 缓存) |
| [`+resolve`](references/resolve-ids.md) | 把模块名/人员名解析为 ID |
| [`+tree`](#org-tree) | 展示完整组织架构树(实时查询,不缓存) |
| [`+sync`](#sync) | 强制刷新 modules.json + users.json 缓存 |
---
## +me:查看当前用户身份 {#me}
```
Step 1: Read ~/.claude/huanxi-cache/me.json
→ 若存在且有 data 字段:直接展示(永久缓存,无需检查 TTL)
→ 若不存在:执行 Step 2
Step 2: mcp__huanxi__user_get_me()
Step 3: Write ~/.claude/huanxi-cache/me.json:
{ "cached_at": "<ISO8601>", "data": <返回值> }
Step 4: 展示用户信息(name, feishu_user_id, 角色等)
```
---
## +modules:列出参与模块 {#modules}
```
Step 1: Read ~/.claude/huanxi-cache/modules.json → 检查 TTL24h
→ 未过期:直接展示
→ 过期或不存在:执行 Step 2
Step 2: mcp__huanxi__module_list()
Step 3: Write ~/.claude/huanxi-cache/modules.json:
{ "cached_at": "<ISO8601>", "data": <返回值> }
Step 4: 展示模块列表(id, name, my_role
```
---
## +resolve:名字 → ID 解析
详细流程见 [references/resolve-ids.md](references/resolve-ids.md)。
**快速规则:**
- 模块名 → 先查 `modules.json`,未命中则拉 `module_list()`
- 人员名 → 先查 `users.json`,未命中则调 `user_list(name=xxx)`,结果追加写入缓存
- 模糊匹配时若有多个结果,列出候选项让用户选择
---
## +tree:组织架构树 {#org-tree}
```
Step 1: mcp__huanxi__org_get_tree()(不缓存,实时查询)
Step 2: 以树形结构展示组织架构
```
> 组织架构变动相对频繁(人员入离职),不缓存,每次实时查询。
---
## +sync:强制刷新缓存 {#sync}
```
Step 1: mcp__huanxi__module_list()
→ Write ~/.claude/huanxi-cache/modules.json(强制覆盖)
Step 2: mcp__huanxi__user_list()(拉全量用户)
→ Write ~/.claude/huanxi-cache/users.json(强制覆盖)
Step 3: 告知用户:缓存已刷新(模块 N 个,用户 M 人)
```
> **何时需要 +sync**:添加新模块成员后、有新员工入职后、模块结构调整后。
>
> ⚠️ **Token 变更时**:若切换了寰汐账号(修改了 MCP Bearer Token),`me.json` 是永久缓存,+sync 不会更新它。需手动删除 `~/.claude/huanxi-cache/me.json`,再执行 `/huanxi-org +me` 重新获取新身份。
---
## 缓存文件结构参考
**me.json**
```json
{
"cached_at": "2026-04-13T09:00:00+08:00",
"data": {
"user_id": "123",
"name": "张三",
"feishu_user_id": "ou_xxx"
}
}
```
**modules.json**
```json
{
"cached_at": "2026-04-13T09:00:00+08:00",
"data": [
{ "id": "mod_001", "name": "前端开发", "my_role": "member" },
{ "id": "mod_002", "name": "后端API", "my_role": "leader" }
]
}
```
**users.json**
```json
{
"cached_at": "2026-04-13T09:00:00+08:00",
"data": [
{ "user_id": "456", "name": "李四", "feishu_user_id": "ou_yyy" }
]
}
```
@@ -0,0 +1,76 @@
# 名字 → ID 解析
本文件详细说明如何将模块名、人员名解析为系统 ID,所有步骤均**缓存优先**。
---
## 模块名 → 模块 ID {#modules}
```
1. Read ~/.claude/huanxi-cache/modules.json
→ 检查 cached_at,若 age < 24h → 进入匹配逻辑
→ 过期或不存在 → 调用 mcp__huanxi__module_list() 并写入缓存
2. 匹配逻辑:
a. 精确匹配 name == 输入 → 返回 id
b. 精确匹配失败 → 模糊匹配(name.includes(输入) 或 输入.includes(name)
c. 模糊匹配唯一命中 → 确认并返回 id
d. 多个候选 → 列出候选项,让用户选择
e. 零命中 → 告知用户,建议运行 +sync 刷新缓存
```
**示例:**
- 用户说"前端模块" → 从缓存匹配到 `{ id: "mod_001", name: "前端开发" }` → 返回 `mod_001`
- 用户说"API" → 匹配到 `后端API` → 返回 `mod_002`
- 匹配到多个 → 展示候选列表
---
## 人员名 → 用户 ID {#users}
```
1. Read ~/.claude/huanxi-cache/users.json
→ 检查 cached_at,若 age < 24h → 在 data 数组中查找
2. 查找逻辑:
a. name 精确匹配 → 返回 user_id
b. name 包含输入 → 列出候选
c. 未找到 → 执行 Step 3
3. 缓存未命中时:
a. 调用 mcp__huanxi__user_list(name=<输入>)
b. 将结果追加(合并去重)写入 users.json(不覆盖已有缓存)
c. 重新执行 Step 2 匹配逻辑
4. 仍未找到 → 告知用户姓名不存在,建议确认拼写或运行 +sync
```
**特别注意:**
- `user_id`(系统内部 ID)≠ `feishu_user_id`(飞书 open_id
- 设置任务执行人用 `user_id`
- 飞书消息通知用 `feishu_user_id`(MCP 内部会自动处理,无需手动区分)
---
## 自动 ID 解析流程(综合示例)
当用户说"创建任务,负责人是李四,模块是前端开发"时:
```
1. 解析模块 → read modules.json → 匹配"前端开发" → mod_001
2. 解析人员 → read users.json → 匹配"李四" → user_id: 456
3. 若任一缓存未命中:先拉 MCP,写缓存,再继续
4. 两个 ID 都拿到后 → 调用 task_create(module_id="mod_001", ...)
5. 创建完成后 → task_set_assignees(task_id, ["456"])
```
---
## 常见错误处理
| 情况 | 处理 |
|------|------|
| 多个同名用户 | 展示完整名单(含部门/角色),让用户指定 |
| 模块名拼写不完整 | 模糊匹配,确认后继续 |
| 缓存文件损坏(JSON 解析失败)| 忽略缓存,直接调 MCP,重建文件 |
| MCP 返回空列表 | 告知用户,建议检查 Token 权限或联系管理员 |
@@ -0,0 +1,102 @@
---
name: huanxi-report
description: "寰汐员工日报工作流:查看今日日报状态(+check)、保存草稿(+draft)、提交日报(+submit)、撤回日报(+withdraw)。当用户说"帮我写日报"、"填日报"、"提交日报"、"查看今日汇报情况"时触发。"
---
# 寰汐员工日报
**前置条件:先 Read `../huanxi-shared/SKILL.md`(缓存规则 + TTL 策略)**
---
## 标准工作流(完整流程)
```
Step 0: 确认身份
→ Read ~/.claude/huanxi-cache/me.json(永久缓存)
→ 若 me.json 为空:mcp__huanxi__user_get_me() → 写入缓存
Step 1: 检查是否工作日
→ 查 workdays.json["今日日期"]
→ 未缓存:mcp__huanxi__system_get_workday() → 追加写入 workdays.json
→ 非工作日:告知用户,询问"是否仍要填写?"(不强制中断)
Step 2: 查看今日日报状态
→ mcp__huanxi__report_get_today()
→ submitted → 告知"今日已提交",询问是否撤回
→ draft/empty → 继续 Step 3
Step 3: 获取待汇报任务并收集内容
→ mcp__huanxi__report_get_tasks_to_report()
→ 展示待汇报任务列表(task_id, name, 模块, 当前进度)
→ 引导用户逐一填写今日进展和完成百分比
→ 详见 references/report-draft.md
Step 4: 保存草稿并展示初稿
→ mcp__huanxi__report_save_draft(items=[...])
→ 展示完整初稿内容供用户预览
Step 5: 询问是否 AI 润色
→ 询问用户:"是否需要 AI 润色优化表达?"
→ 用户同意 → mcp__huanxi__llm_polish_report(content=<初稿内容>)
→ 展示润色后版本,与初稿对比
→ 用户选择采用润色版或保留原版
→ 若采用润色版:mcp__huanxi__report_save_draft(items=[...]) 更新草稿
→ 用户拒绝 → 直接进入 Step 6
Step 6: 确认并提交
→ 展示最终内容,等待用户明确确认("确认"/"提交"/"好的"等)
→ ⚠️ 未收到确认前,禁止调用 report_submit_item
→ 用户确认后:
a. mcp__huanxi__report_get_today() → 获取各条目的 item_id
b. 对每个需提交的草稿条目 → mcp__huanxi__report_submit_item(item_id)
c. 逐条提交,不影响其他条目
→ 详见 references/report-submit.md
```
---
## Shortcuts
| 指令 | 说明 |
|------|------|
| [`+check`](#check) | 查看今日日报状态(已提交/草稿/空) |
| [`+draft`](references/report-draft.md) | 读取待报任务并保存草稿 |
| [`+submit`](references/report-submit.md) | 提交当天日报(必须先确认) |
| `+withdraw` | 撤回已提交日报(询问确认) |
---
## +check:查看今日状态 {#check}
```
1. mcp__huanxi__report_get_today()
2. 展示:
- 提交状态(submitted / draft / 未填)
- 已填任务列表及内容摘要
- 未填/dismissed 任务
3. 若已提交:询问"是否需要撤回修改?"
4. 若草稿:询问"是否继续编辑并提交?"
```
---
## +withdraw:撤回日报
```
1. mcp__huanxi__report_get_today() → 获取各条目状态和 item_id
2. 展示已提交的条目列表,询问用户要撤回哪条(可多选)
3. 等待用户确认(撤回后该条目变为草稿,其他已提交条目不受影响)
4. 对用户选择的每条 → mcp__huanxi__report_withdraw_item(item_id)
5. 告知撤回成功,可重新编辑后用 report_submit_item 重新提交
```
---
## 关键约束
- **禁止自动提交**:Step 6 必须展示内容并等待用户明确确认("确认"/"提交"/"好的"等),不得自动调用 `report_submit_item`
- **逐条操作,不做全量**:提交/撤回必须使用 `report_submit_item` / `report_withdraw_item`(需传 item_id),禁止批量操作所有条目,除非用户明确要求"全部提交/撤回"
- **dismissed 状态**:用户主动标记"今天不汇报该任务",dismiss 的条目不计入汇报,不要提示用户补填
- **非工作日**:检测到非工作日时,明确告知但不中断,询问用户意愿
- **已提交则不重复操作**:Step 2 发现已提交时,不继续 Step 3-6,改为询问是否撤回
@@ -0,0 +1,56 @@
# 保存日报草稿(+draft
## 前置
已通过 `report_get_tasks_to_report()` 获取待汇报任务列表。
---
## 草稿数据结构
每个 `item` 包含:
| 字段 | 类型 | 说明 |
|------|------|------|
| `task_id` | string | 任务 ID(从待报任务中取) |
| `content` | string | 汇报内容(今日进展) |
| `progress` | int | 任务进度(0-100,整数) |
| `status` | string | 可选,不改变则不传 |
---
## 执行步骤
```
Step 1: 展示待汇报任务列表,引导用户逐一填写内容
格式示例:
┌─────────────────────────────────────────
│ 任务: [前端开发] 完成登录页面 UI 优化
│ 当前进度: 60%
│ 今日进展(请输入): ___
│ 完成百分比(0-100: ___
└─────────────────────────────────────────
Step 2: 收集所有填写内容,构建 items 数组
Step 3: [可选] 若用户请求 AI 辅助 → mcp__huanxi__llm_polish_report(content)
将润色建议展示给用户,由用户确认采用哪个版本
Step 4: mcp__huanxi__report_save_draft(items=[
{ task_id: "xxx", content: "...", progress: 80 },
...
])
Step 5: 告知保存结果:
"已保存草稿,共 N 个任务条目。是否现在提交?"
```
---
## 注意事项
- `progress`**整数百分比**0-100),不是小数
- 用户未填写 `content` 的任务:询问是否 dismiss(今天不汇报)还是暂时跳过
- `report_save_draft` 是 upsert 操作,多次调用不会重复创建
- 草稿保存成功后,下次调用 `report_get_today()` 可看到 draft 状态
@@ -0,0 +1,54 @@
# 提交日报(+submit
## 前置条件
- 草稿已通过 `report_save_draft()` 保存
- 用户已查看并确认内容
---
## 执行步骤
```
Step 1: mcp__huanxi__report_get_today() → 获取最新草稿内容
Step 2: 展示完整草稿给用户审阅:
┌─────────────────────────────────────────
│ 📋 今日日报预览(2026-04-13
│ ✅ 完成登录页面 UI 优化(进度 80%)
│ 今日进展:完成了头部导航栏的响应式改造...
│ 🔄 接口联调(进度 50%)
│ 今日进展:与后端对接了 3 个接口...
└─────────────────────────────────────────
Step 3: 等待用户明确确认("确认"/"提交"/"好的"/"ok"等)
⚠️ 未收到确认前,禁止调用 report_submit
Step 4: 对每个需提交的草稿条目(item.status == "draft"):
mcp__huanxi__report_submit_item(item_id=<item.id>)
逐条提交,不影响其他条目状态
Step 5: 告知提交结果:
"✅ 日报已提交!共 N 个任务条目。"
```
---
## 提交失败处理
| 错误 | 处理方式 |
|------|---------|
| 草稿为空 | 提示用户先填写内容(+draft) |
| 已提交 | 告知已提交,询问是否撤回 |
| 网络错误 | 告知用户,建议稍后重试 |
---
## 重要约束
**禁止自动提交**:无论何种情况,`report_submit_item()` 调用前必须经过用户明确确认。
这是强制规则,不得因为"用户已经填好了"或"工作流要求"而跳过确认步骤。
**逐条提交,不做全量**:需先从 `report_get_today()` 获取各条目的 `item_id`,再逐条调用 `report_submit_item(item_id)`,不得批量提交所有条目(除非用户明确要求"全部提交")。
@@ -0,0 +1,141 @@
---
name: huanxi-shared
description: "寰汐 MCP 共享基础:本地缓存策略(me/modules/users/workdays)、TTL 规则、缓存读写伪代码、MCP 工具索引。所有 huanxi-* 技能必须先 Read 本文件,再执行各自工作流。"
---
# 寰汐 MCP 共享规则
本技能是所有 `huanxi-*` 技能的**必读前置**,定义缓存策略、工具索引和全局约定。
---
## 必读声明
**所有 huanxi-* 技能开头都必须先 `Read` 本文件(`../huanxi-shared/SKILL.md`),再执行各自工作流。**
---
## 本地缓存机制
缓存文件统一存放在 `~/.claude/huanxi-cache/`
### 缓存文件清单
| 文件 | 内容 | TTL | 刷新方式 |
|------|------|-----|---------|
| `me.json` | 当前用户身份(user_id, name, feishu_user_id | 永久 | 手动删除文件 |
| `modules.json` | 我参与的模块列表(id, name, my_role | 24h | 过期自动重拉 或 `/huanxi-org +sync` |
| `users.json` | 组织用户搜索结果(name/feishu_user_id 索引) | 24h | 过期自动重拉 或 `/huanxi-org +sync` |
| `workdays.json` | 工作日查询结果(date → bool 的 KV 字典) | 永久(按日期 key) | 已有日期不重新查 |
### 缓存读写伪代码
**读缓存(每次使用 MCP 数据前执行此逻辑):**
```
function read_cache(file, ttl_hours):
1. Read ~/.claude/huanxi-cache/{file}.json
2. 若文件不存在 → cache_miss
3. 读取 cached_at 字段,计算 age = now - cached_at(小时)
4. 若 ttl_hours = Infinity 或 age < ttl_hours → 返回 data 字段(cache_hit
5. 否则 → cache_miss
function cache_miss_handler(tool_name, params):
1. 调用 MCP 工具:mcp__huanxi__{tool_name}(params)
2. Write ~/.claude/huanxi-cache/{file}.json:
{ "cached_at": "<当前 ISO8601 时间>", "data": <MCP 返回值> }
3. 返回 data
```
**workdays.json 特殊逻辑(按 key 缓存):**
```
function get_workday(date):
1. Read workdays.json → 得到 { "2026-04-14": true, ... }
2. 若 date 已在 dict 中 → 直接返回
3. 否则 → 调用 mcp__huanxi__system_get_workday(date)
4. 将 {date: result} 追加写入 workdays.json
```
### TTL 快速参考
```
me.json → Infinity(永久,身份不变)
modules.json → 24h
users.json → 24h
workdays.json → Infinity(按 date key,已查过的不再查)
```
---
## MCP 工具索引
寰汐 MCP 工具前缀:`mcp__huanxi__`
### 用户与认证
| 工具 | 用途 | 缓存 |
|------|------|------|
| `user_get_me()` | 获取当前 Token 代表的用户 | → `me.json`(永久)|
### 模块与组织
| 工具 | 用途 | 缓存 |
|------|------|------|
| `module_list(my_role?)` | 列出我参与的模块 | → `modules.json`24h|
| `module_get(module_id)` | 获取模块详情(含成员) | 不缓存 |
| `user_list(name?)` | 搜索组织用户 | → `users.json`24h|
| `org_get_tree()` | 获取组织架构树 | 不缓存 |
| `people_get_board()` | 人员任务看板 | 不缓存 |
### 任务管理
| 工具 | 用途 | 缓存 |
|------|------|------|
| `task_list_mine()` | 我认领的任务 | 不缓存 |
| `task_list_by_module(module_id)` | 模块下所有任务 | 不缓存 |
| `task_get(task_id)` | 任务详情 | 不缓存 |
| `task_create(...)` | 创建任务 | — |
| `task_update(task_id, ...)` | 更新任务 | — |
| `task_set_assignees(task_id, assignee_ids)` | 设置执行人(幂等) | — |
### 员工日报
| 工具 | 用途 |
|------|------|
| `report_get_today(date?)` | 获取指定日期日报 |
| `report_get_tasks_to_report()` | 获取今日待汇报任务 |
| `report_save_draft(items=[...])` | 批量保存草稿(upsert|
| `report_submit_item(item_id, date?)` | 提交单条日报条目 |
| `report_withdraw_item(item_id, date?)` | 撤回单条已提交日报条目 |
### 负责人日报
| 工具 | 用途 |
|------|------|
| `leader_report_get_subordinates(date, module_id)` | 查看下属汇报情况 |
| `leader_report_save(report_date, content, module_id?)` | 保存负责人日报草稿 |
| `leader_report_submit(report_date, module_id)` | 提交负责人日报 |
| `leader_report_withdraw(report_date, module_id)` | 撤回负责人日报 |
| `leader_report_get_batch(date, module_ids)` | 批量获取多模块日报 |
### 周报
| 工具 | 用途 |
|------|------|
| `weekly_report_get(year, week)` | 获取指定 ISO 周的周报 |
| `weekly_report_get_batch(year, week, module_ids)` | 批量获取多模块周报 |
| `weekly_report_save(module_id, year, week_number, content?, next_week_plan?)` | 保存周报草稿 |
| `weekly_report_submit(module_id)` | 提交周报 |
| `weekly_report_withdraw(module_id, year?, week_number?)` | 撤回周报 |
### 系统与 LLM
| 工具 | 用途 | 缓存 |
|------|------|------|
| `system_get_workday(date?)` | 查询是否工作日 | → `workdays.json`(永久)|
| `llm_polish_report(content)` | AI 润色日报内容 | — |
| `llm_generate_leader_summary(module_id, date)` | AI 生成负责人日报草稿 | — |
---
## 全局约定
1. **提交前必须确认**`report_submit``leader_report_submit``weekly_report_submit` 执行前必须向用户展示内容并等待明确确认,禁止自动提交。
2. **非工作日不强制**:检测到非工作日时,告知用户并询问是否仍要填写,不得直接中断流程。
3. **缓存优先**:执行任何需要 module_id / user_id 的操作前,先读缓存;缓存未命中或过期才调 MCP。
4. **ISO 周数**:周报的 `year` 字段存 ISO year`date.isocalendar()[0]`),不是日历年。12 月底 / 1 月初注意跨年。
5. **task_set_assignees 幂等**:设置执行人使用此工具(幂等),不要用 task_update 的 assignee 字段追加。
@@ -0,0 +1,91 @@
---
name: huanxi-task
description: "寰汐任务管理:创建任务(+create)、更新任务状态/进度(+update)、查看任务看板(+board)、设置执行人(+assign)。当用户说"创建任务"、"新建任务"、"更新任务"、"看任务板"、"任务分配"时触发。"
---
# 寰汐任务管理
**前置条件:先 Read `../huanxi-shared/SKILL.md`(缓存规则 + TTL 策略)**
---
## Shortcuts
| 指令 | 说明 |
|------|------|
| [`+create`](references/task-create.md) | 创建新任务(引导式填写) |
| `+update` | 更新任务状态/进度/截止日 |
| [`+board`](references/task-kanban.md) | 查看我的任务看板 |
| `+assign` | 设置/变更任务执行人 |
| `+get` | 查看单个任务详情 |
---
## +create:创建任务
详见 [references/task-create.md](references/task-create.md)
**快速概览:**
```
1. 确定所属模块(从 modules.json 缓存解析名字 → ID
2. 收集任务信息(标题、描述、截止日、优先级)
3. mcp__huanxi__task_create(module_id, title, ...)
4. [可选] 设置执行人 → mcp__huanxi__task_set_assignees(task_id, [user_id])
```
---
## +update:更新任务
```
Step 1: 确认任务 ID
→ 若用户已提供 task_id:直接使用
→ 若用户描述了任务名称:
a. mcp__huanxi__task_list_mine() 获取我的任务列表
b. 按标题关键词模糊匹配,列出候选任务供用户选择
c. 仍未找到(可能属于他人或已归档)→ 告知用户提供精确 task_id
Step 2: 展示当前任务状态,引导用户填写要修改的字段
Step 3: mcp__huanxi__task_update(task_id, {
title? : "新标题",
description? : "新描述",
progress? : 80, ← 0-100 整数
status? : "in_progress" | "done" | "todo",
due_date? : "YYYY-MM-DD",
priority? : "low" | "medium" | "high"
})
Step 4: 告知更新结果
```
---
## +assign:设置执行人
```
Step 1: 确认任务 ID
Step 2: 解析执行人名字 → user_id(查 users.json 缓存)
→ 详见 huanxi-org references/resolve-ids.md
Step 3: mcp__huanxi__task_set_assignees(task_id, assignee_ids=[user_id, ...])
(此操作幂等:传完整列表,不是追加)
Step 4: 告知设置结果
```
---
## +get:查看任务详情
```
Step 1: mcp__huanxi__task_get(task_id)
Step 2: 展示完整任务信息(标题/描述/状态/进度/执行人/截止日/评论数)
```
---
## 关键约束
- **任务创建后不自动认领**`task_create` 不会自动设置执行人,需要单独调用 `task_set_assignees`
- **执行人是完整列表**`task_set_assignees` 传入的是完整执行人 ID 列表(幂等替换),不是追加
- **progress 是整数**:0-100 的整数,不是小数或百分比字符串
- **模块创建权限**:用户必须是模块成员(任意角色)才能在该模块创建任务,否则返回 403
@@ -0,0 +1,69 @@
# 创建任务(+create
## 必填信息收集
在调用 `task_create` 前,引导用户提供:
| 字段 | 必填 | 说明 |
|------|------|------|
| `module_id` | ✅ | 所属模块(从缓存解析名字 → ID) |
| `title` | ✅ | 任务标题(简洁明了)|
| `description` | 可选 | 任务详情、背景、验收标准 |
| `due_date` | 可选 | 截止日期(YYYY-MM-DD 格式)|
| `priority` | 可选 | `low` / `medium` / `high` / `urgent`,默认 medium |
| `assignee_ids` | 可选 | 执行人(从缓存解析人名 → user_id)|
---
## 执行步骤
```
Step 1: 解析模块名 → module_id
→ Read ~/.claude/huanxi-cache/modules.json
→ 模糊匹配模块名(详见 huanxi-org resolve-ids.md
Step 2: [若用户提到执行人] 解析人名 → user_id
→ Read ~/.claude/huanxi-cache/users.json
→ 未命中 → mcp__huanxi__user_list(name=<人名>) → 追加写缓存
Step 3: 创建任务
→ mcp__huanxi__task_create(
module_id = "<模块ID>",
title = "任务标题",
description = "...", ← 可选
due_date = "YYYY-MM-DD", ← 可选
priority = "medium" ← 可选
)
→ 返回:task_id
Step 4: 设置执行人(若 Step 2 有解析到)
→ mcp__huanxi__task_set_assignees(
task_id = "<刚创建的 task_id>",
assignee_ids = ["<user_id>"]
)
Step 5: 告知创建结果
→ 展示:任务标题、所属模块、执行人、截止日、task_id
→ 询问:"是否需要进一步调整?"
```
---
## 权限说明
用户必须是所属模块的成员(任意角色)才能创建任务。若返回 403:
- 可能未加入该模块
- 建议联系模块负责人添加成员,或请管理员使用 Admin MCP 操作
---
## 子任务支持
若需创建子任务:
```
mcp__huanxi__task_create(
module_id = "<模块ID>",
title = "子任务标题",
parent_task_id = "<父任务ID>" ← 传此字段即为子任务
)
```
@@ -0,0 +1,51 @@
# 任务看板(+board
## 查看我的任务
```
Step 1: mcp__huanxi__task_list_mine()
→ 返回我认领的所有任务(跨模块)
Step 2: 按状态分组展示:
────────────────────────────────────
📋 待处理(todo)
· [前端开发] 完成登录页面 UI 优化 ← 截止: 04-15
· [后端API] 接口文档更新 ← 无截止日
🔄 进行中(in_progress
· [前端开发] 接口联调 60% ← 截止: 04-20
✅ 已完成(done)
· [前端开发] 初始化项目结构 100%
────────────────────────────────────
```
## 查看模块看板
```
Step 1: 确认模块(从 modules.json 缓存解析)
Step 2: mcp__huanxi__task_list_by_module(module_id)
→ 返回该模块所有任务(含其他成员的任务)
Step 3: 按状态分组展示,标注每个任务的执行人
```
## 人员任务看板(管理视角)
```
Step 1: mcp__huanxi__people_get_board()
→ 返回团队所有成员的任务分布(数量统计)
Step 2: 展示每人的任务负载情况(适合分配任务前参考)
```
---
## 快速过滤
用户常见需求:
| 场景 | 做法 |
|------|------|
| "我今天要做什么" | task_list_mine() → 过滤 status=in_progress + 截止日临近 |
| "某个模块的任务" | task_list_by_module(module_id) |
| "即将到期的任务" | task_list_mine() → 筛选 due_date ≤ 今日+3天 |
| "团队任务分布" | people_get_board() |
@@ -0,0 +1,131 @@
---
name: huanxi-weekly
description: "寰汐周报工作流(仅限模块负责人):查看本周周报状态(+check)、基于本周负责人日报 AI 汇总草稿(+draft)、提交周报(+submit)、撤回(+withdraw)。当用户说"写周报"、"提交周报"、"本周总结"、"周报进度"时触发。"
---
# 寰汐周报(仅限模块负责人)
**前置条件:先 Read `../huanxi-shared/SKILL.md`(缓存规则 + TTL 策略)**
---
## 权限说明
**周报只有模块负责人(`my_role == 'leader'`)才需要提交。**
若用户不是任何模块的负责人:
- 告知:"您目前不是任何模块的负责人,无需提交周报。"
- 建议:若有疑问,可联系管理员确认模块角色。
---
## ISO 周数规范(重要)
寰汐周报使用 **ISO 8601 标准**
- `year` 字段存 **ISO year**(不是日历年)
- 12月底/1月初可能跨年:如 2025-12-29 的 ISO year = 2026(第1周)
- Python 获取:`date.isocalendar()``(iso_year, week, weekday)`
**当前日期 → ISO 周号计算示例:**
- 2026-04-13(周一)→ year=2026, week=16
---
## 标准工作流
```
Step 0: 确认负责人身份和模块
→ Read ~/.claude/huanxi-cache/modules.json24h 缓存)
→ 若过期:mcp__huanxi__module_list() → 更新缓存
→ 筛选 my_role == 'leader' 的模块列表
→ 若列表为空:告知用户无需提交周报,流程终止
→ 若有多个 leader 模块:询问"要提交哪些模块的周报?"
Step 1: 确定当前 ISO 周号
→ 根据今日日期计算 (iso_year, iso_week)
→ 告知:第 iso_week 周(周一 ~ 周日 日期范围)
Step 2: 批量拉取周报草稿
→ mcp__huanxi__weekly_report_get_batch(
year=iso_year,
week=iso_week,
module_ids=[<leader 模块的 ID 列表>]
)
→ 返回:各模块的现有草稿状态
Step 3: 逐日拉取本周负责人日报
→ 计算本周日期范围(周一到今日,YYYY-MM-DD 格式列表)
→ 对每个日期逐一调用:
mcp__huanxi__leader_report_get_batch(
date=<单个日期>,
module_ids=[<leader 模块的 ID 列表>]
)
→ 汇总所有日期的返回数据
→ 展示:本周每日负责人日报记录(含各日进展摘要 + 下属提交情况)
Step 4: 询问是否 AI 汇总
→ 展示本周负责人日报数据后,询问:
"是否需要 AI 根据本周负责人日报自动生成周报草稿?"
→ 用户同意 → AI 基于 leader_report_batch 起草:
· content:本周模块整体进展总结
· next_week_plan:下周模块工作计划
→ 展示草稿,供用户审阅和修改
→ 用户拒绝 → 引导用户手动填写本周总结和下周计划
Step 5: 逐模块保存草稿
→ 详见 references/weekly-draft.md
→ mcp__huanxi__weekly_report_save(module_id, year, week_number, content, next_week_plan)
Step 6: 确认并提交
→ 展示所有模块最终内容,等待用户明确确认("确认"/"提交"/"好的"等)
→ ⚠️ 未收到确认前,禁止调用 weekly_report_submit
→ mcp__huanxi__weekly_report_submit(module_id)
```
---
## Shortcuts
| 指令 | 说明 |
|------|------|
| `+check` | 查看本周周报状态(草稿/已提交) |
| [`+draft`](references/weekly-draft.md) | 基于本周负责人日报 AI 生成草稿 |
| `+submit` | 提交周报(必须先确认) |
| `+withdraw` | 撤回已提交周报 |
---
## +check:查看本周状态
```
1. 确认 leader 模块列表(同 Step 0
2. 若无 leader 模块:告知无需提交周报
3. mcp__huanxi__weekly_report_get_batch(year, week, module_ids)
4. 展示各模块周报状态:
- submitted:已提交,展示摘要
- draft:草稿中,展示已填内容
- empty:未填,建议运行 +draft
```
---
## +withdraw:撤回周报
```
1. 确认 leader 模块(从 modules.json 缓存中取)
2. 若有多个 leader 模块,询问要撤回哪个模块的周报
3. 告知撤回影响(状态变为草稿,可重新编辑),等待用户确认
4. mcp__huanxi__weekly_report_withdraw(module_id)
(默认撤回当周;如需撤回历史周:传 year + week_number
5. 告知成功,可重新编辑后再次提交
```
---
## 关键约束
- **仅负责人可提交**:首先检查 `my_role == 'leader'`,非负责人直接告知无需操作
- **禁止自动提交**`weekly_report_submit(module_id)` 前必须展示全部内容并等待用户确认
- **year 存 ISO year**:高频出错点,必须使用 `isocalendar()[0]`,不要用 `date.year`
- 每个模块独立提交,有多个模块时逐一处理
- 撤回后可重新编辑,不影响当前状态
@@ -0,0 +1,97 @@
# 周报草稿(+draft,仅限模块负责人)
## 数据来源
周报草稿基于**本周负责人日报汇总**(`leader_report_get_batch` 返回值),而非员工个人日报。
| 数据 | 来源 | 说明 |
|------|------|------|
| 本周每日负责人日报 | `leader_report_get_batch(date列表, module_ids)` | 含各日的模块进展 + 下属提交情况摘要 |
| 现有周报草稿 | `weekly_report_get_batch(year, week, module_ids)` | 已填写的草稿(若有) |
---
## 草稿生成步骤
```
Step 1: 解析本周负责人日报数据
→ 按日期排列,提取每日:
· 模块整体进展
· 团队成员提交情况
· 遇到的问题与风险
Step 2: AI 基于负责人日报起草 content(本周总结):
- 提炼本周模块核心进展(任务推进 + 里程碑)
- 汇总团队整体情况
- 列出本周识别的问题与应对
Step 3: AI 起草 next_week_plan(下周计划):
- 基于本周未完成项和下周目标
- 结合用户补充的计划
Step 4: 展示草稿给用户审阅修改
Step 5: 用户确认后逐模块保存:
mcp__huanxi__weekly_report_save(
module_id = "<模块ID>",
year = <ISO year>, ← 注意:ISO year,不是日历年
week = <ISO week>,
content = "<本周总结>",
next_week_plan = "<下周计划>"
)
```
---
## 内容格式建议(负责人视角)
**content(本周总结):**
```markdown
## 本周模块进展
- **[任务A]** 完成 XX 功能开发,进度推进至 80%(负责人:张三)
- **[任务B]** 完成接口联调,已提测(负责人:李四)
## 团队提交情况
本周全员提交日报,无缺报。
## 问题与风险
- [周三] 第三方接口超时问题,已升级厂商处理,预计周一恢复
## 本周总体评估
整体按计划推进,无阻塞性风险。
```
**next_week_plan(下周计划):**
```markdown
- [任务A] 目标完成剩余 20% 并提测
- [任务B] 协助测试团队完成验收
- 启动 [新需求] 的技术调研
```
---
## 已有草稿处理
`weekly_report_get_batch()` 中该模块已有草稿(非 empty):
- 展示现有草稿内容
- 询问:"是在此基础上修改,还是基于本周负责人日报重新生成?"
- 基于用户选择执行对应操作
---
## 多模块处理
```
for module in leader_modules:
1. 提取该模块的 leader_report_batch(本周各日记录)
2. AI 生成草稿(content + next_week_plan
3. 展示给用户确认/修改
4. weekly_report_save(module_id=module.id, year, week, ...)
5. 告知:模块 "{module.name}" 草稿已保存 ✅
所有模块草稿完成后:统一展示,询问是否提交
```
@@ -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` 内执行不输出收尾