<?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: Eduardo Pittol</title>
    <description>The latest articles on DEV Community by Eduardo Pittol (@edpittol).</description>
    <link>https://dev.to/edpittol</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3881058%2F17f670b3-e8eb-4e4e-b7ad-128c71b6e970.jpeg</url>
      <title>DEV Community: Eduardo Pittol</title>
      <link>https://dev.to/edpittol</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/edpittol"/>
    <language>en</language>
    <item>
      <title>Stop your team from rebuilding the same AI skills: a shared catalog that maintains itself</title>
      <dc:creator>Eduardo Pittol</dc:creator>
      <pubDate>Sun, 14 Jun 2026 18:39:06 +0000</pubDate>
      <link>https://dev.to/edpittol/stop-your-team-from-rebuilding-the-same-ai-skills-a-shared-catalog-that-maintains-itself-35l5</link>
      <guid>https://dev.to/edpittol/stop-your-team-from-rebuilding-the-same-ai-skills-a-shared-catalog-that-maintains-itself-35l5</guid>
      <description>&lt;p&gt;If your team has started using skills for AI coding agents, you've probably hit this already: someone uses an existing skill or builds one to run the test suite a certain way. Two weeks later, someone else does it &lt;em&gt;their own&lt;/em&gt; way for the same job — different steps, different conventions, a different result — because they had no idea the first one existed. Now the agent does the "same" task one way on your machine and another way on theirs.&lt;/p&gt;

&lt;p&gt;That's the part that actually hurts. It isn't just the wasted hour rebuilding something that already existed (though that adds up). It's that the team quietly drifts into a dozen slightly different ways of solving the &lt;em&gt;same&lt;/em&gt; problem — inconsistent results, no shared standard, and no single place to fix anything when it breaks. Multiply it across a few people and a few months, and "skills" stops being leverage and starts being entropy.&lt;/p&gt;

&lt;p&gt;I ran into exactly this. The fix wasn't more discipline — it was a shared catalog that's so easy to contribute to that nobody has an excuse not to — and the whole team reaches for &lt;em&gt;one&lt;/em&gt; skill instead of each rolling their own. The trick that made it stick: a skill whose only job is to add other skills to the catalog. This post is how that works, and how to build your own.&lt;/p&gt;

&lt;h2&gt;
  
  
  The idea: one catalog, one source of truth
&lt;/h2&gt;

&lt;p&gt;The catalog is a single repo. Skills live under &lt;code&gt;skills/&amp;lt;category&amp;gt;/&lt;/code&gt;, where the categories are deliberately boring:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;engineering&lt;/strong&gt; — development, testing, code review, automation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;productivity&lt;/strong&gt; — organization, writing, planning, day-to-day workflows&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;misc&lt;/strong&gt; — everything else&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At the root there's a master table — one row per skill, with its category and a link back to the source it came from. That table is the single source of truth for what the team has. New teammate? Point them at the table. Wondering if a skill already exists? Check the table before you build.&lt;/p&gt;

&lt;p&gt;And here's the payoff that's easy to miss: when everyone reaches for the &lt;em&gt;same&lt;/em&gt; skill, the catalog becomes a feedback loop. Someone hits a rough edge — a flaky step, a missing case, a prompt the agent keeps misreading — and they fix it in that one canonical skill. The fix lands for the whole team at once. Troubleshooting stops being something each person quietly redoes in private and starts &lt;em&gt;accumulating&lt;/em&gt;: a shared skill gets sharper every time anyone uses it. Twelve private copies just stay broken in twelve different ways.&lt;/p&gt;

&lt;p&gt;It's a nice idea. It also rots the instant adding a skill becomes a chore.&lt;/p&gt;

&lt;h2&gt;
  
  
  The catch: cataloging by hand is exactly the friction that kills it
&lt;/h2&gt;

&lt;p&gt;Look at what "just add it to the catalog" actually means by hand:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Pick the right category and copy the folder into &lt;code&gt;skills/&amp;lt;category&amp;gt;/&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Write an entry in that category's README — in the right alphabetical spot.&lt;/li&gt;
&lt;li&gt;Resolve a permalink back to the source: the upstream repo URL, the &lt;code&gt;org/repo&lt;/code&gt;, and the exact commit hash.&lt;/li&gt;
&lt;li&gt;Regenerate the master table at the root, re-sorted alphabetically, without breaking the existing rows.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Nobody wants to do that after every skill. So they don't — and the catalog drifts out of date until it's useless. The friction is the failure mode.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fix: a skill that catalogs skills
&lt;/h2&gt;

&lt;p&gt;So I made the bookkeeping itself a skill: &lt;code&gt;catalog-a-skill&lt;/code&gt;. You point it at a skill folder and it does all four steps. Here's the abridged &lt;code&gt;SKILL.md&lt;/code&gt;:&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;catalog-a-skill&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;Catalogs&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;an&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;existing&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;skill&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;into&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;this&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;repo's&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;category&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;structure.&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;skill&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;folder&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;with&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;valid&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;SKILL.md&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;already&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;exists&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;needs&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;to&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;be&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;added&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;to&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;the&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;catalog."&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

&lt;span class="gh"&gt;# Catalog a Skill&lt;/span&gt;

&lt;span class="gu"&gt;## Workflow&lt;/span&gt;

&lt;span class="gu"&gt;### 1. Read the skill&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Read &lt;span class="sb"&gt;`&amp;lt;skill-dir&amp;gt;/SKILL.md`&lt;/span&gt; and extract &lt;span class="sb"&gt;`name`&lt;/span&gt; and &lt;span class="sb"&gt;`description`&lt;/span&gt;.
&lt;span class="p"&gt;-&lt;/span&gt; Gate check 1 — missing frontmatter.
&lt;span class="p"&gt;-&lt;/span&gt; Gate check 2 — folder name ≠ frontmatter &lt;span class="sb"&gt;`name`&lt;/span&gt;.

&lt;span class="gu"&gt;### 2. Choose the category&lt;/span&gt;
Pick engineering / productivity / misc from the description.

&lt;span class="gu"&gt;### 3. Position the skill&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Copy to &lt;span class="sb"&gt;`skills/&amp;lt;category&amp;gt;/&amp;lt;skill-name&amp;gt;/`&lt;/span&gt;.
&lt;span class="p"&gt;-&lt;/span&gt; Resolve the upstream reference from the SOURCE repo:
  commit hash (&lt;span class="sb"&gt;`git rev-parse HEAD`&lt;/span&gt;), remote URL, and &lt;span class="sb"&gt;`org/repo`&lt;/span&gt;.

&lt;span class="gu"&gt;### 4. Update the category README&lt;/span&gt;
Insert a section at its alphabetical position.

&lt;span class="gu"&gt;### 5. Regenerate the master table&lt;/span&gt;
One row per skill, sorted by name, with a permalink to the source commit.

&lt;span class="gu"&gt;### 6. Verify&lt;/span&gt;
Run &lt;span class="sb"&gt;`npx skills list`&lt;/span&gt; and confirm the skill appears.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The whole point: the contributor does the &lt;em&gt;fun&lt;/em&gt; part (writing a useful skill) and hands the &lt;em&gt;tedious, rule-bound&lt;/em&gt; part to the agent. That's the kind of work agents are genuinely good at — deterministic, fiddly, easy to get subtly wrong by hand.&lt;/p&gt;

&lt;h3&gt;
  
  
  The part that makes it trustworthy: it refuses to do the wrong thing
&lt;/h3&gt;

&lt;p&gt;A naive version would happily corrupt the catalog. The real value is in the gates — the cases where it &lt;em&gt;stops&lt;/em&gt; instead of cataloging:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Missing frontmatter.&lt;/strong&gt; If &lt;code&gt;name&lt;/code&gt; or &lt;code&gt;description&lt;/code&gt; is absent, it copies the skill into &lt;code&gt;misc&lt;/code&gt; but does &lt;strong&gt;not&lt;/strong&gt; touch the README or the master table. Then it tells you exactly which field is missing. A broken skill never silently pollutes the source of truth.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Name divergence.&lt;/strong&gt; If the folder is named &lt;code&gt;foo&lt;/code&gt; but the frontmatter says &lt;code&gt;name: bar&lt;/code&gt;, that's a red flag — it copies under the original folder name, refuses to catalog, and reports the mismatch.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That "refuse and report" behavior is what turns a convenient script into something a team can trust to run on its catalog.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to build your own
&lt;/h2&gt;

&lt;p&gt;You don't need my repo — you need the pattern. To replicate it:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Make the catalog repo.&lt;/strong&gt; &lt;code&gt;skills/&amp;lt;category&amp;gt;/&lt;/code&gt; directories, a root README with a master table, one README per category. Keep the categories few and obvious.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Decide your source of truth.&lt;/strong&gt; I use the root table; the rule is "if it's not in the table, it doesn't exist." Pick yours and make it explicit.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Write the meta-skill.&lt;/strong&gt; Encode the four steps above as a &lt;code&gt;SKILL.md&lt;/code&gt;. The non-obvious work is the bookkeeping rules: alphabetical insertion, permalink resolution from the &lt;em&gt;source&lt;/em&gt; repo's git remote and commit, and consistent table regeneration.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Add the gates.&lt;/strong&gt; Decide what "invalid" means for you (missing fields, name mismatch, wrong structure) and make the skill &lt;em&gt;refuse and report&lt;/em&gt; instead of pushing bad entries.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lower the barrier to zero.&lt;/strong&gt; The whole bet is that a catalog survives only when contributing costs nothing. The meta-skill is what buys that.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's it. The catalog stays current because keeping it current is now a single command, not a chore — and the team stops rebuilding skills it already has.&lt;/p&gt;

&lt;p&gt;The full working version, gate cases and all, is here: &lt;strong&gt;&lt;a href="https://github.com/edpittol/skills" rel="noopener noreferrer"&gt;github.com/edpittol/skills&lt;/a&gt;&lt;/strong&gt;. Take it apart, adapt the categories and rules to your team, and let your agent keep the books.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>claude</category>
      <category>devtools</category>
    </item>
  </channel>
</rss>
