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

文献笔记 FeC3-pearlite/bearing-notes

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

随手记文献要点,模型审阅后汇总成 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
装得上吗
曾在 dsh 0.2.0-rc.2 下真实安装成功,但当前 dsh 已更新至 0.2.1-rc.5,本站尚未在新版下复验
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 35 天前
档位由哪些信号合成

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

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

随手记文献要点,模型审阅后汇总成 Word

这是你的仓库?认领条目

回到顶部