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

置顶便签 121212165/dsh-plugin-pinboard

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

dsh 插件:跨会话留言板,置顶笔记注入每个会话的系统提示词(/pin /unpin /pins + pin_add)

30.7/100
综合分
1
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/18 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

自动兼容检查有告警:未发布到 npm registry,仅可从源码安装。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add 121212165/dsh-plugin-pinboard
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:仅索引
是什么
dsh 原生插件 · chat
装得上吗
静态安装检查有提示项,装前建议看一眼 README
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 17 天前
档位由哪些信号合成

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

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查⚠ 装前注意

未发布到 npm registry,仅可从源码安装

展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✗npm 包dsh-plugin-pinboard(未发布到 npm,仅可源码安装)
✓Node 引擎要求 >=22.18 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/8 09:41:15

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

读写/删除本地文件
查看扫描证据(共 26 处,展示前 24 条)
  • 读取本地文件
    lib/plugin.js:41
    if (Date.now() - statSync(lockPath).mtimeMs > LOCK_STALE_MS)
  • 删除本地文件
    lib/plugin.js:42
    unlinkSync(lockPath);
  • 删除本地文件
    lib/plugin.js:53
    unlinkSync(lockPath);
  • 读取本地文件
    lib/plugin.js:67
    if (!existsSync(this.path))
  • 读取本地文件
    lib/plugin.js:69
    return parseLibrary(readFileSync(this.path, 'utf8')).items;
  • 写入本地文件
    lib/plugin.js:72
    mkdirSync(dirname(this.path), { recursive: true });
  • 写入本地文件
    lib/plugin.js:75
    writeFileSync(tmp, items.map((item) => JSON.stringify(item)).join('\n') + '\n', 'utf8');
  • 写入本地文件
    lib/plugin.js:76
    renameSync(tmp, this.path);
  • 写入本地文件
    lib/plugin.js:81
    mkdirSync(dirname(this.path), { recursive: true });
  • 读取本地文件
    lib/plugin.js:169
    if (existsSync(store.path))
  • 读取本地文件
    lib/plugin.js:170
    skipped = parseLibrary(readFileSync(store.path, 'utf8')).skipped;
  • 读取本地文件
    lib/plugin.js:226
    if (!existsSync(source)) {
  • 读取本地文件
    src/plugin.ts:84
    if (Date.now() - statSync(lockPath).mtimeMs > LOCK_STALE_MS) unlinkSync(lockPath);
  • 删除本地文件
    src/plugin.ts:84
    if (Date.now() - statSync(lockPath).mtimeMs > LOCK_STALE_MS) unlinkSync(lockPath);
  • 删除本地文件
    src/plugin.ts:95
    unlinkSync(lockPath);
  • 读取本地文件
    src/plugin.ts:111
    if (!existsSync(this.path)) return [];
  • 读取本地文件
    src/plugin.ts:112
    return parseLibrary(readFileSync(this.path, 'utf8')).items;
  • 写入本地文件
    src/plugin.ts:116
    mkdirSync(dirname(this.path), { recursive: true });
  • 写入本地文件
    src/plugin.ts:119
    writeFileSync(tmp, items.map((item) => JSON.stringify(item)).join('\n') + '\n', 'utf8');
  • 写入本地文件
    src/plugin.ts:120
    renameSync(tmp, this.path);
  • 写入本地文件
    src/plugin.ts:126
    mkdirSync(dirname(this.path), { recursive: true });
  • 读取本地文件
    src/plugin.ts:209
    if (existsSync(store.path)) skipped = parseLibrary(readFileSync(store.path, 'utf8')).skipped;
  • 读取本地文件
    src/plugin.ts:209
    if (existsSync(store.path)) skipped = parseLibrary(readFileSync(store.path, 'utf8')).skipped;
  • 读取本地文件
    src/plugin.ts:261
    if (!existsSync(source)) {
扫描于 2026/11/3(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-base@deepseek-ai/dsh-system-prompt@deepseek-ai/schemastery@deepseek-ai/dsh-tools
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 跨会话留言板
  • 置顶笔记注入系统提示词
  • 支持置顶与取消置顶

README

由 DeepSeek 最新模型翻译生成
dsh-plugin-pinboard 🧩 dsh 插件家族(22 件):总目录 dsh-plugin-family | 明星插件:ide-hub 跨 IDE 统一管理 · task-forge 跨窗口无损交接 · quota 实时用量仪表 EN · 跨会话置顶便签:/pin 存一条便签,置顶的便签会进入每个会话的系统提示,并受硬预算约束(limit × maxChars,段落顺序 700,因此工具段落从 1000 之后开始);pin_add 让模型自己置顶。从 v0.2 起,它还承载 fact-vault 的可检索库(/facts、fact_search)——存在同一个文件里,带标签,并且刻意永不注入。· 22 个 node --test 全绿 · 两个真实无头会话证明:会话 A 写入的便签会出现在会话 B 的提示词日志里 · 坏配置(limit: -1)在启动时失败并点名 pinboard,而不是把 harness 拖垮。 DeepSeek Harness (dsh) 插件:跨会话置顶便签。在任何会话里 /pin 一次,这条便签就会注入之后每一个会话的系统提示——不用重复交代,不用改 agent 配置文件。 适合回答:"我怎么让 dsh 永远记住'回答用中文''别动 main 分支'这类长期约定?
展开完整文档(README 剩余 1 节)
dsh-plugin-pinboard

🧩 dsh 插件家族(22 件):总目录 dsh-plugin-family | 明星插件:ide-hub 跨 IDE 统一管理 · task-forge 跨窗口无损交接 · quota 实时用量仪表

EN · 跨会话置顶便签:/pin 存一条便签,置顶的便签会进入每个会话的系统提示,并受硬预算约束(limit × maxChars,段落顺序 700,因此工具段落从 1000 之后开始);pin_add 让模型自己置顶。从 v0.2 起,它还承载 fact-vault 的可检索库(/facts、fact_search)——存在同一个文件里,带标签,并且刻意永不注入。· 22 个 node --test 全绿 · 两个真实无头会话证明:会话 A 写入的便签会出现在会话 B 的提示词日志里 · 坏配置(limit: -1)在启动时失败并点名 pinboard,而不是把 harness 拖垮。

DeepSeek Harness (dsh) 插件:跨会话置顶便签。在任何会话里 /pin 一次,这条便签就会注入之后每一个会话的系统提示——不用重复交代,不用改 agent 配置文件。

适合回答:"我怎么让 dsh 永远记住'回答用中文''别动 main 分支'这类长期约定?"

同系列:prompt-vault(提示词弹药库,手动发送)· session-insights。与 fact-vault 的关系(v0.2 起):它的表面已并到这里——同一套动词、同一套 #标签 语法、同一套打分(标签 3 分 / 正文 1 分),只是存进同一个 pins.jsonl。分工本来就靠消费方式:便签"每次都直接告诉模型",事实"模型自己去查"。审计指出 fact-vault 的病是"存了没有消费端",所以这里把事实条目明确排除在注入预算之外,靠 /facts find 与 fact_search 取用;搬家用 /facts import(只读源文件)。

用法

- /pin <一句话> [#标签…]:置顶一条便签(多余空白压成单行;重复内容不重复入库)。标签是元数据,不进注入正文,只用于列表与检索。
- /facts save|find|list|rm|import:事实库(存下来供检索,不注入)。save 事实 #标签 / find 关键词 / rm <id>;import [--from <路径>] 一次性搬 ~/.dsh/fact-vault/facts.jsonl——只读源文件,重复跳过、坏行计数,源文件字节不动。
- /unpin <id>:取消置顶(# 前缀可带可不带)。
- /pins:列出全部便签,● 表示真的会注入、○ 表示因超出条数/字符上限被挤出去了。
- pin_add 工具:模型自己置顶——只在用户明确说"记住/以后都"时调用,返回值会告知是否进入了注入预算。

- fact_search 工具:模型自查事实库(标签命中 3 分、正文命中 1 分)。回答"我们之前定过/查过 X 吗"之前先调它,而不是凭记忆答——这条消费端正是 fact-vault 缺的。

配置

| 字段 | 默认 | 说明 |
| enabled | true | |
| dataPath | ~/.dsh/pinboard/pins.jsonl | 便签与事实共用的单文件库 |
| limit / maxChars | 12 / 1200 | 注入预算:只算便签,事实永远不占额度 |
| order | 700 | 注入段在系统提示里的位置 |
| factLimit | 10 | /facts find 与 fact_search 最多打印几条命中 |
| factsPath | ~/.dsh/fact-vault/facts.jsonl | /facts import 的默认源文件 |

order / factLimit / factsPath 走启动自检:填错即启动失败并点名 pinboard。

便签存为 ~/.dsh/pinboard/pins.jsonl(按月不切分,单文件)。注入通过 ctx.systemPrompt.section(),段落文本是每次组装时求值的 provider,所以中途新增的便签下一回合就生效,不需要重启 dsh。

注入预算(关键设计)

便签会长期占系统提示,所以预算是硬的:

| 字段 | 默认 | 说明 |
| enabled | true | 关掉则完全不注册命令与段落 |
| dataPath | ~/.dsh/pinboard/pins.jsonl | 便签文件 |
| limit | 12 | 最多注入几条 |
| maxChars | 1200 | 注入行的总字符上限(不含段落标题) |
| order | 700 | 系统提示段落顺序(官方工具段落从 1000 起,700 在策略段之后、工具段之前) |

选择规则:按 at 倒序(最新优先),逐条累加字符,装不下就停。唯一一条超长时截断而不是丢弃(末尾加 …),保证最新一条一定到达。

注入段落形态:

置顶便签(pinboard)用户置顶的持久指令,跨所有会话生效,优先于临时对话中的同类约定:
- 一律使用中文回答
- 代码注释也使用中文

安装

三步,实测于 @deepseek-ai/dsh@0.1.7-alpha.1(需 pnpm 在 PATH 上):

① 装进 profile:dsh plugin 把参数原样转发给 pnpm,git 包会自动跑 prepare 构建 lib/
dsh plugin --profile web add github:121212165/dsh-plugin-pinboard

② 把本仓库根目录 cordis.patch.yml 的内容并进 $DSH_HOME/profiles/web/cordis.patch.yml。
该文件默认是 [],所以要么整份替换,要么把 insert 条目并进同一个数组;不要直接追加——追加会形成两个 YAML 文档,启动即报 failed to parse overlay ... end of the stream or a document separator is expected(本机实测踩过)。

③ 重启 dsh。配置层与 client 半都要重启才生效(客户端按 boot 时算出的内容 rev 下发,硬刷新浏览器没用)。

自检挂载:dsh --profile web --dump-config | grep dsh-plugin-pinboard,应看到该条目。

验证状态

- 22 个 node --test 全绿:纯函数(标签切分与去重、事实不占注入预算、检索打分与排序、导入的三类计数与时间戳保留、增删/去重/容错解析/预算裁剪/截断/列表标注)+ 装配层(真实 apply() 挂 mock ctx、真临时目录驱动 /pin /unpin /pins /facts 全部动词与 pin_add fact_search 两个工具、坏动词坏参数拒绝、导入两次不翻倍、--from 覆盖配置路径、源文件字节不变)。
- 本机 live 验证:两个真实 headless 会话——A 会话由模型调用 pin_add 写入便签,B 会话的 session.v4.jsonl.zstd 里系统提示确实包含该段落(跨会话注入成立)。
- 非法配置探针:limit: -1 时启动失败并点名 pinboard (dsh-plugin-pinboard): ValidationError,不会拖垮 harness。
- 未验证:/pin 在 web UI 命令面板里的手动输入体验(headless 无输入通道,验证走的是命令 handler 直接调用)。

测试

npm run check # typecheck + node --test + tsc build

22 个测试:纯函数 + 装配层,见上「验证状态」。装配层 harness 从 dsh-plugin-task-forge 复制,本仓是家族里第二个用它跑出全套覆盖的。

装配层测试 harness 借鉴 dsh-auto-review(222★,PerryLink)的 mountHarness 方法论,node:test 版实现来自 dsh-plugin-task-forge(本家族首个装配层覆盖的插件)。
预览分享卡片长什么样 ↓121212165/dsh-plugin-pinboard
分享 · DeepSeek Harness Hub
121212165/dsh-plugin-pinboard

dsh 插件:跨会话留言板,置顶笔记注入每个会话的系统提示词(/pin /unpin /pins + pin_add)

这是你的仓库?认领条目

回到顶部