mcpField
G
generating-sorbet-inline

generating-sorbet-inline

github.com/midudev開発7.0k57 回インストール1 週間前に更新
リポジトリ

generating-sorbet-inline について

Ruby ソースファイルに Sorbet の `sig {}` 型シグネチャをインラインで追加・更新するスキルです。全体生成とファイル単位の更新に対応し、プロジェクトの Ruby コードを実行せず Sorbet で検証します。

主な機能

  1. 01Sorbet シグネチャのインライン生成
  2. 02ファイル全体と部分的な更新
  3. 03`T.untyped`、`T.unsafe`、`T.cast` の回避
  4. 04既存の typed シジルレベルの維持
  5. 05複数ファイルの進捗管理
  6. 06Sorbet による型チェック検証

活用シーン

  1. 01Ruby メソッドへのシグネチャ追加
  2. 02変更ファイル内のシグネチャ更新
  3. 03複数ファイルのシグネチャ変更の順次処理
  4. 04Sorbet を使ったシグネチャ検査

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/midudev/autoskills --skill generating-sorbet-inline

インストール後、Claude Code で/generating-sorbet-inlineを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

reference/sorbet_examples/packwerk/
packwerk.rb
reference/sorbet_examples/packwerk/packwerk/
application_validator.rb
association_inspector.rb
cache.rb
checker.rb
cli.rb
commands.rb
configuration.rb
const_node_inspector.rb
constant_context.rb
constant_discovery.rb
constant_name_inspector.rb
disable_sorbet.rb
extension_loader.rb
file_processor.rb
files_for_processing.rb
graph.rb
reference/sorbet_examples/packwerk/packwerk/commands/
base_command.rb
check_command.rb
help_command.rb
init_command.rb
lazy_loaded_entry.rb
update_todo_command.rb
uses_parse_run.rb
validate_command.rb
version_command.rb
reference/sorbet_examples/packwerk/packwerk/formatters/
default_offenses_formatter.rb
progress_formatter.rb
reference/sorbet_examples/packwerk/packwerk/generators/
configuration_file.rb
root_package.rb

詳細

Sorbet インライン生成スキル

Ruby のソースファイルに sig {} ブロックを直接記述して、Sorbet の型シグネチャを生成または更新します。新規ファイルへの完全な生成と、変更された個別ファイルへの部分的な更新の両方に対応しています。Sorbet のシグネチャは有効な Ruby コードであり、静的型チェックと実行時の型チェックを可能にします。

手順

Sorbet のインラインシグネチャを生成する際は、必ず次の手順に従ってください。

このチェックリストをコピーして、進捗を管理してください。

Sorbet Inline Generation Progress:
- [ ] Step 1: Analyze the Ruby source
- [ ] Step 2: Add Sorbet signatures
- [ ] Step 3: Eliminate `T.untyped` in signatures
- [ ] Step 4: Review and refine signatures
- [ ] Step 5: Validate signatures with Sorbet

ルール

  • プロジェクトの Ruby コードを実行してはいけません。
  • T.untyped を使用してはいけません。代わりに適切な型を推論してください。
  • 型チェックを完全に回避する T.unsafe を使用してはいけません。
  • 検証なしに型を強制する T.cast を使用してはいけません。
  • 不明な点がある場合は、ユーザーに詳細を確認してください。
  • プロジェクトに Gemfile がある場合は、すべてのコマンドの先頭に bundle exec を付けてください。
  • メソッドシグネチャには、必ず sig { } ブロック構文を使用してください。
  • sig を使用する前に、クラス/モジュールに extend T::Sig を追加してください。
  • メソッドシグネチャのみに注力してください。ローカル変数、中間式、その他のメソッド以外の注釈は省略してください。
  • .rbi ファイルを使用または生成してはいけません。このスキルはインラインシグネチャ専用です。
  • 既存の # typed: 宣言レベルがある場合は維持してください。ユーザーの明示的な同意なしに、厳格さを上げたり変更したりしてはいけません。
  • 複数ファイルを処理する場合、ファイル漏れを防ぐために追跡ファイルを必ず使用してください。

複数ファイルの処理

複数の Ruby ファイルを処理する場合は、対象ファイルをすべて処理するため、追跡ファイルを作成してください。

  1. 追跡ファイル .sorbet-inline-generation-todo.tmp を作成します。

    [ ] app/models/user.rb
    [ ] app/models/post.rb
    [ ] app/services/auth_service.rb
    
  2. ファイルを1つずつ処理します。

    • 次の未処理 [ ] エントリを選びます
    • そのファイルについて手順(1~5)をすべて完了します
    • 処理済みとして [x] にします
    • 追跡ファイルを保存します
    • 次の未処理エントリに進みます
  3. クリーンアップ:すべてのファイルを処理したら、追跡ファイルを削除します。

    rm .sorbet-inline-generation-todo.tmp
    

処理が中断された場合、追跡ファイルを使って中断した箇所から再開できます。

1. Ruby ソースを分析する

この手順は必ず実行してください。

Ruby のソースファイルを読み、内容を把握します。

  • すべてのクラス、モジュール、メソッド、定数、インスタンス変数を特定します。
  • 継承、モジュールのインクルード、メタプログラミングに基づく定義を確認します。
  • 可視性修飾子(public、private、protected)を確認します。
  • ファイルの先頭にある既存の # typed: 宣言レベルを確認します。
  • ジェネリッククラスの型パラメーターを確認します。

2. Sorbet シグネチャを追加する

この手順は必ず実行してください。

  1. まず、ファイルの先頭に # typed: 宣言があるか確認します。

    • 宣言がある場合:既存のレベルを維持します。ユーザーの同意なしに変更してはいけません。
    • 宣言がない場合:段階的な型付けに適した既定値として # typed: true を追加します。

    宣言レベル(厳格さの低い順):ignore < false < true < strict < strong

  2. クラス/モジュールに extend T::Sig を追加します。

    class MyClass
      extend T::Sig
    end
    
  3. 次に、sig {} ブロックを使って型シグネチャを追加します。

例 - 変更前:

class User
  attr_reader :name, :age

  def initialize(name, age)
    @name = name
    @age = age
  end

  def greet(greeting)
    "#{greeting}, #{@name}!"
  end
end

例 - 変更後:

# typed: true

class User
  extend T::Sig

  sig { returns(String) }
  attr_reader :name

  sig { returns(Integer) }
  attr_reader :age

  sig { params(name: String, age: Integer).void }
  def initialize(name, age)
    @name = name
    @age = age
  end

  sig { params(greeting: String).returns(String) }
  def greet(greeting)
    "#{greeting}, #{@name}!"
  end
end
  • メソッドと属性のシグネチャのみに注力してください
  • Sorbet 構文の詳細については、syntax.md を参照してください

3. シグネチャ内の T.untyped をなくす

この手順は必ず実行してください。

  • すべてのシグネチャを確認し、T.untyped を適切な型に置き換えます。
  • コードの文脈、メソッド呼び出し、テストを使って型を推論します。
  • 型を特定できない場合の最終手段としてのみ T.untyped を使用します。

4. シグネチャを確認して改善する

この手順は必ず実行してください。

  • シグネチャが正確で、一貫性があり、完全であることを確認します。
  • 不要な T.untyped 型を削除します。
  • すべてのメソッドと属性にシグネチャがあることを確認します。
  • エラーを修正し、シグネチャが正しくなるまで繰り返します。

5. Sorbet でシグネチャを検証する

この手順は必ず実行してください。

Sorbet の型チェッカーを実行して、シグネチャを検証します。

srb tc

または、bundle を使用します。

bundle exec srb tc

以下を確認します。

  • シグネチャの構文が正しいこと
  • 型に一貫性があること
  • メソッドのパラメーターと戻り値の型が一致していること
  • インスタンス変数が初期化されていること

報告されたエラーを修正し、検証に合格するまで繰り返してください。

参考資料

コメント