若依项目改名器
这个技能做什么
把 RuoYi(若依)系开源项目(RuoYi-Vue、RuoYi-Vue-Plus、RuoYi-Cloud 等)改造成用户自己的项目名:
- 交互确认 Java 包名(如
org.dromara.*/com.ruoyi.*→com.acme.*) - 交互确认 模块 / artifactId 前缀(如
ruoyi-*→acme-*) - 交互确认 品牌 / 类名 / 中文展示名(如
RuoYi/Dromara/若依→Acme/Acme 管理平台) - 自动处理
RuoYiApplication、DromaraApplication、RuoYiConfig、ry.sh、ry.bat、ry_*.sql、plus-ui等个别文件与目录 - 先出 改动计划,用户确认后才批量执行;执行前自动备份,支持一键回滚
核心原则是「先检测、再确认、后执行」:不猜用户的新名字,不静默改代码,不删除任何业务文件。
触发条件
- 用户要把若依 / RuoYi 项目改成自己的项目名、公司项目名
- 用户提到「ruoyi 改名」「若依换皮」「二次开发初始化」「包名替换」「改 artifactId」
- 用户给出 RuoYi 项目路径,要求批量修改 package、module、启动类、前端目录等
触发边界(不启动)
- 只修改某个业务类/某个 bug,不涉及整体项目改名 → 按普通编码处理
- 只是问「若依怎么读」「RuoYi 是什么」→ 直接回答
- 非 RuoYi 项目、也没有
ruoyi/org.dromara/com.ruoyi特征 → 检测后说明不适用,不硬套
安全契约(必须遵守)
- 先只读检测:先跑
detect,把真实旧值展示给用户,不凭记忆假设版本。 - 新名字必须由用户确认:包名、模块前缀、品牌名、中文展示名逐项展示「原值 → 新值」;用户说「全部按推荐」才采用推荐值。
- 默认 dry-run:
plan只生成计划;apply不加--apply只预览。必须用户明确确认后才加--apply。 - 执行前备份:
apply --apply自动把被修改的文件备份到<项目>/.ruoyi-rename/backup-<时间>/,并写manifest.json。 - 保留 LICENSE / NOTICE:默认跳过许可证文件,不删除上游版权声明;README/文档中的上游链接会提示人工复核。
- 不删除业务代码:只做重命名与内容替换;清理的仅为被搬空的空目录,且可从备份恢复。
- 先提交再执行:若项目是 Git 仓库且工作区不干净,先建议用户 commit 或 stash;工具备份只覆盖被改文件。
执行流程
第 0 步:确认代码位置
用户已给出路径就直接用;没给就问一次(用 AskUserQuestion,选项给「当前工作区」和「其他本地目录」)。
- 「本空间代码」通常指当前工作区
<cwd>;先确认该目录下是否有pom.xml/ruoyi-*。 - 若用户后端、前端是两个仓库,分别执行本流程;两边的品牌、包名、模块前缀要填同一套值。
- 纯前端仓库(根目录有
package.json、无pom.xml)也能处理:detect会标为「RuoYi 前端(独立仓库)」,此时无需 Java 包名。 - 若路径下没有 RuoYi 特征,停止并说明,不要硬改。
第 1 步:只读检测
python3 <技能目录>/scripts/rebrand.py detect --path <项目根目录> --json
检测内容:RuoYi 变体、Java 包名分布、旧命名 token 数量、Maven modules、启动类、前端目录、是否 Git 仓库。
把结果浓缩给用户看,例如:
识别为 RuoYi-Vue-Plus
原包名:org.dromara(3822 处 / 870 个文件)
模块前缀:ruoyi-(admin/common/modules/extend...)
启动类:DromaraApplication
旧品牌:RuoYi / Dromara / 若依
前端目录:plus-ui(如为独立仓库需单独处理)
识别不到 RuoYi 特征时,直接结束。
第 2 步:逐项确认改名映射
一次性发一张「改名确认单」,不要一轮只问一个字段。自由输入项用普通提问;枚举决策可用 AskUserQuestion。
请确认改名映射(可直接回「全部按推荐」或逐行修改):
1. 新项目英文标识(PascalCase,用于类名/启动类):原 Dromara/RuoYi → ?(例:Acme)
2. 新 Java 包名:原 org.dromara → ?(例:com.acme)
3. 新模块/artifactId 前缀:原 ruoyi → ?(例:acme)
4. 新系统中文展示名:原 若依 → ?(例:Acme 管理平台)
5. 额外改名词(可选):如 plus-ui=acme-ui、ruoyi-ui=acme-ui、旧品牌=新品牌
6. 排除范围(可选):如 .claude/**、.codex/**、文档或某个前端目录
确认规则:
- 用户只给中文项目名(如「智慧园区」)时,追问英文标识(包名/类名必须是 ASCII),中文名用于展示。
- 用户说「按推荐」时按检测结果推导:品牌
Acme、包名com.acme、前缀acme、中文名与品牌同名。 - 包名必须是合法 Java 包名(点分标识符);前缀只能是小写字母/数字/连字符;品牌必须是合法 Java 标识符。
- 原包名与新包名相同、字段为空、格式非法时,先纠正再进入计划。
- 模块前缀与包名最后一段可以不同,但建议保持一致,避免后续困惑。
收集映射有三种方式,任选其一:
- 对话确认(默认):按上面的确认单提问,然后通过命令行参数传给
plan。 - 交互向导:
plan --interactive,脚本逐项提问并回显默认值,适合用户直接在终端操作。 - 配置模板:先
template生成rename.config.json,用户填完再plan --config,适合批量/可复用场景。
python3 <技能目录>/scripts/rebrand.py template --path <项目根目录>
python3 <技能目录>/scripts/rebrand.py plan --path <项目根目录> --config <项目>/.ruoyi-rename/rename.config.json
字段含义与影响见 @references/interaction-flow.md。
第 3 步:生成计划并确认
python3 <技能目录>/scripts/rebrand.py plan \
--path <项目根目录> \
--brand Acme \
--package-from org.dromara \
--package-to com.acme \
--prefix-from ruoyi \
--prefix-to acme \
--display-from 若依 \
--display-to "Acme 管理平台" \
--map plus-ui=acme-ui
计划默认写到 <项目>/.ruoyi-rename/plan.json,同时打印:
- 替换规则(旧词 → 新词)
- 内容文件数 / 替换处数 / 目录重命名数 / 文件重命名数
- 目录与文件重命名清单
- 风险提示(上游链接、LICENSE、非 Git 仓库)
- 冲突(目标路径已存在等)
把摘要展示给用户,并给出以下选项:
- 按计划执行(默认推荐)
- 调整映射(回到第 2 步,重新生成计划)
- 只保留计划,不执行
有冲突时必须先处理,不能执行。
第 4 步:执行
先跑一次 dry-run 核对,再执行:
python3 <技能目录>/scripts/rebrand.py apply --plan <项目>/.ruoyi-rename/plan.json
python3 <技能目录>/scripts/rebrand.py apply --plan <项目>/.ruoyi-rename/plan.json --apply --verify
执行前置检查:
- 计划生成后文件被改动(SHA-256 不一致)、目标路径已存在时直接中止。
- Git 工作区有未提交改动时默认拒绝执行,提示先 commit/stash;用户确认无风险后可加
--allow-dirty。
执行顺序:内容替换 → 文件重命名 → 目录重命名 → 清理被搬空的空目录。执行完成后脚本自动做残留检查、打印回滚命令;加 --verify 会紧接着跑一致性校验。
第 5 步:交付与验证
向用户报告:
- 已改文件数、目录/文件重命名数、备份目录路径、回滚命令
- 残留 token 检查结果(LICENSE、排除目录除外)
- 一致性校验结果(包名与目录、Mapper namespace、pom module、jar 引用)
- 需要人工处理的事项(构建、外部配置、数据库、部署、LICENSE)
单独复查:
python3 <技能目录>/scripts/rebrand.py verify --path <项目根目录> --plan <项目>/.ruoyi-rename/plan.json
校验出现 FAIL 时退出码为 1,需修复后重跑。不要自动跑 Maven/npm 构建,除非用户明确要求。人工清单见 @references/rename-rules.md。
映射规则速查
| 类别 | 典型旧值 | 影响范围 |
|---|---|---|
| Java 包名 | org.dromara / com.ruoyi |
package/import、Mapper namespace、配置扫描包、src/main/java 目录 |
| 模块/artifactId | ruoyi-* |
目录名、pom <module> / <artifactId>、jar 名、Docker/脚本路径 |
| 品牌类名 | RuoYi / Dromara |
RuoYiApplication、DromaraApplication、RuoYiConfig、ServletInitializer、注释与文档 |
| 大写前缀 | RUOYI |
环境变量、常量前缀 |
| 中文展示名 | 若依 |
页面标题、注释、SQL 注释、README |
| 启动脚本 | ry.sh / ry.bat |
文件名及脚本内 jar 名 |
| SQL 文件 | ry_*.sql |
文件名前缀 |
| 前端目录 | ruoyi-ui / plus-ui |
目录名、package.json、.env、页面标题(可用 --map 指定) |
| 额外词 | 任意 | 通过 --map 旧词=新词 扩展 |
默认不改:sys_ 开头的数据库表前缀、业务代码含义、LICENSE/NOTICE、Git 历史、node_modules/target 等产物。详见 @references/ruoyi-structure.md。
回滚
python3 <技能目录>/scripts/rebrand.py restore --backup <项目>/.ruoyi-rename/backup-<时间>
python3 <技能目录>/scripts/rebrand.py restore --backup <项目>/.ruoyi-rename/backup-<时间> --apply
回滚会撤销目录/文件重命名、还原被改文件内容,并清理改名过程中产生的空目录。回滚默认也是 dry-run。
关键实现约束
- 脚本零第三方依赖,仅用 Python 3 标准库(
detect/template/plan/apply/verify/restore)。 - 文本编码优先 UTF-8(含 BOM),失败后回退 GB18030(兼容 GBK),覆盖 Windows 下的
ry.bat、.properties中文文件;写回时保持原编码。 - 替换采用「单次正则、长词优先」,避免
org.dromara被拆成com.dromara之类的链式污染。 - 默认排除
node_modules、target、dist、.git、.idea、二进制、锁文件、LICENSE/NOTICE;可用--exclude追加。 - 计划生成后文件若被改动,执行会校验 SHA-256 并中止;确需继续可加
--force。 - 纯前端仓库(根
package.json、无 Java)无需包名参数,只做品牌/目录/配置替换。
自测
cd <技能目录>/scripts && python3 -m unittest test_rebrand -v
覆盖:检测、纯前端仓库、配置模板、计划、dry-run、执行、校验、Git 脏工作区拦截、回滚、冲突、参数校验、GBK 批处理文件。
明确不做什么
- 不替用户决定新项目名,不静默采用猜测值。
- 不删除业务代码、不清理非空目录、不改 Git 历史。
- 不修改
LICENSE/NOTICE中的上游版权声明。 - 不自动提交、推送、构建或部署。
- 不把「改名」偷换成「重构业务代码」;业务语义不在本技能范围内。