---
name: generating-rbs
description: Generates RBS type signatures from Ruby source files. Triggers when creating type definitions, adding types to Ruby code, or generating .rbs files for classes/modules without existing RBS signatures.
---

# RBS Generate Skill

Generate pure RBS signatures for Ruby source files from scratch. Does not handle RBS-inline signatures or updates for existing signatures.

# Instructions

When generating RBS signatures from scratch, always follow these steps.

Copy this checklist and track your progress:

```
RBS Generation Progress:
- [ ] Step 1: Analyze the Ruby source
- [ ] Step 2: Generate RBS signatures
- [ ] Step 3: Eliminate `untyped` types in generated signatures
- [ ] Step 4: Review and refine RBS signatures
- [ ] Step 5: Validate shape of RBS signatures
- [ ] Step 6: Ensure type safety (only if steep is configured)
```
## Rules

There are several rules that you MUST follow while performing this skill:
- You MUST not run Ruby code of the project.
- You MUST not use `untyped`. Infer the proper type instead.
- You MUST ask the user to provide more details if something is not clear.
- You MUST prepend any command with `bundle exec` if the project has Gemfile.

## 1. Analyze the Ruby Source

Always perform this step.

Read and understand the Ruby source file:
- Identify all classes, modules, methods, constants and instance variables.
- Note inheritance, module inclusion and definitions based on metaprogramming.
- Note visibility modifiers - `public`, `private`, `protected`.
- Note type parameters for generic classes.

## 2. Generate RBS Signatures

Always perform this step.

- Create necessary `.rbs` files for the target Ruby file.
- Place generated RBS files in `sig/` directory mirroring Ruby source structure.
- You need to strongly follow RBS syntax conventions to describe types for all declarations
  - See [syntax.md](reference/syntax.md) for the full list of RBS types. Double-check it in tricky cases.
- Take inspiration from RBS signature examples
  - See [rbs_by_example.md](reference/rbs_by_example.md) for short list of RBS signatures examples
  - See [core](reference/rbs_examples/core/STRUCTURE.md) for RBS signatures of Ruby core library
  - See [stdlib](reference/rbs_examples/stdlib/STRUCTURE.md) for RBS signatures of Ruby standard library
  - Pay extra attention to `Data` and `Struct` types. See [data_and_struct.md](reference/data_and_struct.md) for handling guide
  - See [gem_rbs_collection](https://github.com/ruby/gem_rbs_collection/tree/main/gems) for RBS signature examples of different Ruby libraries. This link contains only RBS files, Ruby sources are not included.

## 3. Eliminate `untyped` types in generated signatures

Always perform this step.

- Go through all generated signatures and replace `untyped` with the proper type.
- Use assumptions and calls examples in Ruby code and tests to infer the proper type.
- If you cannot infer the proper type, leave it as `untyped`. 
  - It is a last resort, use it only when there is no other option.

## 4. Review and refine RBS signatures

Always perform this step.

- Take a look at the generated signatures and make sure they are correct, coherent and complete.
- Try to get rid of any unnecessary `untyped` types.
- If you find any errors, please fix them and repeat the process until there are no errors.

## 5. Validate shape of RBS signatures

Always perform this step.

- Run `rbs validate` to verify that existing and new `.rbs` files are internally consistent. It will check syntax, name resolution, inheritance, method overloading, type variables, etc.
- Fix any errors reported by `rbs validate` and repeat the process until there are no errors.

## 6. Ensure type safety of RBS signatures

Perform this step ONLY if the project Gemfile includes `steep` gem AND the project has Steepfile.

- Run `steep check` to verify that generated RBS signatures are type safe.
- Fix any errors reported by `steep check` and repeat the process until there are no errors.
  - Do not modify Steepfile in an attempt to fix errors.
- Roll back to step 4 if you fixed any errors reported by `steep check`.

# References

- [syntax.md](reference/syntax.md) - The full list of RBS types and syntax
- [rbs_by_example.md](reference/rbs_by_example.md) - Short list of RBS signatures examples
- [core](reference/rbs_examples/core/STRUCTURE.md) - RBS signatures of Ruby core library
- [stdlib](reference/rbs_examples/stdlib/STRUCTURE.md) - RBS signatures of Ruby standard library
- [data_and_struct.md](reference/data_and_struct.md) - Explanation on `Data` and `Struct` types handling