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

复杂度热点扫描 morluto/smokinggun

DeepSeek Harnessv5.0.0
morluto22 天前有提交已提供中文文档扫描:含敏感能力

面向 agent 的优化证据:找出复杂度热点,并检验所提议的改动是否值得实施。

41.2/100
综合分
17
GitHub 星标
67
npm 周下载
—/5
用户评分

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

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add smokinggun
npm 源 · smokinggun 的发布者账号已校验与本仓库一致

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么
dsh 原生插件 · dev
装得上吗
本站已在 dsh 0.2.1-rc.5 下真实安装成功
非静态推断
L5 · 运行时冒烟等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 22 天前
档位由哪些信号合成

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

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查✓ 自动检查通过
展开查看检查明细 ↓

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

✓npm 包smokinggun @ 5.0.0
✓Node 引擎要求 >=22.18 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/11/1 20:23:40

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

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

读写/删除本地文件
查看扫描证据(共 33 处,展示前 33 条)
  • 读取本地文件
    dist/scan/repository.js:48
    if ((await lstat(root)).isSymbolicLink())
  • 读取本地文件
    dist/scan/repository.js:50
    const rootInfo = await stat(root);
  • 读取本地文件
    dist/scan/repository.js:407
    const rootInfo = await stat(root);
  • 读取本地文件
    dist/scan/repository.js:428
    const entries = await readdir(directory, { withFileTypes: true });
  • 读取本地文件
    dist/scan/repository.js:438
    const target = await stat(path).catch(() => undefined);
  • 读取本地文件
    dist/scan/repository.js:499
    const info = await stat(root);
  • 读取本地文件
    dist/scan/inventory.js:38
    const rootEntries = await readdir(root, { withFileTypes: true }).catch(() => []);
  • 写入本地文件
    dist/investigations/store.js:135
    await mkdir(directory, { recursive: true });
  • 写入本地文件
    dist/investigations/store.js:155
    await mkdir(snapshots, { recursive: true });
  • 写入本地文件
    dist/investigations/store.js:166
    await mkdir(snapshots, { recursive: true });
  • 写入本地文件
    dist/investigations/store.js:251
    await writeFile(path, bytes, { flag: "wx" });
  • 删除本地文件
    dist/investigations/store.js:291
    await unlink(path).catch(() => undefined);
  • 删除本地文件
    dist/investigations/store.js:297
    await unlink(path).catch(() => undefined);
  • 读取本地文件
    dist/investigations/store.js:318
    const info = await stat(path).catch(() => undefined);
  • 写入本地文件
    dist/investigations/store.js:335
    await rename(path, quarantine);
  • 删除本地文件
    dist/investigations/store.js:336
    await rm(quarantine, { force: true });
  • 写入本地文件
    dist/artifacts/store.js:18
    await mkdir(directory, { recursive: true });
  • 删除本地文件
    dist/artifacts/store.js:50
    await rm(temporary, { force: true });
  • 删除本地文件
    dist/artifacts/store.js:53
    await rm(temporary, { force: true }).catch(() => undefined);
  • 读取本地文件
    dist/artifacts/store.js:77
    if ((await lstat(path)).isSymbolicLink())
  • 读取本地文件
    dist/scanners/typescript-semantic.js:33
    if (!existsSync(fileURLToPath(workerUrl)))
  • 读取本地文件
    dist/scanners/typescript-semantic.js:48
    if (!existsSync(fileURLToPath(workerUrl)))
  • 读取本地文件
    dist/tool-identity.js:4
    const packageMetadata = packageMetadataSchema.parse(JSON.parse(readFileSync(new URL("../package.json", import.meta.url), "utf8")));
  • 写入本地文件
    dist/files.js:7
    await mkdir(dirname(path), { recursive: true });
  • 写入本地文件
    dist/files.js:10
    await writeFile(temporary, data);
  • 写入本地文件
    dist/files.js:11
    await rename(temporary, path);
  • 删除本地文件
    dist/files.js:14
    await rm(temporary, { force: true }).catch(() => undefined);
  • 写入本地文件
    dist/cli/context.js:41
    await mkdir(root, { recursive: true });
  • 写入本地文件
    dist/cli/context.js:53
    await mkdir(root, { recursive: true });
  • 读取本地文件
    dist/commands/doctor.js:19
    const lock = await readFile(new URL("../../grammar.lock.json", import.meta.url), "utf8").catch(() => "{}");
  • 读取本地文件
    dist/config.js:135
    const canonical = await realpath(existing);
  • 读取本地文件
    dist/config.js:169
    await stat(candidate);
  • 读取本地文件
    dist/config.js:183
    await stat(userConfig);
扫描于 2026/11/3(1 天前) · 范围 入口闭包 + 全包扫描 · 来源 npm 发布包

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

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 定位复杂度热点
  • 检验改动是否值得实施

帮你的智能体找到它们要的关键证据。面向智能体的优化证据:定位复杂度热点。

v5.0.02026-08-29
· 变更内容 · chore(deps):web-tree-sitter 从 0.26.11 升到 0.26.12,由 @dependabot[bot] 提交 · chore(deps):@bufbuild/protobuf 从 2.13.0 升到 2.14.0,由 @dependabot[bot] 提交 · chore(deps):pprof-format 从 2.3.0 升到 2.3.1,由 @dependabot[bot] 提交 · chore(deps-dev):@types/node 从 24.13.3 升到 26.2.0,由 @dependabot[bot] 提交 · chore(deps-dev):verdaccio 从 6.9.2 升到 6.10.0,由 @dependabot[bot] 提交 · 统一 C 和 C++ 源文件扩展名的处理 · 限制配置和适配器清单的读取范围 · 限制对比产物的读取范围 · chore(deps):@oclif/core 从 4.13.3 升到 4.14.0,由 @dependabot[bot] 提交 · 接受已取消的单参数缩放点 · 拒绝格式错误的 pyperf 和 JMH 观测数据 · fix:拒绝不安全的 pprof 数值 · fix:集中管理测量兼容性检查 · 拒绝为不存在的调查导入测量数据 · 从保留的字节处理 Perfetto 跟踪 · 阻止无效 SARIF URI 中断导入 · 拒绝为不存在的调查导入上下文 · 保留产物前先校验适配器结果 · fix:对部分解析诊断去重 · fix:拒绝格式错误的 UTF-8 输入文件 · fix:探测完整的适配器命令 · 将已完成的扫描 SARIF 调用标记为成功 · 阻止跨不同测量主体的提升 · 校验仓库清单内容摘要 · 拒绝非规范的 SCIP 文档路径 · 忽略非文件的包清单条目 · 区分用户配置与项目配置的作用域 · 扫描默认使用运行时源文件候选 · 发布包,由 @github-actions[bot] 提交 · 新贡献者 · @dependabot[bot] 在以下提交中首次贡献 完整变更日志:
v4.0.02026-08-12
· 变更内容 · 重置证据权威与 SmokingGun 公开契约 · 由 @github-actions[bot] 发布软件包,见 完整变更日志:
v3.0.02026-08-10
· 变更内容 · 采用 npm 命令行和共享的 footgun 技能 · 由 @github-actions[bot] 在以下链接发布软件包 · 执行已配置的适配器前要求授权 · 限制解压后的 pprof 配置档大小 · 将唯一的 SARIF 结果路径计为已分析文件 · 输出前校验报告调查 · 复用匹配的仅计划调查 · 扫描包含未跟踪源码时标记为脏 · 将 JMH 吞吐量归一化为每次操作耗时 · 在比较标识中包含产物摘要 · 将未验证的嵌套循环发现校准为中等严重级别 · 报告已安装的 SmokingGun 工具标识 · 披露被截断的扫描发现并保留 fail-on 策略 · 测量前拒绝不支持的主机资源限制 · 校验并保留适配器原始产物摘要 · 刷新 Rust 语法以支持原始标识符 · 添加有界多参数缩放网格 · 将调查证据绑定到已存储的扫描产物 · 校验现有内容寻址产物字节 · 保留缩放隔离来源以便晋升 · 阻止跨不同 Node 运行时的比较 · 将 TypeScript 语义发现限定到 --only 选择 · 在扫描覆盖中报告跳过的源码符号链接 · 对照扫描证据校验聚焦调查 ID · 测量执行前校验调查 · 将严格协议契约硬迁移到 V2 · 在解析边界强制协议状态不变量 · 限制 TypeScript 语义工作进程内存 · 由 @github-actions[bot] 在以下链接发布软件包 · 新贡献者 · @morluto 在以下链接完成首次贡献 · @github-actions[bot] 在以下链接完成首次贡献 完整变更日志:
数据来自仓库的 GitHub Release,可能与插件实际版本不一致。

README

由 DeepSeek 最新模型翻译生成
SmokingGun 面向 agent 的优化证据:找出复杂度热点,并检验所提议的改动是否值得实施。 它将静态发现、估算、导入的测量数据和行为证据区分开来,以便 agent 决定下一步调查什么。 安装 agent 技能 可选的 smokinggun 技能会教兼容的 agent 宿主如何使用该 CLI。使用共享的 Skills CLI 安装: npx skills add https://github.com/morluto/smokinggun --skill smokinggun Skills CLI 负责技能放置、冲突处理和更新。SmokingGun 不会修改 agent 配置,也不会自行安装技能。 安装 CLI npm install -g smokinggun 或者无需全局安装即可引导执行一次扫描: npx --yes --package=smokinggun -- smokinggun scan . 此命令可能会访问 npm registry。SmokingGun 需要 Node 22.18 或更高版本。
展开完整文档(README 剩余 1 节)
SmokingGun

面向 agent 的优化证据:找出复杂度热点,并检验所提议的改动是否值得实施。

它将静态发现、估算、导入的测量数据和行为证据区分开来,以便 agent 决定下一步调查什么。

安装 agent 技能

可选的 smokinggun 技能会教兼容的 agent 宿主如何使用该 CLI。使用共享的 Skills CLI 安装:

npx skills add https://github.com/morluto/smokinggun --skill smokinggun

Skills CLI 负责技能放置、冲突处理和更新。SmokingGun 不会修改 agent 配置,也不会自行安装技能。

安装 CLI

npm install -g smokinggun

或者无需全局安装即可引导执行一次扫描:

npx --yes --package=smokinggun -- smokinggun scan .

此命令可能会访问 npm registry。SmokingGun 需要 Node 22.18 或更高版本。

使用 CLI

扫描一个仓库:

smokinggun scan .
smokinggun scan . --format markdown
smokinggun scan . --format sarif --output smokinggun.sarif
smokinggun scan . --source-profile all

报告包含热点、支撑证据、覆盖范围、假设以及接下来所需的验证。

默认的 runtime 配置会抑制来自测试、文档、示例和 fixture 的发现,同时将这些文件保留在仓库清单中。使用 --source-profile all 扫描所有受支持的源文件,或使用 --only 明确聚焦于某个辅助区域。

静态扫描是只读、离线的,不会执行仓库代码或修改源文件。发现只是候选,而非证据。SmokingGun 从现有基准测试工具导入测量证据;它不会启动工作负载或重写代码。

语义扫描器直接消费捕获的源代码快照。基准测试、性能剖析和测量产物跨越导入边界,但不会被授予工作负载执行权限。有关这些选择背后的归属规则,请参阅权限架构。

输入要求

文本输入——包括配置、报告和 JSON 证据产物——必须是有效的 UTF-8。SmokingGun 会拒绝格式错误的字节序列,而不是静默替换它们,因为替换文本将不再代表所捕获的证据。诸如 gzip 压缩的 pprof 剖析文件等二进制格式在其格式解码器处理之前保持二进制形式。

pprof 数值字段必须落在 JavaScript 的精确整数范围内(Number.MIN_SAFE_INTEGER 到 Number.MAX_SAFE_INTEGER)。SmokingGun 会拒绝超出该范围的值,而不是对标识符或测量值进行舍入。

关于

SmokingGun 的权威路径是:不可变捕获、基于快照的扫描、真实的覆盖范围、内容寻址的报告,以及显式的证据导入。SARIF、SCIP、基准测试、性能剖析和测量数据仍属于外部输入。缺失或失败的覆盖范围会保持可见,而不会变成一次干净的扫描。

开发

需要 Node 22+ 和 pnpm 11.20.0。
pnpm install
pnpm typecheck && pnpm test && pnpm build

质量门禁:pnpm lint(oxlint)、pnpm format:check(oxfmt)、pnpm knip、pnpm check:boundaries 和 pnpm test:coverage。运行 pnpm changeset 记录发布变更意图。pnpm test:cli 和 pnpm test:package 对构建后的包进行端到端测试。
预览分享卡片长什么样 ↓morluto/smokinggun
分享 · DeepSeek Harness Hub
morluto/smokinggun

面向 agent 的优化证据:找出复杂度热点,并检验所提议的改动是否值得实施。

这是你的仓库?认领条目

回到顶部