Running pnpm add tidypress does one extra thing most installs don’t. It checks whether Cursor, Claude Code, or Codex are set up on the machine, and if so, asks whether to install a skill for them. Say yes, and from that point on, an agent working in that project already knows the CLI, the config shape, and where content is supposed to go.
This is the same pattern Cloudflare uses for Wrangler: detect the agent directory on first run, offer the skill right there instead of sending someone to a docs page about it.
Most Agent Skills that exist today stop at teaching commands. The skill bundle Cloudflare ships for Wrangler is a good one: it gets an agent to reach for wrangler deploy instead of guessing at an API that doesn’t exist, to put bindings in wrangler.jsonc instead of inventing config syntax, to use R2 correctly instead of hallucinating an interface. That’s a real, common failure mode, agents confidently using APIs that aren’t real, and the skill fixes it. It’s also about as far as most CLI skills go: command names, flag syntax, config shape.
The TidyPress skill does that part too. It also does something most CLI skills skip, because most CLIs don’t have an opinion to teach here: it tells an agent what kind of content it’s about to write before it writes it.
What actually happens, not a hypothetical
I ran this for real instead of describing it. Fresh install, fresh tidypress init, then forced the skill install:
$ npx tidypress skills install --force
Successfully installed TidyPress skills for: Claude Code.That installs the real SKILL.md into ~/.claude/skills/tidypress/. It’s not a summary or a marketing description, it’s the literal file an agent reads, frontmatter and all:
---
name: tidypress
description: >-
TidyPress publishing framework for Git-native sites — init, dev, build, deploy,
collections, presets, Pagefind search, and build/llms.txt. Use when
editing site/tidypress.config.ts, markdown in site/src/content...
---With that file loaded, I asked for a project page the way someone actually would: “add a project page for the checkers UI redesign, mark it active, link the repo.” The result, written to the right place on the first try:
# src/content/projects/checkers-ui-redesign.md
---
title: Checkers UI redesign
description: Warm amber desktop palette merged with mobile-specific components.
status: active
featured: true
repo: https://github.com/example/checkers-ui
---Then tidypress build, also real:
$ npx tidypress build
Indexed 7 pages, 98 wordsThe new page is in the output at build/projects/checkers-ui-redesign/, and it shows up correctly inside build/llms.txt, the full published markdown the build writes automatically:
### [Checkers UI redesign](https://example-demo.com/projects/checkers-ui-redesign)
Warm amber desktop palette merged with mobile-specific components.
I didn’t run a second test with the skill absent. The failure mode I’m describing there, a file like new-post.md landing at the repo root with no frontmatter, is the well-documented, common pattern when an agent doesn’t have project conventions to work from. I’m not claiming I reproduced that one specifically, only that what’s above is real, and that the contrast it implies is the actual reason the skill exists.
None of this changes what happens after a draft lands. A pull request still gets reviewed the same way no matter who or what wrote the first version. What changes is whether that first version already has the right shape, instead of needing a round of corrections before review can even start.
The honest part
Auto-prompting on install isn’t free, and it’s worth saying plainly. Wrangler users have pushed back when the same prompt fires on commands that have nothing to do with it, or when a team already runs its own skills and doesn’t want a vendor’s opinion injected automatically. The TidyPress prompt fires once, only in an interactive terminal, and turns off completely with one environment variable:
TIDYPRESS_SKIP_SKILLS_INSTALL=1 pnpm add tidypressor installs on demand later, if it was skipped the first time:
npx tidypress skills installMost agent skills exist to stop an agent from guessing at syntax. This one does that, and also stops it from guessing at where things go.