关于 check-npm
只读审计 npm、yarn 或 pnpm 工作区供应链设置的技能。它检查工具版本、生命周期脚本控制、依赖协议和最低发布等待时间,并提供审计结果及配置修正示例。
主要功能
- 01识别包管理器
- 02检查工具最低版本
- 03审计生命周期脚本控制
- 04标记不安全的依赖协议
- 05检查最低发布等待时间
- 06附修正示例报告结果
适用场景
- 01审查包管理器安全设置
- 02检查生命周期脚本是否受限
- 03查找非仓库依赖引用
- 04安装前验证发布等待策略
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ grafana/ skills --skill check-npm安装后在 Claude Code 中输入/check-npm确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/fix-snippets.mdmanagers.mdprotocols.md详细介绍
npm / yarn / pnpm 供应链审计
对工作区根目录进行只读审计。不要修改任何文件。
0. 检测包管理器
test -f package.json || { echo "STOP: no package.json at workspace root"; exit 1; }
jq -r '.packageManager // "unset"' package.json
ls -1 yarn.lock package-lock.json pnpm-lock.yaml 2>/dev/null || true
如果没有 package.json,则停止。优先级:packageManager → 锁文件 → 默认使用 npm。
1. 工具版本
npm --version # required ≥ 11.15.0
yarn --version # required ≥ 4.14.0
pnpm --version # required ≥ 11.0.0
使用 semver 比较。验证固定的 packageManager 是否达到最低要求。
| 管理器 | 最低版本 |
|---|---|
| npm | 11.15.0 |
| yarn | 4.14.0 |
| pnpm | 11.0.0 |
2. 禁用生命周期脚本
grep -E '^ignore-scripts=' .npmrc 2>/dev/null
grep -E 'enableScripts:' .yarnrc.yml 2>/dev/null
grep -E 'strictDepBuilds:|dangerouslyAllowAllBuilds:|allowBuilds:' pnpm-workspace.yaml 2>/dev/null
| 管理器 | 通过 | 失败 |
|---|---|---|
| npm | .npmrc 中有 ignore-scripts=true | 缺失或为 false |
| yarn | enableScripts: false 或未设置此键 | enableScripts: true |
| pnpm ≥ 11 | strictDepBuilds 未设置或为 true,dangerouslyAllowAllBuilds 未设置或为 false,且 allowBuilds 未设置或为 [] | strictDepBuilds: false、dangerouslyAllowAllBuilds: true 或 allowBuilds 非空 |
| pnpm 10 | .npmrc 中 ignore-scripts=true 或 strictDepBuilds: true | 两者都不满足 |
pnpm 11+ 会忽略 .npmrc 和 package.json#pnpm 中的脚本设置。pnpm 10 / yarn 的边缘情况:references/managers.md。
3. 不安全的依赖协议
注册表:
grep -E '^allow-git=' .npmrc 2>/dev/null
grep -E 'approvedGitRepositories:' .yarnrc.yml 2>/dev/null
grep -E 'blockExoticSubdeps:' pnpm-workspace.yaml 2>/dev/null
扫描工作区中的 package.json 文件(dependencies、devDependencies、optionalDependencies、peerDependencies)。优先按照 references/protocols.md 发现工作区成员(pnpm-workspace.yaml / 根目录 workspaces / lerna / rush),然后只扫描这些清单文件。回退方式(可能会误匹配非工作区清单文件):
find . -name package.json -not -path '*/node_modules/*'
仅允许安全值: semver 范围、workspace:、patch:、指向 semver 的 npm: 别名。其他所有值(git URL、tarball、user/repo 简写、file:、link:、exec: 等)均标记为 path → name → value (protocol)。
| 管理器 | 通过 | 失败 |
|---|---|---|
| npm | allow-git=none 或 root | 缺失或为 all |
| yarn | approvedGitRepositories: [] 或 Grafana 范围的列表,或者未设置但有策略注释且扫描结果干净 | 含不安全条目或允许列表范围过宽 |
| pnpm ≥ 11 | blockExoticSubdeps 未设置或为 true | false |
| pnpm 10.x | blockExoticSubdeps: true | 未设置(默认值为 false)或为 false |
协议检测顺序和 yarn 配置详情:references/protocols.md。
4. 最低发布时间 ≥ 3 天
3 天 = 4320 分钟。npm 使用天;yarn 和 pnpm 使用分钟。
grep -E '^min(imum)?-release-age=' .npmrc 2>/dev/null
grep -E 'npmMinimalAgeGate:' .yarnrc.yml 2>/dev/null
grep -E 'minimumReleaseAge:|minimumReleaseAgeStrict:' pnpm-workspace.yaml 2>/dev/null
| 管理器 | 通过 | 失败 |
|---|---|---|
| npm | min-release-age ≥ 3 | 缺失 |
| yarn | npmMinimalAgeGate ≥ 4320 分钟 | 缺失或低于要求 |
| pnpm ≥ 11 | minimumReleaseAge ≥ 4320 | 未设置(默认值为 1440)或低于要求 |
| pnpm 10 | minimum-release-age / minimumReleaseAge ≥ 4320 | 缺失 |
如果 pnpm 11 中的 minimumReleaseAgeStrict: false,则标记出来。
5. 报告
| # | 检查项 | 状态 | 详情 |
|---|---|---|---|
| 0 | 包管理器 | (npm / yarn / pnpm) | 版本:x.y.z(如已设置固定版本:y.y.y) |
| 1 | 工具版本 ≥ 最低要求 | PASS / FAIL | actual 与 required 对比 |
| 2 | 已禁用脚本 | PASS / FAIL | 配置行或 "missing" |
| 3 | 不安全的依赖协议 | PASS / FAIL | 注册表状态 + 已标记条目 |
| 4 | 最低发布时间 ≥ 3 天 | PASS / FAIL | 配置 + 值 |
仅使用 PASS / FAIL,不要使用表情符号。
对于每项 FAIL,提供一个可直接粘贴的修复方案:
# npm — .npmrc
ignore-scripts=true
allow-git=none
min-release-age=3
# pnpm 11 — pnpm-workspace.yaml
strictDepBuilds: true
dangerouslyAllowAllBuilds: false
allowBuilds: []
minimumReleaseAge: 4320
blockExoticSubdeps: true
# yarn — .yarnrc.yml
npmMinimalAgeGate: 4320
更多修复方案(升级工具、yarn git 允许列表、pnpm 10):references/fix-snippets.md。
如果全部通过:输出 "All checks passed." 并停止。