🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

可塑性记忆 Yixianqzm/deepseek-plastic-memory

DeepSeek Harness
Yixianqzm9 天前有提交已提供中文文档扫描:含敏感能力

分文件夹记录对话要点,按遗忘曲线自动淡忘

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
装得上吗
本站已在 dsh 0.2.1-rc.2 下真实安装成功
非静态推断
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 9 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
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
预览分享卡片长什么样 ↓Yixianqzm/deepseek-plastic-memory
分享 · DeepSeek Harness Hub
Yixianqzm/deepseek-plastic-memory

分文件夹记录对话要点,按遗忘曲线自动淡忘

这是你的仓库?认领条目

回到顶部