本文件为 Gemini 在本仓库中工作时提供指引。基于 CLAUDE.md 和 AGENTS.md 提炼。
HexoPress 是一款基于 Electron + Vue 3 + Vite + Fastify 的 Hexo 博客桌面编辑器。它通过读取 Hexo 本地缓存,提供文章、分类、标签和媒体资源的可视化管理界面。
核心技术栈:
- Runtime: Node ≥ 20.8.1, npm >= 10.5.5
- Electron: 主进程与渲染进程架构
- Frontend: Vue 3, Vite, Pinia, Vue Router, Element Plus, UnoCSS, vue-i18n
- Backend (Main): Hexo CLI 集成, Fastify (图片服务)
完整架构说明见
docs/architecture-overview.md,包含进程模型、Web mode、bridge 层、IPC 契约等详细内容。
main/: Electron 主进程代码。main.ts: 入口,注册所有 IPC 处理器。preload.ts: IPC 桥接(window.site.*)。lib/: 核心服务(HexoAgent、FsAgent、HttpServer)。
web/: Web mode 服务端(Fastify、鉴权、REST 路由)。src/: 渲染进程(Vue 3)代码。renderer.ts: 入口。bridge/: 运行模式抽象层,@/bridgealias 在编译时切换 electron/web 实现。views/: 页面(Dashboard、PostList、Editor 等)。stores/: Pinia 状态管理。components/: UI 组件。
shared/: 主进程与渲染进程共享的无状态工具库。blog/: 内置 Hexo 博客示例(兼作操作手册)。docs/: 项目文档(架构概览、API 参考、ADR、编码规范等)。tsconfig/: 各环境的 TypeScript 配置(app、node、vitest、tools)。types/: 全局类型声明(local.d.ts等)。
npm install # 安装依赖
npm run dev # 启动开发环境 (Electron + Vite)
npm run package # 打包应用
npm run make # 构建安装包在提交代码前,必须执行并通过以下所有命令:
- 格式化:
npm run format(Prettier) - Lint:
npm run lint(ESLint --fix) - 类型检查:
npm run check-all(并行运行以下所有检查)npm run vue-check: 检查.vue文件npm run node-check: 检查主进程文件npm run vitest-check: 检查测试文件npm run conf-check: 检查配置文件
- 单元测试:
npm run test(Vitest + JSDOM)
如果修改了 docs/ 以外的 .md 文件,也必须运行 npm run format。
- 语言: 与开发者沟通使用中文;Commit Message 使用英文。
- Commit 规范: 遵循 Conventional Commits (
feat:,fix:,docs:,refactor:,test:等)。 - 命名约定:
- 变量/属性:
camelCase - 类/类型:
PascalCase
- 变量/属性:
- 样式: 新页面优先使用 UnoCSS (
src/uno.config.ts)。旧页面可能保留旧样式,同一页面内避免混用。 - 测试规范:
- 文件位置: 源码同级
__tests__/目录。 - 工具:
@vue/test-utils。 - 注意: Element Plus 组件 stub 需定义 props/emit 类型以通过 TS 检查。
- 文件位置: 源码同级
- 线性历史: 保持主干线性提交。
- Rebase: 提交 PR 或合并前,务必
rebase最新主干。 - 分支清理: 合并后立即删除分支。
- 原子提交: 每个 Commit 应是完整、可运行的单元。使用
--amend完善提交。
- 类型检查分离: 根据修改文件类型运行对应的 check 命令 (
vue-check,node-check,vitest-check),或直接运行check-all。 - 隐式 Any: 模板内联箭头函数可能导致 TS7006,应提取为命名函数。
- Element Plus Stubs: 测试中需显式定义 stub 的 props/emit 类型,避免
unknown推断错误。 - Async Listeners:
watch回调等异步更新可能需要多次await nextTick()才能在测试中被断言。 - Array.prototype.at: 注意不同
tsconfiglib 差异,兼容性不确定时推荐arr[arr.length - 1]。 - 示例数据:
blog/目录仅作演示,修改前需确认不影响文档。