<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Eliran Kotzero</title>
    <description>The latest articles on DEV Community by Eliran Kotzero (@eliran_kotzero_e1781dc487).</description>
    <link>https://dev.to/eliran_kotzero_e1781dc487</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4191090%2Fa3adef20-1c62-4911-982e-fcb9636d36a3.jpg</url>
      <title>DEV Community: Eliran Kotzero</title>
      <link>https://dev.to/eliran_kotzero_e1781dc487</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/eliran_kotzero_e1781dc487"/>
    <language>en</language>
    <item>
      <title>How to write a Claude Code skill (SKILL.md) that actually triggers</title>
      <dc:creator>Eliran Kotzero</dc:creator>
      <pubDate>Sun, 18 Oct 2026 06:07:44 +0000</pubDate>
      <link>https://dev.to/eliran_kotzero_e1781dc487/how-to-write-a-claude-code-skill-skillmd-that-actually-triggers-5egi</link>
      <guid>https://dev.to/eliran_kotzero_e1781dc487/how-to-write-a-claude-code-skill-skillmd-that-actually-triggers-5egi</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://kitquarry.com/articles/claude-code-skill-md-that-triggers" rel="noopener noreferrer"&gt;KitQuarry&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In short:&lt;/strong&gt; a skill triggers on its &lt;code&gt;description&lt;/code&gt;, not its body. Say what it does and when to use it, in the third person, using the words people actually type, and put the main use case first. Keep the frontmatter to &lt;code&gt;name&lt;/code&gt; and &lt;code&gt;description&lt;/code&gt; and the same SKILL.md works in Claude Code, Codex and Cursor. Then test it in a fresh session with prompts that should and shouldn't trigger it.&lt;/p&gt;

&lt;h2&gt;
  
  
  How an agent decides to use a skill
&lt;/h2&gt;

&lt;p&gt;Skills use progressive disclosure. When a session starts, the agent sees only a listing: each skill's name and description. The body of &lt;code&gt;SKILL.md&lt;/code&gt; loads when the skill is invoked, either because you typed its name or because the model decided it fits the task. So when a skill "doesn't work", the problem is usually that listing entry, not the instructions underneath it.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Claude Code&lt;/strong&gt; cuts each entry's combined &lt;code&gt;description&lt;/code&gt; and &lt;code&gt;when_to_use&lt;/code&gt; text at 1,536 characters. The whole listing gets about 1% of the context window. When it overflows, Claude Code drops descriptions for the skills you use least, and only their names remain.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Codex&lt;/strong&gt; gives the initial skills list at most 2% of the context window (8,000 characters if the window size is unknown) and shortens descriptions first when many skills are installed. &lt;code&gt;skills.max_context_tokens&lt;/code&gt; changes that budget.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;Agent Skills spec&lt;/strong&gt;, the open standard all three tools build on, caps &lt;code&gt;description&lt;/code&gt; at 1,024 characters.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The practical rule: front-load the key use case and trigger words, and stay under 1,024 characters so the file is valid everywhere.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the file goes
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Project skills&lt;/th&gt;
&lt;th&gt;Personal skills&lt;/th&gt;
&lt;th&gt;Run it yourself&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Claude Code&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.claude/skills/&amp;lt;name&amp;gt;/SKILL.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;~/.claude/skills/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/name&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Codex&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;.agents/skills/&amp;lt;name&amp;gt;/SKILL.md&lt;/code&gt;, scanned from the launch directory up to the repo root&lt;/td&gt;
&lt;td&gt;&lt;code&gt;~/.agents/skills/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;$name&lt;/code&gt;, or pick from &lt;code&gt;/skills&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cursor&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;.cursor/skills/&lt;/code&gt; or &lt;code&gt;.agents/skills/&lt;/code&gt; (also reads &lt;code&gt;.claude/skills/&lt;/code&gt; and &lt;code&gt;.codex/skills/&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;~/.cursor/skills/&lt;/code&gt;, &lt;code&gt;~/.agents/skills/&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Type &lt;code&gt;/&lt;/code&gt; and the skill name&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Name the folder carefully. The spec says &lt;code&gt;name&lt;/code&gt; must match the parent folder and use only lowercase letters, digits and single hyphens, up to 64 characters. In Claude Code the folder name (or &lt;code&gt;name&lt;/code&gt;) becomes the slash command. Anthropic's authoring guide also reserves the words "anthropic" and "claude" in skill names, so avoid names like &lt;code&gt;claude-helper&lt;/code&gt; if you might upload the skill to claude.ai or the API later.&lt;/p&gt;

&lt;h2&gt;
  
  
  Anatomy of a description that triggers
&lt;/h2&gt;

&lt;p&gt;The model reads descriptions to choose a skill for the current request, sometimes out of dozens. Anthropic's authoring guide and OpenAI's Codex docs give the same advice:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;What, then when.&lt;/strong&gt; One clause on what the skill does, then "Use when..." with concrete situations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Third person.&lt;/strong&gt; "Writes tests for..." rather than "I can help you write tests". The description is injected into the system prompt, and Anthropic warns that an inconsistent point of view can cause discovery problems.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The user's words.&lt;/strong&gt; Include phrasings people actually type ("add tests", "coverage", "this is untested") plus file types and tools (&lt;code&gt;.tsx&lt;/code&gt;, pytest, Vitest).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Boundaries.&lt;/strong&gt; Codex's docs say to explain when the skill should and should &lt;em&gt;not&lt;/em&gt; trigger. A short "Not for..." clause stops near-misses.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Front-loaded.&lt;/strong&gt; If descriptions get shortened, the first sentence is the part that survives.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Helps with tests.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Writes and runs unit and integration tests for changed code. Use when the user asks to add tests, improve coverage, reproduce a bug with a failing test, or says code is untested. Not for end-to-end browser tests.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  A working template
&lt;/h2&gt;

&lt;p&gt;Here is a complete skill. Save it as &lt;code&gt;.claude/skills/write-tests/SKILL.md&lt;/code&gt; for Claude Code, or &lt;code&gt;.agents/skills/write-tests/SKILL.md&lt;/code&gt; for Codex and Cursor. It uses only the two fields every tool understands.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;write-tests&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Writes and runs unit and integration tests for changed code. Use when the user asks to add tests, improve coverage, reproduce a bug with a failing test, or says code is untested. Not for end-to-end browser tests.&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="gh"&gt;# Write tests&lt;/span&gt;

&lt;span class="gu"&gt;## Steps&lt;/span&gt;
&lt;span class="p"&gt;1.&lt;/span&gt; List what changed: &lt;span class="sb"&gt;`git diff --name-only HEAD`&lt;/span&gt;. If nothing changed, ask which files to cover.
&lt;span class="p"&gt;2.&lt;/span&gt; Find the test runner and conventions in package.json, pyproject.toml or the existing tests. Match their location, naming and style.
&lt;span class="p"&gt;3.&lt;/span&gt; For each changed behaviour, write a happy-path test, one edge case and one failure case.
&lt;span class="p"&gt;4.&lt;/span&gt; Run the new tests first, then the full suite.
&lt;span class="p"&gt;5.&lt;/span&gt; If a test fails, fix the code or the test. Never delete or weaken an existing assertion to get a pass.

&lt;span class="gu"&gt;## Report&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Files added or changed
&lt;span class="p"&gt;-&lt;/span&gt; Cases covered, one line each
&lt;span class="p"&gt;-&lt;/span&gt; The exact test command you ran and its result
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As it grows, keep &lt;code&gt;SKILL.md&lt;/code&gt; as the overview and move detail into files it links to directly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;write-tests/
â”œâ”€â”€ SKILL.md          # required: frontmatter + steps
â”œâ”€â”€ references/
â”‚   â””â”€â”€ fixtures.md   # optional: read only when SKILL.md points to it
â””â”€â”€ scripts/
    â””â”€â”€ coverage.sh   # optional: executed, not loaded into context
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why it is shaped this way. The steps are imperative and end in an explicit output, which the Codex docs recommend. The "never weaken an assertion" line is concrete enough to check in review. Long reference material sits one level deep, so it costs no context until it is needed. Anthropic and the spec both recommend keeping &lt;code&gt;SKILL.md&lt;/code&gt; under 500 lines.&lt;/p&gt;

&lt;h2&gt;
  
  
  Make side-effect skills manual-only
&lt;/h2&gt;

&lt;p&gt;Some skills should never fire on their own: committing, deploying, sending messages. Each tool has a switch.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Only you can invoke it&lt;/th&gt;
&lt;th&gt;Only the model can invoke it&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Claude Code&lt;/td&gt;
&lt;td&gt;&lt;code&gt;disable-model-invocation: true&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;user-invocable: false&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cursor&lt;/td&gt;
&lt;td&gt;&lt;code&gt;disable-model-invocation: true&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Not documented&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Codex&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;allow_implicit_invocation: false&lt;/code&gt; in &lt;code&gt;agents/openai.yaml&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Not documented&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# .claude/skills/commit-work/SKILL.md (Claude Code; Cursor reads the same field)&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;commit-work&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Runs all checks, then stages and commits the current work with a Conventional Commits message. Only when the user explicitly asks to commit.&lt;/span&gt;
&lt;span class="na"&gt;disable-model-invocation&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

&lt;span class="c1"&gt;# .agents/skills/commit-work/agents/openai.yaml (Codex)&lt;/span&gt;
&lt;span class="na"&gt;policy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;allow_implicit_invocation&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In Claude Code, a skill with &lt;code&gt;disable-model-invocation: true&lt;/code&gt; is left out of the model's listing completely, so it also costs no context until you call it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Claude Code extras, and when to skip them
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;when_to_use&lt;/code&gt;: extra trigger phrases, appended to the description and counted toward the 1,536-character cap.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;paths&lt;/code&gt;: globs that limit automatic loading to matching files. Cursor supports &lt;code&gt;paths&lt;/code&gt; too.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;argument-hint&lt;/code&gt; and &lt;code&gt;$ARGUMENTS&lt;/code&gt; (or &lt;code&gt;$0&lt;/code&gt;, &lt;code&gt;$1&lt;/code&gt;): arguments, as in &lt;code&gt;/fix-issue 123&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;A line like &lt;code&gt;!`git diff HEAD`&lt;/code&gt;: dynamic context. Claude Code runs the command and inlines its output before Claude reads the skill.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;allowed-tools&lt;/code&gt;: pre-approves tools for the turn that invokes the skill. The grant clears when you send your next message, and it doesn't block other tools. Read it before running skills you didn't write.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;context: fork&lt;/code&gt;: runs the skill in a subagent that can't see your conversation, so the skill must stand on its own.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These fields are Claude Code extensions, not part of the spec. Cursor documents its own small set (&lt;code&gt;paths&lt;/code&gt;, &lt;code&gt;disable-model-invocation&lt;/code&gt;, &lt;code&gt;metadata&lt;/code&gt; and a few display fields), and the Codex docs list only &lt;code&gt;name&lt;/code&gt; and &lt;code&gt;description&lt;/code&gt; plus &lt;code&gt;agents/openai.yaml&lt;/code&gt;. Uploading a skill to claude.ai or the Skills API fails with an "Unexpected key(s)" error if the frontmatter holds anything beyond &lt;code&gt;name&lt;/code&gt;, &lt;code&gt;description&lt;/code&gt;, &lt;code&gt;license&lt;/code&gt;, &lt;code&gt;compatibility&lt;/code&gt;, &lt;code&gt;metadata&lt;/code&gt; and &lt;code&gt;allowed-tools&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why a skill doesn't trigger: a checklist
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The frontmatter isn't on line 1.&lt;/strong&gt; Claude Code reads frontmatter only when the opening &lt;code&gt;---&lt;/code&gt; is the file's first line. Otherwise the whole file, markers included, is treated as content.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The YAML doesn't parse.&lt;/strong&gt; Claude Code still loads the skill, but with no fields set, so &lt;code&gt;/name&lt;/code&gt; works while automatic matching has no description to use. An unquoted description containing ": " is a common cause. Wrap it in quotes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wrong folder for the tool.&lt;/strong&gt; Claude Code's documented locations are under &lt;code&gt;.claude/skills&lt;/code&gt;; Codex scans &lt;code&gt;.agents/skills&lt;/code&gt;. A skill in only one of them is invisible to the other tool.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The description is vague,&lt;/strong&gt; or it describes the implementation rather than the request.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Too many skills.&lt;/strong&gt; When the listing overflows its budget, descriptions get dropped or shortened. In Claude Code, &lt;code&gt;/doctor&lt;/code&gt; estimates the listing's cost and &lt;code&gt;/skill-doctor&lt;/code&gt; flags skills you never use.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It's switched off:&lt;/strong&gt; &lt;code&gt;disable-model-invocation&lt;/code&gt;, a &lt;code&gt;skillOverrides&lt;/code&gt; entry in Claude Code settings, or &lt;code&gt;enabled = false&lt;/code&gt; under &lt;code&gt;[[skills.config]]&lt;/code&gt; in &lt;code&gt;~/.codex/config.toml&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It's nested.&lt;/strong&gt; In Claude Code, skills in a &lt;code&gt;.claude/skills&lt;/code&gt; folder below where you started load only after Claude reads or edits a file in that subdirectory.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If a skill triggers but Claude stops following it later in the session: Claude Code doesn't re-read &lt;code&gt;SKILL.md&lt;/code&gt; on later turns, and after auto-compaction it keeps only the first 5,000 tokens of each invoked skill. Put the most important rules at the top, word them as standing instructions ("run the tests after every edit"), and move anything that must hold every time into a hook.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test it like code
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Start a fresh session.&lt;/strong&gt; Anthropic's docs point out that leftover context from writing the skill hides gaps in the instructions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Confirm it is listed.&lt;/strong&gt; In Claude Code, ask "What skills are available?" or run &lt;code&gt;/skills&lt;/code&gt;. In Codex, run &lt;code&gt;/skills&lt;/code&gt;. In Cursor, open Customize, then Skills.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Write 3â€“5 prompts that should trigger it&lt;/strong&gt; and 2â€“3 near-misses that shouldn't. For the template above, "add a Playwright test for checkout" is a good near-miss.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Run each prompt with the skill on and off&lt;/strong&gt; and compare the results. In Claude Code, set the skill to &lt;code&gt;"off"&lt;/code&gt; in &lt;code&gt;skillOverrides&lt;/code&gt; for the baseline run.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validate the frontmatter&lt;/strong&gt; with &lt;code&gt;claude plugin validate .claude/skills&lt;/code&gt; (Claude Code v2.1.233 or later) or &lt;code&gt;skills-ref validate ./write-tests&lt;/code&gt; from the spec's reference library.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Tune the description, not the body, until it triggers when it should. If it fires too often, narrow the description or make the skill manual-only.&lt;/p&gt;

&lt;h2&gt;
  
  
  One source, three tools
&lt;/h2&gt;

&lt;p&gt;Because all three tools follow the same spec, a SKILL.md with just &lt;code&gt;name&lt;/code&gt; and &lt;code&gt;description&lt;/code&gt; runs everywhere. The catch is duplication. Cursor also reads &lt;code&gt;.claude/skills&lt;/code&gt; and &lt;code&gt;.agents/skills&lt;/code&gt;, so a repo that carries the same skill in several folders should keep the copies identical, ideally generated from one source. That is how our kits are built: one master source compiled into each tool's native folder and checked by a format validator. For how skills relate to rule files, see &lt;a href="https://kitquarry.com/articles/cursor-rules-vs-claude-md-vs-agents-md" rel="noopener noreferrer"&gt;Cursor rules vs CLAUDE.md vs AGENTS.md&lt;/a&gt;, and for the workflow these skills support, the &lt;a href="https://kitquarry.com/articles/plan-first-workflow-for-ai-coding" rel="noopener noreferrer"&gt;plan-first workflow&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Want working examples?&lt;/strong&gt; The &lt;a href="https://kitquarry.com/free" rel="noopener noreferrer"&gt;free sampler&lt;/a&gt; (no email) includes &lt;code&gt;/plan-feature&lt;/code&gt; and &lt;code&gt;/review-changes&lt;/code&gt; as SKILL.md files for Claude Code and Codex, plus the same workflows for Cursor, Windsurf and Copilot. The &lt;a href="https://kitquarry.com/products/rules-pack" rel="noopener noreferrer"&gt;Rules Pack&lt;/a&gt; adds &lt;code&gt;/fix-bug&lt;/code&gt;, &lt;code&gt;/security-audit&lt;/code&gt;, &lt;code&gt;/write-tests&lt;/code&gt; and a manual-only &lt;code&gt;/commit-work&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Do I need both name and description in SKILL.md?
&lt;/h3&gt;

&lt;p&gt;For portability, yes. The Agent Skills spec, Codex and Cursor all require name and description. Claude Code treats every field as optional (it falls back to the folder name and the first non-empty line of the body), but the description is what Claude matches against, so always write one.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why does my skill run with /name but never trigger on its own?
&lt;/h3&gt;

&lt;p&gt;Usually the description is too vague or doesn't use the words people actually type. Other causes: disable-model-invocation is set, the YAML frontmatter fails to parse (Claude Code then loads the skill with no fields), or so many skills are installed that the listing dropped its description.&lt;/p&gt;

&lt;h3&gt;
  
  
  Where do Codex skills go, and how do I run one?
&lt;/h3&gt;

&lt;p&gt;Put them in .agents/skills/&amp;lt;name&amp;gt;/SKILL.md. Codex scans .agents/skills in every directory from where you launch it up to the repository root, plus ~/.agents/skills for personal skills. Mention a skill with $name, or pick it from /skills.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can one SKILL.md work in Claude Code, Codex and Cursor?
&lt;/h3&gt;

&lt;p&gt;Yes, if you stick to the Agent Skills spec fields (name, description, and optionally license, compatibility, metadata, allowed-tools). Copy the same folder to .claude/skills for Claude Code and .agents/skills for Codex. Cursor reads .cursor/skills and .agents/skills, and also .claude/skills and .codex/skills.&lt;/p&gt;

&lt;h3&gt;
  
  
  How long can a skill description be?
&lt;/h3&gt;

&lt;p&gt;The Agent Skills spec allows up to 1,024 characters. Claude Code cuts the combined description and when_to_use text at 1,536 characters in its listing, and Codex shortens descriptions when many skills are installed. Put the main use case and trigger words in the first sentence.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;p&gt;Official docs, checked 2026-10-16.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://code.claude.com/docs/en/skills" rel="noopener noreferrer"&gt;Claude Code docs: Extend Claude with skills&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://platform.claude.com/docs/en/agents-and-tools/agent-skills/best-practices" rel="noopener noreferrer"&gt;Anthropic: Skill authoring best practices&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.openai.com/codex/skills" rel="noopener noreferrer"&gt;OpenAI Codex docs: Build skills&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cursor.com/docs/context/skills" rel="noopener noreferrer"&gt;Cursor docs: Agent Skills&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://agentskills.io/specification" rel="noopener noreferrer"&gt;Agent Skills specification&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Want ready-made SKILL.md examples to copy? The free sampler is on GitHub: &lt;a href="https://github.com/elirankotzero/ai-coding-rules-sampler" rel="noopener noreferrer"&gt;elirankotzero/ai-coding-rules-sampler&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>claude</category>
      <category>ai</category>
      <category>programming</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
