SentinelloSentinello

为那些你不再盯着看的依赖,提供一套早期预警系统。

在 AI 时代,你发布的项目多过你能维护的数量。Sentinello 会盯住其中的每一个,揭示其依赖中已知的 CVE —— 默认 JavaScript,Python、Go 和 Rust 只需一个开关 —— 让被遗忘的项目永远不会演变成事故。

一条命令即可运行:

docker run -d \
  --name sentinello \
  -p 127.0.0.1:3870:3000 \
  --stop-timeout 60 \
  -v sentinello-data:/app/data \
  -v sentinello-nvm:/home/sentinello/.nvm \
  -v ~/Developer:/roots/personal:ro \
  ghcr.io/walkofcode/sentinello:latest

运行于 linux/amd64 和 arm64

无需账号。没有 SaaS。没有遥测。一个 Docker 镜像和一个 SQLite 文件 —— 你的代码和结果绝不离开你的机器。

也可以完全不用门户

同样的扫描器还提供 CLI。无需安装、无需账号、无需数据库——运行后输出一份代理可直接处理的公告,然后退出。

npx sentinello

通过管道传递时,stdout 只承载 markdown,因此公告能完整送达代理:

npx sentinello | claude -p "$(cat -)"

遍历文件夹

指向一个目录,它会找出其下的每个项目,并在各项目根目录处停止,因此 monorepo 只算一个而不是五十个。会遵循 .gitignore 与 .sentinelloignore。

核对三个来源

从 lockfile 解析出实际安装的精确版本,离线比对本地公告缓存。不会为每个项目发起网络请求,也不会上传你的任何代码。

写出公告

一份带日期的 markdown 文件,包含发现的问题以及附带的修复提示——先分诊再动手,优先升级父包而非使用 override,并在 lockfile 中验证修复。

与 npm audit 有何不同

它并不取代 npm audit:它会运行 npm audit,然后补上两个 npm audit 看不到的公告来源,并抑制其中重复的部分。

npm auditnpx sentinello
范围你当前所在的那一个项目。一个文件夹下的所有项目,一次执行、一份报告。
公告来源你所用注册表的公告源。在此基础上再加 OSV 与 GitLab gemnasium。重复项会被抑制,因此每增加一个来源只会带来新增的发现。
恶意包不涵盖。OSV 的 MAL- 记录会标记随恶意代码一同发布的包——仿冒名、安装脚本载荷——并与具体被投毒的版本进行比对。
输出一张表格,或需要你自行解读的 JSON。一份附带修复提示的 markdown 公告,可直接交给代理。
比对方式每个项目都要调用注册表。针对本地缓存离线比对。首次运行会先征询再下载,之后几乎不传输任何数据。

这些额外来源并非摆设。在 Sentinello 自己的仓库上,npm audit 与 OSV 各报告三条发现且完全一致,而唯一的 critical 发现来自 gemnasium——另外两个来源都没有收录它。

功能

尽在一个自托管门户 —— 没有外部服务,数据不会离开你的网络。

单一分诊队列

在一个地方查看并分诊整个组合的 CVE —— 而不是散落在十几个检出目录里的 npm audit。

按项目或库浏览

深入任意仓库,查看它的发现、修复版本和历史 —— 或切换到某个易受攻击的包,看它影响的每一个项目,并一次性在所有项目中将其静音。

多语言扫描

开箱即扫 JavaScript,并通过逐语言开关加入 Python、Go 和 Rust —— 离线解析每个项目的锁文件,并与 OSV 和 GitLab gemnasium 公告进行比对。

持续扫描

后台工作进程按计划重新扫描,新的公告会自动出现,无需你记得去检查。

多种来源

不止 npm audit:与 OSV 数据库匹配,获得更广的 CVE 覆盖并检测已知恶意软件包。

通知与 Webhook

通过 Slack、Telegram 或一个普通 Webhook 接收失败与发现的告警 —— 可按 root 或项目划分范围,并使用你选择的语言。JSON 或纯文本负载,可直接交给自动修复代理。

MCP 服务器

连接 Claude Desktop、Cursor 等 MCP 客户端,无需离开聊天即可查询发现、项目和库,并触发扫描。

公告导出

将项目或库的发现导出为 Markdown,并附带可为你的团队或 LLM 自定义的修复提示。

一个镜像,一个文件

一个 Docker 镜像和一个 SQLite 文件。没有数据库服务器,没有消息队列,没有云端依赖。

自动注册的 Roots

挂载到 /roots 下的任何内容都会在启动时被注册和扫描 —— 目录名会成为它的标签。

按项目区分的 Node

遵循每个项目的 .nvmrc,将其固定的 Node 版本安装并缓存一次。

10 种语言

门户界面、扫描原因代码和状态均已本地化为 10 种语言。

截图

实际效果一览 —— 门户正在扫描几个演示项目。点击任意截图即可放大查看。

对比

Sentinello 不是更重的 Dependency-Track,也不是更便宜的 Snyk。它占据另一个定位:没人接入流水线的那一长串项目。

SentinelloDependency-TrackSnykDependabot
零配置 — 指向一个文件夹即可~~
无需 SBOM / CI 步骤
扫描真实解析的锁文件~
恶意软件包检测
自托管,无 SaaS
单一镜像 + SQLite
AI 原生(MCP + 导出)~
多语言(Python、Go……)
企业策略 / VEX~~

Dependency-Track 只能看到有人用 SBOM 流水线接入的项目。Sentinello 找出你遗忘的那些。它们在企业策略上更强 —— 如果你已在成熟流水线中运行它们,继续用。Sentinello 面向你那部分无人看管的其余项目组合。

我们为何打造它

在 AI 时代,你发布的多过你能维护的。

如今,一个独立开发者一年就会启动、交付、然后放下十几个项目 —— 营销站点、客户仪表盘、悄悄上了生产的业余项目。要让它们保持安全,过去意味着逐个 SSH 进每个检出目录手动跑 npm audit,或者在某个 Next.js CVE 爆出几天后才从新闻标题里得知。没人能对十几个仓库坚持这么做,所以这事根本就没人做。

只需一个被遗忘、带有严重远程代码执行漏洞的依赖就足够了。那个你不再盯着看的最简单的站点,会成为入侵的入口。

“为什么不直接用 Snyk 或 Dependabot?”那些工具活在你接好的 CI 流水线里 —— 而这条长尾从来就没有流水线。Sentinello 正是其余一切的早期预警系统:把它指向一个文件夹,它就会盯住你遗忘的每一个项目,在每个新 CVE 演变成事故之前,把它汇集到一个队列里浮现出来。

工作原理

三个步骤。无需在你的项目中安装代理,也无需创建账号。

把它指向你的代码

将你的仓库挂载到 /roots,或在“设置 → Roots”中添加。每个目录都会在启动时被自动注册和发现。

持续扫描

后台工作进程按计划将你的依赖与已知 CVE 比对,并在需要时安装每个项目所固定的 Node 版本。

在一个队列中分诊

所有项目的每一条结果都汇入一个可按严重程度筛选的队列 —— 还可选择向 Slack、Telegram 或 Webhook 发送告警。

适合谁

Sentinello 适合所有在生产环境里拥有的东西多过自己能盯住的人 —— 独立开发者、小团队、忙于客户项目的工作室。

  • 你发布的业余项目和客户站点,在上线后很久仍需保持安全。
  • 你想要覆盖整个组合的视图,而不必为每个仓库接入 CI。
  • 比起把代码清单交给 SaaS,你更愿意自托管。

如果你是一家大型机构,已经在成熟的流水线中接入了 Snyk 或 Dependabot,那就继续用它们 —— Sentinello 并不想取代企业级 SCA。它面向的是你那部分无人盯防的代码组合。它是开源且采用 MIT 许可证的,因此你可以确切地读到它在做什么。

发行说明

Sentinello 持续更新——以下是每个版本带来的内容。

gemnasium 下载恢复正常,CLI 也会正常退出

v3.0.1 · 2026年8月4日
  • 在 3.0.0 中,所有用户的 GitLab gemnasium 下载都会以 `HTTP 406` 失败。Node 内置的 fetch 会附加程序无法移除的 `Sec-Fetch-Mode: cors` 请求头,而 GitLab 会拒绝任何带该请求头的仓库归档请求 — 所以这与你的网络、IP 或重试次数都无关。下载现已改用普通的 HTTPS 请求,可以成功
  • 归档现在按提交 ID 而不是分支名获取,因此从同一上游提交更新的所有人共享同一份缓存副本,而不必各自让 GitLab 生成一个 60 MB 的归档。原本接近七分钟的首次下载现在几秒即可完成
  • CLI 过去会完成全部工作 — 写出报告、打印摘要 — 然后再也不把终端交还。下载所用的连接仍在后台保持打开,使进程无法退出;现在读完归档后就会立即关闭
  • 拒绝下载的数据源不再等待三分钟才报告。它会在几秒内报告,并在终端中询问是否重试 — 且只重试真正失败的那个数据源
  • `--fail-on` 在两个方向上都变得诚实。当某个公告数据源无法访问时,它会拒绝该次运行,而不是报告一次从未真正执行的干净扫描;同时,对于你自己用 `SENTINELLO_OSV_FEED_URL=off` 或 `SENTINELLO_GEMNASIUM_FEED_URL=off` 关闭且从未下载过的数据源,它不再让运行失败

Sentinello 现在完全不用门户也能运行

v3.0.0 · 2026年8月3日
  • 扫描器以 CLI 形式发布到 npm。`npx sentinello` 会遍历一个文件夹,找出其下的每个项目,对照 npm audit、OSV 与 GitLab gemnasium 进行核查,并写出一份附带修复提示的 markdown 公告——无需安装、无需账号、无需数据库,你的代码也不会离开本机
  • 通过管道传递时,stdout 上只有公告,因此 `npx sentinello | claude -p "$(cat -)"` 能把一份完整的工作清单交给代理,而不会有任何东西破坏该文档
  • 首次运行不会再因下载被拒而丢掉 gemnasium 来源。GitLab 会一次拒绝其归档一到两分钟,而旧的重试十三秒就放弃了;现在 CLI 会等它过去、说明自己为何在等待,并在默认的三分钟不合适时接受 `--feed-wait`
  • 两个下载大小都是实测而非估猜:OSV 的 npm 导出标为 204 MB 而不是 196,gemnasium 归档标为 52 MB 而不是 80。确认提示会给估算值加上波浪号,以免被误认为服务器报告的大小
  • 看起来像选项的值现在会被拒绝,而不是照单全收——`--out --` 过去会在你的项目里写出一个名为 `--` 的文件并报告成功
  • 当某个版本内容较多时,“新变化”面板不会再溢出到窗口底部之外

公告文档真的送达了——而且计数与你的理解一致

v2.6.0 · 2026年7月29日
  • get_project_advisory 现在返回公告文档本身。此前已连接的客户端只能拿到它的元数据——一个文件名和一个计数——始终拿不到文档,尽管该工具把它描述为一份完整的工作清单
  • 公告导出现在按不同公告各占一条、并合并其来源,而不再按扫描器行各占一条:npm audit 与 OSV 同时报告的同一个漏洞,是一个带上两个公告 ID 的工作项,而不是两条几乎相同的记录。这同样适用于门户的“下载 .md”,计数现在也与仪表盘一致
  • 大到无法放进单个 MCP 响应的项目现在会分页——文档会声明自身不完整,并给出获取其余内容的确切后续调用,而不是被静默截断、让代理把剩下的部分读成“干净”
  • 每个 MCP 工具的每个输入现在都带有描述,新增的 list_mutes 工具会公开 unmute 所需的静音 ID——此前只能通过在同一会话中创建静音才能拿到
  • 修复了严重程度计数的一个缺口:严重程度不属于五个已知取值的发现,会被计入发现总数却不落入任何严重程度分组,于是一个仅有该发现的项目看起来完全干净

通过 MCP 直接获取公告导出

v2.5.0 · 2026年7月28日
  • 已连接的 MCP 客户端可以用新的 get_project_advisory 工具获取项目的完整 Markdown 公告——与门户「下载 .md」按钮生成的文档相同,无需从浏览器复制
  • 被静音的问题不再包含在项目公告导出中,因此代理不会拿到你已经接受风险的工作
  • 注意:公告中包含你的导出提示词,因此 MCP 客户端现在可以读取你在「设置 → 导出」中写下的内容

不再被裁切的弹出层,以及更严格的导出提示词

v2.4.3 · 2026年7月26日
  • 下拉菜单、依赖路径弹出层和公告导出菜单不再被所处的表格或对话框裁切——它们绘制在页面之上,下方空间不足时会向上弹出
  • 默认的公告导出提示词现在要求代理在改动任何文件前先做计划、把可由同一处修复一并解决的发现归为一组,并说明每次版本变更对代码的具体影响;目标是零发现,同时明确排除通往虚假零值的捷径——静音、放宽版本范围或收窄扫描范围——真正无法解决的项则留在带日期的遗留事项表中

分支独立成列

v2.4.2 · 2026年7月25日
  • 扫描项目所用的 git 分支现在在项目列表中独占一列——纯文本、无图标——不再挤在项目名称下方

干净的关闭流程

v2.4.1 · 2026年7月25日
  • 重启容器不会再中断正在写入的扫描,worker 现在会立即启动,而不是先重试约 30 秒
  • 请在 compose 文件中设置 stop_grace_period: 60s(或 --stop-timeout 60)以留出时间——README 和 Docker 文档已补充说明

多语言扫描——Python、Go 和 Rust 加入 npm

v2.4.0 · 2026年7月25日
  • Sentinello 现在除 npm 外还扫描 Python、Go 和 Rust 项目——锁文件完全离线解析,并且每个项目都会报告其扫描覆盖情况(完整、部分或无法审计),让盲区可见而不是悄然存在
  • GitLab 的 gemnasium 数据库加入 npm audit 和 OSV,成为离线公告来源,并通过 CVE/GHSA 别名与其他来源去重;“设置 → 来源”现在是“语言 × 来源”矩阵,可按单元格设置通知范围,并且只要还有一个来源处于启用状态,npm audit 本身也可以关闭
  • 发现结果现在会记录其来源的 git 分支,并显示在项目列表、项目标题栏和每条通知中
  • 项目行自带操作——立即扫描、复制或下载公告、静音或取消静音、编辑标签——因此分诊时不必再逐个进入项目
  • 项目仪表盘从约 3.3 秒降至约 0.03 秒,页面切换现在会显示加载状态,而不是看起来卡住
  • 安全:修复 25 项依赖公告,包括门户图片优化器中真实存在的 libvips CVE,以及影响已发布门户的 9 项 Next.js 公告
  • 默认的公告导出提示词现在涵盖最短发布时长、锁文件校验和过期的 override

更简单的 MCP 设置——无需环境变量

v2.3.0 · 2026年6月9日
  • 现在完全在“设置 → MCP”中配置 MCP:生成令牌即可开启 /api/mcp 端点,清除令牌即可关闭——SENTINELLO_MCP_ENABLED 和 SENTINELLO_MCP_API_TOKEN 环境变量已移除(升级时会一次性导入已有的环境变量令牌)
  • 面向 Claude Code、Codex、Cursor 和 Claude Desktop 的即贴即用连接片段,已预填你的令牌
  • 当通过环境变量设置 SENTINELLO_PORTAL_BASE_URL 时,它会在“设置 → 高级”中以只读方式显示,因为它具有最高优先级并在每次启动时重新应用

更少的误报,以及会自我清理的检测结果

v2.2.0 · 2026年6月9日
  • 恶意软件公告现在会与确切的受影响版本进行比对——曾被入侵的包,其干净或已修复的版本不再被标记
  • 重复的检测结果现在会在下次扫描时自我解决,过期或遗留的条目会自动清除
  • 生产(production)和开发(development)标签现在在所有来源(npm 和 OSV)上以统一的单一方式计算

更简洁的项目页头与一致的筛选器

v2.1.0 · 2026年6月6日
  • 精简的项目页头——在标题旁直接重命名,静音和标签改为图标按钮
  • 在依赖类型筛选器旁新增下拉框,可按来源(npm / OSV)筛选发现
  • 全应用统一一致的下拉框,时区等长列表支持输入即搜索

更清晰的升级指引

v2.0.1 · 2026年6月4日
  • 扩充了 2.0 重大变更的升级步骤
  • README 说明了仅限本地(localhost)的端口绑定

多来源扫描,以及默认安全的加固安装

v2.0.0 · 2026年6月4日
  • 将 OSV 作为可选的第二来源(设置 → 来源,默认关闭),具备恶意软件包检测,并与本地缓存中的公开 OSV 数据库进行比对
  • 检测结果现在可跨来源合并——每个漏洞一行,标记每个来源、提供可用的最佳修复方案以及依赖路径的并集,并配有来源筛选和依赖路径弹出框
  • 安全加固:MCP 端点默认关闭并需要令牌,webhook 投递可防御 SSRF,可选的门户登录入口,容器以非特权用户身份运行
  • “设置”现在是带侧边栏和个人资料页面的顶级板块

MCP 集成与新功能

v1.4.0 · 2026年5月29日
  • 面向 Claude Desktop、Cursor 等客户端的 /api/mcp MCP 服务器
  • 全新的“设置 → MCP”板块,提供服务器 URL 和令牌管理
  • 新功能标记以及发行说明历史

页脚版本显示修复

v1.3.1 · 2026年5月28日
  • 运行中的版本在页脚正确显示

通知改进

v1.3.0 · 2026年5月28日
  • 按环境筛选通知
  • 更简单的通知目标编辑表单
  • 复制现有的通知目标

项目与库页面

v1.2.0 · 2026年5月24日
  • 主页拆分为独立的项目页面和库页面

计划实时重载

v1.1.2 · 2026年5月24日
  • 在门户中保存更改后,worker 会立即重新加载扫描计划

更安全的删除与更清晰的更新横幅

v1.1.0 · 2026年5月23日
  • 删除根目录和通知目标前进行确认
  • 更新提示改为可关闭的顶部横幅
  • 当主机挂载消失时,worker 会清理过期的根目录

扫描器准确性修复

v1.0.1 · 2026年5月23日
  • 丢弃已安装版本实际上不在易受攻击范围内的审计结果
  • 允许删除有发送历史的通知目标

首个开源版本

v1.0.0 · 2026年5月23日
  • Sentinello 的首个公开发布版本

路线图

如今 Sentinello 已跨多种语言盯住你的依赖。这是它的发展方向 —— 以及你可以提出的需求。

更智能的优先级

计划中

按可利用性以及易受攻击的代码是否真正可达对发现进行排序——优先处理重要的问题。

更多集成

计划中

更多通知渠道,以及把 Sentinello 接入你团队已在使用的工具的方式。

静态分析(SAST)

计划中

不仅检测依赖中的已知 CVE,还能发现你自己源码中的风险模式。

密钥与许可证扫描

计划中

在同一个组合、同一个队列中,标记被提交的密钥和许可证问题。

申请集成或数据源

告诉我们你接下来想集成或扫描什么 —— 在 GitHub 上提交 issue,一起塑造路线图。