开源项目改名急救包:从 Clawdbot 事件学到的 7 个教训
1 月 22 日早上,Clawdbot 改名 Moltbot。
30 分钟后,恶意 npm 包上线。
12 小时后,50+ 用户的 API key 泄露。
改名这事,每个开源项目都可能遇到。商标纠纷、品牌升级、并购整合,理由很多。
Clawdbot 的经历是个教科书级反面案例。从中能学到什么,记录在这里。
教训 1:先注册,后公告
Clawdbot 的失误:
10:00 - 推特公告"我们改名为 Moltbot"
10:30 - 攻击者注册 npm 包 moltbot
11:00 - 官方才发现 npm 包名已被占用
正确顺序:
T-24h - 注册所有平台账号(npm、Docker Hub、域名、社交账号)
T-12h - 验证所有账号可用
T-1h - 准备公告内容
T-0 - 同时发布公告 + npm 包 + Docker 镜像 + 文档更新
执行清单:
# 1. npm (如果是 JS 项目)
npm login
npm init --scope=@newname
npm publish --access public
# 2. Docker Hub
docker login
docker build -t newname/project:latest .
docker push newname/project:latest
# 3. GitHub Organization
# 在 GitHub 设置里重命名,旧名会自动重定向 30 天
# 4. 域名
# 注册 newname.com、newname.dev、newname.io 等
# 5. 社交账号
# Twitter/X、Discord、Telegram 频道名
所有这些完成后,再发公告。
教训 2:用命名空间,不用全局包名
全局包名是公共资源,先到先得。
# 危险:全局包名
npm install moltbot
# 安全:命名空间
npm install @moltbot/cli
命名空间(@moltbot)是你独占的。
即使项目名改了,命名空间还是你的:
# 从 clawdbot 改名 moltbot,命名空间跟着改就行
@clawdbot/cli → @moltbot/cli
# 没人能抢走 @moltbot/*
对比:
| 方案 | 被抢注风险 | 迁移难度 | 用户体验 | |------|----------|---------|---------| | 全局包名 | 高 | 高 | 稍好 | | 命名空间 | 无 | 低 | 需要多打几个字 |
多打几个字换来安全,很值。
教训 3:文档更新和包发布要原子化
Clawdbot 的另一个问题:README 里写了 npm install moltbot,但官方的 moltbot 包还没发布。
用户照着文档装,装到了恶意包。
# 错误:文档和包不同步
README: npm install moltbot ← 官方包还没发布
npm: moltbot ← 恶意包
解决方案:用 CI/CD 保证同步。
# .github/workflows/release.yml
name: Release
on:
push:
tags:
- 'v*'
jobs:
publish:
runs-on: ubuntu-latest
steps:
# 发布 npm 包
- name: Publish to npm
run: npm publish
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
# 只有 npm 发布成功,才更新文档
- name: Update README
if: success()
run: |
sed -i 's/clawdbot/moltbot/g' README.md
git commit -am "docs: update package name"
git push
# 发布 Docker 镜像
- name: Push to Docker Hub
if: success()
run: |
docker build -t moltbot/moltbot:${{ github.ref_name }} .
docker push moltbot/moltbot:${{ github.ref_name }}
npm 发布失败 → 文档不更新 → 用户不会装到不存在的包。
教训 4:提供迁移脚本
用户已经装了旧版本,怎么办?
Clawdbot 没有提供官方迁移方案,用户只能自己折腾。
好的做法:
#!/bin/bash
# migrate-to-moltbot.sh
echo "Migrating from Clawdbot to Moltbot..."
# 1. 备份配置
cp -r ~/.clawdbot ~/.clawdbot.backup
echo "✓ Config backed up to ~/.clawdbot.backup"
# 2. 卸载旧版本
npm uninstall -g clawdbot
echo "✓ Uninstalled clawdbot"
# 3. 安装新版本(注意:用命名空间)
npm install -g @moltbot/cli
echo "✓ Installed @moltbot/cli"
# 4. 迁移配置
mv ~/.clawdbot ~/.moltbot
echo "✓ Config migrated to ~/.moltbot"
# 5. 更新配置文件中的路径引用
sed -i 's/clawdbot/moltbot/g' ~/.moltbot/config.json
echo "✓ Updated config references"
# 6. 验证
moltbot --version
echo "✓ Migration complete!"
把这个脚本放到官方文档里,用户一键迁移。
教训 5:监控包所有权
怎么知道你的包名有没有被抢注?
自动化监控:
# .github/workflows/monitor-npm.yml
name: Monitor npm package
on:
schedule:
- cron: '0 */4 * * *' # 每 4 小时检查一次
jobs:
check:
runs-on: ubuntu-latest
steps:
- name: Check package ownership
run: |
EXPECTED_MAINTAINER="your-npm-username"
# 检查主包
ACTUAL=$(npm view @moltbot/cli maintainers --json | jq -r '.[0].name')
if [ "$ACTUAL" != "$EXPECTED_MAINTAINER" ]; then
echo "::error::Package maintainer changed!"
exit 1
fi
# 检查是否有人抢注了类似包名
SQUATTERS=$(npm search moltbot --json | jq -r '.[] | select(.name != "@moltbot/cli") | .name')
if [ -n "$SQUATTERS" ]; then
echo "::warning::Potential squatters found: $SQUATTERS"
fi
- name: Alert on failure
if: failure()
uses: slackapi/slack-github-action@v1
with:
payload: |
{"text": "npm package alert!"}
env:
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK }}
有人抢注类似包名,你会第一时间知道。
教训 6:旧链接重定向
GitHub 改名后,旧链接会自动重定向 30 天。
但 30 天后就失效了。
而网上的教程、博客、Stack Overflow 答案会继续指向旧地址。
解决方案:
# 1. 保留旧 GitHub Organization,但只留一个 README
# github.com/clawdbot/clawdbot/README.md
## ⚠️ This project has moved!
New location: https://github.com/moltbot/moltbot
Please update your bookmarks and git remotes.
# 2. 域名重定向
# clawdbot.com → moltbot.com
# Nginx 配置
server {
server_name clawdbot.com www.clawdbot.com;
return 301 https://moltbot.com$request_uri;
}
# 3. 在新文档里加说明
# moltbot.com/migration
## For existing Clawdbot users
If you're looking for Clawdbot, you're in the right place.
We rebranded to Moltbot in January 2026.
All features remain the same.
旧链接失效是慢性病,处理好了长期受益。
教训 7:商标避坑
Clawdbot 为什么要改名?因为名字太像 Claude 的吉祥物 Clawd。
起名时就该查商标数据库。
# 美国商标数据库
https://tmsearch.uspto.gov/
# 搜索步骤:
1. 选择 "Basic Word Mark Search"
2. 输入你的项目名
3. 选择 "Live" 和 "Dead" 都搜
4. 关注第 9 类(软件)和第 42 类(SaaS)
风险级别判断:
🔴 高风险(90% 会被要求改名)
- 完全包含已注册商标:
ClaudeBot、GPTAgent - 包含商标前缀/核心元素:
Clawdbot(Clawd + bot)
🟡 中风险(可能有争议)
- 谐音或变体:
Clowed、Klaud - 概念关联:
LobsterAI(Claude 吉祥物是龙虾)
🟢 低风险(基本安全)
- 独立造词:
Jarvis、Otto、Cascade - 通用描述词:
ChatHelper、CodeWrapper
安全命名公式:
[抽象名词/造词] + [功能后缀(可选)]
例:
- Moltbot(molt + bot,蜕壳机器人)
- Cascade(瀑布,独立品牌)
- Axiom(公理,抽象概念)
避免:
[大公司产品名] + [任何后缀]
[大公司吉祥物] + [任何后缀]
[大公司产品名] 的谐音/变体
完整检查清单
改名前:
- [ ] 新名称商标检索(美国、欧盟)
- [ ] 域名注册(.com、.dev、.io)
- [ ] GitHub Organization 创建
- [ ] npm scope 注册
- [ ] Docker Hub namespace 注册
- [ ] 社交账号注册(X、Discord、Telegram)
- [ ] 所有账号权限配置(2FA、团队成员)
改名时(同时执行):
- [ ] 发布新 npm 包
- [ ] 推送 Docker 镜像
- [ ] GitHub Organization 重命名
- [ ] 更新文档
- [ ] 发布迁移脚本
- [ ] 发布公告(社交媒体、Discord、邮件列表)
改名后:
- [ ] 设置旧链接重定向
- [ ] 配置包所有权监控
- [ ] 更新第三方集成(CI/CD、Slack bot 等)
- [ ] 通知重要用户/合作伙伴
- [ ] 更新搜索引擎索引(Google Search Console)
- [ ] 30 天后检查旧链接是否还有流量
改名是个技术活,也是个时间竞赛。
30 分钟的窗口期,就够攻击者布置陷阱。
提前规划,同步执行,才能安全着陆。
Clawdbot 的坑,希望下一个项目不用再踩。
参考资料
- GitHub Issue #2760: Package squatting incident
- GitHub Issue #2775: Cannot reclaim package name
- npm 安全最佳实践文档
- USPTO 商标搜索教程