Skip to content

Commit 0267adb

Browse files
committed
docs(plan): 规划项目记忆 CLI
1 parent fa4c919 commit 0267adb

1 file changed

Lines changed: 286 additions & 0 deletions

File tree

Lines changed: 286 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,286 @@
1+
---
2+
title: "feat: 新增项目记忆 CLI"
3+
type: "feat"
4+
date: "2026-06-10"
5+
---
6+
7+
# feat: 新增项目记忆 CLI
8+
9+
## 摘要
10+
11+
新增轻量 `aisee memory` 命令组,用于项目本地长期记忆;更新 hooks,让 agent 通过受控发现和检索使用 memory,而不是在会话启动时注入大量上下文;新增 `aisee:memory` skill;并将 CLI / PyPI 包版本升级到 `0.9.0`
12+
13+
本设计保持项目记忆与 OpenSpec 事实、`source-map.md` 路由、context pack 和团队知识 guardrails 的边界清晰。
14+
15+
---
16+
17+
## 问题背景
18+
19+
仓库已经有 `aisee/memory/` 模板和 hook 感知能力,但 agent 目前没有稳定 CLI 入口来发现、搜索或写入项目记忆。现有 `session-inject.js` 可以提示 memory 文件位置,但不能做任务相关的受控检索;如果 agent 直接读取文件,容易注入过期、无关或过量上下文。
20+
21+
新的模型应让 agent 通过 `aisee memory inspect` 发现 memory 能力,通过 `aisee memory search` 获取少量相关记忆,并且只在用户明确确认后写入记忆。`aisee doctor` 不应变成命令索引;它可以继续保留已有 layout 检查,而 memory 能力发现应归属 `aisee memory`
22+
23+
---
24+
25+
## 需求
26+
27+
- R1. 新增顶层 `aisee memory` 命令组,提供 JSON-first 的 `inspect``list``search``add` 和索引维护能力。
28+
- R2. 项目记忆长期存放在 canonical `aisee/memory/`;legacy `.memory/` 只允许 fallback 读取;新写入必须使用 canonical 路径。
29+
- R3. 支持现有记忆类型 `arch``pref``ctx``stack`,并补齐 status、priority、summary、source refs、updated time 等检索所需 metadata。
30+
- R4. 默认读取必须保持受控:不做全树注入,不默认返回正文,不默认返回 stale/deprecated 条目。
31+
- R5. 写入 memory 必须来自用户明确意图,并在 JSON 中报告 `meta.writes: true`;hooks 永远不能自动写 memory。
32+
- R6. Hook 只能提示 `aisee memory inspect/search` 入口,并可选注入极少量高优先级摘要;不能注入完整 index 或正文。
33+
- R7. `aisee context pack` 只能通过显式 flag 包含项目记忆;不得把 memory 混入 OpenSpec parsed facts。
34+
- R8. 新增 `aisee:memory` skill,指导 agent 何时使用 memory CLI,以及何时把候选生成交回 `aisee:reflect`
35+
- R9. 更新 `aisee:init`、README、架构文档、兼容性策略、workflow 文档、release notes 和 skill taxonomy,说明新的 memory 边界。
36+
- R10. 将 package、CLI、marketplace 和 plugin metadata 版本从 `0.8.0` 升级到 `0.9.0`,因为 `aisee memory` 是新的公开 CLI 面。
37+
38+
---
39+
40+
## 关键技术决策
41+
42+
- KTD1. `aisee memory inspect` 负责 memory 命令发现。`aisee doctor --json` 不新增详细 memory section,只继续通过已有 `aisee.layout` 报告 memory 路径状态。
43+
- KTD2. Project memory 是项目本地指导信息,不是事实源。OpenSpec artifacts、baseline specs、tasks 和 `source-map.md` 与 memory 冲突时优先级更高。
44+
- KTD3. 新 memory 文件采用紧凑 metadata contract。CLI 新写入的 memory 使用 YAML frontmatter + Markdown 正文;解析器对当前模板中的粗体 metadata 格式保持只读兼容。
45+
- KTD4. Search 先读取 index metadata,再按需读取具体文件。默认结果只包含 `id``type``title``summary``path``priority``status``source_refs``updated_at`;正文必须通过 `--include-body` 显式请求。
46+
- KTD5. `add` 命令保持窄接口。它接收 `--type``--title``--summary``--body`、可选 `--priority` 和可重复 `--source-ref`,自动生成安全 slug,并同步更新 `aisee/memory/index.md`
47+
- KTD6. Hooks 保持只读。`SessionStart` 只注入入口提示和最多少量高优先级摘要;`UserPromptSubmit` 可在识别到 memory 写入意图时提示使用 `aisee:memory``aisee:reflect`,但不能改文件。
48+
- KTD7. Context pack memory 必须显式启用。新增 `--project-memory` flag,而不是默认包含;结果放在 `project_memory``guardrails.project_memory` 等独立字段,不放入 `facts.parsed`
49+
- KTD8. 版本目标为 `0.9.0`。根据 `docs/compatibility-policy.md`,新增公开命令组和 JSON contract 属于 minor release。
50+
51+
---
52+
53+
## 高层技术设计
54+
55+
```mermaid
56+
flowchart TB
57+
User["用户 / Agent Prompt"] --> Skill["aisee:memory skill"]
58+
Hook["SessionStart / UserPromptSubmit hooks"] --> Hint["受控 inspect/search 提示"]
59+
Skill --> CLI["aisee memory CLI"]
60+
CLI --> Index["aisee/memory/index.md"]
61+
CLI --> Files["aisee/memory/{arch,pref,ctx,stack}/*.md"]
62+
CLI --> Cache["aisee/cache/memory-index.json"]
63+
CLI --> Results["inspect/list/search JSON"]
64+
CLI --> Add["add 写入 canonical memory"]
65+
Add --> Index
66+
Add --> Files
67+
Context["aisee context pack --project-memory"] --> CLI
68+
Results --> Agent["Agent 使用受控指导"]
69+
Files -. "不是 OpenSpec 事实" .-> Boundary["OpenSpec/source-map/tasks 仍权威"]
70+
```
71+
72+
CLI 必须把 `aisee/cache/memory-index.json` 当作可删除、可重建 cache。长期 memory 事实来源是 canonical `aisee/memory/` 树和 `index.md`
73+
74+
---
75+
76+
## 范围边界
77+
78+
本次包含:
79+
80+
- 新增公开 `aisee memory` 命令组。
81+
- 定义 canonical memory metadata contract 和解析器。
82+
- 实现受控搜索和可选 cache rebuild。
83+
- 更新只读 hook 行为。
84+
- 通过显式 flag 让 context pack 可选包含项目记忆。
85+
- 新增 `aisee:memory` skill 和相关文档 / 测试。
86+
- 升级版本到 `0.9.0`
87+
88+
本次不包含:
89+
90+
- Hook 自动写入 memory。
91+
- 全局用户 memory、home 目录 memory 或跨项目 memory。
92+
- Vector search、semantic rerank、MCP service 或后台 daemon。
93+
- 替代 `aisee:reflect`;reflect 仍负责候选生成和复盘。
94+
- 把 OpenSpec facts、tasks 或 source-map 责任迁移到 memory。
95+
-`aisee doctor --json` 增加详细 memory 命令发现能力。
96+
97+
延后事项:
98+
99+
- 复杂 memory 冲突解决 UI。
100+
- 自动 stale-entry 过期任务。
101+
- 当前 Codex hook target 之外的跨 agent hook 支持。
102+
- 若 lexical search 不够,再考虑可选 semantic search。
103+
104+
---
105+
106+
## 系统影响
107+
108+
本计划新增公开 CLI 面、新公开 skill、hook 输出变化和 package 版本变化。影响 CLI 消费方、marketplace plugin 用户、项目初始化产物和 agent 会话启动上下文。虽然大部分行为是 additive,但仍应按兼容性变更处理。
109+
110+
---
111+
112+
## 实施单元
113+
114+
### U1. Memory 数据模型与解析器
115+
116+
- **目标:** 新增内部 memory 解析器和 metadata 规范化层,供所有 memory 命令复用。
117+
- **需求:** R2、R3、R4。
118+
- **依赖:** 无。
119+
- **文件:** `src/aisee_cli/memory.py``src/aisee_cli/paths.py``tests/test_memory_config.py`
120+
- **方案:** 定义可接受的 type、status、priority、source refs、summary limits,以及 canonical/legacy 路径解析。CLI 新写入文件使用 frontmatter;当前模板里的粗体 metadata 格式保持只读可解析。
121+
- **参考模式:** `src/aisee_cli/knowledge.py` 的 JSON envelope 和 issue handling;`src/aisee_cli/paths.py` 的 canonical/legacy path policy。
122+
- **测试场景:**
123+
- 缺少 `aisee/memory/` 时返回非阻断 missing 状态。
124+
- canonical memory 与 legacy `.memory/` 同时存在时 canonical 优先。
125+
- 只有 legacy `.memory/` 时可读取,但报告为 fallback。
126+
- 非法 type、status、priority 或缺失 summary 产生 issues,不崩溃。
127+
- deprecated 和 stale entries 能被解析,但默认搜索不返回。
128+
- **验证:** Parser 返回稳定 normalized entries 和 issue summary,且不写文件。
129+
130+
### U2. 公开 `aisee memory` 命令组
131+
132+
- **目标:** 暴露 `inspect``list``search``add``update-index` 子命令。
133+
- **需求:** R1、R4、R5。
134+
- **依赖:** U1。
135+
- **文件:** `src/aisee_cli/__main__.py``src/aisee_cli/memory.py``tests/test_memory_cli.py``tests/test_cli_command_surface.py`
136+
- **方案:** 新增顶层 `memory` parser。命令保持最小集:`inspect``list``search``add``update-index`。第一版不增加 `memory doctor``inspect` 负责报告结构问题和使用策略。
137+
- **参考模式:** `knowledge inspect/query/index` 的只读命令形态,以及 `knowledge configure/promote-batch` 的写入 metadata。
138+
- **测试场景:**
139+
- `aisee --help` 包含 `memory`
140+
- `aisee memory --help` 只列出支持的子命令。
141+
- `inspect --json` 返回 root、policy、types、summary、limits 和 next commands。
142+
- `list --json` 支持按 type/status/priority 过滤,并默认只返回 active entries。
143+
- `search --query <text> --json` 只返回受控 metadata。
144+
- `search --include-body --json` 返回有限 body excerpt。
145+
- `add --type pref --title ... --summary ... --body ... --json` 写 canonical 文件并更新 `index.md`
146+
- `add` 拒绝 unsupported type 和 unsafe slug。
147+
- `update-index --json` 重建 `aisee/memory/index.md` 或 cache,并明确 cache 不是事实源。
148+
- **验证:** CLI JSON 可解析;`meta.command` 稳定;读命令报告 `writes: false`;写命令报告 `writes: true`
149+
150+
### U3. 受控搜索、索引与冲突信号
151+
152+
- **目标:** 提供有用但不过量的 memory retrieval。
153+
- **需求:** R4、R6。
154+
- **依赖:** U1、U2。
155+
- **文件:** `src/aisee_cli/memory.py``tests/test_memory_search.py``tests/test_memory_index.py`
156+
- **方案:** 对 title、summary、tags/source refs、type 和可用 body tokens 做 lexical matching。默认 `--limit` 保持较小,并设置硬上限。对同 type/title 或显式 replacement 关系检测冲突,返回 `memory_conflicts`,不要静默选择。
157+
- **参考模式:** `src/aisee_cli/knowledge.py` 中的 `match_cards``tokens_for_card` 和 index cache 处理。
158+
- **测试场景:**
159+
- Search 最多返回默认 limit。
160+
- 对风格 / 流程类 prompt,`pref` entries 可获得更高排序。
161+
- `stack` entries 只在 query 命中工具、依赖、命令或环境提示时出现。
162+
- stale/deprecated entries 只有显式 include flags 时返回。
163+
- 冲突 active entries 通过 `memory_conflicts` 暴露。
164+
- 删除 cache 不影响 search 正确性。
165+
- **验证:** Search 输出稳定、受控,且 cache 标记 `cache_is_fact_source: false`
166+
167+
### U4. 通过 `--project-memory` 显式接入 context pack
168+
169+
- **目标:** 为 change-scoped work 提供可选项目记忆增强,同时不污染 OpenSpec facts。
170+
- **需求:** R7。
171+
- **依赖:** U2、U3。
172+
- **文件:** `src/aisee_cli/__main__.py``src/aisee_cli/context_pack.py``src/aisee_cli/memory.py``plugins/aisee-plugin/references/context-pack-contract.md``tests/test_context_pack.py``tests/test_memory_context_pack.py`
173+
- **方案:** 新增 `aisee context pack --project-memory`,基于 change id、target、artifact paths 和 source-map terms 调用 memory search。结果放到 `project_memory``guardrails.project_memory` 等独立字段;不改变 `facts.parsed``facts.derived`
174+
- **参考模式:** `src/aisee_cli/__main__.py` 中现有 `--knowledge` 路径和 `compact_knowledge_for_context_pack`
175+
- **测试场景:**
176+
- 不带 `--project-memory` 时 context pack 输出不变。
177+
-`--project-memory` 时包含受控 memory matches。
178+
- memory conflicts 作为 guardrail warnings,而不是 blocker facts。
179+
- 缺少 memory 时 pack 不失败,字段为空或省略。
180+
- **验证:** 现有 context pack 测试保持稳定,新字段是 additive。
181+
182+
### U5. Hook 行为更新
183+
184+
- **目标:** 让项目 hooks 可以发现 memory,但避免过量注入。
185+
- **需求:** R4、R6。
186+
- **依赖:** U2、U3。
187+
- **文件:** `plugins/aisee-plugin/skills/aisee-init/scripts/hooks/session-inject.js``plugins/aisee-plugin/skills/aisee-init/scripts/hooks/spec-drift.js``plugins/aisee-plugin/skills/aisee-init/SKILL.md``tests/test_hooks.py` 或新增 `tests/test_memory_hooks.py`
188+
- **方案:** 将当前 memory summary 文案替换为更小的提示:使用 `aisee memory inspect --json``aisee memory search --query "<task>" --json`。可选注入高优先级 title/summary,但必须限制数量和字符长度。`UserPromptSubmit` 可识别“记住 / 以后都 / project memory”等语言并提示使用 `aisee:memory``aisee:reflect`,但不能写文件。
189+
- **参考模式:** 当前 `session-inject.js` 的大小限制和 `spec-drift.js` 的 additionalContext envelope。
190+
- **测试场景:**
191+
- SessionStart 无 memory 时不输出 memory block。
192+
- SessionStart 有 memory 时只输出入口提示和有限高优先级摘要。
193+
- Hook 输出说明 project memory 是 guidance,不是 OpenSpec truth。
194+
- UserPromptSubmit 的 memory-write 信号只产生 guidance。
195+
- Hook 永远不调用写入命令。
196+
- **验证:** Hook scripts 仍是合法 Node 程序,并输出受控 JSON hook payload。
197+
198+
### U6. `aisee:memory` skill 与 reflect/init 更新
199+
200+
- **目标:** 教 agent 如何使用 memory 命令,以及何时路由到 reflect。
201+
- **需求:** R8、R9。
202+
- **依赖:** U2。
203+
- **文件:** `plugins/aisee-plugin/skills/aisee-memory/SKILL.md``plugins/aisee-plugin/skills/aisee-memory/references/workflow.md``plugins/aisee-plugin/skills/aisee-memory/evals/evals.json``plugins/aisee-plugin/references/skill-taxonomy.md``plugins/aisee-plugin/skills/aisee-reflect/SKILL.md``plugins/aisee-plugin/skills/aisee-reflect/references/output-templates.md``plugins/aisee-plugin/skills/aisee-init/assets/memory-rules-template.md``plugins/aisee-plugin/skills/aisee-init/assets/memory-index-template.md``tests/test_skill_cli_preflight.py``tests/test_skill_eval_schema.py`
204+
- **方案:** 新增聚焦 skill,触发词覆盖“项目记忆 / aisee memory / 记住这个 / 查询记忆”。`SKILL.md` 保持精简,命令细节放到 references。更新 reflect,让候选生成仍归 reflect,但确认提升到 memory 时优先通过 `aisee memory add`,而不是手工改文件。
205+
- **参考模式:** `plugins/aisee-plugin/skills/aisee-knowledge/SKILL.md` 及其 eval 结构。
206+
- **测试场景:**
207+
- 新公开 skill 出现在 taxonomy。
208+
- 所有公开 skill 仍有 eval 覆盖。
209+
- Reflect 文档提到 confirmed memory writes 应使用 `aisee memory add`
210+
- Init 模板与 CLI metadata contract 对齐。
211+
- **验证:** Skill contract 测试通过,README 能发现新 skill。
212+
213+
### U7. 文档与兼容性更新
214+
215+
- **目标:** 文档化 memory 边界和发现路径,同时不扩展 doctor 职责。
216+
- **需求:** R8、R9。
217+
- **依赖:** U2、U4、U5、U6。
218+
- **文件:** `README.md``docs/workflow.md``docs/workflow.en.md``docs/best-practices.md``docs/best-practices.en.md``docs/compatibility-policy.md``docs/compatibility-policy.en.md``docs/architecture/aisee-cli-context-and-id-registry.md``docs/release.md``plugins/aisee-plugin/.codex-plugin/plugin.json`
219+
- **方案:** 新增 “Project Memory / 项目记忆” 小节,明确 `aisee memory inspect/search` 是发现路径,hooks 只读,`aisee doctor` 不是 memory 命令索引,OpenSpec 仍权威。更新 CLI context architecture 文档,把 project memory 作为第五个受控 CLI 职责。
220+
- **参考模式:** Team knowledge 文档和 compatibility policy 对 public/experimental contract 的写法。
221+
- **测试场景:**
222+
- grep 或现有 docs tests 确认 README 提到 `aisee:memory`
223+
- Compatibility policy 把 `aisee memory` 分类为 public CLI JSON contract。
224+
- Release notes 提到新命令组和版本升级。
225+
- **验证:** 文档只引用 U2 中真实存在的命令。
226+
227+
### U8. 版本升级与 release smoke
228+
229+
- **目标:** 将 CLI / PyPI package metadata 升级到 `0.9.0` 并验证发布打包。
230+
- **需求:** R10。
231+
- **依赖:** U1 至 U7。
232+
- **文件:** `pyproject.toml``src/aisee_cli/__init__.py``.agents/plugins/marketplace.json``plugins/aisee-plugin/.codex-plugin/plugin.json``plugins/aisee-plugin/.claude-plugin/plugin.json``plugins/aisee-plugin/.cursor-plugin/plugin.json``docs/release.md``tests/test_version_consistency.py`
233+
- **方案:**`pyproject.toml` 改为 `0.9.0`,运行或等价执行 `scripts/sync_versions.py`,保持 metadata 一致。Release smoke 需要验证 installed wheel command surface 包含 `memory`
234+
- **参考模式:** `scripts/check_versions.py``scripts/sync_versions.py``scripts/smoke_release.py`
235+
- **测试场景:**
236+
- `scripts/check_versions.py` 报告所有版本都是 `0.9.0`
237+
- Installed wheel 输出 `aisee 0.9.0`
238+
- Release smoke 确认 `aisee memory inspect --json` 在 CLI-only 安装下可用。
239+
- 顶层 `aisee --help` 包含 `memory`
240+
- **验证:** 发布前全量测试和 release smoke 通过。
241+
242+
---
243+
244+
## 验收示例
245+
246+
- AE1. 给定项目没有 memory 文件,当 agent 运行 `aisee memory inspect --json`,响应是合法 JSON,状态为 missing,包含 canonical paths,且没有 blocker。
247+
- AE2. 给定项目有一条高优先级 `pref` memory,当运行 `aisee memory search --query "commit message style" --json`,匹配项以 summary metadata 返回,默认不带正文。
248+
- AE3. 给定用户说“以后本项目提交信息都用中文”,当 agent 使用 `aisee:memory`,它会确认写入意图,并通过 `aisee memory add` 写入,而不是由 hook 自动写入。
249+
- AE4. 给定 context pack 请求不带 `--project-memory`,命令输出不包含 memory 字段,现有 context pack JSON 保持兼容。
250+
- AE5. 给定 context pack 请求带 `--project-memory`,且存在匹配 memory,则受控 memory matches 与 OpenSpec facts 分离输出。
251+
252+
---
253+
254+
## 风险与依赖
255+
256+
- **上下文膨胀风险:** Hooks 和 context pack 集成可能注入过多 memory。缓解:默认只提示入口、小 limit、metadata-only 输出、正文显式 opt-in。
257+
- **事实源混淆风险:** Agent 可能把 memory 当 spec truth。缓解:所有 JSON/meta/hook/doc 都标记 project memory 是 guidance,且被 OpenSpec 覆盖。
258+
- **写入污染风险:** Agent 可能滥用 `add`。缓解:写命令要求用户明确意图,`aisee:reflect` 仍是候选生成入口。
259+
- **Legacy 兼容风险:** 现有 memory 模板不是 frontmatter。缓解:parser 对当前模板保持只读兼容,CLI 新写入使用 canonical 格式。
260+
- **公开契约漂移风险:** 新增命令组影响 release 行为。缓解:命令面测试、兼容性文档和版本升级到 `0.9.0`
261+
262+
---
263+
264+
## 文档 / 运维说明
265+
266+
Release 应把 project memory 表达为轻量项目本地上下文能力,而不是数据库或 agent runtime memory 替代品。README 示例聚焦:
267+
268+
- `aisee memory inspect --json`
269+
- `aisee memory search --query "<task>" --json`
270+
- `aisee memory add --type pref --title "<title>" --summary "<summary>" --body "<body>" --json`
271+
- `aisee context pack --change <change> --for ce-work --project-memory --json`
272+
273+
文档应避免鼓励 agent 直接读取 `aisee/memory/**/*.md`;只有当 CLI 返回具体 `path` 后,才按需读取对应文件。
274+
275+
---
276+
277+
## 来源与研究
278+
279+
- `src/aisee_cli/__main__.py`:当前顶层 CLI parser 和 `context pack --knowledge` 集成模式。
280+
- `src/aisee_cli/knowledge.py`:JSON envelope、受控 retrieval、cache 非事实源、写命令和 index 模式。
281+
- `src/aisee_cli/paths.py`:canonical `aisee/` 和 legacy `.memory/` 路径处理。
282+
- `plugins/aisee-plugin/skills/aisee-init/assets/memory-rules-template.md`:现有项目记忆目录模型。
283+
- `plugins/aisee-plugin/skills/aisee-init/scripts/hooks/session-inject.js`:当前会话启动 memory 摘要 hook。
284+
- `plugins/aisee-plugin/skills/aisee-reflect/SKILL.md`:现有 memory candidate 和 confirmed-write workflow。
285+
- `docs/compatibility-policy.md`:公开 CLI JSON 和版本规则。
286+
- `docs/architecture/aisee-team-knowledge.md`:可轻量复用的受控 retrieval 和 cache 边界模式。

0 commit comments

Comments
 (0)