biome-code-review
Use only for reviewing completed Biome PRs, branches, commit ranges, diffs, or working trees against business logic and requirements. Excludes broad…
Use this skill when extracting or storing Biome AST/CST source text, working with any `SyntaxNode`, `SyntaxToken`, `TokenText`, quoted strings, token-relative ranges, or embedded-language attribute values, or diagnosing trivia, allocation, range, and temporary-borrow problems.
$ npx -y skills add biomejs/biome --skill syntax-text-handling --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/syntax-text-handlingContext preview
The summary Claude sees to decide when to auto-load this skill.
Use this skill when extracting or storing Biome AST/CST source text, working with any `SyntaxNode`, `SyntaxToken`, `TokenText`, quoted strings, token-relative ranges, or embedded-language attribute values, or diagnosing trivia, allocation, range, and temporary-borrow problems.
name: syntax-text-handling description: Use this skill when extracting or storing Biome AST/CST source text, working with any `SyntaxNode`, `SyntaxToken`, `TokenText`, quoted strings, token-relative ranges, or embedded-language attribute values, or diagnosing trivia, allocation, range, and temporary-borrow problems. Do not use for parser implementation or formatter comment placement. compatibility: Designed for coding agents working on the Biome codebase (github.com/biomejs/biome).
Use typed syntax APIs and preserve source ownership instead of converting syntax text into strings.
Do not infer an AST shape from source spelling. Inspect the parser quick test for the language and search generated node definitions and existing consumers. Load `testing-codegen` for the current quick-test command.
Check every relevant union member and framework-specific value representation. Similar source syntax may use different typed nodes.
| API | Result | Use | | --- | --- | --- | | `SyntaxToken::text_trimmed()` | `&str` | Borrow token text without leading or trailing trivia | | `SyntaxToken::token_text_trimmed()` | `TokenText` | Retain token-backed text without trivia | | `SyntaxToken::text()` | `&str` | Exact source text including trivia | | `SyntaxNode::text_trimmed()` | node text | Diagnostics or display where interior trivia is intentional | | `inner_string_text(token)` free helper | `TokenText` | Quote-stripped token content | | `HtmlString::inner_string_text()` | `SyntaxResult<TokenText>` | Quote-stripped content from a typed HTML string node |
`SyntaxNode::text_trimmed()` removes only outer trivia. Whitespace and comments between child tokens remain, so it is not a semantic accessor for a multi-token node. Prefer a typed token, typed accessor, or structural match.
Do not call `.to_string()`, `.to_trimmed_string()`, or `format!` merely to compare syntax text. Borrow a `&str` or retain a `TokenText`.
Use the syntax crate's `inner_string_text()` implementation. It handles the language's token representation and returns token-backed text.
let string = value.as_html_string()?; let inner = string.inner_string_text().ok()?; let matches_handler = inner.text() == "handler";
Do not strip quotes with byte slicing. Besides allocating or risking invalid boundaries, manual slicing duplicates language-specific behavior already covered by the accessor and its tests.
`TokenText` already stores a green token plus a token-relative `TextRange`. Use its existing APIs instead of adding another token-and-range wrapper:
let word = inner.clone().slice(word_range); let text = word.text(); let relative_range = word.relative_range(); let source_range = word.source_range(value_token.text_range());
Pass `slice()` a range relative to the current `TokenText`; it retains the underlying token and adjusts the selected range. `relative_range()` returns the resulting range relative to the whole token, while `source_range()` translates it using the whole token's file range. Build slice ranges from valid byte boundaries in the current text.
Verify value shapes per framework and syntax version. For example, an HTML-family attribute may hold a quoted `HtmlString`, a single text expression, or a framework-specific directive node. Do not handle one shape and assume the others share its accessor or offset rules.
Keep embedded-language parsing concerns separate:
Support legacy syntax only when the task requires it and the current parser represents it.
Typed accessors often return owned wrapper nodes whose tokens borrow through that wrapper. Bind intermediate values when a chained expression would drop the owner too early:
let value_node = attribute.value().ok()?; let string = value_node.as_html_string()?; let token = string.value_token().ok()?; let text = token.text_trimmed();
Do not solve a temporary-borrow error by converting to `String` unless the value genuinely must outlive its syntax tree.
Always prefer using specific, strongly typed syntax nodes (like `AnyJsExpression`, `JsCallExpression`) over generic, weakly typed syntax nodes (like `JsSyntaxNode`) in function parameters.
GOOD:
fn is_react_call(node: &JsCallExpression) -> bool { ... }BAD:
fn is_react_call(node: &JsSyntaxNode) -> bool { ... }You can use `declare_node_union!` to define custom sets of nodes.
A toolchain for web projects, aimed to provide functionalities to maintain them. Biome offers formatter and linter, usable via CLI and LSP.
Repo: biomejs/biome
Use only for reviewing completed Biome PRs, branches, commit ranges, diffs, or working trees against business logic and requirements. Excludes broad…
Use this skill when a Biome change may affect users and you must decide whether it needs a changeset, choose the release level, or create and edit…
Use this skill when designing or implementing Biome user-facing diagnostic presentation or APIs, including messages, advice, markup, details, code frames,…
Use this skill whenever writing or editing Rust `//`, `///`, or `//!` comments in Biome, including comments added incidentally and end-user rustdoc inside…
Use this skill when `biome migrate eslint` must preserve configurable ESLint rule options through source-option models, Biome conversions, typed rule variants,…
Use this skill whenever implementing or debugging Biome formatter behavior, IR composition, node rules, layout selection, source-comment handling, verbatim…