<?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: shadman Shaikh</title>
    <description>The latest articles on DEV Community by shadman Shaikh (@shadmanshaikh).</description>
    <link>https://dev.to/shadmanshaikh</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%2F439816%2Fba4e742d-319a-4294-a081-20f8b1006a61.jpeg</url>
      <title>DEV Community: shadman Shaikh</title>
      <link>https://dev.to/shadmanshaikh</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/shadmanshaikh"/>
    <language>en</language>
    <item>
      <title>I Built a Laravel Package So Your AI Agents Can Install "Skills" Like Plugins</title>
      <dc:creator>shadman Shaikh</dc:creator>
      <pubDate>Wed, 05 Aug 2026 08:54:14 +0000</pubDate>
      <link>https://dev.to/shadmanshaikh/i-built-a-laravel-package-so-your-ai-agents-can-install-skills-like-plugins-4c8e</link>
      <guid>https://dev.to/shadmanshaikh/i-built-a-laravel-package-so-your-ai-agents-can-install-skills-like-plugins-4c8e</guid>
      <description>&lt;h1&gt;
  
  
  Your AI Agents Need Plugins Too. Here's How I Gave Them One.
&lt;/h1&gt;

&lt;p&gt;If you've spent any time building with AI agents lately, you've probably run into this exact wall: your agent is smart, but it doesn't &lt;em&gt;know things&lt;/em&gt; it should know. Your Laravel Livewire conventions. Your team's component library. The exact patterns your codebase expects. So you paste the same context into every prompt, over and over, and it still doesn't quite stick.&lt;/p&gt;

&lt;p&gt;That annoyance is what pushed me to build &lt;strong&gt;&lt;a href="https://github.com/shadmanshaikh/laravel-skills" rel="noopener noreferrer"&gt;Laravel Skills&lt;/a&gt;&lt;/strong&gt; — a small, focused package that lets you install, list, and uninstall "skills" for your AI agents, straight from your Laravel app, the same way you'd manage a Composer dependency.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wait, What's a "Skill"?
&lt;/h2&gt;

&lt;p&gt;Think of a skill as a portable knowledge package for an agent — a Git repo containing documentation, patterns, and reference material an AI coding assistant can pull in and actually use. Instead of re-explaining your UI library or your API conventions in every session, you package that knowledge once, put it in a repo, and let your agent install it.&lt;/p&gt;

&lt;p&gt;A skill is nothing exotic. It's just a Git repository with one required file at its root:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"example-skill"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"provider"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"anthropic"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Everything else — docs, guides, reference material, even a service provider — is entirely up to you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Show, Don't Tell
&lt;/h2&gt;

&lt;p&gt;Here's the whole workflow, end to end:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;composer require shadman/laravel-skills

php artisan skill:install https://github.com/shadmanshaikh/mary-ui-skill.git
php artisan skill:list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;+---------------+-------+-------------------------------------+
| Name          | Valid | Path                                |
+---------------+-------+-------------------------------------+
| mary-ui-skill | Yes   | /app/.agents/skills/mary-ui-skill   |
+---------------+-------+-------------------------------------+
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. The skill is cloned, validated against its manifest, and sitting in &lt;code&gt;.agents/skills/&lt;/code&gt;, ready for your agent (or your own tooling) to read.&lt;/p&gt;

&lt;p&gt;Uninstalling is just as simple:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;php artisan skill:uninstall mary-ui-skill &lt;span class="nt"&gt;--force&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  It's Just as Easy to Drive Programmatically
&lt;/h2&gt;

&lt;p&gt;If you want to build your own tooling on top of it — say, an internal dashboard for managing which skills are installed across projects — the &lt;code&gt;SkillManager&lt;/code&gt; is a plain singleton you can resolve from the container:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Shadman\LaravelSkills\Managers\SkillManager&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nv"&gt;$manager&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;app&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;SkillManager&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nv"&gt;$skill&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$manager&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;install&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'https://github.com/user/example-skill.git'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// ['name' =&amp;gt; 'example-skill', 'path' =&amp;gt; '/app/.agents/skills/example-skill']&lt;/span&gt;

&lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$manager&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="k"&gt;list&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nv"&gt;$skill&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$skill&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'name'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="nv"&gt;$skill&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'valid'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="nv"&gt;$skill&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'manifest'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt; &lt;span class="c1"&gt;// the whole decoded skill.json — your custom keys included&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every extra key you add to &lt;code&gt;skill.json&lt;/code&gt; — &lt;code&gt;version&lt;/code&gt;, &lt;code&gt;description&lt;/code&gt;, &lt;code&gt;triggers&lt;/code&gt;, whatever your workflow needs — comes back untouched in &lt;code&gt;list()&lt;/code&gt;. The package doesn't opinionate on what a skill &lt;em&gt;contains&lt;/em&gt;, only that it exists and is valid.&lt;/p&gt;

&lt;h2&gt;
  
  
  Built for the "Don't Trust Random URLs" Reality
&lt;/h2&gt;

&lt;p&gt;Because this package's whole job is running &lt;code&gt;git clone&lt;/code&gt; on a URL someone hands it, I treated security as a first-class concern, not an afterthought:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Transport is locked down&lt;/strong&gt; to &lt;code&gt;https://&lt;/code&gt; and &lt;code&gt;git@&lt;/code&gt; only — no &lt;code&gt;ext::&lt;/code&gt; transport, no shell-injection-via-git-protocol tricks, and no arguments starting with &lt;code&gt;-&lt;/code&gt; that git might mistake for flags.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Skill names are sanitized&lt;/strong&gt; to &lt;code&gt;[A-Za-z0-9._-]+&lt;/code&gt;, so a malicious repo URL can't path-traverse its way outside your configured skills directory.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Failed installs clean up after themselves.&lt;/strong&gt; If a clone times out or the manifest is invalid, the half-installed directory is removed before an exception ever reaches you.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's worth saying plainly: this package clones and validates skills, but it doesn't execute or autoload them for you. There's no signature verification. Treat every skill like any other third-party dependency — &lt;strong&gt;only install from sources you trust.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Configuration Stays Out of Your Way
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// config/skills.php&lt;/span&gt;
&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="s1"&gt;'path'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;base_path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'.agents/skills'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="s1"&gt;'clone_timeout'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;120&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two options, sensible defaults, publish the config only if you actually need to change something.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I Built This
&lt;/h2&gt;

&lt;p&gt;I'm a full-stack developer moving deeper into AI agent tooling, and one pattern kept repeating: agent context is either baked into a giant system prompt (fragile, unmaintainable) or scattered across docs nobody re-reads (useless). Skills-as-git-repos gives you something in between — versioned, installable, shareable knowledge packages that live alongside your code instead of inside a prompt you keep re-pasting.&lt;/p&gt;

&lt;p&gt;If you're building agent-powered tooling in Laravel and you're tired of copy-pasting the same context into every session, give it a spin:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://github.com/shadmanshaikh/laravel-skills" rel="noopener noreferrer"&gt;github.com/shadmanshaikh/laravel-skills&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It's MIT-licensed, PHP 8.2+, works with Laravel 11/12/13, and PRs are welcome. If you build a skill of your own, I'd love to see it.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Found a bug or have an idea for the package? Open an issue on GitHub — or drop a comment below, I'd love to hear what skills you'd want to build first.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>laravel</category>
      <category>php</category>
      <category>ai</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
