memory-bank-skill 5.12.0 → 5.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js
CHANGED
|
@@ -10,7 +10,7 @@ import { fileURLToPath } from "url";
|
|
|
10
10
|
// package.json
|
|
11
11
|
var package_default = {
|
|
12
12
|
name: "memory-bank-skill",
|
|
13
|
-
version: "5.
|
|
13
|
+
version: "5.14.0",
|
|
14
14
|
description: "Memory Bank - \u9879\u76EE\u8BB0\u5FC6\u7CFB\u7EDF\uFF0C\u8BA9 AI \u52A9\u624B\u5728\u6BCF\u6B21\u5BF9\u8BDD\u4E2D\u90FD\u80FD\u5FEB\u901F\u7406\u89E3\u9879\u76EE\u4E0A\u4E0B\u6587",
|
|
15
15
|
type: "module",
|
|
16
16
|
main: "dist/plugin.js",
|
package/package.json
CHANGED
|
@@ -5,28 +5,29 @@ description: 项目记忆系统 - 自动读取上下文、自动沉淀发现、
|
|
|
5
5
|
|
|
6
6
|
# Memory Bank Skill
|
|
7
7
|
|
|
8
|
-
##
|
|
8
|
+
## 快速入口
|
|
9
9
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
**禁止**:在完成步骤 1-2 前使用任何代码搜索工具。
|
|
10
|
+
| 操作 | 详细规则 |
|
|
11
|
+
|------|----------|
|
|
12
|
+
| **读取** | [references/reader.md](references/reader.md) |
|
|
13
|
+
| **写入** | [references/writer.md](references/writer.md) |
|
|
14
|
+
| **模板** | [references/templates.md](references/templates.md) |
|
|
15
|
+
| **高级规则** | [references/advanced-rules.md](references/advanced-rules.md) |
|
|
17
16
|
|
|
18
17
|
---
|
|
19
18
|
|
|
20
19
|
## 目录速查
|
|
21
20
|
|
|
22
|
-
|
|
|
23
|
-
|
|
21
|
+
| 目录/文件 | 用途 | 何时读 |
|
|
22
|
+
|-----------|------|--------|
|
|
24
23
|
| `_index.md` | 索引 | 每次必读 |
|
|
24
|
+
| `brief.md` | 项目概述 | 了解项目是什么 |
|
|
25
|
+
| `tech.md` | 技术栈 + 命令 | 了解怎么跑/测试 |
|
|
26
|
+
| `active.md` | 当前焦点 | 了解进行中的工作 |
|
|
27
|
+
| `patterns.md` | 技术决策 | 涉及技术选型时 |
|
|
25
28
|
| `requirements/` | 需求文档 | 涉及功能/需求时 |
|
|
26
29
|
| `docs/` | 设计文档 | 涉及实现/架构时 |
|
|
27
30
|
| `learnings/` | 经验记录 | 遇到 bug/性能问题时 |
|
|
28
|
-
| `patterns.md` | 技术决策 | 涉及技术选型时 |
|
|
29
|
-
| `active.md` | 当前焦点 | 了解进行中的工作 |
|
|
30
31
|
|
|
31
32
|
---
|
|
32
33
|
|
|
@@ -34,10 +35,10 @@ description: 项目记忆系统 - 自动读取上下文、自动沉淀发现、
|
|
|
34
35
|
|
|
35
36
|
```
|
|
36
37
|
memory-bank/
|
|
37
|
-
├── _index.md #
|
|
38
|
+
├── _index.md # 索引文件
|
|
38
39
|
├── brief.md # 项目概述(稳定)
|
|
39
40
|
├── tech.md # 技术栈 + 环境 + 命令
|
|
40
|
-
├── active.md #
|
|
41
|
+
├── active.md # 当前焦点(高频更新)
|
|
41
42
|
├── progress.md # 完成状态
|
|
42
43
|
├── patterns.md # 技术决策 + 代码约定
|
|
43
44
|
│
|
|
@@ -47,41 +48,28 @@ memory-bank/
|
|
|
47
48
|
├── docs/ # 技术文档
|
|
48
49
|
│ ├── architecture.md
|
|
49
50
|
│ ├── design-*.md
|
|
50
|
-
│
|
|
51
|
-
│ └── specs/
|
|
51
|
+
│ └── modules/
|
|
52
52
|
│
|
|
53
53
|
├── learnings/ # 经验沉淀
|
|
54
54
|
│ ├── bugs/
|
|
55
55
|
│ ├── performance/
|
|
56
56
|
│ └── integrations/
|
|
57
57
|
│
|
|
58
|
-
└── archive/ #
|
|
58
|
+
└── archive/ # 归档文件
|
|
59
59
|
└── active_YYYY-MM.md
|
|
60
60
|
```
|
|
61
61
|
|
|
62
|
-
可选子索引(规模变大时启用):
|
|
63
|
-
- `requirements/_index.md`
|
|
64
|
-
- `docs/_index.md`
|
|
65
|
-
- `learnings/_index.md`
|
|
66
|
-
|
|
67
62
|
---
|
|
68
63
|
|
|
69
|
-
## Bootstrap
|
|
64
|
+
## Bootstrap 流程
|
|
70
65
|
|
|
71
|
-
|
|
66
|
+
每次用户对话时:
|
|
72
67
|
|
|
73
68
|
```
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
│
|
|
79
|
-
└─ 不存在 → 检测是否有代码库
|
|
80
|
-
│
|
|
81
|
-
├─ 有代码库 → 扫描项目结构(package.json, README 等)
|
|
82
|
-
│ 生成 brief.md + tech.md 草稿
|
|
83
|
-
│ 创建 _index.md
|
|
84
|
-
│
|
|
69
|
+
检测 memory-bank/ 目录
|
|
70
|
+
├─ 存在 → 读取 _index.md + brief.md + active.md → 正常工作
|
|
71
|
+
└─ 不存在 → 检测代码库
|
|
72
|
+
├─ 有代码库 → 扫描项目结构 → 生成 brief.md + tech.md
|
|
85
73
|
└─ 空目录 → 等用户开始工作后按需创建
|
|
86
74
|
```
|
|
87
75
|
|
|
@@ -89,227 +77,28 @@ memory-bank/
|
|
|
89
77
|
|
|
90
78
|
---
|
|
91
79
|
|
|
92
|
-
##
|
|
80
|
+
## 每轮行为
|
|
93
81
|
|
|
94
|
-
###
|
|
82
|
+
### 读取阶段
|
|
95
83
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
| brief.md | Project Brief | 电商后台,核心是订单管理 | 2024-01-20 | 45 |
|
|
100
|
-
| tech.md | Tech Stack | Go + Gin + PostgreSQL | 2024-01-20 | 80 |
|
|
101
|
-
```
|
|
84
|
+
1. 固定加载:`brief.md` + `active.md` + `_index.md`
|
|
85
|
+
2. 基于 `_index.md` 选择相关文件(最多 5 个,500 行)
|
|
86
|
+
3. **Memory-first**:先查 Memory Bank,再查代码
|
|
102
87
|
|
|
103
|
-
|
|
104
|
-
- 创建/修改文件后自动更新索引
|
|
105
|
-
- 用户可手动编辑 summary 提升检索精度
|
|
106
|
-
- size 字段用于 context 预算控制
|
|
88
|
+
详见 [reader.md](references/reader.md)
|
|
107
89
|
|
|
108
|
-
|
|
90
|
+
### 写入阶段
|
|
109
91
|
|
|
110
|
-
## 智能检索
|
|
111
92
|
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
```
|
|
115
|
-
1. 固定加载:brief.md + active.md + _index.md(如存在)
|
|
116
|
-
|
|
117
|
-
2. 语义判断:
|
|
118
|
-
- 基于 _index.md 选择相关文件
|
|
119
|
-
- 输出决策:{ files: [...], reason: "..." }
|
|
120
|
-
|
|
121
|
-
3. 按预算加载选中文件
|
|
122
|
-
```
|
|
123
|
-
|
|
124
|
-
### 预算限制
|
|
125
|
-
- 每轮最多加载 5 个额外文件
|
|
126
|
-
- 总行数限制 500 行
|
|
127
|
-
- 超出时优先加载小文件、新文件
|
|
128
|
-
|
|
129
|
-
### 风险提示
|
|
130
|
-
- 如果 learnings/ 下有相关历史经验
|
|
131
|
-
- 主动提醒:"注意:历史上有类似问题 → {file}"
|
|
93
|
+
详见 [writer.md](references/writer.md)
|
|
132
94
|
|
|
133
95
|
---
|
|
134
96
|
|
|
135
|
-
## 自动写入规则
|
|
136
|
-
|
|
137
|
-
### 触发时机
|
|
138
|
-
|
|
139
|
-
| 事件类型 | 触发条件 | 创建/更新 |
|
|
140
|
-
|---------|---------|----------|
|
|
141
|
-
| **New Entity** | 确定新需求/模块/API | requirements/REQ-xxx.md 或 docs/modules/xxx.md |
|
|
142
|
-
| **Design** | 新设计 / 重新设计 / 设计变更 | docs/design-{slug}.md(已存在则更新) |
|
|
143
|
-
| **Decision** | 技术选型确定,用户认可 | patterns.md |
|
|
144
|
-
| **Learning** | Bug 修复/性能优化/集成踩坑 | learnings/{type}/{date}-{slug}.md |
|
|
145
|
-
| **Archive** | active.md 超过 120 行或已完成条目超过 20 条 | archive/active_YYYY-MM.md |
|
|
146
|
-
|
|
147
|
-
### 归档判定
|
|
148
|
-
|
|
149
|
-
- 已完成条目 = `active.md` 中“已完成(待归档)”区块内的 `- [x]` 数量
|
|
150
|
-
- 若该区块缺失,可回退为统计 `active.md` 中所有 `- [x]` 项
|
|
151
|
-
|
|
152
|
-
### 不写入的情况
|
|
153
|
-
- 普通代码修改
|
|
154
|
-
- 探索性调研(未形成结论)
|
|
155
|
-
- 临时 debug(未确认根因)
|
|
156
|
-
|
|
157
|
-
### patterns vs 设计文档判定
|
|
158
|
-
|
|
159
|
-
用下面的判定避免混淆:
|
|
160
|
-
|
|
161
|
-
- **patterns.md**:全局/长期的技术决策或约定("以后都这样做"、"统一选择 X")
|
|
162
|
-
- **docs/design-*.md**:某个功能/模块/重构的具体实现方案("这个功能怎么搭")
|
|
163
|
-
|
|
164
|
-
快速判断:
|
|
165
|
-
|
|
166
|
-
- 问题是"该功能如何实现" → 写设计文档
|
|
167
|
-
- 问题是"我们以后统一怎么做/用什么" → 追加 patterns
|
|
168
|
-
- 两者都涉及 → 先写设计文档,再把最终技术决策沉淀到 patterns
|
|
169
|
-
|
|
170
|
-
### 写入前确认
|
|
171
|
-
|
|
172
|
-
```
|
|
173
|
-
[Memory Bank 更新计划]
|
|
174
|
-
- 创建: requirements/REQ-004-refund.md
|
|
175
|
-
- 更新: active.md
|
|
176
|
-
- 更新: _index.md
|
|
177
|
-
|
|
178
|
-
是否执行?
|
|
179
|
-
```
|
|
180
|
-
|
|
181
|
-
---
|
|
182
|
-
|
|
183
|
-
## 区块分离
|
|
184
|
-
|
|
185
|
-
每个文件分为两个区块:
|
|
186
|
-
|
|
187
|
-
```markdown
|
|
188
|
-
<!-- MACHINE_BLOCK_START -->
|
|
189
|
-
(AI 自动维护,用户不要改)
|
|
190
|
-
<!-- MACHINE_BLOCK_END -->
|
|
191
|
-
|
|
192
|
-
<!-- USER_BLOCK_START -->
|
|
193
|
-
(用户自由编辑,AI 不覆盖)
|
|
194
|
-
<!-- USER_BLOCK_END -->
|
|
195
|
-
```
|
|
196
|
-
|
|
197
|
-
冲突处理:检测到用户修改机器区块时,提示用户选择保留哪个版本。
|
|
198
|
-
|
|
199
|
-
---
|
|
200
|
-
|
|
201
|
-
## 命令
|
|
202
|
-
|
|
203
|
-
| 触发 | 动作 |
|
|
204
|
-
|------|------|
|
|
205
|
-
| `更新记忆` / `update memory bank` | 全面检查并更新所有文件 |
|
|
206
|
-
| `新需求: {标题}` / `new req: {title}` | 创建需求文档 |
|
|
207
|
-
| `新模块文档: {名称}` / `new module doc: {name}` | 创建模块文档 |
|
|
208
|
-
| `记录经验: {类型}` / `log learning: {type}` | 创建经验文档(bug/performance/integration) |
|
|
209
|
-
| `项目状态` / `project status` | 汇总输出当前状态 |
|
|
210
|
-
| `整理记忆` / `organize memory` | 分析文件分类,给出迁移和新建目录建议 |
|
|
211
|
-
|
|
212
|
-
---
|
|
213
|
-
|
|
214
|
-
## 整理记忆(Organize)
|
|
215
|
-
|
|
216
|
-
当用户触发"整理记忆"时,分析 `memory-bank/` 目录结构,给出分类建议。
|
|
217
|
-
|
|
218
|
-
### 触发词
|
|
219
|
-
|
|
220
|
-
- 中文:`整理记忆`、`归类记忆`、`整理 memory bank`
|
|
221
|
-
- 英文:`organize memory`、`organize memory bank`、`tidy memory bank`
|
|
222
|
-
|
|
223
|
-
### 执行流程
|
|
224
|
-
|
|
225
|
-
```
|
|
226
|
-
Phase A: 分析(默认)
|
|
227
|
-
- 扫描 memory-bank/**/*.md
|
|
228
|
-
- 生成迁移建议 + 新目录建议
|
|
229
|
-
- 输出建议清单,不做任何改动
|
|
230
|
-
|
|
231
|
-
Phase B: 执行(用户确认后)
|
|
232
|
-
- 用户回复 `apply` / `确认执行`
|
|
233
|
-
- 创建新目录、移动文件、更新索引
|
|
234
|
-
- 输出变更报告
|
|
235
|
-
```
|
|
236
|
-
|
|
237
|
-
### 保护列表(永不迁移)
|
|
238
|
-
|
|
239
|
-
- `_index.md`、`brief.md`、`tech.md`、`active.md`、`patterns.md`、`progress.md`
|
|
240
|
-
- `archive/**` 下所有文件
|
|
241
|
-
|
|
242
|
-
### 强规则路由
|
|
243
|
-
|
|
244
|
-
| 文件模式 | 目标目录 |
|
|
245
|
-
|----------|----------|
|
|
246
|
-
| `REQ-*.md` | `requirements/` |
|
|
247
|
-
| `design-*.md`、`architecture.md` | `docs/` |
|
|
248
|
-
| `active_YYYY-MM.md` | `archive/` |
|
|
249
|
-
| `YYYY-MM-DD-*bug*.md` | `learnings/bugs/` |
|
|
250
|
-
| `YYYY-MM-DD-*perf*.md` | `learnings/performance/` |
|
|
251
|
-
|
|
252
|
-
### 新目录建议
|
|
253
|
-
|
|
254
|
-
仅在以下条件**全部满足**时建议新建子目录:
|
|
255
|
-
|
|
256
|
-
1. **父目录限制**:只允许在 `docs/`、`learnings/` 下新建
|
|
257
|
-
2. **数量阈值**:同主题文件数 >= 4
|
|
258
|
-
3. **主题来源**:文件名或标题中的高频关键词
|
|
259
|
-
|
|
260
|
-
**命名规范**:全小写 ASCII、`kebab-case`、长度 <= 32 字符
|
|
261
|
-
|
|
262
|
-
### 输出格式
|
|
263
|
-
|
|
264
|
-
**迁移建议**:
|
|
265
|
-
|
|
266
|
-
```markdown
|
|
267
|
-
## 迁移建议
|
|
268
|
-
|
|
269
|
-
| # | 当前路径 | 建议路径 | 原因 |
|
|
270
|
-
|---|----------|----------|------|
|
|
271
|
-
| 1 | wechat-auth.md | docs/wechat-auth.md | 文件名含 design 关键词 |
|
|
272
|
-
```
|
|
273
|
-
|
|
274
|
-
**新目录建议**:
|
|
275
|
-
|
|
276
|
-
```markdown
|
|
277
|
-
## 新目录建议
|
|
278
|
-
|
|
279
|
-
| # | 新目录 | 迁入文件 | 原因 |
|
|
280
|
-
|---|--------|----------|------|
|
|
281
|
-
| 1 | learnings/integrations/wechat/ | file1.md, file2.md, ... | 4 个文件标题含 "wechat" |
|
|
282
|
-
```
|
|
283
|
-
|
|
284
|
-
**确认提示**:
|
|
285
|
-
|
|
286
|
-
```
|
|
287
|
-
回复 `apply` 或 `确认执行` 执行以上变更。
|
|
288
|
-
```
|
|
289
|
-
|
|
290
|
-
### 执行边界
|
|
291
|
-
|
|
292
|
-
- 只改 `memory-bank/` 内文件
|
|
293
|
-
- 目标已存在同名文件时跳过,不覆盖
|
|
294
|
-
- 只修复 `memory-bank/**` 内的 `[text](path.md)` 形式链接
|
|
295
|
-
- `apply` 只执行强规则命中的迁移建议
|
|
296
|
-
- 新目录建议需显式选择:`apply 1` 或 `apply dirs`
|
|
297
|
-
- 文件已在正确位置时不输出建议
|
|
298
|
-
|
|
299
|
-
### 忽略机制
|
|
300
|
-
|
|
301
|
-
创建 `memory-bank/.organize-ignore` 文件可忽略特定文件/目录(glob 模式)。
|
|
302
|
-
|
|
303
|
-
### Learnings 回退
|
|
304
|
-
|
|
305
|
-
`learnings/` 下不匹配子目录规则的文件保持原位,不强制移动。
|
|
306
|
-
|
|
307
|
-
---
|
|
308
97
|
|
|
309
98
|
## 设计原则
|
|
310
99
|
|
|
311
100
|
1. **零初始化**:不需要手动 init
|
|
312
|
-
2.
|
|
101
|
+
2. **语义检索**:AI 理解,不用关键词匹配
|
|
313
102
|
3. **索引驱动**:通过 _index.md 支撑快速检索
|
|
314
103
|
4. **区块分离**:机器区块自动维护,用户区块自由编辑
|
|
315
104
|
5. **写前确认**:重要写入前输出计划
|
|
@@ -318,188 +107,10 @@ Phase B: 执行(用户确认后)
|
|
|
318
107
|
|
|
319
108
|
---
|
|
320
109
|
|
|
321
|
-
## 自动提交模式
|
|
322
|
-
|
|
323
|
-
当用户回复"更新并提交"或"初始化并提交"时,执行以下流程:
|
|
324
|
-
|
|
325
|
-
### Preflight 检查(必须全部通过)
|
|
326
|
-
|
|
327
|
-
执行以下检查,任一失败则中止并解释原因:
|
|
328
|
-
|
|
329
|
-
1. **确认是 git 仓库**:`git rev-parse --is-inside-work-tree`
|
|
330
|
-
2. **确认不在 merge/rebase/cherry-pick 中**:
|
|
331
|
-
- `git rev-parse --git-path MERGE_HEAD` 返回的文件不存在
|
|
332
|
-
- `git rev-parse --git-path rebase-merge` 返回的目录不存在
|
|
333
|
-
- `git rev-parse --git-path rebase-apply` 返回的目录不存在
|
|
334
|
-
- `git rev-parse --git-path CHERRY_PICK_HEAD` 返回的文件不存在
|
|
335
|
-
3. **确认无冲突文件**:`git diff --name-only --diff-filter=U` 必须为空
|
|
336
|
-
4. **确认有 git 身份**:`git config user.name` 和 `git config user.email` 非空
|
|
337
|
-
5. **确认有变更可提交**:`git status --porcelain` 非空
|
|
338
|
-
|
|
339
|
-
### 执行流程
|
|
340
|
-
|
|
341
|
-
1. **输出计划**,包含:
|
|
342
|
-
- 将要更新的 memory-bank 文件
|
|
343
|
-
- 将要提交的所有变更(`git status --porcelain`)
|
|
344
|
-
- **风险检查提醒**:确认没有 `.env`、凭证、大文件会被提交
|
|
345
|
-
- 如果已有 staged 变更,明确告知"将包含已 staged 的文件"
|
|
346
|
-
|
|
347
|
-
2. **等待用户确认**
|
|
348
|
-
|
|
349
|
-
3. **执行更新**:
|
|
350
|
-
- 写入 memory-bank 文件
|
|
351
|
-
- 执行 `git add -A`
|
|
352
|
-
- 执行 `git diff --cached --name-only` 显示将提交的文件
|
|
353
|
-
- 执行 `git commit -m "chore(memory-bank): update <files>"`
|
|
354
|
-
|
|
355
|
-
### Commit Message 格式
|
|
356
|
-
|
|
357
|
-
```
|
|
358
|
-
chore(memory-bank): update active.md
|
|
359
|
-
|
|
360
|
-
Auto-committed by Memory Bank.
|
|
361
|
-
```
|
|
362
|
-
|
|
363
|
-
多文件时:
|
|
364
|
-
```
|
|
365
|
-
chore(memory-bank): update memory bank
|
|
366
|
-
|
|
367
|
-
Files updated:
|
|
368
|
-
- memory-bank/active.md
|
|
369
|
-
- memory-bank/_index.md
|
|
370
|
-
```
|
|
371
|
-
|
|
372
|
-
### 失败处理
|
|
373
|
-
|
|
374
|
-
- **Preflight 失败**:不执行任何操作,解释原因和修复方法
|
|
375
|
-
- **Commit 失败**(如 hook 拒绝):报告错误,memory-bank 文件已写入但未提交,用户手动处理
|
|
376
|
-
|
|
377
|
-
---
|
|
378
|
-
|
|
379
110
|
## 安全护栏
|
|
380
111
|
|
|
381
112
|
### 禁止写入
|
|
113
|
+
|
|
382
114
|
- API 密钥、密码、token
|
|
383
115
|
- 客户隐私数据
|
|
384
116
|
- 任何凭证信息
|
|
385
|
-
|
|
386
|
-
### 防止幻觉
|
|
387
|
-
- 默认只读取 _index.md 中列出的文件
|
|
388
|
-
- 用户明确指定路径时允许读取,并补充到索引
|
|
389
|
-
- 创建新文件后必须同步更新索引
|
|
390
|
-
|
|
391
|
-
---
|
|
392
|
-
|
|
393
|
-
## 每轮行为规范
|
|
394
|
-
|
|
395
|
-
```
|
|
396
|
-
1. Bootstrap 检查(每次用户对话)
|
|
397
|
-
└─ 检测 memory-bank/ 是否存在
|
|
398
|
-
|
|
399
|
-
2. 固定加载
|
|
400
|
-
└─ 读取 brief.md + active.md + _index.md
|
|
401
|
-
|
|
402
|
-
3. 语义选择文件
|
|
403
|
-
└─ 基于 _index.md 选择相关文件
|
|
404
|
-
└─ 按预算限制加载
|
|
405
|
-
|
|
406
|
-
4. 处理用户请求
|
|
407
|
-
└─ **文档驱动开发原则**:
|
|
408
|
-
- 方案讨论确定后 → 先写 memory-bank/docs/design-xxx.md,再写代码
|
|
409
|
-
- 设计文档是契约,代码要符合文档
|
|
410
|
-
- 实现完成后回顾:如有偏差,决定改文档还是改实现
|
|
411
|
-
└─ 创建 todo 时:
|
|
412
|
-
- 方案讨论完成后开始落地 → 第一项是"写入设计文档到 memory-bank/docs/"
|
|
413
|
-
- 已有 memory-bank/ → 最后一项必须是"更新 Memory Bank"
|
|
414
|
-
- 没有 memory-bank/ → 第一项是"初始化 Memory Bank",最后一项是"更新 Memory Bank"
|
|
415
|
-
└─ 正常工作
|
|
416
|
-
|
|
417
|
-
5. 执行"更新 Memory Bank" todo 时
|
|
418
|
-
└─ 检查触发场景:
|
|
419
|
-
- 方案讨论确定 / 设计变更 → 检查 docs/design-*.md 是否已存在
|
|
420
|
-
- 存在 → 更新该文档
|
|
421
|
-
- 不存在 → 创建新文档
|
|
422
|
-
- 修改了代码/配置文件 → 更新 active.md
|
|
423
|
-
- 修复了 bug / 踩坑经验 → 创建 learnings/xxx.md
|
|
424
|
-
- 做了技术决策 → 追加 patterns.md
|
|
425
|
-
- 新需求确认 → 创建 requirements/REQ-xxx.md
|
|
426
|
-
- active.md 超出归档阈值 → 归档到 archive/active_YYYY-MM.md 并清理 active.md
|
|
427
|
-
└─ 命中任一条件 → 输出 memory_ops 计划
|
|
428
|
-
|
|
429
|
-
6. 执行写入
|
|
430
|
-
└─ 用户确认后执行
|
|
431
|
-
```
|
|
432
|
-
|
|
433
|
-
---
|
|
434
|
-
|
|
435
|
-
## 读取行为规范
|
|
436
|
-
|
|
437
|
-
当 system prompt 注入 Memory Bank Bootstrap(当前无 `[Memory Bank]` 头部通知)时,遵循以下规范:
|
|
438
|
-
|
|
439
|
-
### 0. Memory-first 原则(强制)
|
|
440
|
-
|
|
441
|
-
**任何问题,先假设"可能已经记录过"**。
|
|
442
|
-
|
|
443
|
-
| 问题类型 | 优先查 |
|
|
444
|
-
|---------|--------|
|
|
445
|
-
| 当前在做什么/下一步 | active.md |
|
|
446
|
-
| 项目是什么/概述 | brief.md |
|
|
447
|
-
| 怎么设计的/为什么这样实现 | docs/design-*.md |
|
|
448
|
-
| 为什么选这个方案/技术决策 | patterns.md |
|
|
449
|
-
| 遇到过这问题吗/踩坑经验 | learnings/ |
|
|
450
|
-
| 需求背景/功能定义 | requirements/ |
|
|
451
|
-
| 怎么跑/怎么测试/环境配置 | tech.md、docs/ |
|
|
452
|
-
|
|
453
|
-
**搜索顺序**:`_index.md` → 对应目录 → 代码
|
|
454
|
-
|
|
455
|
-
**强制规则**:
|
|
456
|
-
- 找到答案 → 引用文件路径,直接回答
|
|
457
|
-
- `_index.md` 与对应目录检索无果,或找到但与代码/行为不一致 → 才读代码
|
|
458
|
-
- **若因文档缺失/过时而读了代码 → 这本身就是写入触发点**
|
|
459
|
-
- 在回复中点名要新增/更新的目标文件路径(docs/learnings/patterns.md/requirements/)
|
|
460
|
-
- 说明要写入的 1-2 个要点
|
|
461
|
-
|
|
462
|
-
**冲突处理**:当文档与代码不一致时,以代码为准,但必须提议更新文档并引用路径。
|
|
463
|
-
|
|
464
|
-
### 1. 显式声明上下文来源
|
|
465
|
-
|
|
466
|
-
回答问题时,简短说明参考了哪些 Memory Bank 文件:
|
|
467
|
-
|
|
468
|
-
```
|
|
469
|
-
基于 brief.md 和 active.md,当前项目是...
|
|
470
|
-
```
|
|
471
|
-
|
|
472
|
-
### 2. 不把 Memory Bank 当真理
|
|
473
|
-
|
|
474
|
-
Memory Bank 可能过时。如果与代码/配置矛盾:
|
|
475
|
-
- **优先以仓库实际内容为准**
|
|
476
|
-
- 建议更新 Memory Bank(走写入流程)
|
|
477
|
-
|
|
478
|
-
### 3. 引用驱动的继续阅读
|
|
479
|
-
|
|
480
|
-
如果 `active.md` 或 `_index.md` 提到:
|
|
481
|
-
- `REQ-xxx` → 读取对应需求文档
|
|
482
|
-
- `patterns.md` → 读取技术决策
|
|
483
|
-
- 某模块文档 → 读取该文档
|
|
484
|
-
|
|
485
|
-
将这些当作**高优先级读取目标**。
|
|
486
|
-
|
|
487
|
-
### 4. 陈旧检测
|
|
488
|
-
|
|
489
|
-
当 `active.md` 的"当前焦点"与用户最新目标明显不一致时:
|
|
490
|
-
- 先澄清:"active.md 记录的焦点是 X,你现在想做 Y,是否需要更新?"
|
|
491
|
-
- 或直接建议更新(走写入流程)
|
|
492
|
-
|
|
493
|
-
### 5. 输出边界
|
|
494
|
-
|
|
495
|
-
上下文不足时:
|
|
496
|
-
- **先用工具**(grep/read)查找相关文件
|
|
497
|
-
- **禁止**仅凭 Memory Bank 缺失就断言"不存在"或"没有"
|
|
498
|
-
|
|
499
|
-
---
|
|
500
|
-
|
|
501
|
-
## 详细参考
|
|
502
|
-
|
|
503
|
-
- [文件模板](references/templates.md) - 各文件的标准模板
|
|
504
|
-
- [高级规则](references/advanced-rules.md) - 冲突处理、阈值规则、预算控制
|
|
505
|
-
- [结构化输出 Schema](references/schema.md) - JSON 输出格式定义
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
# Memory Bank Reader 规则
|
|
2
|
+
|
|
3
|
+
> 此文档定义 Memory Bank 的读取规则,由主 Agent 在每轮对话开始时执行。
|
|
4
|
+
|
|
5
|
+
## Memory Gate(强制)
|
|
6
|
+
|
|
7
|
+
开始任何工作前,按此顺序执行:
|
|
8
|
+
|
|
9
|
+
1. **Read** `memory-bank/_index.md`
|
|
10
|
+
2. **找到相关路径** → Read 这些文档
|
|
11
|
+
3. **然后** 才能使用 Glob/Grep/代码搜索
|
|
12
|
+
|
|
13
|
+
**禁止**:在完成步骤 1-2 前使用任何代码搜索工具。
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## Memory-first 原则(强制)
|
|
18
|
+
|
|
19
|
+
**任何问题,先假设"可能已经记录过"**。
|
|
20
|
+
|
|
21
|
+
| 问题类型 | 优先查 |
|
|
22
|
+
|---------|--------|
|
|
23
|
+
| 当前在做什么/下一步 | active.md |
|
|
24
|
+
| 项目是什么/概述 | brief.md |
|
|
25
|
+
| 怎么设计的/为什么这样实现 | docs/design-*.md |
|
|
26
|
+
| 为什么选这个方案/技术决策 | patterns.md |
|
|
27
|
+
| 遇到过这问题吗/踩坑经验 | learnings/ |
|
|
28
|
+
| 需求背景/功能定义 | requirements/ |
|
|
29
|
+
| 怎么跑/怎么测试/环境配置 | tech.md、docs/ |
|
|
30
|
+
|
|
31
|
+
**搜索顺序**:`_index.md` → 对应目录 → 代码
|
|
32
|
+
|
|
33
|
+
**强制规则**:
|
|
34
|
+
- 找到答案 → 引用文件路径,直接回答
|
|
35
|
+
- `_index.md` 与对应目录检索无果,或找到但与代码/行为不一致 → 才读代码
|
|
36
|
+
- **若因文档缺失/过时而读了代码 → 这本身就是写入触发点**
|
|
37
|
+
- 在回复中点名要新增/更新的目标文件路径
|
|
38
|
+
- 说明要写入的 1-2 个要点
|
|
39
|
+
|
|
40
|
+
**冲突处理**:当文档与代码不一致时,以代码为准,但必须提议更新文档并引用路径。
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## 智能检索
|
|
45
|
+
|
|
46
|
+
### 每轮对话流程
|
|
47
|
+
|
|
48
|
+
```
|
|
49
|
+
1. 固定加载:brief.md + active.md + _index.md(如存在)
|
|
50
|
+
|
|
51
|
+
2. 语义判断:
|
|
52
|
+
- 基于 _index.md 选择相关文件
|
|
53
|
+
- 输出决策:{ files: [...], reason: "..." }
|
|
54
|
+
|
|
55
|
+
3. 按预算加载选中文件
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### 预算限制
|
|
59
|
+
|
|
60
|
+
| 类型 | 预算 |
|
|
61
|
+
|------|------|
|
|
62
|
+
| 固定加载(brief + active + _index) | 不限 |
|
|
63
|
+
| 每轮额外加载 | 最多 5 个文件 |
|
|
64
|
+
| 额外加载总行数 | 最多 500 行 |
|
|
65
|
+
|
|
66
|
+
### 超预算降级
|
|
67
|
+
|
|
68
|
+
当候选文件总 size 超过 500 行时:
|
|
69
|
+
1. 固定加载 brief.md + active.md + _index.md(不计入预算)
|
|
70
|
+
2. 按相关性排序候选文件
|
|
71
|
+
3. 按 size 从小到大依次加载
|
|
72
|
+
4. 累计 size 达到 500 行时停止
|
|
73
|
+
5. 未加载的文件提示用户:"以下文件相关但未加载(预算限制):..."
|
|
74
|
+
|
|
75
|
+
### 大文件处理
|
|
76
|
+
|
|
77
|
+
- 如果单个文件 > 200 行
|
|
78
|
+
- 只读取前 100 行 + 最后 50 行
|
|
79
|
+
- 中间插入 `[... 省略 {n} 行 ...]`
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## 风险提示
|
|
84
|
+
|
|
85
|
+
如果 `learnings/` 下有相关历史经验,主动提醒:
|
|
86
|
+
|
|
87
|
+
```
|
|
88
|
+
注意:历史上有类似问题 → {file}
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## 引用驱动的继续阅读
|
|
94
|
+
|
|
95
|
+
如果 `active.md` 或 `_index.md` 提到:
|
|
96
|
+
- `REQ-xxx` → 读取对应需求文档
|
|
97
|
+
- `patterns.md` → 读取技术决策
|
|
98
|
+
- 某模块文档 → 读取该文档
|
|
99
|
+
|
|
100
|
+
将这些当作**高优先级读取目标**。
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
## 陈旧检测
|
|
105
|
+
|
|
106
|
+
当 `active.md` 的"当前焦点"与用户最新目标明显不一致时:
|
|
107
|
+
- 先澄清:"active.md 记录的焦点是 X,你现在想做 Y,是否需要更新?"
|
|
108
|
+
- 或直接建议更新(触发写入流程)
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
## 输出边界
|
|
113
|
+
|
|
114
|
+
上下文不足时:
|
|
115
|
+
- **先用工具**(grep/read)查找相关文件
|
|
116
|
+
- **禁止**仅凭 Memory Bank 缺失就断言"不存在"或"没有"
|
|
117
|
+
|
|
118
|
+
---
|
|
119
|
+
|
|
120
|
+
## 声明上下文来源
|
|
121
|
+
|
|
122
|
+
回答问题时,简短说明参考了哪些 Memory Bank 文件:
|
|
123
|
+
|
|
124
|
+
```
|
|
125
|
+
基于 brief.md 和 active.md,当前项目是...
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
---
|
|
129
|
+
|
|
130
|
+
## 不把 Memory Bank 当真理
|
|
131
|
+
|
|
132
|
+
Memory Bank 可能过时。如果与代码/配置矛盾:
|
|
133
|
+
- **优先以仓库实际内容为准**
|
|
134
|
+
- 建议更新 Memory Bank(触发写入流程)
|
|
@@ -1,11 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
name: memory-bank-writer
|
|
3
|
-
description: Memory Bank 专用写入 Agent - 负责所有 memory-bank/ 目录的写入操作
|
|
4
|
-
---
|
|
1
|
+
# Memory Bank Writer 规则
|
|
5
2
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
你是 Memory Bank 的专用写入 Agent。只有你能写入 `memory-bank/` 目录。
|
|
3
|
+
> 此文档定义 Memory Bank 的写入规则,由主 Agent 或 Writer Agent 执行。
|
|
9
4
|
|
|
10
5
|
## 写入触发
|
|
11
6
|
|
|
@@ -74,22 +69,48 @@ description: Memory Bank 专用写入 Agent - 负责所有 memory-bank/ 目录
|
|
|
74
69
|
| `patterns.md` | 追加内容(不覆盖) |
|
|
75
70
|
| `_index.md` | 每次写入后自动更新 |
|
|
76
71
|
|
|
77
|
-
##
|
|
72
|
+
## 职责分离(核心原则)
|
|
78
73
|
|
|
79
|
-
|
|
74
|
+
**重要**:主 Agent 只说诉求,Writer 自主判断写入目标。
|
|
80
75
|
|
|
81
76
|
| 步骤 | 负责方 | 动作 |
|
|
82
77
|
|------|--------|------|
|
|
83
|
-
| 1 | 主 Agent |
|
|
78
|
+
| 1 | 主 Agent | 输出更新计划(只说诉求和要点) |
|
|
84
79
|
| 2 | 主 Agent | 跟用户确认 |
|
|
85
80
|
| 3 | 用户 | 确认或拒绝 |
|
|
86
|
-
| 4 | 主 Agent | delegate 给 Writer
|
|
87
|
-
| 5 | **Writer** |
|
|
81
|
+
| 4 | 主 Agent | delegate 给 Writer(**只传诉求,禁止指定路径**) |
|
|
82
|
+
| 5 | **Writer** | **自主判断写入目标** → 执行写入 |
|
|
83
|
+
|
|
84
|
+
### 主 Agent 的 prompt 格式
|
|
85
|
+
|
|
86
|
+
```
|
|
87
|
+
诉求:{语义意图,如"记录 SDK pool 简化的设计变更"}
|
|
88
|
+
背景:{简要上下文}
|
|
89
|
+
要点:
|
|
90
|
+
1. {要点1}
|
|
91
|
+
2. {要点2}
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
**禁止**:主 Agent 在 prompt 中指定文件路径。
|
|
88
95
|
|
|
89
|
-
Writer
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
96
|
+
### Writer 自主判断流程
|
|
97
|
+
|
|
98
|
+
```
|
|
99
|
+
1. 解析诉求类型:
|
|
100
|
+
- 设计变更 → docs/design-*.md
|
|
101
|
+
- 新需求 → requirements/REQ-*.md
|
|
102
|
+
- 技术决策 → patterns.md
|
|
103
|
+
- Bug/踩坑 → learnings/**/*.md
|
|
104
|
+
- 焦点变更 → active.md
|
|
105
|
+
|
|
106
|
+
2. Glob 检查现有文档:
|
|
107
|
+
- 找到相关文档(文件名/标题匹配)→ 更新
|
|
108
|
+
- 没找到 → 创建新文档
|
|
109
|
+
|
|
110
|
+
3. 执行写入 + 更新 _index.md
|
|
111
|
+
|
|
112
|
+
4. 输出决策报告
|
|
113
|
+
```
|
|
93
114
|
|
|
94
115
|
## 执行输出格式
|
|
95
116
|
|
|
@@ -212,3 +233,121 @@ Plugin 层面强制执行:
|
|
|
212
233
|
| Bash 启发式 | 变量间接、eval、脚本无法检测 |
|
|
213
234
|
| Symlinks | 通过 symlink 可绕过路径检查 |
|
|
214
235
|
| 首次写入 | 可能因 race condition 被阻止一次(重试即可) |
|
|
236
|
+
|
|
237
|
+
---
|
|
238
|
+
|
|
239
|
+
## 区块分离
|
|
240
|
+
|
|
241
|
+
每个文件分为两个区块:
|
|
242
|
+
|
|
243
|
+
```markdown
|
|
244
|
+
<!-- MACHINE_BLOCK_START -->
|
|
245
|
+
(AI 自动维护,用户不要改)
|
|
246
|
+
<!-- MACHINE_BLOCK_END -->
|
|
247
|
+
|
|
248
|
+
<!-- USER_BLOCK_START -->
|
|
249
|
+
(用户自由编辑,AI 不覆盖)
|
|
250
|
+
<!-- USER_BLOCK_END -->
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
冲突处理:检测到用户修改机器区块时,提示用户选择保留哪个版本。
|
|
254
|
+
|
|
255
|
+
---
|
|
256
|
+
|
|
257
|
+
## 自动提交模式
|
|
258
|
+
|
|
259
|
+
当用户回复"更新并提交"或"初始化并提交"时,执行以下流程:
|
|
260
|
+
|
|
261
|
+
### Preflight 检查(必须全部通过)
|
|
262
|
+
|
|
263
|
+
1. **确认是 git 仓库**:`git rev-parse --is-inside-work-tree`
|
|
264
|
+
2. **确认不在 merge/rebase/cherry-pick 中**
|
|
265
|
+
3. **确认无冲突文件**:`git diff --name-only --diff-filter=U` 必须为空
|
|
266
|
+
4. **确认有 git 身份**:`git config user.name` 和 `git config user.email` 非空
|
|
267
|
+
5. **确认有变更可提交**:`git status --porcelain` 非空
|
|
268
|
+
|
|
269
|
+
### 执行流程
|
|
270
|
+
|
|
271
|
+
1. **输出计划**,包含:
|
|
272
|
+
- 将要更新的 memory-bank 文件
|
|
273
|
+
- 将要提交的所有变更
|
|
274
|
+
- **风险检查提醒**:确认没有 `.env`、凭证、大文件会被提交
|
|
275
|
+
|
|
276
|
+
2. **等待用户确认**
|
|
277
|
+
|
|
278
|
+
3. **执行更新**:
|
|
279
|
+
- 写入 memory-bank 文件
|
|
280
|
+
- 执行 `git add -A`
|
|
281
|
+
- 执行 `git commit -m "chore(memory-bank): update <files>"`
|
|
282
|
+
|
|
283
|
+
### Commit Message 格式
|
|
284
|
+
|
|
285
|
+
单文件:
|
|
286
|
+
```
|
|
287
|
+
chore(memory-bank): update active.md
|
|
288
|
+
|
|
289
|
+
Auto-committed by Memory Bank.
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
多文件:
|
|
293
|
+
```
|
|
294
|
+
chore(memory-bank): update memory bank
|
|
295
|
+
|
|
296
|
+
Files updated:
|
|
297
|
+
- memory-bank/active.md
|
|
298
|
+
- memory-bank/_index.md
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
---
|
|
302
|
+
|
|
303
|
+
## 整理记忆(Organize)
|
|
304
|
+
|
|
305
|
+
当用户触发"整理记忆"时,分析 `memory-bank/` 目录结构,给出分类建议。
|
|
306
|
+
|
|
307
|
+
### 触发词
|
|
308
|
+
|
|
309
|
+
- 中文:`整理记忆`、`归类记忆`
|
|
310
|
+
- 英文:`organize memory`、`tidy memory bank`
|
|
311
|
+
|
|
312
|
+
### 执行流程
|
|
313
|
+
|
|
314
|
+
```
|
|
315
|
+
Phase A: 分析(默认)
|
|
316
|
+
- 扫描 memory-bank/**/*.md
|
|
317
|
+
- 生成迁移建议 + 新目录建议
|
|
318
|
+
- 输出建议清单,不做任何改动
|
|
319
|
+
|
|
320
|
+
Phase B: 执行(用户确认后)
|
|
321
|
+
- 用户回复 `apply` / `确认执行`
|
|
322
|
+
- 创建新目录、移动文件、更新索引
|
|
323
|
+
```
|
|
324
|
+
|
|
325
|
+
### 保护列表(永不迁移)
|
|
326
|
+
|
|
327
|
+
- `_index.md`、`brief.md`、`tech.md`、`active.md`、`patterns.md`、`progress.md`
|
|
328
|
+
- `archive/**` 下所有文件
|
|
329
|
+
|
|
330
|
+
### 强规则路由
|
|
331
|
+
|
|
332
|
+
| 文件模式 | 目标目录 |
|
|
333
|
+
|----------|----------|
|
|
334
|
+
| `REQ-*.md` | `requirements/` |
|
|
335
|
+
| `design-*.md`、`architecture.md` | `docs/` |
|
|
336
|
+
| `active_YYYY-MM.md` | `archive/` |
|
|
337
|
+
| `YYYY-MM-DD-*bug*.md` | `learnings/bugs/` |
|
|
338
|
+
| `YYYY-MM-DD-*perf*.md` | `learnings/performance/` |
|
|
339
|
+
|
|
340
|
+
### 新目录建议
|
|
341
|
+
|
|
342
|
+
仅在以下条件**全部满足**时建议新建子目录:
|
|
343
|
+
|
|
344
|
+
1. **父目录限制**:只允许在 `docs/`、`learnings/` 下新建
|
|
345
|
+
2. **数量阈值**:同主题文件数 >= 4
|
|
346
|
+
3. **主题来源**:文件名或标题中的高频关键词
|
|
347
|
+
|
|
348
|
+
### 执行边界
|
|
349
|
+
|
|
350
|
+
- 只改 `memory-bank/` 内文件
|
|
351
|
+
- 目标已存在同名文件时跳过,不覆盖
|
|
352
|
+
- `apply` 只执行强规则命中的迁移建议
|
|
353
|
+
- 新目录建议需显式选择:`apply 1` 或 `apply dirs`
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
# Memory Bank Writer Skill
|
|
2
|
-
|
|
3
|
-
Memory Bank 专用写入 Agent 的技能定义。
|
|
4
|
-
|
|
5
|
-
## 用途
|
|
6
|
-
|
|
7
|
-
主 Agent 无法直接写入 `memory-bank/` 目录,必须通过 delegate 调用此 Agent。
|
|
8
|
-
|
|
9
|
-
## 调用方式
|
|
10
|
-
|
|
11
|
-
```
|
|
12
|
-
delegate_task(
|
|
13
|
-
subagent_type="memory-bank-writer",
|
|
14
|
-
load_skills=["memory-bank-writer"],
|
|
15
|
-
prompt="更新设计文档:[内容]"
|
|
16
|
-
)
|
|
17
|
-
```
|
|
18
|
-
|
|
19
|
-
## 内置规则
|
|
20
|
-
|
|
21
|
-
- 写入前 Glob 检查已有文件
|
|
22
|
-
- 优先更新而非创建
|
|
23
|
-
- 自动更新 `_index.md`
|
|
24
|
-
|
|
25
|
-
## 文件
|
|
26
|
-
|
|
27
|
-
- `SKILL.md` - 技能定义和规则
|