Sepia
Nanako0129/sepia
Make AI-generated writing read as human-written, in fiction and in professional prose.
Generate a narrative version release blog post from commits within a tag range.
$ npx skills add web-infra-dev/rstest --skill create-release-blog -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install web-infra-dev/rstest create-release-blog --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/web-infra-dev/rstest.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/create-release-blog .claude/skills/create-release-blog && 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 "create-release-blog" agent skill from https://github.com/web-infra-dev/rstest/tree/main/.agents/skills/create-release-blog into .claude/skills/create-release-blog/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "create-release-blog", 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/web-infra-dev/rstest/tree/main/.agents/skills/create-release-blogType 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 web-infra-dev/rstest --skill create-release-blog -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install web-infra-dev/rstest create-release-blog --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/web-infra-dev/rstest.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/create-release-blog .agents/skills/create-release-blog && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "create-release-blog" agent skill from https://github.com/web-infra-dev/rstest/tree/main/.agents/skills/create-release-blog into .agents/skills/create-release-blog/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "create-release-blog", 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 web-infra-dev/rstest --skill create-release-blog -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install web-infra-dev/rstest create-release-blog --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/web-infra-dev/rstest.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/create-release-blog .cursor/skills/create-release-blog && 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 "create-release-blog" agent skill from https://github.com/web-infra-dev/rstest/tree/main/.agents/skills/create-release-blog into .cursor/skills/create-release-blog/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "create-release-blog", 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/web-infra-dev/rstest.git --path .agents/skills/create-release-blog--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 web-infra-dev/rstest --skill create-release-blog -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install web-infra-dev/rstest create-release-blog --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/web-infra-dev/rstest.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/create-release-blog .gemini/skills/create-release-blog && 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 "create-release-blog" agent skill from https://github.com/web-infra-dev/rstest/tree/main/.agents/skills/create-release-blog into .gemini/skills/create-release-blog/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "create-release-blog", 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 web-infra-dev/rstest create-release-blogInstalls 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 web-infra-dev/rstest --skill create-release-blog -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/web-infra-dev/rstest.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/create-release-blog .github/skills/create-release-blog && 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 "create-release-blog" agent skill from https://github.com/web-infra-dev/rstest/tree/main/.agents/skills/create-release-blog into .github/skills/create-release-blog/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "create-release-blog", 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 web-infra-dev/rstest --skill create-release-blog -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install web-infra-dev/rstest create-release-blog --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/web-infra-dev/rstest.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/create-release-blog .opencode/skills/create-release-blog && 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 "create-release-blog" agent skill from https://github.com/web-infra-dev/rstest/tree/main/.agents/skills/create-release-blog into .opencode/skills/create-release-blog/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "create-release-blog", 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.
create-release-blogGenerate a narrative version release blog post from commits within a tag range.
Create Release Blog is an agent skill from web-infra-dev/rstest. Generate a narrative version release blog post from commits within a tag range. Use when the user wants to draft an article-style release blog (overview + a few feature highlights + a short list of minor changes), not a commit-dump release note. Asks the user to multi-select which features to highlight, then writes a bilingual draft under website/docs/{en,zh}/blog/.
Its SKILL.md is about 4.7k tokens, which your agent loads only when the skill is triggered. The skill folder holds 3 other files, including scripts.
It sits in Writing & Content, covering Changelog and release notes, Blog and article writing and Translation. The repository describes itself as: The JavaScript testing framework powered by Rspack. The licence is MIT.
9 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit b1f3dd9. 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.
Ships 2 files in scripts/ (JavaScript), which the agent can run.
Shell commands in SKILL.md call:
ghnodepnpmgitcurlkindFrom 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:
github.comassets.rspack.rsFrom 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.
Create Release Blog loads about 4.7k tokens when it runs. Until then it costs about 97 tokens; SKILL.md has 2,277 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); the scripts in this folder are not scanned.
The full file from web-infra-dev/rstest at commit b1f3dd9, republished under its MIT licence (© web-infra-dev). 2,277 words, ~4,676 tokens.
.claude/skills/create-release-blog/SKILL.md (or your agent's skills folder). This skill also uses 2 other files; get the full folder from GitHub.Draft a bilingual release blog post under website/docs/{en,zh}/blog/ for a given version
range. The post is an article, not a changelog: an opening overview, a few in-depth
highlight sections, then a single closing sentence linking to the GitHub release page.
The user will polish the draft manually. Aim for a strong starting point — readable prose, real code samples pulled from the actual PRs — not a finished post. The Style guidance section below defines the voice, wording, and formatting conventions to follow.
This is not a GitHub release-note generator. For that, use the create-draft-release-notes
skill. Release notes enumerate every commit; release blogs select 3–5 features and tell a
story about them.
Accept these input shapes:
previous_tag..next_tag — explicit two-sided range. Use as-is; skip the
range-start prompt below.next_version (e.g. 0.10.0) — resolve the range start via the prompt below;
the end is HEAD.gh release list --limit 5
as context), then run the prompt below.The filename is announcing-<major>-<minor>.mdx (e.g. 0.10.0 → announcing-0-10.mdx).
Run the resolver to compute candidate predecessors:
node .agents/skills/create-release-blog/scripts/resolve-range-start.mjs <next-version>It prints JSON like:
{
"nextVersion": "0.10.0",
"bump": "minor",
"sameTier": "v0.9.0",
"latest": "v0.9.10",
"sameTierEqualsLatest": false,
"tagPrefix": "v"
}sameTier is the predecessor in the same bumped tier (previous minor's .0,
previous patch, or last tag of the previous major). latest is the most recent
tag below nextVersion.
Use AskUserQuestion to pick the range start:
sameTierEqualsLatest is false and both are non-null, offer two options:<sameTier> — labeled e.g. "Previous minor (v0.9.0)" with a description
explaining "same biggest-version-tier predecessor; covers the full minor cycle".<latest> — labeled e.g. "Latest release (v0.9.10)" with a description
"most recent published tag; covers only commits since that patch".sameTierEqualsLatest is true, offer one option (<latest>) and rely on
the auto-added "Other" entry for a custom tag.null, present whichever is non-null plus "Other".The user picks one option, picks "Other" to type a custom tag, or types one inline.
The resolved range is <chosen-start>..<next-end> where <next-end> is HEAD (or
the user's explicit end tag). The start tag is excluded from the search — git's
A..B syntax yields commits reachable from B but not from A, so commits on the
start tag itself are not included.
State the resolved range and the target filename before continuing.
Run the helper:
node .agents/skills/create-release-blog/scripts/collect-commits.mjs <previous_tag>..<next_tag>It prints JSON with breaking, feat, fix, perf, refactor, docs, other. Each entry
has sha, type, scope, subject, prNumber, raw. Step 3 reads the breaking and
feat buckets; the other buckets are produced for completeness but unused by this flow.
Sort entries in the breaking + feat buckets so the most blog-worthy ones appear first when
you present them. This is ordering, not pruning — all candidates are still presented to
the user in the next step.
breaking entries come first and are pre-recommended as defaults — breaking changes almost
always warrant a highlight section.feat, rank by user-facing significance:core > browser/browser-react/coverage-istanbul >
adapter-*/vscode > internal/tooling scopes.gh pr view <N> --json additions,deletions,files; bigger
user-facing diffs outrank tiny ones. Discount lockfiles, generated code, and fixture-only
diffs.website/docs/** are user-facing — bump them up.Read each candidate PR before listing them — do not paste raw commit subjects. For every candidate, fetch the PR:
gh pr view <PR> --json title,body,files,labelsThen write one sentence of user-side value per candidate:
--changed
flag wired through the module graph resolver."taskContext, birpc, dispatch namespace) unless the
feature is itself about that internal — and even then, gloss it ("the worker-to-host
channel").files field and the related
docs path, and say so explicitly: "PR body was thin; summary inferred from changed files."Present all candidates as a numbered markdown list — do not use AskUserQuestion, which
caps at 4 options per question and is too narrow for this step. Format:
1. **`feat(core): subject`** ([#1234](https://github.com/web-infra-dev/rstest/pull/1234))
<one-sentence plain-language user-value summary>
2. **`feat(browser): subject`** ([#1235](https://github.com/web-infra-dev/rstest/pull/1235))
<summary>
...End with: "Reply with the numbers you'd like to highlight (e.g. 1,3,5). 2–4 is the
sweet spot — fewer reads thin, more dilutes the article." Wait for the user's reply before
continuing.
The PR body was already loaded in step 4. For each selected highlight, additionally:
gh pr diff <PR> | head -300 # see the API surfaceThen:
website/docs/en/; if present, link to it from the
highlight section instead of restating the docs.Path: website/docs/en/blog/announcing-<major>-<minor>.mdx. Structure:
---
description: 'One-line summary used on the blog list and as OG description.'
date: YYYY-MM-DD HH:mm:ss
sidebar: false
authors:
- name: <github-handle>
avatar: 'https://github.com/<github-handle>.png'
---
_Month Day, Year_
# Announcing Rstest X.Y
<img
src="https://assets.rspack.rs/rstest/rstest-banner-vX-Y.png"
alt="Rstest X.Y"
style={{
boxShadow: '0 2px 6px rgba(0, 0, 0, 0.08)',
}}
/>
Rstest X.Y has been released.
Notable changes:
- <Feature one: short noun- or verb-phrase>
- <Feature two: short noun- or verb-phrase>
- <Feature three: short noun- or verb-phrase>
- <Feature four: short noun- or verb-phrase>
## <Feature one heading>
<2–3 short paragraphs that lead with what shipped, then walk through motivation, mechanism,
and trade-offs. Stay factual, no narrative bridges.>
<Code block introduced by a concrete action verb — see Style guidance.>
<Optional follow-up paragraph ending with a uniform docs link — see Style guidance.>
## <Feature two heading>
...
---
For a full list of changes, see the [vX.Y.Z release notes](https://github.com/web-infra-dev/rstest/releases/tag/vX.Y.Z).Rules for frontmatter authors:
authors, the blog list shows the generic Rstest Team.git log
or PR authorship.name (GitHub handle) and avatar (https://github.com/<handle>.png).
Keep the order identical between EN and ZH frontmatter.Rules for the banner image:
<img> JSX (not markdown
) so it can carry an inline boxShadow — the shadow separates the lower
edge from a white page background in light mode.width / aspectRatio / objectFit. The banner is designed at its
intended on-page size; extra constraints crop or shrink the artwork.https://assets.rspack.rs/rstest/rstest-banner-v<major>-<minor>.png (no
patch segment; blog posts are per-minor). Banners ship via PR against
rstackjs/rstack-design-resources.pnpm gen:release-image from website/
and compress both with pnpm dlx pngquant-bin before committing them to
design-resources. website/AGENTS.md ("Release image generation") owns the exact
commands and flags.public directory under website/docs/ (create it if absent) and point src at
/rstest-banner-v<major>-<minor>.png. Revert both before opening the PR.{{ boxShadow: '0 2px 6px rgba(0, 0, 0, 0.08)' }}. No border, no
border-radius.Rules for the OG image:
rstest-og-image-v<major>-<minor>.png
(2400×1260, 1.91:1 social-share aspect). Do not point og:image at the banner — a wide
strip renders poorly as a Twitter/Slack card.website/rspress.config.ts via the top-level head function
(route-aware). Frontmatter head does not override the site-wide default reliably:
rspress doesn't dedupe og:image, so two tags end up in the HTML and scrapers pick the
first.curl -I).Rules for the intro:
Rstest X.Y has been released. — period, not exclamation;
factual, not celebratory. (See Style guidance for the broader tone rules.)Notable changes: and a bullet list of the chosen highlights. Each bullet
is a short noun- or verb-phrase naming the feature, wrapped as a markdown link to that
section's \{#kebab-case} anchor. The entire bullet is the link text — do not link only
a fragment.Rules for the closing release-notes link:
## More improvements heading, no per-PR bullet list — the release page
already enumerates everything.For a full list of changes, see the [vX.Y.Z release notes](https://github.com/web-infra-dev/rstest/releases/tag/vX.Y.Z).
The URL must use the v-prefixed tag (v0.10.0, not 0.10.0).--- on its
own line, blank lines above and below) — it's a meta-pointer, not a continuation.Do not add an Acknowledgements / "Thanks to contributors" section. The post ends with the release-notes link. Contributors are surfaced on the release page itself.
Path: website/docs/zh/blog/announcing-<major>-<minor>.mdx. Mirror the EN structure exactly.
# Announcing Rstest X.Y → # Rstest X.Y 发布## highlight section heading._May 14, 2026_ → _2026 年 5 月 14 日_.Rstest X.Y has been released. →
Rstest X.Y 已经发布。 (full-width period, no exclamation). Notable changes: →
主要变更:.For a full list of changes, see the [vX.Y.Z release notes](URL). →
完整变更请参考 [vX.Y.Z release notes](URL)。. Keep the link text in English (it
reads as a proper noun referring to the GitHub page).AGENTS.md.
Do not translate them to 工作进程 / 池 / 缓存 / 构建 / 制品 / 命令行 / 持续集成 / 终端 / 快照.date, table contents, PR links, and \{#kebab-case}
anchor slugs identical to EN — the slug match is what makes the intro-bullet links work
across both locales.For each locale, insert the new slug right after index in
website/docs/<lang>/blog/_meta.json:
["index", "announcing-0-10", ...existing slugs in newest-first order]Report:
Rstest X.Y now supports ... / Rstest X.Y adds a new ... flag / Rstest X.Y has changed the default of X from A to B. Do not open with the user's pain (When you're iterating on a single file...), the abstract benefit (Test runs have a fixed cost...), or a narrative bridge
between sections (The other large fixed cost is...).We added .... Use You can ...
sparingly for user-action sentences.feels slow / kind of wasteful. Stay factual.To enable it, set ...: / You can enable it explicitly: / Configure as follows:. Not Here's an example: or Like so:.Please refer to [Page name](/path) to learn more. — when linking to a full docs page.... please refer to the [Section name](/path#anchor) section. — when linking to a
specific section, typically appended to a sentence that lists what the section covers.
Do not use See X for details, More at X, or Full behavior in X.If you do not need this feature, you can set X to Y to disable it. — direct, no hedging.About 10× faster / approximately halves the build phase / from 8 s to 0.1 s. Not much faster / significantly improved.Mirror the EN voice using these ZH conventions:
_2026 年 5 月 14 日_ (use 年/月/日, no leading zero, half-width space between numerals).## A new threads pool, not ## A New Threads Pool), per the website's AGENTS.md. Run npx heading-case to check.\{#kebab-case} anchor
(e.g. ## A new threads pool \{#threads-pool}). EN and ZH must share the same anchor
slug so the intro-bullet links resolve in both locales and cross-locale deep links
work. Pick slugs short enough to read in URLs (#threads-pool, not #a-new-threads-pool).rstest.config.ts,
package.json, etc.), set title="<path>" on the fence so the rendered header shows it.[@rstest/adapter-rslib](https://github.com/web-infra-dev/rstest/tree/main/packages/adapter-rslib),
per website/AGENTS.md. No backticks around the npm name in links.TODO: release date so it isn't silently wrong. Do not set it to the current
timestamp.scripts/resolve-range-start.mjs: given a next version, compute sameTier and
latest predecessor tags (used to prompt the user for the range start).scripts/collect-commits.mjs: bucket commits in a git range by conventional-commit type.website/docs/en/blog/, website/docs/zh/blog/: target output directories.create-draft-release-notes (commit-dump GitHub release; complementary, not a replacement).© web-infra-dev, MIT. 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 2 other files (scripts) in .agents/skills/create-release-blog of web-infra-dev/rstest.
Open the folder on GitHubat commit b1f3dd9
Create Release Blog 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 |
|---|---|---|---|---|---|---|
| Create Release Blog this skillweb-infra-dev/rstest | 505 | — | ~4.7k | Automated safety check: Pass | MIT | |
| SepiaNanako0129/sepia | 3k | — | ~3.6k | Automated safety check: Pass | MIT | |
| Blogtheopenco/llmgateway | 1.7k | — | ~2.2k | Automated safety check: Pass | Custom licence | |
| Release Postquarto-dev/quarto-r | 160 | 1 repos | ~2.5k | Automated safety check: Pass | MIT | |
| Penguin Harness DevPrism-Shadow/penguin-harness | 2.5k | — | ~3.4k | Automated safety check: Pass | Apache-2.0 | |
| Feature Blogpockethost/pockethost | 1.4k | — | ~818 | Automated safety check: Pass | MIT |
Nanako0129/sepia
Make AI-generated writing read as human-written, in fiction and in professional prose.
theopenco/llmgateway
Write and validate an LLM Gateway marketing blog post in the repository's current house style, including structured frontmatter and a gpt-image-2 OpenGraph image.
quarto-dev/quarto-r
Create professional package release blog posts following Tidyverse or Shiny blog conventions.
Prism-Shadow/penguin-harness
A skill your agent uses when developing PenguinHarness itself — changing packages/{core,server,web,cli,desktop,landing,docs,skills}, the built-in model catalog, the installers or the release…
pockethost/pockethost
Ship user-facing PocketHost features with a blog post instead of semver release notes.
BrainDAO/adk-ts
ADK-TS brand voice, terminology, and writing conventions. An agent skill from BrainDAO/adk-ts.
web-infra-dev/rstest
Create or update draft GitHub release notes, or output organized Markdown when draft creation is unavailable.
web-infra-dev/rstest
Verify hand-written API doc signatures match the exported types.
web-infra-dev/rstest
Testing workflow for the Rstest monorepo. An agent skill from web-infra-dev/rstest.
web-infra-dev/rstest
TypeScript anti-slop guardrails. An agent skill from web-infra-dev/rstest.
web-infra-dev/rstest
Feature and bug-fix development checklist for the Rstest monorepo.
web-infra-dev/rstest
Create a pull request using repository branch rules, title conventions, templates, and concise English descriptions.
Categories
Generate a narrative version release blog post from commits within a tag range. Create Release Blog is an agent skill from web-infra-dev/rstest. Generate a narrative version release blog post from commits within a tag range.
Create Release Blog fits situations like: the user wants to draft an article-style release blog (overview + a few feature highlights + a short list of minor changes); not a commit-dump release note.
Run `npx skills add web-infra-dev/rstest --skill create-release-blog -a claude-code`. Or copy the skill folder (.agents/skills/create-release-blog in web-infra-dev/rstest) into .claude/skills/create-release-blog in your project. Claude Code loads it when a task matches its description.
Run `npx skills add web-infra-dev/rstest --skill create-release-blog -a codex`. Or copy the skill folder (.agents/skills/create-release-blog in web-infra-dev/rstest) into .agents/skills/create-release-blog 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 web-infra-dev/rstest --skill create-release-blog -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/create-release-blog, .gemini/skills/create-release-blog, .github/skills/create-release-blog and .opencode/skills/create-release-blog in your project.
Going by SKILL.md and its folder, Create Release Blog needs JavaScript for the scripts in its folder and the command-line tools its instructions call (gh, node, pnpm, git, curl and kind). Our summary lists: Node.js.
SKILL.md names 2 domains. In commands or code: github.com and assets.rspack.rs; 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. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.
Create Release Blog is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 4.7k tokens (SKILL.md is roughly 19k 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 Create Release Blog: Sepia (Nanako0129/sepia, 3k stars), Blog (theopenco/llmgateway, 1.7k stars), Release Post (quarto-dev/quarto-r, 160 stars) and Penguin Harness Dev (Prism-Shadow/penguin-harness, 2.5k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
web-infra-dev (a GitHub organization) maintains it in web-infra-dev/rstest, which has 505 GitHub stars. The repository holds 9 skills in this directory. The repository was last updated on October 8, 2026.
Source: web-infra-dev/rstest on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.