查进程实际加载的插件构建,判断谁需重启
28.6/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/3 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add jonah791/dsh-plugin-bootreport该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:需留意
是什么
dsh 原生插件 · dev
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 42 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
⚠︎ 实装验证未通过(dependency_conflict · 2026/10/4) ——可能是验证环境差异,装前建议到 GitHub 仓库确认最近更新与 issue。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
读写/删除本地文件
查看扫描证据(共 19 处,展示前 18 条)
- 读取本地文件src/ledger.ts:70
entries = readdirSync(root) - 读取本地文件src/ledger.ts:77
if (!statSync(dir).isDirectory()) continue - 读取本地文件src/ledger.ts:78
const pkg = JSON.parse(readFileSync(join(dir, 'package.json'), 'utf8')) as { - 读取本地文件src/ledger.ts:83
for (const file of readdirSync(join(dir, 'lib'))) { - 读取本地文件src/ledger.ts:85
newest = Math.max(newest, statSync(join(dir, 'lib', file)).mtimeMs) - 写入本地文件src/ledger.ts:146
mkdirSync(dirname(path), { recursive: true }) - 写入本地文件src/ledger.ts:147
appendFileSync(path, serializeBootLine(line) + '\n', 'utf8') - 读取本地文件src/ledger.ts:152
const lines = readFileSync(path, 'utf8').split('\n').filter((l) => l.trim() !== '') - 写入本地文件src/ledger.ts:156
writeFileSync(path + '.trim', kept, 'utf8') - 写入本地文件src/ledger.ts:157
renameSync(path + '.trim', path) - 读取本地文件src/sidecar.ts:61
const st = statSync(path) - 读取本地文件src/sidecar.ts:91
st = statSync(path) - 读取本地文件src/sidecar.ts:140
return readdirSync(d) - 读取本地文件src/third-party.ts:91
const pkg = JSON.parse(readFileSync(join(profileDir, 'package.json'), 'utf8')) as { - 读取本地文件src/third-party.ts:107
const mtimeMs = Math.round(statSync(p).mtimeMs) - 读取本地文件src/third-party.ts:108
const pkg = JSON.parse(readFileSync(p, 'utf8')) as { version?: string } - 读取本地文件src/third-party.ts:129
profileNames = readdirSync(join(home, profilesDirName)) - 读取本地文件src/third-party.ts:136
if (!statSync(dir).isDirectory()) continue
扫描于 2026/11/1(0 天前) · 范围 全包扫描(包内未声明入口) · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/schemastery@deepseek-ai/dsh-tools给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
功能亮点
- 记录进程加载的插件构建
- 比对库文件修改时间
- 判断哪些插件需重启
DSH 启动自报账本:web 启动时落一行「本进程加载了哪些插件构建」,判据 lib mtime vs 进程起点,一条命令答全生态「构建是否生效 / 谁需重启」
README
由 DeepSeek 最新模型翻译生成dsh-plugin-bootreport
一句话:每次 web 启动写一行账,记下「本进程加载了哪些插件构建」,再配一个 plugin_boot_status 工具,现算「磁盘上的构建 vs 进程起点」——把「构建是否真的生效」从逐个插件的猜测,变成一个可查的账本。
为什么值得用:「重新构建 ≠ 生效」是 DSH 生态里最难自查的一类故障——产物 mtime 新,只证明构建过,不证明进程在跑它;web 侧只有 hasUnverifiedBuilds() 兜底,watch/headless 侧完全没有机制(实测:某次修复因进程启动早于产物而静默躺着不生效)。本插件把判据统一成一行账:一个观察者记账,而不是 N 个插件各自实现;一次 tail 就能回答「线上跑的是哪个构建、谁需要重启」。
展开完整文档(README 剩余 1 节)
dsh-plugin-bootreport
一句话:每次 web 启动写一行账,记下「本进程加载了哪些插件构建」,再配一个 plugin_boot_status 工具,现算「磁盘上的构建 vs 进程起点」——把「构建是否真的生效」从逐个插件的猜测,变成一个可查的账本。
为什么值得用:「重新构建 ≠ 生效」是 DSH 生态里最难自查的一类故障——产物 mtime 新,只证明构建过,不证明进程在跑它;web 侧只有 hasUnverifiedBuilds() 兜底,watch/headless 侧完全没有机制(实测:某次修复因进程启动早于产物而静默躺着不生效)。本插件把判据统一成一行账:一个观察者记账,而不是 N 个插件各自实现;一次 tail 就能回答「线上跑的是哪个构建、谁需要重启」。
能力
| 工具 | 用途 |
| plugin_boot_status | 读启动自报账本 + 现场复算:最近一次 web 启动时间(atMs/processStartMs/pid)、启动时快照、以及「现在磁盘上的构建 vs 进程起点」的实时 live/stale 清单(快照盖不住启动之后的重建);另答第三方档——thirdPartyTotal / thirdParty[](一行一条:name@version [来源档] profile= bundle= activatedAtBoot= spec=<pin>)/ thirdPartyPending[](装了但没随本次启动组合的) |
装载时(apply)本插件自行写一行账,并在 stale 非空时打 logger.warn(进程在跑旧码,重启才生效);第三方未随本次启动组合时同样告警(第三方没有构建门控,这是它唯一的生效提示,§5.23)。
账本一行 = 一次启动,plugins[] 是自研构建(走 lib-mtime vs 进程起点 判据),thirdParty[] 是第三方(走「装得早于进程起点」判据 + bundle 标记)——两档判据不同,因为第三方的产物不是我在本机构建的。
快速开始
1) 装依赖(自研插件家园 self-plugins/,在目标 profile 的 package.json 加 link 依赖):
"dsh-plugin-bootreport": "link:<工作区>/self-plugins/dsh-plugin-bootreport"
2) 挂组合(agent 预设行):
- insert:
- id: agent-plugin-bootreport
name: dsh-plugin-bootreport
config:
enabled: true
keepLines: 200
3) 30 秒验证:重启(或挂载触发的哨兵重启)后执行
tail -1 "$DSH_HOME/plugin-boot.jsonl"
期望:一行 JSON,pid 为当前 web 进程,live + stale 覆盖全部有 lib/.js 的自研插件;再调 plugin_boot_status,其 stale 应为空数组(否则就是「有构建没生效」的清单)。
配置
| 项 | 默认 | 说明 |
| enabled | true | 关掉后不写账(工具仍可读历史账) |
| keepLines | 200 | 账本保留行数(裁到有界,见不变量 I3) |
扫描根 buildRoots(home, cwd) = [<DSH_HOME>/../self-plugins, <cwd>/self-plugins, <DSH_HOME>/self-plugins]——与 dsh-agent-plugin-manager 同源约定(DSH_HOME 的上一级即工作区)。
落盘与自证(出问题时先看这里)
唯一持久产物:<DSH_HOME>/plugin-boot.jsonl(append-only,DSH_HOME 缺省 ~/.dsh)。一行 = 一次 web 启动,无 phase 字段——写入点只有一处(apply() → currentBootLine() → appendBootLine()),读取点有两处(plugin_boot_status 工具、外部审计脚本 --live)。
| 字段 | 含义 |
| atMs | 写账时刻(apply 时刻) |
| processStartMs | 进程起点:Date.now() - process.uptime()1000 反推的真实启动时刻(不是 apply 时刻——用「现在」会误判) |
| pid | 写账进程 pid |
| plugins[] | {name, version, libMtimeMs}:各插件 lib/.js 的最大 mtime |
| live[] | libMtimeMs ≤ processStartMs + 容差(容差 1000ms)⇒ 该构建正被运行 |
| stale[] | libMtimeMs > processStartMs + 容差 ⇒ 构建晚于启动,进程跑的是旧码(重启才生效) |
一条命令答五问:
tail -3 "$DSH_HOME/plugin-boot.jsonl"
① 线上跑的是哪个构建 → plugins[].libMtimeMs + version(各插件产物 mtime 即它的构建指纹) ② 谁发起 / 记了什么 → pid + processStartMs(哪一次 web 启动写的账) ③ 断在哪一段 → 无阶段枚举:账本有新行 ⇒ apply 跑到了;无新行 ⇒ 插件未挂载或未重启 ④ 结果质量 → live[] / stale[] 的划分(stale 非空即「重启才生效」清单) ⑤ 耗时与预算 → atMs - processStartMs = 启动到 apply 的间隔(读账只读尾行,O(1))
不变量(改动时不得破坏):I1 判据只用「构建时刻 vs 进程起点」,可离线复算;I2 live ∪ stale = plugins 且互斥;I3 行数有界(≤ keepLines + 50);I4 任何落盘失败都不得抛(观测绝不反噬主流程)。
已知副作用:预检 trialRun 也会落账(试运行是真实组合)。当前读取方按「尾行 = 最近启动」取,恰好正确;若一次失败的重启尝试排在真启动之后,尾行会是短命进程——读取方应先校验 pid 存活(见 docs/semantic.md §10)。
生效判据与回退
生效判据(三选一):
1. tail -1 "$DSH_HOME/plugin-boot.jsonl" 的 atMs 晚于本次重启时刻、且 pid 与当前 web 进程一致 ⇒ 本插件已装载并写了账;
2. 行为级:plugin_boot_status 可调用且返回 ok: true、total 非零 ⇒ 工具面已注册;
3. 判据级:plugin_boot_status 的实时 stale 为空 ⇒ 全生态正跑最新构建(这才是本插件存在的意义)。
注意:重新构建 ≠ 生效——产物 mtime 新只证明「构建过」,进程启动时间晚于产物 mtime 才算「在跑它」。本插件正是这条判据的仪器,所以它自己也必须按判据验收:进程起来了 ≠ 账写对了,挂载/重启后账本必须 +1 行。
回退:
- 源码级:git -C self-plugins/dsh-plugin-bootreport revert <commit> → 重新构建 → 预检 → 重启;
- 组合级:预设里给 agent-plugin-bootreport 行加 disabled: true(或移除该行)→ 哨兵重启;
- 运行期:无需回退(无业务状态;<DSH_HOME>/plugin-boot.jsonl 可随时删除,下次启动重新建账)。
测试
npm test # = node --test "tests/.test.mjs"
19 例离线测试(19/19 通过),跑 lib/ 产物(与运行时同源):
- tests/ledger.test.mjs(10 例)——账本本体:
- 路径与身份:resolveHome 环境变量优先/缺省回落、bootLedgerPath;
- 判据自洽:currentBootLine 真跑一次本机扫描,断言 live + stale = 总数、pid 为本进程;
- 分类边界:classify 的 live/stale 划分与容差;
- 序列化:serializeBootLine / parseBootLines 往返稳定(坏行跳过);
- 尸体测试:不可写路径 → appendBootLine 返回 false 且不抛(不变量 I4)。
- tests/third-party.test.mjs(9 例)——第三方档(§5.23):
- 档位判定:自研 link: / 本地 link: / 官方 scope / git pin / codeload tarball / file: / registry 七档;
- 隐私红线:redactSpec 擦掉 URL userinfo 与 token 类参数,但保留 git pin(升级回退的唯一指纹);
- 生效推导:deriveActivated 容差边界(起点 +1000ms 算已组合、+1001ms 不算、未安装不算);
- 夹具盘点:scanThirdParty 在假 profile 上只收第三方档、标出 bundle、未安装如实写「未安装」;
- 尸体测试:profiles 目录不存在 / package.json 坏 JSON → 返回空、不抛。
无需网络、无需外部依赖、无需 WSL——纯本地文件系统 + 纯函数,任意环境可直接跑。
设计要点
- 不用「现在」当终点:进程起点由 Date.now() - process.uptime()1000 反推。apply 时刻可能比进程起点晚数秒到数十秒,用「现在」判 live/stale 会把刚构建完的产物误判为已生效——这是本插件最容易写错的一行。
- 零 loader 耦合:判据不读运行时注册表,只读文件系统 mtime + 进程起点。好处是可离线复算(classify() 与写入同源),代价是只统计有 lib/.js 的目录(纯源码插件与官方 bundle 不在账内)。
- 观测绝不反噬:落盘失败一律吞错返回 bool,配尸体测试——账本坏了不影响任何业务路径。
- 一行一次启动,不做增量状态:账本是 append-only 事件流,不是「当前状态文件」,所以能事后回答「那次重启后是 live 还是 stale」,而不是只知道此刻。
- 一个观察者而不是 N 份实现:技能 plugin-maintainability 准则 C1(机制必须自证)在生态平面的落地——把判据收敛到一处,避免 49 个插件各自维护「什么算生效」而互相漂移。
- 第三方不能用自研的判据(2026-09-14 补,§5.23):第三方插件的产物来自上游 tarball,没有「我构建的 lib」——硬套 lib-mtime vs 进程起点 会得到假结论。故第三方走独立档:记 spec(pin)+ 安装 mtime,判据是「装得早于进程起点 ⇒ 本次启动的组合已包含它」(activatedAtBoot),并按 bundle 标出它是自述式挂载。补这一档的原因很直白:只扫 self-plugins 的仪器看不见主人新装的第三方插件,而「已盘点全部插件」这句话当时并不成立。
相关文档
| 文档 | 内容 |
| docs/semantic.md | 权威契约:定位与反定位、术语、概念模型与不变量(I1–I4)、契约(含调用点清单)、边界与信任、可证伪验收清单(A1–A8)、实践修订记录、未决问题(U1–U3) |
| alice-digital-life | 本插件所属生态的中心索引(全部自研插件) |
| 技能 plugin-maintainability / dsh-plugin-ecosystem-audit / plugin-workflow | 可维护性工程(五问判据)、生态对齐审计、插件生命周期 |
License
MIT © jonah791
本插件属于我的数字生命爱丽丝(alice-digital-life)的 DSH 自研插件生态——49 个自研插件按生命/认知/感知/行动/通信/治理/呈现/安全八层组织(另有第三方插件,管理模式见 AGENTS.md §5.23)。预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
jonah791/dsh-plugin-bootreport
查进程实际加载的插件构建,判断谁需重启
相关插件 · 开发 / 工程
隐私简历生成器reactive-resume/reactive-resume
Reactive Resume 已迁至 GitHub 上的…
★ 45,125已汉化MCP
71.7
AI 架构文档生成器sopaco/deepwiki-rs
🚀 Litho 已进化为 Terrain —— 给你的 AI 智能体一张会呼吸的代码库地图。
★ 3,157已汉化DSH
70.8
长时任务执行闭环AMAP-ML/LongHorizon-Harness
面向 Computer-Use Agent 的 Loop Engineering
★ 1,764已汉化DSH
70.5
AI 编程纪律方法包GanyuanRan/Aegis
让 AI 编程 agent 变得可信:少返工、更安全、说“完成”前先给证据。
★ 1,384已汉化DSH
69.6
多代理编排运行时Enderfga/claw-orchestrator
面向编程智能体的运行时。把 Claude Code、Codex、Antigravity、Grok…
★ 586已汉化MCP
69.4
记忆进化插件csyangwen/dsh-memory-evolve
dsh-memory-evolve 使用场景指南
★ 461已汉化DSH
67.9