其他
审计 JavaScript/TypeScript 仓库…
当用户调用 /check-npm 或要求审计 JS/TS 项目的包管理器供应链安全配置时使用。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 48/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 55/100 ×0.15
适用场景
审计 JavaScript/TypeSc通用
解决思路
- 对工作区根目录执行只读审计,不修改任何文件。
- 运行 `test -f package.json || { echo "STOP: no package.json at workspace root"; exit 1; }`;若没有 `package.json` 则停止。
- 运行 `jq -r '.packageManager // "unset"' package.json` 读取 `packageManager`。
- 运行 `ls -1 yarn.lock package-lock.json pnpm-lock.yaml 2>/dev/null || true` 查看锁文件。
- 按 `packageManager` → lockfile → 默认 npm 的优先级确定包管理器。
- 运行 `npm --version`,要求 ≥ 11.15.0。
- 运行 `yarn --version`,要求 ≥ 4.14.0。
- 运行 `pnpm --version`,要求 ≥ 11.0.0。
- 使用 semver 比较;若 `package.json` 中固定了 `packageManager`,验证其版本满足对应阈值。
- 按阈值表检查:npm 最低 11.15.0,yarn 最低 4.14.0,pnpm 最低 11.0.0。
- 运行 `grep -E '^ignore-scripts=' .npmrc 2>/dev/null` 检查 npm 生命周期脚本配置。
- 运行 `grep -E 'enableScripts:' .yarnrc.yml 2>/dev/null` 检查 yarn 生命周期脚本配置。
- 运行 `grep -E 'strictDepBuilds:|dangerouslyAllowAllBuilds:|allowBuilds:' pnpm-workspace.yaml 2>/dev/null` 检查 pnpm 生命周期脚本配置。
- npm 生命周期脚本 PASS:`.npmrc` 有 `ignore-scripts=true`;FAIL:缺失或 `false`。
- yarn 生命周期脚本 PASS:`enableScripts: false` 或键不存在;FAIL:`enableScripts: true`。
- pnpm ≥ 11 生命周期脚本 PASS:`strictDepBuilds` 未设置/`true`,`dangerouslyAllowAllBuilds` 未设置/`false`,且 `allowBuilds` 未设置/`[]`;FAIL:`strictDepBuilds: false`、`dangerouslyAllowAllBuilds: true` 或 `allowBuilds` 非空。
- pnpm 10 生命周期脚本 PASS:`.npmrc` `ignore-scripts=true` 或 `strictDepBuilds: true`;FAIL:两者都没有。
- 注意 pnpm 11+ 忽略 `.npmrc` 和 `package.json#pnpm` 中的脚本设置;pnpm 10/yarn 边缘情况见 `references/managers.md`。
- 运行 `grep -E '^allow-git=' .npmrc 2>/dev/null` 检查 npm 注册表不安全协议配置。
- 运行 `grep -E 'approvedGitRepositories:' .yarnrc.yml 2>/dev/null` 检查 yarn 注册表不安全协议配置。
- 运行 `grep -E 'blockExoticSubdeps:' pnpm-workspace.yaml 2>/dev/null` 检查 pnpm 注册表不安全协议配置。
- 扫描工作区 `package.json` 文件中的 `dependencies`、`devDependencies`、`optionalDependencies`、`peerDependencies`。
- 优先通过 workspace-member 发现(`pnpm-workspace.yaml` / root `workspaces` / `lerna` / `rush`)并只扫描这些 manifest。
- 回退命令:`find . -name package.json -not -path '*/node_modules/*'`(可能过度匹配非工作区 manifest)。
- 仅将 semver range、`workspace:`、`patch:`、指向 semver 的 `npm:` alias 视为安全值。
- 将其他值(git URLs、tarballs、`user/repo` shorthand、`file:`、`link:`、`exec:` 等)标记为 `path → name → value (protocol)`。
- npm 不安全依赖协议 PASS:`allow-git=none` 或 `root`;FAIL:缺失或 `all`。
- yarn 不安全依赖协议 PASS:`approvedGitRepositories: []` 或 grafana-scoped list,或在有 policy comment 且扫描干净时省略;FAIL:不安全条目或过宽 allow-list。
- pnpm ≥ 11 不安全依赖协议 PASS:`blockExoticSubdeps` 未设置/`true`;FAIL:`false`。
- pnpm 10.x 不安全依赖协议 PASS:`blockExoticSubdeps: true`;FAIL:未设置(默认 `false`)或 `false`。
- 协议检测顺序和 yarn posture 细节见 `references/protocols.md`。
- 记住 3 天 = 4320 分钟;npm 使用 days;yarn 和 pnpm 使用 minutes。
- 运行 `grep -E '^min(imum)?-release-age=' .npmrc 2>/dev/null` 检查 npm 最小发布年龄。
- 运行 `grep -E 'npmMinimalAgeGate:' .yarnrc.yml 2>/dev/null` 检查 yarn 最小发布年龄。
- 运行 `grep -E 'minimumReleaseAge:|minimumReleaseAgeStrict:' pnpm-workspace.yaml 2>/dev/null` 检查 pnpm 最小发布年龄。
- npm 最小发布年龄 PASS:`min-release-age` ≥ `3`;FAIL:缺失。
- yarn 最小发布年龄 PASS:`npmMinimalAgeGate` ≥ 4320 min;FAIL:缺失或低于。
- pnpm ≥ 11 最小发布年龄 PASS:`minimumReleaseAge` ≥ `4320`;FAIL:未设置(默认 `1440`)或低于。
- pnpm 10 最小发布年龄 PASS:`minimum-release-age` / `minimumReleaseAge` ≥ `4320`;FAIL:缺失。
- 在 pnpm 11 上标记 `minimumReleaseAgeStrict: false`。
- 生成报告表格,列为 `#`、`Check`、`Status`、`Detail`。
- 报告第 0 行:Package manager,值为 npm / yarn / pnpm,detail 为 version: x.y.z (pinned: y.y.y if set)。
- 报告第 1 行:Tool version ≥ threshold,PASS / FAIL,detail 为 `actual` vs `required`。
- 报告第 2 行:Scripts disabled,PASS / FAIL,detail 为配置行或 missing。
- 报告第 3 行:Unsafe dep protocols,PASS / FAIL,detail 为 registry state + flagged entries。
- 报告第 4 行:Min release age ≥ 3 days,PASS / FAIL,detail 为 config + value。
- 仅使用 `PASS` / `FAIL`,不要使用 emoji。
- 对每个 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 allow-list、pnpm 10)见 `references/fix-snippets.md`。
- 如果全部 PASS,输出 All checks passed. 并停止。
适用边界 · 注意事项
- 不适用于工作区根目录没有 `package.json` 的项目。
- 不适用于需要修改文件、自动修复或执行安装的场景;该技能要求只读审计。
- 不适用于使用非 npm/yarn/pnpm 包管理器的项目。