IntelliJプラグインのAnActionと登録設定を実装・変更し、表示文言やアイコンの定義、非同期処理の起動方法を整えます。
- IDEに新しいアクションを追加したいとき
- アクションの登録やアイコンを変更したいとき
- 表示名と説明文の定義を整理したいとき
ビルドツール群で使うRustコードの実装・レビューを支援し、CLIの設計、エラー処理、書式、テスト、Bazel連携の規約を確認できます。
Write or review Rust in the build tools.
実行スコア 未検証
インストール方法を見るビルドツール群で使うRustコードの実装・レビューに向けて、ワークスペース固有の規約をまとめています。まずツールがBazelから呼ばれる自動処理か、人やエージェントが使うCLIかを見分け、それぞれに合う引数形式とエラーの返し方を選びます。パスの型、エラーへの文脈追加、Lint例外の書き方、クレートを分ける条件、テストやテストデータの置き方も確認できます。cargo fmtやClippyに加えて、Bazelでの同期・ビルド確認や、Windows向けチェックなど、変更前後に使う検証コマンドも示します。
dev-dist tools、BT、Air UI-lane toolingなどのRustワークスペースを変更するときや、既存コードがCLI・エラー・テストの規約に沿っているか確認したいときに向いています。
対象は記載されたリポジトリ内のRustツールワークスペースです。検証にはRust、Bazel、Bunなどの環境と、ワークスペースごとのコマンドが必要です。
この紹介文は、公開されている SKILL.md をもとに AI(OpenAI Codex)が作成しました。正確な仕様は下の原文を確認してください。
インストールする前に、エージェントに与えられる指示の中身を確認できます。
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と登録設定を実装・変更し、表示文言やアイコンの定義、非同期処理の起動方法を整えます。
IntelliJのJPSテストモジュールをBazelへ移行し、Bazelだけで起きる失敗を依存関係や実行環境から切り分ける手順を案内します。
IntelliJのKotlin・Javaコードを新規作成やレビューする際に、言語の選び方、書式、型の扱い、例外処理などのプロジェクト規約に沿って整えるスキルです。
IntelliJ向けの変更を適切な単位に分け、チケットの有無に応じた形式で、理由や判断も伝わるコミットメッセージを作成・修正するスキルです。
Pythonコードの型推論や型エラーを複数の型チェッカーで比較し、各ツールの判定と診断内容をまとめたレポートを作成します。
Compose Desktopの画面で状態や副作用をどこに持たせるか整理し、表示と判断の境界、再利用部品やリストの設計を整えます。