# Editors

bin/rails g poetry:editor wires Poetry's MCP server and registry-driven snippets into the editors a Rails team uses (VS Code, Cursor, Claude Code, Zed, RubyMine): safe MCP-config upserts, a per-editor matrix, a .herb.yml for the Herb toolchain, and the Figma / Paper design-tool token bridges.

`bin/rails g poetry:editor` wires Poetry's MCP server and registry-driven snippets into VS Code, Cursor, Claude Code, Zed, and RubyMine: safe MCP-config upserts (`.mcp.json`: command `bundle`, args `["exec", "poetry-agent"]`), per-editor snippet formats, and the Figma / Paper design-tool token bridges. The MCP server serves ten tools from the live registry with no app boot - `compose`, `build_page`, `list_components`, `describe_component`, `check`, `list_blocks`, `describe_block`, `list_recipes`, `get_skill`, and `guidance`.

Rails 8.2 made Herb its ERB engine and Poetry's templates are gated to parse and compile under it, so the Herb toolchain works on a Poetry app: the language server (VS Code Herb LSP, Zed's Ruby extension, `@herb-tools/language-server` for Neovim; Stimulus LSP runs on the same language service and resolves your controllers, while `poetry:editor` lists Poetry's identifiers in `.stimulus-lsp/config.json` so hand-written `poetry--...` descriptors are never "invalid controllers" - `bin/rails poetry:check` validates those, `data:` keywords on Poetry helpers included), `npx --yes @herb-tools/linter app` in CI, and `bundle exec herb actionview check .` for the render graph. `poetry:editor` also writes `.herb.yml` (kept if you have one): `framework: actionview`, a pinned linter `version`, and two rules off until upstream fixes land - `erb-no-unused-expressions` (slot setters on a builder a Poetry helper yields, marcoroth/herb#2426) and `actionview-no-silent-helper` (brace-form setters, #2340). The formatter is an upstream preview; Poetry's own templates are not run through it because it rewraps the inline one-liners the components depend on.
