Token导航 LogoToken导航

Agent Skill · 研究检索

biome-developer(生物群落开发商)

biome-developer 用于查找、检索和筛选相关信息,适合在 Codex、Claude、Cursor、Gemini CLI 中需要根据关键词、任务场景或来源线索快速定位候选结果时使用。可结合来源仓库、安装命令和原始 README 继续核验具体用法。安装前建议确认权限范围、维护状态,以及是否会触发联网、命令执行或文件读写。

biome-developer 是研究检索类 Agent Skill,可用宿主为 Codex、Claude、Cursor、Gemini CLI,通过GitHub 仓库获取,权限为需要联网;许可证信息还不明确,第三方扫描已通过,按安装量在研究检索类的 73,675 个 Skill 里排第 28,572。

总安装 3,193周安装 125GitHub Stars 24,536下载 1,064核验 2026-05-01

安装说明

本站只整理中文说明,不托管安装包,也不代用户安装。
GitHub
许可证
unknown

安装方式

通过对话安装

复制提示词发给支持本地命令或 Skills 的 AI 助手,先确认命令和权限,再让它执行。

请帮我安装这个 Agent Skill:biome-developer(生物群落开发商)
来源仓库:https://github.com/biomejs/biome
仓库路径:skills/biome-developer
安装命令:
npx skills add https://github.com/biomejs/biome --skill biome-developer
安装前请先检查当前环境是否支持对应 CLI,并向我确认将要执行的命令、安装目录、联网范围和文件读写权限;确认后再执行。

命令行安装

复制命令到本机终端执行。该命令会通过 npx skills 从第三方来源获取 Skill;本站只展示命令,不托管安装包,也不自动执行。

skills.shnpx skills
npx skills add https://github.com/biomejs/biome --skill biome-developer

这个 Skill 是做什么的

研究检索类 Skill 主要解决「找资料、核对事实、把来源整理清楚」的问题,通常会让助手先检索再总结。

提供 Biome 开发相关的通用实践与常见陷阱规避指南。适合在理解 AST 结构、避免 API 误用或提升开发效率时使用。涵盖语法节点操作、测试方法与性能优化等内部开发细节。安装需确认权限范围和维护状态,可能涉及联网、命令执行或文件读写操作。

biome-developer 属于研究检索类 Skill,可作为该场景下的辅助能力补充。

来源仓库内路径:skills/biome-developer

上手步骤

4 步
  1. 1

    确认自己的宿主工具

    公开资料标注支持 Codex、Claude、Cursor、Gemini CLI;先确认自己用的是其中之一,再按对应工具的 Skills 目录放置。

  2. 2

    拿到安装命令

    可以直接复制的命令是 npx skills add https://github.com/biomejs/biome --skill biome-developer;命令里的占位符换成自己的路径或密钥再执行。

  3. 3

    安装后重启宿主

    命令执行完要完全退出宿主工具再打开,让新装的 Skill 被重新扫描到,否则列表里可能看不到。

  4. 4

    按最小权限试用

    它需要需要联网,先在测试目录或测试账号里跑,确认没问题再放到正式项目。

常见问题

6 条

biome-developer 怎么安装?

在终端执行 npx skills add https://github.com/biomejs/biome --skill biome-developer。装完完全退出宿主工具再打开,让它重新扫描本地 Skill。

biome-developer 支持哪些 AI 工具?

公开资料标注支持 Codex、Claude、Cursor、Gemini CLI。其他工具只要能读取本地 Skill 目录,一般也能手动放进去,但要自己确认触发方式是否一致。

biome-developer 需要什么权限?

权限级别是需要联网。该 Skill 可能需要联网访问来源站点、仓库或外部 API;具体网络访问范围需要结合源码和 README 复核。

biome-developer 是免费的吗?

公开资料没有标注明确许可证,收费和商用限制都无法确认。正式使用前请到来源仓库核对授权说明。

biome-developer 用的人多吗?

公开数据是累计安装 3,193 次,近一周安装 125 次,下载 1,064 次,GitHub 24,536 星。这些数字来自第三方目录统计,只能当作热度参考,不代表质量或安全性。

biome-developer 安全吗?

第三方扫描结果为通过,但这只覆盖已知的静态检查项,不能替代自己读一遍源码和安装命令。

值得选的地方和要先想清楚的地方

值得选的地方

  • 同时适配 4 种工具,换客户端不用重新找替代品。
  • 第三方扫描已通过,常见的高风险行为没有命中。
  • 来源仓库有 24,536 星,维护活跃度相对可查。

先想清楚的地方

  • 许可证没有明确标注,能不能商用、能不能再分发都不确定。
  • 第三方目录整理,版本更新和行为细节以来源仓库为准。

适不适合你

更适合

  • 已经在用 Codex,想直接扩展它能力的人。
  • 需要处理研究检索类任务、又不想每次都手写提示词的人。

不太适合

  • 需要明确授权才能用到公司项目里的场景。
  • 需要厂商级技术支持和 SLA 的生产系统。

研究检索类 Skill 对比

6 个同类
Skill总安装GitHub 星权限许可证扫描
find-skills

寻找技能 · Codex、Claude

31,199,81316,486操作浏览器MIT有提醒
self-improving-agent

自我改进 Agent · OpenClaw

16,464,0023,396接触敏感数据MIT-0通过
soultrace

灵魂追踪 · Codex、Claude

7,588,94412需要联网未明确有提醒
self-improving

自我完善 · OpenClaw

6,829,2841,046需要联网MIT-0通过
microsoft-foundry

微软代工厂 · Codex、Claude

6,614,144764调用外部服务未明确有提醒
biome-developer

生物群落开发商 · 本页

3,19324,536需要联网未明确通过

按安装量取同分类前几名;数字来自第三方目录统计,只作热度参考,不代表质量结论。

SKILL.md 原文

Purpose

This skill provides general development best practices, common gotchas, and Biome-specific patterns that apply across different areas of the codebase. Use this as a reference when you encounter unfamiliar APIs or need to avoid common mistakes.

Prerequisites

  • Basic familiarity with Rust
  • Understanding of Biome's architecture (parser, analyzer, formatter)
  • Development environment set up (see CONTRIBUTING.md)

Common Gotchas and Best Practices

Working with AST and Syntax Nodes

DO:

  • Use parser crate's quick_test to inspect AST structure before implementing
  • Understand the node hierarchy and parent-child relationships
  • Check both general cases AND specific types (e.g., Vue has both VueDirective and VueV*ShorthandDirective)
  • Verify your solution works for all relevant variant types, not just the first one you find

DON'T:

  • Do NOT build the full Biome binary just to inspect syntax (expensive) - use parser crate's quick_test instead
  • Do NOT assume syntax patterns without inspecting the AST first

Example - Inspecting AST:

// In crates/biome_html_parser/tests/quick_test.rs
// Modify the quick_test function:
#[test]
pub fn quick_test() {
    let code = r#"<button on:click={handleClick}>Click</button>"#;
    let source_type = HtmlFileSource::svelte();
    let options = HtmlParserOptions::from(&source_type);
    let root = parse_html(code, options);
    dbg!(&root.syntax());  // Shows full AST structure
}

Run: just qt biome_html_parser

String Extraction and Text Handling

DO:

  • Use inner_string_text() when extracting content from quoted strings (removes quotes)
  • Use text_trimmed() when you need the full token text without leading/trailing whitespace
  • Use token_text_trimmed() on nodes like HtmlAttributeName to get the text content
  • Verify whether values use HtmlString (quotes) or HtmlTextExpression (curly braces)

DON'T:

  • Do NOT use text_trimmed() when you need inner_string_text() for extracting quoted string contents

Example - String Extraction:

// WRONG: text_trimmed() includes quotes
let html_string = value.as_html_string()?;
let content = html_string.value_token()?.text_trimmed(); // Returns: "\"handler\""

// CORRECT: inner_string_text() removes quotes
let html_string = value.as_html_string()?;
let inner_text = html_string.inner_string_text().ok()?;
let content = inner_text.text(); // Returns: "handler"

Working with Embedded Languages

DO:

  • Verify changes work for different value formats (quoted strings vs text expressions) when handling multiple frameworks
  • Use appropriate EmbeddingKind for context (Vue, Svelte, Astro, etc.)
  • Check if embedded content needs is_source: true (script tags) vs is_source: false (template expressions)
  • Calculate offsets correctly: token start + 1 for opening quote, or use text_range().start() for text expressions

DON'T:

  • Do NOT assume all frameworks use the same syntax (Vue uses quotes, Svelte uses curly braces)
  • Do NOT implement features for "widely used" patterns without evidence - ask the user first

Example - Different Value Formats:

// Vue directives use quoted strings: @click="handler"
let html_string = value.as_html_string()?;
let inner_text = html_string.inner_string_text().ok()?;

// Svelte directives use text expressions: on:click={handler}
let text_expression = value.as_html_attribute_single_text_expression()?;
let expression = text_expression.expression().ok()?;

Borrow Checker and Temporary Values

DO:

  • Use intermediate let bindings to avoid temporary value borrows that get dropped
  • Store method results that return owned values before calling methods on them

DON'T:

  • Do NOT create temporary value borrows that get dropped before use

Example - Avoiding Borrow Issues:

// WRONG: Temporary borrow gets dropped
let html_string = value.value().ok()?.as_html_string()?;
let token = html_string.value_token().ok()?; // ERROR: html_string dropped

// CORRECT: Store intermediate result
let value_node = value.value().ok()?;
let html_string = value_node.as_html_string()?;
let token = html_string.value_token().ok()?; // OK

Clippy and Code Style

DO:

  • Use let chains to collapse nested if let statements (cleaner and follows Rust idioms)
  • Run just l before committing to catch clippy warnings
  • Fix clippy suggestions unless there's a good reason not to

DON'T:

  • Do NOT ignore clippy warnings - they often catch real issues or suggest better patterns

Example - Collapsible If:

// WRONG: Nested if let (clippy::collapsible_if warning)
if let Some(directive) = VueDirective::cast_ref(&element) {
    if let Some(initializer) = directive.initializer() {
        // ... do something
    }
}

// CORRECT: Use let chains
if let Some(directive) = VueDirective::cast_ref(&element)
    && let Some(initializer) = directive.initializer()
{
    // ... do something
}

Code Comments

Comments exist for the next developer who reads this code, not for the developer currently writing it. Write them like you are explaining the code to a colleague who walked into the room ten minutes ago — not to a reviewer on this specific PR.

DO:

  • Explain code that is hard to read, or document exceptions and edge cases
  • Provide context when names alone are not descriptive enough
  • Describe the business logic a function implements
  • Clarify contextual words like "normalize" — e.g., "normalize a file path" and "normalize a URL" mean different things; spell out what normalization means here
  • Strike a balance between plain English and technical precision. Prefer concrete nouns ("the HTML file", "the <style> block") over abstract ones ("the host CST", "the delegated pipeline") when both convey the same idea
  • Add comments only where they are needed, for example, docstrings, or code paths that are particular and require a special explanation. Most of the code (even new that you write) doesn't need a comment if it follows the business logic.
  • Write comments using proper English grammar and punctuation.

DON'T:

  • Do NOT embed the context of the current work into comments. A comment like // As per issue #1234, we skip this case ties the code to a transient artifact. Instead, explain *why* the case is skipped in terms any future reader would understand.
  • Do NOT scope comments to the specific trigger that prompted the change. For example, if a bug was reported for Astro but the fix applies broadly, do NOT write // Fix for Astro embedding. Write a comment that describes the general condition being handled.
  • Do NOT scope comments narrower than the code itself. If the function is generic across all embedded languages, the comment should not name "CSS" or "<style>" — describe the contract the code enforces for any embed, and use a concrete example only as illustration.
  • Do NOT lead with formal-methods / math jargon like // Invariant:, // Precondition:, // Lemma: unless the surrounding code genuinely uses those terms. For most Biome code, plain prose ("When X happens, Y must hold, otherwise …") reads better and is just as precise.
  • Do NOT pile technical terms on top of each other ("delegated format pipeline", "canonical embed IR", "host CST token text") when one plain-English sentence would do. Jargon density should be low; a reader should not need a glossary to understand a comment.
  • Do NOT just paraphrase the function name or the next line of code. If a comment can be deleted without losing information, delete it.

Think big picture, not current task. Before writing a comment, ask three things:

  1. If someone reads this a year from now with no knowledge of the issue or PR, does this comment give them the context they need?
  2. Is my comment describing the code at the same level of abstraction as the code? (A generic helper deserves a generic explanation; a specific branch deserves a specific one.)
  3. Could I swap any technical term for a plainer word without losing meaning? If yes, swap it.

Example 1 — issue/task context and over-specificity:

// WRONG: Carries issue/task context
// Fix for #5678: Astro files need special handling here
if is_embedded_script(node) {
    return normalize_offset(node);
}

// WRONG: Describes what the code does (the code already says that)
// Check if the node is an embedded script and normalize the offset
if is_embedded_script(node) {
    return normalize_offset(node);
}

// CORRECT: Explains why and clarifies "normalize"
// Embedded script blocks (e.g. <script> inside .vue/.svelte/.astro files)
// report offsets relative to the embedding document, not the script itself.
// Normalize here means: subtract the script block's start position so the
// offset is relative to the script content.
if is_embedded_script(node) {
    return normalize_offset(node);
}

Example 2 — jargon, narrow scope, and abstraction mismatch. This is a real example from a generic helper that replaces an embedded snippet inside any host document (HTML, Vue, Svelte, Astro, …):

// WRONG: starts with formal-methods jargon, names a specific case
// (`<style>`) even though the function handles any embed, and stacks
// technical terms ("host CST token text", "delegated pipeline") that a
// new reader has to decode before they can understand the point.
// Invariant: for a file that required no fix actions, `fix_file` and
// `format_file` must produce byte-identical output. For `<style>`
// blocks, `fix_all`'s final format pass prints embedded content
// verbatim from the host CST token text, while `format_file` routes
// through the delegated `format_embedded` pipeline and re-wraps the
// result with the host's indent. …

// CORRECT: plain language, stays at the generic level of the function,
// uses `<style>` only as a parenthetical example, and is understandable
// without prior context.
// The embedded formatter (e.g. the CSS formatter for a <style> block)
// doesn't know how deeply its code is nested inside the HTML file, so
// it always returns the code indented from column zero. If we pasted
// that code back as-is, only the first line would get the HTML
// indentation (from the leading whitespace we already captured); every
// other line would end up too far to the left. Add the same indentation
// to every line so the embed lines up with its surroundings.

The corrected comment names one concrete example (<style> / CSS) to make the reader's mental picture vivid, but the rest of the sentence is generic enough to cover any host/embed pair. That is the balance to aim for.

Cargo Dependencies: workspace = true vs path = "..."

Internal biome_* crates listed under [dev-dependencies] MUST use path = "../<crate_name>", not workspace = true. Using workspace = true for dev-dependencies can cause Cargo to resolve the crate from the registry instead of the local workspace, which is incorrect.

Regular [dependencies] still use workspace = true as normal — this rule only applies to [dev-dependencies].

DO:

  • Use path = "../biome_foo" for all biome_* dev-dependencies
  • Preserve any extra attributes like features when converting

DON'T:

  • Do NOT use workspace = true for biome_* crates in [dev-dependencies]

Example:

# WRONG: may resolve from registry
[dev-dependencies]
biome_js_parser = { workspace = true }
biome_formatter = { workspace = true, features = ["countme"] }

# CORRECT: always resolves locally
[dev-dependencies]
biome_js_parser = { path = "../biome_js_parser" }
biome_formatter = { path = "../biome_formatter", features = ["countme"] }

All crates live as siblings under crates/, so the relative path is always ../biome_<name>.

Legacy and Deprecated Syntax

DO:

  • Ask users before implementing deprecated/legacy syntax support
  • Wait for user demand before spending time on legacy features
  • Document when features are intentionally not supported due to being legacy

DON'T:

  • Do NOT implement legacy/deprecated syntax without checking with the user first
  • Do NOT claim patterns are "widely used" or "common" without evidence

Example: Svelte's on:click event handler syntax is legacy (Svelte 3/4). Modern Svelte 5 runes mode uses regular attributes. Unless users specifically request it, don't implement legacy syntax support.

Testing and Development

For testing commands, snapshot workflows, and code generation, see the testing-codegen skill. Key reminders specific to Biome development patterns:

  • Test with multiple variants when working with enums (e.g., all VueV*ShorthandDirective types)
  • Use CLI tests for testing embedded languages (Vue/Svelte directives, etc.)
  • Do NOT try to test embedded languages in analyzer packages (they don't have embedding capabilities)

Pattern Matching Tips

Working with Node Variants

When working with enum variants (like AnySvelteDirective), check if there are also non-enum types that need handling:

// Check AnySvelteDirective enum (bind:, class:, style:, etc.)
if let Some(directive) = AnySvelteDirective::cast_ref(&element) {
    // Handle special Svelte directives
}

// But also check regular HTML attributes with specific prefixes
if let Some(attribute) = HtmlAttribute::cast_ref(&element) {
    if let Ok(name) = attribute.name() {
        // Some directives might be parsed as regular attributes
    }
}

Checking Multiple Variant Types

For frameworks with multiple directive syntaxes, handle each type:

// Vue has multiple shorthand types
if let Some(directive) = VueVOnShorthandDirective::cast_ref(&element) {
    // Handle @click
}
if let Some(directive) = VueVBindShorthandDirective::cast_ref(&element) {
    // Handle :prop
}
if let Some(directive) = VueVSlotShorthandDirective::cast_ref(&element) {
    // Handle #slot
}
if let Some(directive) = VueDirective::cast_ref(&element) {
    // Handle v-if, v-show, etc.
}

Common API Confusion

String/Text Methods

MethodUse WhenReturns
inner_string_text()Extracting content from quoted stringsContent without quotes
text_trimmed()Getting token text without whitespaceFull token text
token_text_trimmed()Getting text from nodes like HtmlAttributeNameNode text content
text()Getting raw textExact text as written

Value Extraction Methods

TypeMethodFramework
HtmlStringinner_string_text()Vue (quotes)
HtmlAttributeSingleTextExpressionexpression()Svelte (curly braces)
HtmlTextExpressionhtml_literal_token()Template expressions

References

  • Main contributing guide: ../../CONTRIBUTING.md
  • Testing workflows: ../testing-codegen/SKILL.md
  • Parser development: ../parser-development/SKILL.md
  • Biome internals docs: https://biomejs.dev/internals

Documentation and Markdown Formatting

DO:

  • Use spaces around table separators: | --- | --- | --- | (not |---|---|---|)
  • Ensure all Markdown tables follow "compact" style with proper spacing
  • Test documentation changes with markdown linters before committing

DON'T:

  • Do NOT use compact table separators without spaces (causes CI linting failures)

Example - Table Formatting:

<!-- WRONG: No spaces around separators -->
| Method | Use When | Returns |
|--------|----------|---------|

<!-- CORRECT: Spaces around separators -->
| Method | Use When | Returns |
| --- | --- | --- |

The CI uses markdownlint-cli2 which enforces the "compact" style requiring spaces.

Common Mistakes to Avoid

  • Calling format!() (allocates a string) when formatting strings in a markup! block. markup! supports interpolation, E.g. markup! {"Hello, "{name}"!"}.
  • Calling .to_string() or .to_string_trimmed() (allocates a string) on a SyntaxToken or SyntaxNode. It's highly unlikely that you actually need to call these methods on a syntax node. As for syntax tokens, you can easily borrow a &str from the token's text without allocating a new string, using token.text().

When to Use This Skill

Load this skill when:

  • Working with unfamiliar Biome APIs
  • Getting borrow checker errors with temporary values
  • Extracting strings or text from syntax nodes
  • Implementing support for embedded languages (Vue, Svelte, etc.)
  • Wondering why your AST inspection doesn't match expectations
  • Making decisions about legacy/deprecated syntax support
  • Writing or updating markdown documentation

平台分布

Codex

36.96%
按下载量换算393

Claude

30.98%
按下载量换算330

Cursor

19.08%
按下载量换算203

Gemini CLI

10.92%
按下载量换算116

安全审计

Gen Agent Trust Hub

通过

Socket

通过

Snyk

通过

权限和风险

需要联网

该 Skill 可能需要联网访问来源站点、仓库或外部 API;具体网络访问范围需要结合源码和 README 复核。

安装前确认

本站仅展示第三方公开信息,不托管安装包,不提供自动安装或运行环境。安装前应自行审查源码、依赖和命令行为。目前只有一个公开来源,建议同时核对源仓库。

继续浏览同类 Skills