随手记文献要点,模型审阅后汇总成 Word
29.9/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/1 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add FeC3-pearlite/bearing-notes该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:待复验
是什么
dsh 原生插件 · tool
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 35 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
读写/删除本地文件发起外部网络请求
查看扫描证据(共 43 处,展示前 43 条)
- 写入本地文件index.js:124
mkdirSync(dataDir, { recursive: true }) - 读取本地文件index.js:288
docxExists: existsSync(store.docxPath), - 发起网络请求lib/client.js:98
const res = await fetch(ROUTE + (action ? '/' + action : ''), { - 写入本地文件lib/store.mjs:32
mkdirSync(dir, { recursive: true }) - 读取本地文件lib/store.mjs:37
if (!existsSync(this.jsonlPath)) return [] - 读取本地文件lib/store.mjs:39
for (const line of readFileSync(this.jsonlPath, 'utf8').split('\n')) { - 写入本地文件lib/store.mjs:71
appendFileSync(this.jsonlPath, JSON.stringify(note) + '\n', 'utf8') - 写入本地文件lib/store.mjs:107
writeFileSync(tmp, this.notes.map((n) => JSON.stringify(n)).join('\n') + '\n', 'utf8') - 写入本地文件lib/store.mjs:108
renameSync(tmp, this.jsonlPath) - 写入本地文件lib/store.mjs:114
writeFileSync(this.indexPath, JSON.stringify({ title: this.title, updatedAt: nowIso(), count: index.length, notes: index }, null, 2), 'utf8') - 写入本地文件lib/store.mjs:150
writeFileSync(this.docxPath, buf) - 读取本地文件sync-install.mjs:41
if (!existsSync(profile)) { - 读取本地文件sync-install.mjs:45
if (!existsSync(target)) { - 读取本地文件sync-install.mjs:50
const sha = (path) => createHash('sha256').update(readFileSync(path)).digest('hex').slice(0, 12) - 读取本地文件sync-install.mjs:55
if (!existsSync(from)) { console.log(`MISSING ${rel}`); continue } - 读取本地文件sync-install.mjs:56
const before = existsSync(to) ? sha(to) : '-' - 写入本地文件sync-install.mjs:57
mkdirSync(dirname(to), { recursive: true }) - 写入本地文件sync-install.mjs:58
copyFileSync(from, to) - 读取本地文件sync-install.mjs:65
console.log(`workspace mtime ${statSync(join(here, 'index.js')).mtime.toISOString()}`) - 读取本地文件test-client.mjs:32
const source = readFileSync(join(here, 'lib/client.js'), 'utf8') - 读取本地文件test-cordis.mjs:28
const asarPath = ASAR_CANDIDATES.find((candidate) => existsSync(candidate)) - 读取本地文件test-cordis.mjs:39
const fd = readFileSync(asarFile) - 写入本地文件test-cordis.mjs:71
mkdirSync(dirname(out), { recursive: true }) - 写入本地文件test-cordis.mjs:72
writeFileSync(out, fd.subarray(baseOffset + file.offset, baseOffset + file.offset + file.size)) - 删除本地文件递归test-cordis.mjs:85
rmSync(runtimeDir, { recursive: true, force: true }) - 删除本地文件递归test-cordis.mjs:96
rmSync(dataDir, { recursive: true, force: true }) - 发起网络请求test-cordis.mjs:240
const unreachable = await fetch(base + '/bearing-notes/nope').then((r) => r.status) - 发起网络请求test-cordis.mjs:242
const res = await fetch(base + '/bearing-notes/review', { - 读取本地文件test-cordis.mjs:264
check('the data directory is not removed by teardown', existsSync(dataDir)) - 写入本地文件test-docx.mjs:65
writeFileSync(process.argv[2] || 'notes-test.docx', buf) - 删除本地文件递归test-host.mjs:13
rmSync(dataDir, { recursive: true, force: true }) - 发起网络请求test-host.mjs:168
const res = await fetch(base + path, { - 读取本地文件test-host.mjs:202
check('docx exists on disk', existsSync(json?.docxPath), json?.docxPath) - 读取本地文件test-host.mjs:203
const buf = readFileSync(json.docxPath) - 读取本地文件test-host.mjs:255
const buf = readFileSync(json.docxPath) - 读取本地文件test-host.mjs:275
check('docx still exists', existsSync(json.docxPath)) - 读取本地文件test-host.mjs:313
const buf = readFileSync(dataDir + '/notes.jsonl', 'utf8').trim().split('\n') - 读取本地文件test-host.mjs:318
check('index.json written', existsSync(dataDir + '/index.json')) - 删除本地文件递归test-store.mjs:9
rmSync(dir, { recursive: true, force: true }) - 读取本地文件test-store.mjs:20
console.log('added=' + a.note.id + ' total=' + a.total + ' docx=' + existsSync(a.docx)) - 删除本地文件递归test-translate.mjs:20
rmSync(dataDir, { recursive: true, force: true }) - 发起网络请求test-translate.mjs:220
const response = await fetch(`${base}${ROUTE_PREFIX}/${action}`, { - 发起网络请求test-translate.mjs:230
const response = await fetch(`${base}${ROUTE_PREFIX}/glossary`)
扫描于 2026/11/3(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
功能亮点
- 笔记汇总到Word
- 模型审阅笔记
- 提示相关知识
DeepSeek Harness 文献笔记插件:笔记汇总到一个 Word,右侧栏调用模型审阅并提示相关知识(轴承钢滚动接触疲劳)
README
由 DeepSeek 最新模型翻译生成bearing-notes · 文献知识库插件
给 DeepSeek Harness(dsh)写的文献笔记插件:读文献时随手记下对自己有用的知识,所有笔记统一汇总到一个 Word 文档里随时调阅;右侧栏会调用模型审阅笔记写得对不对,并提示相关知识。
为「轴承钢滚动接触疲劳」这个方向做的,但领域知识包(概念地图、高频错误清单、审阅提示词)就是 lib/domain.mjs 一个文件,换成别的方向只改它。
- 插件包名:@local/bearing-notes
- Host 半注册路由:/bearing-notes
- 数据落地:notes.jsonl(追加式真相)+ index.json + 编译出的 .docx
功能
1. 随手记:标题 / 文献来源 / 标签 / 正文(Markdown),正文为空不允许保存。
2. 审阅并提示:把草稿交给模型,按四节返回反馈——准确性审阅(逐条判断正确 / 不准确 / 存疑并给出正确表述)、遗漏与风险、相关知识延伸、建议追读。
提示词里内置了该领域的概念地图和常见错误清单(比如 GCr15 的碳化物类型、把 L10 寿命当整体寿命之类),所以审阅不是泛泛而谈。
3. 汇总到 Word:笔记连同屏幕上的审阅追加进同一个 Word 文档;已保存的笔记可以点开重新审阅,再写回 Word。
展开完整文档(README 剩余 1 节)
bearing-notes · 文献知识库插件
给 DeepSeek Harness(dsh)写的文献笔记插件:读文献时随手记下对自己有用的知识,所有笔记统一汇总到一个 Word 文档里随时调阅;右侧栏会调用模型审阅笔记写得对不对,并提示相关知识。
为「轴承钢滚动接触疲劳」这个方向做的,但领域知识包(概念地图、高频错误清单、审阅提示词)就是 lib/domain.mjs 一个文件,换成别的方向只改它。
- 插件包名:@local/bearing-notes
- Host 半注册路由:/bearing-notes
- 数据落地:notes.jsonl(追加式真相)+ index.json + 编译出的 .docx
功能
1. 随手记:标题 / 文献来源 / 标签 / 正文(Markdown),正文为空不允许保存。
2. 审阅并提示:把草稿交给模型,按四节返回反馈——准确性审阅(逐条判断正确 / 不准确 / 存疑并给出正确表述)、遗漏与风险、相关知识延伸、建议追读。
提示词里内置了该领域的概念地图和常见错误清单(比如 GCr15 的碳化物类型、把 L10 寿命当整体寿命之类),所以审阅不是泛泛而谈。
3. 汇总到 Word:笔记连同屏幕上的审阅追加进同一个 Word 文档;已保存的笔记可以点开重新审阅,再写回 Word。
4. 入口:会话标题栏的一个按钮,或右侧栏 + 新建标签菜单里的「文献知识库」。
数据落地方式是「JSONL 是唯一真相」:逐条追加,崩溃也不会丢;Word 每次改动后由 JSONL 重新编译,所以 Word 永远可以从源头重建。
组成
| 文件 | 作用 |
| index.js | Host 半:注册 /bearing-notes 路由、读写笔记、编译 Word、调用模型审阅 |
| lib/client.js | 浏览器半:右侧栏标签页(sidebar.right.pane.tab)+ 会话标题栏入口按钮 |
| lib/docx.mjs | 零依赖 .docx(WordprocessingML)生成与读取 |
| lib/store.mjs | 笔记存储:notes.jsonl 追加式真相 + index.json + 编译 Word |
| lib/domain.mjs | 领域知识包:概念地图、高频错误清单、审阅提示词 |
| cordis.patch.yml | 把插件行插入 profile 的 loader 补丁 |
Host 半和浏览器半都是手写 JS,没有构建步骤:客户端 bundle 直接由 dsh 从 lib/client.js 读取并以 /plugins/??<包名>/client.js&rev=<rev> 提供给浏览器。
安装到 dsh
插件是标准的 dsh bundle:package.json 声明 dsh.bundle.patch 和 dsh.client,补丁往 profile 的 loader 树里插一行。推荐用官方工具装(需要完全权限会话):
plugin_manager { action: "install_bundle", target: "<本仓库绝对路径>" }
装完 dsh 会把它作为 bundle 层登记进 profile 的 package.json,并把包按 files 白名单复制到 <profile>/node_modules/@local/bearing-notes。
手工等价安装(工具不可用时):在 profile 的 package.json 里加 "@local/bearing-notes": "file:<本仓库绝对路径>" 依赖与同名 bundle 层,然后 pnpm install。无论哪种方式,运行时读的都是 profile 里那份副本,不是这个工作目录。
改完代码同步副本:
node sync-install.mjs <profileDir> # 也可以只跑 node sync-install.mjs,读 $DSH_PROFILE_DIR
重要:改 Host 半(index.js / lib/*.mjs)之后必须重启 dsh。 客户端 bundle 会热更新,Host 模块不会——ESM 按 URL 缓存,同一路径不会重新导入。
配置
在 loader 行的 config 里覆盖(sync-install.mjs 与 cordis.patch.yml 里都能改):
- id: bearing-notes
name: '@local/bearing-notes'
config:
dataDir: '<数据目录>' # 默认按作者机器设置,换机器请改 docxFile: '轴承钢滚动接触疲劳-文献知识库.docx' docxTitle: '轴承钢滚动接触疲劳 · 文献知识库' provider: '' # 留空 = 先用本组合的默认模型路由 model: '' # 留空 = 跟随该路由的 model maxOutputTokens: 4096 # 调用时作为 maxTokens
审阅调用的 provider/model 按这个顺序解析:config 里显式的 provider+model →
本组合的默认模型路由(agentDefaultModel.currentSelection(),也就是你日常会话在用的那个)→
第一个已注册 provider 的第一个模型。用 ctx.get() 读默认路由,所以组合里没有这个服务也能加载。
写 dsh 插件踩过的两个坑
这两个坑的共同点是:插件看起来装好了(客户端 bundle 能取到、测试全绿),但 Host 半从未激活,路由一直 404。
1. inject 只能是数组或「服务名 → 配置」映射。 写成 export const inject = { optional: ['webServer', 'llm'] } 等于声明依赖一个名叫 optional 的服务——它永远不出现,插件就永远躺着不动。正确写法是 export const inject = ['webServer', 'llm'];想可选就在 apply 里用
ctx.inject([...], cb) 自己等。
2. Config 必须是 Standard Schema 校验器。 Loader 会调用
Config['~standard'].validate(config),把普通默认值对象导出成 Config 会直接 TypeError,插件同样不激活。本插件手写了一个最小的 ~standard(填默认值 + 校验字段类型),不需要任何依赖。
顺带两条容易写错的 dsh API:模型流事件是 { type: 'text-delta', text } …
{ type: 'finish', reason: { kind } }(不是 kind/finish),输出上限字段是 maxTokens(不是 maxOutputTokens),且 ctx.llm.stream() 必须给确切 model;客户端往 single 座位(如 conversation.session.header.corner,已被自带按钮占用)注册第二个组件会抛错,入口按钮要用 conversation.session.header.utilities 这类 list 座位。
第 4 个坑不那么显眼:「第一个已注册的 provider」不等于「你会话在用的 provider」。本机同时注册了 deepseek-official(没配 API key)和 deepseek-account(账号登录在用),按注册顺序取第一个,审阅会直接失败在 MISSING_CREDENTIAL。跟随组合默认路由(ctx.get('agentDefaultModel').currentSelection())才是对的——ctx.get() 不需要 inject,所以组合里没有这个服务时插件照样能加载。
测试
node test-docx.mjs # Word 生成 + 回读
node test-store.mjs # 笔记存储 + 持久化
node test-host.mjs # Host 半:真实 HTTP 52 项断言
node test-client.mjs # 浏览器半:注册契约 57 项断言
node test-cordis.mjs # 用 dsh 自带的 Cordis 真实挂载:激活 + 注入 + 流协议
test-cordis.mjs 会从已安装 dsh 的 app.asar 里取出它实际使用的 Cordis 运行时(DSH_ASAR 环境变量可覆盖路径),用真实运行时挂载本插件,覆盖 test-host.mjs 看不到的声明形状问题,并把上面两个坑都留成回归断言。
已知限制
- Word 只用了 WordprocessingML 的最小集(标题 / 正文 / 项目符号 / 加粗 / 斜体 / 等宽),没有表格、图片、目录域(目录是手写的段落列表,不含页码)。
- 审阅质量取决于所配模型。
- 侧栏渲染效果没有做浏览器内的自动化视觉验证。
License
MIT预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
FeC3-pearlite/bearing-notes
随手记文献要点,模型审阅后汇总成 Word
相关插件 · 工具 / 效率
破甲管控台kingcharleslzy-ai/dsh-purge
dsh-purge Community · DeepSeek Harness 社区维护版:宿主兼容、状态诊断、提示词管理、更新与本机备份回滚。基于小杨 / YuJunZhiXue 的 dsh-purge。
★ 4,330已汉化DeepSeek 客户端
74.5
网文长卷lingfengQAQ/webnovel-writer
基于 Claude Code 的长篇网文辅助创作系统,解决 AI 写作中的「遗忘」和「幻觉」问题,支持 200…
★ 7,826已汉化DSH
72.2
花束设计alchaincyf/huashu-design
一句话生成网页、原型、PPT 与信息图等可交付设计
★ 28,638已汉化DSH
71.7
多智能体协作HKUDS/AutoSwarm
AutoSwarm: Unify Your Agents. Unify Your Context (Codex · Claude Code · DeepSeek Harness · Muse · Grok · WorkBuddy· nanobot · and more)
★ 2,349已汉化DSH
71.6
Vox 拼贴视频生成Alisa0808/vox-director
🎬 Vox Director拼贴动效导演
★ 2,129已汉化DSH
71.4
Agent 演化引擎Q00/ouroboros
智能体 OS:智能体自己变聪明,我们只守住底线:面试准入、分阶段评估、带预算的进化循环。MCP 服务器,14 种运行时:Claude Code、Codex CLI、Gemini CLI、OpenCode、Copilot、Kiro 等。
★ 6,311已汉化DSH
71.4
这是你的仓库?认领条目