CLAUDE.md@.claude · git:20260821.b16c242 · 2026-08-21 · sha256 29592614d7f6177d
CLAUDE.md@.claude git:20260821.b16c242A
Immutable. This exact content is served forever at /api/v1/blob/29592614d7f6177d.
# Skills Repository
Public skills repo. Owner: @opwizardx
## Structure
```
skills/<name>/
├── SKILL.md # Frontmatter (name, description, metadata.version) + body
├── references/ # On-demand detailed docs
└── LICENSE.txt # Apache-2.0 (required by ClawHub; copy from any existing skill)
scripts/
├── generate_readme.py # README table + ClawHub slug overrides
├── prepare_skill_release.py # Build release manifest from git diff
├── publish_release.py # Publish to ClawHub + GitHub Releases
└── check_skills.py # Repo policy linter
Justfile # Task runner (just check, just readme, etc.)
.github/workflows/release.yml # CI: auto-publish on push to main
```
## Adding a Skill
1. Create `skills/<name>/SKILL.md` with frontmatter:
```yaml
---
name: skill-name
description: What it does and when to use it. Include trigger phrases.
metadata:
version: "0.1.0"
---
```
2. Add optional `references/` for detailed docs
3. Commit with conventional commits (`feat`, `fix`, `chore`, etc.)
## ClawHub catalog metadata (required)
`metadata.categories` and `metadata.topics` are flat comma-separated strings. They are
repo-local fields: ClawHub never reads frontmatter for them, so the release pipeline
translates them into `clawhub skill publish --categories/--topics`.
```yaml
metadata:
version: "0.1.3"
categories: "agents, productivity"
topics: "context, handoff, compaction"
```
- `categories` is required. A skill first published without it is stored as `other`
permanently until someone re-publishes or edits it on ClawHub.
- Max 3 categories from: `integrations, automation, research, development, productivity,
communication, creative, knowledge, agents, operations, security, finance, lifestyle, other`.
`other` cannot be combined with a specific category.
- Max 5 topics, each <= 48 chars, lowercase and hyphen-separated. ClawHub rejects 16
reserved names (`official`, `verified`, `featured`, `trusted`, ...); `check_skills.py`
rejects them first.
- Do not add a `skill-card.md`. The ClawHub CLI strips any root `skill-card.md` before
upload and the registry generates its own card after the security scan.
## Per-skill upstream tracking (optional)
For skills that wrap a specific tool, package, or library, two conventions track freshness:
### `metadata.upstream` flat string
```yaml
metadata:
version: "0.3.0"
upstream: "effect@4.0.0-beta.58, @effect/platform@0.70.0"
```
- Optional. Skills with no upstream tool (e.g., `polish`, `impactful-writing`) omit it.
- Comma-separated `<name>@<version>` entries. npm scopes (`@scope/pkg`) work because the leading `@` is part of the name.
- Concrete release tags or commit SHAs only. Floating tags (`@latest`, `@next`, `@beta`, `@canary`) are rejected.
- Anthropic's `metadata: dict[str, str]` contract is respected (flat string, not nested object).
### Per-skill `CHANGELOG.md`
Path: `skills/<name>/CHANGELOG.md`. Format: [Keep a Changelog v2.0.0](https://keepachangelog.com/en/2.0.0/).
- Standard sections only (Added / Changed / Deprecated / Removed / Fixed / Security); omit empty ones.
- Version heading: `## [x.y.z] - YYYY-MM-DD`.
- `[Unreleased]` header kept between releases.
- `Verified against:` trailer added only when at least one tracked package version changed in that release.
- The topmost CHANGELOG entry date is the canonical "last verified" signal - no separate frontmatter date field.
### `/update-skill` command
Use `/update-skill <skill-name>` (at `.claude/skills/update-skill/`) to maintain both fields. It runs research, gates approvals, applies edits, bumps version, updates CHANGELOG, runs `just check`, and commits + pushes on confirmation.
## Rules
- Single-file SKILL.md by default; split to references/ only when content is conditionally loaded (big chunks needed by only some invocations). Skills that must travel as one file stay single-file - condense, don't split
- All code examples must work - no pseudocode
- Size: 25k chars recommended, 50k chars hard ceiling (`wc -c`; CI-enforced via check_skills.py; line counts are not a metric). Condense carefully - never drop load-bearing content to hit a number
- **ALWAYS** bump `metadata.version` in frontmatter when any file in a skill is modified (SKILL.md or references/). Use semver: patch for fixes, minor for new content, major for breaking changes
- No unnecessary files (no README.md, package.json, project.json per skill)
- Use conventional commits
## Quality
- Proper frontmatter with triggers in description
- Quick start with working examples
- Links to official docs
- No deprecated APIs, no filler content
## Release Process
### Automated (CI)
On push to `main`, `.github/workflows/release.yml`:
1. Runs `just check` (lint, typecheck, skill validation, ClawHub publish preflight, README sync)
2. Diffs changed skills, builds manifest + zip bundles
3. Publishes changed skills to ClawHub via `clawhub` CLI
4. Creates a GitHub Release tagged `skills-<short-sha>` (first 7 chars; verify with `gh release view skills-$(git rev-parse --short HEAD)`) with bundles and notes
### Manual publishing
```bash
clawhub --no-input skill publish skills/<folder> \
--slug <clawhub-slug> --name "Display Name" \
--version <version> --changelog "..." --tags latest \
--categories "<slugs>" --topics "<topics>" \
--source-repo tenequm/skills --source-commit <sha> --source-path skills/<folder>
```
### Slugs, URLs, licensing
- Slugs are scoped per publisher, not globally unique: two owners can hold the same slug,
and the bare form then resolves ambiguously (`AMBIGUOUS_SKILL_SLUG`). Always link and
install owner-scoped: page `https://clawhub.ai/tenequm/skills/<slug>`, install
`@tenequm/<slug>`. There is no unscoped skill URL - `/skills/<slug>` is parsed as
owner `skills` and renders not-found.
- ClawHub licenses every published skill `MIT-0` registry-wide; no per-skill override.
The Apache-2.0 `LICENSE.txt` still ships in the bundle for the source repo.
- `clawhub skill rename <slug> <new-slug>` keeps the old slug as a redirect.
### ClawHub slug overrides
Some folder names collide with existing ClawHub slugs. Overrides live in `CLAWHUB_SLUG_OVERRIDES` in `scripts/generate_readme.py` and are applied automatically by the release pipeline. When publishing manually, use the correct `--slug` value from that dict.
### Key commands
```bash
just check # Full validation gate (lint + agentskills validate + ClawHub dry-run preflight)
just readme # Regenerate README skills table
just release-prepare <before> <after> # Build release manifest
just release-publish # Publish manifest to ClawHub + latest bundles
```
### Rate limit
ClawHub allows max 200 **new** skills per 24 hours. Updates to existing skills are not rate-limited.