感谢你愿意为 WeQ 做出贡献!为了让协作更顺畅、减少来回返工,请在提交 PR 前完整阅读本文档。
- Node.js ≥ 22.12.0
- 包管理器:pnpm(本仓库锁定
pnpm@12.8.1,请勿使用 npm / yarn,以免破坏pnpm-lock.yaml)
pnpm i # 安装依赖
pnpm native:fetch # 取 nt_helper 原生产物(不入库,dev 克隆里没有;见 docs/develop/native-artifacts.md)
pnpm dev # 启动桌面端开发日常改动先运行与修改直接相关的检查,并在 PR 中说明验证范围与结果;不要求每次提交或 push 前运行全量本地 CI。只改文档时核对命令、链接与源码行为;修改纯逻辑或修复 bug 时 补充针对性回归测试。最终以 CI 全量门禁为准。
发版前、大改动或需要全量复核时,可运行:
pnpm ci:local # 一键跑 CI 的 lint / format / typecheck / test 门禁pnpm ci:local 把 .github/workflows/ci.yml 的门禁在本地按同样顺序复刻一遍,
不 fail-fast —— 那一步红了也继续跑完,最后给一张汇总表。常用参数:
pnpm ci:local --fix—— 先pnpm format+pnpm lint:fix刷平,再跑门禁。 改完代码懒得管格式时用这个,省得再来一轮。pnpm ci:local --full—— 额外跑 web 打包冒烟(≈ CI 的build-webjob)。pnpm ci:local --fail-fast/--list—— 失败即停 / 只打印将跑的步骤。
独立 daemon 已移除,本工程不再需要 Rust 工具链。
需要单独跑某一步时,等价命令是:
pnpm lint # Biome 代码规范检查
pnpm format:check # Biome 格式检查
pnpm typecheck # 类型检查(CI 强制,不通过会被拦截)
pnpm test # 有界并发的全量单测(含 @weq/web),汇总所有失败
pnpm test:fail-fast # 全量范围,首个失败后尽早停止(CI 使用)
pnpm test:changed # 日常只跑改动相关的 Vitest 测试;Web 仍跑完整服务端断言
pnpm check # Biome 的 lint + format 汇总检查
pnpm --filter @weq/web build
桌面端打包(
electron-vite build+electron-builder)不在 PR 门禁里, 由 release 流水线兜底。改动打包链路时本地用pnpm --filter @weq/desktop build:unpack单独验一遍即可。
-
所有 PR 必须以
dev分支为基础分支(base branch)提交,这是硬性要求。main为发布分支,只接受来自dev的合并,不接受直接对main的 PR。- 请从最新的
dev拉出你的功能分支,完成后向dev发起 PR。
-
分支命名:采用
类型/简短描述的形式,类型与 commit 一致,描述用小写短横线连接。例如:feat/linux-adaptation fix/anti-recall-graytip refactor/test-config-cleanup docs/contributing
开始一个新分支的典型流程:
git checkout dev
git pull
git checkout -b feat/your-feature本仓库遵循 Conventional Commits:
<类型>(<可选范围>): <简短描述>
-
描述可用中文。
-
常用类型:
类型 用途 feat新功能 fix修复 bug refactor重构(不改变外部行为) docs文档改动 style代码风格/格式(不影响逻辑) test测试相关 chore构建、CI、依赖等杂项 perf性能优化 -
范围(scope) 可选,用于标注改动模块,如
refactor(types):、style(lint):。 -
示例(取自实际历史):
feat: revoke viewing && export sysFace fix: 灰条撤回消息显示 bug refactor(types): 消除 4 处 explicit any chore: 接入 Biome lint docs: 文档中心框架
- 确认基础分支为
dev(见分支规范)。 - 完成相关提交前检查,说明未运行或未通过的项目。
- 判断你的改动是否属于「全新功能」:
- 全新功能必须先提 Issue 讨论并达成一致,再提交 PR。 未经 Issue 讨论直接提交的新功能 PR 会被关闭(close)。
- 这样做是为了在你投入大量精力前对齐方向,避免功能与项目规划冲突而白费工作。
- Bug 修复、文档完善、小改进可直接提 PR,无需先开 Issue(但在描述里说明背景会更好)。
- PR 描述里请说明:改了什么、为什么改;若关联 Issue,请注明
close #<编号>。 - 保持 PR 聚焦单一主题,不要在一个 PR 里混入多个不相关的改动。
- 代码问题、bug、功能建议优先在 Issue 提出。
- 提 bug 时请尽量提供:复现步骤、期望行为、实际行为、系统/QQ 版本等信息。
- 提新功能建议时请说明使用场景,方便讨论是否纳入。
再次感谢你的贡献!🎉