分文件夹记录对话要点,按遗忘曲线自动淡忘
30.8/100
综合分
1
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/25 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add Yixianqzm/deepseek-plastic-memory该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:已验证
是什么
dsh 原生插件 · chat
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 9 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 68 处,展示前 40 条)
- 执行外部命令来自配置/变量index.js:34
const r = spawnSync(process.execPath, [SCRIPT, ...args], { encoding: 'utf8', env, windowsHide: true }) - 读取本地文件index.js:42
for (const d of readdirSync(WS_ROOT, { withFileTypes: true })) { - 读取本地文件index.js:46
try { meta = JSON.parse(readFileSync(metaPath, 'utf8')) } catch {} - 写入本地文件index.js:57
mkdirSync(dir, { recursive: true }) - 写入本地文件index.js:59
writeFileSync(join(dir, 'meta.json'), JSON.stringify(meta, null, 1), 'utf8') - 写入本地文件index.js:97
mkdirSync(dir, { recursive: true }) - 写入本地文件index.js:99
appendFileSync(join(dir, 'notes.md'), id + '|' + Date.now() + '|' + flag + '|' + body + String.fromCharCode(10), 'utf8') - 读取本地文件index.js:103
const readJson = (p, d) => { try { return JSON.parse(readFileSync(p, 'utf8')) } catch { return d } } - 读取本地文件index.js:112
if (existsSync(p)) n = readFileSync(p, 'utf8').split('\n').filter(Boolean).length - 读取本地文件index.js:112
if (existsSync(p)) n = readFileSync(p, 'utf8').split('\n').filter(Boolean).length - 读取本地文件index.js:123
const rows = existsSync(p) ? readFileSync(p, 'utf8').split('\n').filter(Boolean).map((l) => { - 写入本地文件index.js:139
mkdirSync(home, { recursive: true }) - 写入本地文件index.js:140
writeFileSync(join(home, '_pending.json'), JSON.stringify(rows, null, 1), 'utf8') - 删除本地文件index.js:217
try { rmSync(CLASSIFY_FILE, { force: true }); return true } catch { return false } - 发起网络请求client.js:12
const get = (p, scope) => fetch(API + p + (p.includes('?') ? '&' : q(scope))).then((r) => r.json()) - 发起网络请求client.js:13
const postJson = (p, body, scope) => fetch(API + p + q(scope), { - 发起网络请求client.js:462
fetch('/api/memory-sky/open', { - 发起网络请求client.js:500
fetch('/api/memory-sky/open', { - 读取本地文件sky.js:18
const readJson = (p, d) => { try { return JSON.parse(readFileSync(p, 'utf8').replace(/^ FEFF/, '')) } catch { return d } } - 读取本地文件sky.js:29
for (const d of readdirSync(WS_ROOT, { withFileTypes: true })) { - 读取本地文件sky.js:46
if (!existsSync(p)) return [] - 读取本地文件sky.js:47
return readFileSync(p, 'utf8').replace(/^ FEFF/, '').split('\n').filter(Boolean).map((line) => { - 写入本地文件sky.js:55
mkdirSync(dirname(p), { recursive: true }) - 写入本地文件sky.js:56
writeFileSync(p, rows.map((r) => [r.id, r.ts, r.flag, r.text].join('|')).join('\n') + (rows.length ? '\n' : ''), 'utf8') - 写入本地文件sky.js:131
mkdirSync(join(home, '_trash'), { recursive: true }) - 写入本地文件sky.js:133
appendFileSync(join(home, '_trash', day + '.md'), `${folder}|${rows[i].ts}|${rows[i].flag || '-'}|${rows[i].text}|sky-delete\n`, 'utf8') - 写入本地文件sky.js:158
mkdirSync(sink, { recursive: true }) - 写入本地文件sky.js:166
appendFileSync(file, head + rows.map((r) => f.k + '|' + r.ts + '|' + (r.flag || '-') + '|' + r.text + '|rm-folder').join('\n') + '\n', 'utf8') - 删除本地文件递归sky.js:169
try { rmSync(join(home, f.k), { recursive: true, force: true }) } catch {} - 读取本地文件sky.js:182
if (!existsSync(target)) return { ok: false, error: '没有这个工作区' } - 读取本地文件sky.js:203
const path = EDGE_CANDIDATES.find((p) => existsSync(p)) - 执行外部命令来自配置/变量sky.js:211
const child = spawn(info.path, ['--new-window', url], { detached: true, stdio: 'ignore', windowsHide: false }) - 执行外部命令固定命令sky.js:224
child = spawn('winget', ['install', '--id', 'Microsoft.Edge', '-e', '--silent', '--accept-package-agreements', '--accept-source-agreements'], { window - 删除本地文件sky.js:311
try { rmSync(join(homeOf('global'), '_classify.json'), { force: true }) } catch {} - 发起网络请求public/sky/app.js:1737
const r = await fetch(`${API}/folder/rm`, { - 发起网络请求public/sky/app.js:1762
const r = await fetch(`${API}/folder`, { - 发起网络请求public/sky/app.js:1821
const r = await fetch(`${API}/pin`, { - 发起网络请求public/sky/app.js:1831
const r = await fetch(`${API}/del`, { - 发起网络请求public/sky/app.js:1854
const r = await fetch(`${API}/save`, { - 发起网络请求public/sky/app.js:1898
const r = await fetch(`${API}/pin`, {
扫描于 2026/11/2(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
给 AI 用的长期记忆:分文件夹存,久了会自己淡忘
README
由 DeepSeek 最新模型翻译生成可塑性记忆
给 AI 用的小记忆本。存在你自己硬盘上,分文件夹放,时间久了会自己淡忘。
解决什么问题
跟 AI 聊久了,它记不住你;全塞进对话里,又贵又乱。
所以拆开:主人、约定、续缘、喜好、时间线,一块一个文件夹。用哪块翻哪块,别的不用动。聊出新话题(工作、家人、兴趣、宠物)就再开一块,最多 15 块。
怎么用
node memtree.mjs init # 建目录
node memtree.mjs idx # 一行看全貌:M主人:3 P约定:1 ...
node memtree.mjs add M 爱吃辣 # 记一条
node memtree.mjs open M # 翻开主人这一块
装成 DSH 插件:
dsh plugin add deepseek-plastic-memory
装完设置里多一页「可塑性记忆」,左边分区右边条目;会话顶栏也多个 🧠,点开是同一个面板。
不想装插件也行,当普通 node 脚本用,命令一样。
小提示:觉得有必要的时候,或者在开新会话之前,先让 DSH 把当前记忆总结一遍。
展开完整文档(README 剩余 1 节)
可塑性记忆 给 AI 用的小记忆本。存在你自己硬盘上,分文件夹放,时间久了会自己淡忘。 解决什么问题 跟 AI 聊久了,它记不住你;全塞进对话里,又贵又乱。 所以拆开:主人、约定、续缘、喜好、时间线,一块一个文件夹。用哪块翻哪块,别的不用动。聊出新话题(工作、家人、兴趣、宠物)就再开一块,最多 15 块。 怎么用 node memtree.mjs init # 建目录 node memtree.mjs idx # 一行看全貌:M主人:3 P约定:1 ... node memtree.mjs add M 爱吃辣 # 记一条 node memtree.mjs open M # 翻开主人这一块 装成 DSH 插件: dsh plugin add deepseek-plastic-memory 装完设置里多一页「可塑性记忆」,左边分区右边条目;会话顶栏也多个 🧠,点开是同一个面板。 不想装插件也行,当普通 node 脚本用,命令一样。 小提示:觉得有必要的时候,或者在开新会话之前,先让 DSH 把当前记忆总结一遍。 命令 | 敲这个 | 干这个 | | idx | 一行索引,哪个分区多少条 | | open <K> | 翻开某个分区 | | add <K> <文本> | 提交一条待审( 开头算重要) | | add-now <K> <文本> | 直接写入,跳过审批(自己写用) | | pending | 看待审队列 | | approve <id> / reject <id> | 采纳 / 驳回 | | edit <id> <文本> | 改待审内容 | | done <K> <id> | 约定办完了,标 ✓ | | rm <K> <id> | 删一条,进回收站 | | mk <名字> [父分区] | 开个新分区 | | gc | 跑一遍遗忘曲线(跑之前先自动备份) | | backups | 看有哪些备份 | | restore [名字] | 恢复到某次备份,不填就是最近一次 | 分区代号:M 主人、P 约定、C 续缘、R 喜好、T 时间线、X0..X14 自己开的。 子分区 主分区下面还能再挂一层,最多两级: node memtree.mjs mk 习惯 M node memtree.mjs add M>习惯 改代码先备份 写的时候用 M>习惯 这种写法,子分区里不能再开。 记之前先过一眼 模型想记东西不会直接落盘,先扔进待审队列。设置页「可塑性记忆」最上面就是它,每条后面三个按钮:改、驳、采纳。 你自己写走「自己写一条」,选分区填一行,直接生效。 会忘 人的记忆是刚发生清楚,过一阵模糊,再久只剩个大概。这里照着来: - 7 天内:原样留着 - 7 到 30 天:只留重要的( 开头),其余进回收站 - 30 天以上:整条进回收站 主人是谁、跟他约过什么,这两块永远不自动删。 跑之前会先备份。清完不满意就 restore 回去,恢复前又把当前状态存一份,来回切都行。备份只留最近 10 份。 东西放哪 默认 ~/.dsh/plastic-memory/,用 MEMTREE_HOME 可以改。 plastic-memory/ folders.json # 有哪些分区 M/notes.md # 一块一个文件 P/notes.md _trash/2026-10-24.md 每行 id|时间戳|标记|文本,纯文本,想手改也随便。 两个注意 - 别记密码、token、密钥、身份证、银行卡号。这就是几个纯文本文件,躺硬盘里谁都能看见。 - 装好别挪插件目录。DSH 用软链接指过来,一挪链接就断,下次启动直接崩,报的还是「Web authentication failed」这种跟真实原因没关系的话。真挪了就放回原处或重装。 更新日志 v2.1.4 - 那句提醒挪进记忆面板本体,设置页和顶栏快捷面板都能看到(之前只在设置页) v2.1.3 - 设置页和 README 都加了一句提醒:觉得有必要,或者开新会话之前,先让 DSH 总结一下当前记忆 v2.1.2 - 跑遗忘曲线先备份再清,清完告诉你备份名 - 不满意就 restore 回去:命令行 backups 看列表、restore [名字] 恢复;设置页跑完会出现「撤销清理」按钮 - 恢复前会再把当前状态存一份,来回切都行;备份只留最近 10 份 - 模型侧多了两个工具:plastic_memory_backups / plastic_memory_restore v2.1.1 - 模型自己开分区的门槛降了:不用等同类事反复出现,第一次碰到明显不是一类的东西(新兴趣、新项目、新认识的人)就先开一块 - 例子写清楚了:「喜欢研究某个东西」是兴趣,别顺手塞进「习惯」 - 分区有上限,所以意思基本对得上的就归到已有分区,只有明显不是一类才新开 v2.1.0 - 时间线改成一天一条,新的进展并进当天那条 - 命令行用 tlog,工具里写 T 也会自动并 v2.0.9 - 文档补坑:装好别挪插件目录(就是上面那一条) 更早的版本见 Releases。 License MIT
预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
Yixianqzm/deepseek-plastic-memory
分文件夹记录对话要点,按遗忘曲线自动淡忘
相关插件 · 对话 / 记忆
上下文中枢oceanbase/powercontext
上下文跟着工作走 —— 跨会话、跨智能体、跨人。
★ 1,487已汉化DSH
73
智能体记忆库plastic-labs/honcho
Honcho 是记忆基础设施,用来构建有状态的智能体。这些智能体能理解不断变化的人、智能体、群组、项目和想法。
★ 7,894已汉化DSH
71.7
长程智能体控制面loopx-project/loopx
给 Agent 一个目标,让工作持续向前。
★ 6,358已汉化DSH
71.3
智能体上下文数据库volcengine/OpenViking
给 AI 智能体用的上下文数据库
★ 41,379已汉化DSH
71.3
长效机器人团队Fei2411/DS-Bot
DS Bot 是一个基于 DeepSeek Harness简称 dsh的 bot 插件,插件将 dsh 改造为 bot…
★ 5,084已汉化DSH
71.1
可携带记忆层EverMind-AI/EverOS
为什么选择 EverOS
★ 13,778已汉化DSH
71.1
这是你的仓库?认领条目