add-npm-package
Freemodules/npm/packages/ に新しい npm/pnpm パッケージを追加するスキル
The English summary is being prepared. Showing the original description.
Rust のコードを書く・直す・レビューするときに使う。所有権、借用、Clone/Copy derive、文字列型 (`String`, `&str`, `Cow`, `'static str`) の選び方を、安易な複製や過剰な lifetime 固定に寄せず、実際のデータ所有者と呼び出し境界に合わせて判断するためのスキル。
The English summary is being prepared. Showing the original description.
See how to installReview the instructions the agent will receive before you install.
Rust では、所有権と lifetime を「コンパイルを通すための飾り」ではなく、データの責務境界として扱う。
まず自然な所有者、借用で済む範囲、値を複製する理由を確認する。Clone / Copy / 'static は便利だから付けるのではなく、API とデータの寿命を正しく表す場合だけ使う。
このスキルは、The Rust Book、標準ライブラリ docs、Rust API Guidelines、Clippy の所有権関連 lint から実装判断に必要な部分だけを蒸留したものとして扱う。通常の実装やレビューでは外部 URL を読みに行かず、この本文の判断基準を使う。Rust の仕様変更や判断基準そのものを更新するときだけ、元資料を確認する。
Clone / Copy を derive する前に、その型の意味で複製が自然かを確認する。
Copy は、代入や引数渡しで move ではなく安い複製になることを API として公開する。実装できる型は基本的に Copy にしてよいが、将来 Copy でなくなる可能性がある公開型では、破壊的変更を避けるために省く判断も妥当。
Copy を許可しやすい型:
u64 や Uuid などの小さな値に意味を付けるだけの newtypeCopy にしてはいけない型:
Drop を実装する型、または将来リソース解放を持つ可能性が高い型String、Vec<T>、PathBuf、OsString、file handle、socket、lock guard など、heap buffer や外部リソースの管理責任を持つ型&mut T を含む型。可変参照の複製は aliasing ルールに反するClone を安易に derive しない型:
Vec / String を含む型必要になってから Clone を足す。足す場合も、呼び出し側で本当に別の所有値が必要か、借用や参照渡しで表せないかを先に確認する。clone() は heap data の複製や任意の処理を伴いうるため、可視的なコストとして扱う。
// OK: 値そのものが識別子で、複製しても責務が増えない。
#[derive(Clone, Copy, Debug, Eq, PartialEq, Hash)]
struct UserId(u64);
// 要確認: clone で同じ集約のコピーを作る意味が曖昧になりやすい。
#[derive(Clone)]
struct User {
id: UserId,
name: String,
permissions: Vec<String>,
}
文字列は、誰が所有し、どれくらい生きるかで選ぶ。
String を使う&str を受け取る&'static str を使うCow<'a, str> や generic を検討する'static str は「長く生きてほしい文字列」ではない。設定値、入力、DB/API 由来の値、後から組み立てる値を 'static に寄せない。必要なら所有する String にする。
型選択の初期値:
| 場面 | まず選ぶ型 | 理由 |
|---|---|---|
| struct が値を保持する | String | 所有者が明確で、不要な lifetime を API 外へ漏らさない |
| 関数が一時的に読む | &str | String、&str、slice 由来の値を広く受けられる |
| 固定メッセージや定数 | &'static str | binary に埋め込まれた literal の寿命を正しく表す |
| 必要なら借用、必要なら所有 | Cow<'a, str> | 書き換えや所有が必要なときだけ clone できる |
| 複数 thread で同じ文字列を共有 | Arc<str> | 所有値を共有し、文字列本体の重複を避ける |
&str を受けた後、すぐ to_owned() / to_string() して処理するなら、&str を選んだ意味が失われている可能性が高い。所有化してよいのは、値を struct に保存する、関数の外へ返す、別 thread / async task へ渡す、または API が所有値を要求する場合に限る。読むだけ、検証するだけ、分岐するだけ、別の借用 API へ渡すだけなら、借用のまま処理する。
// OK: 入力を読むだけなら &str のまま処理する。
fn is_valid_name(name: &str) -> bool {
let name = name.trim();
!name.is_empty() && name.chars().all(|c| c.is_alphanumeric() || c == '_')
}
// OK: 正規化した新しい文字列を返すので、戻り値として所有する。
fn normalized_name(name: &str) -> String {
name.trim().to_ascii_lowercase()
}
// OK: 設定値を保持する型は所有する。
struct Config {
profile_name: String,
}
// 避ける: 呼び出し側に String を強制する理由がない。
fn normalize_name_bad(name: &String) -> String {
name.trim().to_lowercase()
}
// 避ける: 借用で読めるのに、先頭で所有化している。
fn is_valid_name_bad(name: &str) -> bool {
let name = name.to_owned();
!name.trim().is_empty()
}
Path / PathBuf、OsStr / OsString、slice / Vec<T> でも同じ考え方を使う。読むだけの引数は借用型、保持する field や返り値は所有型を基本にする。
Rust の差分を書いた後、次を確認する。
Clone / Copy derive が、型の意味として自然か.clone() が、所有値を本当に複数箇所で持つ必要から出ているかto_owned() / to_string() が、保存、返却、所有値を要求する API 呼び出しのために必要か&str や &'static str を入れて、不要に lifetime を外へ漏らしていないかString を使えば素直な箇所を、過剰に &'static str、generic、Cow へ寄せていないか迷う場合は、まず所有する String と借りる &str の素直な形で書く。性能上の理由や API 境界の理由が具体的に出てから、より細かい型へ寄せる。
この節はスキル更新時の確認先であり、通常の実装中に毎回読む必要はない。
String / Clone / Copy の基本std::marker::Copy: Copy にできない型、Copy が public API であることstd::borrow::Cow: clone-on-write と borrowed / owned の使い分けstd::string::String: String の heap buffer、length、capacityptr_arg / redundant_clone: &String より &str、不要な clone の検出No reviews yet. Tell others what you thought.
No login needed. Share how it worked for you, ask a question, or note where it did not run.
No comments yet. Be the first to write one.
modules/npm/packages/ に新しい npm/pnpm パッケージを追加するスキル
The English summary is being prepared. Showing the original description.
install/ 配下に新しいセットアップ用シェルスクリプトを追加するスキル
The English summary is being prepared. Showing the original description.
GitHub issue を新規作成・下書きするとき、または既存 issue の本文を書き直すときに必ず使うスキル。「issue を作って」「issue 化して」「これを issue にまとめて」のような依頼で発火し、`gh issue create` を直接呼ぶ前に必ず参照する。人間が合意した内容だけを、意味を足さずに issue へ残すための基準を定める。
The English summary is being prepared. Showing the original description.
GitHub に Pull Request を作成するスキル。ユーザーが「PRを作って」「プルリクエストを出して」「PR作成して」と言ったとき、またはコミット済みの変更をレビューに出したいときに使用する。
The English summary is being prepared. Showing the original description.
ドメインモデル、可視性、操作可能性、不変条件、層境界、API 設計に関わる実装時に使う。不正な状態や誤った呼び出し方を、型、関数の境界、ドメイン語彙で表し、正しい使い方が自然になる設計へ寄せるためのスキル。
The English summary is being prepared. Showing the original description.
コミットやPR作成の前に、作業ブランチが適切かどうかを確認・切り替えるスキル。git-commit や create-pr からサブルーチンとして呼び出される。
The English summary is being prepared. Showing the original description.