szyjiyi 0.2.4__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.
Files changed (46) hide show
  1. szyjiyi-0.2.4/.git.rar +0 -0
  2. szyjiyi-0.2.4/.gitignore +39 -0
  3. szyjiyi-0.2.4/.opencode/plugins/aivectormemory-auto-save.js +42 -0
  4. szyjiyi-0.2.4/PKG-INFO +439 -0
  5. szyjiyi-0.2.4/README.md +414 -0
  6. szyjiyi-0.2.4/docs/README.de.md +405 -0
  7. szyjiyi-0.2.4/docs/README.en.md +405 -0
  8. szyjiyi-0.2.4/docs/README.es.md +405 -0
  9. szyjiyi-0.2.4/docs/README.fr.md +405 -0
  10. szyjiyi-0.2.4/docs/README.ja.md +405 -0
  11. szyjiyi-0.2.4/docs/README.zh-TW.md +405 -0
  12. szyjiyi-0.2.4/docs/dashboard-overview.png +0 -0
  13. szyjiyi-0.2.4/docs/dashboard-projects.png +0 -0
  14. szyjiyi-0.2.4/pyproject.toml +43 -0
  15. szyjiyi-0.2.4/szyjiyi/__init__.py +3 -0
  16. szyjiyi-0.2.4/szyjiyi/__main__.py +49 -0
  17. szyjiyi-0.2.4/szyjiyi/config.py +28 -0
  18. szyjiyi-0.2.4/szyjiyi/db/__init__.py +7 -0
  19. szyjiyi-0.2.4/szyjiyi/db/connection.py +46 -0
  20. szyjiyi-0.2.4/szyjiyi/db/issue_repo.py +108 -0
  21. szyjiyi-0.2.4/szyjiyi/db/memory_repo.py +177 -0
  22. szyjiyi-0.2.4/szyjiyi/db/schema.py +145 -0
  23. szyjiyi-0.2.4/szyjiyi/db/state_repo.py +54 -0
  24. szyjiyi-0.2.4/szyjiyi/embedding/__init__.py +3 -0
  25. szyjiyi-0.2.4/szyjiyi/embedding/engine.py +85 -0
  26. szyjiyi-0.2.4/szyjiyi/errors.py +11 -0
  27. szyjiyi-0.2.4/szyjiyi/hooks/__init__.py +0 -0
  28. szyjiyi-0.2.4/szyjiyi/hooks/check_track.sh +31 -0
  29. szyjiyi-0.2.4/szyjiyi/install.py +874 -0
  30. szyjiyi-0.2.4/szyjiyi/protocol.py +34 -0
  31. szyjiyi-0.2.4/szyjiyi/server.py +114 -0
  32. szyjiyi-0.2.4/szyjiyi/tools/__init__.py +127 -0
  33. szyjiyi-0.2.4/szyjiyi/tools/auto_save.py +38 -0
  34. szyjiyi-0.2.4/szyjiyi/tools/digest.py +42 -0
  35. szyjiyi-0.2.4/szyjiyi/tools/forget.py +25 -0
  36. szyjiyi-0.2.4/szyjiyi/tools/recall.py +37 -0
  37. szyjiyi-0.2.4/szyjiyi/tools/remember.py +26 -0
  38. szyjiyi-0.2.4/szyjiyi/tools/status.py +17 -0
  39. szyjiyi-0.2.4/szyjiyi/tools/track.py +70 -0
  40. szyjiyi-0.2.4/szyjiyi/web/__init__.py +0 -0
  41. szyjiyi-0.2.4/szyjiyi/web/api.py +573 -0
  42. szyjiyi-0.2.4/szyjiyi/web/app.py +139 -0
  43. szyjiyi-0.2.4/szyjiyi/web/static/app.js +904 -0
  44. szyjiyi-0.2.4/szyjiyi/web/static/i18n.js +838 -0
  45. szyjiyi-0.2.4/szyjiyi/web/static/index.html +209 -0
  46. szyjiyi-0.2.4/szyjiyi/web/static/style.css +443 -0
szyjiyi-0.2.4/.git.rar ADDED
Binary file
@@ -0,0 +1,39 @@
1
+ # Python
2
+ __pycache__/
3
+ *.py[cod]
4
+ *.egg-info/
5
+ dist/
6
+ build/
7
+ *.egg
8
+
9
+ # Virtual environment
10
+ .venv/
11
+
12
+ # AIVectorMemory data
13
+ .aivectormemory/
14
+ .devmemory/
15
+
16
+ # IDE
17
+ .vscode/
18
+ .idea/
19
+ .claude/
20
+ .kiro/
21
+ .shared/
22
+ .mcp.json
23
+ CLAUDE.md
24
+ CLAUDE.md.bak
25
+ AGENTS.md
26
+ opencode.json
27
+
28
+ # OS
29
+ .DS_Store
30
+ Thumbs.db
31
+
32
+ # Test
33
+ .pytest_cache/
34
+ htmlcov/
35
+ .coverage
36
+ tests/
37
+
38
+ # Screenshots (Playwright)
39
+ tests/screenshots/
@@ -0,0 +1,42 @@
1
+ // AIVectorMemory plugin for OpenCode (@opencode-ai/plugin)
2
+ // - tool.execute.before: 检查 Edit/Write 前是否有活跃 track issue
3
+ // - event: stop 时提醒调用 auto_save
4
+ import { execSync } from "child_process";
5
+ import { homedir } from "os";
6
+ import { existsSync } from "fs";
7
+ import { join } from "path";
8
+
9
+ const DB_PATH = join(homedir(), ".aivectormemory", "memory.db");
10
+
11
+ function hasActiveIssues(projectDir) {
12
+ if (!existsSync(DB_PATH)) return true; // 首次使用放行
13
+ try {
14
+ const result = execSync(
15
+ `sqlite3 "${DB_PATH}" "SELECT COUNT(*) FROM issues WHERE project_dir='${projectDir}' AND status IN ('pending','in_progress');"`,
16
+ { encoding: "utf-8", timeout: 5000 }
17
+ ).trim();
18
+ return parseInt(result, 10) > 0;
19
+ } catch {
20
+ return true; // 查询失败放行
21
+ }
22
+ }
23
+
24
+ export default async ({ project }) => ({
25
+ "tool.execute.before": async ({ tool, sessionID }, output) => {
26
+ if (tool !== "Edit" && tool !== "Write" && tool !== "edit" && tool !== "write") return;
27
+ const projectDir = project?.path || process.cwd();
28
+ if (!hasActiveIssues(projectDir)) {
29
+ output.args = {
30
+ ...output.args,
31
+ __blocked: "⚠️ 当前项目没有活跃的 track issue。请先调用 track(action: create) 记录问题后再修改代码。",
32
+ };
33
+ }
34
+ },
35
+ event: async ({ event }) => {
36
+ if (event.type === "session.stop" || event.type === "stop") {
37
+ console.error(
38
+ "Reminder: call auto_save (mcp_aivectormemory_auto_save) to save session data."
39
+ );
40
+ }
41
+ },
42
+ });
szyjiyi-0.2.4/PKG-INFO ADDED
@@ -0,0 +1,439 @@
1
+ Metadata-Version: 2.4
2
+ Name: szyjiyi
3
+ Version: 0.2.4
4
+ Summary: 轻量级 MCP Server,为 AI 编程助手提供跨会话持久记忆能力
5
+ Project-URL: Homepage, https://github.com/Edlineas/aivectormemory
6
+ Project-URL: Repository, https://github.com/Edlineas/aivectormemory
7
+ Author: szyjiyi Contributors
8
+ License-Expression: MIT
9
+ Keywords: ai,embedding,llm,mcp,memory,sqlite
10
+ Classifier: Development Status :: 3 - Alpha
11
+ Classifier: Intended Audience :: Developers
12
+ Classifier: License :: OSI Approved :: MIT License
13
+ Classifier: Programming Language :: Python :: 3
14
+ Classifier: Programming Language :: Python :: 3.10
15
+ Classifier: Programming Language :: Python :: 3.11
16
+ Classifier: Programming Language :: Python :: 3.12
17
+ Classifier: Topic :: Software Development :: Libraries
18
+ Requires-Python: >=3.10
19
+ Requires-Dist: huggingface-hub>=0.20
20
+ Requires-Dist: numpy>=1.24
21
+ Requires-Dist: onnxruntime>=1.16
22
+ Requires-Dist: sqlite-vec>=0.1.0
23
+ Requires-Dist: tokenizers>=0.15
24
+ Description-Content-Type: text/markdown
25
+
26
+ 🌐 简体中文 | [繁體中文](docs/README.zh-TW.md) | [English](docs/README.en.md) | [Español](docs/README.es.md) | [Deutsch](docs/README.de.md) | [Français](docs/README.fr.md) | [日本語](docs/README.ja.md)
27
+
28
+ <p align="center">
29
+ <h1 align="center">🧠 AIVectorMemory</h1>
30
+ <p align="center">
31
+ <strong>给 AI 编程助手装上记忆 — 跨会话持久化记忆 MCP Server</strong>
32
+ </p>
33
+ <p align="center">
34
+ <a href="https://pypi.org/project/aivectormemory/"><img src="https://img.shields.io/pypi/v/aivectormemory?color=blue&label=PyPI" alt="PyPI"></a>
35
+ <a href="https://pypi.org/project/aivectormemory/"><img src="https://img.shields.io/pypi/pyversions/aivectormemory" alt="Python"></a>
36
+ <a href="https://github.com/Edlineas/aivectormemory/blob/main/LICENSE"><img src="https://img.shields.io/badge/license-MIT-green" alt="License"></a>
37
+ <a href="https://modelcontextprotocol.io"><img src="https://img.shields.io/badge/MCP-compatible-purple" alt="MCP"></a>
38
+ </p>
39
+ </p>
40
+
41
+ ---
42
+
43
+ > **问题**:AI 助手每次新会话都"失忆",反复踩同样的坑、忘记项目约定、丢失开发进度。更糟的是,为了补偿失忆,你不得不在每次对话中重复注入大量上下文,白白浪费 Token。
44
+ >
45
+ > **AIVectorMemory**:通过 MCP 协议为 AI 提供本地向量记忆库,让它记住一切 — 项目知识、踩坑记录、开发决策、工作进度 — 跨会话永不丢失。语义检索按需召回,不再全量注入,大幅降低 Token 消耗。
46
+
47
+ ## ✨ 核心特性
48
+
49
+ | 特性 | 说明 |
50
+ |------|------|
51
+ | 🔍 **语义搜索** | 基于向量相似度,搜"数据库超时"能找到"MySQL 连接池踩坑" |
52
+ | 🏠 **完全本地** | ONNX Runtime 本地推理,无需 API Key,数据不出本机 |
53
+ | 🔄 **智能去重** | 余弦相似度 > 0.95 自动更新,不会重复存储 |
54
+ | 📊 **Web 看板** | 内置管理界面,3D 向量网络可视化 |
55
+ | 🔌 **全 IDE 支持** | OpenCode / Claude Code / Cursor / Kiro / Windsurf / VSCode / Trae 等 |
56
+ | 📁 **项目隔离** | 多项目共用一个 DB,通过 project_dir 自动隔离 |
57
+ | 🏷️ **标签体系** | 记忆分类管理,支持标签搜索、重命名、合并 |
58
+ | 💰 **节省 Token** | 语义检索按需召回,替代全量上下文注入,减少 50%+ 重复 Token 消耗 |
59
+ | 📋 **问题追踪** | 轻量级 issue tracker,AI 自动记录和归档 |
60
+ | 🔐 **Web 认证** | 看板支持 Token 认证,防止未授权访问 |
61
+ | ⚡ **Embedding 缓存** | 相同内容不重复计算向量,提升写入性能 |
62
+ | 📤 **导出/导入** | 记忆数据 JSON 导出导入,支持迁移和备份 |
63
+ | 🎯 **操作反馈** | Toast 提示、空状态引导,交互体验完整 |
64
+ | ➕ **看板添加项目** | 前端直接添加项目,支持目录浏览器选择 |
65
+
66
+ ## 🏗️ 架构
67
+
68
+ ```
69
+ ┌─────────────────────────────────────────────────┐
70
+ │ AI IDE │
71
+ │ OpenCode / Claude Code / Cursor / Kiro / ... │
72
+ └──────────────────────┬──────────────────────────┘
73
+ │ MCP Protocol (stdio)
74
+ ┌──────────────────────▼──────────────────────────┐
75
+ │ AIVectorMemory Server │
76
+ │ │
77
+ │ ┌──────────┐ ┌──────────┐ ┌──────────────────┐ │
78
+ │ │ remember │ │ recall │ │ auto_save │ │
79
+ │ │ forget │ │ digest │ │ status/track │ │
80
+ │ └────┬─────┘ └────┬─────┘ └───────┬──────────┘ │
81
+ │ │ │ │ │
82
+ │ ┌────▼────────────▼───────────────▼──────────┐ │
83
+ │ │ Embedding Engine (ONNX) │ │
84
+ │ │ intfloat/multilingual-e5-small │ │
85
+ │ └────────────────────┬───────────────────────┘ │
86
+ │ │ │
87
+ │ ┌────────────────────▼───────────────────────┐ │
88
+ │ │ SQLite + sqlite-vec (向量索引) │ │
89
+ │ │ ~/.aivectormemory/memory.db │ │
90
+ │ └────────────────────────────────────────────┘ │
91
+ └──────────────────────────────────────────────────┘
92
+ ```
93
+
94
+
95
+ ## 🚀 快速开始
96
+
97
+ ### 方式一:pip 安装
98
+
99
+ ```bash
100
+ pip install aivectormemory
101
+ pip install --upgrade aivectormemory # 升级到最新版
102
+ cd /path/to/your/project
103
+ run install # 交互式选择 IDE,一键配置
104
+ ```
105
+
106
+ > **macOS 用户注意**:
107
+ > - 遇到 `externally-managed-environment` 错误,加 `--break-system-packages`
108
+ > - 遇到 `enable_load_extension` 错误,说明当前 Python 不支持 SQLite 扩展加载(macOS 自带 Python 和 python.org 官方安装包均不支持),请改用 Homebrew Python:
109
+ > ```bash
110
+ > brew install python
111
+ > /opt/homebrew/bin/python3 -m pip install aivectormemory
112
+ > ```
113
+
114
+ ### 方式二:uvx 运行(零安装)
115
+
116
+ ```bash
117
+ cd /path/to/your/project
118
+ uvx aivectormemory install
119
+ ```
120
+
121
+ ### 方式三:手动配置
122
+
123
+ ```json
124
+ {
125
+ "mcpServers": {
126
+ "aivectormemory": {
127
+ "command": "run",
128
+ "args": ["--project-dir", "/path/to/your/project"]
129
+ }
130
+ }
131
+ }
132
+ ```
133
+
134
+ <details>
135
+ <summary>📍 各 IDE 配置文件位置</summary>
136
+
137
+ | IDE | 配置文件路径 |
138
+ |-----|------------|
139
+ | Kiro | `.kiro/settings/mcp.json` |
140
+ | Cursor | `.cursor/mcp.json` |
141
+ | Claude Code | `.mcp.json` |
142
+ | Windsurf | `.windsurf/mcp.json` |
143
+ | VSCode | `.vscode/mcp.json` |
144
+ | Trae | `.trae/mcp.json` |
145
+ | OpenCode | `opencode.json` |
146
+ | Claude Desktop | `~/Library/Application Support/Claude/claude_desktop_config.json` |
147
+
148
+ </details>
149
+
150
+ ## 🛠️ 7 个 MCP 工具
151
+
152
+ ### `remember` — 存入记忆
153
+
154
+ ```
155
+ content (string, 必填) 记忆内容,Markdown 格式
156
+ tags (string[], 必填) 标签,如 ["踩坑", "python"]
157
+ scope (string) "project"(默认)/ "user"(跨项目)
158
+ ```
159
+
160
+ 相似度 > 0.95 自动更新已有记忆,不重复存储。
161
+
162
+ ### `recall` — 语义搜索
163
+
164
+ ```
165
+ query (string) 语义搜索关键词
166
+ tags (string[]) 标签精确过滤
167
+ scope (string) "project" / "user" / "all"
168
+ top_k (integer) 返回数量,默认 5
169
+ ```
170
+
171
+ 向量相似度匹配,用词不同也能找到相关记忆。
172
+
173
+ ### `forget` — 删除记忆
174
+
175
+ ```
176
+ memory_id (string) 单个 ID
177
+ memory_ids (string[]) 批量 ID
178
+ ```
179
+
180
+ ### `status` — 会话状态
181
+
182
+ ```
183
+ state (object, 可选) 不传=读取,传=更新
184
+ is_blocked, block_reason, current_task,
185
+ next_step, progress[], recent_changes[], pending[]
186
+ ```
187
+
188
+ 跨会话保持工作进度,新会话自动恢复上下文。
189
+
190
+ ### `track` — 问题跟踪
191
+
192
+ ```
193
+ action (string) "create" / "update" / "archive" / "list"
194
+ title (string) 问题标题
195
+ issue_id (integer) 问题 ID
196
+ status (string) "pending" / "in_progress" / "completed"
197
+ content (string) 排查内容
198
+ ```
199
+
200
+ ### `digest` — 记忆摘要
201
+
202
+ ```
203
+ scope (string) 范围
204
+ since_sessions (integer) 最近 N 次会话
205
+ tags (string[]) 标签过滤
206
+ ```
207
+
208
+ ### `auto_save` — 自动保存
209
+
210
+ ```
211
+ decisions[] 关键决策
212
+ modifications[] 文件修改摘要
213
+ pitfalls[] 踩坑记录
214
+ todos[] 待办事项
215
+ ```
216
+
217
+ 每次对话结束自动分类存储,打标签,去重。
218
+
219
+ ## 📊 Web 看板
220
+
221
+ ```bash
222
+ run web --port 9080
223
+ run web --port 9080 --quiet # 屏蔽请求日志
224
+ run web --port 9080 --quiet --daemon # 后台运行(macOS/Linux)
225
+ ```
226
+
227
+ 浏览器访问 `http://localhost:9080`
228
+
229
+ - 多项目切换,记忆浏览/搜索/编辑/删除/导出/导入
230
+ - 语义搜索(向量相似度匹配)
231
+ - 项目数据一键删除
232
+ - 会话状态、问题追踪
233
+ - 标签管理(重命名、合并、批量删除)
234
+ - Token 认证保护
235
+ - 3D 向量记忆网络可视化
236
+ - 🌐 多语言支持(简体中文 / 繁體中文 / English / Español / Deutsch / Français / 日本語)
237
+
238
+ <p align="center">
239
+ <img src="docs/dashboard-projects.png" alt="项目选择" width="100%">
240
+ <br>
241
+ <em>项目选择</em>
242
+ </p>
243
+
244
+ <p align="center">
245
+ <img src="docs/dashboard-overview.png" alt="统计概览 & 向量网络可视化" width="100%">
246
+ <br>
247
+ <em>统计概览 & 向量网络可视化</em>
248
+ </p>
249
+
250
+ ## ⚡ 配合 Steering 规则
251
+
252
+ AIVectorMemory 是存储层,通过 Steering 规则告诉 AI **何时、如何**调用这些工具。
253
+
254
+ 运行 `run install` 会自动生成 Steering 规则和 Hooks 配置,无需手动编写。
255
+
256
+ | IDE | Steering 位置 | Hooks |
257
+ |-----|--------------|-------|
258
+ | Kiro | `.kiro/steering/aivectormemory.md` | `.kiro/hooks/*.hook` |
259
+ | Cursor | `.cursor/rules/aivectormemory.md` | `.cursor/hooks.json` |
260
+ | Claude Code | `CLAUDE.md`(追加) | `.claude/settings.json` |
261
+ | Windsurf | `.windsurf/rules/aivectormemory.md` | `.windsurf/hooks.json` |
262
+ | VSCode | `.github/copilot-instructions.md`(追加) | — |
263
+ | Trae | `.trae/rules/aivectormemory.md` | — |
264
+ | OpenCode | `AGENTS.md`(追加) | `.opencode/plugins/*.js` |
265
+
266
+ <details>
267
+ <summary>📋 Steering 规则范例(自动生成)</summary>
268
+
269
+ ```markdown
270
+ # AIVectorMemory - 跨会话持久记忆
271
+
272
+ ## 启动检查
273
+
274
+ 每次新会话开始时,按以下顺序执行:
275
+
276
+ 1. 调用 `status`(不传参数)读取会话状态,检查 `is_blocked` 和 `block_reason`
277
+ 2. 调用 `recall`(tags: ["项目知识"], scope: "project")加载项目知识
278
+ 3. 调用 `recall`(tags: ["preference"], scope: "user")加载用户偏好
279
+
280
+ ## 何时调用
281
+
282
+ - 新会话开始时:调用 `status` 读取上次的工作状态
283
+ - 遇到踩坑/技术要点时:调用 `remember` 记录,标签加 "踩坑"
284
+ - 需要查找历史经验时:调用 `recall` 语义搜索
285
+ - 发现 bug 或待处理事项时:调用 `track`(action: create)
286
+ - 任务进度变化时:调用 `status`(传 state 参数)更新
287
+ - 对话结束前:调用 `auto_save` 保存本次对话
288
+
289
+ ## 会话状态管理
290
+
291
+ status 字段:is_blocked, block_reason, current_task, next_step,
292
+ progress[], recent_changes[], pending[]
293
+
294
+ ⚠️ **阻塞防护**:提出方案等待确认、修复完成等待验证时,必须同步调用 `status` 设置 `is_blocked: true`。这可以防止会话转移时新会话误判为"已确认"而擅自执行。
295
+
296
+ ## 问题追踪
297
+
298
+ 1. `track create` → 记录问题
299
+ 2. `track update` → 更新排查内容
300
+ 3. `track archive` → 归档已解决问题
301
+ ```
302
+
303
+ </details>
304
+
305
+ <details>
306
+ <summary>🔗 Hooks 配置范例(Kiro 专属,自动生成)</summary>
307
+
308
+ 会话结束自动保存(`.kiro/hooks/auto-save-session.kiro.hook`):
309
+
310
+ ```json
311
+ {
312
+ "enabled": true,
313
+ "name": "会话结束自动保存",
314
+ "version": "1",
315
+ "when": { "type": "agentStop" },
316
+ "then": {
317
+ "type": "askAgent",
318
+ "prompt": "调用 auto_save,将本次对话的决策、修改、踩坑、待办分类保存"
319
+ }
320
+ }
321
+ ```
322
+
323
+ 开发流程检查(`.kiro/hooks/dev-workflow-check.kiro.hook`):
324
+
325
+ ```json
326
+ {
327
+ "enabled": true,
328
+ "name": "开发流程检查",
329
+ "version": "1",
330
+ "when": { "type": "promptSubmit" },
331
+ "then": {
332
+ "type": "askAgent",
333
+ "prompt": "核心原则:操作前验证、禁止盲目测试、自测通过才能说完成"
334
+ }
335
+ }
336
+ ```
337
+
338
+ </details>
339
+
340
+ ## 🇨🇳 中国大陆用户
341
+
342
+ 首次运行自动下载 Embedding 模型(~200MB),如果慢:
343
+
344
+ ```bash
345
+ export HF_ENDPOINT=https://hf-mirror.com
346
+ ```
347
+
348
+ 或在 MCP 配置中加 env:
349
+
350
+ ```json
351
+ {
352
+ "env": { "HF_ENDPOINT": "https://hf-mirror.com" }
353
+ }
354
+ ```
355
+
356
+ ## 📦 技术栈
357
+
358
+ | 组件 | 技术 |
359
+ |------|------|
360
+ | 运行时 | Python >= 3.10 |
361
+ | 向量数据库 | SQLite + sqlite-vec |
362
+ | Embedding | ONNX Runtime + intfloat/multilingual-e5-small |
363
+ | 分词器 | HuggingFace Tokenizers |
364
+ | 协议 | Model Context Protocol (MCP) |
365
+ | Web | 原生 HTTPServer + Vanilla JS |
366
+
367
+ ## 📋 更新日志
368
+
369
+ ### v0.2.4
370
+
371
+ - 🔇 Stop hook prompt 改为直接指令,消除 Claude Code 重复回复
372
+ - 🛡️ Steering 规则 auto_save 规范增加短路防护,会话结束场景跳过其他规则
373
+ - 🐛 `_copy_check_track_script` 幂等性修复(返回变更状态避免误报"已同步")
374
+ - 🐛 issue_repo delete 中 `row.get()` 对 `sqlite3.Row` 不兼容修复(改用 `row.keys()` 判断)
375
+ - 🐛 Web 看板项目选择页面滚动修复(项目多时无法滚动)
376
+ - 🐛 Web 看板 CSS 污染修复(strReplace 全局替换导致 6 处样式异常)
377
+ - 🔄 Web 看板所有 confirm() 弹窗替换为自定义 showConfirm 模态框(记忆/问题/标签/项目删除)
378
+ - 🔄 Web 看板删除操作增加 API 错误响应处理(toast 提示替代 alert)
379
+ - 🧹 `.gitignore` 补充 `.devmemory/` 旧版残留目录忽略规则
380
+ - 🧪 pytest 临时项目数据库残留自动清理(conftest.py session fixture)
381
+
382
+ ### v0.2.3
383
+
384
+ - 🛡️ PreToolUse Hook:Edit/Write 前强制检查 track issue,无活跃问题则拒绝执行(Claude Code / Kiro / OpenCode 三端支持)
385
+ - 🔌 OpenCode 插件升级为 `@opencode-ai/plugin` SDK 格式(tool.execute.before hook)
386
+ - 🔧 `run install` 自动部署 check_track.sh 检查脚本并动态填充路径
387
+ - 🐛 issue_repo archive/delete 中 `row.get()` 对 `sqlite3.Row` 不兼容修复
388
+ - 🐛 session_id 从 DB 读取最新值再递增,避免多实例竞态
389
+ - 🐛 track date 参数格式校验(YYYY-MM-DD)+ issue_id 类型校验
390
+ - 🐛 Web API 请求解析安全加固(Content-Length 校验 + 10MB 上限 + JSON 异常捕获)
391
+ - 🐛 Tag 过滤 scope 逻辑修复(`filter_dir is not None` 替代 falsy 判断)
392
+ - 🐛 Export 向量数据 struct.unpack 字节长度校验
393
+ - 🐛 Schema 版本化迁移(schema_version 表 + v1/v2/v3 增量迁移)
394
+ - 🐛 `__init__.py` 版本号同步修复
395
+
396
+ ### v0.2.2
397
+
398
+ - 🔇 Web 看板 `--quiet` 参数屏蔽请求日志
399
+ - 🔄 Web 看板 `--daemon` 参数后台运行(macOS/Linux)
400
+ - 🔧 `run install` MCP 配置生成修复(sys.executable + 完整字段)
401
+ - 📋 问题跟踪增删改归档(Web 看板添加/编辑/归档/删除 + 记忆关联)
402
+ - 👆 全部列表页点击行任意位置弹出编辑弹窗(记忆/问题/标签)
403
+ - 🛡️ Hook 链式触发防护(agentStop + promptSubmit 组合不再重复注入规则)
404
+ - 🔒 会话延续/上下文转移时阻塞规则强制生效(跨会话必须重新确认)
405
+
406
+ ### v0.2.1
407
+
408
+ - ➕ Web 看板前端添加项目(目录浏览器 + 手动输入)
409
+ - 🏷️ 标签跨项目污染修复(标签操作限定当前项目 + 全局记忆范围)
410
+ - 📐 弹窗分页省略号截断 + 弹窗宽度 80%
411
+ - 🔌 OpenCode install 自动生成 auto_save 插件(session.idle 事件触发)
412
+ - 🔗 Claude Code / Cursor / Windsurf install 自动生成 Hooks 配置(会话结束自动保存)
413
+ - 🎯 Web 看板交互体验补全(Toast 操作反馈、空状态引导、导出/导入工具栏)
414
+ - 🔧 统计概览卡片点击跳转(点击记忆数/问题数直接弹窗查看)
415
+ - 🏷️ 标签管理页区分项目/全局标签来源(📁/🌐 标记)
416
+ - 🏷️ 项目卡片标签数合并全局记忆标签
417
+
418
+ ### v0.2.0
419
+
420
+ - 🔐 Web 看板 Token 认证机制
421
+ - ⚡ Embedding 向量缓存,相同内容不重复计算
422
+ - 🔍 recall 支持 query + tags 组合查询
423
+ - 🗑️ forget 支持批量删除(memory_ids 参数)
424
+ - 📤 记忆导出/导入(JSON 格式)
425
+ - 🔎 Web 看板语义搜索
426
+ - 🗂️ Web 看板项目删除按钮
427
+ - 📊 Web 看板性能优化(消除全表扫描)
428
+ - 🧠 digest 智能压缩
429
+ - 💾 session_id 持久化
430
+ - 📏 content 长度限制保护
431
+ - 🏷️ version 动态引用(不再硬编码)
432
+
433
+ ### v0.1.x
434
+
435
+ - 初始版本:7 个 MCP 工具、Web 看板、3D 向量可视化、多语言支持
436
+
437
+ ## License
438
+
439
+ MIT