Claude Skill

readme-creator

Creates or rewrites a README for the project consumer, using verified install commands, a runnable quickstart, and house presentation conventions. Use when asked to "write a README", "rewrite our README", or replace scaffold boilerplate. For an in-place prose audit use docs-writi

LLM Mart · 0 points · 0 views 0 listing impressions 0 install-command copies
Virus-scanned Reviewed automatically before listing.

Full trust report

Download mblode-agent-skills-skills_readme-creator-24f4fd8.zip · 15 KB
Part of mblode/agent-skills — 22 skills

Install

skills CLI npx skills add https://github.com/mblode/agent-skills/tree/main/skills/readme-creator
Claude Code claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install mblode-agent-skills@llmmart
Git git clone https://github.com/mblode/agent-skills.git

The skills CLI installs just this skill, for any of its supported agents. Claude Code installs the whole mblode/agent-skills collection as a plugin from our marketplace. Git is the plain clone.

Skill manifest

README Creator

Write a README that reads as a shop window, not a wiki.

  • IS: writing or rewriting README.md for the person deciding whether to use the project, with the project type driving which capability sections earn a place and where the file will render (GitHub only, or also a registry page) driving image and badge choices.
  • IS NOT: polishing the prose of a README that already covers the project, or a multi-page docs site (use docs-writing); AGENTS.md or CLAUDE.md agent-instruction files (use agents-md); fixing the install or first-run experience the README describes (use dx-audit); marketing copy for a landing page (use copywriting).

The reader

Someone arrived from a search result, a registry listing, or a profile page. They have about fifteen seconds and one question: is this worth my time? Every line either answers that or gets cut.

They are not a contributor. Nothing about the build pipeline, the workspace layout, the release process, or the coding standards helps them decide, so none of it belongs here.

This deliberately departs from standard-readme and Make a README, which require ## Contributing, add a table of contents past 100 lines, and hold that too long beats too short. Do not drift back to those defaults: contributor content moves to CONTRIBUTING.md or AGENTS.md, and length follows what the reader needs.

Reference Files

File Read when
references/section-templates.md Phase 3: markup for each spine section, the capability-section menu, and per-type notes
references/badges-and-shields.md Phase 4: only once Phase 1 has found a registry listing (npm, crates.io, PyPI, VS Code Marketplace, skills.sh)
references/quality-checklist.md Phase 5: score before declaring done

Voice

Check for a profile from the external ghostwriter skill before drafting: ${GHOSTWRITER_HOME:-~/.config/ghostwriter}/readme.md. When one exists it owns the register, the spelling convention, and any house-style markup (header block, badge colours, footer credit), and it wins every conflict with this skill. Follow it; do not restate it here.

With no profile, default to terse second-person imperative, no emoji, no exclamation marks, and concrete numbers over adjectives.

Workflow

Copy this checklist to track progress:

README progress:
- [ ] Phase 1: Detect project type and where the README renders
- [ ] Phase 2: Fix the spine, then choose capability sections
- [ ] Phase 3: Write each section from the template
- [ ] Phase 4: Add badges (registry-listed projects only)
- [ ] Phase 5: Score against the checklist; report the pass count and render-check output

Phase 1: Detect project type and render targets

Read the manifest (package.json, Cargo.toml, pyproject.toml, go.mod) for name, description, license, scripts, bin, "private", and repository. Read the existing README if rewriting. Scan the top-level layout.

Classify into exactly one type. First matching row wins, top to bottom:

Type Decisive signal
Skill bundle skills/ dir of SKILL.md files
Monorepo workspace config (turbo.json, pnpm-workspace.yaml, workspaces)
CLI tool bin field, src/cli.*, or commander/yargs/clap dep
Framework plugin/middleware architecture, config API, documented extension points
Library / package main/exports set, no bin, src/index.* entry
Web app framework config (next.config.*, vite.config.*); no publish

A monorepo is not a project type for README purposes. It is a delivery mechanism. Ask what a stranger installs or visits, then write the README for that: a repo whose apps/cli publishes to npm gets a CLI README at the root, not a workspaces table. The workspace layout goes in AGENTS.md.

If two types still fit (a CLI that also exports an API, a framework published as a library), pick how most users consume it and fold the secondary role into one extra section.

Then record where the file renders. A "private": true manifest or no registry listing means GitHub only. A published package also renders on npmjs.com, PyPI, or crates.io, which changes image URLs and earns badges (Phase 4 and the Gotchas).

Ask the user only what code cannot reveal:

  • What problem does this solve (the "why" behind the tagline)?
  • Any section to force in or leave out?

If unreachable, infer the "why" from the manifest and code, note the assumption in your summary, and proceed rather than block.

Phase 2: Fix the spine, then choose capability sections

Use this house spine where applicable. A hosted app can lead with its live URL instead of an install command; do not invent installation for a product consumed in the browser:

  1. Header block (title, tagline, plain second line, badges if registry-listed)
  2. ## Demo (only when a live URL exists)
  3. ## Install
  4. ## Quickstart
  5. ## License

Between Quickstart and License go the capability sections: two to four, chosen from the menu in references/section-templates.md. Four is a ceiling because a fifth section is almost always contributor content wearing a reader-facing heading; when a fifth genuinely serves the reader, say why in your summary rather than silently adding it.

Canonical heading names keep a set of repos consistent: Install, Quickstart, Demo, License. Not Installation, Getting Started, Quick start, Quick Start, Licence. Sentence case throughout, so ## Browser support and not ## Browser Support.

The audience gate. Before writing any section, ask whether it helps someone deciding to use the project or only someone changing it. Contributor content goes to CONTRIBUTING.md or AGENTS.md (the destination table is in references/section-templates.md), and the README keeps at most a one-line pointer. When no destination file exists, create it: deleting load-bearing setup notes is a worse outcome than a slightly long README.

Phase 3: Write sections

Copy each section's skeleton from references/section-templates.md, fill it, then apply the per-type notes at the end of that file. These rules hold across every type:

  • Title is the display name with spaces and capitals ("React Vello", not react-vello), linked to the live site when one exists.
  • Tagline sits directly below with no heading, roughly 8 to 16 words, and says what the project does rather than what it is. Starting with the project's own name wastes the reader's first three words on something they just read in the H1.
  • Second line is one plain sentence on what you actually do with it.
  • Install is the single fastest command, copied from the manifest name field (never from the old README, which may predate a rename). One command, not a four-tab npm/pnpm/yarn/bun matrix; anyone who prefers another package manager can translate npm install.
  • Quickstart is the shortest complete thing that produces visible output. It keeps its full length even when that makes it the longest block in the file, because a truncated example fails only after the reader has pasted it.
  • Every code block runs as-is after copy-paste: no pseudocode, no placeholder imports, no foo, bar, my-app, or your-name-here. Use real ports, real branch names, real hex colours.
  • Length follows need. Most land between 40 and 90 lines; a CLI with real flag tables earns 120. Past about 130 the overflow is a docs site or docs/ folder, linked from the README.
  • ## for sections; ### only where genuinely parallel variants need separating inside one section, such as a CLI's install modes.

Phase 4: Add badges

Skip unless Phase 1 found a registry listing. Unpublished apps and internal monorepos get the header block with no badge row. Registry listings include skills.sh for a skill bundle, which serves an install-count badge endpoint; the repo's own README uses it.

When badges apply, load references/badges-and-shields.md. Default to two, version and license (installs and license for a skill bundle), in one style and one colour scheme so a set of repos looks like one set. A CI badge pointing at a workflow that never fires renders as a permanent failure, and a stars badge repeats a number already on the page.

Phase 5: Validate

Use references/quality-checklist.md to check the consumer path and house conventions. Report runnable-example and link/render results; a self-score is not rendering evidence.

Attach these render-checks alongside the pass count. Each must return nothing:

grep -nE "TODO|\{\{" README.md                                      # review candidates, not automatic failures
perl -CSD -ne 'print "$.: $_" if /\x{2014}/' README.md                  # em dashes
grep -nE "^## (Installation|Getting Started|Quick Start|Licence|Development|Tech Stack|Contributing)" README.md
grep -nE '(src|\]\()=?"?\.?/?\.github/assets' README.md                  # relative image paths: fine on GitHub, broken on npm and PyPI, so must be empty for a published package

The checklist's Automatic Fail list is the hard gate: missing description, missing install, leftover boilerplate, a code example that cannot run, or a section that only serves contributors. Any of these means not done, regardless of score.

Rewriting a published package's README, say in the summary that npmjs.com and PyPI show the README from the last publish, so the page changes only after the next release.

Gotchas

  • The blank lines inside <div align="center"> are load-bearing. CommonMark treats <div> as an HTML block that runs until the next blank line, so # Title on the line directly after the tag renders as literal # Title. Same for the <p align="center"> badge row and the closing </div>.
  • A relative image path (.github/assets/demo.png) renders on GitHub and 404s on npmjs.com and PyPI, which serve the README off-repo. For a published package, point src at https://raw.githubusercontent.com/{owner}/{repo}/main/.github/assets/demo.png; the file still lives in the repo.
  • Off-repo image hosts rot. GitHub proxies every external image through camo so an http:// URL loads today, but the host disappearing takes the screenshot with it. Commit images under .github/assets/.
  • A dark/light logo uses <picture> with two <source media="(prefers-color-scheme: ...)"> lines and an <img> fallback. The #gh-dark-mode-only URL fragments are deprecated. PyPI strips <source> and shows only the fallback, so make the fallback the light version.
  • > [!NOTE] alerts (also TIP, IMPORTANT, WARNING, CAUTION) render on GitHub, npmjs.com, and crates.io. PyPI shows a literal [!NOTE] inside a grey blockquote. At most one per README, reserved for the thing that breaks installs; a README of callouts reads as a changelog.
  • https://img.shields.io/github/license/{owner}/{repo} reads the repository's detected license. With no LICENSE file it renders license: not identified, which is worse than no badge. Check the file exists before adding the badge.
  • The most common rewrite failure is a published package whose README was written for the person maintaining it. Symptom: the first heading is ## Workspaces or the install step is git clone. The fix is not trimming, it is writing for a different reader.
  • A library README with a git clone Getting Started, or an app README with registry badges, means the type was guessed wrong in Phase 1 and sends readers down a dead path. Reclassify before editing prose.
  • Confirm the package exists under the name you are about to publish in the install line: npm view {{name}} version (or cargo search, pip index versions). A README pointing at an unpublished or renamed package fails the reader on line one.
  • Rewriting several repos at once tempts you to guess install commands. Cite the manifest bin entry or script you drew each one from, and paste-test a sample.
  • Never ship a default scaffold README (create-next-app, create-vite): replace it wholesale; readers treat it as abandoned.
  • Feature bullets use - **Name:** what it does. with a colon. A spaced hyphen (- **Name** - what it does.) reads as a stand-in for an em dash and fails the house style.
  • A ## Features section that restates the tagline is noise. Name it for what the reader gets (## Modes, ## What you can do, ## Keyboard shortcuts) so each bullet has to add a capability.

Related skills

When Run
README exists and needs a prose audit, or a full docs site docs-writing
Project needs agent instructions (AGENTS.md, CLAUDE.md), including the content the audience gate moved out agents-md
The install or first-run path the README documents is itself the problem dx-audit
Landing-page or marketing copy beyond the tagline copywriting
Drafting in the user's own voice external ghostwriter skill where installed, platform readme

Maintenance only: evals/evals.json contains regression scenarios for changes to this skill; it does not load during a user task.

Files (agent-skills)
  • evals
    • evals.json 1.5 KB
      {
        "skill_name": "readme-creator",
        "evals": [
          {
            "id": 1,
            "prompt": "Rewrite a hosted web app README. The only consumer entry is https://app.example.test; package.json is private and there is no supported self-hosting mode.",
            "expected_output": "Lead with the hosted entry rather than inventing package installation.",
            "files": [],
            "assertions": [
              "Omits npm install for the private app",
              "Does not add registry version badges",
              "Preserves a concise consumer-focused structure"
            ]
          },
          {
            "id": 2,
            "prompt": "Rewrite a published CLI README. The package name is @acme/harbor and its output includes a toolbar example.",
            "expected_output": "Use the actual package name without treating substrings foo or bar as boilerplate.",
            "files": [],
            "assertions": [
              "Keeps @acme/harbor intact",
              "Does not flag toolbar merely for containing bar",
              "Checks CLI examples against the documented interface"
            ]
          }
        ],
        "routing": {
          "should_trigger": [
            "Rewrite a hosted web app README. The only consumer entry is https://app.example.test; package.json is private and there is no supported self-hosting mode.",
            "Rewrite a published CLI README. The package name is @acme/harbor and its output includes a toolbar example."
          ],
          "near_miss": [
            {
              "prompt": "Fix the stale commands in AGENTS.md.",
              "expected": "agents-md"
            }
          ]
        }
      }
      
  • references
    • badges-and-shields.md 4.4 KB
      # Badges and Shields
      
      Markup and placement for badges. Phase 4 of SKILL.md decides whether this project gets badges at all; this file assumes Phase 1 found a registry listing.
      
      One placement, one colour scheme, two badges. The point of the constraint is that a set of repos should look like one set of repos.
      
      ## Placement
      
      The `<p align="center">` row inside the header block from `section-templates.md`, below the tagline and second line:
      
      ```markdown
      <p align="center">
        <a href="{{registry-url}}">
          <img src="{{version-badge}}" />
        </a>
        <a href="https://github.com/{{owner}}/{{repo}}/blob/main/LICENSE.md">
          <img src="https://img.shields.io/github/license/{{owner}}/{{repo}}?style=flat&labelColor=000000&color=000000" />
        </a>
      </p>
      ```
      
      Blank line before and after the `<p>` row: the block is HTML until the next blank line, and the `</div>` that follows needs its own.
      
      ## Colour scheme
      
      Every badge carries `?style=flat&labelColor=000000&color=000000`. `labelColor` paints the left half, `color` the right, so both go black and the badge reads as one solid chip.
      
      - `style`, `color`, `labelColor`, `logo`, and `logoColor` are the query parameters shields.io documents. `colorA` and `colorB` are older aliases that still render identically; leave them alone in repos that already use them, and write the documented names in new ones.
      - `flat` is the shields default, so `style=flat` is redundant. Keep it anyway: the point of the query string is that every badge URL in a set is byte-for-byte the same shape.
      - A black version badge no longer signals freshness by colour, which is the point. It is a link to the registry, not a status light.
      - Shields' own defaults (blue, yellow, green, brightgreen) and the `for-the-badge` and `flat-square` styles are what drift looks like. If one repo in a set uses them, the set looks unmaintained.
      
      ## Version badge by registry
      
      ```markdown
      <!-- npm -->
      https://img.shields.io/npm/v/{{name}}?style=flat&labelColor=000000&color=000000
      <!-- link to -->  https://www.npmjs.com/package/{{name}}
      
      <!-- crates.io -->
      https://img.shields.io/crates/v/{{name}}?style=flat&labelColor=000000&color=000000
      <!-- link to -->  https://crates.io/crates/{{name}}
      
      <!-- PyPI -->
      https://img.shields.io/pypi/v/{{name}}?style=flat&labelColor=000000&color=000000
      <!-- link to -->  https://pypi.org/project/{{name}}/
      
      <!-- VS Code Marketplace -->
      https://img.shields.io/visual-studio-marketplace/v/{{publisher}}.{{ext}}?style=flat&labelColor=000000&color=000000
      <!-- link to -->  https://marketplace.visualstudio.com/items?itemName={{publisher}}.{{ext}}
      ```
      
      For a monorepo publishing one package from a subdirectory, the badge uses the **published** package name from that package's manifest, not the private root name.
      
      ## Skill bundle: installs badge
      
      A skill bundle has no version, but skills.sh is its registry and serves a shields endpoint with install counts. It already returns black-on-black `flat`, so no query string is needed beyond the label:
      
      ```markdown
      <a href="https://www.skills.sh/{{owner}}/{{repo}}">
        <img src="https://img.shields.io/endpoint?url=https%3A%2F%2Fwww.skills.sh%2Fapi%2Fbadge%2F{{owner}}%2F{{repo}}&label=installs" />
      </a>
      ```
      
      The `url` parameter is percent-encoded once; pasting the raw `https://www.skills.sh/api/badge/...` URL renders a shields error badge. Pair it with the license badge and stop.
      
      ## What does not earn a badge
      
      | Badge | Why not |
      |-------|---------|
      | CI status | Renders as a permanent failure whenever the workflow does not fire on the default branch, and even when green tells the reader nothing they can act on. |
      | Stars, forks, watchers | Decoration. The count is already on the page, immediately above. |
      | Downloads per month | Fluctuates for reasons unrelated to the project, and a low number argues against you. |
      | Runtime version (`node-20+`) | Duplicates the Requirements section in a second visual language. Put the version in prose where it can carry a reason. |
      | "maintained: yes" | Hand-set, so it means nothing, and it goes stale in exactly the case where a reader would want it. |
      | License, when the repo has no LICENSE file | The shields endpoint reads the repo's detected license. With no license file it renders `not identified`, which is worse than no badge. |
      
      ## Third badge
      
      One case earns a third: a distribution channel a reader would otherwise not know exists, such as a VS Code Marketplace listing alongside the npm package, or a Homebrew tap. Add it as a distribution link, in the same black style, and stop there.
      
    • quality-checklist.md 4.8 KB
      # README Quality Checklist
      
      Use as a consumer-path and house-style rubric. Apply only relevant items; a hosted app with no installable product uses its live URL. If scoring is requested, exclude N/A items and keep editorial scores separate from executed verification.
      
      ## Audience (5 checks)
      
      1. No section that only helps someone changing the code (Development, Tech Stack, Architecture, Release, Workspaces, Scripts, Contributing, Project structure)
      2. Install is what a stranger runs, not `git clone` (unless cloning genuinely is the product)
      3. The install command uses the published package name from the manifest, not the repo or private root name, and the package exists on the registry under that name
      4. A first-time reader gets something running, or sees the thing working, within 60 seconds
      5. Content moved out landed in `AGENTS.md` or `CONTRIBUTING.md` rather than being deleted
      
      ## Structure (7 checks)
      
      6. Title is the display name, linked to the live site if one exists
      7. Tagline directly below the title with no heading, and it does not open with the project's own name
      8. A plain second line saying what you do with it
      9. Applicable sections follow the spine: header, Demo, Install, Quickstart, capability sections, License; omit Install for browser-only consumption
      10. Two to four capability sections, or a stated reason for a fifth
      11. Headings use the canonical names: `Install`, `Quickstart`, `Demo`, `License`
      12. Headings are sentence case, and nothing goes deeper than `###`
      
      ## Content (6 checks)
      
      13. Every code block runs copy-pasted, no modification
      14. No placeholder text, TODO markers, or `foo`/`bar`/`my-app`/`your-name-here` values
      15. Quickstart produces visible output and is complete rather than elided
      16. Install shows one command, not a package-manager matrix
      17. Capability bullets use `- **Name:** what it does.` with a colon
      18. Images are committed under `.github/assets/`, not hotlinked to an external host
      
      ## Rendering (4 checks)
      
      19. Markdown inside `<div align="center">` and around `<p align="center">` is separated by blank lines
      20. For a published package, every image `src` is an absolute `raw.githubusercontent.com` URL; for a GitHub-only repo, relative paths are fine
      21. At most one `> [!NOTE]`-style alert, and none if the package publishes to PyPI
      22. A dark/light logo uses `<picture>` with an `<img>` fallback, not `#gh-dark-mode-only` fragments
      
      ## Writing (6 checks)
      
      23. Active voice ("Install the package" not "The package can be installed")
      24. No "This project is..." or "This is a..." openers
      25. No em dashes, and table cells meaning "not applicable" are empty rather than a dash
      26. Consistent terminology (one term per concept, same casing)
      27. No orphaned sections (every heading has content below it)
      28. No hedged capability claims ("should work", "aims to", "tries to")
      
      ## Badges and footer (4 checks)
      
      29. Badges present only if the project is listed on a registry (npm, crates.io, PyPI, VS Code Marketplace, skills.sh)
      30. Two badges (version or installs, plus license) in one style and one colour scheme, or a third that names a distribution channel
      31. No CI, stars, downloads, runtime-version, or "maintained" badge, and no license badge without a `LICENSE` file
      32. License section present, with the footer credit line if the house style has one
      
      ## Freshness (4 checks)
      
      33. Badge package name matches the published package (or badges are absent)
      34. Spot-check 2-3 links are not broken
      35. No references to deprecated APIs, removed features, or old package names
      36. Length fits the type: most READMEs 40 to 90 lines, a CLI with flag tables up to 120, and anything past about 130 has its overflow linked out rather than inlined
      
      ## Project-Type Specific
      
      ### CLI tools
      - Documented flags match the real `--help` output
      - Examples show real commands, and the reader can tell what each produces
      
      ### Libraries
      - Import paths match the package structure
      - API detail beyond a screenful lives in a linked docs site, not inline
      
      ### Web apps
      - Demo or screenshot is present, and above Quickstart
      - Environment variables documented only if readers self-host
      
      ### Monorepos
      - The README is written for what a stranger installs, not for the repo layout
      - No workspaces table as the lede
      
      ### Skill bundles
      - Install is the one `npx skills add` command, with the compatible agents named
      - Every skill row links to its `SKILL.md`, and the count in the header matches the rows
      
      ## Automatic Fail
      
      Any of these means the README is not ready:
      
      - No description (reader cannot tell what the project does)
      - No install or demo (reader can neither use it nor see it)
      - Default boilerplate README (e.g., unchanged create-next-app template)
      - Code examples that cannot run (syntax errors, missing imports, wrong API)
      - A section that only serves contributors
      - An install command against a package name that does not exist on the registry
      
    • section-templates.md 9.5 KB
      # Section Templates
      
      Markup for each section, plus which capability sections fit each project type. Phase 2 of SKILL.md fixes the five-section spine; this file supplies the skeletons and the per-type choices that go between Quickstart and License.
      
      ## Contents
      
      - [The spine](#the-spine)
      - [Capability sections](#capability-sections)
      - [Per-type notes](#per-type-notes)
      - [Sections that belong somewhere else](#sections-that-belong-somewhere-else)
      
      ## The spine
      
      ### Header block
      
      One shape for every type. Registry-listed projects keep the badge row; everything else drops it. Keep every blank line shown: each HTML tag runs as raw HTML until the next blank line.
      
      ```markdown
      <div align="center">
      
      # {{Display Name}}
      
      **{{tagline, 8 to 16 words, no full stop, inline links where an upstream project earns credit}}**
      
      {{one plain sentence on what you actually do with it}}
      
      <p align="center">
        <a href="{{registry-url}}"><img src="{{version-badge}}" /></a>
        <a href="{{license-url}}"><img src="{{license-badge}}" /></a>
      </p>
      
      </div>
      ```
      
      Link the H1 to the live site when one exists: `# [{{Display Name}}]({{url}})`.
      
      A logo replaces the H1 only when the wordmark is the brand. Use `<picture>` so it survives both GitHub themes, with the light version as the fallback (PyPI drops the `<source>` lines and shows only the `<img>`):
      
      ```markdown
      <picture>
        <source media="(prefers-color-scheme: dark)" srcset="{{image-base}}/logo-dark.svg">
        <img alt="{{Display Name}}" src="{{image-base}}/logo-light.svg" width="320">
      </picture>
      ```
      
      `{{image-base}}` is `.github/assets` for a GitHub-only repo and `https://raw.githubusercontent.com/{{owner}}/{{repo}}/main/.github/assets` for anything published to a registry.
      
      ### Demo
      
      Only when a live URL exists. One line, then the button:
      
      ```markdown
      ## Demo
      
      {{One line naming what the reader will see.}}
      
      <p>
      <a href="{{live-url}}">
      <img alt="View demo" src="{{image-base}}/demo.svg" width="200" />
      </a>
      </p>
      ```
      
      A plain link works too. The button is a house-style choice; check the ghostwriter `readme` profile for the asset.
      
      A screenshot can stand in for a demo when there is nothing to interact with. Commit it under `.github/assets/`.
      
      ### Install
      
      The single fastest path, one command:
      
      ```bash
      npm install -g {{name}}      # CLI
      npm install {{name}}         # library
      ```
      
      Add one sentence under it only when the command has a consequence worth stating ("Run that inside any git repository", "Requires Node 20.11+").
      
      No package-manager matrix, no `<details>` tabs. Anyone who prefers pnpm can translate `npm install`.
      
      For an app with no install step, this section becomes the deploy or hosted link, or drops out entirely and Demo carries it.
      
      ### Quickstart
      
      The shortest complete thing that produces visible output. Complete beats short: this is the one section that keeps its full length.
      
      ```markdown
      ## Quickstart
      
      {{optional one-line setup, e.g. the HTML element the library mounts to}}
      
      {{one code block, real values, runnable as pasted}}
      ```
      
      For a CLI, that is two or three commands with a comment above each. For a library, one import plus one rendered result. For an app, the URL to open.
      
      ### License
      
      ```markdown
      ## License
      
      {{MIT}}
      
      ---
      
      {{footer credit line, if the house style has one}}
      ```
      
      Bare licence name is the default. A licence that imposes real constraints keeps its real text: font licences, non-commercial upstreams, and anything the reader could get wrong need the sentence that explains the constraint.
      
      ## Capability sections
      
      Two to four, between Quickstart and License. Named for what the reader gets, as a plain noun phrase.
      
      | Section | Use it for | Shape |
      |---------|-----------|-------|
      | `## What you can do` | An app or tool whose value is a set of things you do | `- **Verb phrase:** what happens.` bullets |
      | `## Modes` / `## Presets` | Distinct operating modes the reader picks between | one bullet per mode, with the parameters it exposes |
      | `## Usage` | A library with two or three patterns beyond the Quickstart | one code block per pattern, simplest first |
      | `## API` | A library or a CLI that also exports one | signature plus one-line description per public export |
      | `## Options` | A CLI with more than three flags | table: Flag, Default, Description |
      | `## Commands` | A CLI with subcommands | table: Command, Description |
      | `## Keyboard shortcuts` | Anything with a UI | table: Key, Action |
      | `## Configuration` | A config file or options object | table: Option, Type, Default, Description |
      | `## Environment variables` | An app the reader self-hosts | table: Variable, Description, Required |
      | `## Requirements` | A non-obvious runtime, OS, or hardware need | bullets, each with the reason |
      | `## Notes` | The two or three awkward facts, plus credit to prior art | bullets |
      | `## Theming` / `## Browser support` | Where it is the actual question readers have | whatever fits |
      
      `## Notes` is the pressure valve. Three sections of one bullet each (Requirements, Caveats, Credits) read as padding; one `## Notes` with three bullets reads as honest.
      
      Bullet form throughout: `- **Name:** what it does.` Table cells meaning "not applicable" are empty, not a dash.
      
      A `> [!WARNING]` alert earns a place only for the one fact that breaks installs (a native dependency, a breaking major). It renders as a callout on GitHub, npm, and crates.io and as a literal `[!WARNING]` blockquote on PyPI, so a Python package states the fact in plain prose instead.
      
      ## Per-type notes
      
      ### CLI tool
      
      - Install shows the global install; add `npx {{name}}@latest` above it when the tool is more often run than installed.
      - `## Options` as a table beats a pasted `--help` dump, which goes stale silently and is unreadable on mobile.
      - Document the flags a reader would not guess. `--help` already covers the rest, and a README documenting all thirty flags pushes Quickstart below the fold.
      - Only add `## API` if the package genuinely exports one.
      
      ### Library / package
      
      - Quickstart is install plus a minimal working example, under about 15 lines.
      - Link an external docs site rather than growing an API section past a screenful.
      - `## Notes` carries the platform requirements and the prior art. A library inspired by others should say so; it is also the fastest way for a reader to place it.
      - Images use the `raw.githubusercontent.com` base: the same file renders on the repo page and the registry page.
      
      ### Web app
      
      - No badges, no registry install. Demo is the most important section, and often the only one above Quickstart.
      - `## Environment variables` matters only for an app readers self-host. For a hosted app nobody will run locally, skip it and skip Quickstart too; Demo plus capability sections is the whole README.
      - A privacy or data-handling claim, where true, is worth its own two-sentence section. It is often the reader's real question.
      
      ### Framework
      
      - Feature descriptions run longer here: explain the why with the what.
      - Quickstart then one `## Usage` with the two or three core patterns. Push the configuration reference to a docs site rather than inlining a forty-row table.
      
      ### Monorepo
      
      Write the README for what a stranger installs or visits, not for the repo layout. A repo whose `apps/cli` publishes to npm gets a CLI README at the root, with the published package name in the install command and the badge.
      
      - No workspaces table. The layout is `AGENTS.md` content.
      - If the repo genuinely ships several things a reader chooses between, that is a `## Packages` table of two to five rows, each linking to its own README, and it is a capability section rather than the lede.
      
      ### Skill bundle
      
      The bundle's registry is skills.sh, which lists the skills with install counts and renders each `SKILL.md` on its own page; it does not show the README. So the README is read on GitHub, and its job is the install command plus a scannable catalogue.
      
      - Header carries the skill count in the second line, the skills.sh installs badge, and the license badge (`badges-and-shields.md` has the endpoint).
      - Install is the one `npx skills add {{owner}}/{{repo}}` command. Name the compatible agents in one line under it; where the command takes agent flags, state the flag shape once (`--agent` is space-separated, and a comma-separated list is rejected whole).
      - One line linking the skills.sh listing, so readers can see install counts and browse per-skill pages.
      - The `## Skills` table or list is the core content: one row per skill, name linked to its `SKILL.md`, then what it does in one clause. Group under `###` category headings once past about ten skills; this is the sanctioned use of `###`.
      - No Quickstart: invoking a skill is the agent's job, and the per-skill pages show the body.
      
      ## Sections that belong somewhere else
      
      The audience gate in Phase 2 rules these out. Move the content, do not delete it, and create the destination file when it does not exist.
      
      | Section | Destination |
      |---------|-------------|
      | `## Development`, `## Scripts`, `## Common commands` | `AGENTS.md` or `CONTRIBUTING.md` |
      | `## Workspaces`, `## Project structure`, `## Architecture` | `AGENTS.md` |
      | `## Release`, `## Publishing` | `CONTRIBUTING.md` |
      | `## Tech Stack` | nowhere; the reader can see the language on the repo sidebar |
      | `## Contributing` | `CONTRIBUTING.md`, which GitHub links from the issue and PR composer |
      | `## Roadmap` | GitHub issues or a project board, where it can stay current |
      | `## Changelog` | `CHANGELOG.md` or GitHub releases |
      
      `## Contributing` is the one worth arguing about. GitHub already links `CONTRIBUTING.md` from the issue and PR composer, so a README section repeating it costs a screenful and reaches nobody who was not already looking.
      
  • SKILL.md 13.1 KB
    ---
    name: readme-creator
    description: Creates or rewrites a README for the project consumer, using verified install commands, a runnable quickstart, and house presentation conventions. Use when asked to "write a README", "rewrite our README", or replace scaffold boilerplate. For an in-place prose audit use docs-writing; for agent instructions use agents-md.
    ---
    
    # README Creator
    
    Write a README that reads as a shop window, not a wiki.
    
    - **IS:** writing or rewriting `README.md` for the person deciding whether to use the project, with the project type driving which capability sections earn a place and where the file will render (GitHub only, or also a registry page) driving image and badge choices.
    - **IS NOT:** polishing the prose of a README that already covers the project, or a multi-page docs site (use `docs-writing`); AGENTS.md or CLAUDE.md agent-instruction files (use `agents-md`); fixing the install or first-run experience the README describes (use `dx-audit`); marketing copy for a landing page (use `copywriting`).
    
    ## The reader
    
    Someone arrived from a search result, a registry listing, or a profile page. They have about fifteen seconds and one question: is this worth my time? Every line either answers that or gets cut.
    
    They are not a contributor. Nothing about the build pipeline, the workspace layout, the release process, or the coding standards helps them decide, so none of it belongs here.
    
    This deliberately departs from standard-readme and Make a README, which require `## Contributing`, add a table of contents past 100 lines, and hold that too long beats too short. Do not drift back to those defaults: contributor content moves to `CONTRIBUTING.md` or `AGENTS.md`, and length follows what the reader needs.
    
    ## Reference Files
    
    | File | Read when |
    |------|-----------|
    | `references/section-templates.md` | Phase 3: markup for each spine section, the capability-section menu, and per-type notes |
    | `references/badges-and-shields.md` | Phase 4: only once Phase 1 has found a registry listing (npm, crates.io, PyPI, VS Code Marketplace, skills.sh) |
    | `references/quality-checklist.md` | Phase 5: score before declaring done |
    
    ## Voice
    
    Check for a profile from the external `ghostwriter` skill before drafting: `${GHOSTWRITER_HOME:-~/.config/ghostwriter}/readme.md`. When one exists it owns the register, the spelling convention, and any house-style markup (header block, badge colours, footer credit), and it wins every conflict with this skill. Follow it; do not restate it here.
    
    With no profile, default to terse second-person imperative, no emoji, no exclamation marks, and concrete numbers over adjectives.
    
    ## Workflow
    
    Copy this checklist to track progress:
    
    ```text
    README progress:
    - [ ] Phase 1: Detect project type and where the README renders
    - [ ] Phase 2: Fix the spine, then choose capability sections
    - [ ] Phase 3: Write each section from the template
    - [ ] Phase 4: Add badges (registry-listed projects only)
    - [ ] Phase 5: Score against the checklist; report the pass count and render-check output
    ```
    
    ### Phase 1: Detect project type and render targets
    
    Read the manifest (`package.json`, `Cargo.toml`, `pyproject.toml`, `go.mod`) for name, description, license, scripts, `bin`, `"private"`, and `repository`. Read the existing README if rewriting. Scan the top-level layout.
    
    Classify into exactly one type. First matching row wins, top to bottom:
    
    | Type | Decisive signal |
    |------|-----------------|
    | Skill bundle | `skills/` dir of `SKILL.md` files |
    | Monorepo | workspace config (`turbo.json`, `pnpm-workspace.yaml`, workspaces) |
    | CLI tool | `bin` field, `src/cli.*`, or commander/yargs/clap dep |
    | Framework | plugin/middleware architecture, config API, documented extension points |
    | Library / package | `main`/`exports` set, no `bin`, `src/index.*` entry |
    | Web app | framework config (`next.config.*`, `vite.config.*`); no publish |
    
    **A monorepo is not a project type for README purposes.** It is a delivery mechanism. Ask what a stranger installs or visits, then write the README for that: a repo whose `apps/cli` publishes to npm gets a CLI README at the root, not a workspaces table. The workspace layout goes in `AGENTS.md`.
    
    If two types still fit (a CLI that also exports an API, a framework published as a library), pick how most users consume it and fold the secondary role into one extra section.
    
    Then record where the file renders. A `"private": true` manifest or no registry listing means GitHub only. A published package also renders on npmjs.com, PyPI, or crates.io, which changes image URLs and earns badges (Phase 4 and the Gotchas).
    
    Ask the user only what code cannot reveal:
    - What problem does this solve (the "why" behind the tagline)?
    - Any section to force in or leave out?
    
    If unreachable, infer the "why" from the manifest and code, note the assumption in your summary, and proceed rather than block.
    
    ### Phase 2: Fix the spine, then choose capability sections
    
    Use this house spine where applicable. A hosted app can lead with its live URL instead of an install command; do not invent installation for a product consumed in the browser:
    
    1. **Header block** (title, tagline, plain second line, badges if registry-listed)
    2. **`## Demo`** (only when a live URL exists)
    3. **`## Install`**
    4. **`## Quickstart`**
    5. **`## License`**
    
    Between Quickstart and License go the capability sections: two to four, chosen from the menu in `references/section-templates.md`. Four is a ceiling because a fifth section is almost always contributor content wearing a reader-facing heading; when a fifth genuinely serves the reader, say why in your summary rather than silently adding it.
    
    Canonical heading names keep a set of repos consistent: `Install`, `Quickstart`, `Demo`, `License`. Not `Installation`, `Getting Started`, `Quick start`, `Quick Start`, `Licence`. Sentence case throughout, so `## Browser support` and not `## Browser Support`.
    
    **The audience gate.** Before writing any section, ask whether it helps someone deciding to use the project or only someone changing it. Contributor content goes to `CONTRIBUTING.md` or `AGENTS.md` (the destination table is in `references/section-templates.md`), and the README keeps at most a one-line pointer. When no destination file exists, create it: deleting load-bearing setup notes is a worse outcome than a slightly long README.
    
    ### Phase 3: Write sections
    
    Copy each section's skeleton from `references/section-templates.md`, fill it, then apply the per-type notes at the end of that file. These rules hold across every type:
    
    - **Title** is the display name with spaces and capitals ("React Vello", not `react-vello`), linked to the live site when one exists.
    - **Tagline** sits directly below with no heading, roughly 8 to 16 words, and says what the project does rather than what it is. Starting with the project's own name wastes the reader's first three words on something they just read in the H1.
    - **Second line** is one plain sentence on what you actually do with it.
    - **Install** is the single fastest command, copied from the manifest `name` field (never from the old README, which may predate a rename). One command, not a four-tab npm/pnpm/yarn/bun matrix; anyone who prefers another package manager can translate `npm install`.
    - **Quickstart** is the shortest complete thing that produces visible output. It keeps its full length even when that makes it the longest block in the file, because a truncated example fails only after the reader has pasted it.
    - Every code block runs as-is after copy-paste: no pseudocode, no placeholder imports, no `foo`, `bar`, `my-app`, or `your-name-here`. Use real ports, real branch names, real hex colours.
    - Length follows need. Most land between 40 and 90 lines; a CLI with real flag tables earns 120. Past about 130 the overflow is a docs site or `docs/` folder, linked from the README.
    - `##` for sections; `###` only where genuinely parallel variants need separating inside one section, such as a CLI's install modes.
    
    ### Phase 4: Add badges
    
    Skip unless Phase 1 found a registry listing. Unpublished apps and internal monorepos get the header block with no badge row. Registry listings include skills.sh for a skill bundle, which serves an install-count badge endpoint; the repo's own README uses it.
    
    When badges apply, load `references/badges-and-shields.md`. Default to two, version and license (installs and license for a skill bundle), in one style and one colour scheme so a set of repos looks like one set. A CI badge pointing at a workflow that never fires renders as a permanent failure, and a stars badge repeats a number already on the page.
    
    ### Phase 5: Validate
    
    Use `references/quality-checklist.md` to check the consumer path and house conventions. Report runnable-example and link/render results; a self-score is not rendering evidence.
    
    Attach these render-checks alongside the pass count. Each must return nothing:
    
    ```bash
    grep -nE "TODO|\{\{" README.md                                      # review candidates, not automatic failures
    perl -CSD -ne 'print "$.: $_" if /\x{2014}/' README.md                  # em dashes
    grep -nE "^## (Installation|Getting Started|Quick Start|Licence|Development|Tech Stack|Contributing)" README.md
    grep -nE '(src|\]\()=?"?\.?/?\.github/assets' README.md                  # relative image paths: fine on GitHub, broken on npm and PyPI, so must be empty for a published package
    ```
    
    The checklist's Automatic Fail list is the hard gate: missing description, missing install, leftover boilerplate, a code example that cannot run, or a section that only serves contributors. Any of these means not done, regardless of score.
    
    Rewriting a published package's README, say in the summary that npmjs.com and PyPI show the README from the last publish, so the page changes only after the next release.
    
    ## Gotchas
    
    - The blank lines inside `<div align="center">` are load-bearing. CommonMark treats `<div>` as an HTML block that runs until the next blank line, so `# Title` on the line directly after the tag renders as literal `# Title`. Same for the `<p align="center">` badge row and the closing `</div>`.
    - A relative image path (`.github/assets/demo.png`) renders on GitHub and 404s on npmjs.com and PyPI, which serve the README off-repo. For a published package, point `src` at `https://raw.githubusercontent.com/{owner}/{repo}/main/.github/assets/demo.png`; the file still lives in the repo.
    - Off-repo image hosts rot. GitHub proxies every external image through camo so an `http://` URL loads today, but the host disappearing takes the screenshot with it. Commit images under `.github/assets/`.
    - A dark/light logo uses `<picture>` with two `<source media="(prefers-color-scheme: ...)">` lines and an `<img>` fallback. The `#gh-dark-mode-only` URL fragments are deprecated. PyPI strips `<source>` and shows only the fallback, so make the fallback the light version.
    - `> [!NOTE]` alerts (also `TIP`, `IMPORTANT`, `WARNING`, `CAUTION`) render on GitHub, npmjs.com, and crates.io. PyPI shows a literal `[!NOTE]` inside a grey blockquote. At most one per README, reserved for the thing that breaks installs; a README of callouts reads as a changelog.
    - `https://img.shields.io/github/license/{owner}/{repo}` reads the repository's detected license. With no `LICENSE` file it renders `license: not identified`, which is worse than no badge. Check the file exists before adding the badge.
    - The most common rewrite failure is a published package whose README was written for the person maintaining it. Symptom: the first heading is `## Workspaces` or the install step is `git clone`. The fix is not trimming, it is writing for a different reader.
    - A library README with a `git clone` Getting Started, or an app README with registry badges, means the type was guessed wrong in Phase 1 and sends readers down a dead path. Reclassify before editing prose.
    - Confirm the package exists under the name you are about to publish in the install line: `npm view {{name}} version` (or `cargo search`, `pip index versions`). A README pointing at an unpublished or renamed package fails the reader on line one.
    - Rewriting several repos at once tempts you to guess install commands. Cite the manifest `bin` entry or script you drew each one from, and paste-test a sample.
    - Never ship a default scaffold README (create-next-app, create-vite): replace it wholesale; readers treat it as abandoned.
    - Feature bullets use `- **Name:** what it does.` with a colon. A spaced hyphen (`- **Name** - what it does.`) reads as a stand-in for an em dash and fails the house style.
    - A `## Features` section that restates the tagline is noise. Name it for what the reader gets (`## Modes`, `## What you can do`, `## Keyboard shortcuts`) so each bullet has to add a capability.
    
    ## Related skills
    
    | When | Run |
    |------|-----|
    | README exists and needs a prose audit, or a full docs site | `docs-writing` |
    | Project needs agent instructions (AGENTS.md, CLAUDE.md), including the content the audience gate moved out | `agents-md` |
    | The install or first-run path the README documents is itself the problem | `dx-audit` |
    | Landing-page or marketing copy beyond the tagline | `copywriting` |
    | Drafting in the user's own voice | external `ghostwriter` skill where installed, platform `readme` |
    
    Maintenance only: `evals/evals.json` contains regression scenarios for changes to this skill; it does not load during a user task.
    

Comments (0)

Sign in to join the conversation.

No comments yet.

Reviews (0)

No reviews yet.

Related