<?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: Peterson Andres Sena Arias</title>
    <description>The latest articles on DEV Community by Peterson Andres Sena Arias (@r3v3rs3).</description>
    <link>https://dev.to/r3v3rs3</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%2F1249042%2Fe1afca32-f78d-47dd-8926-3c2c75df7c61.jpeg</url>
      <title>DEV Community: Peterson Andres Sena Arias</title>
      <link>https://dev.to/r3v3rs3</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/r3v3rs3"/>
    <language>en</language>
    <item>
      <title>[Boost]</title>
      <dc:creator>Peterson Andres Sena Arias</dc:creator>
      <pubDate>Sat, 03 Oct 2026 15:19:31 +0000</pubDate>
      <link>https://dev.to/r3v3rs3/-4458</link>
      <guid>https://dev.to/r3v3rs3/-4458</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/r3v3rs3/le-puse-muros-a-mi-agente-de-ia-y-ahora-rompe-la-web-pero-porque-se-lo-pido-3i8b" class="crayons-story__hidden-navigation-link"&gt;Le puse muros a mi agente de IA (y ahora rompe la web, pero porque se lo pido)&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/r3v3rs3" class="crayons-avatar  crayons-avatar--l  "&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%2Fuser%2Fprofile_image%2F1249042%2Fe1afca32-f78d-47dd-8926-3c2c75df7c61.jpeg" alt="r3v3rs3 profile" class="crayons-avatar__image" width="460" height="460"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/r3v3rs3" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Peterson Andres Sena Arias
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Peterson Andres Sena Arias
                &lt;a href="/++"&gt;&lt;img alt="Subscriber" class="subscription-icon" src="https://assets.dev.to/assets/subscription-icon-805dfa7ac7dd660f07ed8d654877270825b07a92a03841aa99a1093bd00431b2.png" width="166" height="102"&gt;&lt;/a&gt;
                
              
              &lt;div id="story-author-preview-content-4791692" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/r3v3rs3" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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%2Fuser%2Fprofile_image%2F1249042%2Fe1afca32-f78d-47dd-8926-3c2c75df7c61.jpeg" class="crayons-avatar__image" alt="" width="460" height="460"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Peterson Andres Sena Arias&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/r3v3rs3/le-puse-muros-a-mi-agente-de-ia-y-ahora-rompe-la-web-pero-porque-se-lo-pido-3i8b" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Oct 3&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/r3v3rs3/le-puse-muros-a-mi-agente-de-ia-y-ahora-rompe-la-web-pero-porque-se-lo-pido-3i8b" id="article-link-4791692"&gt;
          Le puse muros a mi agente de IA (y ahora rompe la web, pero porque se lo pido)
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/spanish"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;spanish&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/claude"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;claude&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/codex"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;codex&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/r3v3rs3/le-puse-muros-a-mi-agente-de-ia-y-ahora-rompe-la-web-pero-porque-se-lo-pido-3i8b" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;1&lt;span class="hidden s:inline"&gt;&amp;nbsp;reaction&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/r3v3rs3/le-puse-muros-a-mi-agente-de-ia-y-ahora-rompe-la-web-pero-porque-se-lo-pido-3i8b#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            9 min read
          &lt;/small&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>agents</category>
      <category>ai</category>
      <category>llm</category>
    </item>
    <item>
      <title>I got tired of logging in and out of Claude Code, so I built a one-command account switcher</title>
      <dc:creator>Peterson Andres Sena Arias</dc:creator>
      <pubDate>Sat, 03 Oct 2026 11:25:10 +0000</pubDate>
      <link>https://dev.to/r3v3rs3/i-got-tired-of-logging-in-and-out-of-claude-code-so-i-built-a-one-command-account-switcher-3ea3</link>
      <guid>https://dev.to/r3v3rs3/i-got-tired-of-logging-in-and-out-of-claude-code-so-i-built-a-one-command-account-switcher-3ea3</guid>
      <description>&lt;p&gt;Quick confession: last week I logged out of my work Claude Code account four times in one afternoon. Nothing was broken. I just have a second account for personal projects, and Claude Code can only be logged into one of them at a time.&lt;/p&gt;

&lt;p&gt;Sign in with the personal account and the work one is gone. Sign back in with work and personal is gone. Every switch is a browser tab, an OAuth dance and about forty seconds of my life. Multiply that by "I switch contexts a lot" and you get a genuinely annoying week.&lt;/p&gt;

&lt;p&gt;So I fixed it. The result is &lt;strong&gt;cc-switch&lt;/strong&gt;, and the whole thing is one command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ccp use personal
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every &lt;code&gt;claude&lt;/code&gt; you launch after that runs under the personal account. &lt;code&gt;ccp use work&lt;/code&gt; flips it back. No re-login, no browser, no forty seconds. And &lt;code&gt;ccp list&lt;/code&gt; tells you who is who:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  Claude Code profiles
  --------------------
  * default                   alice@company.com
    personal   [shared]       alice@gmail.com
    client-x   [isolated]     alice@client-x.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The trick is a single environment variable
&lt;/h2&gt;

&lt;p&gt;I expected to need something hacky with credential files. I didn't. Claude Code reads an environment variable called &lt;code&gt;CLAUDE_CONFIG_DIR&lt;/code&gt; and uses it as the root for &lt;em&gt;everything&lt;/em&gt; it stores: credentials, settings, session transcripts, the lot. Point it at a different folder and you get a completely separate identity.&lt;/p&gt;

&lt;p&gt;So a "profile" in cc-switch is literally a directory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;~/.claude-profiles/
  personal/    ← its own login
  client-x/    ← its own login
~/.claude      ← your original account, untouched ("default")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;ccp use &amp;lt;name&amp;gt;&lt;/code&gt; sets the variable for the current shell &lt;em&gt;and&lt;/em&gt; persists it for new terminals. &lt;code&gt;ccp run &amp;lt;name&amp;gt;&lt;/code&gt; sets it for a single invocation only, which means two terminals can talk to two different accounts at the same time:&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="c"&gt;# terminal 1&lt;/span&gt;
ccp run work

&lt;span class="c"&gt;# terminal 2&lt;/span&gt;
ccp run personal &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="s2"&gt;"summarise yesterday's changes"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I use that far more than I expected to.&lt;/p&gt;

&lt;h2&gt;
  
  
  Then I lost all my chats
&lt;/h2&gt;

&lt;p&gt;The first version worked great for about ten minutes. Then I opened a project under the personal profile and my conversation history was empty. Of course it was: transcripts live in &lt;code&gt;projects/&lt;/code&gt; inside the config dir, and the new profile had its own brand new, empty one.&lt;/p&gt;

&lt;p&gt;For some setups that's exactly what you want (a clean-room profile for a client). For my day-to-day it was terrible. I wanted the &lt;em&gt;login&lt;/em&gt; separated, not my memory of what I was doing yesterday.&lt;/p&gt;

&lt;p&gt;The fix turned out to be clean. On a &lt;strong&gt;shared&lt;/strong&gt; profile, cc-switch replaces the chat folders (&lt;code&gt;projects/&lt;/code&gt;, &lt;code&gt;sessions/&lt;/code&gt;, &lt;code&gt;plans/&lt;/code&gt;, &lt;code&gt;tasks/&lt;/code&gt;, &lt;code&gt;file-history/&lt;/code&gt;) and &lt;code&gt;history.jsonl&lt;/code&gt; with links back into &lt;code&gt;~/.claude&lt;/code&gt;: NTFS junctions and a hardlink on Windows, plain symlinks on Linux and macOS. Credentials and settings stay per profile, chats are one pool, and &lt;code&gt;claude --resume&lt;/code&gt; shows the same list whichever account you're on.&lt;/p&gt;

&lt;p&gt;If you &lt;em&gt;do&lt;/em&gt; want a walled-off environment, you just say so:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ccp add client-x &lt;span class="nt"&gt;--isolated&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can flip a profile between the two modes later with &lt;code&gt;ccp link&lt;/code&gt; and &lt;code&gt;ccp unlink&lt;/code&gt;. Nothing gets deleted either way: &lt;code&gt;unlink&lt;/code&gt; gives the profile its own empty folders and leaves the shared history where it is.&lt;/p&gt;

&lt;h2&gt;
  
  
  The bug that would have deleted everything
&lt;/h2&gt;

&lt;p&gt;This is the part I actually want people to read, because it's a general Windows/PowerShell gotcha.&lt;/p&gt;

&lt;p&gt;My first &lt;code&gt;ccp remove&lt;/code&gt; was the obvious thing: &lt;code&gt;Remove-Item -Recurse -Force &amp;lt;profile dir&amp;gt;&lt;/code&gt;. On a &lt;em&gt;shared&lt;/em&gt; profile, that directory is full of junctions pointing at &lt;code&gt;~/.claude&lt;/code&gt;. And &lt;code&gt;Remove-Item -Recurse&lt;/code&gt; will happily walk straight through a junction and delete the contents of the target.&lt;/p&gt;

&lt;p&gt;In other words, "remove the test profile" would have wiped my entire real chat history. I only caught it because I was being paranoid in testing: I made a throwaway profile and counted the project folders on both sides before and after. The fix is to delete the links themselves first (&lt;code&gt;DirectoryInfo.Delete()&lt;/code&gt; on a junction removes only the reparse point, not what it points to) and &lt;em&gt;then&lt;/em&gt; recurse into whatever is left. &lt;code&gt;rm -rf&lt;/code&gt; on Linux doesn't follow symlinks, so the bash version was never at risk, but it does the same explicit dance anyway.&lt;/p&gt;

&lt;p&gt;If you write any tool that creates junctions on Windows: test your delete path against a directory you'd be sad to lose. I got lucky. You might not.&lt;/p&gt;

&lt;h2&gt;
  
  
  Install it
&lt;/h2&gt;

&lt;p&gt;One line, no clone:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Windows (PowerShell)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;irm&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;https://raw.githubusercontent.com/petersonsenadevs/claude-code-switch/main/install.ps1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;iex&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Linux / macOS&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;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://raw.githubusercontent.com/petersonsenadevs/claude-code-switch/main/install.sh | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ccp add personal          # new profile, shares your chats
ccp login personal        # opens claude: sign in, then /exit
ccp use personal          # you're switched
ccp list                  # every profile, with the email signed in on each
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It's plain shell (a PowerShell module and a bash script) with no dependencies and no daemon. It doesn't wrap or patch &lt;code&gt;claude&lt;/code&gt;; it only sets a variable the CLI already respects. Profile names autocomplete with Tab, and &lt;code&gt;ccp update&lt;/code&gt; pulls the latest version when there is one.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'd love feedback on
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;macOS Keychain.&lt;/strong&gt; On macOS, Claude Code keeps its OAuth credentials in the system Keychain rather than in the config dir. Depending on your Claude Code version, that Keychain entry may be shared between profiles. I've built and tested this mainly on Windows and Linux, so if you're on a Mac and &lt;code&gt;ccp list&lt;/code&gt; shows the right account on each profile (or doesn't), I'd really like to hear about it in an issue.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Which folders should be shared?&lt;/strong&gt; I went with the ones that make &lt;code&gt;--resume&lt;/code&gt; behave. &lt;code&gt;settings.json&lt;/code&gt; and MCP configs stay per profile on purpose. Would you share anything else?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The repo is here: &lt;strong&gt;&lt;a href="https://github.com/petersonsenadevs/claude-code-switch" rel="noopener noreferrer"&gt;github.com/petersonsenadevs/claude-code-switch&lt;/a&gt;&lt;/strong&gt;, MIT licensed. If it saves you the forty seconds, a star helps other people find it.&lt;/p&gt;

</description>
      <category>claude</category>
      <category>ai</category>
      <category>cli</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Le puse muros a mi agente de IA (y ahora rompe la web, pero porque se lo pido)</title>
      <dc:creator>Peterson Andres Sena Arias</dc:creator>
      <pubDate>Sat, 03 Oct 2026 11:11:59 +0000</pubDate>
      <link>https://dev.to/r3v3rs3/le-puse-muros-a-mi-agente-de-ia-y-ahora-rompe-la-web-pero-porque-se-lo-pido-3i8b</link>
      <guid>https://dev.to/r3v3rs3/le-puse-muros-a-mi-agente-de-ia-y-ahora-rompe-la-web-pero-porque-se-lo-pido-3i8b</guid>
      <description>&lt;p&gt;Empecé a trabajar mis proyectos con agentes de IA usando Codex, y después llegó Claude Code. Al poco me di cuenta de que, proyecto tras proyecto, le estaba diciendo al agente lo mismo una y otra vez. Que no commitee en &lt;code&gt;main&lt;/code&gt;. Que revise en móvil antes de dar algo por hecho. Que deje escrito qué hizo y por qué. Que antes de diseñar decida la paleta y la tipografía, no a mitad de un componente.&lt;/p&gt;

&lt;p&gt;A eso se sumaban las librerías y las skills de otros que iba encontrando: una muy buena para diseñar interfaces, otra para animar con GSAP, otra para 3D… Cada una funcionaba bien por su cuenta, pero no se conocían entre ellas. Yo era el pegamento, copiando y pegando instrucciones de un proyecto a otro.&lt;/p&gt;

&lt;p&gt;Así que decidí juntarlo todo en un recopilatorio en el que las piezas se ayudaran entre sí. Lo llamé &lt;em&gt;dev-standards&lt;/em&gt;, porque era literalmente eso: mis estándares de trabajo. Hoy se llama &lt;strong&gt;Senzu&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Y por el camino me siguieron pasando cosas como estas, todas en la misma semana:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prettier, con su configuración por defecto, le metió &lt;strong&gt;204 punto y coma&lt;/strong&gt; a un archivo de un proyecto que no los usa. El agente lo dio por bueno.&lt;/li&gt;
&lt;li&gt;El instalador de mis propias normas vació el &lt;code&gt;.mcp.json&lt;/code&gt; de un proyecto Laravel y se llevó por delante un servidor MCP que estaba configurado.&lt;/li&gt;
&lt;li&gt;El agente me dijo que había verificado la web en móvil. Las capturas existían, sí: en una carpeta temporal que yo nunca iba a abrir.&lt;/li&gt;
&lt;li&gt;Un loader y una barra de carga «centrados». A ojo lo estaban. Midiendo, no.&lt;/li&gt;
&lt;li&gt;Y mi favorita: yo daba por hecho que Codex no ejecutaba hooks. Sí los ejecuta. Lo que pasaba es que mis hooks no entendían cómo Codex describe una edición, así que dejaban pasar todo sin decir nada.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ninguna de estas cosas es grave por separado. Juntas, son la diferencia entre fiarte del agente y tener que revisarle cada línea.&lt;/p&gt;

&lt;h2&gt;
  
  
  Las reglas en un CLAUDE.md son sugerencias
&lt;/h2&gt;

&lt;p&gt;Ahí está el problema de fondo. Puedes escribir en el &lt;code&gt;CLAUDE.md&lt;/code&gt; o en el &lt;code&gt;AGENTS.md&lt;/code&gt; que no se commitea en &lt;code&gt;main&lt;/code&gt;, que se verifica en móvil antes de cerrar una tarea o que no se toca el &lt;code&gt;.env&lt;/code&gt;. El agente lo lee. Y casi siempre lo cumple.&lt;/p&gt;

&lt;p&gt;«Casi siempre» no vale cuando es un proyecto de verdad.&lt;/p&gt;

&lt;p&gt;Por eso el recopilatorio no se quedó en un montón de instrucciones: lo que podía ejecutarse, lo convertí en algo que se ejecuta, no que se lee. Y el nombre: si viste Dragon Ball de pequeño, ya sabes por qué Senzu. Una semilla y el proyecto se recupera.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qué es Senzu
&lt;/h2&gt;

&lt;p&gt;Un paquete para Claude Code y Codex, en castellano, con tres piezas que trabajan juntas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Skills&lt;/strong&gt;: las mías y las de otros proyectos (con su autor y su licencia), con una capa en castellano encima. El agente carga solo la que toca: diseño de interfaz, calidad de código, DDD, animación, despliegue… Un enrutador decide cuál leer según lo que pides y en qué orden: primero se decide el diseño y después se elige el efecto, no al revés. Así no se llena el contexto de cosas que no vienen al caso.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Muros&lt;/strong&gt; (hooks): no aconsejan, bloquean. Si el agente intenta algo que no debe, la acción no se ejecuta y le explican por qué.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Comandos&lt;/strong&gt;: &lt;code&gt;/plan&lt;/code&gt;, &lt;code&gt;/verificar&lt;/code&gt;, &lt;code&gt;/brief&lt;/code&gt;, &lt;code&gt;/propuestas&lt;/code&gt;… atajos para flujos que repito en todos los proyectos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Así se ve un muro cuando salta:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[BLOQUEADO por Senzu] No se commitea en 'main'. Crea una rama
(git switch -c feat/...) y commitea ahí.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hace unos días bloqueó al propio agente que me estaba ayudando a sacar la última versión de Senzu, cuando intentó commitear donde no debía. Ahí es cuando sabes que funciona.&lt;/p&gt;

&lt;h2&gt;
  
  
  Los muros que más me han salvado
&lt;/h2&gt;

&lt;p&gt;Son dieciséis, pero hay unos cuantos que se ganan el sueldo cada semana:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;guard&lt;/code&gt;&lt;/strong&gt;: nada de &lt;code&gt;git push&lt;/code&gt; sin que yo lo apruebe en ese momento, nada de &lt;code&gt;rm -rf&lt;/code&gt;, de borrar la base de datos ni de desplegar a producción por las buenas. Para saltárselo hace falta una variable explícita y mi aprobación, y la norma es dejarlo apuntado en el devlog.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;secrets-guard&lt;/code&gt;&lt;/strong&gt; y &lt;strong&gt;&lt;code&gt;protect-files&lt;/code&gt;&lt;/strong&gt;: el agente no escribe claves reales en el código (las de AWS, Stripe, OpenAI… se reconocen por su forma) ni toca el &lt;code&gt;.env&lt;/code&gt;, las migraciones ya aplicadas o los archivos que se generan solos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;stop-guard&lt;/code&gt;&lt;/strong&gt;: este es mi favorito. El agente no puede dar la tarea por terminada si editó código y no pasó el build, el lint y los tests, si tocó la interfaz y no la verificó en móvil, o si no dejó escrito el devlog del día. Se acabó el «ya está» sin pruebas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;backend-guard&lt;/code&gt;&lt;/strong&gt;: bloquea migraciones que borran o renombran columnas de golpe (primero se añade lo nuevo y luego se quita lo viejo) y datos personales escritos en los logs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;code-hygiene&lt;/code&gt;&lt;/strong&gt;: fuera los &lt;code&gt;console.log&lt;/code&gt;, los &lt;code&gt;dd()&lt;/code&gt; y los &lt;code&gt;.only&lt;/code&gt; olvidados en los tests. Y algo más, que cuento en el diseño.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;conventions-guard&lt;/code&gt;&lt;/strong&gt;: en un proyecto que ya existe, &lt;code&gt;/adoptar&lt;/code&gt; analiza cómo está escrito de verdad, lo pactamos y lo sella. A partir de ahí, el código que se salga de esas reglas no entra. Manda la convención del proyecto, no la del agente.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Y uno que no bloquea pero que agradezco cada día: el formateo al guardar &lt;strong&gt;no impone estilo&lt;/strong&gt;. Si el proyecto no tiene configuración del formateador, no formatea, y si al formatear cambian más líneas de las que tocó el agente, lo deshace y avisa. Lo de los 204 punto y coma no ha vuelto a pasar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Las skills que más uso
&lt;/h2&gt;

&lt;p&gt;Son más de cuarenta, pero el agente casi nunca carga más de una o dos por tarea. Las que más trabajan:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ui-ux-pro-max&lt;/strong&gt; (&lt;a href="https://github.com/nextlevelbuilder/ui-ux-pro-max-skill" rel="noopener noreferrer"&gt;de Next Level Builder&lt;/a&gt;): la puerta de entrada de todo lo visual. Antes de escribir una línea de interfaz decide estilo, paleta, tipografía y patrón según el negocio y el stack, y lo deja guardado en un design system del proyecto. Encima lleva mi capa: perfiles para Laravel con Inertia, Next, Astro y Vue, y las guías de diseño que cuento más abajo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;front-activation&lt;/strong&gt;: el catálogo de efectos. Más de noventa, cada uno con su receta por stack, su versión para «reducir movimiento» y su coste en móvil. Pides «un marquee de logos» y el agente abre solo esa receta, no un manual entero.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;code-quality&lt;/strong&gt;: buenas prácticas por lenguaje y un &lt;code&gt;verify-build&lt;/code&gt; que entiende monorepos y lanza el lint, los tipos, los tests y el build de lo que has tocado.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;project-planner&lt;/strong&gt;: &lt;code&gt;/plan&lt;/code&gt; convierte una feature en fases y tareas pequeñas, cada una con la skill que toca y cómo se verifica. Luego &lt;code&gt;/siguiente&lt;/code&gt; va una por una.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;backend-audit&lt;/strong&gt;: audita el backend con herramientas de verdad, y cada hallazgo lleva su prueba: la salida del comando, el archivo y la línea, o un test que falla. Nada de «podría mejorarse la arquitectura».&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para animación y 3D (GSAP, Three.js, React Three Fiber…) uso las de &lt;a href="https://github.com/freshtechbro/claudedesignskills" rel="noopener noreferrer"&gt;Claude Design Skills&lt;/a&gt;, también con su capa en castellano.&lt;/p&gt;

&lt;h2&gt;
  
  
  Memoria que no depende de que el agente se acuerde
&lt;/h2&gt;

&lt;p&gt;Cada proyecto tiene un devlog (qué se hizo, por qué y cómo se verificó) y un archivo de memoria corto con las decisiones vigentes: &lt;code&gt;D-012 · Esto se decidió así · ver entrada 063&lt;/code&gt;. Un hook lo inyecta al empezar cada sesión. Si el agente va a contradecir una decisión, tiene que citarla y preguntarme.&lt;/p&gt;

&lt;p&gt;Para lo que no está en la memoria hay un buscador sobre el devlog que entiende raíces, erratas y sinónimos. Parece poca cosa. Es la diferencia entre explicar dos veces por qué no usamos tal librería o no tener que explicarlo nunca más.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cómo diseña
&lt;/h2&gt;

&lt;p&gt;Aquí es donde más se nota que las piezas se conocen entre ellas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Primero pregunta.&lt;/strong&gt; Si no hay brief ni design system, el primer intento de tocar la interfaz se bloquea. El agente tiene que preguntar antes: qué hace el negocio, qué tiene que hacer el visitante, si hay marca, y dos o tres webs que te gusten. La entrevista va en lenguaje llano (&lt;code&gt;/brief&lt;/code&gt;), sin palabras como «hero» o «CTA», porque no todo el mundo habla así.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Estructura antes que estética.&lt;/strong&gt; Con eso escribe un blueprint: las secciones de la página con texto real y, en cada una, qué cambia en móvil. Hasta que no lo apruebas, no se diseña nada.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Dos maquetas que se pueden abrir.&lt;/strong&gt; &lt;code&gt;/propuestas&lt;/code&gt; genera dos direcciones opuestas de verdad, en HTML que se abre con doble clic. Cada decisión lleva una etiqueta (&lt;code&gt;A·T1&lt;/code&gt; es la tipografía de la maqueta A, &lt;code&gt;B·B2&lt;/code&gt; los botones de la B…) y un panel «Tu opinión» para votar Sí o No pieza a pieza y copiarlo al chat.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Rondas.&lt;/strong&gt; &lt;code&gt;/ronda&lt;/code&gt; hace la siguiente: lo que te gustó queda fijado en todas las maquetas, lo que no te gustó desaparece y cada maqueta trae algo nuevo. Un verificador comprueba antes de enseñártela que se ha respetado todo eso.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Los vetos se cumplen.&lt;/strong&gt; Lo que dices que no te gusta va a un archivo &lt;code&gt;gustos.md&lt;/code&gt;. Y aquí vuelve &lt;code&gt;code-hygiene&lt;/code&gt;: si vetaste un color o un carrusel, el agente no puede volver a escribirlo. Lo mismo con una lista negra de cosas que delatan una web hecha con IA, como los badges de «disponible», las secciones numeradas «01 / 02 / 03», el «trusted by» con logos en gris o las métricas inventadas. Están bloqueadas por defecto.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. Construye sección a sección&lt;/strong&gt;, enseñando cada una antes de pasar a la siguiente. Y cuando el logo ya está elegido, sus archivos finales quedan protegidos y el agente no se pone a hacer bocetos que nadie le ha pedido.&lt;/p&gt;

&lt;p&gt;Y al final, verifica.&lt;/p&gt;

&lt;h2&gt;
  
  
  Verificar es medir, no mirar
&lt;/h2&gt;

&lt;p&gt;Esta parte nació del loader descentrado. «Debería verse bien» no es verificar, así que el verificador de interfaz ahora &lt;strong&gt;mide en píxeles&lt;/strong&gt;: si algo que su contenedor centra está a 4 px del centro, te lo dice, con la causa probable (un &lt;code&gt;margin-left: 8px&lt;/code&gt; que sobraba, por ejemplo).&lt;/p&gt;

&lt;p&gt;Lo calibré contra webs reales para que no fuera una máquina de falsos positivos. Empezó dando entre 33 y 41 avisos por página y lo dejé en 0-2. De paso encontró algo de verdad: en vuejs.org, un icono de play que está 3 px descentrado dentro de su propio SVG.&lt;/p&gt;

&lt;p&gt;En móvil hace lo que yo hacía a mano: &lt;strong&gt;abre el menú de verdad&lt;/strong&gt;. Lo pulsa, mide si los enlaces se pueden tocar con el dedo, prueba que se cierra con Escape y te deja una captura con cada aviso numerado encima de su elemento. La cifra y la imagen, juntas.&lt;/p&gt;

&lt;h2&gt;
  
  
  La parte divertida
&lt;/h2&gt;

&lt;p&gt;No todo son muros. Senzu también trae un catálogo de efectos con recetas por stack (Astro, Next, Vue con Inertia), y hace poco le pedí algo concreto: que la web se viera normal y de repente &lt;strong&gt;se partiera como un cristal&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fu2gdgm67k47lt4zekmu8.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fu2gdgm67k47lt4zekmu8.gif" alt="La web se rompe en trozos que son la propia página"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;La demo, a media velocidad para que se vea algo: en tiempo real dura menos de un segundo.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Lo que se rompe es la propia página, no una imagen encima. Cada trozo es una copia del DOM recortada con &lt;code&gt;clip-path&lt;/code&gt; a la forma del cristal. Por eso se lee el texto real, nítido, mientras cae girando en 3D. Sin capturas de pantalla y sin librerías.&lt;/p&gt;

&lt;p&gt;Y con reglas, porque un efecto así puede acabar siendo un circo: una vez y con intención, se salta con Escape, quien tiene activado «reducir movimiento» solo ve un fundido, y al terminar no queda nada en el DOM. Tiene sus pruebas automáticas en un navegador real, como todo lo demás.&lt;/p&gt;
&lt;h2&gt;
  
  
  Cómo probarlo
&lt;/h2&gt;

&lt;p&gt;En Claude Code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/plugin marketplace add petersonsenadevs/senzu
/plugin install senzu-all@senzu
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En Codex se añade el mismo marketplace desde la app. Luego, en tu proyecto, abre una sesión y escribe &lt;code&gt;/instalar&lt;/code&gt;: detecta el stack, te pregunta qué quieres (todo, por categorías o a medida) y lo deja listo.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Repositorio: &lt;a href="https://github.com/petersonsenadevs/senzu" rel="noopener noreferrer"&gt;github.com/petersonsenadevs/senzu&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Documentación: &lt;a href="https://getsenzu.vercel.app" rel="noopener noreferrer"&gt;getsenzu.vercel.app&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Lo que no es
&lt;/h2&gt;

&lt;p&gt;Es &lt;strong&gt;opinado&lt;/strong&gt;: son mis normas de trabajo, no las de todo el mundo. Lo puedes adaptar (los muros se apagan por proyecto y los permisos se cambian), pero parte de cómo trabajo yo.&lt;/p&gt;

&lt;p&gt;Está &lt;strong&gt;en castellano&lt;/strong&gt;, a propósito. Hay muchísimo para agentes en inglés y casi nada pensado para quien trabaja en español.&lt;/p&gt;

&lt;p&gt;Y no hace que el agente deje de equivocarse. Se sigue equivocando. La diferencia es que ahora se entera antes que yo.&lt;/p&gt;

&lt;p&gt;Es MIT. Usa skills de otros proyectos, cada una con su autor y su licencia en &lt;code&gt;CREDITOS.md&lt;/code&gt;. Cada semana comprueba si esos proyectos han cambiado y me abre un PR para revisarlo.&lt;/p&gt;

&lt;p&gt;Si lo pruebas, me encantará saber qué muro le pondrías tú a tu agente. Seguro que hay alguno que se me ha escapado.&lt;/p&gt;

</description>
      <category>spanish</category>
      <category>ai</category>
      <category>claude</category>
      <category>codex</category>
    </item>
    <item>
      <title>Laravel SwaggenerAI: Generate Swagger Documentation with AI in Seconds</title>
      <dc:creator>Peterson Andres Sena Arias</dc:creator>
      <pubDate>Tue, 03 Jun 2025 06:20:47 +0000</pubDate>
      <link>https://dev.to/r3v3rs3/laravel-swaggenerai-generate-swagger-documentation-with-ai-in-seconds-2feg</link>
      <guid>https://dev.to/r3v3rs3/laravel-swaggenerai-generate-swagger-documentation-with-ai-in-seconds-2feg</guid>
      <description>&lt;p&gt;Tired of writing Swagger documentation manually for your Laravel APIs? Meet &lt;strong&gt;Laravel SwaggenerAI&lt;/strong&gt;, a VS Code extension that uses artificial intelligence to automatically generate complete OpenAPI/Swagger documentation.&lt;/p&gt;




&lt;h2&gt;
  
  
  Key Features
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Multiple AI Providers
&lt;/h3&gt;

&lt;p&gt;The extension supports the best AI models on the market:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Google Gemini&lt;/strong&gt; (&lt;code&gt;gemini-2.0-flash&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OpenAI GPT-4&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anthropic Claude&lt;/strong&gt; &lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Smart Generation
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Automatic controller detection
&lt;/li&gt;
&lt;li&gt;Routes and request analysis
&lt;/li&gt;
&lt;li&gt;Intelligent caching for faster performance &lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Complete Customization
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Flexible AI provider selection &lt;/li&gt;
&lt;li&gt;Simple API key configuration
&lt;/li&gt;
&lt;li&gt;Multiple formatting options
&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  How It Works
&lt;/h3&gt;

&lt;p&gt;The extension uses an &lt;strong&gt;abstraction system&lt;/strong&gt; that allows working with different AI providers uniformly. Each provider implements the same interface, ensuring consistency in documentation generation.&lt;/p&gt;

&lt;p&gt;The process is simple:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Analyzes your Laravel controllers
&lt;/li&gt;
&lt;li&gt;Automatically detects routes and methods
&lt;/li&gt;
&lt;li&gt;Generates optimized prompts for each AI provider
&lt;/li&gt;
&lt;li&gt;Produces ready-to-use Swagger/OpenAPI annotations
&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  Installation and Usage
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Install from VS Code Marketplace
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Search: "Laravel SwaggenerAI"&lt;/li&gt;
&lt;/ul&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.amazonaws.com%2Fuploads%2Farticles%2Fp4pjtjq2gmrty4s4g1t6.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.amazonaws.com%2Fuploads%2Farticles%2Fp4pjtjq2gmrty4s4g1t6.png" alt=" " width="579" height="582"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Install the extension&lt;/li&gt;
&lt;/ul&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.amazonaws.com%2Fuploads%2Farticles%2Fgk158uvh6j58aeulmzoq.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.amazonaws.com%2Fuploads%2Farticles%2Fgk158uvh6j58aeulmzoq.png" alt=" " width="800" height="218"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Configure your preferred AI provider and API key&lt;/li&gt;
&lt;/ul&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.amazonaws.com%2Fuploads%2Farticles%2Fohqr8bv8ils64rrhygbj.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.amazonaws.com%2Fuploads%2Farticles%2Fohqr8bv8ils64rrhygbj.png" alt=" " width="800" height="247"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Generate documentation with one click!&lt;/li&gt;
&lt;/ul&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.amazonaws.com%2Fuploads%2Farticles%2Ftmdnd2830xzp7zfu7znu.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.amazonaws.com%2Fuploads%2Farticles%2Ftmdnd2830xzp7zfu7znu.png" alt=" " width="800" height="276"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Optimized Performance
&lt;/h3&gt;

&lt;p&gt;The extension includes an intelligent cache system that avoids regenerating documentation unnecessarily, significantly improving response times in large projects.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Laravel SwaggenerAI?
&lt;/h3&gt;

&lt;p&gt;Save Time: What used to take hours, now takes minutes&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Consistency: Uniform documentation across your entire project&lt;/li&gt;
&lt;li&gt;Flexibility: Choose the AI model that best fits your needs&lt;/li&gt;
&lt;li&gt;Free: Available on VS Code Marketplace&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Useful Links
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;📦 VS Code Marketplace
&lt;a href="https://marketplace.visualstudio.com/items?itemName=PESEDevs.laravel-swaggenerai" rel="noopener noreferrer"&gt;Marketplace&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;📚 Complete Documentation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="[Marketplace](https://marketplace.visualstudio.com/items?itemName=PESEDevs.laravel-swaggenerai)"&gt;GitHub Repository&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;☕ Support the Project&lt;br&gt;
If you find this extension useful, consider:&lt;br&gt;
⭐ Starring it on GitHub&lt;br&gt;
&lt;a href="https://buymeacoffee.com/petersonsena" rel="noopener noreferrer"&gt;Buy me a coffee &lt;/a&gt;&lt;br&gt;
📣 Sharing it with other developers&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

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