📦 Dependency Impact Analyzer — Dependency Impact 分析器

v1.0.0

Analyze the blast radius of upgrading, removing, or replacing a dependency — 追踪 导入s, find affected files, 检查 test coverage of impacted code, 检测...

0· 20·0 当前·0 累计
0
安全扫描
VirusTotal
无害
查看报告
OpenClaw
可疑
medium confidence
该技能的指令与其声明目的(repo-wide impact analysis)一致,但 SKILL.md 假设存在大量本地工具并进行文件系统/网络访问,而元数据却未声明任何所需二进制文件或安装步骤——运行前请审查这一不一致。
评估建议
安装或运行此 skill 前: (1) 完整查看 SKILL.md——它会执行 shell 命令扫描仓库并调用 npm registry。 (2) 确保所需工具已安装:ripgrep (rg)、npm、python3、grep、sed、awk、find;元数据未声明这些,请先安装或验证。 (3) 在受控工作区(或检出副本)运行,脚本会读取所有源文件及 lockfile,若在更广文件系统运行可能泄露代码或密钥。 (4) 注意它会向包 registry(npm)发起网络请求,离线或隔离环境表现不同。 (5) 若需更强保障,请要求作者补充声明的“必需二进制”列表及非破坏性的 dry-run 模式;未声明依赖是此处主要一致性问题。...
详细分析 ▾
用途与能力
名称/描述与运行时指令一致:脚本追踪 import、检查 package.json/requirements、验证测试并查询 npm。然而元数据未列出任何必需的二进制文件或安装项,而 SKILL.md 明确要求 rg/ripgrep、npm、python3、grep、sed、awk、find 等工具。缺失的依赖声明即为不一致。
指令范围
指令仅聚焦于扫描代码库中的导入、测试覆盖率、依赖树及 npm 元数据。它们读取仓库文件(package.json、package-lock.json、requirements.txt、源文件)并调用 npm registry。不会尝试向未知端点外泄数据,但会广泛扫描工作区并向 registry 发起网络请求。
安装机制
无安装规范(仅指令)——安装风险低。但由于该 skill 未声明依赖,agent 可能会尝试运行不存在的命令;若所需工具缺失,将导致失败或异常行为。
凭证需求
该技能不会请求环境变量、凭据或配置文件路径,仅读取与依赖分析相关的仓库文件(package.json、lockfiles、源代码文件)。
持久化与权限
该技能并非始终启用,也不会请求提升/持久权限。在提供的说明中,它不会修改其他技能或系统设置。
安全有层次,运行前请审查代码。

运行时依赖

无特殊依赖

版本

latestv1.0.0

echo "--- 正在检查破坏性变更 ---"

无害

安装命令

点击复制
官方npx clawhub@latest install dependency-impact-analyzer
镜像加速npx clawhub@latest install dependency-impact-analyzer --registry https://cn.longxiaskill.com

技能文档

依赖影响分析器 在升级或移除依赖前,先弄清到底会波及什么。追踪所有 import,找出每一处引用该包的文件,检查受影响代码的测试覆盖率,识别潜在破坏性变更。

适用场景: “升级 X 会发生什么”、“移除 lodash 的影响”、“能否安全更新”、“依赖爆炸半径”、“哪些文件用了包 X”、“升级风险评估”,或任何重大依赖变更前。

命令

  • trace — 追踪依赖的所有用法
找出所有 import 或 require 该包的文件及其用法。

PACKAGE="${1:?Usage: trace }" echo "=== 正在追踪:$PACKAGE ===" # 直接引入(JS/TS) echo "--- 直接引入 ---" rg -n "from ['\"]$PACKAGE['\"/]|require\(['\"]$PACKAGE['\"/]\)|import ['\"]$PACKAGE['\"]" \ -g '.{js,ts,jsx,tsx,mjs,cjs}' -g '!node_modules' -g '!dist' -g '!build' 2>/dev/null # 子路径引入 echo "--- 子路径引入 ---" rg -n "from ['\"]$PACKAGE/" \ -g '.{js,ts,jsx,tsx}' -g '!node_modules' -g '!dist' 2>/dev/null # Python 引入 rg -n "^import $PACKAGE|^from $PACKAGE" \ -g '.py' -g '!vendor' -g '!dist' 2>/dev/null # Go 引入 rg -n "\".$PACKAGE" \ -g '.go' -g '!vendor' 2>/dev/null # 统计 USAGE_COUNT=$(rg -c "$PACKAGE" \ -g '!node_modules' -g '!vendor' -g '!dist' -g '!.lock' -g '!package-lock.json' \ --type-not binary 2>/dev/null | awk -F: '{s+=$2} END {print s+0}') FILE_COUNT=$(rg -l "$PACKAGE" \ -g '!node_modules' -g '!vendor' -g '!dist' -g '!.lock' -g '!package-lock.json' \ --type-not binary 2>/dev/null | wc -l) echo "" echo "总计:$USAGE_COUNT 处引用,分布在 $FILE_COUNT 个文件"

提取具体用到的导出/API: rg -o "import \{([^}]+)\} from ['\"]$PACKAGE['\"]" \ -g '.{ts,js,tsx,jsx}' -g '!node_modules' 2>/dev/null | \ sed "s/.{//;s/}.//" | tr ',' '\n' | sed 's/^\s//;s/\s$//' | sort | uniq -c | sort -rn rg -o "const \{([^}]+)\} = require\(['\"]$PACKAGE['\"]\)" \ -g '.{js,ts}' -g '!node_modules' 2>/dev/null | \ sed "s/.{//;s/}.//" | tr ',' '\n' | sed 's/^\s//;s/\s$//' | sort | uniq -c | sort -rn

  • impact — 完整影响评估
全面分析升级该依赖意味着什么。

PACKAGE="${1:?Usage: impact [target-version]}" TARGET_VERSION="${2:-latest}"

# 当前版本与目标版本 if [ -f "package.json" ]; then CURRENT=$(python3 -c "import json;d=json.load(open('package.json'));v=d.get('dependencies',{}).get('$PACKAGE')or d.get('devDependencies',{}).get('$PACKAGE')or'not found';print(v)" 2>/dev/null) echo "当前:$PACKAGE@$CURRENT" fi if [ -f "requirements.txt" ]; then grep -i "^$PACKAGE" requirements.txt 2>/dev/null fi

# 破坏性变更检测 echo "--- 检查破坏性变更 ---" if [ -f "package.json" ]; then npm info "$PACKAGE" versions --json 2>/dev/null | python3 -c " import json,sys,re try: versions=json.load(sys.stdin) current='$CURRENT'.lstrip('^~>=') current_major=current.split('.')[0] if current!='not found'else'0' latest=versions[-1] if isinstance(versions,list)else versions latest_major=latest.split('.')[0] if current_major!=latest_major: print(f'⚠️ 主版本号变化:{current} → {latest}(可能含破坏性变更)') else: print(f'✅ 主版本号相同:{current} → {latest}(应向下兼容)') except Exception as e: print(f'无法检查版本:{e}') " 2>/dev/null fi # 检查 npm 弃用 npm info "$PACKAGE" deprecated 2>/dev/null | grep -v "^$" && echo "⚠️ 包已被弃用"

# 受影响文件的测试覆盖率 AFFECTED_FILES=$(rg -l "$PACKAGE" \ -g '!node_modules' -g '!vendor' -g '!dist' -g '!.lock' -g '!.test.' -g '!.spec.' \ -g '.{js,ts,jsx,tsx,py,go}' --type-not binary 2>/dev/null) echo "--- 受影响文件的测试覆盖 ---" for f in $AFFECTED_FILES; do BASE=$(basename "$f" | sed 's/\.[^.]$//') DIR=$(dirname "$f") TEST=$(find "$DIR" -maxdepth 2 \( -name "${BASE}.test." -o -name "${BASE}.spec." -o -name "test_${BASE}." \) \ -not -path '/node_modules/*' 2>/dev/null | head -1) if [ -n "$TEST" ]; then echo "✅ $f → $TEST" else echo "❌ $f → 无测试(升级风险!)" fi done

# 依赖树影响 echo "--- 反向依赖 ---" if [ -f "package-lock.json" ]; then python3 -c " import json lock=json.load(open('package-lock.json')) pkg='$PACKAGE' rdeps=[] packages=lock.get('packages',lock.get('dependencies',{})) for name,info in packages.items(): deps=info.get('dependencies',{}) if pkg in deps: clean_name=name.replace('node_modules/','') rdeps.append(f'{clean_name}') if rdeps: print('\n'.join(rdeps)) else: print('无其他包依赖此包')" fi

数据来源ClawHub ↗ · 中文优化:龙虾技能库