aivectormemory 0.1.0__tar.gz
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.
- aivectormemory-0.1.0/.claude/settings.local.json +13 -0
- aivectormemory-0.1.0/.gitignore +26 -0
- aivectormemory-0.1.0/.kiro/hooks/dev-workflow-check.kiro.hook +14 -0
- aivectormemory-0.1.0/.kiro/memory-mcp-server/.config.kiro +1 -0
- aivectormemory-0.1.0/.kiro/memory-mcp-server/design.md +208 -0
- aivectormemory-0.1.0/.kiro/memory-mcp-server/requirements.md +334 -0
- aivectormemory-0.1.0/.kiro/memory-mcp-server/tasks.md +66 -0
- aivectormemory-0.1.0/.kiro/settings/mcp.json +55 -0
- aivectormemory-0.1.0/.kiro/steering/dev-rules.md +261 -0
- aivectormemory-0.1.0/.kiro/steering/start.md +0 -0
- aivectormemory-0.1.0/.kiro/steering/ui-ux-pro-max.md +231 -0
- aivectormemory-0.1.0/.mcp.json +16 -0
- aivectormemory-0.1.0/.shared/ui-ux-pro-max/data/charts.csv +26 -0
- aivectormemory-0.1.0/.shared/ui-ux-pro-max/data/colors.csv +97 -0
- aivectormemory-0.1.0/.shared/ui-ux-pro-max/data/icons.csv +101 -0
- aivectormemory-0.1.0/.shared/ui-ux-pro-max/data/landing.csv +31 -0
- aivectormemory-0.1.0/.shared/ui-ux-pro-max/data/products.csv +97 -0
- aivectormemory-0.1.0/.shared/ui-ux-pro-max/data/prompts.csv +24 -0
- aivectormemory-0.1.0/.shared/ui-ux-pro-max/data/stacks/flutter.csv +53 -0
- aivectormemory-0.1.0/.shared/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -0
- aivectormemory-0.1.0/.shared/ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
- aivectormemory-0.1.0/.shared/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -0
- aivectormemory-0.1.0/.shared/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -0
- aivectormemory-0.1.0/.shared/ui-ux-pro-max/data/stacks/react-native.csv +52 -0
- aivectormemory-0.1.0/.shared/ui-ux-pro-max/data/stacks/react.csv +54 -0
- aivectormemory-0.1.0/.shared/ui-ux-pro-max/data/stacks/shadcn.csv +61 -0
- aivectormemory-0.1.0/.shared/ui-ux-pro-max/data/stacks/svelte.csv +54 -0
- aivectormemory-0.1.0/.shared/ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
- aivectormemory-0.1.0/.shared/ui-ux-pro-max/data/stacks/vue.csv +50 -0
- aivectormemory-0.1.0/.shared/ui-ux-pro-max/data/styles.csv +59 -0
- aivectormemory-0.1.0/.shared/ui-ux-pro-max/data/typography.csv +58 -0
- aivectormemory-0.1.0/.shared/ui-ux-pro-max/data/ux-guidelines.csv +100 -0
- aivectormemory-0.1.0/.shared/ui-ux-pro-max/scripts/core.py +245 -0
- aivectormemory-0.1.0/.shared/ui-ux-pro-max/scripts/search.py +61 -0
- aivectormemory-0.1.0/CLAUDE.md +153 -0
- aivectormemory-0.1.0/CLAUDE.md.bak +205 -0
- aivectormemory-0.1.0/PKG-INFO +161 -0
- aivectormemory-0.1.0/README.md +136 -0
- aivectormemory-0.1.0/devmemory/__init__.py +3 -0
- aivectormemory-0.1.0/devmemory/__main__.py +33 -0
- aivectormemory-0.1.0/devmemory/config.py +18 -0
- aivectormemory-0.1.0/devmemory/db/__init__.py +7 -0
- aivectormemory-0.1.0/devmemory/db/connection.py +35 -0
- aivectormemory-0.1.0/devmemory/db/issue_repo.py +80 -0
- aivectormemory-0.1.0/devmemory/db/memory_repo.py +133 -0
- aivectormemory-0.1.0/devmemory/db/schema.py +96 -0
- aivectormemory-0.1.0/devmemory/db/state_repo.py +54 -0
- aivectormemory-0.1.0/devmemory/embedding/__init__.py +3 -0
- aivectormemory-0.1.0/devmemory/embedding/engine.py +84 -0
- aivectormemory-0.1.0/devmemory/errors.py +11 -0
- aivectormemory-0.1.0/devmemory/install.py +114 -0
- aivectormemory-0.1.0/devmemory/protocol.py +34 -0
- aivectormemory-0.1.0/devmemory/server.py +88 -0
- aivectormemory-0.1.0/devmemory/tools/__init__.py +123 -0
- aivectormemory-0.1.0/devmemory/tools/auto_save.py +31 -0
- aivectormemory-0.1.0/devmemory/tools/digest.py +29 -0
- aivectormemory-0.1.0/devmemory/tools/forget.py +17 -0
- aivectormemory-0.1.0/devmemory/tools/recall.py +37 -0
- aivectormemory-0.1.0/devmemory/tools/remember.py +24 -0
- aivectormemory-0.1.0/devmemory/tools/status.py +17 -0
- aivectormemory-0.1.0/devmemory/tools/track.py +56 -0
- aivectormemory-0.1.0/devmemory/web/__init__.py +0 -0
- aivectormemory-0.1.0/devmemory/web/api.py +184 -0
- aivectormemory-0.1.0/devmemory/web/app.py +79 -0
- aivectormemory-0.1.0/devmemory/web/static/app.js +520 -0
- aivectormemory-0.1.0/devmemory/web/static/index.html +137 -0
- aivectormemory-0.1.0/devmemory/web/static/style.css +244 -0
- aivectormemory-0.1.0/edit-modal.png +0 -0
- aivectormemory-0.1.0/pyproject.toml +43 -0
- aivectormemory-0.1.0/tests/html-designs/devmemory-dashboard.css +613 -0
- aivectormemory-0.1.0/tests/html-designs/devmemory-dashboard.html +387 -0
- aivectormemory-0.1.0/tests/test_db.py +239 -0
- aivectormemory-0.1.0/tests/test_protocol.py +92 -0
- aivectormemory-0.1.0/tests/test_tools_integration.py +213 -0
- aivectormemory-0.1.0/vector-network-3d.png +0 -0
- aivectormemory-0.1.0/vector-network-new.png +0 -0
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"permissions": {
|
|
3
|
+
"allow": [
|
|
4
|
+
"Bash(/Users/macos/item/run-memory-mcp-server/.venv/bin/python -c:*)",
|
|
5
|
+
"mcp__devmemory__recall",
|
|
6
|
+
"mcp__devmemory__status",
|
|
7
|
+
"mcp__devmemory__remember",
|
|
8
|
+
"mcp__devmemory__track",
|
|
9
|
+
"Bash(/Users/macos/item/run-memory-mcp-server/.venv/bin/python -m devmemory web:*)",
|
|
10
|
+
"Bash(.venv/bin/python -m devmemory web:*)"
|
|
11
|
+
]
|
|
12
|
+
}
|
|
13
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# Python
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*.egg-info/
|
|
5
|
+
dist/
|
|
6
|
+
build/
|
|
7
|
+
*.egg
|
|
8
|
+
|
|
9
|
+
# Virtual environment
|
|
10
|
+
.venv/
|
|
11
|
+
|
|
12
|
+
# DevMemory data
|
|
13
|
+
.devmemory/
|
|
14
|
+
|
|
15
|
+
# IDE
|
|
16
|
+
.vscode/
|
|
17
|
+
.idea/
|
|
18
|
+
|
|
19
|
+
# OS
|
|
20
|
+
.DS_Store
|
|
21
|
+
Thumbs.db
|
|
22
|
+
|
|
23
|
+
# Test
|
|
24
|
+
.pytest_cache/
|
|
25
|
+
htmlcov/
|
|
26
|
+
.coverage
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"enabled": true,
|
|
3
|
+
"name": "开发流程检查",
|
|
4
|
+
"description": "每次收到用户消息时,检查核心原则、问题处理原则、自测要求",
|
|
5
|
+
"version": "1",
|
|
6
|
+
"when": {
|
|
7
|
+
"type": "promptSubmit"
|
|
8
|
+
},
|
|
9
|
+
"then": {
|
|
10
|
+
"type": "askAgent",
|
|
11
|
+
"prompt": "## ⚠️ IDENTITY & TONE\n\n- Role:你是首席工程师兼高级数据科学家\n- Voice:Professional,Concise,Result-Oriented.No\"I hope this helps\"\n- Authority: The user is the Lead Architect. Execute explicit commands immediately (not questions).\n\n---\n\n##⚠️ 收到用户消息后,严谨认真理解用户消息的意思然后判断消息类型,询问仅限闲聊,进度、讨论规则、简单确认不记录问题文档,其他所有情况必须需要记录问题文档,然后告诉用户方案,等用户确认后再执行\n\n**⚠️ 回复时用自然语言说明判断结果**,例如:\n- \"这是个询问,直接回答\"\n- \"这是个问题,方案如下...\"\n- \"这个问题需要记录\"\n\n---\n\n## ⚠️ 核心原则\n\n1. **任何操作前必须验证,不能假设,不能靠记忆**。\n2. **遇到需要处理的问题时禁止盲目测试,必须查看问题对应的代码文件,必须找到问题的根本原因,必须与实际错误对应**。\n3. **禁止口头承诺,口头答应,一切以测试通过为准**。\n4. **任何文件修改前必须查看代码强制严谨思考**。\n5. **开发、自测过程中禁止让用户手动操作,能自己执行的不要让用户做**。\n\n---\n\n## ⚠️ IDE 卡死防范\n\n- **禁止** `$(...)` + 管道组合\n- **禁止** MySQL `-e` 执行多条语句\n- **正确做法**:SQL 写入 `.sql` 文件用 `< data/xxx.sql` 执行\n\n## ⚠️ 自测要求\n\n**禁止让用户手动操作** - 能自己执行的,不要让用户做\n\n- Python:`python -m pytest` 或直接运行脚本验证\n- MCP Server:通过 stdio 发送 JSON-RPC 消息验证\n- Web 看板:Playwright 验证\n- 自测通过后才能说\"等待验证\""
|
|
12
|
+
},
|
|
13
|
+
"shortName": "dev-workflow-check"
|
|
14
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"generationMode": "requirements-first"}
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
# 设计文档:DevMemory MCP Server
|
|
2
|
+
|
|
3
|
+
## 项目结构
|
|
4
|
+
|
|
5
|
+
```
|
|
6
|
+
devmemory/
|
|
7
|
+
├── __init__.py
|
|
8
|
+
├── __main__.py # 入口:python -m devmemory
|
|
9
|
+
├── server.py # MCP 协议层(JSON-RPC over stdio)
|
|
10
|
+
├── protocol.py # JSON-RPC 消息解析与响应构建
|
|
11
|
+
├── tools/
|
|
12
|
+
│ ├── __init__.py
|
|
13
|
+
│ ├── remember.py # 记忆存入
|
|
14
|
+
│ ├── recall.py # 记忆回忆
|
|
15
|
+
│ ├── forget.py # 记忆删除
|
|
16
|
+
│ ├── status.py # 会话状态
|
|
17
|
+
│ ├── track.py # 问题跟踪
|
|
18
|
+
│ └── digest.py # 记忆整理
|
|
19
|
+
├── db/
|
|
20
|
+
│ ├── __init__.py
|
|
21
|
+
│ ├── connection.py # SQLite 连接管理(WAL 模式、sqlite-vec 加载)
|
|
22
|
+
│ ├── schema.py # 建表语句
|
|
23
|
+
│ ├── memory_repo.py # memories + vec_memories 读写
|
|
24
|
+
│ ├── state_repo.py # session_state 读写
|
|
25
|
+
│ └── issue_repo.py # issues 读写
|
|
26
|
+
├── embedding/
|
|
27
|
+
│ ├── __init__.py
|
|
28
|
+
│ └── engine.py # ONNX Runtime 推理(tokenize → 推理 → pooling → 归一化)
|
|
29
|
+
├── web/
|
|
30
|
+
│ ├── __init__.py
|
|
31
|
+
│ ├── app.py # HTTP 服务(Python 标准库 http.server)
|
|
32
|
+
│ ├── api.py # REST API 路由
|
|
33
|
+
│ └── static/
|
|
34
|
+
│ ├── index.html # 单页应用
|
|
35
|
+
│ ├── style.css
|
|
36
|
+
│ └── app.js
|
|
37
|
+
├── config.py # 配置:路径、默认值、模型名
|
|
38
|
+
└── errors.py # 统一错误格式
|
|
39
|
+
pyproject.toml # 包配置、依赖、入口点
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## 架构设计
|
|
43
|
+
|
|
44
|
+
### 分层架构
|
|
45
|
+
|
|
46
|
+
```
|
|
47
|
+
┌─────────────────────────────────┐
|
|
48
|
+
│ MCP 协议层(server.py) │ stdin/stdout JSON-RPC
|
|
49
|
+
├─────────────────────────────────┤
|
|
50
|
+
│ 工具层(tools/*.py) │ 6 个工具的业务逻辑
|
|
51
|
+
├─────────────────────────────────┤
|
|
52
|
+
│ 数据层(db/*.py) │ SQLite + sqlite-vec
|
|
53
|
+
├─────────────────────────────────┤
|
|
54
|
+
│ Embedding 层(embedding/) │ ONNX Runtime 推理
|
|
55
|
+
└─────────────────────────────────┘
|
|
56
|
+
|
|
57
|
+
┌─────────────────────────────────┐
|
|
58
|
+
│ Web 看板(web/*.py) │ 独立 HTTP 服务,复用数据层
|
|
59
|
+
└─────────────────────────────────┘
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### MCP 协议层(server.py + protocol.py)
|
|
63
|
+
|
|
64
|
+
自实现 JSON-RPC 2.0 over stdio:
|
|
65
|
+
|
|
66
|
+
- `protocol.py`:消息解析(从 stdin 按行读取 JSON)、响应构建(JSON-RPC result/error)
|
|
67
|
+
- `server.py`:主循环,路由分发到对应 handler
|
|
68
|
+
- `initialize` → 返回 server info + capabilities,递增 session_id
|
|
69
|
+
- `tools/list` → 返回 6 个工具的 name + description + inputSchema(JSON Schema)
|
|
70
|
+
- `tools/call` → 根据 tool name 分发到 tools/*.py
|
|
71
|
+
|
|
72
|
+
消息格式遵循 MCP 规范:
|
|
73
|
+
- 请求:`{"jsonrpc": "2.0", "id": N, "method": "tools/call", "params": {...}}`
|
|
74
|
+
- 响应:`{"jsonrpc": "2.0", "id": N, "result": {...}}`
|
|
75
|
+
- 错误:`{"jsonrpc": "2.0", "id": N, "error": {"code": N, "message": "..."}}`
|
|
76
|
+
|
|
77
|
+
日志输出到 stderr(不干扰 stdout 的 JSON-RPC 通信)。
|
|
78
|
+
|
|
79
|
+
### 数据层设计
|
|
80
|
+
|
|
81
|
+
#### 双数据库管理
|
|
82
|
+
|
|
83
|
+
- `ConnectionManager` 类管理两个数据库连接:
|
|
84
|
+
- `user_db`:`~/.devmemory/memory.db`
|
|
85
|
+
- `project_db`:`{project}/.devmemory/memory.db`
|
|
86
|
+
- 启动时自动创建目录和数据库文件
|
|
87
|
+
- 所有连接启用 WAL 模式(`PRAGMA journal_mode=WAL`)
|
|
88
|
+
- 所有连接加载 sqlite-vec 扩展
|
|
89
|
+
|
|
90
|
+
#### 表结构
|
|
91
|
+
|
|
92
|
+
```sql
|
|
93
|
+
-- memories 表(用户级和项目级各一份)
|
|
94
|
+
CREATE TABLE IF NOT EXISTS memories (
|
|
95
|
+
id TEXT PRIMARY KEY,
|
|
96
|
+
content TEXT NOT NULL,
|
|
97
|
+
tags TEXT NOT NULL DEFAULT '[]', -- JSON 数组
|
|
98
|
+
scope TEXT NOT NULL DEFAULT 'project',
|
|
99
|
+
session_id INTEGER NOT NULL DEFAULT 0,
|
|
100
|
+
created_at TEXT NOT NULL,
|
|
101
|
+
updated_at TEXT NOT NULL
|
|
102
|
+
);
|
|
103
|
+
|
|
104
|
+
-- sqlite-vec 虚拟表
|
|
105
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS vec_memories USING vec0(
|
|
106
|
+
id TEXT PRIMARY KEY,
|
|
107
|
+
embedding FLOAT[384]
|
|
108
|
+
);
|
|
109
|
+
|
|
110
|
+
-- session_state 表(仅项目级)
|
|
111
|
+
CREATE TABLE IF NOT EXISTS session_state (
|
|
112
|
+
id INTEGER PRIMARY KEY DEFAULT 1,
|
|
113
|
+
is_blocked INTEGER NOT NULL DEFAULT 0,
|
|
114
|
+
block_reason TEXT NOT NULL DEFAULT '',
|
|
115
|
+
next_step TEXT NOT NULL DEFAULT '',
|
|
116
|
+
current_task TEXT NOT NULL DEFAULT '',
|
|
117
|
+
progress TEXT NOT NULL DEFAULT '[]', -- JSON 数组
|
|
118
|
+
recent_changes TEXT NOT NULL DEFAULT '[]', -- JSON 数组
|
|
119
|
+
pending TEXT NOT NULL DEFAULT '[]', -- JSON 数组
|
|
120
|
+
updated_at TEXT NOT NULL
|
|
121
|
+
);
|
|
122
|
+
|
|
123
|
+
-- issues 表(仅项目级)
|
|
124
|
+
CREATE TABLE IF NOT EXISTS issues (
|
|
125
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
126
|
+
issue_number INTEGER NOT NULL,
|
|
127
|
+
date TEXT NOT NULL,
|
|
128
|
+
title TEXT NOT NULL,
|
|
129
|
+
status TEXT NOT NULL DEFAULT 'pending',
|
|
130
|
+
content TEXT NOT NULL DEFAULT '',
|
|
131
|
+
archive_content TEXT NOT NULL DEFAULT '',
|
|
132
|
+
migrated_to TEXT NOT NULL DEFAULT '',
|
|
133
|
+
created_at TEXT NOT NULL,
|
|
134
|
+
updated_at TEXT NOT NULL
|
|
135
|
+
);
|
|
136
|
+
CREATE INDEX IF NOT EXISTS idx_issues_date ON issues(date);
|
|
137
|
+
CREATE INDEX IF NOT EXISTS idx_issues_status ON issues(status);
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
#### Repository 模式
|
|
141
|
+
|
|
142
|
+
每个 repo 封装对应表的 CRUD:
|
|
143
|
+
|
|
144
|
+
- `MemoryRepo`:insert(含去重检查)、search_by_vector、delete、get_by_session_range
|
|
145
|
+
- `StateRepo`:get、upsert(部分更新)
|
|
146
|
+
- `IssueRepo`:create、update、migrate、archive、list_by_date
|
|
147
|
+
|
|
148
|
+
### Embedding 层设计
|
|
149
|
+
|
|
150
|
+
`EmbeddingEngine` 类,懒加载:
|
|
151
|
+
|
|
152
|
+
1. 首次调用时通过 `huggingface-hub` 下载 ONNX 模型到 `~/.cache/huggingface/`
|
|
153
|
+
2. 加载 `tokenizers` 分词器
|
|
154
|
+
3. 创建 `onnxruntime.InferenceSession`
|
|
155
|
+
4. 推理流程:text → tokenize → ONNX 推理 → mean pooling → L2 归一化 → 384 维 float 数组
|
|
156
|
+
|
|
157
|
+
去重逻辑:remember 时先算 Embedding,在 vec_memories 中查相似度 > 0.95 的记录,有则更新,无则插入。
|
|
158
|
+
|
|
159
|
+
### Web 看板设计
|
|
160
|
+
|
|
161
|
+
独立命令 `devmemory web --project-dir . --port 9080`:
|
|
162
|
+
|
|
163
|
+
- `app.py`:基于 `http.server.HTTPServer`,处理静态文件和 API 请求
|
|
164
|
+
- `api.py`:REST API 路由,前缀 `/api/`
|
|
165
|
+
- `GET /api/memories` — 记忆列表(支持 query/tags/scope 参数)
|
|
166
|
+
- `GET /api/memories/:id` — 记忆详情
|
|
167
|
+
- `PUT /api/memories/:id` — 编辑记忆
|
|
168
|
+
- `DELETE /api/memories/:id` — 删除记忆
|
|
169
|
+
- `DELETE /api/memories` — 批量删除(body 传 ids)
|
|
170
|
+
- `GET /api/status` — 会话状态
|
|
171
|
+
- `PUT /api/status` — 更新状态
|
|
172
|
+
- `GET /api/issues` — 问题列表(支持 date/status 参数)
|
|
173
|
+
- `PUT /api/issues/:id` — 更新问题状态
|
|
174
|
+
- `GET /api/stats` — 统计概览
|
|
175
|
+
- `static/`:纯 HTML + CSS + JS 单页应用
|
|
176
|
+
|
|
177
|
+
数据库连接:只读连接用于查询,写操作通过独立连接。
|
|
178
|
+
|
|
179
|
+
### 入口点设计
|
|
180
|
+
|
|
181
|
+
`pyproject.toml` 配置两个命令:
|
|
182
|
+
|
|
183
|
+
```toml
|
|
184
|
+
[project.scripts]
|
|
185
|
+
devmemory = "devmemory.__main__:main"
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
`__main__.py` 解析子命令:
|
|
189
|
+
- `devmemory`(无子命令)或 `devmemory serve`:启动 MCP Server(stdio 模式)
|
|
190
|
+
- `devmemory web`:启动 Web 看板
|
|
191
|
+
|
|
192
|
+
### session_id 管理
|
|
193
|
+
|
|
194
|
+
- `server.py` 维护一个内部计数器 `_session_id`
|
|
195
|
+
- 每次收到 `initialize` 请求时 +1
|
|
196
|
+
- 从项目级数据库 `memories` 表读取 `MAX(session_id)` 作为初始值
|
|
197
|
+
- 所有 `remember` 调用使用当前 `_session_id`
|
|
198
|
+
|
|
199
|
+
### 错误处理
|
|
200
|
+
|
|
201
|
+
统一错误格式:
|
|
202
|
+
|
|
203
|
+
```python
|
|
204
|
+
{"success": False, "error": "错误类型", "details": "详细信息"}
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
MCP 协议层将业务错误包装为 JSON-RPC error response(code: -32000)。
|
|
208
|
+
参数校验错误使用 JSON-RPC invalid params(code: -32602)。
|
|
@@ -0,0 +1,334 @@
|
|
|
1
|
+
# 需求文档:DevMemory MCP Server
|
|
2
|
+
|
|
3
|
+
## 简介
|
|
4
|
+
|
|
5
|
+
DevMemory 是一个轻量级 MCP Server,为 AI 编程助手提供跨会话持久记忆能力。采用 6 个工具覆盖三大功能:通用记忆(remember/recall/forget)、会话状态(status)、问题跟踪(track)、记忆整理(digest)。
|
|
6
|
+
|
|
7
|
+
双层存储架构:
|
|
8
|
+
- 用户级(`~/.devmemory/`):个人习惯、编程偏好、通用踩坑记录,跨项目共享
|
|
9
|
+
- 项目级(`{project}/.devmemory/`):项目知识库、技术要点、会话状态、问题跟踪
|
|
10
|
+
|
|
11
|
+
数据存储:SQLite + sqlite-vec,所有数据(记忆、向量索引、会话状态、问题跟踪)统一存储在 SQLite 数据库中。
|
|
12
|
+
|
|
13
|
+
技术栈:Python,自实现 MCP 协议(JSON-RPC over stdio),兼容 Kiro IDE 和 opencode。
|
|
14
|
+
|
|
15
|
+
## 术语表
|
|
16
|
+
|
|
17
|
+
- **Memory**:一条记忆记录,包含内容、标签、作用域、来源、时间戳和向量嵌入
|
|
18
|
+
- **Scope**:记忆作用域,`user`(跟人走,存用户目录)或 `project`(跟项目走,存项目目录)
|
|
19
|
+
- **Tag**:自由标签,用于分类和过滤记忆(如 `git`、`习惯`、`php`、`踩坑`)
|
|
20
|
+
- **Vector_Index**:SQLite + sqlite-vec 向量索引,存储 Embedding 用于语义搜索
|
|
21
|
+
- **Embedding**:文本的向量表示,通过本地模型将文本转换为 384 维浮点数组
|
|
22
|
+
- **Session_State**:会话状态记录,存储在项目级 SQLite 数据库的 `session_states` 表中,记录阻塞状态和任务进度
|
|
23
|
+
- **Issue**:问题记录,存储在项目级 SQLite 数据库的 `issues` 表中,包含完整生命周期(待处理→进行中→已完成→已归档)
|
|
24
|
+
- **Digest**:记忆整理,将多次会话积累的碎片记忆提取出来,由 AI 端归纳总结后写回
|
|
25
|
+
|
|
26
|
+
## 技术调研结论
|
|
27
|
+
|
|
28
|
+
### MCP 协议实现
|
|
29
|
+
|
|
30
|
+
- 自实现 JSON-RPC over stdio,不依赖第三方 MCP 框架
|
|
31
|
+
- 核心方法:`initialize`(握手)、`tools/list`(工具列表)、`tools/call`(工具调用)
|
|
32
|
+
- 传输协议:stdio(从 stdin 读请求,往 stdout 写响应)
|
|
33
|
+
- 启动方式:`python -m devmemory` 或 `uvx devmemory`
|
|
34
|
+
- Kiro 配置:`.kiro/settings/mcp.json`
|
|
35
|
+
- opencode 配置:`.opencode/mcp.json` 或 `~/.config/opencode/mcp.json`
|
|
36
|
+
|
|
37
|
+
### sqlite-vec
|
|
38
|
+
|
|
39
|
+
- PyPI 包:`sqlite-vec`(v0.1.0+)
|
|
40
|
+
- 加载方式:`sqlite_vec.load(db)` 需要 `db.enable_load_extension(True)`
|
|
41
|
+
- 向量维度:384(匹配 embedding 模型)
|
|
42
|
+
- 距离度量:余弦距离(cosine distance),值越小越相似
|
|
43
|
+
- macOS:本机 Homebrew Python 3.12.10 已支持 `enable_load_extension`,SQLite 3.49.2,无需额外处理
|
|
44
|
+
|
|
45
|
+
### Embedding 模型
|
|
46
|
+
|
|
47
|
+
- 推荐模型:`intfloat/multilingual-e5-small`
|
|
48
|
+
- 维度:384
|
|
49
|
+
- 大小:~118MB
|
|
50
|
+
- 中文支持:优秀(专为多语言设计,100+ 语言)
|
|
51
|
+
- 推理方案:ONNX Runtime(轻量,无需 torch)
|
|
52
|
+
- HuggingFace 已提供 ONNX 格式模型,无需手动转换
|
|
53
|
+
- 需自行实现 tokenize → 推理 → mean pooling → 归一化 流程
|
|
54
|
+
- 备选模型:`all-MiniLM-L6-v2`(22MB,中文效果较差)
|
|
55
|
+
- 首次加载会自动下载模型到 `~/.cache/huggingface/`
|
|
56
|
+
- 国内网络建议配置 HuggingFace 镜像:`export HF_ENDPOINT=https://hf-mirror.com`
|
|
57
|
+
|
|
58
|
+
### IDE Hook 兼容性
|
|
59
|
+
|
|
60
|
+
| 能力 | Kiro | opencode |
|
|
61
|
+
|------|------|----------|
|
|
62
|
+
| 会话结束事件 | `agentStop` hook | `session.idle` plugin event |
|
|
63
|
+
| 工具调用前/后 | `preToolUse`/`postToolUse` | `tool.execute.before`/`after` |
|
|
64
|
+
| 会话压缩注入 | 不支持 | `session.compacting` hook |
|
|
65
|
+
| 自定义工具 | 不支持 | 支持(plugin tool 导出) |
|
|
66
|
+
|
|
67
|
+
### 竞品分析
|
|
68
|
+
|
|
69
|
+
| 项目 | 存储 | 向量搜索 | 问题跟踪 | 用户级记忆 | 中文支持 |
|
|
70
|
+
|------|------|---------|---------|-----------|---------|
|
|
71
|
+
| OpenMemory (CaviraOSS) | SQLite/Postgres | ✅ | ❌ | ❌ | 未知 |
|
|
72
|
+
| mcp-mem0 | PostgreSQL + OpenAI | ✅ | ❌ | ❌ | 依赖 API |
|
|
73
|
+
| mcp-memory-keeper | 文件 | ❌ | ❌ | ❌ | ❌ |
|
|
74
|
+
| mcp-memory (ebailey78) | Markdown + Lunr.js | 关键词 | ❌ | ❌ | 有限 |
|
|
75
|
+
| **DevMemory(本项目)** | SQLite | ✅ 本地 | ✅ | ✅ | ✅ |
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
## 需求
|
|
80
|
+
|
|
81
|
+
### 需求 1:MCP Server 启动与配置
|
|
82
|
+
|
|
83
|
+
**用户故事:** 作为开发者,我希望 MCP Server 轻量启动,在 Kiro 和 opencode 中都能使用。
|
|
84
|
+
|
|
85
|
+
#### 验收标准
|
|
86
|
+
|
|
87
|
+
1. THE Server SHALL 自实现 MCP 协议(JSON-RPC over stdio),不依赖第三方 MCP 框架
|
|
88
|
+
2. WHEN 启动时,THE Server SHALL 接受 `--project-dir` 参数指定项目根目录,默认使用当前工作目录
|
|
89
|
+
3. WHEN 启动时,THE Server SHALL 自动检测并创建所需目录结构:
|
|
90
|
+
- 用户级:`~/.devmemory/`(memory.db)
|
|
91
|
+
- 项目级:`{project}/.devmemory/`(memory.db)
|
|
92
|
+
4. WHEN 启动时,THE Server SHALL 初始化 SQLite 数据库(WAL 模式)和 sqlite-vec 扩展
|
|
93
|
+
5. WHEN 启动时,THE Server SHALL 懒加载 Embedding 模型(首次调用 recall 或 remember 时才加载,避免启动延迟)
|
|
94
|
+
6. IF sqlite-vec 扩展加载失败,THEN THE Server SHALL 报错退出
|
|
95
|
+
7. IF Embedding 模型加载失败,THEN THE Server SHALL 报错退出
|
|
96
|
+
|
|
97
|
+
### 需求 2:记忆存入(remember)
|
|
98
|
+
|
|
99
|
+
**用户故事:** 作为 AI 助手,我希望将重要信息存入记忆,以便后续会话中回忆。
|
|
100
|
+
|
|
101
|
+
#### 验收标准
|
|
102
|
+
|
|
103
|
+
1. WHEN `remember` 工具被调用时,THE Server SHALL 接受以下参数:
|
|
104
|
+
- `content`(必填):记忆内容,Markdown 格式文本
|
|
105
|
+
- `tags`(必填):标签列表,如 `["git", "习惯"]`
|
|
106
|
+
- `scope`(可选):`user` 或 `project`,默认 `project`
|
|
107
|
+
2. WHEN 存入记忆时,THE Server SHALL 自动生成唯一 ID、记录创建时间、计算 Embedding 向量
|
|
108
|
+
3. WHEN 存入记忆时,THE Server SHALL 将记忆写入对应 scope 的 SQLite 数据库(memory.db)
|
|
109
|
+
4. WHEN 存入记忆时,THE Server SHALL 同步将 Embedding 向量写入 sqlite-vec 虚拟表
|
|
110
|
+
5. WHEN 存入成功时,THE Server SHALL 返回 `{id, tags, scope, created_at}`
|
|
111
|
+
6. WHEN 存入记忆时,THE Server SHALL 先检查是否存在相似度超过 0.95 的记忆,若存在则更新该记忆而非创建新记录
|
|
112
|
+
7. THE Server SHALL 记录每条记忆的 `session_id`(自增会话计数器),用于 digest 功能
|
|
113
|
+
|
|
114
|
+
### 需求 3:记忆回忆(recall)
|
|
115
|
+
|
|
116
|
+
**用户故事:** 作为 AI 助手,我希望通过语义搜索找到相关记忆,即使搜索词与原文用词不同。
|
|
117
|
+
|
|
118
|
+
#### 验收标准
|
|
119
|
+
|
|
120
|
+
1. WHEN `recall` 工具被调用时,THE Server SHALL 接受以下参数:
|
|
121
|
+
- `query`(必填):搜索内容
|
|
122
|
+
- `scope`(可选):`user`、`project` 或 `all`,默认 `all`
|
|
123
|
+
- `tags`(可选):按标签过滤
|
|
124
|
+
- `top_k`(可选):返回结果数量,默认 5
|
|
125
|
+
2. WHEN scope 为 `all` 时,THE Server SHALL 同时搜索用户级和项目级数据库,合并结果按相似度排序
|
|
126
|
+
3. WHEN 向量搜索可用时,THE Server SHALL 将 query 转换为 Embedding,在 sqlite-vec 中执行余弦相似度搜索
|
|
127
|
+
4. WHEN 返回结果时,THE Server SHALL 包含 `{id, content, tags, scope, similarity_score, created_at}`
|
|
128
|
+
5. IF 没有匹配结果,THEN THE Server SHALL 返回空列表
|
|
129
|
+
|
|
130
|
+
### 需求 4:记忆删除(forget)
|
|
131
|
+
|
|
132
|
+
**用户故事:** 作为 AI 助手,我希望删除过时或错误的记忆。
|
|
133
|
+
|
|
134
|
+
#### 验收标准
|
|
135
|
+
|
|
136
|
+
1. WHEN `forget` 工具被调用时,THE Server SHALL 接受 `memory_id`(单个 ID)或 `memory_ids`(ID 列表)参数
|
|
137
|
+
2. WHEN 删除记忆时,THE Server SHALL 同时删除 SQLite 记录和 sqlite-vec 向量索引
|
|
138
|
+
3. WHEN 删除成功时,THE Server SHALL 返回 `{deleted_count, ids}`
|
|
139
|
+
4. IF 指定的 ID 不存在,THEN THE Server SHALL 在返回结果中标注哪些 ID 未找到,不影响其他 ID 的删除
|
|
140
|
+
|
|
141
|
+
### 需求 5:会话状态(status)
|
|
142
|
+
|
|
143
|
+
**用户故事:** 作为 AI 助手,我希望读取和更新会话状态,以便跨会话保持任务连续性。
|
|
144
|
+
|
|
145
|
+
#### 验收标准
|
|
146
|
+
|
|
147
|
+
1. WHEN `status` 工具被调用且未提供 `state` 参数时,THE Server SHALL 从项目级数据库读取当前会话状态,返回结构化数据:`{is_blocked, block_reason, next_step, current_task, progress, recent_changes, pending, updated_at}`
|
|
148
|
+
2. WHEN `status` 工具被调用且提供 `state` 参数时,THE Server SHALL 接受以下可选字段进行部分更新:
|
|
149
|
+
- `blocking_status`、`blocking_reason`、`next_step`
|
|
150
|
+
- `current_task`、`progress`(列表)、`recent_changes`(列表)、`pending`(列表)
|
|
151
|
+
3. WHEN 更新状态时,THE Server SHALL 仅更新提供的字段,保留未提供字段的原有值
|
|
152
|
+
4. WHEN 更新状态时,THE Server SHALL 自动更新 `updated_at` 时间戳
|
|
153
|
+
5. IF 数据库中无状态记录,THEN THE Server SHALL 使用默认值创建
|
|
154
|
+
|
|
155
|
+
### 需求 6:问题跟踪(track)
|
|
156
|
+
|
|
157
|
+
**用户故事:** 作为 AI 助手,我希望通过统一工具管理问题的完整生命周期。
|
|
158
|
+
|
|
159
|
+
#### 验收标准
|
|
160
|
+
|
|
161
|
+
1. WHEN `track` 工具被调用时,THE Server SHALL 接受 `action` 参数,支持以下操作:
|
|
162
|
+
|
|
163
|
+
**action = "create"**:
|
|
164
|
+
2. SHALL 接受 `title`(必填)、`date`(可选,默认当天)
|
|
165
|
+
3. SHALL 在数据库中创建新问题记录,状态为 `pending`,自动分配 ID(当日最大编号 + 1)
|
|
166
|
+
4. SHALL 返回 `{issue_id, date}`
|
|
167
|
+
|
|
168
|
+
**action = "update"**:
|
|
169
|
+
5. SHALL 接受 `issue_id`(必填)、`date`(可选)、`status`(可选:pending/in_progress/completed)、`content`(可选:追加排查内容)
|
|
170
|
+
6. SHALL 更新问题记录的对应字段
|
|
171
|
+
7. IF issue_id 不存在,THEN SHALL 返回错误
|
|
172
|
+
|
|
173
|
+
**action = "migrate"**:
|
|
174
|
+
8. SHALL 接受 `source_date`(必填)、`target_date`(可选,默认当天)
|
|
175
|
+
9. SHALL 将源日期的 `pending` 和 `in_progress` 问题迁移到目标日期,状态设为 `in_progress`,从 1 重新编号
|
|
176
|
+
10. SHALL 将源日期被迁移的问题标记为 `completed`,备注 `→ 已迁移至 YYYY-MM-DD 问题 N`
|
|
177
|
+
11. SHALL 返回 `{migrated_count, id_mapping}`
|
|
178
|
+
|
|
179
|
+
**action = "archive"**:
|
|
180
|
+
12. SHALL 接受 `issue_id`(必填)、`content`(必填:完整排查记录)、`date`(可选)
|
|
181
|
+
13. SHALL 将问题状态更新为 `archived`,保存完整排查记录到 `archive_content` 字段
|
|
182
|
+
14. SHALL 返回 `{issue_id, archived_at}`
|
|
183
|
+
|
|
184
|
+
**action = "list"**:
|
|
185
|
+
15. SHALL 接受 `date`(可选,默认当天)、`status`(可选:过滤状态)
|
|
186
|
+
16. SHALL 返回指定日期的问题列表,按编号排序
|
|
187
|
+
|
|
188
|
+
### 需求 7:记忆整理(digest)
|
|
189
|
+
|
|
190
|
+
**用户故事:** 作为 AI 助手,我希望定期整理碎片记忆,由 AI 归纳总结后写回精炼版本。
|
|
191
|
+
|
|
192
|
+
#### 验收标准
|
|
193
|
+
|
|
194
|
+
1. WHEN `digest` 工具被调用时,THE Server SHALL 接受以下参数:
|
|
195
|
+
- `scope`(可选):`user`、`project` 或 `all`,默认 `project`
|
|
196
|
+
- `since_sessions`(可选):最近 N 次会话的记忆,默认 20
|
|
197
|
+
- `tags`(可选):按标签过滤
|
|
198
|
+
2. WHEN 提取记忆时,THE Server SHALL 返回符合条件的所有记忆原始列表,按时间排序
|
|
199
|
+
3. WHEN 返回结果时,THE Server SHALL 包含 `{memories: [{id, content, tags, created_at}], total_count, session_range}`
|
|
200
|
+
4. THE Server SHALL 不做任何总结或归纳(由 AI 端完成),仅提供原始数据
|
|
201
|
+
5. THE Server SHALL 在每次 `initialize` 调用时递增内部 session_id 计数器(每次 IDE 建立新连接视为新会话)
|
|
202
|
+
|
|
203
|
+
### 需求 8:数据存储
|
|
204
|
+
|
|
205
|
+
**用户故事:** 作为开发者,我希望数据存储可靠且统一。
|
|
206
|
+
|
|
207
|
+
#### 验收标准
|
|
208
|
+
|
|
209
|
+
1. THE Server SHALL 使用 SQLite 存储所有数据,表结构:
|
|
210
|
+
- `memories`:id, content, tags(JSON), scope, session_id, created_at, updated_at
|
|
211
|
+
- `vec_memories`:sqlite-vec 虚拟表,存储 384 维 Embedding 向量
|
|
212
|
+
- `session_state`:id, is_blocked, block_reason, next_step, current_task, progress(JSON), recent_changes(JSON), pending(JSON), updated_at
|
|
213
|
+
- `issues`:id, issue_number, date, title, status(pending/in_progress/completed/archived), content, archive_content, migrated_to, created_at, updated_at
|
|
214
|
+
2. `.devmemory/memory.db` SHALL 被添加到 `.gitignore` 建议(可通过 rebuild 重建向量索引)
|
|
215
|
+
|
|
216
|
+
### 需求 9:错误处理
|
|
217
|
+
|
|
218
|
+
**用户故事:** 作为 AI 助手,我希望 MCP Server 在异常情况下返回清晰的错误信息。
|
|
219
|
+
|
|
220
|
+
#### 验收标准
|
|
221
|
+
|
|
222
|
+
1. IF sqlite-vec 不可用,THEN THE Server SHALL 报错退出
|
|
223
|
+
2. IF Embedding 模型不可用,THEN THE Server SHALL 报错退出
|
|
224
|
+
3. IF 数据库读写失败,THEN THE Server SHALL 返回包含错误原因的错误信息
|
|
225
|
+
4. IF 参数不合法,THEN THE Server SHALL 返回参数校验错误信息
|
|
226
|
+
5. THE Server SHALL 所有错误返回统一格式 `{success: false, error: str, details: str}`
|
|
227
|
+
|
|
228
|
+
### 需求 10:IDE 集成配置
|
|
229
|
+
|
|
230
|
+
**用户故事:** 作为开发者,我希望在 Kiro 和 opencode 中都能快速配置使用。
|
|
231
|
+
|
|
232
|
+
#### 验收标准
|
|
233
|
+
|
|
234
|
+
1. THE Server SHALL 支持以下 Kiro 配置方式(`.kiro/settings/mcp.json`):
|
|
235
|
+
```json
|
|
236
|
+
{
|
|
237
|
+
"mcpServers": {
|
|
238
|
+
"devmemory": {
|
|
239
|
+
"command": "uv",
|
|
240
|
+
"args": ["run", "--with", "devmemory", "devmemory", "--project-dir", "."]
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
```
|
|
245
|
+
2. THE Server SHALL 支持以下 opencode 配置方式(`.opencode/mcp.json`):
|
|
246
|
+
```json
|
|
247
|
+
{
|
|
248
|
+
"mcpServers": {
|
|
249
|
+
"devmemory": {
|
|
250
|
+
"type": "local",
|
|
251
|
+
"command": "uv",
|
|
252
|
+
"args": ["run", "--with", "devmemory", "devmemory", "--project-dir", "."]
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
```
|
|
257
|
+
3. THE Server SHALL 支持通过 `pip install devmemory` 或 `uv pip install devmemory` 安装
|
|
258
|
+
4. THE Server SHALL 支持通过 `uvx devmemory` 直接运行(无需预安装)
|
|
259
|
+
|
|
260
|
+
### 需求 11:Web 看板
|
|
261
|
+
|
|
262
|
+
**用户故事:** 作为开发者,我希望通过浏览器查看和管理 DevMemory 中的数据。
|
|
263
|
+
|
|
264
|
+
#### 验收标准
|
|
265
|
+
|
|
266
|
+
1. THE Server SHALL 提供 `devmemory web` 命令启动本地 Web 看板,默认监听 `http://localhost:9080`
|
|
267
|
+
2. THE Server SHALL 支持 `--port` 参数自定义端口
|
|
268
|
+
3. Web 看板 SHALL 提供以下页面:
|
|
269
|
+
|
|
270
|
+
**记忆管理**:
|
|
271
|
+
4. SHALL 展示记忆列表,支持按关键词搜索、按标签过滤、按 scope 过滤
|
|
272
|
+
5. SHALL 支持查看记忆详情(内容、标签、创建时间、所属会话)
|
|
273
|
+
6. SHALL 支持删除单条或批量删除记忆
|
|
274
|
+
7. SHALL 支持编辑记忆内容和标签
|
|
275
|
+
|
|
276
|
+
**会话状态**:
|
|
277
|
+
8. SHALL 展示当前会话状态(阻塞状态、当前任务、进度、待处理项)
|
|
278
|
+
9. SHALL 支持手动修改会话状态各字段
|
|
279
|
+
|
|
280
|
+
**问题跟踪**:
|
|
281
|
+
10. SHALL 展示问题列表,支持按日期和状态过滤
|
|
282
|
+
11. SHALL 支持查看问题详情(排查内容、归档记录)
|
|
283
|
+
12. SHALL 支持手动切换问题状态
|
|
284
|
+
|
|
285
|
+
**统计概览**:
|
|
286
|
+
13. SHALL 展示基本统计:记忆总数、标签分布、各状态问题数量
|
|
287
|
+
|
|
288
|
+
**技术实现**:
|
|
289
|
+
14. THE Server SHALL 使用内置 HTTP 服务(Python 标准库),不引入额外 Web 框架
|
|
290
|
+
15. THE Server SHALL 前端使用纯 HTML + CSS + JavaScript,不引入前端框架
|
|
291
|
+
16. THE Server SHALL 复用 MCP Server 的 SQLite 读写逻辑,以只读方式打开数据库(写操作通过独立连接)
|
|
292
|
+
|
|
293
|
+
---
|
|
294
|
+
|
|
295
|
+
## 工具速查表
|
|
296
|
+
|
|
297
|
+
| 工具 | 用途 | 存储层 | 核心参数 |
|
|
298
|
+
|------|------|--------|---------|
|
|
299
|
+
| `remember` | 存入记忆 | SQLite + 向量 | content, tags, scope |
|
|
300
|
+
| `recall` | 语义搜索回忆 | SQLite + 向量 | query, scope, tags, top_k |
|
|
301
|
+
| `forget` | 删除记忆 | SQLite + 向量 | memory_id(s) |
|
|
302
|
+
| `status` | 会话状态读写 | SQLite | state(可选) |
|
|
303
|
+
| `track` | 问题跟踪 | SQLite | action, ... |
|
|
304
|
+
| `digest` | 提取待总结记忆 | SQLite | scope, since_sessions |
|
|
305
|
+
|
|
306
|
+
## 依赖清单
|
|
307
|
+
|
|
308
|
+
| 包名 | 用途 | 版本要求 |
|
|
309
|
+
|------|------|---------|
|
|
310
|
+
| `sqlite-vec` | SQLite 向量搜索扩展 | >=0.1.0 |
|
|
311
|
+
| `onnxruntime` | 本地模型推理 | >=1.16 |
|
|
312
|
+
| `tokenizers` | HuggingFace 分词器 | >=0.15 |
|
|
313
|
+
| `huggingface-hub` | 模型下载 | >=0.20 |
|
|
314
|
+
| `numpy` | 向量计算 | >=1.24 |
|
|
315
|
+
|
|
316
|
+
⚠️ macOS 注意:系统自带 Python 3.9.6 不支持 SQLite 扩展加载。本机已安装 Homebrew Python 3.12.10(`/opt/homebrew/Cellar/python@3.12/3.12.10_1/`),SQLite 3.49.2,`enable_load_extension` 可用,sqlite-vec 可直接使用。
|
|
317
|
+
|
|
318
|
+
## Embedding 模型选择
|
|
319
|
+
|
|
320
|
+
| 模型 | 维度 | 大小 | 中文支持 | 说明 |
|
|
321
|
+
|------|------|------|---------|------|
|
|
322
|
+
| `intfloat/multilingual-e5-small` | 384 | ~118MB | ✅ 优秀 | 推荐,100+ 语言 |
|
|
323
|
+
| `all-MiniLM-L6-v2` | 384 | ~22MB | ⚠️ 较差 | 备选,英文为主 |
|
|
324
|
+
|
|
325
|
+
首次使用时模型自动下载到 `~/.cache/huggingface/`,后续离线可用。
|
|
326
|
+
|
|
327
|
+
## 资源占用预估
|
|
328
|
+
|
|
329
|
+
| 状态 | 内存 | 说明 |
|
|
330
|
+
|------|------|------|
|
|
331
|
+
| 空闲(模型未加载) | ~20-30MB | Python 进程 + SQLite |
|
|
332
|
+
| 模型已加载 | ~100-200MB | + ONNX Runtime + 模型 |
|
|
333
|
+
|
|
334
|
+
安装体积:~200MB(onnxruntime ~30MB + 模型 ~118MB + 其他依赖)
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# 任务文档:DevMemory MCP Server
|
|
2
|
+
|
|
3
|
+
## 阶段 1:项目骨架与基础设施
|
|
4
|
+
|
|
5
|
+
- [x] 1.1 创建 `pyproject.toml`(包名 devmemory、依赖、入口点配置)
|
|
6
|
+
- [x] 1.2 创建目录结构(devmemory/、tools/、db/、embedding/、web/)
|
|
7
|
+
- [x] 1.3 实现 `config.py`(路径常量、默认值、模型名)
|
|
8
|
+
- [x] 1.4 实现 `errors.py`(统一错误格式 `{success, error, details}`)
|
|
9
|
+
- [x] 1.5 实现 `__main__.py`(命令行参数解析:`--project-dir`、子命令 serve/web)
|
|
10
|
+
|
|
11
|
+
## 阶段 2:数据层
|
|
12
|
+
|
|
13
|
+
- [x] 2.1 实现 `db/connection.py`(ConnectionManager:双数据库连接、WAL 模式、sqlite-vec 加载)
|
|
14
|
+
- [x] 2.2 实现 `db/schema.py`(建表语句:memories、vec_memories、session_state、issues)
|
|
15
|
+
- [x] 2.3 实现 `db/memory_repo.py`(insert、search_by_vector、delete、get_by_session_range)
|
|
16
|
+
- [x] 2.4 实现 `db/state_repo.py`(get、upsert 部分更新)
|
|
17
|
+
- [x] 2.5 实现 `db/issue_repo.py`(create、update、migrate、archive、list_by_date)
|
|
18
|
+
- [x] 2.6 测试数据层:验证建表、CRUD、WAL 模式、sqlite-vec 向量搜索(19 tests passed)
|
|
19
|
+
|
|
20
|
+
## 阶段 3:Embedding 层
|
|
21
|
+
|
|
22
|
+
- [x] 3.1 实现 `embedding/engine.py`(EmbeddingEngine:懒加载、模型下载、tokenize → ONNX 推理 → mean pooling → 归一化)
|
|
23
|
+
- [x] 3.2 测试 Embedding:验证模型加载、向量维度 384、中文文本编码正确
|
|
24
|
+
|
|
25
|
+
## 阶段 4:MCP 协议层
|
|
26
|
+
|
|
27
|
+
- [x] 4.1 实现 `protocol.py`(JSON-RPC 消息解析、响应构建、错误码)
|
|
28
|
+
- [x] 4.2 实现 `server.py`(主循环:stdin 读取 → 路由分发 → stdout 响应、session_id 管理)
|
|
29
|
+
- [x] 4.3 实现 `initialize` handler(返回 server info + capabilities,递增 session_id)
|
|
30
|
+
- [x] 4.4 实现 `tools/list` handler(返回 6 个工具的 JSON Schema)
|
|
31
|
+
- [x] 4.5 实现 `tools/call` 路由分发
|
|
32
|
+
- [x] 4.6 测试协议层:手动发送 JSON-RPC 消息验证握手和工具列表(4 tests passed)
|
|
33
|
+
|
|
34
|
+
## 阶段 5:工具实现
|
|
35
|
+
|
|
36
|
+
- [x] 5.1 实现 `tools/remember.py`(存入记忆 + 去重检查 + Embedding 计算)
|
|
37
|
+
- [x] 5.2 实现 `tools/recall.py`(向量搜索 + 双库合并 + 标签过滤)
|
|
38
|
+
- [x] 5.3 实现 `tools/forget.py`(删除记忆 + 向量索引)
|
|
39
|
+
- [x] 5.4 实现 `tools/status.py`(读取/部分更新会话状态)
|
|
40
|
+
- [x] 5.5 实现 `tools/track.py`(create/update/migrate/archive/list 五个 action)
|
|
41
|
+
- [x] 5.6 实现 `tools/digest.py`(按 session_id 范围提取记忆)
|
|
42
|
+
- [x] 5.7 集成测试:通过 stdio 调用每个工具,验证输入输出(5 tests passed)
|
|
43
|
+
|
|
44
|
+
## 阶段 6:IDE 集成测试
|
|
45
|
+
|
|
46
|
+
- [x] 6.1 配置 Kiro MCP(`.kiro/settings/mcp.json`),验证工具列表加载
|
|
47
|
+
- [x] 6.2 在 Kiro 中测试 remember → recall 流程
|
|
48
|
+
- [x] 6.3 在 Kiro 中测试 status 读写
|
|
49
|
+
- [x] 6.4 在 Kiro 中测试 track 全生命周期(create → update → archive)
|
|
50
|
+
- [x] 6.5 验证 `pip install -e .` 本地安装 + `devmemory --help` 可用
|
|
51
|
+
|
|
52
|
+
## 阶段 7:Web 看板
|
|
53
|
+
|
|
54
|
+
- [x] 7.1 实现 `web/app.py`(HTTP 服务、静态文件托管)
|
|
55
|
+
- [x] 7.2 实现 `web/api.py`(REST API 路由:memories/status/issues/stats)
|
|
56
|
+
- [x] 7.3 实现 `web/static/index.html`(页面结构:导航、记忆列表、状态、问题、统计)
|
|
57
|
+
- [x] 7.4 实现 `web/static/style.css`(样式)
|
|
58
|
+
- [x] 7.5 实现 `web/static/app.js`(交互逻辑:搜索、过滤、编辑、删除)
|
|
59
|
+
- [x] 7.6 测试 Web 看板:启动服务,验证各页面功能
|
|
60
|
+
|
|
61
|
+
## 阶段 8:打包发布
|
|
62
|
+
|
|
63
|
+
- [x] 8.1 完善 `pyproject.toml`(版本号、描述、license、README)
|
|
64
|
+
- [x] 8.2 创建 `.gitignore`(包含 `.devmemory/` 建议)
|
|
65
|
+
- [x] 8.3 验证 `pip install .` 本地安装
|
|
66
|
+
- [x] 8.4 验证 `uv pip install .` 安装
|