refactor(vault): rename metadata and session directories for consistency

- Change reme_metadata to metadata in application config and fixtures
- Change reme_session to session in application config and fixtures
- Update all documentation references from reme_metadata to metadata
- Update all documentation references from reme_session to session
- Fix integration tests to use new directory names
- Update SVG diagrams to reflect new directory naming convention
- Adjust cleanup logic in vault fixture to use updated directory names
This commit is contained in:
jinli.yl 2026-06-22 14:19:12 +08:00
parent 9f7479d4b8
commit 4fbec46a1b
14 changed files with 37 additions and 37 deletions

View file

@ -115,15 +115,15 @@ QwenPaw 2.0 将集成新版 ReMe;后续也会推出 Claude Code plugin,进
> Memory as File, File as Memory.
ReMe 将**记忆视为文件**,让原始对话和外部资料从 `reme_session/`、`resource/` 渐进加工到 `daily/`,再沉淀为 `digest/`
ReMe 将**记忆视为文件**,让原始对话和外部资料从 `session/`、`resource/` 渐进加工到 `daily/`,再沉淀为 `digest/`
中可长期复用的知识节点。
### 目录结构
```text
<vault_dir>/
├── reme_metadata/ # 系统索引、图谱、catalog 等持久状态
├── reme_session/ # 原始对话和 Agent session
├── metadata/ # 系统索引、图谱、catalog 等持久状态
├── session/ # 原始对话和 Agent session
│ ├── dialog/
│ │ └── <session_id>.jsonl
│ ├── agentscope/

View file

@ -78,7 +78,7 @@
<rect class="panel" x="126" y="502" width="948" height="82"/>
<text class="note" x="176" y="532">Conversation source</text>
<text class="chip-text" x="176" y="554">reme_session/dialog/&lt;session_id&gt;.jsonl</text>
<text class="chip-text" x="176" y="554">session/dialog/&lt;session_id&gt;.jsonl</text>
<line class="line" x1="454" y1="518" x2="454" y2="566"/>
<text class="chip-title" x="498" y="532">Resource source</text>
<text class="chip-text" x="498" y="554">resource/&lt;date&gt;/&lt;resource_file&gt;</text>

Before

Width:  |  Height:  |  Size: 6.2 KiB

After

Width:  |  Height:  |  Size: 6.2 KiB

View file

@ -67,7 +67,7 @@
<text class="section-title" x="116" y="438">Raw input</text>
<text class="section-subtitle" x="82" y="468">keep the original scene</text>
<rect class="chip" x="82" y="494" width="168" height="28"/>
<text class="chip-text" x="166" y="513" text-anchor="middle">reme_session/ + resource/</text>
<text class="chip-text" x="166" y="513" text-anchor="middle">session/ + resource/</text>
<rect class="panel" x="326" y="398" width="224" height="144"/>
<circle class="badge" cx="360" cy="432" r="15"/>

Before

Width:  |  Height:  |  Size: 7 KiB

After

Width:  |  Height:  |  Size: 7 KiB

View file

@ -158,7 +158,7 @@
<text class="label" x="10" y="30" text-anchor="middle">.json</text>
<line class="ink thin" x1="26" y1="28" x2="50" y2="28"/>
<line class="ink thin" x1="22" y1="42" x2="52" y2="42"/>
<text class="label" x="106" y="19">reme_session/</text>
<text class="label" x="106" y="19">session/</text>
<text class="tiny" x="106" y="39">raw session logs</text>
</g>

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

View file

@ -71,7 +71,7 @@ daily/<date>/**/*.md
| `digest/personal/*.md` | 用户、团队、项目相关的偏好、事实、长期上下文。 |
| `digest/wiki/*.md` | 通用知识、概念、观察、决策先例。 |
| `daily/<date>/interests.yaml` | 当天值得上层 Agent 主动关注的兴趣主题。 |
| `reme_metadata/file_catalog/dream*` | dream 专用 catalog,用于判断 daily 输入是否变化。 |
| `metadata/file_catalog/dream*` | dream 专用 catalog,用于判断 daily 输入是否变化。 |
## 四个阶段

View file

@ -7,13 +7,13 @@ Auto Memory 是 ReMe 的对话记忆入口:每段对话先按 `session_id` 沉
<img src="../figure/auto-memory-resource.svg" alt="ReMe Auto Memory 与 Auto Resource 写入 daily 记忆卡片的流程" width="92%">
</p>
关于 `daily/`、`reme_session/`、frontmatter 和 wikilink 的通用文件语义,见 [Memory as File](./memory_as_file.md)。
关于 `daily/`、`session/`、frontmatter 和 wikilink 的通用文件语义,见 [Memory as File](./memory_as_file.md)。
```text
Conversation
├─ step 1: daily/YYYY-MM-DD/<session_id>.md # 每段对话先成卡片
├─ step 2: daily/YYYY-MM-DD.md # 当天索引再串起来
└─ source: reme_session/dialog/<session_id>.jsonl # 原始对话
└─ source: session/dialog/<session_id>.jsonl # 原始对话
```
## 它记录什么
@ -60,7 +60,7 @@ daily/2026-06-20/session-a.md
Auto Memory 在生成记忆卡片的同时,也会保存原始会话:
```text
reme_session/
session/
dialog/
session-a.jsonl
session-b.jsonl

View file

@ -22,7 +22,7 @@ flowchart LR
Jobs --> Steps["Steps<br/>reme/steps/**"]
Steps --> Ctx["RuntimeContext<br/>data + Response + stream queue"]
Steps --> Components["Components<br/>store / graph / index / llm / agent / catalog"]
Components --> Vault["Vault<br/>daily / digest / resource / reme_metadata"]
Components --> Vault["Vault<br/>daily / digest / resource / metadata"]
```
核心分层:
@ -75,8 +75,8 @@ reme/
```text
<vault_dir>/
reme_metadata/ # file_store、file_graph、keyword_index、file_catalog 等持久状态
reme_session/ # Agent session 与原始对话
metadata/ # file_store、file_graph、keyword_index、file_catalog 等持久状态
session/ # Agent session 与原始对话
resource/ # 外部资源
daily/ # 浅加工记忆
digest/ # 长期 digest 记忆

View file

@ -34,15 +34,15 @@ ReMe 把记忆设计成文件,不只是为了“方便存储”,而是为了
ReMe 的 vault 把记忆分成四层:
```text
raw input -> reme_session/ + resource/
raw input -> session/ + resource/
working memory -> daily/
long memory -> digest/
system state -> reme_metadata/
system state -> metadata/
```
这四层解决的是不同问题。
`reme_session/` 和 `resource/` 保存原始输入。它们强调“不要丢现场”:对话、Agent session、上传资料、网页或报告先原样留下,作为以后核对的证据。
`session/` 和 `resource/` 保存原始输入。它们强调“不要丢现场”:对话、Agent session、上传资料、网页或报告先原样留下,作为以后核对的证据。
`daily/` 是浅加工层。它把当天发生的对话和资源整理成更适合阅读的 daily note:什么事情发生了、有哪些结论、留下了哪些后续任务、对应原文在哪里。
daily 不追求最终抽象,它更像当天工作台。
@ -50,14 +50,14 @@ daily 不追求最终抽象,它更像当天工作台。
`digest/` 是深加工层。这里保存的是可以长期复用的记忆节点,例如用户偏好、项目背景、流程经验、概念知识、决策先例。digest
不应该只是复制 daily,而应该把多次出现的事实、方法和关系合并成更稳定的表述。
`reme_metadata/` 是系统索引层。它保存 file catalog、chunk 索引、图谱快照等运行状态。用户通常不需要手写这里的内容;真正的人工编辑入口是
`metadata/` 是系统索引层。它保存 file catalog、chunk 索引、图谱快照等运行状态。用户通常不需要手写这里的内容;真正的人工编辑入口是
`daily/`、`digest/` 和必要时的 `resource/`。
这个分层让 ReMe 可以同时保留“现场”和“抽象”:daily 负责还原当时发生了什么,digest 负责回答以后还能复用什么。
## 目录结构
ReMe 用目录表达记忆组织和记忆分层。原始材料先进入 `resource/` 或 `reme_session/`,再沉淀到 `daily/`,最后由 `auto_dream`
ReMe 用目录表达记忆组织和记忆分层。原始材料先进入 `resource/` 或 `session/`,再沉淀到 `daily/`,最后由 `auto_dream`
整合到 `digest/`。
对应的自动流程分别是 [Auto Memory](./auto_memory.md)、[Auto Resource](./auto_resource.md) 和 [Auto Dream](./auto_dream.md)。
@ -65,8 +65,8 @@ ReMe 用目录表达记忆组织和记忆分层。原始材料先进入 `resourc
```text
<vault_dir>/
├── reme_metadata/ # 系统索引层;ReMe 索引、图谱、catalog 等持久状态,不作为人工编辑入口
├── reme_session/ # 原始输入层;原始对话和 Agent session
├── metadata/ # 系统索引层;ReMe 索引、图谱、catalog 等持久状态,不作为人工编辑入口
├── session/ # 原始输入层;原始对话和 Agent session
│ ├── dialog/
│ │ └── <session_id>.jsonl # auto_memory 保存的对话消息
│ ├── agentscope/
@ -95,7 +95,7 @@ ReMe 用目录表达记忆组织和记忆分层。原始材料先进入 `resourc
```text
对话
-> reme_session/dialog/<session_id>.jsonl
-> session/dialog/<session_id>.jsonl
-> daily/YYYY-MM-DD/<session_id>.md
-> digest/personal | digest/procedure | digest/wiki
@ -137,7 +137,7 @@ Frontmatter 是文件开头的 YAML 块,用 `---` 包住:
---
name: 文档名
description: 文档描述
source_conversation: [[reme_session/dialog/abc.jsonl]]
source_conversation: [[session/dialog/abc.jsonl]]
---
```

View file

@ -58,7 +58,7 @@ index_update_loop:
2. 把文件解析成一个 `FileNode` 和多个 `FileChunk`。
3. 对新增或修改的文件,先删除旧 chunk,再 upsert 新 chunk。
4. 对删除的文件,从 `file_store`、`keyword_index` 和 `file_graph` 清掉对应记录。
5. 有变化时 dump 到 `reme_metadata/`,让下次启动可以恢复。
5. 有变化时 dump 到 `metadata/`,让下次启动可以恢复。
Markdown chunker 会解析 YAML frontmatter、标题结构和 `[[...]]`,产出 `FileNode`、`FileChunk` 和 `FileLink`。更细的分块规则见
[Memory as File](./memory_as_file.md#memory-chunking)。

View file

@ -65,8 +65,8 @@ reme list
```text
.reme/
├── reme_metadata/ # 索引、图谱、catalog 等持久状态
├── reme_session/ # Agent session 与原始对话
├── metadata/ # 索引、图谱、catalog 等持久状态
├── session/ # Agent session 与原始对话
├── resource/ # 外部资料
├── daily/ # daily note
└── digest/ # 长期记忆

View file

@ -29,8 +29,8 @@ class ApplicationConfig(BaseModel):
app_name: str = Field(default=os.getenv("APP_NAME", "ReMe"), description="Application display name")
vault_dir: str = Field(default=".reme", description="Vault root directory for runtime files")
metadata_dir: str = Field(default="reme_metadata", description="Subdirectory for ReMe persistent state")
session_dir: str = Field(default="reme_session", description="Subdirectory for persisted agent sessions")
metadata_dir: str = Field(default="metadata", description="Subdirectory for ReMe persistent state")
session_dir: str = Field(default="session", description="Subdirectory for persisted agent sessions")
resource_dir: str = Field(default="resource", description="Subdirectory for external assets")
daily_dir: str = Field(default="daily", description="Subdirectory for daily memory")
digest_dir: str = Field(default="digest", description="Subdirectory for digest memory")

View file

@ -253,7 +253,7 @@ Redis key `auth:jwks:current_kid` 保存当前活跃 kid;Auth Service
""",
}
_CLEAN_DIRS = ("daily", "digest", "resource", "reme_metadata")
_CLEAN_DIRS = ("daily", "digest", "resource", "metadata")
# ─────────────────────────────────────────────────────────────────────────────
@ -418,7 +418,7 @@ class VaultEnv:
def clean(self) -> list[str]:
"""Remove fixture-managed subdirs (``daily/``, ``digest/``, ``resource/``,
``reme_metadata/``) under the vault so the next seed starts clean.
``metadata/``) under the vault so the next seed starts clean.
Returns relative paths that were actually removed."""
removed: list[str] = []
for rel in _CLEAN_DIRS:

View file

@ -61,7 +61,7 @@ def _copy_outputs(env, message_files: list[Path]) -> list[Path]:
for path in message_files:
if dst := _copy_artifact(path, "messages"):
copied.append(dst)
for root in ("daily", "digest", "reme_metadata", "reme_session", "agent_logs"):
for root in ("daily", "digest", "metadata", "session", "agent_logs"):
if dst := _copy_artifact(env.vault_dir / root, root):
copied.append(dst)
return copied
@ -83,9 +83,9 @@ def _all_digest_text(env) -> str:
def _file_graph_links(env) -> dict[str, list[dict]]:
"""Map ``path -> links`` from every ``reme_metadata/file_graph/*.jsonl``."""
"""Map ``path -> links`` from every ``metadata/file_graph/*.jsonl``."""
out: dict[str, list[dict]] = {}
graph_dir = env.vault_dir / "reme_metadata" / "file_graph"
graph_dir = env.vault_dir / "metadata" / "file_graph"
if not graph_dir.is_dir():
return out
for graph_path in sorted(graph_dir.glob("*.jsonl")):
@ -123,7 +123,7 @@ def test_auto_dream_and_proactive():
topic_diversity_days=7,
)
dumped = await recorder.dump()
session_jsonl = sorted((env.vault_dir / "reme_session" / "agentscope").glob("*.jsonl"))
session_jsonl = sorted((env.vault_dir / "session" / "agentscope").glob("*.jsonl"))
message_files = [*dumped, *session_jsonl]
_print_message_files(message_files)
@ -138,7 +138,7 @@ def test_auto_dream_and_proactive():
day_index = env.vault_dir / "daily" / f"{DREAM_DATE}.md"
changed_note = env.vault_dir / DREAM_INPUT_PATH
interests = env.vault_dir / "daily" / DREAM_DATE / "interests.yaml"
catalog = env.vault_dir / "reme_metadata" / "file_catalog" / "dream.jsonl"
catalog = env.vault_dir / "metadata" / "file_catalog" / "dream.jsonl"
assert changed_note.is_file(), f"changed note missing: {changed_note}"
assert interests.is_file(), f"interests.yaml missing: {interests}"
assert catalog.is_file(), f"dream catalog missing: {catalog}"

View file

@ -114,7 +114,7 @@ def test_auto_resource_create():
file_path = env.place_resource(RESOURCE_FILENAME, RESOURCE_CONTENT_V1)
note_stem = _compute_note_stem(RESOURCE_FILENAME)
agent_session_id = _compute_agent_session_id(file_path)
expected_session_jsonl = env.vault_dir / "reme_session" / "agentscope" / f"{agent_session_id}.jsonl"
expected_session_jsonl = env.vault_dir / "session" / "agentscope" / f"{agent_session_id}.jsonl"
print(f"[CREATE] file_path = {file_path}")
print(f"[CREATE] note_stem = {note_stem}")
@ -142,7 +142,7 @@ def test_auto_resource_create():
assert expected_session_jsonl.is_file(), (
f"agent session not persisted at {expected_session_jsonl}; "
f"AgentScope files: "
f"{[p.name for p in (env.vault_dir / 'reme_session' / 'agentscope').glob('*.jsonl')]}"
f"{[p.name for p in (env.vault_dir / 'session' / 'agentscope').glob('*.jsonl')]}"
)
note_text = _print_text_file("CREATE result.md", note_path)
@ -198,7 +198,7 @@ def test_auto_resource_update():
file_path = env.place_resource(RESOURCE_FILENAME, RESOURCE_CONTENT_V1)
note_stem = _compute_note_stem(RESOURCE_FILENAME)
agent_session_id = _compute_agent_session_id(file_path)
session_jsonl = env.vault_dir / "reme_session" / "agentscope" / f"{agent_session_id}.jsonl"
session_jsonl = env.vault_dir / "session" / "agentscope" / f"{agent_session_id}.jsonl"
response = await app.run_job("auto_resource", changes=[{"path": file_path, "change": "added"}])
assert response.success is True, f"Initial create failed: {response.answer!r}"