Migrate Core Code to Submodules
tinyhumansai/openhuman
Plans and carries out moving non-host-specific code and its tests from the OpenHuman core into vendored tiny submodule libraries, then releases the submodule and re-pins the host.
Write and format Rust documentation correctly. An agent skill from r3bl-org/r3bl-open-core.
$ npx skills add r3bl-org/r3bl-open-core --skill write-documentation -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install r3bl-org/r3bl-open-core write-documentation --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/r3bl-org/r3bl-open-core.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/write-documentation .claude/skills/write-documentation && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "write-documentation" agent skill from https://github.com/r3bl-org/r3bl-open-core/tree/main/.agents/skills/write-documentation into .claude/skills/write-documentation/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "write-documentation", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/r3bl-org/r3bl-open-core/tree/main/.agents/skills/write-documentationType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add r3bl-org/r3bl-open-core --skill write-documentation -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install r3bl-org/r3bl-open-core write-documentation --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/r3bl-org/r3bl-open-core.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/write-documentation .agents/skills/write-documentation && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "write-documentation" agent skill from https://github.com/r3bl-org/r3bl-open-core/tree/main/.agents/skills/write-documentation into .agents/skills/write-documentation/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "write-documentation", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add r3bl-org/r3bl-open-core --skill write-documentation -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install r3bl-org/r3bl-open-core write-documentation --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/r3bl-org/r3bl-open-core.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/write-documentation .cursor/skills/write-documentation && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "write-documentation" agent skill from https://github.com/r3bl-org/r3bl-open-core/tree/main/.agents/skills/write-documentation into .cursor/skills/write-documentation/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "write-documentation", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/r3bl-org/r3bl-open-core.git --path .agents/skills/write-documentation--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add r3bl-org/r3bl-open-core --skill write-documentation -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install r3bl-org/r3bl-open-core write-documentation --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/r3bl-org/r3bl-open-core.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/write-documentation .gemini/skills/write-documentation && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "write-documentation" agent skill from https://github.com/r3bl-org/r3bl-open-core/tree/main/.agents/skills/write-documentation into .gemini/skills/write-documentation/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "write-documentation", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install r3bl-org/r3bl-open-core write-documentationInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add r3bl-org/r3bl-open-core --skill write-documentation -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/r3bl-org/r3bl-open-core.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/write-documentation .github/skills/write-documentation && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "write-documentation" agent skill from https://github.com/r3bl-org/r3bl-open-core/tree/main/.agents/skills/write-documentation into .github/skills/write-documentation/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "write-documentation", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add r3bl-org/r3bl-open-core --skill write-documentation -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install r3bl-org/r3bl-open-core write-documentation --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/r3bl-org/r3bl-open-core.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/write-documentation .opencode/skills/write-documentation && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "write-documentation" agent skill from https://github.com/r3bl-org/r3bl-open-core/tree/main/.agents/skills/write-documentation into .opencode/skills/write-documentation/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "write-documentation", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
write-documentationWrite and format Rust documentation correctly. An agent skill from r3bl-org/r3bl-open-core.
Write Documentation is an agent skill from r3bl-org/r3bl-open-core. Write and format Rust documentation correctly. Apply proactively when writing code with rustdoc comments (//! or ///). Covers voice & tone, prose style (opening lines, explicit subjects, verb tense), structure (inverted pyramid), intra-doc links (crate:: paths, reference-style), constant conventions (binary/byte literal/decimal), and formatting (cargo rustdoc-fmt). Also use retroactively via /fix-intradoc-links, /fix-comments, or /fix-md-tables commands.
Its SKILL.md is about 11k tokens, which your agent loads only when the skill is triggered. The skill folder holds 6 other files (for example `ansi-escape-codes.md`, `constant-conventions.md` and `examples.md`).
It sits in Development. It works with Rust. The repository describes itself as: TUI framework and developer productivity apps in Rust 🦀. The licence is Apache-2.0.
7 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 89db352. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
cargoFrom the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
en.wikipedia.orgman7.orgdocs.rsgitlab.gnome.orgFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Write Documentation loads about 11k tokens when it runs. Until then it costs about 120 tokens; SKILL.md has 3,602 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from r3bl-org/r3bl-open-core at commit 89db352, republished under its Apache-2.0 licence (© r3bl-org). 3,602 words, ~11,394 tokens.
.claude/skills/write-documentation/SKILL.md (or your agent's skills folder). This skill also uses 6 other files; get the full folder from GitHub.This consolidated skill covers all aspects of writing high-quality rustdoc:
ESC [ notation (see ansi-escape-codes.md)/// or //! doc comments/fix-intradoc-links - Fix broken links, convert inline to reference-style/fix-comments - Fix constant conventions in doc comments/fix-md-tables - Fix markdown table formatting/docs - Full documentation check and fixr3bl is serious & meaningful & precise. r3bl is also fun.
Documentation should be rigorous about content, playful about presentation:
| Aspect | Serious & Precise | Fun |
|---|---|---|
| Technical accuracy | Correct terminology, proper distinctions | - |
| Links | Intra-doc links, authoritative sources | - |
| Visual aids | ASCII diagrams, tables | Emoji for scannability |
| Language | Clear, unambiguous | Literary references, personality |
Emoji for visual scanning (semantic, not decorative):
//! 🐧 **Linux**: Uses `epoll` for I/O multiplexing
//! 🍎 **macOS**: Uses `kqueue` (with PTY limitations)
//! 🪟 **Windows**: Uses IOCP for async I/OSeverity with visual metaphors:
//! 1. 🐢 **Multi-threaded runtime**: Reduced throughput but still running
//! 2. 🧊 **Single-threaded runtime**: Total blockage - nothing else runsLiterary references with layered meaning:
//! What's in a name? 😛 The three core properties:The 😛 is a visual pun on "tongue in cheek" - Shakespeare's Juliet argues names don't matter, but here we use the quote to explain why RRT's name does matter. The emoji signals the irony.
Rule: Emoji must have semantic meaning (OS icons, severity levels). Never use random 🚀✨🎉 for "excitement."
For ASCII art diagrams in rustdoc, use only glyphs listed in docs/boxes.md. That file is
the approved set - every glyph there has been tested across multiple fonts and terminals on
macOS, Linux, and Windows. Emoji and other Unicode characters outside that set may render
with incorrect widths or as tofu boxes.
See docs/boxes.md for the complete approved set. Common patterns:
┌─────────────────────────────────────────────────────────────────────────┐
│ Box with header │
├─────────────────────────────────────────────────────────────────────────┤
│ Content here │
└─────────────────────────────────────────────────────────────────────────┘| Use | Instead of | Unicode |
|---|---|---|
→ | ➡️ | U+2192 RIGHTWARDS ARROW |
← | ⬅️ | U+2190 LEFTWARDS ARROW |
▼ | ⬇️ | U+25BC BLACK DOWN-POINTING TRIANGLE |
▲ | ⬆️ | U+25B2 BLACK UP-POINTING TRIANGLE |
► | ▶️ | U+25BA BLACK RIGHT-POINTING POINTER |
◄ | ◀️ | U+25C4 BLACK LEFT-POINTING POINTER |
| Use | Instead of | Unicode | Meaning |
|---|---|---|---|
■ | ✅ ✓ | U+25A0 BLACK SQUARE | Success/yes |
□ | ❌ ✗ ✘ | U+25A1 WHITE SQUARE | Failure/no |
// ❌ Bad: Emoji may not render correctly
//! Timeline: create ──► spawn ──► ❌ fails
// ■ Good: Font-safe Unicode renders everywhere
//! Timeline: create ──► spawn ──► □ failsException: OS-identifying emoji (🐧 🍎 🪟) are acceptable in prose because they're semantic and commonly supported. But in ASCII art diagrams, stick to standard Unicode.
Doc comments should read naturally and have clear subjects. Avoid abrupt sentence starts.
The ASCII hyphen / hyphen-minus (-, U+002D) is the ONLY dash character permitted anywhere in the codebase. Non-ASCII en dashes (–) and em dashes (—, endash/emdash) are strictly forbidden.
Do NOT use hyphens (-), en dashes (–), or em dashes (—) to connect clauses or sentences in documentation.
-) should only be used for compound words (type-safe, zero-cost), markdown bullet points (- Item), or code/operators, never to join independent thoughts or clauses.// ❌ Bad: Connecting sentences/clauses with dashes, en dashes, or em dashes
/// This is the main trait - implement it to add your logic.
/// This is the main trait – implement it to add your logic.
/// This is the main trait — implement it to add your logic.
// ✅ Good: Separate sentences or proper punctuation
/// This is the main trait. Implement it to add your logic.
/// This is the main trait: implement it to add your logic.Use precise terms for the code lifecycle and generics to maintain low cognitive load.
See Technical Terminology Precision for the complete mental model and table.
ESC Notation, Not \x1BIn documentation prose, write escape sequences using human-readable ESC notation, not Rust
hex escape syntax.
\x1B is Rust/C escape syntax for byte 27. In prose, it forces the reader to mentally decode
hex before understanding the sequence.ESC is the standard terminal notation used in VT-100 specs, Wikipedia, and terminal
documentation. A reader instantly knows "escape byte" without hex decoding.ESC [ A, not ESC[A) so each part (escape prefix,
intermediary, final byte) is visually distinct.// ❌ Bad: Rust escape syntax in documentation prose
/// Sends `\x1BOA` in application mode or `\x1B[A` in normal mode.
/// The detector scans for `\x1B[?1h` and `\x1B[?1l`.
// ✅ Good: Standard terminal notation
/// Sends `ESC O A` in application mode or `ESC [ A` in normal mode.
/// The detector scans for `ESC [ ? 1 h` and `ESC [ ? 1 l`.Exception: In Rust code, doctests, and byte literals, continue using \x1B or 0x1B -
that's actual Rust syntax the compiler needs.
All technical acronyms get backticks. No exceptions - treat them as technical identifiers, not prose.
// ❌ Bad: Plain text acronyms
/// Uses ANSI escape sequences to parse PTY output via the VTE parser.
// ✅ Good: All acronyms backticked
/// Uses `ANSI` escape sequences to parse `PTY` output via the `VTE` parser.[`ACRONYM`]When a backticked acronym has a useful link target, wrap it in [ ] to create a
reference-style intra-doc link. Prefer local links when the target is a dependency
in Cargo.toml (validated at build time, works offline, version-matched). Fall back
to external URLs (Wikipedia, man pages) only when no local target exists:
/// Parses [`PTY`] output using the [`VTE`] parser over [`SSH`] connections.
///
/// [`PTY`]: https://en.wikipedia.org/wiki/Pseudoterminal // No local target
/// [`VTE`]: mod@vte // Local dep in Cargo.toml
/// [`SSH`]: https://en.wikipedia.org/wiki/Secure_Shell // No local targetCommon linked acronyms and their targets:
| Acronym | Link Target | Source |
|---|---|---|
[`TUI`] | crate::tui::TerminalWindow::main_event_loop | Local (crate item) |
[`VTE`] | mod@vte | Local (Cargo.toml dep) |
[`PTY`] | https://en.wikipedia.org/wiki/Pseudoterminal | External (OS concept) |
[`SSH`] | https://en.wikipedia.org/wiki/Secure_Shell | External (protocol) |
[`TCP`] | https://en.wikipedia.org/wiki/Transmission_Control_Protocol | External (protocol) |
[`DCS`] | Spec URL or crate path as appropriate | Depends on context |
When used inline without a link target, plain backticks are sufficient:
/// The `CSI` sequence `ESC [ 38 ; 5 ; n m` sets 256-color foreground.
/// This `SGR` parameter handles `RGB` true color via `ANSI` escape codes.Common unlinked acronyms: `SGR`, `CSI`, `OSC`, `ANSI`,
`ASCII`, `RGB`, `UTF-8`, `EOF`, `FIFO`.
Software names are technical identifiers and get backticks:
// ❌ Bad: Plain text product names
/// Compatible with xterm, Alacritty, and kitty terminals.
// ✅ Good: Backticked product names
/// Compatible with `xterm`, `Alacritty`, and `kitty` terminals.Common product names: `xterm`, `Alacritty`, `kitty`,
`GNOME VTE`, `st` (suckless terminal).
When linking to an external project: [`GNOME VTE`]: https://gitlab.gnome.org/GNOME/vte
Standards body names and specification document identifiers stay as plain text - they are citation references, not technical identifiers:
| Category | Examples |
|---|---|
| Spec document identifiers | ECMA-48, ITU-T Rec. T.416, ISO 8613-6 |
When linking a spec, use descriptive link text: [ITU-T Rec. T.416]: https://...
DEC private mode mnemonics are acronyms and get backticks: `DECAWM`,
`DECSC`, `DECRC`, `DECSM`.
When linking to a crate constant: [`DECAWM`]: crate::DECAWM_AUTO_WRAP
The first line/paragraph of a doc comment should describe what the item IS, not what it does. Follow Rust std conventions.
IMPORTANT: The first paragraph must be separate. Rustdoc uses it as the summary in:
// ❌ Bad: Summary and details merged
/// A trait for creating workers. This trait implements two-phase setup.
// ✅ Good: Summary is separate paragraph
/// A trait for creating workers.
///
/// This trait implements two-phase setup.Start with "A/An [noun]..." describing what it is:
// From std:
/// A contiguous growable array type, written as `Vec<T>`, short for 'vector'.
pub struct Vec<T> { ... }
/// A UTF-8-encoded, growable string.
pub struct String { ... }
/// A mutual exclusion primitive useful for protecting shared data.
pub struct Mutex<T> { ... }
// Our style:
/// A thread-safe container for managing worker thread lifecycle.
pub struct ThreadSafeGlobalState<F> { ... }
/// An offscreen buffer for testing terminal rendering.
pub struct OffscreenBuffer { ... }Start with "A/An [noun]..." or "The [type]...":
// From std:
/// An `Ordering` is the result of a comparison between two values.
pub enum Ordering { Less, Equal, Greater }
/// An IP address, either IPv4 or IPv6.
pub enum IpAddr { V4(...), V6(...) }
// Our style:
/// An indication of whether the worker thread is running or terminated.
pub enum LivenessState { Running, Terminated }
/// A decision about whether the worker thread should shut down.
pub enum ShutdownDecision { ContinueRunning, ShutdownNow }// Our style:
/// A trait for creating the coupled [`Worker`] + [`Waker`] pair atomically.
pub trait RRTFactory { ... }
/// A trait for implementing the blocking I/O loop on the dedicated RRT thread.
pub trait RRTWorker { ... }Start with what the method/function does using third-person:
// From std:
/// Constructs a new, empty `Vec<T>`.
pub fn new() -> Vec<T> { ... }
/// Returns the number of elements in the vector.
pub fn len(&self) -> usize { ... }
/// Appends an element to the back of a collection.
pub fn push(&mut self, value: T) { ... }
/// Returns the contained `Some` value, consuming the `self` value.
pub fn unwrap(self) -> T { ... }
// Our style:
/// Creates new thread state with fresh liveness tracking.
pub fn new(waker: W) -> Self { ... }
/// Checks if the thread should self-terminate.
pub fn should_self_terminate(&self) -> ShutdownDecision { ... }Follow the Rust std convention (e.g., Iterator::Item, Future::Output):
// From std:
/// The type of the elements being iterated over.
type Item;
/// The type of value produced on completion.
type Output;
// Our style (user-provided types use "Your type"):
/// The type broadcast from your [`Worker`] to async subscribers.
type Event;
/// Your type implementing one iteration of the blocking I/O loop.
type Worker: RRTWorker<Event = Self::Event>;
/// Your type for interrupting the blocked dedicated RRT worker thread.
type Waker: RRTWaker;Pattern: Use "The type [verb]..." or "Your concrete type [verb]..." where the verb describes what the type does:
When to use "Your concrete type": For associated types that the user must provide -
types with trait bounds like : RRTWorker. The word "concrete" emphasizes they provide
an actual struct/enum, not just satisfy an abstract contract.
When to use "of": Only when describing what a type contains rather than what it is:
Iterator::Item: "The type of the elements..." - Item contains elementsFuture::Output: "The type of value..." - Output contains a valueParenthetical clarifiers: When context is needed, use parentheticals:
/// Your concrete type (that implements this method) is an injected dependency...Gold standard: See RRTFactory in tui/src/core/resilient_reactor_thread/types.rs
for a complete example of complex trait documentation with associated types.
/// Capacity of the broadcast channel for events.
pub const CHANNEL_CAPACITY: usize = 4_096;
/// ESC byte (1B in hex).
pub const ANSI_ESC: u8 = 27;Note: All ANSI constants in tui/src/core/ansi/constants/ MUST follow the
Standardized Doc Template. See [constant-conventions.md] for details.
| Item Type | Pattern | Example Opening |
|---|---|---|
| Struct | A/An [noun]... | A thread-safe container for... |
| Enum | A/An [noun]... | An indication of whether... |
| Trait | A trait for... | A trait for creating... |
| Associated Type (user-provided) | Your concrete type [verb]... | Your concrete type implementing... |
| Associated Type (framework) | The concrete type [verb]... | The concrete type broadcast... |
| Method | Third-person verb | Returns the..., Creates a... |
| Function | Third-person verb | Constructs a new..., Checks if... |
| Constant | Noun phrase | Capacity of the..., ESC byte... |
When a file contains primarily one struct, enum, or trait, keep module docs minimal - just identify the file's purpose and link to the main type:
//! Thread-safe global state manager for the Resilient Reactor Thread pattern. See
//! [`ThreadSafeGlobalState`] for details.For files dedicated to a single PTY integration test, use module-level documentation
to describe the test's intent and provide execution instructions. This keeps the
generate_pty_test! macro call clean.
Standard Pattern:
# Run with:).//! [`PTY`]-based integration test for [Feature Name].
//!
//! Validates that [specific behavior] works correctly in a real terminal environment.
//!
//! [Detailed description...]
//!
//! # Run with:
//!
//! ```bash
//! cargo test -p r3bl_tui --lib [test_name] -- --nocapture
//! ```
//!
//! [`PTY`]: https://en.wikipedia.org/wiki/PseudoterminalWhy this matters:
When a file contains multiple related types, use a brief intro + bullet list:
//! Core traits for the Resilient Reactor Thread (RRT) pattern.
//!
//! - [`RRTFactory`]: Creates coupled worker thread + waker
//! - [`RRTWorker`]: Work loop running on the thread
//! - [`RRTWaker`]: Interrupt a blocked thread
//!
//! See [module docs] for the full RRT pattern explanation.
//!
//! [module docs]: super//! Thread liveness tracking for the Resilient Reactor Thread pattern. See
//! [`ThreadLiveness`], [`LivenessState`], and [`ShutdownDecision`].Why minimal? The detailed documentation belongs on the types themselves (inverted pyramid). Module docs just help readers navigate to the right type. Don't duplicate content.
After the opening line, subsequent sentences should use explicit subjects - don't start with verbs that leave the subject ambiguous:
/// A trait for interrupting blocked threads.
///
/// Called by `SubscriberGuard::drop()` to signal shutdown.What's "called"? The trait? A method? The reader must guess.
/// A trait for interrupting blocked threads.
///
/// [`SubscriberGuard::drop()`] calls [`wake_and_unblock_dedicated_thread()`] on implementors of this trait to signal
/// shutdown.Now it's clear: the method is what's being called, on implementors of the trait.
Note: Traits themselves aren't "called" - methods are. Say what valid actions a trait can take: "This trait solves...", "This trait requires...", "This trait defines...". Don't say "This trait is called...".
| Abrupt Start | Fix With Explicit Subject |
|---|---|
Called by... | [Foo::bar()] calls this method... or This method is called by... |
Returned by... | This enum is returned by... |
Used to... | This struct is used to... |
Manages... | This struct manages... |
Centralizes... | This module centralizes... |
Solves... | This trait solves... |
Methods should use third-person verbs (like Rust std docs), not imperative:
| ❌ Imperative | ✅ Third-Person |
|---|---|
Create a new buffer. | Creates a new buffer. |
Return the length. | Returns the length. |
Check if empty. | Checks if empty. |
Subscribe to events. | Subscribes to events. |
Why third-person? It reads naturally as "This method creates..." without needing to say "This method". Imperative form ("Create...") sounds like a command to the reader.
| Context | Self-Reference |
|---|---|
| Trait doc | This trait... |
| Struct doc | This struct... |
| Enum doc | This enum... |
Module doc (//!) | This module... |
| Method doc | Implicit (verb alone) or This method... |
| Associated type doc | This type... |
Use # Example (not # Concrete Implementation) when linking to reference implementations:
// ❌ Bad: Sounds like THE canonical implementation
/// # Concrete Implementation
///
/// See [`MioPollWorker`] for a concrete implementation.
// ✅ Good: Idiomatic Rust, implies there could be others
/// # Example
///
/// See [`MioPollWorker`] for an example implementation.Why # Example?
The cargo doc static site only shows # (h1) and ## (h2) headings in the sidebar
navigation. ### (h3) and below are not shown in the sidebar.
For sub-sections within a ## heading, use bold text (**bold**) instead of ###:
//! ## How It Works // ← Shown in sidebar
//!
//! **Creation and reuse** - ... // ← NOT in sidebar, but visually distinct
//!
//! **Cooperative shutdown** - ... // ← NOT in sidebar, but visually distinctWhy this matters: Using ### creates a false promise of navigability - readers expect
to find it in the sidebar but can't. Bold text is visually similar but sets correct
expectations.
Structure documentation with high-level concepts at the top, details below:
╲────────────╱
╲ ╱ High-level concepts - Module/trait/struct documentation
╲────────╱
╲ ╱ Mid-level details - Method group documentation
╲────╱
╲ ╱ Low-level specifics - Individual method documentation
╲╱Avoid making readers hunt through method docs for the big picture.
| Level | What to Document | Example Style |
|---|---|---|
| Module/Trait | Why, when, conceptual examples, workflows, ASCII diagrams | Comprehensive |
| Method | How to call, exact types, parameters | Brief (IDE tooltips) |
/// See the [module-level documentation] for complete usage examples.
///
/// [module-level documentation]: mod@crate::example
pub fn some_method(&self) -> Result<()> { /* ... */ }crate:: paths (not super::) - absolute paths are stable() for functions/methods - distinguishes from typesWhen deciding local vs external links, follow this priority:
| Priority | Source | Link Style | Example |
|---|---|---|---|
| 1 | Code in this monorepo | crate:: path | [Foo]: crate::module::Foo |
| 2 | Dependency in Cargo.toml | Crate path | [mio]: mio |
| 3 | OS/CS/hardware terms | External URL | [epoll]: https://man7.org/... |
| 4 | Pedagogical/domain terms | Wikipedia URL | [design pattern]: https://en.wikipedia.org/... |
| 5 | Non-dependency crates | docs.rs URL | [rayon]: https://docs.rs/rayon |
Key principle: If it's in Cargo.toml, use local links (validated, offline-capable, version-matched).
Every codebase symbol in backticks must be a link. This isn't just style -it's safety.
When you rename, move, or delete a symbol:
cargo doc fails with a clear error pointing to the stale reference| Docs say | Symbol renamed to | With link | Without link |
|---|---|---|---|
[`Parser`] | Tokenizer | ❌ Build error | ✅ Silently stale |
[`process()`] | handle() | ❌ Build error | ✅ Silently stale |
Rule: If it's a symbol from your codebase and it's in backticks, make it a link.
// ❌ Bad: Will silently rot when Parser is renamed
/// Uses `Parser` for tokenization.
// ✅ Good: cargo doc will catch if Parser is renamed
/// Uses [`Parser`] for tokenization.
///
/// [`Parser`]: crate::Parser| Link To | Pattern |
|---|---|
| Struct | [Foo]: crate::Foo |
| Function | [process()]: crate::process |
| Method | [run()]: Self::run |
| Module | [parser]: mod@crate::parser |
| Section heading | [docs]: mod@crate::module#section-name |
| Dependency crate | [tokio::spawn()]: tokio::spawn |
/// This struct uses [`Position`] to track cursor location.
///
/// The [`render()`] method updates the display.
///
/// [`Position`]: crate::Position
/// [`render()`]: Self::render/// This struct uses [`Position`](crate::Position) to track cursor location./// This struct uses `Position` to track cursor location.For crates listed in your Cargo.toml dependencies, use direct intra-doc links instead of
external hyperlinks to docs.rs. Rustdoc automatically resolves these when the dependency is built.
| Link To | Pattern |
|---|---|
| Crate root | [crossterm]: ::crossterm |
| Type in crate | [mio::Poll]: mio::Poll |
| Function in crate | [tokio::io::stdin()]: tokio::io::stdin |
| Macro in crate | [tokio::select!]: tokio::select |
//! **UI freezes** on terminal resize when using [`tokio::io::stdin()`].
//! Internally, cancelling a [`tokio::select!`] branch doesn't stop the read.
//! However, the use of [Tokio's stdin] caused the first two issues.
//!
//! [`tokio::select!`]: tokio::select
//! [`tokio::io::stdin()`]: tokio::io::stdin
//! [Tokio's stdin]: tokio::io::stdin/// Uses [`mio::Poll`] to efficiently wait on file descriptor events.
///
/// [`mio::Poll`]: mio::Poll//! Use [`crossterm`]'s `enable_raw_mode` for terminal input.
//!
//! [`crossterm`]: ::crossterm/// Uses [mio::Poll](https://docs.rs/mio/latest/mio/struct.Poll.html) to wait.Don't use docs.rs URLs for crates that are already in your Cargo.toml.
Why direct links are better for dependencies:
cargo doc output (works offline)For crates that are not in your Cargo.toml, external links are fine:
/// This is similar to how [rayon](https://docs.rs/rayon) handles parallel iteration.Since rayon isn't a dependency, there's no local documentation to link to.
For operating system concepts, computer science terminology, or hardware references that aren't Rust crates, use external URLs (man pages, Wikipedia, specs):
//! Uses [`epoll`] for efficient I/O multiplexing on Linux.
//! Implements the [`Actor`] pattern for message passing.
//! Reads from [`stdin`] which is a [`file descriptor`].
//!
//! [`epoll`]: https://man7.org/linux/man-pages/man7/epoll.7.html
//! [`Actor`]: https://en.wikipedia.org/wiki/Actor_model
//! [`stdin`]: std::io::stdin
//! [`file descriptor`]: https://man7.org/linux/man-pages/man2/open.2.htmlCommon external link targets:
| Type | URL Pattern | Example |
|---|---|---|
| Linux syscalls/APIs | man7.org/linux/man-pages/ | epoll, signalfd, io_uring |
| BSD APIs | man.freebsd.org/ | kqueue |
| CS concepts | en.wikipedia.org/wiki/ | Actor model, Reactor pattern |
| Pedagogical terms | en.wikipedia.org/wiki/ | design pattern, RAII, file descriptor |
| Specs/RFCs | Official spec sites | ANSI escape codes, UTF-8 |
Key distinction:
mio (Rust crate in Cargo.toml) → [mio]: mio (local)epoll (Linux kernel API) → [epoll]: https://man7.org/... (external)Link domain-specific terminology to external references (typically Wikipedia) even when the concept seems "obvious." This makes documentation accessible to readers of all backgrounds - not everyone comes from a CS degree or has the same experience level.
Rule: If a term has a formal definition that would help a newcomer understand the docs, link it. The cost of an extra link is near zero; the cost of excluding a reader is high.
// ✅ Good: Links pedagogical terms for inclusivity
//! This [design pattern] avoids all of this and allows async code to...
//! Resources are cleaned up via [`RAII`] when the guard is dropped.
//!
//! [design pattern]: https://en.wikipedia.org/wiki/Software_design_pattern
//! [`RAII`]: https://en.wikipedia.org/wiki/Resource_acquisition_is_initialization// ❌ Bad: Assumes reader already knows these terms
//! This design pattern avoids all of this and allows async code to...
//! Resources are cleaned up via RAII when the guard is dropped.Common pedagogical link targets:
| Term | URL |
|---|---|
| design pattern | https://en.wikipedia.org/wiki/Software_design_pattern |
| RAII | https://en.wikipedia.org/wiki/Resource_acquisition_is_initialization |
| file descriptor | https://man7.org/linux/man-pages/man2/open.2.html |
| dependency injection | https://en.wikipedia.org/wiki/Dependency_injection |
| inversion of control | https://en.wikipedia.org/wiki/Inversion_of_control |
| Actor model | https://en.wikipedia.org/wiki/Actor_model |
| Reactor pattern | https://en.wikipedia.org/wiki/Reactor_pattern |
Note: The link source priority is also documented in
link-patterns.md. This redundancy is intentional -SKILL.md content is loaded when the skill triggers, ensuring reliable application during doc generation. Supporting files require explicit reads and serve as detailed reference.
Use human-readable numeric literals for byte constants:
| Type | Format | Example |
|---|---|---|
Bitmasks (used in &, |, ^) | Binary | 0b0110_0000 |
| Printable ASCII | Byte literal | b'[' |
| Non-printable bytes | Decimal | 27 |
| Comments | Show hex | // (1B in hex) |
/// ESC byte (1B in hex).
pub const ANSI_ESC: u8 = 27;
/// CSI bracket byte: `[` (91 decimal, 5B hex).
pub const ANSI_CSI_BRACKET: u8 = b'[';
/// Mask to convert control character to lowercase (60 in hex).
pub const CTRL_TO_LOWERCASE_MASK: u8 = 0b0110_0000;pub const ANSI_ESC: u8 = 0x1B;
pub const ANSI_CSI_BRACKET: u8 = 0x5B;
pub const CTRL_TO_LOWERCASE_MASK: u8 = 0x60;For detailed conventions, see constant-conventions.md in this skill.
# Format specific file
cargo rustdoc-fmt path/to/file.rs
# Format all git-changed files
cargo rustdoc-fmt
# Format entire workspace
cargo rustdoc-fmt --workspaceWhat it does:
If not installed:
cd build-infra && cargo install --path . --forceAlways use left-aligned columns in markdown tables. This is the default and most readable alignment for technical documentation.
| Left-aligned | Left-aligned | Left-aligned |
| :----------- | :----------- | :----------- |
| data | data | data |The : on the left side of the dashes indicates left alignment. While the : is optional for
left alignment (it's the default), always include it explicitly for consistency.
| Item Type | Pattern | Example |
| :-------- | :------ | :------ |
| Struct | `A/An` | `A thread-safe container...` |
| Trait | `A trait for` | `A trait for creating...` |Renders as:
| Item Type | Pattern | Example |
|---|---|---|
| Struct | A/An | A thread-safe container... |
| Trait | A trait for | A trait for creating... |
| Item Type | Pattern | Example |
| :-------: | ------: | :-----: |
| Struct | `A/An` | `A thread-safe container...` |Center (:---:) and right (---:) alignment are harder to scan and rarely appropriate for
technical docs. Use them only when the content semantically requires it (e.g., numeric columns
that should right-align for decimal alignment).
$ or LaTeX Math DelimitersDo NOT use $ or $$ or \(...\) LaTeX math delimiters in rustdoc comments or chat responses. They do not render in the user's UI or standard markdown viewers. Use standard Markdown text, backticks (e.g., [start, start+len)), or code blocks instead.
./check.fish --quick-doc
# (runs: cargo doc --no-deps, directly to serving dir; fastest for iteration)
# Use --doc for final verification before commits (includes staging/sync)
./check.fish --test
# (runs: cargo test --doc)[!TIP] Run in a Subagent: Building workspace documentation and running doctests can take 1 to 2+ minutes. Delegate these commands to a background subagent (
self) so the active conversation with the user is not blocked.
Golden Rule: Don't use ignore unless absolutely necessary.
| Scenario | Use |
|---|---|
| Example compiles and runs | ``` (default) |
| Compiles but shouldn't run | ```no_run |
| Can't make it compile | Link to real code instead |
| Macro syntax | ```ignore with HTML comment explaining why |
/// See [`test_example`] for actual usage.
///
/// [`test_example`]: crate::tests::test_exampleMake test module visible to docs:
#[cfg(any(test, doc))]
pub mod tests;When you see this warning:
"unresolved link to
crate::path::test_module"And the module is
#[cfg(test)]only
Don't give up on links - Add conditional visibility instead of using plain text:
// Before (links won't resolve):
#[cfg(test)]
mod backend_tests;
// After (links resolve in docs):
#[cfg(any(test, doc))]
pub mod backend_tests;For code that only runs on specific platforms (e.g., Linux) but should have docs generated on all platforms (so developers on macOS can read them locally):
// ❌ Broken: Docs won't generate on macOS!
#[cfg(all(target_os = "linux", any(test, doc)))]
pub mod linux_only_module;
// ✅ Fixed: Docs generate on all platforms, tests run only on Linux
#[cfg(any(doc, all(target_os = "linux", test)))]
pub mod linux_only_module;
#[cfg(all(target_os = "linux", not(any(test, doc))))]
mod linux_only_module;
// Re-exports also need the doc condition
#[cfg(any(target_os = "linux", doc))]
pub use linux_only_module::*;Key insight: The doc cfg flag doesn't override other conditions -it's just another flag. Use
any(doc, ...) to make documentation an alternative path, not an additional requirement:
| Pattern | Meaning | Docs on macOS? |
|---|---|---|
all(target_os = "linux", any(test, doc)) | Linux AND (test OR doc) | ❌ No |
any(doc, all(target_os = "linux", test)) | doc OR (Linux AND test) | ✅ Yes |
Apply at all levels - If linking to a nested module, both parent and child modules need
the visibility change. See organize-modules skill for complete patterns and examples.
The cfg(any(doc, ...)) pattern assumes the module's code compiles on all platforms. When
the module uses Unix-only APIs (e.g., mio::unix::SourceFd, signal_hook, std::os::fd::AsRawFd),
use cfg(any(all(unix, doc), ...)) instead to restrict doc builds to Unix platforms where the
dependencies exist.
Three-tier platform hierarchy for cfg doc patterns:
| Module dependencies | Pattern | Docs on Linux | Docs on macOS | Docs on Windows |
|---|---|---|---|---|
| Platform-agnostic (pure Rust, cross-platform deps) | cfg(any(doc, ...)) | ✅ | ✅ | ✅ |
Unix APIs (mio::unix, signal_hook, std::os::fd) | cfg(any(all(unix, doc), ...)) | ✅ | ✅ | excluded |
| Linux-only APIs (hypothetical) | cfg(any(all(target_os = "linux", doc), ...)) | ✅ | excluded | excluded |
Example - Unix-restricted doc build:
// Module uses mio::unix::SourceFd, signal_hook - Unix-only APIs.
// Dependencies in Cargo.toml are gated with cfg(unix).
// Doc builds are restricted to Unix where the dependencies exist.
#[cfg(any(all(unix, doc), all(target_os = "linux", test)))]
pub mod input;
#[cfg(all(target_os = "linux", not(any(test, doc))))]
mod input;
// Re-export also needs the unix-gated doc condition
#[cfg(any(target_os = "linux", all(unix, doc)))]
pub use input::*;Rule of thumb: Match your doc cfg guard to your dependency's cfg guard. If the dep uses
cfg(unix), gate docs with all(unix, doc). If the dep uses cfg(target_os = "linux"), gate
docs with all(target_os = "linux", doc).
When writing doctests (or doc code examples) that reference platform-specific APIs (such as Linux-only DirectToAnsiInputDevice or MioPollWorker), never downgrade the code example to a generic mock or use ```ignore. Real types provide concrete value and clickable intra-doc links for readers.
However, cargo test --doc executes across multiple operating systems (Linux, macOS, Windows). If a doctest references Linux-only symbols at the root level, it will fail to compile on Windows and macOS with unresolved import errors.
linux_only Module Wrapper PatternTo allow the doctest to showcase real Linux production types on Linux while cleanly passing on non-Linux platforms (Windows and macOS), wrap the Linux-specific code in a hidden module and conditionally re-export main:
/// ```no_run
/// # #[cfg(not(target_os = "linux"))]
/// # fn main() {}
/// # #[cfg(target_os = "linux")]
/// # use linux_only::main;
/// # #[cfg(target_os = "linux")]
/// # mod linux_only {
/// use r3bl_tui::{MioPollWorker, ok};
/// use r3bl_tui::core::resilient_reactor_thread::RRT;
///
/// // Global resources (static + const fn = singleton).
/// static SINGLETON: RRT<MioPollWorker> = RRT::new();
///
/// pub fn main() -> miette::Result<()> {
/// // Subscribe to get a guard that auto-manages the thread.
/// let guard = SINGLETON.try_subscribe(())?;
/// ok!()
/// }
/// # }
/// ```For macros like generate_pty_test! where the macro itself generates functions rather than a main function:
//! ```no_run
//! # #[cfg(not(target_os = "linux"))]
//! # fn main() {}
//! # #[cfg(target_os = "linux")]
//! # fn main() {}
//! # #[cfg(target_os = "linux")]
//! # mod linux_only {
//! use r3bl_tui::{
//! generate_pty_test, PtyTestMode, DirectToAnsiInputDevice,
//! PtyPair, PtyTestChild, PtyTestContext
//! };
//! use std::io::{Write, BufRead};
//! fn process_terminal_events(_: &DirectToAnsiInputDevice) {}
//! generate_pty_test! {
//! test_fn: interactive_input_parsing,
//! controller: |context: PtyTestContext| {
//! // ...
//! },
//! controlled: || {
//! let mut input_device = DirectToAnsiInputDevice::new()
//! .expect("Failed to initialize DirectToAnsiInputDevice");
//! println!("CONTROLLED_READY");
//! process_terminal_events(&input_device);
//! std::process::exit(0);
//! },
//! mode: PtyTestMode::Raw,
//! }
//! # }
//! ```# lines are stripped. Readers only see the clean, real-world code featuring production types without platform-gating noise or mock boilerplate.linux_only::main, validating production types and preventing regressions.rustc compiles the trivial empty fn main() {}. Because mod linux_only is guarded by #[cfg(target_os = "linux")], the compiler never evaluates or resolves the Linux-only imports, compiling in less than 1 ms without errors.Before committing documentation:
`ANSI`, `PTY`, `VTE`); linked when target exists ([`VTE`])`xterm`, `Alacritty`, `kitty`)-, –, or —, endash/emdash) used to connect sentences or clauses (use proper punctuation or separate sentences)ESC notation in prose, not \x1B (exception: code/doctests)■ □ → ▼) not emoji (❌ ➡️ ⬇️):---)# and ## headings used (not ### - use bold for sub-sections)crate:: pathscargo rustdoc-fmt)./check.fish --quick-doc)./check.fish --test)| File | Content | When to Read |
|---|---|---|
link-patterns.md | Link source rubric + 15 detailed patterns | Choosing local vs external links, modules, private types, test functions, fragments |
terminology-precision.md | Full code lifecycle & generics terminology map | Ensuring precise use of "parameter", "argument", "declaration", etc. |
constant-conventions.md | Full human-readable constants guide | Writing byte constants, decision guide |
examples.md | 5 production-quality doc examples | Need to see inverted pyramid in action |
rustdoc-formatting.md | cargo rustdoc-fmt deep dive | Installing, troubleshooting formatter |
| Command | Purpose |
|---|---|
/docs | Full documentation check (invokes this skill) |
/fix-intradoc-links | Fix only link issues |
/fix-comments | Fix only constant conventions |
/fix-md-tables | Fix only markdown tables |
check-code-quality - Includes doc verification steporganize-modules - Re-export chains, conditional visibility for doc linksrun-clippy - May suggest doc improvements
| /fix-md-tables | Fix only markdown tables |check-code-quality - Includes doc verification steporganize-modules - Re-export chains, conditional visibility for doc linksrun-clippy - May suggest doc improvements© r3bl-org, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 6 other files in .agents/skills/write-documentation of r3bl-org/r3bl-open-core.
Open the folder on GitHubat commit 89db352
Write Documentation next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Write Documentation this skillr3bl-org/r3bl-open-core | 485 | — | ~11k | Automated safety check: Pass | Apache-2.0 | |
| Migrate Core Code to Submodulestinyhumansai/openhuman | 42k | — | ~2.6k | Automated safety check: Pass | GPL-3.0 | |
| Rust Best Practicesfarm-fe/farm | 5.6k | 3 repos | ~1.1k | Automated safety check: Pass | MIT | |
| OpenLogi macOS Permissions TriageAprilNEA/OpenLogi | 23k | — | ~2.5k | Automated safety check: Notes | Apache-2.0 | |
| RTK Rust Design Patternsrtk-ai/rtk | 83k | — | ~1.9k | Automated safety check: Pass | Apache-2.0 | |
| Release Skillsnexmoe/eve | 421 | 3 repos | ~3.3k | Automated safety check: Pass | None |
tinyhumansai/openhuman
Plans and carries out moving non-host-specific code and its tests from the OpenHuman core into vendored tiny submodule libraries, then releases the submodule and re-pins the host.
farm-fe/farm
Guide for writing idiomatic Rust code based on Apollo GraphQL's best practices handbook.
AprilNEA/OpenLogi
Decides whether an OpenLogi device problem on macOS is a privacy-permission (TCC) problem, using agent log lines, and says which identity needs which grant.
rtk-ai/rtk
Describes seven Rust design patterns for the RTK CLI filter modules, with when to use each, RTK examples, and notes on when a pattern is overkill.
nexmoe/eve
Universal release workflow. An agent skill from nexmoe/eve.
teambit/bit
Work on the pnpm Rust engine (@pnpm/napi, the pacquet crates) that bit install runs through.
r3bl-org/r3bl-open-core
Analyze log files by stripping ANSI escape sequences first. An agent skill from r3bl-org/r3bl-open-core.
r3bl-org/r3bl-open-core
Establish performance baselines and detect regressions using flamegraph analysis.
r3bl-org/r3bl-open-core
Apply type-safe bounds checking patterns using VPIndex/VPLength types instead of usize.
r3bl-org/r3bl-open-core
Publish a crate release to crates.io with changelog, standalone release notes, git tag, and GitHub release.
r3bl-org/r3bl-open-core
Apply private modules with public re-exports (barrel export) pattern for clean API design.
r3bl-org/r3bl-open-core
Run comprehensive Rust code quality checks including compilation, linting, documentation, and tests.
Works with
Categories
Write and format Rust documentation correctly. An agent skill from r3bl-org/r3bl-open-core. Write Documentation is an agent skill from r3bl-org/r3bl-open-core. Write and format Rust documentation correctly.
Write Documentation fits situations like: development work in your project.
Run `npx skills add r3bl-org/r3bl-open-core --skill write-documentation -a claude-code`. Or copy the skill folder (.agents/skills/write-documentation in r3bl-org/r3bl-open-core) into .claude/skills/write-documentation in your project. Claude Code loads it when a task matches its description.
Run `npx skills add r3bl-org/r3bl-open-core --skill write-documentation -a codex`. Or copy the skill folder (.agents/skills/write-documentation in r3bl-org/r3bl-open-core) into .agents/skills/write-documentation in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add r3bl-org/r3bl-open-core --skill write-documentation -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/write-documentation, .gemini/skills/write-documentation, .github/skills/write-documentation and .opencode/skills/write-documentation in your project.
Going by SKILL.md and its folder, Write Documentation needs the command-line tools its instructions call (cargo).
SKILL.md names 4 domains. In commands or code: en.wikipedia.org, man7.org, docs.rs and gitlab.gnome.org; the agent is likely to contact these when it follows the instructions. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Write Documentation is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 11k tokens (SKILL.md is roughly 46k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Write Documentation: Migrate Core Code to Submodules (tinyhumansai/openhuman, 42k stars), Rust Best Practices (farm-fe/farm, 5.6k stars), OpenLogi macOS Permissions Triage (AprilNEA/OpenLogi, 23k stars) and RTK Rust Design Patterns (rtk-ai/rtk, 83k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
r3bl-org (a GitHub organization) maintains it in r3bl-org/r3bl-open-core, which has 485 GitHub stars. The repository holds 25 skills in this directory. The repository was last updated on October 8, 2026.
Source: r3bl-org/r3bl-open-core on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.