<?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: Geordano Polanco</title>
    <description>The latest articles on DEV Community by Geordano Polanco (@gpolanco).</description>
    <link>https://dev.to/gpolanco</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%2F740583%2Fc51947e7-2a84-404d-9190-5edcc633a83c.jpeg</url>
      <title>DEV Community: Geordano Polanco</title>
      <link>https://dev.to/gpolanco</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/gpolanco"/>
    <language>en</language>
    <item>
      <title>I had two projects solving the same problem. I merged them and published to npm in a day</title>
      <dc:creator>Geordano Polanco</dc:creator>
      <pubDate>Sat, 07 Feb 2026 20:06:41 +0000</pubDate>
      <link>https://dev.to/gpolanco/stop-duplicating-rules-manage-agentic-editors-with-one-cli-20j6</link>
      <guid>https://dev.to/gpolanco/stop-duplicating-rules-manage-agentic-editors-with-one-cli-20j6</guid>
      <description>&lt;p&gt;I've been going back and forth on the same problem for months: how to manage the context rules you give AI coding tools. If you use Claude Code, you write a &lt;code&gt;CLAUDE.md&lt;/code&gt;. If you use Cursor, a &lt;code&gt;.cursor/rules&lt;/code&gt;. If you use Gemini CLI, a &lt;code&gt;GEMINI.md&lt;/code&gt;. If you use all three — like I do — you have the same content in three different places, with three slightly different formats, and the certainty that at some point they'll get out of sync.&lt;/p&gt;

&lt;p&gt;The problem is real. The solution took me longer to find than it should have.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two projects, zero products
&lt;/h2&gt;

&lt;p&gt;For weeks I was working on two things in parallel:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DevContext AI&lt;/strong&gt; was a webapp. It had an MCP server, rule versioning, a Supabase database, auth, Vercel deploy. It was functional. It was deployed. It had an MVP. And nobody used it, starting with me, because it was too much for what I actually needed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;dev-workflows&lt;/strong&gt; was a CLI. The idea was simpler: define rules in YAML, compile for each editor. But it only existed as documentation. Folders of docs, specs, architecture diagrams, documented decisions. Zero code.&lt;/p&gt;

&lt;p&gt;One project with too much code and no focus. Another with too many documents and nothing executable. Both solving exactly the same thing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Documentation paralysis
&lt;/h2&gt;

&lt;p&gt;I have to be honest about something: I got stuck documenting. I had a &lt;code&gt;VISION_GENERAL.md&lt;/code&gt;, an &lt;code&gt;ARCHITECTURE.md&lt;/code&gt;, a &lt;code&gt;ROADMAP.md&lt;/code&gt;, a &lt;code&gt;DECISIONS.md&lt;/code&gt;, and a &lt;code&gt;CLI_SPEC.md&lt;/code&gt;. Five documents for a CLI that didn't exist.&lt;/p&gt;

&lt;p&gt;The documentation felt productive. I was "making progress." But I was really just putting off the moment of writing the first line of code. It's a trap I think more of us fall into than we'd like to admit.&lt;/p&gt;

&lt;p&gt;The clarity came when I realized that if I couldn't explain what I was building in a paragraph, the problem wasn't lack of documentation — it was lack of clarity.&lt;/p&gt;

&lt;h2&gt;
  
  
  The merge
&lt;/h2&gt;

&lt;p&gt;I decided to keep one. The CLI won for several reasons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The underlying problem (duplicated rules across editors) is structural. It's not going away soon — each editor uses its own format.&lt;/li&gt;
&lt;li&gt;A webapp competes with native editor features. A CLI complements them.&lt;/li&gt;
&lt;li&gt;Validating a CLI is immediate: if it works on your project, it works. A webapp needs users, onboarding, retention.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The webapp doesn't get thrown away. The infrastructure (MCP, Supabase, versioning) becomes the future Pro tier. But that doesn't matter now. What matters now is having something that works and that someone can install.&lt;/p&gt;

&lt;p&gt;I cut the five documents down to two: &lt;code&gt;CLI_SPEC.md&lt;/code&gt; (the implementation contract) and &lt;code&gt;DECISIONS.md&lt;/code&gt; (decision log). Everything else got deleted.&lt;/p&gt;

&lt;h2&gt;
  
  
  One day with Claude Code
&lt;/h2&gt;

&lt;p&gt;This is where it gets interesting. With a clear spec, I handed the document to Claude Code and started building.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sprint 1 — Core (morning)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I told it to scaffold the CLI: package.json, tsconfig, commander with commands registered as stubs. Done in minutes. Then the logic for &lt;code&gt;devw init&lt;/code&gt; — tool detection, interactive prompts, &lt;code&gt;.dwf/&lt;/code&gt; structure generation. Worked on the first try.&lt;/p&gt;

&lt;p&gt;Then &lt;code&gt;devw compile&lt;/code&gt; — the heart of the product. A parser that reads the YAML files, three bridges (Claude, Cursor, Gemini) that translate to native format. Each bridge is one file. And &lt;code&gt;devw doctor&lt;/code&gt; to validate everything is in order.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sprint 2 — Blocks (noon)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Pre-baked block system: &lt;code&gt;devw add typescript-strict&lt;/code&gt; installs strict TypeScript rules into your YAML files. Registry, installer, 6 content blocks, add/remove/list commands. 17 tests.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sprint 3 — Ship (afternoon)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;README, npm config, CI with GitHub Actions, changesets for automated releases. And the dogfooding: using dev-workflows on the dev-workflows repo itself.&lt;/p&gt;

&lt;p&gt;The dogfooding was the most valuable part. I found three bugs the tests didn't catch:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;devw compile&lt;/code&gt; was overwriting the entire &lt;code&gt;CLAUDE.md&lt;/code&gt;&lt;/strong&gt; — if you had manual content, you'd lose it. Fix: &lt;code&gt;&amp;lt;!-- BEGIN/END dev-workflows --&amp;gt;&lt;/code&gt; markers that delimit the generated section.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;devw init&lt;/code&gt; was adding all of &lt;code&gt;.dwf/&lt;/code&gt; to &lt;code&gt;.gitignore&lt;/code&gt;&lt;/strong&gt; — but &lt;code&gt;.dwf/&lt;/code&gt; contains your source rules, which you do want to version. Only &lt;code&gt;.dwf/.cache/&lt;/code&gt; should be ignored.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Invalid input in prompts crashed the CLI with a stack trace&lt;/strong&gt; — instead of showing a friendly error and asking again.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Three bugs I found in 5 minutes of real usage. Three bugs that wouldn't have surfaced without using the product myself.&lt;/p&gt;

&lt;h2&gt;
  
  
  The result
&lt;/h2&gt;

&lt;p&gt;By the end of the day I had a CLI published on npm with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;6 commands: &lt;code&gt;init&lt;/code&gt;, &lt;code&gt;compile&lt;/code&gt;, &lt;code&gt;doctor&lt;/code&gt;, &lt;code&gt;add&lt;/code&gt;, &lt;code&gt;remove&lt;/code&gt;, &lt;code&gt;list&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;3 bridges: Claude Code, Cursor, Gemini CLI&lt;/li&gt;
&lt;li&gt;6 pre-baked rule blocks (TypeScript, React, Next.js, Tailwind, testing, Supabase)&lt;/li&gt;
&lt;li&gt;54+ tests passing&lt;/li&gt;
&lt;li&gt;Automated CI with GitHub Actions&lt;/li&gt;
&lt;li&gt;Automated releases with changesets
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx dev-workflows init                    &lt;span class="c"&gt;# creates .dwf/ with config and empty rule files&lt;/span&gt;
npx dev-workflows add typescript-strict   &lt;span class="c"&gt;# installs a rule block&lt;/span&gt;
npx dev-workflows compile                 &lt;span class="c"&gt;# generates CLAUDE.md, .cursor/rules, GEMINI.md&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Define rules once in YAML, compile for each editor. Change a rule, recompile. Something's off, &lt;code&gt;doctor&lt;/code&gt; tells you.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I learned
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Documentation before code is procrastination disguised as productivity.&lt;/strong&gt; A concise spec is necessary. Five documents with vision, architecture, and a roadmap for something that doesn't exist yet is creative resistance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A good spec is enough for AI to implement.&lt;/strong&gt; I gave Claude Code the &lt;code&gt;CLI_SPEC.md&lt;/code&gt; and it generated correct code on the first try in almost every case. The key isn't writing more documentation — it's writing the right documentation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dogfooding finds what tests don't.&lt;/strong&gt; Tests verify what you thought could break. Using your own product reveals what you never even considered.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ship first, polish later.&lt;/strong&gt; The CLI has hardcoded values, the prompts could be better, and the block system is basic. None of that matters if nobody uses it. Publishing is the fastest way to find out if the product makes sense.&lt;/p&gt;

&lt;h2&gt;
  
  
  Current status and what's next
&lt;/h2&gt;

&lt;p&gt;dev-workflows is at &lt;strong&gt;v0.1&lt;/strong&gt; — functional and I use it on my own projects, but it's an early version.&lt;/p&gt;

&lt;p&gt;What's on my radar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;More bridges&lt;/strong&gt; — Windsurf, Copilot, and other editors adopting context files&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Remote block registry&lt;/strong&gt; — so the community can contribute their own&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Watch mode&lt;/strong&gt; — auto-recompile on &lt;code&gt;.dwf/&lt;/code&gt; changes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom scopes&lt;/strong&gt; — categories beyond the 5 built-in ones&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pro webapp&lt;/strong&gt; — visual interface for teams, with versioning and sync&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you use multiple AI coding tools and you're tired of keeping duplicate rules across them, give it a try:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx dev-workflows init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;npm&lt;/strong&gt;: &lt;a href="https://www.npmjs.com/package/dev-workflows" rel="noopener noreferrer"&gt;npmjs.com/package/dev-workflows&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub&lt;/strong&gt;: &lt;a href="https://github.com/gpolanco/dev-workflows" rel="noopener noreferrer"&gt;github.com/gpolanco/dev-workflows&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;License&lt;/strong&gt;: MIT&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you find bugs or have ideas, open an issue. I'm building this in the open.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Requires Node.js &amp;gt;= 22.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>cursor</category>
      <category>gemini</category>
      <category>claudecode</category>
    </item>
  </channel>
</rss>
