Rust
开发过程中只对改动的 crate 跑 clippy(
cargo clippy -p <crate> --all-targets -- -D warnings),并且在提交前跑一次就够了。插件 SDK 和官方插件是独立的 workspace,CI 还会针对 wasm32-wasip2 检查它们。
约定:
- 每个 crate 的
lib.rs(以及重要的模块)开头都有一段//!文档注释,说明它的契约。契约变了要同步更新。 - crate 内部用自己的错误类型(
thiserror、anyhow),在公开边界转换为IdeError。 - Tauri 命令和 IPC 类型上的文档注释会变成
src/bindings.ts中的 JSDoc,写的时候要考虑前端读者。 - 用
tracing打日志,不要用println!。在openidea-server中 stdout 承载协议。 - 阻塞或耗时的工作放到
spawn_blocking/ rayon,并响应CancellationToken。
TypeScript 与 React
pnpm knip 发现没人 import 的导出、没人引用的文件或没人用的依赖时会失败。请删掉死代码,而不是屏蔽检查;只在本文件内使用的导出是允许的。
约定:
- 应用内模块通过
@/别名导入(@/platform/ipc、@/workbench/contributions)。 - 状态放在 zustand store 里;功能通过 action 和 contribution 暴露行为,而不是导出给其他功能 import 的单例。
- 样式和 UI 规则见 UI 规范,文本见本地化。
pre-commit 钩子
pnpm install 会安装一个 pre-commit 钩子(simple-git-hooks + lint-staged),对暂存的文件运行:
- JavaScript 和 TypeScript 文件:
oxlint --fix; - 所有文件:
oxfmt(TOML 和生成文件在其配置中被忽略); - Rust 文件:
rustfmt --edition 2024。
注释
注释要少而有用,并与周围代码风格一致:- 解释为什么、某个约束或不明显的契约;不要复述下一行代码在做什么。
- 某行代码是因为某个具体 bug 报告而存在时,像现有代码那样注明 issue 编号(
(#1878))。 - 不要在注释里保留变更记录或注释掉的代码;历史在 git 里。
生成的文件
以下文件禁止手改,要重新生成:提交与 PR 标题
使用带 scope 的 Conventional Commits:fix(editor): keep the caret visible after folding、feat(vcs): …、perf(index): …。全仓库格式化的那次提交记录在 .git-blame-ignore-revs 里,用 git blame --ignore-revs-file .git-blame-ignore-revs 可以跳过它。