<?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: Maksym Danylenko</title>
    <description>The latest articles on DEV Community by Maksym Danylenko (@maxpaint).</description>
    <link>https://dev.to/maxpaint</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%2F1413051%2F9db95f69-4946-4e75-aae5-9ba9b7eaab73.jpeg</url>
      <title>DEV Community: Maksym Danylenko</title>
      <link>https://dev.to/maxpaint</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/maxpaint"/>
    <language>en</language>
    <item>
      <title>How to Create Agent Skills: Tools, Testing, and Installation</title>
      <dc:creator>Maksym Danylenko</dc:creator>
      <pubDate>Thu, 01 Oct 2026 11:56:50 +0000</pubDate>
      <link>https://dev.to/maxpaint/how-to-create-agent-skills-tools-testing-and-installation-4dkm</link>
      <guid>https://dev.to/maxpaint/how-to-create-agent-skills-tools-testing-and-installation-4dkm</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fclddifokk6iddz5ybcp8.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fclddifokk6iddz5ybcp8.jpg" alt="An instructor writing formulas on a large chalkboard" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In short.&lt;/strong&gt; Start with a task that keeps coming up and turn it into a Skill with &lt;code&gt;superpowers:writing-skills&lt;/code&gt;. While creating it, test scenarios with and without the Skill, and validate the structure of &lt;code&gt;SKILL.md&lt;/code&gt;. Then use the Skill on several real tasks. If it consistently helps, share it with your team through a Skills repository or a Plugin.&lt;/p&gt;

&lt;p&gt;Creating your first Agent Skill is easy. Make a folder, put a &lt;code&gt;SKILL.md&lt;/code&gt; file in it, and write a few instructions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The harder part is knowing whether that Skill actually works.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The agent has to find it among dozens of other instructions, invoke it for the right request, ignore similar but irrelevant requests, follow its instructions, and produce a better result than it would without the Skill.&lt;/p&gt;

&lt;p&gt;This guide covers tools for the full cycle: creation, improvement, validation, testing, installation, and maintenance.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a Skill is in practice
&lt;/h2&gt;

&lt;p&gt;An Agent Skill is a folder containing instructions, reference material, and, if needed, executable scripts. Only one file is required: &lt;code&gt;SKILL.md&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;A minimal Skill looks like this:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;folder structure&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;review-migration/
└── SKILL.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;SKILL.md&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&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;review-migration&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Reviews&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;database&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;migrations&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;for&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;compatibility&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;and&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;rollback&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;risks.&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Use&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;when&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;a&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;creates&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;or&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;changes&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;a&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;database&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;migration."&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

&lt;span class="na"&gt;Review the migration&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;

&lt;span class="s"&gt;1. Check backward compatibility.&lt;/span&gt;
&lt;span class="s"&gt;2. Identify locks or long-running operations.&lt;/span&gt;
&lt;span class="s"&gt;3. Verify the rollback or roll-forward path.&lt;/span&gt;
&lt;span class="s"&gt;4. Report only risks introduced by this migration.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The open &lt;a href="https://agentskills.io/specification" rel="noopener noreferrer"&gt;Agent Skills specification&lt;/a&gt; requires the &lt;code&gt;name&lt;/code&gt; and &lt;code&gt;description&lt;/code&gt; fields. The description tells the agent when to read the full Skill for the task at hand.&lt;/p&gt;

&lt;p&gt;That matters because of how Skills are loaded:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The agent sees the metadata for all available Skills.&lt;/li&gt;
&lt;li&gt;The description helps it decide whether to read a particular Skill.&lt;/li&gt;
&lt;li&gt;Once the Skill is activated, it reads the full &lt;code&gt;SKILL.md&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;It opens additional &lt;code&gt;references/&lt;/code&gt;, &lt;code&gt;scripts/&lt;/code&gt;, and &lt;code&gt;assets/&lt;/code&gt; only when needed.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Anthropic calls this &lt;a href="https://platform.claude.com/docs/en/agents-and-tools/agent-skills/overview" rel="noopener noreferrer"&gt;progressive disclosure&lt;/a&gt;. It manages context: the agent doesn't need the full text of every Skill in every request. It reads instructions for the relevant task and opens longer reference material when it needs it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Skill, AGENTS.md, or Plugin?
&lt;/h2&gt;

&lt;p&gt;Not every instruction should become a Skill.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mechanism&lt;/th&gt;
&lt;th&gt;When to use it&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;AGENTS.md&lt;/td&gt;
&lt;td&gt;Short, always-on context: project structure, working commands, non-obvious architecture decisions, and links to detailed rules&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Skill&lt;/td&gt;
&lt;td&gt;A repeatable process or knowledge needed only for a particular type of task&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Plugin&lt;/td&gt;
&lt;td&gt;A collection of Skills with agents, Hooks, MCP servers, configuration, or its own versioning lifecycle&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MCP server&lt;/td&gt;
&lt;td&gt;Standardized access to an external system, data, or API&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hook&lt;/td&gt;
&lt;td&gt;A predefined action triggered by an event, such as running a formatter after an edit&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Why Skills once started replacing MCP integrations, and what changed&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Large MCP integrations used to load descriptions for every tool into each request. A few servers could occupy a substantial share of the context window. That led people to replace narrow integrations with Skills containing CLI commands: the agent would read the instructions only when it needed them.&lt;/p&gt;

&lt;p&gt;Modern &lt;a href="https://platform.claude.com/docs/en/agents-and-tools/tool-use/manage-tool-context" rel="noopener noreferrer"&gt;tool search with deferred loading&lt;/a&gt; has changed that trade-off. Descriptions of unused MCP tools no longer have to be included in the initial request: the agent can find the tool it needs and load its description on demand. That makes discovery more similar to Skills, though their roles remain different: a Skill provides a process and knowledge, while an MCP server performs an external action or returns data.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A good sign that you need a new Skill: you're pasting the same checklist into a chat or explaining the same process to a new session for the third time.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Tools for creating Skills
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. The agent itself
&lt;/h3&gt;

&lt;p&gt;You don't need a separate generator. Anthropic's official &lt;a href="https://platform.claude.com/docs/en/agents-and-tools/agent-skills/best-practices" rel="noopener noreferrer"&gt;authoring guide&lt;/a&gt; recommends completing a real task from start to finish in a normal agent session, then asking the agent to extract the repeatable process into a Skill.&lt;/p&gt;

&lt;p&gt;That's a better starting point than inventing a universal Skill from scratch. Real work quickly shows you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;which context you keep repeating;&lt;/li&gt;
&lt;li&gt;where the agent makes the wrong decision;&lt;/li&gt;
&lt;li&gt;what belongs in instructions and what would work better as a script;&lt;/li&gt;
&lt;li&gt;which examples and edge cases you need.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your initial request can be simple:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;prompt to the agent&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Turn the process we just followed into an Agent Skill.
Keep only the required process in SKILL.md.
Move long reference material to references/.
Add examples of requests that should and should not trigger the Skill.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. skill-creator or superpowers:writing-skills
&lt;/h3&gt;

&lt;p&gt;Once you have a draft, you can use the &lt;a href="https://github.com/anthropics/claude-plugins-official/tree/main/plugins/skill-creator" rel="noopener noreferrer"&gt;official skill-creator&lt;/a&gt;. It helps create and edit Skills, build test scenarios, compare results against an initial run without the Skill, and perform a blind A/B comparison of two versions.&lt;/p&gt;

&lt;p&gt;Install it from the official Marketplace:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Claude Code&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/plugin &lt;span class="nb"&gt;install &lt;/span&gt;skill-creator@claude-plugins-official
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After installation, you can ask the agent:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;prompt to the agent&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Evaluate my review-migration Skill using skill-creator.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For creating Skills, I recommend Codex and &lt;a href="https://github.com/obra/superpowers/blob/main/skills/writing-skills/SKILL.md" rel="noopener noreferrer"&gt;superpowers:writing-skills&lt;/a&gt;. Its principle is stricter: first give the agent a real scenario without the Skill and record a specific failure; then write the smallest useful Skill, repeat the same scenario, and check whether its behavior changed. If the agent consistently completes the task correctly without the Skill, a new Skill may have no purpose.&lt;/p&gt;

&lt;p&gt;That's enough for an early version. You don't need a CI system for an instruction you haven't even used twice.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three different kinds of checks
&lt;/h2&gt;

&lt;p&gt;The word "validation" often hides three different questions.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Superpowers:writing-skills&lt;/code&gt; adds a preliminary step: run a scenario without the Skill, put the agent under pressure, and observe how it behaves without extra instructions. This tests the premise itself. If the baseline run already succeeds, the Skill adds nothing; if it fails, you can see the specific behavior you need to change.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Is the structure valid?
&lt;/h3&gt;

&lt;p&gt;For a portable Skill, use the validator for the open specification:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;terminal&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$skills&lt;/span&gt;&lt;span class="nt"&gt;-ref&lt;/span&gt; validate ./review-migration
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It checks the frontmatter and naming rules.&lt;/p&gt;

&lt;p&gt;In Claude Code, you can validate project Skills like this:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;terminal&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$claude&lt;/span&gt; plugin validate .claude/skills
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or validate all user-level customizations:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;terminal&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$claude&lt;/span&gt; plugin validate ~/.claude
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;According to the &lt;a href="https://code.claude.com/docs/en/plugin-marketplaces#validate-a-plugin-or-a-directory-without-a-manifest" rel="noopener noreferrer"&gt;Claude Code documentation&lt;/a&gt;, the validator finds problems with YAML, metadata, and Plugin structure. This checks syntax and schema. A successful result doesn't mean the agent will choose the Skill at the right time.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Does the Skill trigger?
&lt;/h3&gt;

&lt;p&gt;Give this check to &lt;code&gt;superpowers:writing-skills&lt;/code&gt; while creating the Skill. Include real requests that should trigger it and similar-sounding requests that should not. &lt;code&gt;superpowers:writing-skills&lt;/code&gt; will run the scenarios and show whether the agent finds the instructions at the right moment.&lt;/p&gt;

&lt;p&gt;If the Skill doesn't trigger, or triggers when it shouldn't, refine its &lt;code&gt;description&lt;/code&gt; and repeat the check. If it triggers but doesn't help, revisit the main instructions and supporting files.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Did the result improve?
&lt;/h3&gt;

&lt;p&gt;For a Skill packaged as a Plugin, Claude Code has a separate testing tool:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;terminal&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$claude&lt;/span&gt; plugin &lt;span class="nb"&gt;eval &lt;/span&gt;init
&lt;span class="nv"&gt;$claude&lt;/span&gt; plugin &lt;span class="nb"&gt;eval&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://code.claude.com/docs/en/plugin-evals" rel="noopener noreferrer"&gt;Claude plugin eval&lt;/a&gt; runs each scenario in an isolated session several times with and without the Plugin. Graders can check text, tool calls, action order, created files, or criteria assessed by an LLM. The difference between &lt;code&gt;WITH&lt;/code&gt; and &lt;code&gt;W/OUT&lt;/code&gt; shows the Plugin's contribution, rather than just the base model's ability to complete the task.&lt;/p&gt;

&lt;p&gt;This is useful for Skills that a team versions, shares, or uses in a critical process. The runs make real model calls. By default, each scenario runs three times with the Plugin and three times without it, so a suite costs both time and money.&lt;/p&gt;

&lt;p&gt;One detail matters: &lt;code&gt;skill-creator&lt;/code&gt; and &lt;code&gt;claude plugin eval&lt;/code&gt; use different test formats. The former is useful for improving one Skill through a conversation. The latter is better suited to Plugins, regression suites, and CI.&lt;/p&gt;

&lt;h2&gt;
  
  
  What /skill-doctor tells you
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;/skill-doctor&lt;/code&gt; answers a different question: which Skills consume context but are rarely used?&lt;/p&gt;

&lt;p&gt;It shows how much context descriptions occupy, which Skills have never been invoked, and which Plugins haven't been used for a while. That helps remove noise from a large library. But &lt;code&gt;/skill-doctor&lt;/code&gt; doesn't assess instruction quality or replace behavior checks.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to install a Skill in a project
&lt;/h2&gt;

&lt;p&gt;The simplest option is to add it manually:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;terminal&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; .claude/skills/review-migration
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then create &lt;code&gt;.claude/skills/review-migration/SKILL.md&lt;/code&gt; and commit the folder. The Skill will load in sessions for that repository.&lt;/p&gt;

&lt;p&gt;For a personal Skill that you need across all your local projects:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;path&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;~/.claude/skills/review-migration/SKILL.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In a monorepo, you can put a Skill in &lt;code&gt;&amp;lt;package&amp;gt;/.claude/skills/&lt;/code&gt;. It will apply to work in that subtree.&lt;/p&gt;

&lt;p&gt;If a Skill is published in a Git repository and supports the open ecosystem:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;terminal&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$npx&lt;/span&gt; skills add owner/repository &lt;span class="nt"&gt;--skill&lt;/span&gt; review-migration &lt;span class="nt"&gt;-a&lt;/span&gt; claude-code
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add &lt;code&gt;-g&lt;/code&gt; to install it globally instead of in the current project.&lt;/p&gt;

&lt;h2&gt;
  
  
  When you need a Plugin and Marketplace
&lt;/h2&gt;

&lt;p&gt;A standalone Skill works well within one repository. Use a Plugin when you want to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;distribute several Skills as one package;&lt;/li&gt;
&lt;li&gt;add agents, Hooks, or MCP configuration;&lt;/li&gt;
&lt;li&gt;have a namespace such as &lt;code&gt;/database-tools:review-migration&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;version and update the package;&lt;/li&gt;
&lt;li&gt;attach a formal test suite.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A minimal Plugin structure:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;folder structure&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;database-tools/
├── .claude-plugin/
│   └── plugin.json
└── skills/
    └── review-migration/
        └── SKILL.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can test the Plugin locally with:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;terminal&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$claude&lt;/span&gt; &lt;span class="nt"&gt;--plugin-dir&lt;/span&gt; ./database-tools
&lt;span class="nv"&gt;$claude&lt;/span&gt; plugin validate ./database-tools
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To share it, a team can create a private Marketplace, add it at the project level, and install the Plugin from there. The official &lt;a href="https://code.claude.com/docs/en/plugin-marketplaces" rel="noopener noreferrer"&gt;Marketplace documentation&lt;/a&gt; supports a GitHub repository, Git URL, remote &lt;code&gt;marketplace.json&lt;/code&gt;, and local path.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Claude Code&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/plugin marketplace add acme/database-plugins
/plugin &lt;span class="nb"&gt;install &lt;/span&gt;database-tools@acme-database-plugins
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The CLI equivalent supports &lt;code&gt;user&lt;/code&gt;, &lt;code&gt;project&lt;/code&gt;, and &lt;code&gt;local&lt;/code&gt; scopes. At the &lt;code&gt;project&lt;/code&gt; level, configuration is written to the repository so the team shares one Plugin source.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check third-party Skills before installing them
&lt;/h2&gt;

&lt;p&gt;There has never been an easier way for agent instructions to spread widely. One repository and one install command can put someone else's &lt;code&gt;SKILL.md&lt;/code&gt;, scripts, or entire Plugin into hundreds of working environments.&lt;/p&gt;

&lt;p&gt;A Skill gives instructions to an agent with access to files and tools. A Plugin can also contain Hooks, MCP servers, and executable scripts. Popularity in a catalog doesn't automatically make that code safe.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before installing, check:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the contents of &lt;code&gt;SKILL.md&lt;/code&gt; and every reference to &lt;code&gt;scripts/&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;allowed-tools&lt;/code&gt; and shell commands;&lt;/li&gt;
&lt;li&gt;Hooks and MCP configuration inside the Plugin;&lt;/li&gt;
&lt;li&gt;whether the Skill requests secrets, unnecessary permissions, or network access;&lt;/li&gt;
&lt;li&gt;the repository owner, license, change history, and update process.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a team library, pin a reviewed version, run validation in CI, and update Skills as deliberately as you update other dependencies.&lt;/p&gt;

&lt;h2&gt;
  
  
  A practical process without extra infrastructure
&lt;/h2&gt;

&lt;p&gt;For your first Skill:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Complete a real task without the Skill.&lt;/li&gt;
&lt;li&gt;Record the baseline result: exactly where the agent failed or behaved inconsistently.&lt;/li&gt;
&lt;li&gt;Ask the agent to extract the repeatable process.&lt;/li&gt;
&lt;li&gt;Write three requests that should trigger the Skill and three similar but irrelevant requests.&lt;/li&gt;
&lt;li&gt;Put the Skill in &lt;code&gt;.claude/skills&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Validate its structure.&lt;/li&gt;
&lt;li&gt;Repeat the baseline scenario in a new session with the Skill.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For a Skill used by a team:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Add more real scenarios.&lt;/li&gt;
&lt;li&gt;Move unstable steps into deterministic scripts.&lt;/li&gt;
&lt;li&gt;Package the Skill as a Plugin.&lt;/li&gt;
&lt;li&gt;Add &lt;code&gt;claude plugin eval&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Run the suite after Skill changes and after switching to a new model.&lt;/li&gt;
&lt;li&gt;Periodically check &lt;code&gt;/skill-doctor&lt;/code&gt; and disable what you don't use.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The main mistake: testing the file instead of behavior
&lt;/h2&gt;

&lt;p&gt;The weakest success criterion is: "The agent read the Skill, and its answer looks fine."&lt;/p&gt;

&lt;p&gt;Better questions are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Did the Skill trigger without its name being mentioned?&lt;/li&gt;
&lt;li&gt;Did it stay quiet for a similar but irrelevant request?&lt;/li&gt;
&lt;li&gt;Did it improve the result compared with the baseline run?&lt;/li&gt;
&lt;li&gt;Did it reduce repeated explanations?&lt;/li&gt;
&lt;li&gt;Can you reproduce the result in a new session?&lt;/li&gt;
&lt;li&gt;Does the new version fix a specific failure without breaking existing scenarios?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A Skill isn't a document you write once and polish. It's an executable part of the agent workflow. Treat it like code: keep it short, test it on real scenarios, version it, and don't confuse valid syntax with the right behavior.&lt;/p&gt;

&lt;p&gt;Try it in practice. We've published a set of Agent Skills for generating effective unit tests. Install it in your project and try it on real code.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/mavka-ai/unit-tests-skills" rel="noopener noreferrer"&gt;Try the unit testing Skills&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the next article, I'll show how we tested these Skills, what baseline we compared them with, and what we found during testing.&lt;/p&gt;

&lt;p&gt;Sources:&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 — Extend Claude with skills&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.claude.com/docs/en/plugin-evals" rel="noopener noreferrer"&gt;Claude Code — Test plugins with evals&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.claude.com/docs/en/plugins" rel="noopener noreferrer"&gt;Claude Code — Create plugins&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.claude.com/docs/en/plugin-marketplaces" rel="noopener noreferrer"&gt;Claude Code — Plugin marketplaces&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;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://platform.claude.com/docs/en/agents-and-tools/tool-use/manage-tool-context" rel="noopener noreferrer"&gt;Anthropic — Manage tool context&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/anthropics/claude-plugins-official/tree/main/plugins/skill-creator" rel="noopener noreferrer"&gt;Anthropic — skill-creator&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/obra/superpowers/blob/main/skills/writing-skills/SKILL.md" rel="noopener noreferrer"&gt;Superpowers — writing-skills&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/vercel-labs/skills" rel="noopener noreferrer"&gt;Vercel Labs — skills CLI&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Originally published on &lt;a href="https://mavka.ai/blog/how-to-create-test-install-claude-skills" rel="noopener noreferrer"&gt;Mavka&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>claude</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Unit tests aren't useless. Bad unit tests are.</title>
      <dc:creator>Maksym Danylenko</dc:creator>
      <pubDate>Tue, 29 Sep 2026 13:34:29 +0000</pubDate>
      <link>https://dev.to/maxpaint/unit-tests-arent-useless-bad-unit-tests-are-2ka6</link>
      <guid>https://dev.to/maxpaint/unit-tests-arent-useless-bad-unit-tests-are-2ka6</guid>
      <description>&lt;p&gt;"Unit tests are worse than useless" got 327K views on X last week:&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-2102743849106014578-915" src="https://platform.twitter.com/embed/Tweet.html?id=2102743849106014578"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-2102743849106014578-915');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=2102743849106014578&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;I get it. Most AI-written unit tests restate the code, always pass, and catch nothing. They break on every refactor and never find a real bug.&lt;/p&gt;

&lt;p&gt;But the problem is bad tests, not unit tests.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb9nkgh320shq3jy5nlg3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb9nkgh320shq3jy5nlg3.png" alt="77% of production failures can be reproduced by a unit test" width="800" height="573"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A study of 198 production failures in Cassandra, HBase, HDFS, MapReduce and Redis (&lt;a href="https://www.usenix.org/system/files/conference/osdi14/osdi14-paper-yuan.pdf" rel="noopener noreferrer"&gt;Yuan et al., OSDI '14&lt;/a&gt;) found that 77% could be reproduced by a unit test. Dropping unit tests for E2E-only throws that away.&lt;/p&gt;

&lt;p&gt;You can let the agent write junk tests and then pay again to delete them. Or teach it to write tests that catch bugs from the start. We use unit tests skills for this: rules the agent loads when it writes tests.&lt;/p&gt;

&lt;p&gt;Here are the ones we built: &lt;a href="https://github.com/mavka-ai/unit-tests-skills" rel="noopener noreferrer"&gt;https://github.com/mavka-ai/unit-tests-skills&lt;/a&gt;&lt;/p&gt;

</description>
      <category>testing</category>
      <category>ai</category>
      <category>unittesting</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
