# Phase 001 — 仓库骨架搭建 | 项 | 值 | |---|---| | 目标 | 把 reference 源码拷进 hermes-ui,裁成最小可运行骨架 | | 前置 | 无 | | 产出 | 新项目根目录有完整可 `npm ci && npm run build` 的代码 | | 验收命令 | `npm ci --ignore-scripts && npm run build` | --- ## 0. 铁律:reference 的使用边界 ``` reference_code/ekko-studio/ ← 只读参考,不是新项目的一部分 hermes-ui/ ← 新项目本体 ``` **硬约束**: 1. `reference_code/` **只在 Phase 001 被读取一次**(用于拷贝与对照)。 2. **从 Phase 002 起,禁止任何代码、配置、文档、测试引用 `reference_code/` 下的路径。** 3. 拷贝必须是**复制进新项目**,不是软链、不是 git submodule、不是运行时挂载。 4. Phase 001 结束时,`hermes-ui/` 内的文件必须自洽——把 `reference_code/` 整个删掉,`npm ci && npm run build && npm run test` 仍应通过。 验收方式(Phase 001 收尾自查): ```bash cd /Users/jack/source/MyProject/js/hermes-ui grep -rn "reference_code" . --include="*.ts" --include="*.vue" --include="*.json" \ --include="*.mjs" --include="*.md" --include="*.yml" | grep -v "^./docs/phases/" # 期望:零命中 ``` --- ## 1. 目录创建 ```bash cd /Users/jack/source/MyProject/js/hermes-ui mkdir -p docs/phases # docs/ 与 docs/phases/ 已存在 ``` --- ## 2. 拷贝(用 rsync 排除,不做人工挑拣) 参考源码:`reference_code/ekko-studio/` ### 2.1 拷贝保留项 ```bash REF=reference_code/ekko-studio DST=. # 包与测试 rsync -a $REF/packages/client ./packages/ rsync -a $REF/packages/server ./packages/ rsync -a $REF/packages/skills ./packages/ rsync -a $REF/tests/ ./tests/ rsync -a $REF/bin/ ./bin/ rsync -a $REF/scripts/ ./scripts/ # 根配置 for f in package.json package-lock.json vite.config.ts vitest.config.ts \ playwright.config.ts tsconfig.json tsconfig.app.json \ tsconfig.node.json nodemon.json Dockerfile docker-compose.yml \ .dockerignore .gitignore; do cp -p $REF/$f ./$f done # 文档(只拷 harness 与 chat-chain-changes 的 README,不拷旧正文) mkdir -p docs/harness docs/chat-chain-changes rsync -a $REF/docs/harness/ ./docs/harness/ cp -p $REF/docs/chat-chain-changes/README.md ./docs/chat-chain-changes/ cp -p $REF/LICENSE ./LICENSE ``` ### 2.2 拷贝**后**立即删除(不在新项目存在) ```bash rm -rf packages/desktop packages/website packages/ekko-agent packages/esp32-c3 rm -rf tests/ekko-agent rm -rf packages/client/public/coding-agents rm -f tsconfig.website.json rm -rf docs_new ``` ### 2.3 同步清理 `.github/workflows`(只留 5 个) ```bash cd .github/workflows rm -f desktop-release.yml desktop-manual-build.yml \ desktop-mac-update-manifest.yml desktop-runtime.yml website-deploy.yml ls # 期望:build.yml docker-publish.yml npm-lockfile-check.yml \ # playwright.yml webui-release.yml ``` > `webui-release.yml` 先保留,Phase 002 去品牌时改名。 ### 2.4 不拷的东西(清单) | 不拷 | 原因 | |---|---| | `packages/desktop/` | 整包砍 | | `packages/website/` | 官网砍 | | `packages/ekko-agent/` | J 组砍 | | `packages/esp32-c3/` | 固件不做(**若要做语音硬件,另开 phase 并从这里恢复**) | | `tests/ekko-agent/` | 随 J 组砍 | | `docs_new/` | 旧版规划文档,已被 `docs/01~03` 取代 | | `docs/planning/` | 上游作者的过程笔记 | | `docs/*.md`(顶层散落) | 旧功能文档,本项目另有 `docs/02-功能清单` | | `packages/client/public/coding-agents/` | 随 I 组砍 | | `agent-bridge/python/__pycache__/` | Python 字节码,见 3.3 | --- ## 3. 配置文件改造 ### 3.1 `package.json`(**本 Phase 只做最小改动**) 必须改: ```jsonc { "name": "hermes-ui", "version": "0.6.29", // 从此版本起自己走 "bin": { "hermes-ui": "./bin/hermes-ui.mjs" } } ``` **暂时不改**:`scripts` / `dependencies`。 理由:`build` / `dev` / `test` / `test:e2e` 全部要留,desktop 相关 script 删了但依赖还在,下一个 Phase 再统一清。`npm ci` 依赖 `package.json` 与 `package-lock.json` 一致,任何依赖增删都会让 `npm ci` 失败——所以依赖清理留到 Phase 004 一次性做。 **必须摘掉**(否则 `npm ci` 会自动触发 build): ```jsonc "scripts": { // 删掉 "prepare": "[ -d dist ] || npm run build" } ``` Phase 007 收尾时再恢复。 ### 3.2 `bin/` 重命名 ```bash git mv bin/hermes-web-ui.mjs bin/hermes-ui.mjs # 或 mv git mv bin/hermes-web-ui-mcp.mjs bin/hermes-ui-mcp.mjs rm -f bin/hermes-studio-mcp.mjs # "studio" 是旧品牌 ``` 重命名后要改文件内部的自引用(路径、`process.env.npm_package_name` 之类)。Phase 002 会做全量品牌扫描,本 Phase 只需保证文件存在、`npm run build` 不报错。 > `package.json` 的 `bin` 若指向 `hermes-ui-mcp` 也一并改名,两边必须一致。 ### 3.3 `nodemon.json` `watch` 里删掉 `packages/ekko-agent/src`(该包已不存在,留着 dev 会报路径错误)。 ### 3.4 `vite.config.ts` 本 Phase 不动。Phase 005 改 `manualChunks` / `optimizeDeps`。 ### 3.5 清理 Python 字节码 ```bash find packages/server/src/services/hermes/agent-bridge/python/__pycache__ -type f -delete rmdir packages/server/src/services/hermes/agent-bridge/python/__pycache__ 2>/dev/null ``` 在 `.gitignore` 加 `__pycache__/`。 --- ## 4. 文档编写(**必须在本 Phase 完成,不能拖**) 代码要继承旧版硬规则,但旧版 `AGENTS.md` / `ARCHITECTURE.md` / `DEVELOPMENT.md` 全是旧品牌,必须重写。 | 文件 | 内容要求 | |---|---| | `AGENTS.md` | **≤120 行**。包地图改为 `packages/client` / `packages/server` / `packages/skills` / `tests/*`。保留「Hard Rules」全部 6 条。链接下面 4 个文档。禁止出现 `ekko` / `hermes-web-ui`。 | | `ARCHITECTURE.md` | 包边界、数据归属、运行时流。**删掉** "Electron desktop distribution" 段落与 "Desktop Release Flow" 整节。**新增**一句:`HERMES_WEB_UI_HOME` 是有意保留的旧标识(配置层),见 `docs/03-施工蓝图.md` §0。 | | `DEVELOPMENT.md` | 命令表 + 编码规则 + 测试规则 + PR 形态。把 L47 "Match existing Naive UI patterns and avoid adding a new UI library" 改为 **Arco Design Vue**。 | | `README.md` / `README_zh.md` | 重写。项目简介、装 Python + hermes-agent 的前置步骤(**因为砍了桌面端,不再捆绑**)、启动命令、目录结构。 | | `docs/harness/*.md` | 4 个文件直接从 reference 拷贝。但要检查内容里是否引用了 desktop/ekko,有则改。 | `docs/01` / `docs/02` / `docs/03` 已在仓库里,本 Phase 不动。 --- ## 5. 验收 ### 5.1 命令 ```bash cd /Users/jack/source/MyProject/js/hermes-ui npm ci --ignore-scripts npm run build ``` `build` 必须零 TS 报错。 ### 5.2 自查清单 - [ ] `ls packages/` 只有 `client` `server` `skills` - [ ] `ls tests/` 只有 `client` `server` `e2e` `shared` `fixtures` - [ ] `ls .github/workflows/` 只有 5 个文件 - [ ] `grep -rn "reference_code" .` 零命中(排除 `docs/phases/`) - [ ] `package.json` 的 `name` 是 `hermes-ui`,无 `prepare` script - [ ] `bin/` 下是 `hermes-ui.mjs` + `hermes-ui-mcp.mjs` - [ ] `AGENTS.md` ≤120 行且无旧品牌 - [ ] `__pycache__` 已清、`.gitignore` 已加规则 - [ ] `git init` 已执行(若尚未初始化) ### 5.3 冒烟(本 Phase 不要求功能正确,只要求不崩) ```bash npm run dev # 打开 http://localhost:5173 # 登录页能渲染即通过(后端功能此阶段不完整是正常的) ``` --- ## 6. 风险 | # | 风险 | 缓解 | |---|---|---| | P1-1 | 删 `packages/desktop` 后根 `package.json` 仍有 electron 依赖,`npm ci` 正常但体积浪费 | 故意为之,Phase 004 统一清 | | P2-1 | 改 `package.json` 导致 `npm ci` 报 lock 不同步 | **本 Phase 只改 `name` / `bin` / 删 `prepare`,不动 `dependencies`** | | P3-1 | `npm ci` 因缺 `prepare` 而不 build,后续 `npm run build` 手动执行 | 正常 | | P4-1 | 漏拷隐藏文件(`.dockerignore` 等) | 用显式 `cp -p` 列表,不靠通配 | | P5-1 | reference_code 与原仓库有偏差 | 后续 phase 需要对照时,**用 git 提交历史比对而非直接拷**;实在需要可再读 reference,但产物必须写进新项目 | --- ## 7. 完成标志 进入 Phase 002。