开源项目改名急救包:从 Clawdbot 事件学到的 7 个教训

开源项目改名急救包:从 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% 会被要求改名)

  • 完全包含已注册商标:ClaudeBotGPTAgent
  • 包含商标前缀/核心元素:Clawdbot(Clawd + bot)

🟡 中风险(可能有争议)

  • 谐音或变体:ClowedKlaud
  • 概念关联:LobsterAI(Claude 吉祥物是龙虾)

🟢 低风险(基本安全)

  • 独立造词:JarvisOttoCascade
  • 通用描述词:ChatHelperCodeWrapper

安全命名公式:

[抽象名词/造词] + [功能后缀(可选)]

例:
- 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 商标搜索教程
← 返回博客列表