247 lines
8.0 KiB
Markdown
247 lines
8.0 KiB
Markdown
# Phase 002 — 去品牌 + i18n 收敛到 zh/en
|
||
|
||
| 项 | 值 |
|
||
|---|---|
|
||
| 目标 | 全仓无 `ekko` / `hermes-web-ui` 字样;i18n 只剩 zh + en |
|
||
| 前置 | Phase 001 通过 |
|
||
| 产出 | `grep -ri "ekko\|hermes-web-ui"` 在代码范围内零命中 |
|
||
| 参考 | `docs/03-施工蓝图.md` §4 |
|
||
|
||
---
|
||
|
||
## 0. 保留白名单(**这些必须留着**)
|
||
|
||
以下旧标识是你主动决定保留的,改了会破坏已有部署脚本与数据目录:
|
||
|
||
```
|
||
HERMES_WEB_UI_* 环境变量前缀
|
||
HERMES_WEBUI_STATE_DIR 环境变量
|
||
~/.hermes-web-ui/ 默认数据目录
|
||
hermes_brightness localStorage key
|
||
hermes_style localStorage key
|
||
hermes_locale localStorage key
|
||
```
|
||
|
||
判定命令必须带排除:
|
||
|
||
```bash
|
||
grep -rn "HERMES_WEB_UI\|hermes_brightness\|hermes_style\|hermes_locale" packages/
|
||
# 这些命中是正常的
|
||
```
|
||
|
||
---
|
||
|
||
## 1. 功能任务 1 — 根配置去品牌
|
||
|
||
| 文件 | 改动 |
|
||
|---|---|
|
||
| `package.json` | `name`: `hermes-ui`(Phase 001 已做);`description` / `keywords` / `author` / `license` 去旧品牌;`repository` / `homepage` 指向你自己仓库或整项删除 |
|
||
| `README.md` / `README_zh.md` | Phase 001 已重写,复查一遍 grep |
|
||
| `AGENTS.md` | 复查;确认硬规则 6 条齐全 |
|
||
| `ARCHITECTURE.md` | 确认无 "Electron desktop distribution" / "Desktop Release Flow" |
|
||
| `DEVELOPMENT.md` | 确认 L47 那条已改为 Arco |
|
||
| `Dockerfile` | 镜像名、EXPOSE、ENTRYPOINT 里的旧品牌 |
|
||
| `docker-compose.yml` | 容器名、volume 名、image 名 |
|
||
| `.dockerignore` / `.gitignore` | 旧品牌路径 |
|
||
| `LICENSE` | 上游许可证保留(MIT 或 Apache,看一眼 LICENSE 首行确认) |
|
||
|
||
---
|
||
|
||
## 2. 功能任务 2 — server 侧去品牌(**本 Phase 最容易漏**)
|
||
|
||
### 2.1 `controllers/update.ts`(重点文件,必查)
|
||
|
||
grep 这个文件会命中几十处,逐个处理:
|
||
|
||
| 类别 | 处理 |
|
||
|---|---|
|
||
| 预览目录名 `hermes-web-ui-pereview` | 改 `hermes-ui-preview` |
|
||
| `hermes-web-ui/bin/hermes-web-ui.mjs` | 改 `hermes-ui/bin/hermes-ui.mjs` |
|
||
| `pkg?.name !== 'hermes-web-ui'` 的版本比对 | 改 `'hermes-ui'` |
|
||
| `User-Agent` 里的旧品牌 | 改 `hermes-ui/<version>` |
|
||
| npm 全局安装 `hermes-web-ui@latest` | 见 2.3 的决策 |
|
||
| 各类提示文案 | 改用户可见文案,同步写 zh + en |
|
||
|
||
### 2.2 `config.ts`
|
||
|
||
- 检查 `https://hermes-studio.ai` 相关的默认下载地址
|
||
- **保留**所有 `HERMES_WEB_UI_*` 环境变量名
|
||
|
||
### 2.3 `update.ts` 的在线更新:先做决策落地
|
||
|
||
`hermes-ui` 未发布 npm,所以"检查更新 / 一键更新"**功能上不可用**。
|
||
|
||
本 Phase 采用:**保留逻辑、改文案标注**。
|
||
|
||
```
|
||
"title": "检查更新"
|
||
"currentIsLatest": "当前为源码运行,在线更新不可用"
|
||
"checkFailed": "检查更新失败"
|
||
```
|
||
|
||
不动 `npm i -g` 的代码路径。等你决定发布方式(npm / GitHub Release)再接。
|
||
|
||
### 2.4 其他 server 文件
|
||
|
||
| 文件 | 改动 |
|
||
|---|---|
|
||
| `services/hermes/agent-bridge/manager.ts` | OpenRouter attribution URL(`hermes-studio.ai`)→ 改成你自己的地址,或删掉 attribution |
|
||
| `lib/llm-prompt.ts` | grep 到 `/Users/ekko/Desktop` 是**原作者本机路径**,直接删该分支逻辑,不改名 |
|
||
| `services/hermes/studio-mcp-autoinject.ts` | 文件名含 `studio`;grep 内容确认是否有旧品牌串。有则改内容;**文件名可保留**(它指 hermes 的 studio 功能,不是本项目品牌),也可改名 `mcp-autoinject.ts` |
|
||
|
||
**扫法**:
|
||
|
||
```bash
|
||
cd /Users/jack/source/MyProject/js/hermes-ui
|
||
grep -rn "ekko\|Ekko\|EKKO\|hermes-web-ui\|hermes-studio\|Hermes Studio" packages/server/src/
|
||
```
|
||
|
||
逐个 `Read` 确认后改。不要盲改——`Hermes` 字样本身要保留。
|
||
|
||
---
|
||
|
||
## 3. 功能任务 3 — client 侧去品牌
|
||
|
||
| 文件 | 改动 |
|
||
|---|---|
|
||
| `index.html` | `<title>`(原 `Hermes Studio`)、`apple-mobile-web-app-title` |
|
||
| `public/manifest.webmanifest` | `name` / `short_name` / `description` |
|
||
| `i18n/locales/zh.ts` `en.ts` | 所有旧品牌文案 |
|
||
| `data/changelog.ts` | **建议整体清空**,从 0.6.29 重新起 |
|
||
| `public/notification-sw.js` | 检查缓存名 |
|
||
| `components/hermes/chat/*.vue` | grep 命中的显示文案 |
|
||
| `App.vue` / `main.ts` / `router/index.ts` | grep 复查 |
|
||
|
||
```bash
|
||
grep -rn "ekko\|hermes-web-ui\|Hermes Studio" packages/client/
|
||
```
|
||
|
||
---
|
||
|
||
## 4. 功能任务 4 — 测试同步
|
||
|
||
| 文件 | 改动 |
|
||
|---|---|
|
||
| `tests/client/pwa-metadata.test.ts` | 断言的 title / manifest 名同步改 |
|
||
| `tests/client/style-system.test.ts` | 断言的 Naive key 暂不动(Phase 007 重写为 Arco) |
|
||
|
||
---
|
||
|
||
## 5. 功能任务 5 — i18n 收敛到 zh + en
|
||
|
||
### 5.1 删 8 个 locale
|
||
|
||
```bash
|
||
cd packages/client/src/i18n/locales
|
||
rm -f zh-TW.ts ja.ts ko.ts fr.ts es.ts de.ts pt.ts ru.ts
|
||
ls # 期望:en.ts zh.ts
|
||
```
|
||
|
||
### 5.2 `messages.ts`
|
||
|
||
`supportedLocales` 从 10 项改为:
|
||
|
||
```ts
|
||
export const supportedLocales = ['en', 'zh'] as const
|
||
```
|
||
|
||
**逐条检查** `messages` 里是否有依赖被删语言的映射(如 `localeNames` 字典),删干净。
|
||
|
||
### 5.3 `i18n/index.ts`
|
||
|
||
`normalize()` 简化为:
|
||
|
||
```
|
||
zh / zh-CN / zh-Hans / zh-* → zh
|
||
其余一律 → en
|
||
```
|
||
|
||
删掉对 `zh-TW` / 其他语种的手写分支。
|
||
|
||
### 5.4 `tests/client/i18n-coverage.test.ts`
|
||
|
||
`rawMessages` 改为两项:
|
||
|
||
```ts
|
||
const rawMessages = [enMessages, zhMessages]
|
||
```
|
||
|
||
该测试的断言逻辑(key 集合一致、中文值非空)**保留不动**——这是「新增字符串必须同时写两语言」这条硬规则的机械保障。
|
||
|
||
---
|
||
|
||
## 6. 功能任务 6 — 新增机械化保障(**本 Phase 加上,防止后续回流**)
|
||
|
||
### 6.1 `tests/client/no-naive-ui.test.ts`
|
||
|
||
Phase 001 还没换库,先建文件占位也行,但**去品牌的这个必须现在就加**:
|
||
|
||
新建 `tests/server/no-legacy-brand.test.ts`:
|
||
|
||
```ts
|
||
// 扫描 packages/{client,server}/src、tests/、scripts/、bin/
|
||
// 命中 'ekko' | 'hermes-web-ui'(排除白名单)即 fail
|
||
```
|
||
|
||
白名单(这些允许出现):
|
||
```
|
||
HERMES_WEB_UI_*, HERMES_WEBUI_STATE_DIR,
|
||
hermes-web-ui 作为数据目录名出现在 config 默认值里 —— 例外,
|
||
需要单独加白名单项或改成不出现字面量
|
||
```
|
||
|
||
**注意**:`config.ts` 里如果有 `~/.hermes-web-ui` 字面量,它既是保留项又是命中项。处理方式二选一:
|
||
- 在测试里对 `config.ts` 单文件加白名单
|
||
- 或把默认目录名改成拼接(如 `['hermes', 'web-ui'].join('-')`)—— 不推荐,太丑
|
||
|
||
**建议前者**,白名单写清楚原因。
|
||
|
||
### 6.2 同步加进 harness-check
|
||
|
||
Phase 007 会重写 `scripts/harness-check.mjs`,但**品牌扫描这一条现在就要加进去**,这样后续每个 Phase 都有机械保障。
|
||
|
||
---
|
||
|
||
## 7. 验收
|
||
|
||
```bash
|
||
cd /Users/jack/source/MyProject/js/hermes-ui
|
||
|
||
# 零命中
|
||
grep -rni "ekko" packages/ tests/ scripts/ bin/ .github/ *.json *.md Dockerfile* docker-compose.yml
|
||
grep -rni "hermes-web-ui" packages/ tests/ scripts/ bin/ .github/ *.json Dockerfile* docker-compose.yml
|
||
|
||
# 白名单仍存在
|
||
grep -rn "HERMES_WEB_UI" packages/server/src/config.ts | head -5
|
||
|
||
# 构建与测试
|
||
npm run build
|
||
npm run test
|
||
```
|
||
|
||
### 手工验收
|
||
|
||
- [ ] 浏览器标签页标题是 `hermes-ui`
|
||
- [ ] PWA manifest 名已更新
|
||
- [ ] 语言切换只有 中文 / English 两项
|
||
- [ ] 切到 English,界面全英文无残留中文
|
||
- [ ] 设置页「检查更新」文案显示"源码运行"
|
||
|
||
---
|
||
|
||
## 8. 风险
|
||
|
||
| # | 风险 | 缓解 |
|
||
|---|---|---|
|
||
| P2-1 | `update.ts` 品牌串极多,漏改会导致 `npm run harness:check` 红 | 该文件单独 `grep -c` 计数,改完归零 |
|
||
| P2-2 | i18n 删除导致某语言下界面显示 key 本身 | `en` 是 fallback,只删非 en/zh 的,不影响 |
|
||
| P2-3 | 白名单与扫描规则互相打架(`~/.hermes-web-ui`) | 测试里显式白名单 + 注释说明原因 |
|
||
| P2-4 | changelog 清空后 `VersionPreviewView` 空白 | 清空 `data/changelog.ts` 的同时把该视图的入口隐藏,或留一条 0.6.29 说明 |
|
||
| P2-5 | 误删 `Hermes` 字样 | 判定用 `ekko` 与 `hermes-web-ui`,不用 `hermes` |
|
||
|
||
---
|
||
|
||
## 9. 完成标志
|
||
|
||
进入 Phase 003(砍 I/J 组)。
|