Make a reply easier to read and act on with rich blocks inside ordinary Markdown — a choice the user picks from, a form that collects several answers, a procedure as steps with warnings in place, a…

Apache-2.0Auto-check passedDevelopment

Install A2ui

skills CLI
$ npx skills add Prism-Shadow/penguin-harness --skill a2ui -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install Prism-Shadow/penguin-harness a2ui --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/Prism-Shadow/penguin-harness.git skills-src && mkdir -p .claude/skills && cp -r skills-src/plugins/a2ui/skills/a2ui .claude/skills/a2ui && rm -rf skills-src

Use ~/.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/

Facts

Skill name
a2ui
GitHub stars
2.5k
Token cost
~3k tokens
SKILL.md length
1,612 words
Files
3 (incl. scripts, references)
Skills in repo
31
Repo updated
First seen
Licence
Apache-2.0

At a glance

Make a reply easier to read and act on with rich blocks inside ordinary Markdown — a choice the user picks from, a form that collects several answers, a procedure as steps with warnings in place, a…

  • Works in 9 steps: One instruction per sentence, in the… → Active voice. Say who does what: "The… → Short sentences. English: at most 20… → …
  • A reply asks the user to decide
  • SKILL.md covers Before you start, When to use a block, and when…, The catalog in brief and Interaction, plus 4 more sections
  • Runs JavaScript scripts from its folder; calls node

What it does

A2ui is an agent skill from Prism-Shadow/penguin-harness. Make a reply easier to read and act on with rich blocks inside ordinary Markdown — a choice the user picks from, a form that collects several answers, a procedure as steps with warnings in place, a callout, or a Mermaid diagram — written as fenced blocks the app renders with its own components; a pick comes back as the user's plain text. Use when a reply asks the user to decide, collects several inputs, gives a procedure, or explains a structure or flow. Includes STE-style writing rules for Chinese and English…

Its SKILL.md is about 3k tokens, which your agent loads only when the skill is triggered. The skill folder holds 4 other files, including scripts and reference files (for example `references/components.md`).

It sits in Development, covering Brand voice and tone. It works with Mermaid. The repository describes itself as: 🐧 Unified and Stable RSI Platform. The licence is Apache-2.0.

When your agent uses it

  • A reply asks the user to decide
  • Collects several inputs
  • Gives a procedure
  • Explains a structure

Example prompts

  • “/a2ui”

Requirements

  • Node.js

Workflow steps

9 steps, taken from the first numbered list in SKILL.md.

  1. One instruction per sentence, in the imperative: "Stop the service." / 「停止服务。」 Not "The service should be stopped first and then…".
  2. Active voice. Say who does what: "The loader reads plugin.json" rather than "plugin.json is read by the loader". The checker flags be-verb…
  3. Short sentences. English: at most 20 words in a procedure, 25 in explanation. Chinese: at most 40 characters in a procedure, 60 in…
  4. Short paragraphs. At most 5 sentences; a list when the items are a list; never a wall of text.
  5. One term per concept. Pick "session" or "conversation", not both; "目录" or "文件夹", not both.
  6. No vague words. Not "etc.", "and so on", "various", "appropriate", "stuff", "things"; not 「等等」「之类」「相关的」「进行」「某种程度上」. Name the items or the…
  7. Numbers as digits. "3 files", 「3 个文件」.
  8. Warnings before the step they protect, in the step's warning/caution, never after the harm.
  9. Lists at most two levels deep. Deeper nesting is a sign the text wants headings or a steps block.

What it can do on your machine

Read from SKILL.md and the folder at commit d56d9ce. It shows what the files ask for, not the result of running them.

  • Tool permissions

    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.

  • Runs code

    Ships 1 file in scripts/ (JavaScript), which the agent can run.

    Shell commands in SKILL.md call:

    • node

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

A2ui loads about 3k tokens when it runs, and up to ~6k if it reads all its reference files. Until then it costs about 144 tokens; SKILL.md has 1,612 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~144
When it runs · the whole SKILL.md, loaded when a task matches
~3k
With references · SKILL.md plus every file in references/, read only if the agent opens them
~6k

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.

Safety

Auto-check passed

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.

SKILL.md

The full file from Prism-Shadow/penguin-harness at commit d56d9ce, republished under its Apache-2.0 licence (© Prism-Shadow). 1,612 words, ~2,952 tokens.

Download SKILL.mdSave it as .claude/skills/a2ui/SKILL.md (or your agent's skills folder). This skill also uses 2 other files; get the full folder from GitHub.
name
a2ui
description
Make a reply easier to read and act on with rich blocks inside ordinary Markdown — a choice the user picks from, a form that collects several answers, a procedure as steps with warnings in place, a callout, or a Mermaid diagram — written as fenced blocks the app renders with its own components; a pick comes back as the user's plain text. Use when a reply asks the user to decide, collects several inputs, gives a procedure, or explains a structure or flow. Includes STE-style writing rules for Chinese and English and a checker script to run on the draft before sending.

A2UI blocks

A reply is Markdown. Where a decision, a set of inputs, a procedure or a structure would read better as a component than as prose, write one as a fenced block: ```a2ui holding ONE JSON object, or ```mermaid holding a diagram. The Web App renders the block with its own components and theme; the CLI and the messaging channels show the same block as readable text; nothing is lost on a surface that cannot render it. You never write HTML, scripts or styles — you name a component from the catalog and fill its fields.

Before you send a reply that carries a block, run the checker (see "Check before you send"). It is the test suite for this skill: it rejects what would not render, warns about what would be hard to read, scores the draft and prints the questions a reviewer would ask.

Before you start

This skill changes how you write replies; it needs no setup. If a message only names the skill without a task — "use a2ui", "show me the blocks" — ask what the user wants to decide, enter or understand, then answer that with the fitting block. Do not demonstrate every component at once: one block that serves the question is the demonstration.

When to use a block, and when not

Use a block when it saves the reader work:

  • choice — the conversation needs ONE decision from the user and you can name the realistic options (2–7, ideally 2–5). Mark one recommended when you have a view.
  • form — you need SEVERAL answers at once (1–6 fields) and asking them one by one would take turns.
  • steps — the user will perform a procedure by hand. One instruction per step; a warning or caution sits on the step it applies to and is rendered above it.
  • callout — one thing the reader must not miss: a warning, a caution, a tip, a note. Not for ordinary paragraphs.
  • mermaid — a structure or a flow with more than three parts: a pipeline, a state machine, a sequence of calls, a data model.

Do not use a block for:

  • a plain answer, a one-line fact, a yes/no;
  • a conversational or emotional turn ("thanks", "sorry about that", "how was it?");
  • a decision you can take yourself from the context — take it and say so;
  • padding: a callout around an ordinary sentence, a diagram with two boxes, a form with one field (use a question).

Keep to one or two blocks per reply and at most two questions (choice/form). More than that is a questionnaire, not a conversation.

The catalog in brief

The full reference, every field and its limits, a valid example of each type and the common mistakes: references/components.md beside this file. Read it the first time you write a block, and whenever the checker rejects one.

TypeRequiredOptionalLimits
choicequestion, options[] (label)id, options[].value / description / recommended, multiple, allowOtherquestion ≤ 120, label ≤ 60 (warn > 40), 2–7 options (warn > 5), labels unique, at most one recommended
formfields[] (id, label, kind)id, title, submitLabel, per field options (single/multiple only), placeholder, min/max/step/unit (number only), required1–6 fields (warn > 4), field ids unique ^[a-z][a-z0-9_]{0,31}$
stepssteps[] (text)title, per step warning, caution, note, code, lang1–15 steps (warn > 10), text ≤ 200, code ≤ 2000
callouttone (note/tip/caution/warning), texttitletext ≤ 400
mermaida supported header on the first line—no %%{init}%%, no frontmatter config, no click/href/javascript:; warn above 30 nodes or edges

The fence is ```a2ui (or ```a2ui json); one JSON object per fence; strict JSON (double quotes, no comments, no trailing commas). An unknown type or a missing required field is an error; an unknown field is ignored with a warning.

Interaction

  • A choice or a form ends the reply. Nothing follows it — no closing sentence, no second question. Write what the reader needs to decide BEFORE the block; the block is the question.
  • Every block is introduced by a sentence right before it ("Which store do you want?", "The request passes through three stages."). A block that arrives unexplained is a warning.
  • The pick comes back as the user's next message in plain text: for a choice, the option's value (default: its label), several picks joined with 、 or ", "; for a form, one line per field, label: answer. The user can edit that text before sending, or ignore the block and type anything. Read it as you would read any user message; never expect a marker.
  • allowOther: true adds an "Other…" control that just focuses the composer. Use it when your options may not cover the answer.
  • Blocks in older turns are read-only; only the latest reply is interactive. Do not refer to "the buttons above" in a later turn.

Writing rules — 80% of ASD-STE100

Apply these to the prose of every reply, zh and en. They are what makes model output readable; the checker enforces the measurable ones as warnings.

  1. One instruction per sentence, in the imperative: "Stop the service." / 「停止服务。」 Not "The service should be stopped first and then…".
  2. Active voice. Say who does what: "The loader reads plugin.json" rather than "plugin.json is read by the loader". The checker flags be-verb + past participle in English.
  3. Short sentences. English: at most 20 words in a procedure, 25 in explanation. Chinese: at most 40 characters in a procedure, 60 in explanation. One idea per sentence; split at the commas.
  4. Short paragraphs. At most 5 sentences; a list when the items are a list; never a wall of text.
  5. One term per concept. Pick "session" or "conversation", not both; "目录" or "文件夹", not both.
  6. No vague words. Not "etc.", "and so on", "various", "appropriate", "stuff", "things"; not 「等等」「之类」「相关的」「进行」「某种程度上」. Name the items or the exact action: 「安装」, not 「进行安装」.
  7. Numbers as digits. "3 files", 「3 个文件」.
  8. Warnings before the step they protect, in the step's warning/caution, never after the harm.
  9. Lists at most two levels deep. Deeper nesting is a sign the text wants headings or a steps block.
Show full SKILL.md (635 more words)Show less

Check before you send

For any reply that carries an a2ui or mermaid block (not for plain prose), run the checker on the whole draft and fix what it finds. The paper this follows found that deterministic validation plus up to three rounds of error-feedback repair is what makes generated UI reliable; this is that loop.

The checker is scripts/check.mjs in this skill's directory — the directory you read this SKILL.md from, <app_data_dir>/agents/<agent_id>/agent_state/skills/a2ui/. It is self-contained and runs with the Node already on the machine.

  1. Write the complete draft reply to a temporary file outside the Workspace, for example /tmp/a2ui-draft.md (%TEMP%\a2ui-draft.md on Windows). Alternatively feed it on stdin with a quoted heredoc so no file is written.

  2. Run it:

    sh
    node <skill dir>/scripts/check.mjs /tmp/a2ui-draft.md --rubric
    # or, with no file:
    node <skill dir>/scripts/check.mjs --rubric <<'EOF'
    ...the draft...
    EOF

    Options: --lang zh|en|auto (prose rules; auto picks zh when Chinese dominates), --json for the machine-readable report. Exit code 0 means no errors, 1 means at least one error, 2 means the checker could not run.

  3. Read the report. Errors are blocks that would not render or would mislead (invalid JSON, unknown type, missing field, duplicate label, two recommended options, an unbalanced mermaid line, a forbidden directive): fix every one. Warnings are reading cost (too many options, a question that is not last, an ungrounded block, a long sentence, passive voice, a vague word): fix the ones that change how the reader experiences the reply. Then answer the rubric questions honestly — they catch what no rule can.

  4. Re-run. At most three rounds. Send when the report shows 0 errors and a total of 70 or more (L1 is 100 or 0; L2 loses 15 per block warning; prose loses 5 per prose warning; total = 0 on any error, else the mean of L2 and prose).

  5. If a block still has errors after the third round, do not send it: replace it with prose that says the same thing (a numbered list for a choice, a question list for a form). Never send a block the checker rejects.

The check is yours, not the user's: do not paste the report or mention the checker in the reply. Send the checked text exactly as checked, fences included.

Self-review rubric

The checker prints these with --rubric; they are the L2/L3 judgement no rule can make.

  1. Would plain text have served the reader as well? If yes, remove the block.
  2. Does a sentence before each block say what it is for?
  3. Is each component the right one: choice for one decision, form for several answers, steps for a procedure, callout for one warning or tip, mermaid for a structure or a flow?
  4. Do the options cover the realistic answers, with one recommended when you have a view, and is the question the last thing in the reply?
  5. Is the reply what a person would naturally say: short sentences, one instruction each, no filler?
  6. Can the reader take everything in at a glance: at most 5 options, 4 fields, 10 steps, one or two blocks?
  7. Did you keep UI out of a plain fact, a conversational turn or an emotional moment?

Worked examples

A decision, English. The sentence before the block grounds it; the block is the last thing in the reply:

markdown
I found two ways to store the sessions. Both work with the current schema; they differ in what you run.

Which store do you want?

```a2ui
{
  "type": "choice",
  "question": "Which store should the sessions use?",
  "options": [
    { "label": "SQLite", "description": "One file, no server; fine below 10 GB.", "recommended": true },
    { "label": "PostgreSQL", "description": "A server to run; needed when several machines share the data." }
  ],
  "allowOther": true
}
```

The user clicks SQLite; your next message from them reads SQLite. If they type "SQLite, but keep a nightly dump", read that.

A procedure, Chinese. The warning sits on the step it protects:

markdown
下面是把数据目录迁到新磁盘的步骤。

```a2ui
{
  "type": "steps",
  "title": "迁移数据目录",
  "steps": [
    { "text": "停止服务。", "code": "penguin stop", "lang": "sh" },
    {
      "warning": "复制完成并核对大小之前,不要删除旧目录。",
      "text": "把旧目录完整复制到新磁盘。",
      "code": "cp -a ~/.penguin/data /mnt/disk2/penguin-data",
      "lang": "sh"
    },
    { "text": "在配置里把数据目录指向新路径,然后启动服务。", "note": "首次启动会重建索引,需要约 1 分钟。" }
  ]
}
```

A flow, English. Three or more parts with arrows between them is a diagram; two would be a sentence:

markdown
The request passes through three stages before the model sees it.

```mermaid
flowchart LR
  A[User message] --> B[Context engine]
  B --> C[Model request]
  C --> D{Tool call?}
  D -- yes --> E[Run tool] --> B
  D -- no --> F[Reply]
```

No block. The user asked what port the dev server uses: answer "The dev server listens on 7369." A callout, a choice or a diagram here would be noise.

© Prism-Shadow, 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

Files

SKILL.md and 2 other files (scripts, references) in plugins/a2ui/skills/a2ui of Prism-Shadow/penguin-harness.

  • SKILL.md
  • references/components.md
  • scripts/check.mjs

Open the folder on GitHubat commit d56d9ce

Compare with similar skills

A2ui 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.

A2ui compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
A2ui this skillPrism-Shadow/penguin-harness2.5k—~3kAutomated safety check: PassApache-2.0
Agent Stylepchalasani/claude-code-tools2k—~1.4kAutomated safety check: PassMIT
Smallest-Visual DiagramsYeachan-Heo/oh-my-claudecode40k—~885Automated safety check: PassMIT
Writing Guidelinesrohitg00/pro-workflow2.9k—~593Automated safety check: PassNone
Writing Styleumputun/cc-thingz484—~1.3kAutomated safety check: PassMIT
Writing Stylemarin-community/marin3.9k—~549Automated safety check: PassApache-2.0

Similar skills

  • Agent Style

    pchalasani/claude-code-tools

    Literature-backed English technical-prose writing rules (agent-style, 21 rules).

    2k GitHub stars~1.4k tokensUpdated 3 days ago
    DevelopmentAuto-check passed
  • Smallest-Visual Diagrams

    Yeachan-Heo/oh-my-claudecode

    Picks the smallest visual that carries structure when prose alone would not: pseudocode, call tree, component or file tree, Mermaid or diff, and skips it when prose is enough.

    40k GitHub stars~885 tokensUpdated today
    DevelopmentAuto-check passed
  • Writing Guidelines

    rohitg00/pro-workflow

    Apply clear-writing standards to any prose the agent produces - READMEs, docs, UI copy, error messages, commit and PR text, release notes.

    2.9k GitHub stars~593 tokensUpdated 9 days ago
    DevelopmentAuto-check passed
  • Writing Style

    umputun/cc-thingz

    A skill your agent uses for technical communication - GitHub/GitLab tickets, PR/MR descriptions, issue comments, code review comments, commit messages.

    484 GitHub stars~1.3k tokensUpdated 3 days ago
    DevelopmentAuto-check passed
  • Writing Style

    marin-community/marin

    Apply Marin house style when producing or revising commit, pull-request, issue, comment, documentation, report, or blog prose.

    3.9k GitHub stars~549 tokensUpdated today
    DevelopmentAuto-check passed
  • GitHub Voice

    tobihagemann/turbo

    Shared writing style rules for GitHub-facing output (PR comments, PR descriptions, PR titles, issues, design proposals).

    407 GitHub stars~1.2k tokensUpdated yesterday
    DevelopmentAuto-check passed

More from Prism-Shadow/penguin-harness

All 31 skills in this repo
  • Penguin Harness Dev

    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…

    2.5k GitHub stars~3.4k tokensUpdated yesterday
    Auto-check passed
  • Bento Slides

    Prism-Shadow/penguin-harness

    Create and edit Bento presentations — self-contained .bento.html decks whose document is JSON.

    2.5k GitHub stars~1.6k tokensUpdated yesterday
    Auto-check passed
  • Penguin Harness Manual Test

    Prism-Shadow/penguin-harness

    A skill your agent uses when standing PenguinHarness up to try a change by hand — launching the Web App, the desktop shell, the landing page, the docs site or the component gallery to click through…

    2.5k GitHub stars~1.3k tokensUpdated yesterday
    Auto-check passed
  • Penguin Harness Frontend

    Prism-Shadow/penguin-harness

    A skill your agent uses when changing the PenguinHarness Web App (packages/web) or the shared UI package — adding or restyling any UI, picking a status colour, adding an icon, laying out a row or a…

    2.5k GitHub stars~6.4k tokensUpdated yesterday
    Auto-check passed
  • Browser Automation

    Prism-Shadow/penguin-harness

    Drive the PenguinHarness agent browser — the desktop app's built-in browser or the user's own Chrome — from the shell with penguin browser: open pages, read them as simplified HTML or text, act with…

    2.5k GitHub stars~2.9k tokensUpdated yesterday
    Auto-check: warnings
  • Penguin SDK

    Prism-Shadow/penguin-harness

    A skill your agent uses whenever the user wants to build an agent application — their own program with an embedded agent, such as an AI app, an agentic app or a RAG app.

    2.5k GitHub stars~11k tokensUpdated yesterday
    Auto-check passed

Works with

Questions about A2ui

What does A2ui do?

Make a reply easier to read and act on with rich blocks inside ordinary Markdown — a choice the user picks from, a form that collects several answers, a procedure as steps with warnings in place, a…. A2ui is an agent skill from Prism-Shadow/penguin-harness. Make a reply easier to read and act on with rich blocks inside ordinary Markdown — a choice the user picks from, a form that collects several answers, a procedure as steps with warnings in place, a callout, or a Mermaid diagram — written as fenced blocks the app renders with its own components; a pick comes back as the user's plain text.

When should I use A2ui?

A2ui fits situations like: A reply asks the user to decide; collects several inputs; gives a procedure; explains a structure.

How do I install A2ui in Claude Code?

Run `npx skills add Prism-Shadow/penguin-harness --skill a2ui -a claude-code`. Or copy the skill folder (plugins/a2ui/skills/a2ui in Prism-Shadow/penguin-harness) into .claude/skills/a2ui in your project. Claude Code loads it when a task matches its description.

How do I install A2ui in Codex?

Run `npx skills add Prism-Shadow/penguin-harness --skill a2ui -a codex`. Or copy the skill folder (plugins/a2ui/skills/a2ui in Prism-Shadow/penguin-harness) into .agents/skills/a2ui in your project. Codex loads it when a task matches its description.

Can I use A2ui in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add Prism-Shadow/penguin-harness --skill a2ui -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/a2ui, .gemini/skills/a2ui, .github/skills/a2ui and .opencode/skills/a2ui in your project.

What does A2ui need to run?

Going by SKILL.md and its folder, A2ui needs JavaScript for the scripts in its folder and the command-line tools its instructions call (node). Our summary lists: Node.js.

Does A2ui access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is A2ui safe to install?

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.

What licence does A2ui use?

A2ui 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.

How many tokens does A2ui use?

About 3k tokens (SKILL.md is roughly 12k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 3.1k tokens, read only when the agent opens those files.

What are the alternatives to A2ui?

Skills that share tags, products or a category with A2ui: Agent Style (pchalasani/claude-code-tools, 2k stars), Smallest-Visual Diagrams (Yeachan-Heo/oh-my-claudecode, 40k stars), Writing Guidelines (rohitg00/pro-workflow, 2.9k stars) and Writing Style (umputun/cc-thingz, 484 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains A2ui?

Prism-Shadow (a GitHub organization) maintains it in Prism-Shadow/penguin-harness, which has 2,455 GitHub stars. The repository holds 31 skills in this directory. The repository was last updated on October 7, 2026.

Source: Prism-Shadow/penguin-harness on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.