This repository uses one canonical skill layout:
- each skill lives once at
skills/<slug>/SKILL.md - optional
agents/,assets/,evals/,examples/,reference/,references/,rules/,scripts/, andtemplates/folders live next to that skill SKILL.mdis the entry point; long examples, templates, troubleshooting, and appendices should be linked fromreferences/instead of kept in the main file- upstream-managed skills are declared once in
.sync-config.json ./install.shand./update.shfan skills out to the five core clients and the generic project.agents/skills/path automatically
Do not add manual per-client symlinks or duplicate SKILL.md files for individual products.
| Client | User Path | Notes |
|---|---|---|
| Cursor | ~/.cursor/skills/ |
Auto-discovery in Cursor |
| Claude Code | ~/.claude/skills/ |
Primary Claude user skill path |
| Gemini CLI | ~/.gemini/skills/ |
Shared with Antigravity |
| OpenAI Codex | ~/.codex/skills/ |
User-level Codex discovery |
| Windsurf | ~/.codeium/windsurf/skills/ |
Current Windsurf user path |
| Client | Project Path | Notes |
|---|---|---|
| Cursor | .cursor/skills/ |
Primary project-level Cursor skills |
| Cursor legacy | .cursor/rules/*.mdc |
Backwards compatibility copies |
| Generic agents | .agents/skills/ |
Shared project-level skill path |
| Gemini CLI | .gemini/skills/ |
Project-level Gemini/Antigravity |
| OpenAI Codex | .codex/skills/ |
Project-level Codex skills |
| Windsurf | .windsurf/skills/ |
Project-level Windsurf skills |
These are maintained centrally and do not require per-skill install logic:
| File | Used By |
|---|---|
AGENTS.md |
GitHub Copilot, OpenAI Codex, Windsurf, Cline, Aider |
CLAUDE.md |
Claude Code |
GEMINI.md |
Gemini CLI, Antigravity |
.windsurfrules |
Windsurf |
.github/copilot-instructions.md |
GitHub Copilot |
gemini-extension.json |
Gemini CLI skill triggers |
Other tools can still use this repository without adding per-skill install logic to install.sh.
If a tool supports a skills directory, mirror skills/* into that path once:
TARGET_DIR="$HOME/.kiro/skills" # replace with the tool's skill path
mkdir -p "$TARGET_DIR"
for skill_dir in "$PWD"/skills/*; do
[ -f "$skill_dir/SKILL.md" ] || continue
ln -sfn "$skill_dir" "$TARGET_DIR/$(basename "$skill_dir")"
doneIf a tool reads instruction files instead of a skills directory, point it at AGENTS.md or its native instruction file.
./install.sh loops over every directory under skills/ and installs it everywhere it belongs for the five core clients and generic project agents.
skills/typo3-update/SKILL.md <- source of truth
↓ fan-out
~/.claude/skills/typo3-update/ <- Claude Code
~/.cursor/skills/typo3-update/ <- Cursor
~/.gemini/skills/typo3-update/ <- Gemini CLI
~/.codex/skills/typo3-update/ <- OpenAI Codex
~/.codeium/windsurf/skills/typo3-update/ <- Windsurf
.cursor/skills/typo3-update/ <- Cursor project-level
.agents/skills/typo3-update/ <- Generic project-level
.gemini/skills/typo3-update/ <- Gemini project-level
.codex/skills/typo3-update/ <- Codex project-level
.windsurf/skills/typo3-update/ <- Windsurf project-level
.cursor/rules/typo3-update.mdc <- Cursor legacy compatibility copy
Common commands:
./install.sh # full install
./install.sh --user-only # only user-level paths
./install.sh --project-only # only project-level paths
./install.sh --no-sync # skip upstream sync, only regenerate/install
./install.sh --generate-only # regenerate cross-client files and manifests only
./update.sh # sync upstream skills, then reinstall
./update.sh --sync-only # sync upstream skills and generated files only
./update.sh --skill NAME # sync one enabled upstream-managed skillThe collection contains two maintenance modes:
Local skills: maintained directly in this repository.Upstream-managed skills: refreshed from external Git repositories listed in.sync-config.json.
After upstream sync, the repo restores attribution blocks and refreshes source-owner documentation automatically.
Netresearch-derived skills are currently upstream-managed through .sync-config.json and keep their local thank-you and attribution blocks after sync.
- Create
skills/<slug>/SKILL.md. - Add
nameanddescriptionfrontmatter; the description is the main routing signal. - Keep the main file concise and add supporting folders only if needed.
- Update README / AGENTS if the skill changes the public catalog.
- Run
npx -y skills-ref validate skills/<slug>and./install.sh.
No extra client-specific symlink work is required for the five core clients or the generic .agents/skills/ project path.
Example local skill layout:
skills/typo3-shadcn-content-elements/
├── SKILL.md
├── agents/openai.yaml
├── references/
│ ├── backend-preview-pattern.md
│ ├── content-element-contract.md
│ ├── icon-pattern.md
│ └── shadcn-preset-workflow.md
└── scripts/audit-content-elements.php
Because the installer scans skills/*/SKILL.md, both ./install.sh and the reinstall phase of ./update.sh pick up this skill automatically. Only upstream-managed skills need a .sync-config.json entry.
- Add one entry to
.sync-config.json. - Choose the canonical target skill name for
skills/<name>/. - Set
pathto the upstream folder containingSKILL.md. - Run
./update.sh --sync-only. - Review generated changes and attribution blocks.
- Run
./install.shif you also want local client mirrors regenerated.
Configuration fields:
| Field | Required | Description |
|---|---|---|
name |
Yes | Directory name under skills/ |
source |
Yes | Git repository URL |
branch |
Yes | Branch to sync from |
path |
No | Subdirectory within the upstream repo containing SKILL.md |
enabled |
No | Set false to keep entry disabled |
copyMode |
No | Use repo only when intentionally mirroring a whole repository |
target |
No | Target directory for copyMode: "repo" |
note |
No | Human-readable maintenance note |
For skill-mode imports, the updater copies SKILL.md plus any agents/, assets/,
evals/, examples/, reference/, references/, rules/, scripts/, and templates/ folders.
Do not keep local-only reference files inside an upstream-managed skill's synced
subfolders; put local overlays in a repo-owned skill so the next sync does not remove them.
The GitHub Action .github/workflows/sync-skills.yml can sync enabled upstream skills on schedule or by manual dispatch.
Local sync uses the same source of truth:
./update.sh --sync-onlyThat command:
- clones each enabled upstream source
- refreshes local
skills/<name>/ - restores source notes with
scripts/sync_source_notes.py - refreshes README source ownership with
scripts/sync_readme_sources.py - regenerates cross-client files and
gemini-extension.json - validates attribution with
scripts/check_attribution_guardrails.py
- Add each skill once under
skills/. - Prefer the installer over manual symlink management.
- Keep
.sync-config.jsonas the only upstream sync registry. - Review sync changes before merging.
- Keep generated client mirrors out of design discussions; the canonical source is always
skills/.
Use this when you want a predictable publish/update cycle:
- Commit and push source changes.
- Run
./update.sh --sync-onlyif upstream-managed skills changed. - Run
./install.shto regenerate local mirrors and generated docs. - Commit generated changes.
- Run any publishing/validation workflow you need.