实现或修改 IntelliJ `AnAction`,并在 `plugin.xml` 中注册。将显示名称和说明写入消息资源文件,按需设置图标,并通过事件协程作用域启动挂起任务,避免同步处理阻塞 IDE。
- 为 IDE 菜单添加操作
- 修改操作注册或图标
- 整理操作名称和说明
本技能帮助编写和审查仓库构建工具中的 Rust 代码,涵盖命令行设计、错误处理、类型、格式、测试、依赖与 Bazel 检查,并区分自动化工具和面向用户的命令。
Write or review Rust in the build tools.
实测评分 未实测
查看安装方法本技能整理了构建工具中 Rust 工作区的专用约定。首先判断工具是由 Bazel 调用的自动化动作工具,还是供人员或代理使用的命令行工具,然后采用相应的参数格式和错误处理方式。内容涵盖路径类型、为错误补充上下文、Lint 例外写法、拆分 crate 的条件,以及测试和测试数据的存放位置。技能还列出了修改前后需要执行的检查,包括 cargo fmt、Clippy、Bazel 同步与构建检查,以及面向 Windows 的检查。
修改 dev-dist tools、BT 或 Air UI-lane tooling 等 Rust 工作区,或者检查现有代码是否符合命令行行为、错误处理和测试规范时,可以使用本技能。
本技能适用于资料中列出的仓库内 Rust 工具工作区。验证需要 Rust、Bazel、Bun 环境,以及各工作区对应的命令。
本介绍由 AI(OpenAI Codex)根据公开的 SKILL.md 撰写。准确的规格请查看下方原文。
AI 根据 SKILL.md 的内容检查了需要注意的操作和使用前提。评分只依据实际运行的结果(实测对比)。
不计入评分。 由 AI(OpenAI Codex)于 2026年10月28日 评估。仅供参考,安装前请同时查看原文。
安装前可以查看交给 AI 代理的指令内容。
These rules apply to the Rust tool workspaces: the dev-dist tools, BT and the Air UI-lane tooling. The spec of a
workspace is community/build/rust-tools/README.md. It names the files, the
Bazel targets and the checks that every workspace has. This skill holds the idioms.
A tool has one of two audiences. The audience picks the error model and the command line grammar.
| Action tool | Person- or agent-facing CLI | |
|---|---|---|
| Writes the command line | Bazel, in an action | a person, an agent or a script |
| Examples | the packer, the collector, the composer, the descriptor writer | bt, vm |
| Error model | anyhow, ERROR: {e:#}, a nonzero exit | a typed Refusal with a stable code and exit |
| Command line | the cli crate, --key=value | clap derive |
| Crate closure | pinned in closure.txt | not pinned |
Bazel reads only "nonzero" from an action tool. A person or an agent branches on the exit code and on the refusal code.
An action tool returns anyhow::Result from every function and prints the chain once. main.rs stays thin:
fn main() -> ExitCode {
ExitCode::from(run(std::env::args_os().skip(1), &mut std::io::stdout(), &mut std::io::stderr()))
}
run calls the tool and passes an error to cli::report, which prints ERROR: {error:#}. Each tool keeps its own exit
codes. bins/runtime-layout/src/main.rs of the dev-dist tools shows the shape.
A person- or agent-facing CLI answers a Refusal { code, message, exit, details }. The code is the stable half that a
caller automates against. The shared crate community/tools/bt/crates/refusal holds the type, with the details as JSON
text. Its type parameter is the exit vocabulary, so each tool keeps its own exit codes: bt uses u8 with the codes 0
to 6 of community/tools/bt/crates/bt-core/src/exit.rs, and the Air UI-lane controller uses avl_base::Exit. A tool
that converts a refusal of another tool maps the exit by its meaning, never by its number.
Bazel writes the argv of an action tool, so the tool reads it with the cli crate. The crate has no dependency, and
it refuses every other form with one text. community/build/dev-dist-tools/crates/cli/API.md lists the refusals.
let mut options = cli::parse(args)?;
let output = options.require("--output")?;
let parts = options.take_all("--part")?;
options.finish()?; // refuses an option that the tool did not take
A person- or agent-facing CLI uses clap derive: help, environment variables, suggestions and -- passthrough.
community/tools/bt/bins/bt/src/options.rs is the example. Use no third grammar and no hand-written argument loop.
.editorconfig. The synced rustfmt.toml of each workspace sets it.cargo fmt in the workspace directory before every commit.[lints] workspace = true in its Cargo.toml. The crate macro fails
without it.#[expect(lint, reason = "...")], never #[allow]. An expectation that stops firing fails
the build, so a stale exception shows.clippy.toml bans fs::canonicalize and the tempfile calls that fail past MAX_PATH on Windows. A site that
needs a banned call states why:#[expect(
clippy::disallowed_methods,
reason = "the parent resolves the expected directory with the same call, so both sides agree on /private on macOS"
)]
anyhow in a library too. Use io::Result only where a caller branches on the ErrorKind, as fscopy does..with_context(|| format!("cannot read {}", path.display())).format!("{error:#}"). A test that checks a kind uses
error.downcast_ref::<io::Error>().Path and PathBuf for every host path. Use str only for a slash-form path inside a distribution or a jar.
distpath validates such a path once, at the input boundary.pub(crate) inside a binary. The unreachable_pub lint is on.main.rs thin: parse, call, report. The work lives in modules that the tests call directly.closure.txt, such as
community/build/dev-dist-tools/bins/content-module-packer/closure.txt. A change to any crate in the closure reruns
every action of the tool, so <bin>_closure_test makes each new crate a visible choice./// It is written by hand, because a crate dependency in the packer re-keys every packing action when the crate changes.
pub(crate) fn is_versioned_module_info(name: &str) -> bool {
API.md of the crate lists each refusal.<module>.rs ends with #[cfg(test)] mod tests;, and the tests live in <module>/tests.rs. The tests of
lib.rs or main.rs live in src/tests.rs. There is no mod.rs: mod_module_files is on.tests/cli.rs. The run-time CARGO_BIN_EXE_<name> gives the binary.
Under Bazel the path is relative, so make it absolute before the test changes the directory.testdata/ through one lookup: the variable that the crate macro sets under Bazel, such as
DDT_TESTDATA_DIR, and the run-time CARGO_MANIFEST_DIR under cargo. The rules_rust process wrapper refuses
env!("CARGO_MANIFEST_DIR"). A file that include_str! reads is compile_data of the crate.clippy-windows-* targets of the workspace and the cross-target cargo clippy below.README.md of a workspace holds the crate map and the gates.API.md of a crate under the subset rule holds the supported subset and a refusal table.serde = "1.0.229". Cargo reads it as a caret requirement.Cargo.lock is the pin, and rules_rs reads it.cargo update, raise the requirements to the locked versions, and refresh the hub.community/MODULE.bazel generates @ddt and @bt from the workspace Cargo.toml and Cargo.lock. After a change of
Cargo.lock, update the Bazel lockfiles of both roots. For the dev-dist tools:
cd community && ./bazel.cmd build --nobuild --lockfile_mode=update //build/dev-dist-tools/...
cd .. && ./bazel.cmd build --nobuild --lockfile_mode=update @community//build/dev-dist-tools/... //build/dev-dist-tools/...
For BT, use //tools/bt/... and @community//tools/bt/.... The extension watches only the workspace Cargo.toml and
Cargo.lock. A dependency that moves between [dev-dependencies] and [dependencies] of a member leaves the lock
unchanged. Then touch the workspace Cargo.toml, for example with a comment line, and run the commands again.
Run them before a commit, in addition to the gates of the workspace README:
cargo fmt --check && cargo clippy --all-targets # in the workspace directory
bun community/build/rust-tools/sync.mjs --check
cd community && ./bazel.cmd test //build/dev-dist-tools/... //tools/bt/... //build/rust-tools/...
RUSTC_BOOTSTRAP=1 cargo clippy -Zbuild-std=std,panic_abort --target x86_64-pc-windows-msvc --workspace --all-targets
From the ultimate root, also run ./bazel.cmd test @community//build/dev-dist-tools/... //build/dev-dist-tools/....
The clippy tests of a community crate run only from community/, because the clippy aspect skips a target of an
external repository.
| What | Where |
|---|---|
| The spec of a workspace, the checks, how a workspace joins | community/build/rust-tools/README.md |
The lint, format and clippy sources, and sync.mjs | community/build/rust-tools/ |
The Bazel macro core: rust_tool_crate, optimized_binary, windows_clippy_tests | community/build/rust-tools/defs.bzl |
| The dev-dist tools: crate map, gates, agent rules | community/build/dev-dist-tools/README.md and AGENTS.md |
| BT | community/tools/bt/README.md |
| The Air UI-lane tooling: crate map, gates, agent rules | community/tools/vm/README.md and AGENTS.md |
还没有评价。欢迎分享你的使用感受。
无需登录即可发表。欢迎分享使用感受、提问,或说明在哪些环境下无法运行。
还没有评论。来写第一条吧。
实现或修改 IntelliJ `AnAction`,并在 `plugin.xml` 中注册。将显示名称和说明写入消息资源文件,按需设置图标,并通过事件协程作用域启动挂起任务,避免同步处理阻塞 IDE。
将 IntelliJ JPS 测试模块迁移到 Bazel,并排查仅在 Bazel 中出现的失败。根据症状检查依赖、插件、测试数据和 runfiles,重新生成并验证目标。
按 IntelliJ 项目规范编写或审查 Kotlin 和 Java 代码,涵盖语言选择、格式、密封类型、线程注解及控制流异常处理。
本指南帮助您按 IntelliJ 项目规则拆分更改并撰写提交信息:有工单时使用编号和变更说明,无工单时使用标签与子系统名,并在需要时说明原因和决定。
使用多个 Python 类型检查器比较代码片段或文件的类型推断和报错判断,并汇总各工具的结论、耗时与诊断信息,可保存为 Markdown 报告。
整理 Compose Desktop 界面中的状态和副作用,让可组合函数负责绘制,由展示器或协调器处理应用决策。了解状态归属、Effect、可复用组件接口、延迟列表键、动画和性能,适用于单项界面修改。