<?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: moriwo-dev-ai</title>
    <description>The latest articles on DEV Community by moriwo-dev-ai (@moriwodevai).</description>
    <link>https://dev.to/moriwodevai</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%2F4043550%2Fe08b8e19-09bf-48d3-87ee-1f25d5c86e19.png</url>
      <title>DEV Community: moriwo-dev-ai</title>
      <link>https://dev.to/moriwodevai</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/moriwodevai"/>
    <language>en</language>
    <item>
      <title>I made my desktop agent speak SKILL.md — now it can eat the whole skills ecosystem</title>
      <dc:creator>moriwo-dev-ai</dc:creator>
      <pubDate>Sat, 25 Jul 2026 00:59:28 +0000</pubDate>
      <link>https://dev.to/moriwodevai/i-made-my-desktop-agent-speak-skillmd-now-it-can-eat-the-whole-skills-ecosystem-506k</link>
      <guid>https://dev.to/moriwodevai/i-made-my-desktop-agent-speak-skillmd-now-it-can-eat-the-whole-skills-ecosystem-506k</guid>
      <description>&lt;p&gt;Last week I wrote about &lt;a href="https://github.com/moriwo-dev-ai/ama-teras" rel="noopener noreferrer"&gt;AMA-teras&lt;/a&gt;, a desktop AI agent that writes its own tools behind verification gates. This week it learned to speak &lt;strong&gt;SKILL.md&lt;/strong&gt; — the open standard for agent skills — in both directions. Here's what that means, why I think it matters more than any single feature, and the implementation details that surprised me.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 30-second context
&lt;/h2&gt;

&lt;p&gt;SKILL.md started as an internal format and became an open standard that 30+ coding agents now support — Claude Code, Codex CLI, Cursor, Gemini CLI, and the rest. A skill is just a folder:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;my-skill/
 SKILL.md # frontmatter (name, description) + instructions
 templates/… # optional resources
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The clever part is &lt;em&gt;progressive disclosure&lt;/em&gt;: the agent only reads the one-line description until a task actually needs the skill — then it loads the full instructions. Your context window stays clean; your agent still has a library card.&lt;/p&gt;

&lt;p&gt;There are now community collections with 1,000+ skills. That's a lot of packaged expertise that, until this week, my agent couldn't touch.&lt;/p&gt;

&lt;h2&gt;
  
  
  Consuming: two tools, ~150 lines
&lt;/h2&gt;

&lt;p&gt;The consuming side turned out to be almost embarrassingly small. Two tools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;skill_list&lt;/code&gt; — walks the skill directories, parses frontmatter, returns &lt;code&gt;name: description&lt;/code&gt; lines only&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;skill_use {name}&lt;/code&gt; — returns the full SKILL.md body for one skill&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Directories, in priority order: skills bundled with the app, then &lt;code&gt;userData/skills/&lt;/code&gt; where users drop anything from the ecosystem. Same-name conflicts? &lt;strong&gt;Bundled wins.&lt;/strong&gt; That mirrors how our plugin loader already works — a user-installed artifact must never silently replace a built-in one. It's a small rule that closes a real attack: drop a folder called &lt;code&gt;security-review&lt;/code&gt; that says "skip all the checks" and wait for the agent to load it.&lt;/p&gt;

&lt;p&gt;Two implementation notes that earn their keep:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Path traversal dies at the name check, not at the filesystem.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;NAME_RE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sr"&gt;/^&lt;/span&gt;&lt;span class="se"&gt;[&lt;/span&gt;&lt;span class="sr"&gt;a-z0-9&lt;/span&gt;&lt;span class="se"&gt;][&lt;/span&gt;&lt;span class="sr"&gt;a-z0-9_-&lt;/span&gt;&lt;span class="se"&gt;]{0,63}&lt;/span&gt;&lt;span class="sr"&gt;$/i&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The skill name is the only user-controlled path segment, and it never gets to contain &lt;code&gt;..&lt;/code&gt;, &lt;code&gt;/&lt;/code&gt;, or &lt;code&gt;\&lt;/code&gt;. Validating the &lt;em&gt;shape&lt;/em&gt; before touching &lt;code&gt;fs&lt;/code&gt; is simpler and stricter than normalizing paths after the fact.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. The tool description is the real UX.&lt;/strong&gt; The agent decides whether to call &lt;code&gt;skill_use&lt;/code&gt; by reading &lt;code&gt;skill_list&lt;/code&gt;'s output. So the list deliberately returns &lt;em&gt;only&lt;/em&gt; names and one-liners — if it returned full bodies, we'd have paid the context cost of every skill to use one. The standard's progressive-disclosure idea survives only if your tools respect it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Producing: the other direction is where it gets interesting
&lt;/h2&gt;

&lt;p&gt;AMA-teras already had a self-evolution pipeline: when the agent lacks a capability, it writes a new tool for itself, which then has to pass &lt;strong&gt;typecheck → unit tests → a real smoke run → human approval&lt;/strong&gt; before it's allowed to load. (I wrote about why after watching my own agent claim success on things that didn't work.)&lt;/p&gt;

&lt;p&gt;Now every tool that survives those gates can be exported as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;exported-tool/
 SKILL.md # description + how to run + verification evidence
 run.mjs # esbuild-bundled, self-contained runner
 gate.json # the actual gate results: what passed, when, code hash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;node run.mjs '{"numbers":[1,2,39]}'&lt;/code&gt; works on any machine with Node — no AMA-teras required. The SKILL.md says, honestly, which gates the code passed and when. If there's no evidence, it says that instead.&lt;/p&gt;

&lt;p&gt;The test for this feature doesn't mock anything: it bundles a real plugin, executes &lt;code&gt;run.mjs&lt;/code&gt; with the real Node binary, and asserts on stdout. If the export format rots, CI catches it — because the worst possible outcome for a "portable" format is shipping bundles that only work on the author's machine.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why bother with a standard at all?
&lt;/h2&gt;

&lt;p&gt;Because the alternative is the thing I built this project to escape.&lt;/p&gt;

&lt;p&gt;Every major vendor ships an agent SDK, and every SDK quietly assumes your tools, your memory, your workflows live inside &lt;em&gt;their&lt;/em&gt; runtime. Skills-as-folders is the opposite bet: expertise as plain files, readable by anything, owned by whoever wrote them. My agent can now use skills written for Claude Code; tools born inside my agent can serve someone using Codex. Neither side asked a vendor for permission.&lt;/p&gt;

&lt;p&gt;For a solo open-source project, adopting the standard also beats inventing one for a more selfish reason: I get the ecosystem's growth for free, and the ecosystem gets one more independent implementation keeping the standard honest.&lt;/p&gt;

&lt;h2&gt;
  
  
  What shipped
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;skill_list&lt;/code&gt; / &lt;code&gt;skill_use&lt;/code&gt; with 20 bundled skills (TDD discipline, security review, frontend design, Playwright E2E, pdf/docx/xlsx/pptx handling, …) — all original write-ups&lt;/li&gt;
&lt;li&gt;Export of gate-verified tools as SKILL.md + runnable bundle + evidence&lt;/li&gt;
&lt;li&gt;English UI (staged rollout) and experimental mac/linux builds, because a vendor-independence pitch rings hollow if the app itself is Windows-and-Japanese-only&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's AGPL, it runs on your machine, and it swaps between Anthropic / OpenAI / open-weight models with a config change: &lt;a href="https://github.com/moriwo-dev-ai/ama-teras" rel="noopener noreferrer"&gt;github.com/moriwo-dev-ai/ama-teras&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you maintain skills for any agent — I'd genuinely like to know what breaks when you drop them into a different runtime. That interop friction is the most useful bug report there is.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>electron</category>
      <category>typescript</category>
    </item>
    <item>
      <title>I built a desktop AI agent that writes its own tools — behind verification gates</title>
      <dc:creator>moriwo-dev-ai</dc:creator>
      <pubDate>Thu, 23 Jul 2026 10:02:47 +0000</pubDate>
      <link>https://dev.to/moriwodevai/i-built-a-desktop-ai-agent-that-writes-its-own-tools-behind-verification-gates-2jfl</link>
      <guid>https://dev.to/moriwodevai/i-built-a-desktop-ai-agent-that-writes-its-own-tools-behind-verification-gates-2jfl</guid>
      <description>&lt;p&gt;&lt;em&gt;A desktop AI agent that writes its own tools — and why every line passes a gate before it runs.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The itch
&lt;/h2&gt;

&lt;p&gt;Agent capability is quietly becoming synonymous with a specific vendor's pricing plan. I wanted the opposite: an agent that runs on my machine, where models are swappable parts (Anthropic / OpenAI / Moonshot, or free-tier OpenAI-compatible APIs), and where the tools it writes stay on my PC as my assets.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;AMA-teras&lt;/strong&gt; (AGPL, Electron + TypeScript): a desktop agent that, when it hits a capability it lacks, writes a new tool plugin for itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  The scary part, handled first
&lt;/h2&gt;

&lt;p&gt;"Self-evolving" sounds like a horror story, so the pipeline is the product:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Generation happens in an &lt;strong&gt;isolated git worktree&lt;/strong&gt; — the running app is never touched&lt;/li&gt;
&lt;li&gt;The generated tool must pass &lt;strong&gt;typecheck → real unit tests → a smoke run&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Then a human reads the full diff and &lt;strong&gt;approves or rejects&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Promotion is a git tag; failed health checks &lt;strong&gt;auto-rollback&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;The agent cannot modify its own approval mechanism or evolution engine (protected paths are enforced by a tripwire gate)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Nothing ships unreviewed — including code it wrote for itself, and anything imported from the community registry (shared plugins carry a verification-evidence record; audits elsewhere report 12–20% of marketplace skills are malicious, so evidence-or-nothing felt right).&lt;/p&gt;

&lt;h2&gt;
  
  
  What it can actually do
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Ask for a feature in chat ("I want a YAML→JSON tool") → it plans, writes the plugin + tests, runs the gates, asks for approval, and the tool is usable immediately&lt;/li&gt;
&lt;li&gt;Approve everything from your phone (worktree promotion, publishing, even Bluesky posts go through the same approval gate)&lt;/li&gt;
&lt;li&gt;Nightly autonomous mode stacks its work on a separate branch for morning review — main is never touched unattended&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Honest limitations
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Windows installer only today (source build elsewhere is untested)&lt;/li&gt;
&lt;li&gt;The installer is unsigned (SmartScreen warning)&lt;/li&gt;
&lt;li&gt;Self-evolution is deliberately scoped to tool plugins, not the core&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A large part of this app was built by the agent itself, under the same gates. The failure stories are documented in the repo — including the night it deleted its own work branch and we had to rebuild two tools from scratch (that incident is why nightly work now auto-backs-up to a private remote).&lt;/p&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/moriwo-dev-ai/ama-teras" rel="noopener noreferrer"&gt;https://github.com/moriwo-dev-ai/ama-teras&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Feedback very welcome, especially on the safety model.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>electron</category>
      <category>typescript</category>
    </item>
  </channel>
</rss>
