better-writing

jakubkrehel/skills · Agent Skill

改善使用者體驗的寫作,包括介面標籤、錯誤、空狀態、設定、通知和產品順序。

前往安裝 ↓

總覽

發布者jakubkrehel社群
儲存庫jakubkrehel/skills ↗
技能資料夾better-writing
星8,643
分支330
附帶檔案3
授權MIT
最近更新2026年10月25日
連結技能原始碼 ↗ · 儲存庫 ↗

Mozgi 檢查

我們在技能檔案中發現的內容。詳細資訊需訂閱。

安全性
中等風險 · 發現 1 個需要注意的地方
相容性
僅含說明 — 適用於多數代理
相似技能
找到 31 個相似技能
訂閱另含

安裝

技能就是一個含 SKILL.md 的資料夾。選擇你的代理,在專案根目錄的終端機(macOS、Linux 或 Windows 的 Git Bash)執行指令。

把提示貼到 Claude、Codex 或其他助理:它會自行檢查並安裝技能。

Install the “better-writing” skill from mozgi.io (https://mozgi.io/skills/jakubkrehel-better-writing/) for me.

1. Download the archive: https://mozgi.io/skills/jakubkrehel-better-writing/download
   If it fails, take the skill folder from the source: https://github.com/jakubkrehel/skills/tree/main/skills/better-writing
2. Read SKILL.md and the other files. Check the skill is safe: no hidden commands, no sending data elsewhere, no scripts doing something other than described. If anything looks suspicious, stop and tell me.
3. Put the “better-writing” folder into your agent's skills folder: .claude/skills/ for Claude Code, .agents/skills/ for Codex, .cursor/skills/ for Cursor, .gemini/skills/ for Gemini CLI. Inside the project if we are in one, otherwise in the home folder (~/.claude/skills/ etc.).
4. Make sure <skills folder>/better-writing/SKILL.md exists.
5. Briefly tell me what this skill does and offer to try it on my task.

If you cannot do a step yourself, tell me what to click or type.

技能檔案

3 個檔案 下載 ZIP

安裝前請先檢視 SKILL.md 與相關檔案。點擊檔案即可預覽。

SKILL.md 內容

作者原文 · 唯讀

Writing

This skill writes and reviews interface copy such as labels, errors, empty states and confirmations, along with the terms that run through them. It matches the product's existing voice and flags copy that misleads people or leaves them without a way forward.

A deliberate brand voice is not a defect. Raise a departure from plain language only when it creates inconsistency, ambiguity, translation risk or a tone the stakes don't support. Rewording that merely suits your taste is not a finding.

How copy renders, including text-transform, truncation and smart punctuation, belongs to better-typography. Error markup, announcements and the attributes that carry accessible names belong to better-accessibility. Room for translated strings belongs to better-layout.

Inventory the existing strings first

Before writing or reviewing, find where the copy lives and read the copy around the change:

1. Search for the translation call (t(, i18n., <FormattedMessage, $t() and the locale files it reads, such as locales/**/*.json, messages/*.json, *.po and *.strings. Copy may also come from a CMS or the API.

2. List the noun used for each object and the verb used for each action, as in "project" or "workspace" and "Delete" or "Remove".

3. Note the case used per element type and any voice or content style guide.

New copy uses the terms on that list. A synonym is a finding only where the same thing is named two ways.

One voice, one vocabulary

The product has one voice and its existing copy establishes it. A local edit does not get to invent a new one. If it's "Archive" in the menu, it isn't "Move to storage" in the toast.

A multi-step flow uses one vocabulary throughout: "Get started" to enter, either "Continue" or "Next" to advance, "Done" to finish. Tone flexes with the stakes:

| Context | Tone |

| --- | --- |

| Success, onboarding, empty states | Warm, can be light |

| Routine actions, settings | Neutral, minimal |

| Errors, destructive confirmations | Calm, plain, zero playfulness |

| Data loss, security | Serious, explicit |

Address the reader directly

In instructional copy, write "you", not "the user". In errors, "we" reads as deflection, so prefer "Unable to load content. Check your connection and try again." An established first-person voice can stay in low-stakes copy where it still reads clearly.

Use possessives sparingly: "Favorites" beats "Your favorites". Never mix perspectives in one flow, such as "My account" beside "Your settings".

Plain words over clever ones

Choose words a tired reader gets on the first pass, and delete every word that does no work. No idioms, no colloquialisms and no humor that won't translate.

Skip unnecessary gender: "Subscribers can post recipes", not "each subscriber can post his or her recipes". Match the input device: "tap" on touch, "click" with a pointer, "select" when both are possible.

Build strings whole

Never assemble a sentence from fragments around a variable ("You have " + n + " new messages"), because word order changes per language. Write one message with placeholders, and use the locale's plural rules rather than n === 1 ? "" : "s". Many languages have more than two plural forms. Format numbers, dates and lists through Intl. Recipes are in patterns.md ↗.

Verb-first buttons

A button label starts with a verb naming the action: "Send", "Save draft", "Delete project". Never "OK!" or "Let's go!".

An icon-only button's accessible name follows the same rule. It names the action, "Delete project", never the glyph, "Trash icon". The attribute that carries it is better-accessibility's.

Links describe their destination

Link text makes sense out of context, because screen-reader users navigate by a list of the page's links. Write "Read the billing docs", never "Click here".

A bare "Learn more" breaks down as soon as two appear on one page. Suffix each one: "Learn more about exports".

One capitalization policy

Pick title case or sentence case per element type, then apply it to every instance of that type. Sentence case is the default where the project has no policy. "Save Changes" beside "Discard changes" reads as sloppiness.

Settings describe the ON state

Label a toggle for what happens when it is on. "Send read receipts" lets users infer the off state; "Don't send read receipts" turns the toggle into a double negative.

Link straight to a referenced setting rather than describing the path to it: a "Notification settings" link, not "Go to Settings > Notifications > Email".

Errors say how to fix, next to where it broke

An error is an instruction, and it belongs beside the field that failed:

| Bad | Good |

| --- | --- |

| That password is too short | Choose a password with at least 8 characters |

| Invalid date | Enter a date as DD/MM/YYYY |

| Oops! Something went wrong. | Unable to save. Check your connection and try again. |

No blame, no "oops" and no exclamation marks. Phrase hints positively, as in "Use at least 8 characters" rather than "Don't use fewer than 8". Show a known requirement as helper text before input, not only in the error. When the same error keeps firing, redesign the interaction so it cannot happen.

Undo beats confirmation

Prefer undo when the action can be reversed and people perform it often, such as archiving, moving or deleting into a trash. Act at once and offer undo in the result: "Project archived. Undo".

Confirm before acting when the action cannot be reversed, affects other people or destroys many items at once. The confirmation repeats the consequence, so the dialog is answerable without reading the body:

  • The title names the action and the object, "Delete 'Q3 report'?", never "Are you sure?".
  • The body says what is lost and what cannot be recovered, with counts where they apply.
  • The buttons are verb plus object, Delete project and Cancel, never Yes and No.
  • For an account, a workspace or a repository, ask the person to type the object's name.

Templates are in patterns.md ↗. The destructive button's distinct color is better-colors'.

Empty states point forward

An empty state says what this place is and how to fill it, and offers one clear next action:

<!-- Bad: a shrug -->
<p>No results.</p>

<!-- Good: orientation plus a next step -->
<p class="font-medium">No projects yet</p>
<p class="text-sm text-zinc-500">Projects keep your tasks and files together.</p>
<button class="mt-4">Create a project</button>

A filtered empty state names the query and offers an exit: "No results for 'quarterly'. Clear filters". Never park persistent information in an empty state. It disappears the moment content exists.

Loading, saving and success copy is in patterns.md ↗.

Placeholders show an example

A placeholder shows a realistic example in the format the field accepts, [email protected] or DD/MM/YYYY, never an instruction. Whether the field also needs a visible label is better-accessibility's.

Before you finish

| Detection pattern | Fix |

| --- | --- |

| Click here, a link reading here or two identical Learn more links | Name the destination |

| Oops, Something went wrong or ! in an error string | Say what failed and the next step |

| " + n + ", a template literal holding a sentence fragment, or === 1 ? "" : "s" | One ICU message with a plural argument |

| >OK<, >Yes< or >No< on a dialog button | Verb plus object |

| Are you sure | Name the action and the object |

| successfully | Cut it: "Changes saved" |

| Please in a routine instruction | Cut it |

| A toggle label starting Don't, Disable or Hide | Describe the ON state |

| aria-label="Trash", "Close icon" or "X" | Name the action: "Delete project", "Close dialog" |

| toLocaleDateString() with no locale, or a date built from getMonth() | Intl.DateTimeFormat with the user's locale |

| Save Changes beside Discard changes | One case per element type |

Reporting

Severity. HIGH misleads the user or hides how to recover from an error. An error that names no way to recover is always HIGH, as is a destructive action with neither confirmation nor undo. MEDIUM breaks voice, terminology or capitalization consistency. LOW is isolated wording polish.

Verification. Check every label against the action it invokes, every error for a stated fix and every term against the inventory. Read locale files as well as components. Report strings supplied by the server or a CMS that you could not see as Not verified.

Format. Group findings under the principle each violates, ordered by severity, one row per root cause listing every location it appears in:

| Severity | Location | Before | After | Why |

| --- | --- | --- | --- | --- |

Location is path/to/file:line. Why names the principle and the user impact.

End with Block when any HIGH remains, Approve otherwise, leaving the rest in the table as work to do. Never Approve coverage you did not inspect. With nothing to report, state "No actionable writing findings" and report verification.

常見問題

better-writing 技能有什麼用途?

改善使用者體驗的寫作,包括介面標籤、錯誤、空狀態、設定、通知和產品順序。

如何安裝 better-writing?

打開本頁的「安裝」區塊並選擇你的代理 — Claude Code、Codex、Cursor 或 Gemini CLI:那裡有把技能資料夾複製到正確位置的現成指令。也可以複製「透過助理」分頁中的提示,讓助理自行檢查並安裝技能。

better-writing 適用哪些 AI 模型?

技能是純 Markdown 指示(Agent Skills 格式),因此 better-writing 適用任何讀取 SKILL.md 的代理:Claude Code、Codex、Cursor、Gemini CLI、GitHub Copilot、OpenCode 等。只有在任務符合技能描述時,模型才會載入指示。

better-writing 是免費的嗎?

此技能由 jakubkrehel 公開發布,採用 MIT 授權。技能本身免費 — 你只需向 AI 供應商支付實際使用的 token 費用。

安裝技能安全嗎?

技能是代理會遵循的指示,安裝前請閱讀 SKILL.md 及相關檔案。技能資料夾中的腳本只有在代理執行時才會運行 — 留意它的動作,不要授予多餘權限。

技能和 MCP 伺服器或外掛有何不同?

MCP 伺服器或外掛為模型提供新工具 — 會執行並回傳結果的程式碼。技能提供的是知識與流程:如何處理任務、要遵循哪些步驟、好的成果長什麼樣子。它不需要伺服器或 API 金鑰。

相關技能

所有技能 →
better-accessibility 檢查和改善焦點狀態、鍵盤支援、ARIA、表單、螢幕閱讀器、觸擊區域和動作的無障礙功能。 jakubkrehel8.6k better-colors OKLCH 色彩空間適用於網頁專案,能夠將 hex/rgb/hsl 轉換為 oklch,生成色板,檢查對比度,處理色域邊界,並使用 Tailwind v4 建立主題,支援 oklch、顏色轉換、色板生成、對比度比率、色域、display p3、設計令牌、色調漂移、色度、暗黑模式顏色等功能。 jakubkrehel8.6k better-interface 進行介面可及性、佈局、書寫、字型、色彩和視覺呈現的全面評估。 jakubkrehel8.6k better-typography 網頁字型學從選擇字型到間距、換行和無障礙設計。使用於選擇或組合字型風格、設定可變字型或OpenType功能、建立字型尺度、在元件中樣式化文字、裁剪文字、樣式化下劃線、突出顯示、佔位符或遊標,或檢查前端程式碼的字型學。適用於字型學、字型、字型格式、woff2、可變字型、font-weight、opentype、font-feature-settings、letter-spacing、line-height、字型尺度、表格數字、text-wrap、裁剪、line clamp、下劃線、text-decoration、文字突出顯示、iOS 輸入縮放、字型平滑、文字對比、大小、行長、文字欄、智慧標點符號、drop cap。 jakubkrehel8.6k oklch-skill 實用工作流程色彩OKLCH技術,打造一致、易用且可客製化的色彩系統於現代使用者介面。 jakubkrehel frontend-ui-engineering 前端UI工程指南,涵蓋元件架構、響應式設計、無障礙和可維護的實現範本。 addyosmani111k