<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="https://futurewithml.netlify.app/feed_style.xsl" type="text/xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es">
    <tabi:metadata xmlns:tabi="https://github.com/welpo/tabi">
        <tabi:base_url>https:&#x2F;&#x2F;futurewithml.netlify.app</tabi:base_url>
        <tabi:separator>
            |
        </tabi:separator>
        <tabi:about_feeds>Esta es una fuente web, también conocida como fuente Atom. Suscríbete copiando la URL de la barra de direcciones en tu lector de noticias. Visita About Feeds para aprender más y empezar. Es gratis. </tabi:about_feeds>
        <tabi:visit_the_site>Visita la web</tabi:visit_the_site>
        <tabi:recent_posts>Publicaciones recientes</tabi:recent_posts>
        <tabi:last_updated_on>Actualizado el $DATE</tabi:last_updated_on>
        <tabi:default_theme></tabi:default_theme>
        <tabi:post_listing_date>date</tabi:post_listing_date>
        <tabi:current_section>Agentes IA</tabi:current_section>
    </tabi:metadata><link rel="extra-stylesheet" href="https://futurewithml.netlify.app/skins/cyber.css?h=eb029a27afbc61465b52" /><title>Future With ML - Agentes IA</title>
        <subtitle>Patrones de Diseño en Machine Learning, MLOps e Ingeniería de IA por Christian Picon Calderon</subtitle>
    <link href="https://futurewithml.netlify.app/es/tags/agentes-ia/atom.xml" rel="self" type="application/atom+xml"/>
    <link href="https://futurewithml.netlify.app/es/tags/agentes-ia/" rel="alternate" type="text/html"/>
    <generator uri="https://www.getzola.org/">Zola</generator><updated>2026-01-06T11:00:00+00:00</updated><id>https://futurewithml.netlify.app/es/tags/agentes-ia/atom.xml</id><entry xml:lang="es">
        <title>El Patrón de Arquitectura Híbrida: Lecciones de agent-team-creator</title>
        <published>2026-01-06T11:00:00+00:00</published>
        <updated>2026-01-06T11:00:00+00:00</updated>
        <author>
            <name>Christian Picon Calderon</name>
        </author>
        <link rel="alternate" href="https://futurewithml.netlify.app/es/posts/claude-code-plugin-journey-part1/" type="text/html"/>
        <id>https://futurewithml.netlify.app/es/posts/claude-code-plugin-journey-part1/</id>
        
            <content type="html">&lt;h1 id=&quot;el-patron-de-arquitectura-hibrida-lecciones-de-agent-team-creator&quot;&gt;El Patrón de Arquitectura Híbrida: Lecciones de agent-team-creator&lt;&#x2F;h1&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Esta es la Parte 1 de una serie de tres partes. Comienza con &lt;a href=&quot;&#x2F;posts&#x2F;claude-code-plugin-journey-part0&#x2F;&quot;&gt;Parte 0: Agent Team Creator&lt;&#x2F;a&gt; para ver qué hace el plugin, o continúa aquí para el viaje de desarrollo.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Pensé que construir un plugin de Claude Code tomaría un fin de semana. Tres días después de luchar con bugs de acceso a herramientas MCP, sincronización de archivos en tres ubicaciones, y documentación que prometía features que no funcionaban, me di cuenta de que estaba construyendo algo más valioso que un plugin—estaba mapeando territorio inexplorado.&lt;&#x2F;p&gt;
&lt;p&gt;Esta es la historia de construir &lt;strong&gt;agent-team-creator&lt;&#x2F;strong&gt;, un plugin de Claude Code que analiza códigos base y genera agentes IA específicos del proyecto. En el camino, descubrí un patrón que convirtió las limitaciones de la plataforma en claridad arquitectónica: el &lt;strong&gt;Patrón de Arquitectura Híbrida&lt;&#x2F;strong&gt;.&lt;&#x2F;p&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;acto-i-la-configuracion&quot;&gt;Acto I: La Configuración&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;la-vision&quot;&gt;La Visión&lt;&#x2F;h3&gt;
&lt;p&gt;La idea era simple: analizar cualquier código base y generar automáticamente un equipo de agentes Claude Code especializados adaptados a ese proyecto. ¿Un frontend React? Genera un agente diseñador de componentes. ¿Un pipeline ML de Python? Spawn un agente entrenador de modelos. El plugin entendería tu código y crearía colaboradores IA que hablan el lenguaje de tu proyecto.&lt;&#x2F;p&gt;
&lt;p&gt;Había leído la documentación. Los plugins de Claude Code soportan cinco tipos de componentes—commands, agents, skills, hooks, e integraciones MCP. Los agentes pueden spawnear subagentes usando la herramienta Task. Los servidores MCP proveen acceso a servicios externos. Parecía directo.&lt;&#x2F;p&gt;
&lt;p&gt;Esto es lo que esperaba versus lo que encontré:&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Expectativa&lt;&#x2F;th&gt;&lt;th&gt;Realidad&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Los agentes de plugin pueden acceder a herramientas MCP&lt;&#x2F;td&gt;&lt;td&gt;Los agentes de plugin &lt;strong&gt;no pueden&lt;&#x2F;strong&gt; acceder a MCP (bug documentado)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Los agentes pueden spawnear subagentes anidados&lt;&#x2F;td&gt;&lt;td&gt;Solo un nivel de anidamiento&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;La documentación describe el comportamiento real&lt;&#x2F;td&gt;&lt;td&gt;Los docs dicen que MCP funciona, pero no lo hace&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Los cambios se propagan automáticamente&lt;&#x2F;td&gt;&lt;td&gt;Se requiere sincronización manual en 3 ubicaciones&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;La herencia de modelo funciona&lt;&#x2F;td&gt;&lt;td&gt;Por defecto usa Sonnet 4 sin importar la configuración&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;La brecha entre expectativa y realidad se convertiría en mi currículo.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;entendiendo-el-terreno&quot;&gt;Entendiendo el Terreno&lt;&#x2F;h3&gt;
&lt;p&gt;Antes de profundizar en los puntos de dolor, déjame compartir el panorama. Los plugins de Claude Code tienen cinco tipos de componentes, cada uno con mecanismos de activación distintos:&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Componente&lt;&#x2F;th&gt;&lt;th&gt;Activador&lt;&#x2F;th&gt;&lt;th&gt;Propósito&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Skills&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Auto-invocados&lt;&#x2F;td&gt;&lt;td&gt;Proveedores de contexto basados en matching de descripción&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Commands&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Iniciado por usuario (&lt;code&gt;&#x2F;command&lt;&#x2F;code&gt;)&lt;&#x2F;td&gt;&lt;td&gt;Atajos de comandos slash&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Agents&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Spawneados via herramienta Task&lt;&#x2F;td&gt;&lt;td&gt;Instancias separadas de Claude para trabajo especializado&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Hooks&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Basados en eventos&lt;&#x2F;td&gt;&lt;td&gt;Handlers de automatización (PreToolUse, PostToolUse, etc.)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;MCPs&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Llamadas a herramientas&lt;&#x2F;td&gt;&lt;td&gt;Integraciones de servicios externos&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;La estructura de directorios sigue un patrón predecible:&lt;&#x2F;p&gt;





&lt;div class=&quot;tree-container&quot; id=&quot;tree-202&quot;&gt;
    &lt;canvas class=&quot;tree-canvas&quot; aria-label=&quot;Directory structure visualization&quot;&gt;&lt;&#x2F;canvas&gt;
&lt;&#x2F;div&gt;

&lt;script&gt;
(function() {
    const containerId = &#x27;tree-202&#x27;;

    &#x2F;&#x2F; Decode HTML entities (Tera encodes &#x2F; as &amp;#x2F;)
    function decodeHTML(str) {
        const textarea = document.createElement(&#x27;textarea&#x27;);
        textarea.innerHTML = str;
        return textarea.value;
    }

    const rootName = decodeHTML(&#x27;plugin-root&#x27;);
    const nodeData = decodeHTML(&#x27;.claude-plugin&amp;#x2F;:marketplace.json;plugin.json,commands&amp;#x2F;:*.md,agents&amp;#x2F;:*.md,skills&amp;#x2F;:SKILL.md,hooks&amp;#x2F;:*.md,.mcp.json:config&#x27;);

    function parseNodes(data) {
        const folders = [];
        data.split(&#x27;,&#x27;).forEach(folder =&gt; {
            const [name, childrenStr] = folder.split(&#x27;:&#x27;);
            const children = childrenStr ? childrenStr.split(&#x27;;&#x27;).map(c =&gt; c.trim()) : [];
            folders.push({ name: name.trim(), children, type: &#x27;folder&#x27; });
        });
        return folders;
    }

    function initTree() {
        const container = document.getElementById(containerId);
        if (!container) return;

        const canvas = container.querySelector(&#x27;.tree-canvas&#x27;);
        const ctx = canvas.getContext(&#x27;2d&#x27;);

        let particles = [];
        let time = 0;

        const colors = {
            root: &#x27;#ff0080&#x27;,
            folder: &#x27;#00d4ff&#x27;,
            file: &#x27;#8b5cf6&#x27;,
            config: &#x27;#ff8800&#x27;,
            accent: &#x27;#00ff88&#x27;,
            connection: &#x27;rgba(0, 212, 255, 0.3)&#x27;,
            text: &#x27;#e0e0e4&#x27;
        };

        const folders = parseNodes(nodeData);

        function resize() {
            const rect = container.getBoundingClientRect();
            canvas.width = rect.width;
            canvas.height = 320;
        }
        resize();
        window.addEventListener(&#x27;resize&#x27;, resize);

        function getNodePositions() {
            const nodes = [];
            const centerX = canvas.width &#x2F; 2;
            const rootY = 50;
            const folderY = 140;
            const fileY = 230;

            &#x2F;&#x2F; Root node
            nodes.push({
                type: &#x27;root&#x27;,
                label: rootName,
                x: centerX,
                y: rootY,
                radius: 28,
                color: colors.root
            });

            &#x2F;&#x2F; Folder nodes
            const folderSpacing = Math.min(120, (canvas.width - 100) &#x2F; folders.length);
            const startX = centerX - ((folders.length - 1) * folderSpacing) &#x2F; 2;

            folders.forEach((folder, i) =&gt; {
                const x = startX + i * folderSpacing;
                const isConfig = folder.name.includes(&#x27;.&#x27;) || folder.name.includes(&#x27;json&#x27;);

                nodes.push({
                    type: &#x27;folder&#x27;,
                    label: folder.name,
                    x: x,
                    y: folderY,
                    radius: 22,
                    color: isConfig ? colors.config : colors.folder,
                    parentIndex: 0,
                    children: folder.children
                });
            });

            &#x2F;&#x2F; File nodes (spread under their parent folders)
            let fileIndex = 0;
            folders.forEach((folder, folderIdx) =&gt; {
                const parentNode = nodes[folderIdx + 1];
                const childCount = folder.children.length;

                folder.children.forEach((child, childIdx) =&gt; {
                    const offset = (childIdx - (childCount - 1) &#x2F; 2) * 50;
                    nodes.push({
                        type: &#x27;file&#x27;,
                        label: child,
                        x: parentNode.x + offset,
                        y: fileY + (childIdx % 2) * 35,
                        radius: 18,
                        color: colors.file,
                        parentIndex: folderIdx + 1
                    });
                    fileIndex++;
                });
            });

            return nodes;
        }

        function draw() {
            ctx.clearRect(0, 0, canvas.width, canvas.height);
            const nodes = getNodePositions();

            &#x2F;&#x2F; Draw connections
            ctx.strokeStyle = colors.connection;
            ctx.lineWidth = 2;

            nodes.forEach((node, i) =&gt; {
                if (node.parentIndex !== undefined) {
                    const parent = nodes[node.parentIndex];
                    ctx.beginPath();
                    ctx.moveTo(parent.x, parent.y + parent.radius);
                    ctx.lineTo(node.x, node.y - node.radius);
                    ctx.stroke();
                }
            });

            &#x2F;&#x2F; Draw nodes
            nodes.forEach((node, i) =&gt; {
                &#x2F;&#x2F; Glow effect
                ctx.shadowColor = node.color;
                ctx.shadowBlur = 15;

                &#x2F;&#x2F; Node circle
                ctx.fillStyle = node.color;
                ctx.beginPath();
                ctx.arc(node.x, node.y, node.radius, 0, Math.PI * 2);
                ctx.fill();

                ctx.shadowBlur = 0;

                &#x2F;&#x2F; Border
                ctx.strokeStyle = colors.accent;
                ctx.lineWidth = 2;
                ctx.stroke();

                &#x2F;&#x2F; Icon based on type
                ctx.fillStyle = &#x27;#0a0a0f&#x27;;
                ctx.font = node.type === &#x27;root&#x27; ? &#x27;16px sans-serif&#x27; : &#x27;12px sans-serif&#x27;;
                ctx.textAlign = &#x27;center&#x27;;
                ctx.textBaseline = &#x27;middle&#x27;;

                if (node.type === &#x27;root&#x27;) {
                    ctx.fillText(&#x27;📁&#x27;, node.x, node.y);
                } else if (node.type === &#x27;folder&#x27;) {
                    ctx.fillText(&#x27;📂&#x27;, node.x, node.y);
                } else {
                    ctx.fillText(&#x27;📄&#x27;, node.x, node.y);
                }

                &#x2F;&#x2F; Label
                ctx.fillStyle = colors.text;
                ctx.font = node.type === &#x27;root&#x27; ? &#x27;bold 12px JetBrains Mono&#x27; : &#x27;10px JetBrains Mono&#x27;;
                ctx.fillText(node.label, node.x, node.y + node.radius + 14);
            });

            &#x2F;&#x2F; Animated particles
            if (time % 60 === 0 &amp;&amp; particles.length &lt; 8) {
                const randomFolder = Math.floor(Math.random() * folders.length) + 1;
                const parentNode = nodes[randomFolder];
                if (parentNode) {
                    particles.push({
                        x: nodes[0].x,
                        y: nodes[0].y,
                        targetX: parentNode.x,
                        targetY: parentNode.y,
                        progress: 0,
                        speed: 0.02
                    });
                }
            }

            particles = particles.filter(p =&gt; p.progress &lt; 1);
            particles.forEach(p =&gt; {
                p.progress += p.speed;
                const ease = p.progress * p.progress * (3 - 2 * p.progress);
                const x = p.x + (p.targetX - p.x) * ease;
                const y = p.y + (p.targetY - p.y) * ease;

                ctx.fillStyle = colors.accent;
                ctx.shadowColor = colors.accent;
                ctx.shadowBlur = 10;
                ctx.beginPath();
                ctx.arc(x, y, 4, 0, Math.PI * 2);
                ctx.fill();
                ctx.shadowBlur = 0;
            });

            time++;
            requestAnimationFrame(draw);
        }

        if (!window.matchMedia(&#x27;(prefers-reduced-motion: reduce)&#x27;).matches) {
            draw();
        } else {
            &#x2F;&#x2F; Static version
            const nodes = getNodePositions();
            nodes.forEach(node =&gt; {
                ctx.fillStyle = node.color;
                ctx.beginPath();
                ctx.arc(node.x, node.y, node.radius, 0, Math.PI * 2);
                ctx.fill();

                ctx.fillStyle = colors.text;
                ctx.font = &#x27;10px JetBrains Mono&#x27;;
                ctx.textAlign = &#x27;center&#x27;;
                ctx.fillText(node.label, node.x, node.y + node.radius + 14);
            });
        }
    }

    if (document.readyState === &#x27;loading&#x27;) {
        document.addEventListener(&#x27;DOMContentLoaded&#x27;, initTree);
    } else {
        initTree();
    }
})();
&lt;&#x2F;script&gt;

&lt;style&gt;
.tree-container {
    background: var(--bg-0);
    border: 1px solid var(--divider-color);
    border-radius: 12px;
    padding: 1rem;
    margin: 1.5rem 0;
    position: relative;
}

.tree-canvas {
    width: 100%;
    height: 320px;
    display: block;
}

@media (max-width: 768px) {
    .tree-container {
        overflow-x: auto;
    }

    .tree-canvas {
        min-width: 500px;
    }
}
&lt;&#x2F;style&gt;
&lt;p&gt;Armado con este conocimiento, construí mi primer prototipo. Funcionó—más o menos. Los commands se ejecutaron. Los agentes se spawnearon. Y entonces todo empezó a romperse de formas que la documentación no me preparó.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;acto-ii-el-descenso&quot;&gt;Acto II: El Descenso&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;punto-de-dolor-1-el-bug-de-acceso-a-herramientas-mcp&quot;&gt;Punto de Dolor #1: El Bug de Acceso a Herramientas MCP&lt;&#x2F;h3&gt;
&lt;p&gt;Mi plugin agent-team-creator necesitaba integrarse con Jira. El plugin MCP de Atlassian estaba instalado y funcionando perfectamente en la sesión principal de Claude Code. Siguiendo la documentación, configuré mi agente de plugin para acceder a estas herramientas MCP.&lt;&#x2F;p&gt;
&lt;p&gt;El error fue inmediato y confuso:&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;Error: No such tool available: mcp__plugin_atlassian__getJiraIssue
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Pasé horas depurando. ¿Estaba mal mi configuración? ¿Nombré mal la herramienta? Entonces los encontré—cuatro issues de GitHub documentando el mismo problema:&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Issue&lt;&#x2F;th&gt;&lt;th&gt;Descripción&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;#13605&lt;&#x2F;td&gt;&lt;td&gt;Los subagentes de plugin personalizados no pueden acceder a herramientas MCP&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;#15810&lt;&#x2F;td&gt;&lt;td&gt;Los subagentes no heredan herramientas MCP de agentes definidos en plugins&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;#14496&lt;&#x2F;td&gt;&lt;td&gt;Acceso inconsistente a MCP con prompts complejos&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;#7296&lt;&#x2F;td&gt;&lt;td&gt;Fallo de herencia de scope para agentes lanzados con Task&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;La documentación decía:&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;“Cuando el campo tools se omite, los subagentes heredan todas las herramientas MCP disponibles para el hilo principal.”&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;La realidad discrepaba. Los agentes definidos en plugins viven en un scope diferente—pueden ver las herramientas MCP listadas en la sesión principal, pero no pueden invocarlas.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;&lt;strong&gt;★ Momento de Enseñanza: La Realidad del Scope MCP&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Las herramientas MCP funcionan confiablemente en dos contextos:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;La sesión principal de Claude Code&lt;&#x2F;li&gt;
&lt;li&gt;Commands (que corren en el scope de la sesión principal)&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Las herramientas MCP &lt;strong&gt;no funcionan&lt;&#x2F;strong&gt; en:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Agentes definidos en plugins spawneados via herramienta Task&lt;&#x2F;li&gt;
&lt;li&gt;Subagentes de cualquier tipo&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Si tu plugin necesita acceso a servicios externos, tus &lt;strong&gt;commands&lt;&#x2F;strong&gt; deben manejarlo, no tus agentes.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h3 id=&quot;punto-de-dolor-2-infierno-de-sincronizacion-en-tres-ubicaciones&quot;&gt;Punto de Dolor #2: Infierno de Sincronización en Tres Ubicaciones&lt;&#x2F;h3&gt;
&lt;p&gt;Después de modificar mis definiciones de agentes, recargué Claude Code. Mis cambios no estaban ahí. Edité de nuevo. Todavía nada.&lt;&#x2F;p&gt;
&lt;p&gt;Resulta que los plugins de Claude Code existen en tres ubicaciones separadas que deben sincronizarse manualmente:&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Ubicación&lt;&#x2F;th&gt;&lt;th&gt;Ruta&lt;&#x2F;th&gt;&lt;th&gt;Propósito&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Fuente Marketplace&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;~&#x2F;.claude&#x2F;local-marketplace&#x2F;&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Donde editas&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Plugin Instalado&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;~&#x2F;.claude&#x2F;plugins&#x2F;plugin-name&#x2F;&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Donde Claude lee&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Cache&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;~&#x2F;.claude&#x2F;plugins&#x2F;cache&#x2F;marketplace&#x2F;plugin&#x2F;version&#x2F;&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Backup versionado&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;No hay hot reload. No hay auto-sync. Editas en un lugar, pero Claude lee de otro.&lt;&#x2F;p&gt;
&lt;p&gt;¿La solución? Un script de sincronización:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; class=&quot;language-bash z-code&quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-begin z-shell&quot;&gt;#&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt;!&#x2F;bin&#x2F;bash&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-assignment z-shell&quot;&gt;PLUGIN_NAME&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-assignment z-shell&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-unquoted z-shell&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-shell&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;agent-team-creator&lt;span class=&quot;z-punctuation z-definition z-string z-end z-shell&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-assignment z-shell&quot;&gt;MARKETPLACE&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-assignment z-shell&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-unquoted z-shell&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-shell&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-expansion z-parameter z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-variable z-shell&quot;&gt;$&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-shell&quot;&gt;HOME&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&#x2F;.claude&#x2F;local-marketplace&lt;span class=&quot;z-punctuation z-definition z-string z-end z-shell&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-assignment z-shell&quot;&gt;INSTALLED&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-assignment z-shell&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-unquoted z-shell&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-shell&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-expansion z-parameter z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-variable z-shell&quot;&gt;$&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-shell&quot;&gt;HOME&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&#x2F;.claude&#x2F;plugins&#x2F;&lt;span class=&quot;z-meta z-group z-expansion z-parameter z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-variable z-shell&quot;&gt;$&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-shell&quot;&gt;PLUGIN_NAME&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-end z-shell&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-assignment z-shell&quot;&gt;CACHE&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-assignment z-shell&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-unquoted z-shell&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-shell&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-expansion z-parameter z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-variable z-shell&quot;&gt;$&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-shell&quot;&gt;HOME&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&#x2F;.claude&#x2F;plugins&#x2F;cache&#x2F;local-marketplace&#x2F;&lt;span class=&quot;z-meta z-group z-expansion z-parameter z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-variable z-shell&quot;&gt;$&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-shell&quot;&gt;PLUGIN_NAME&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&#x2F;1.0.0&lt;span class=&quot;z-punctuation z-definition z-string z-end z-shell&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;rsync&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; -&lt;&#x2F;span&gt;av&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-shell&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-expansion z-parameter z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-variable z-shell&quot;&gt;$&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-shell&quot;&gt;MARKETPLACE&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&#x2F;commands&#x2F;&lt;span class=&quot;z-punctuation z-definition z-string z-end z-shell&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-shell&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-expansion z-parameter z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-variable z-shell&quot;&gt;$&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-shell&quot;&gt;INSTALLED&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&#x2F;commands&#x2F;&lt;span class=&quot;z-punctuation z-definition z-string z-end z-shell&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;rsync&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; -&lt;&#x2F;span&gt;av&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-shell&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-expansion z-parameter z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-variable z-shell&quot;&gt;$&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-shell&quot;&gt;MARKETPLACE&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&#x2F;commands&#x2F;&lt;span class=&quot;z-punctuation z-definition z-string z-end z-shell&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-shell&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-expansion z-parameter z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-variable z-shell&quot;&gt;$&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-shell&quot;&gt;CACHE&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&#x2F;commands&#x2F;&lt;span class=&quot;z-punctuation z-definition z-string z-end z-shell&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;rsync&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; -&lt;&#x2F;span&gt;av&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-shell&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-expansion z-parameter z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-variable z-shell&quot;&gt;$&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-shell&quot;&gt;MARKETPLACE&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&#x2F;agents&#x2F;&lt;span class=&quot;z-punctuation z-definition z-string z-end z-shell&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-shell&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-expansion z-parameter z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-variable z-shell&quot;&gt;$&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-shell&quot;&gt;INSTALLED&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&#x2F;agents&#x2F;&lt;span class=&quot;z-punctuation z-definition z-string z-end z-shell&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;rsync&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; -&lt;&#x2F;span&gt;av&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-shell&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-expansion z-parameter z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-variable z-shell&quot;&gt;$&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-shell&quot;&gt;MARKETPLACE&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&#x2F;agents&#x2F;&lt;span class=&quot;z-punctuation z-definition z-string z-end z-shell&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-shell&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-expansion z-parameter z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-variable z-shell&quot;&gt;$&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-shell&quot;&gt;CACHE&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&#x2F;agents&#x2F;&lt;span class=&quot;z-punctuation z-definition z-string z-end z-shell&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-support z-function z-echo z-shell&quot;&gt;echo&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; &lt;span class=&quot;z-string z-quoted z-double z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-shell&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;Plugin sincronizado en todas las ubicaciones&lt;span class=&quot;z-punctuation z-definition z-string z-end z-shell&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Después de cada cambio: sync, cerrar Claude Code, reiniciar. Esto se volvió memoria muscular.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;&lt;strong&gt;★ Momento de Enseñanza: Depurando Tu Plugin&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Cuando las cosas van mal, estos comandos son tus amigos:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; class=&quot;language-bash z-code&quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-begin z-shell&quot;&gt;#&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt; Verificar si el plugin está cargado&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;ls&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; &lt;span class=&quot;z-meta z-group z-expansion z-tilde&quot;&gt;&lt;span class=&quot;z-variable z-language z-tilde z-shell&quot;&gt;~&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&#x2F;.claude&#x2F;plugins&#x2F;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-begin z-shell&quot;&gt;#&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt; Verificar sincronización del cache&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;diff&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; -&lt;&#x2F;span&gt;r&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-expansion z-tilde&quot;&gt;&lt;span class=&quot;z-variable z-language z-tilde z-shell&quot;&gt;~&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&#x2F;.claude&#x2F;plugins&#x2F;agent-team-creator&#x2F; &lt;span class=&quot;z-punctuation z-separator z-continuation z-line z-shell&quot;&gt;\
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt;        &lt;span class=&quot;z-meta z-group z-expansion z-tilde&quot;&gt;&lt;span class=&quot;z-variable z-language z-tilde z-shell&quot;&gt;~&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&#x2F;.claude&#x2F;plugins&#x2F;cache&#x2F;local-marketplace&#x2F;agent-team-creator&#x2F;1.0.0&#x2F;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-begin z-shell&quot;&gt;#&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt; Validar sintaxis de marketplace.json&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;cat&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; &lt;span class=&quot;z-meta z-group z-expansion z-tilde&quot;&gt;&lt;span class=&quot;z-variable z-language z-tilde z-shell&quot;&gt;~&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&#x2F;.claude&#x2F;local-marketplace&#x2F;.claude-plugin&#x2F;marketplace.json&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-logical z-pipe z-shell&quot;&gt;|&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;jq&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; .&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-begin z-shell&quot;&gt;#&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt; Ver estructura del plugin&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;tree&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; &lt;span class=&quot;z-meta z-group z-expansion z-tilde&quot;&gt;&lt;span class=&quot;z-variable z-language z-tilde z-shell&quot;&gt;~&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&#x2F;.claude&#x2F;plugins&#x2F;agent-team-creator&#x2F;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;hr &#x2F;&gt;
&lt;h3 id=&quot;punto-de-dolor-3-problemas-de-validacion-de-schema&quot;&gt;Punto de Dolor #3: Problemas de Validación de Schema&lt;&#x2F;h3&gt;
&lt;p&gt;Mi primer marketplace.json fue rechazado con errores crípticos:&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;owner: Expected object, received string
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;source: Invalid input
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;El schema es estricto y poco documentado. Esto es lo que funciona:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;json&quot; class=&quot;language-json z-code&quot;&gt;&lt;code class=&quot;language-json&quot; data-lang=&quot;json&quot;&gt;&lt;span class=&quot;z-source z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-mapping z-begin z-json&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-json&quot;&gt;  &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-key z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;$schema&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-key-value z-json&quot;&gt;:&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;https:&#x2F;&#x2F;anthropic.com&#x2F;claude-code&#x2F;marketplace.schema.json&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-pair z-json&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;  &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-key z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;name&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-key-value z-json&quot;&gt;:&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;local-marketplace&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-pair z-json&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;  &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-key z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;description&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-key-value z-json&quot;&gt;:&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;Plugins locales para Claude Code&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-pair z-json&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;  &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-key z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;owner&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-key-value z-json&quot;&gt;:&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-mapping z-begin z-json&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-json&quot;&gt;    &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-key z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;name&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-key-value z-json&quot;&gt;:&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;Tu Nombre&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-pair z-json&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;    &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-key z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;email&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-key-value z-json&quot;&gt;:&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;tu@email.com&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;  &lt;span class=&quot;z-punctuation z-section z-mapping z-end z-json&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-pair z-json&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;  &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-key z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;plugins&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-key-value z-json&quot;&gt;:&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-meta z-sequence z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-sequence z-begin z-json&quot;&gt;[&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-meta z-sequence z-json&quot;&gt;    &lt;span class=&quot;z-meta z-mapping z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-mapping z-begin z-json&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-meta z-sequence z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-json&quot;&gt;      &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-key z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;name&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-key-value z-json&quot;&gt;:&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;plugin-name&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-pair z-json&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-meta z-sequence z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;      &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-key z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;description&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-key-value z-json&quot;&gt;:&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;Descripción del plugin&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-pair z-json&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-meta z-sequence z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;      &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-key z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;version&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-key-value z-json&quot;&gt;:&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;1.0.0&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-pair z-json&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-meta z-sequence z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;      &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-key z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;author&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-key-value z-json&quot;&gt;:&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-mapping z-begin z-json&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-meta z-sequence z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-json&quot;&gt;        &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-key z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;name&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-key-value z-json&quot;&gt;:&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;Nombre del Autor&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-pair z-json&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-meta z-sequence z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;        &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-key z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;email&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-key-value z-json&quot;&gt;:&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;author@email.com&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-meta z-sequence z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;      &lt;span class=&quot;z-punctuation z-section z-mapping z-end z-json&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-pair z-json&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-meta z-sequence z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;      &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-key z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;source&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-key-value z-json&quot;&gt;:&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;.&#x2F;&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-pair z-json&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-meta z-sequence z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;      &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-key z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;category&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-key-value z-json&quot;&gt;:&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;development&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-meta z-sequence z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;    &lt;span class=&quot;z-punctuation z-section z-mapping z-end z-json&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-meta z-sequence z-json&quot;&gt;  &lt;span class=&quot;z-punctuation z-section z-sequence z-end z-json&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-mapping z-end z-json&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Trampas clave:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;owner&lt;&#x2F;code&gt; debe ser un objeto con &lt;code&gt;name&lt;&#x2F;code&gt; y &lt;code&gt;email&lt;&#x2F;code&gt;, no un string&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;source&lt;&#x2F;code&gt; debe ser &lt;code&gt;&quot;.&#x2F;&quot;&lt;&#x2F;code&gt; con la barra diagonal&lt;&#x2F;li&gt;
&lt;li&gt;Faltar cualquier campo requerido causa fallos silenciosos&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;acto-iii-el-descubrimiento&quot;&gt;Acto III: El Descubrimiento&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;la-brecha-documentacion-vs-realidad&quot;&gt;La Brecha Documentación vs. Realidad&lt;&#x2F;h3&gt;
&lt;p&gt;El punto de quiebre llegó cuando construí una arquitectura multi-agente completa basada en comportamiento documentado—solo para que fallara completamente.&lt;&#x2F;p&gt;
&lt;p&gt;Los docs prometían:&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;“Herramientas MCP: Los subagentes pueden acceder a herramientas MCP de servidores MCP configurados.”&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Probé extensivamente. Los subagentes definidos en plugins &lt;strong&gt;no pueden&lt;&#x2F;strong&gt; acceder a herramientas MCP. Esto no es un problema de configuración—es un bug conocido rastreado en múltiples issues de GitHub.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;La lección&lt;&#x2F;strong&gt;: La documentación representa comportamiento &lt;em&gt;intencionado&lt;&#x2F;em&gt;, no comportamiento &lt;em&gt;garantizado&lt;&#x2F;em&gt;. Siempre valida suposiciones empíricamente antes de construir arquitecturas dependientes.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;el-muro-del-anidamiento&quot;&gt;El Muro del Anidamiento&lt;&#x2F;h3&gt;
&lt;p&gt;Mi diseño original tenía agentes spawneando sub-agentes especializados en una estructura de árbol recursivo. Elegante en teoría. Imposible en práctica.&lt;&#x2F;p&gt;
&lt;p&gt;Cuando intenté:&lt;&#x2F;p&gt;





&lt;div class=&quot;blocked-flow-container&quot; id=&quot;blocked-&quot;&gt;
    &lt;canvas class=&quot;blocked-flow-canvas&quot; aria-label=&quot;Flow diagram with blocked step&quot;&gt;&lt;&#x2F;canvas&gt;
&lt;&#x2F;div&gt;

&lt;script&gt;
(function() {
    const containerId = &#x27;blocked-&#x27;;
    const nodeNames = [&#x27;Usuario&#x27;, &#x27;Command&#x27;, &#x27;Agente&#x27;, &#x27;SubAgente&#x27;];
    const blockedName = &#x27;SubSubAgente&#x27;;

    function initBlockedFlow() {
        const container = document.getElementById(containerId);
        if (!container) return;

        const canvas = container.querySelector(&#x27;.blocked-flow-canvas&#x27;);
        const ctx = canvas.getContext(&#x27;2d&#x27;);

        let particles = [];
        let time = 0;
        let pulsePhase = 0;

        const colors = {
            nodes: [&#x27;#ff0080&#x27;, &#x27;#00d4ff&#x27;, &#x27;#00ff88&#x27;, &#x27;#8b5cf6&#x27;],
            blocked: &#x27;#ff4444&#x27;,
            blockedBg: &#x27;#442222&#x27;,
            particle: &#x27;#00ff88&#x27;,
            connection: &#x27;rgba(0, 212, 255, 0.4)&#x27;,
            blockedConnection: &#x27;rgba(255, 68, 68, 0.5)&#x27;,
            text: &#x27;#e0e0e4&#x27;
        };

        function resize() {
            const rect = container.getBoundingClientRect();
            canvas.width = rect.width;
            canvas.height = 180;
        }
        resize();
        window.addEventListener(&#x27;resize&#x27;, resize);

        function getNodePositions() {
            const allNodes = [...nodeNames, blockedName];
            const margin = 60;
            const spacing = (canvas.width - margin * 2) &#x2F; (allNodes.length - 1);
            const y = canvas.height &#x2F; 2;

            return allNodes.map((name, i) =&gt; ({
                label: name,
                x: margin + i * spacing,
                y: y,
                radius: 26,
                isBlocked: i === allNodes.length - 1,
                color: i &lt; nodeNames.length ? colors.nodes[i % colors.nodes.length] : colors.blockedBg
            }));
        }

        function draw() {
            ctx.clearRect(0, 0, canvas.width, canvas.height);
            const nodes = getNodePositions();

            pulsePhase += 0.05;

            &#x2F;&#x2F; Draw connections
            for (let i = 0; i &lt; nodes.length - 1; i++) {
                const from = nodes[i];
                const to = nodes[i + 1];
                const isBlockedConnection = to.isBlocked;

                ctx.beginPath();
                ctx.moveTo(from.x + from.radius, from.y);
                ctx.lineTo(to.x - to.radius, to.y);

                if (isBlockedConnection) {
                    ctx.strokeStyle = colors.blockedConnection;
                    ctx.setLineDash([8, 4]);
                } else {
                    ctx.strokeStyle = colors.connection;
                    ctx.setLineDash([]);
                }
                ctx.lineWidth = 3;
                ctx.stroke();
                ctx.setLineDash([]);

                &#x2F;&#x2F; Arrow
                if (!isBlockedConnection) {
                    const midX = (from.x + to.x) &#x2F; 2;
                    ctx.fillStyle = colors.connection;
                    ctx.beginPath();
                    ctx.moveTo(midX - 5, from.y - 6);
                    ctx.lineTo(midX + 8, from.y);
                    ctx.lineTo(midX - 5, from.y + 6);
                    ctx.closePath();
                    ctx.fill();
                }
            }

            &#x2F;&#x2F; Draw &quot;BLOCKED&quot; label on the blocked connection
            const lastNormal = nodes[nodes.length - 2];
            const blocked = nodes[nodes.length - 1];
            const midX = (lastNormal.x + blocked.x) &#x2F; 2;

            ctx.save();
            ctx.fillStyle = colors.blocked;
            ctx.font = &#x27;bold 11px JetBrains Mono&#x27;;
            ctx.textAlign = &#x27;center&#x27;;

            &#x2F;&#x2F; Pulsing X
            const pulse = Math.sin(pulsePhase) * 0.3 + 1;
            ctx.font = `bold ${14 * pulse}px JetBrains Mono`;
            ctx.fillText(&#x27;❌&#x27;, midX, nodes[0].y - 20);

            ctx.font = &#x27;bold 10px JetBrains Mono&#x27;;
            ctx.fillText(&#x27;BLOCKED&#x27;, midX, nodes[0].y + 32);
            ctx.restore();

            &#x2F;&#x2F; Draw nodes
            nodes.forEach((node, i) =&gt; {
                if (node.isBlocked) {
                    &#x2F;&#x2F; Blocked node - pulsing red border
                    ctx.shadowColor = colors.blocked;
                    ctx.shadowBlur = 10 + Math.sin(pulsePhase) * 5;

                    ctx.fillStyle = node.color;
                    ctx.beginPath();
                    ctx.arc(node.x, node.y, node.radius, 0, Math.PI * 2);
                    ctx.fill();

                    ctx.strokeStyle = colors.blocked;
                    ctx.lineWidth = 3;
                    ctx.setLineDash([4, 4]);
                    ctx.stroke();
                    ctx.setLineDash([]);

                    ctx.shadowBlur = 0;

                    &#x2F;&#x2F; Strikethrough effect
                    ctx.strokeStyle = colors.blocked;
                    ctx.lineWidth = 2;
                    ctx.beginPath();
                    ctx.moveTo(node.x - node.radius + 5, node.y - node.radius + 5);
                    ctx.lineTo(node.x + node.radius - 5, node.y + node.radius - 5);
                    ctx.stroke();
                } else {
                    &#x2F;&#x2F; Normal node
                    ctx.shadowColor = node.color;
                    ctx.shadowBlur = 15;

                    ctx.fillStyle = node.color;
                    ctx.beginPath();
                    ctx.arc(node.x, node.y, node.radius, 0, Math.PI * 2);
                    ctx.fill();

                    ctx.shadowBlur = 0;

                    ctx.strokeStyle = &#x27;#00ff88&#x27;;
                    ctx.lineWidth = 2;
                    ctx.stroke();
                }

                &#x2F;&#x2F; Label
                ctx.fillStyle = node.isBlocked ? &#x27;#666&#x27; : &#x27;#0a0a0f&#x27;;
                ctx.font = &#x27;bold 10px JetBrains Mono&#x27;;
                ctx.textAlign = &#x27;center&#x27;;
                ctx.textBaseline = &#x27;middle&#x27;;

                &#x2F;&#x2F; Wrap text if needed
                const words = node.label.split(&#x2F;(?=[A-Z])&#x2F;);
                if (words.length &gt; 1 &amp;&amp; node.label.length &gt; 8) {
                    ctx.fillText(words[0], node.x, node.y - 6);
                    ctx.fillText(words.slice(1).join(&#x27;&#x27;), node.x, node.y + 6);
                } else {
                    ctx.fillText(node.label, node.x, node.y);
                }
            });

            &#x2F;&#x2F; Particles (only on valid connections)
            particles.forEach(p =&gt; {
                p.progress += p.speed;
                if (p.progress &gt;= 1) {
                    p.segmentIndex++;
                    p.progress = 0;
                    if (p.segmentIndex &gt;= nodes.length - 2) {
                        p.segmentIndex = 0;
                    }
                }

                const from = nodes[p.segmentIndex];
                const to = nodes[p.segmentIndex + 1];

                if (from &amp;&amp; to &amp;&amp; !to.isBlocked) {
                    const ease = p.progress * p.progress * (3 - 2 * p.progress);
                    const x = from.x + (to.x - from.x) * ease;
                    const y = from.y + (to.y - from.y) * ease;

                    ctx.fillStyle = colors.particle;
                    ctx.shadowColor = colors.particle;
                    ctx.shadowBlur = 10;
                    ctx.beginPath();
                    ctx.arc(x, y, 4, 0, Math.PI * 2);
                    ctx.fill();
                    ctx.shadowBlur = 0;
                }
            });

            time++;
            requestAnimationFrame(draw);
        }

        &#x2F;&#x2F; Initialize particles
        for (let i = 0; i &lt; 2; i++) {
            particles.push({
                segmentIndex: i,
                progress: 0,
                speed: 0.015
            });
        }

        if (!window.matchMedia(&#x27;(prefers-reduced-motion: reduce)&#x27;).matches) {
            draw();
        } else {
            &#x2F;&#x2F; Static version
            const nodes = getNodePositions();
            nodes.forEach(node =&gt; {
                ctx.fillStyle = node.color;
                ctx.beginPath();
                ctx.arc(node.x, node.y, node.radius, 0, Math.PI * 2);
                ctx.fill();

                ctx.fillStyle = node.isBlocked ? &#x27;#666&#x27; : &#x27;#0a0a0f&#x27;;
                ctx.font = &#x27;bold 10px JetBrains Mono&#x27;;
                ctx.textAlign = &#x27;center&#x27;;
                ctx.fillText(node.label, node.x, node.y);
            });
        }
    }

    if (document.readyState === &#x27;loading&#x27;) {
        document.addEventListener(&#x27;DOMContentLoaded&#x27;, initBlockedFlow);
    } else {
        initBlockedFlow();
    }
})();
&lt;&#x2F;script&gt;

&lt;style&gt;
.blocked-flow-container {
    background: var(--bg-0);
    border: 1px solid var(--divider-color);
    border-radius: 12px;
    padding: 1rem;
    margin: 1.5rem 0;
    position: relative;
}

.blocked-flow-canvas {
    width: 100%;
    height: 180px;
    display: block;
}

@media (max-width: 768px) {
    .blocked-flow-container {
        overflow-x: auto;
    }

    .blocked-flow-canvas {
        min-width: 500px;
    }
}
&lt;&#x2F;style&gt;
&lt;p&gt;Claude Code respondió:&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;Error: Subagents cannot spawn subagents
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Este es un límite duro de la plataforma. Solo un nivel de anidamiento. La restricción existe por buenas razones—prevenir recursión infinita, mantener consumo de recursos acotado, asegurar ejecución predecible. Pero invalidó toda mi arquitectura.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;herencia-de-modelo-que-no-hereda&quot;&gt;Herencia de Modelo que No Hereda&lt;&#x2F;h3&gt;
&lt;p&gt;Configuré mis agentes para usar &lt;code&gt;model: inherit&lt;&#x2F;code&gt;, esperando que usaran cualquier modelo que usara la sesión padre. Cada subagente usó por defecto Sonnet 4, sin importar:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Modelo padre&lt;&#x2F;li&gt;
&lt;li&gt;Configuración global&lt;&#x2F;li&gt;
&lt;li&gt;Configuración local&lt;&#x2F;li&gt;
&lt;li&gt;Configuración explícita del agente&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Otro descubrimiento: Claude Code infiere comportamiento del agente a partir del nombre. Un agente llamado “code-reviewer” activa comportamientos de revisión built-in que pueden sobrescribir tus instrucciones personalizadas. Nombrar no es solo etiquetar—es funcional.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;acto-iv-la-solucion&quot;&gt;Acto IV: La Solución&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;el-patron-de-arquitectura-hibrida&quot;&gt;El Patrón de Arquitectura Híbrida&lt;&#x2F;h3&gt;
&lt;p&gt;Las restricciones crían creatividad. Enfrentando bugs de acceso MCP, límites de anidamiento, y fallos de herencia de modelo, desarrollé lo que ahora llamo el &lt;strong&gt;Patrón de Arquitectura Híbrida&lt;&#x2F;strong&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;La insight central: &lt;strong&gt;Commands y Agents tienen capacidades diferentes. Usa cada uno para lo que hace bien.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Capa de Command (I&#x2F;O)&lt;&#x2F;strong&gt;:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Acceso a herramientas MCP (funciona confiablemente)&lt;&#x2F;li&gt;
&lt;li&gt;Operaciones de sistema de archivos&lt;&#x2F;li&gt;
&lt;li&gt;Interacción con usuario (AskUserQuestion)&lt;&#x2F;li&gt;
&lt;li&gt;Caché de respuestas&lt;&#x2F;li&gt;
&lt;li&gt;Comunicación con servicios externos&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;Capa de Agent (Inteligencia)&lt;&#x2F;strong&gt;:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Razonamiento y análisis puro&lt;&#x2F;li&gt;
&lt;li&gt;Formateo de contenido&lt;&#x2F;li&gt;
&lt;li&gt;Toma de decisiones&lt;&#x2F;li&gt;
&lt;li&gt;Reconocimiento de patrones&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Sin dependencias directas de I&#x2F;O&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Los commands se convierten en adaptadores de I&#x2F;O. Los agentes se convierten en motores de razonamiento. Ninguno intenta hacer el trabajo del otro.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;el-pipeline-de-6-fases&quot;&gt;El Pipeline de 6 Fases&lt;&#x2F;h3&gt;
&lt;p&gt;Así es como esto se manifiesta en mi comando &lt;code&gt;&#x2F;generate-jira-task&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;



&lt;div class=&quot;pipeline-container&quot; id=&quot;pipeline&quot;&gt;
    &lt;canvas class=&quot;pipeline-canvas&quot; aria-label=&quot;Pipeline flow visualization&quot;&gt;&lt;&#x2F;canvas&gt;
    &lt;div class=&quot;pipeline-legend&quot;&gt;
        &lt;span class=&quot;legend-item&quot;&gt;&lt;span class=&quot;legend-dot command&quot;&gt;&lt;&#x2F;span&gt; Command (I&#x2F;O)&lt;&#x2F;span&gt;
        &lt;span class=&quot;legend-item&quot;&gt;&lt;span class=&quot;legend-dot agent&quot;&gt;&lt;&#x2F;span&gt; Agent (Intelligence)&lt;&#x2F;span&gt;
    &lt;&#x2F;div&gt;
&lt;&#x2F;div&gt;

&lt;script&gt;
(function() {
    const containerId = &#x27;pipeline&#x27;;
    const phasesData = [
    {&quot;phase&quot;: 0, &quot;owner&quot;: &quot;Command&quot;, &quot;label&quot;: &quot;Verificar MCP&quot;, &quot;io&quot;: &quot;external&quot;},
    {&quot;phase&quot;: 1, &quot;owner&quot;: &quot;Command&quot;, &quot;label&quot;: &quot;Resolver Proyecto&quot;, &quot;io&quot;: &quot;external&quot;},
    {&quot;phase&quot;: 2, &quot;owner&quot;: &quot;Command&quot;, &quot;label&quot;: &quot;Cargar Informe&quot;, &quot;io&quot;: &quot;local&quot;},
    {&quot;phase&quot;: 3, &quot;owner&quot;: &quot;Command&quot;, &quot;label&quot;: &quot;Verificar Dups&quot;, &quot;io&quot;: &quot;external&quot;},
    {&quot;phase&quot;: 4, &quot;owner&quot;: &quot;Agent&quot;, &quot;label&quot;: &quot;Razonamiento&quot;, &quot;io&quot;: &quot;none&quot;},
    {&quot;phase&quot;: 5, &quot;owner&quot;: &quot;Agent&quot;, &quot;label&quot;: &quot;Formateo&quot;, &quot;io&quot;: &quot;none&quot;},
    {&quot;phase&quot;: 6, &quot;owner&quot;: &quot;Command&quot;, &quot;label&quot;: &quot;Salida&quot;, &quot;io&quot;: &quot;external&quot;}
];

    function initPipeline() {
        const container = document.getElementById(containerId);
        if (!container) return;

        const canvas = container.querySelector(&#x27;.pipeline-canvas&#x27;);
        const ctx = canvas.getContext(&#x27;2d&#x27;);

        &#x2F;&#x2F; Responsive sizing
        function resize() {
            const rect = container.getBoundingClientRect();
            canvas.width = rect.width;
            canvas.height = 180;
        }
        resize();
        window.addEventListener(&#x27;resize&#x27;, resize);

        &#x2F;&#x2F; Colors
        const colors = {
            command: &#x27;#00d4ff&#x27;,
            agent: &#x27;#00ff88&#x27;,
            external: &#x27;#8b5cf6&#x27;,
            local: &#x27;#ff8800&#x27;,
            none: &#x27;#444466&#x27;,
            particle: &#x27;#00ff88&#x27;,
            bg: &#x27;rgba(10, 10, 15, 0.8)&#x27;
        };

        &#x2F;&#x2F; Animation state
        let particles = [];
        let time = 0;

        &#x2F;&#x2F; Get phase positions
        function getPhasePositions() {
            const phases = phasesData;
            const margin = 60;
            const spacing = (canvas.width - margin * 2) &#x2F; (phases.length - 1);
            return phases.map((p, i) =&gt; ({
                ...p,
                x: margin + i * spacing,
                y: canvas.height &#x2F; 2,
                radius: 24
            }));
        }

        &#x2F;&#x2F; Create particle
        function createParticle(positions) {
            return {
                phaseIndex: 0,
                progress: 0,
                speed: 0.01 + Math.random() * 0.01,
                x: positions[0].x,
                y: positions[0].y
            };
        }

        &#x2F;&#x2F; Draw
        function draw() {
            ctx.clearRect(0, 0, canvas.width, canvas.height);
            const positions = getPhasePositions();

            &#x2F;&#x2F; Draw connections
            ctx.lineWidth = 2;
            ctx.strokeStyle = &#x27;rgba(0, 212, 255, 0.3)&#x27;;
            ctx.beginPath();
            positions.forEach((pos, i) =&gt; {
                if (i === 0) ctx.moveTo(pos.x, pos.y);
                else ctx.lineTo(pos.x, pos.y);
            });
            ctx.stroke();

            &#x2F;&#x2F; Draw arrows
            for (let i = 0; i &lt; positions.length - 1; i++) {
                const from = positions[i];
                const to = positions[i + 1];
                const midX = (from.x + to.x) &#x2F; 2;
                const midY = (from.y + to.y) &#x2F; 2;

                ctx.fillStyle = &#x27;rgba(0, 212, 255, 0.5)&#x27;;
                ctx.beginPath();
                ctx.moveTo(midX - 6, midY - 4);
                ctx.lineTo(midX + 6, midY);
                ctx.lineTo(midX - 6, midY + 4);
                ctx.closePath();
                ctx.fill();
            }

            &#x2F;&#x2F; Draw phase nodes
            positions.forEach((pos, i) =&gt; {
                const isCommand = pos.owner === &#x27;Command&#x27;;
                const color = isCommand ? colors.command : colors.agent;

                &#x2F;&#x2F; Glow
                const gradient = ctx.createRadialGradient(pos.x, pos.y, 0, pos.x, pos.y, pos.radius * 2);
                gradient.addColorStop(0, color.replace(&#x27;)&#x27;, &#x27;, 0.3)&#x27;).replace(&#x27;rgb&#x27;, &#x27;rgba&#x27;));
                gradient.addColorStop(1, &#x27;transparent&#x27;);
                ctx.fillStyle = gradient;
                ctx.beginPath();
                ctx.arc(pos.x, pos.y, pos.radius * 2, 0, Math.PI * 2);
                ctx.fill();

                &#x2F;&#x2F; Node
                ctx.fillStyle = color;
                ctx.beginPath();
                ctx.arc(pos.x, pos.y, pos.radius, 0, Math.PI * 2);
                ctx.fill();

                &#x2F;&#x2F; Phase number
                ctx.fillStyle = &#x27;#0a0a0f&#x27;;
                ctx.font = &#x27;bold 14px JetBrains Mono, monospace&#x27;;
                ctx.textAlign = &#x27;center&#x27;;
                ctx.textBaseline = &#x27;middle&#x27;;
                ctx.fillText(pos.phase, pos.x, pos.y);

                &#x2F;&#x2F; Label
                ctx.fillStyle = &#x27;#e0e0e4&#x27;;
                ctx.font = &#x27;11px JetBrains Mono, monospace&#x27;;
                ctx.fillText(pos.label, pos.x, pos.y + pos.radius + 16);

                &#x2F;&#x2F; I&#x2F;O indicator
                if (pos.io !== &#x27;none&#x27;) {
                    ctx.fillStyle = pos.io === &#x27;external&#x27; ? colors.external : colors.local;
                    ctx.font = &#x27;9px JetBrains Mono, monospace&#x27;;
                    ctx.fillText(pos.io.toUpperCase(), pos.x, pos.y - pos.radius - 10);
                }
            });

            &#x2F;&#x2F; Update and draw particles
            particles.forEach(p =&gt; {
                if (p.phaseIndex &gt;= positions.length - 1) {
                    p.phaseIndex = 0;
                    p.progress = 0;
                }

                const from = positions[p.phaseIndex];
                const to = positions[p.phaseIndex + 1];

                p.progress += p.speed;
                if (p.progress &gt;= 1) {
                    p.phaseIndex++;
                    p.progress = 0;
                }

                if (to) {
                    p.x = from.x + (to.x - from.x) * p.progress;
                    p.y = from.y + (to.y - from.y) * p.progress;
                }

                &#x2F;&#x2F; Draw particle
                ctx.fillStyle = colors.particle;
                ctx.beginPath();
                ctx.arc(p.x, p.y, 4, 0, Math.PI * 2);
                ctx.fill();

                &#x2F;&#x2F; Particle glow
                const pGrad = ctx.createRadialGradient(p.x, p.y, 0, p.x, p.y, 12);
                pGrad.addColorStop(0, &#x27;rgba(0, 255, 136, 0.4)&#x27;);
                pGrad.addColorStop(1, &#x27;transparent&#x27;);
                ctx.fillStyle = pGrad;
                ctx.beginPath();
                ctx.arc(p.x, p.y, 12, 0, Math.PI * 2);
                ctx.fill();
            });

            time++;
            requestAnimationFrame(draw);
        }

        &#x2F;&#x2F; Initialize particles
        const positions = getPhasePositions();
        for (let i = 0; i &lt; 3; i++) {
            const p = createParticle(positions);
            p.phaseIndex = i * 2;
            particles.push(p);
        }

        &#x2F;&#x2F; Respect reduced motion
        if (!window.matchMedia(&#x27;(prefers-reduced-motion: reduce)&#x27;).matches) {
            draw();
        } else {
            &#x2F;&#x2F; Static version
            const positions = getPhasePositions();
            ctx.clearRect(0, 0, canvas.width, canvas.height);

            ctx.lineWidth = 2;
            ctx.strokeStyle = &#x27;rgba(0, 212, 255, 0.5)&#x27;;
            ctx.beginPath();
            positions.forEach((pos, i) =&gt; {
                if (i === 0) ctx.moveTo(pos.x, pos.y);
                else ctx.lineTo(pos.x, pos.y);
            });
            ctx.stroke();

            positions.forEach((pos) =&gt; {
                const color = pos.owner === &#x27;Command&#x27; ? colors.command : colors.agent;
                ctx.fillStyle = color;
                ctx.beginPath();
                ctx.arc(pos.x, pos.y, pos.radius, 0, Math.PI * 2);
                ctx.fill();

                ctx.fillStyle = &#x27;#0a0a0f&#x27;;
                ctx.font = &#x27;bold 14px JetBrains Mono, monospace&#x27;;
                ctx.textAlign = &#x27;center&#x27;;
                ctx.textBaseline = &#x27;middle&#x27;;
                ctx.fillText(pos.phase, pos.x, pos.y);

                ctx.fillStyle = &#x27;#e0e0e4&#x27;;
                ctx.font = &#x27;11px JetBrains Mono, monospace&#x27;;
                ctx.fillText(pos.label, pos.x, pos.y + pos.radius + 16);
            });
        }
    }

    if (document.readyState === &#x27;loading&#x27;) {
        document.addEventListener(&#x27;DOMContentLoaded&#x27;, initPipeline);
    } else {
        initPipeline();
    }
})();
&lt;&#x2F;script&gt;

&lt;style&gt;
.pipeline-container {
    background: var(--bg-0);
    border: 1px solid var(--divider-color);
    border-radius: 12px;
    padding: 1.5rem 1rem 1rem;
    margin: 1.5rem 0;
    position: relative;
}

.pipeline-canvas {
    width: 100%;
    height: 180px;
    display: block;
}

.pipeline-legend {
    display: flex;
    justify-content: center;
    gap: 2rem;
    margin-top: 0.5rem;
    font-family: &#x27;JetBrains Mono&#x27;, monospace;
    font-size: 0.8rem;
    color: var(--meta-color);
}

.legend-item {
    display: flex;
    align-items: center;
    gap: 0.5rem;
}

.legend-dot {
    width: 12px;
    height: 12px;
    border-radius: 50%;
}

.legend-dot.command {
    background: #00d4ff;
}

.legend-dot.agent {
    background: #00ff88;
}

@media (max-width: 768px) {
    .pipeline-container {
        overflow-x: auto;
    }

    .pipeline-canvas {
        min-width: 600px;
    }
}
&lt;&#x2F;style&gt;
&lt;p&gt;Los commands manejan toda la comunicación externa (nodos cyan). Los agentes manejan todo el pensamiento (nodos verdes). El límite es limpio—nota cómo las operaciones de I&#x2F;O (marcadas EXTERNAL&#x2F;LOCAL) se agrupan en la capa de Command.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;degradacion-graciosa&quot;&gt;Degradación Graciosa&lt;&#x2F;h3&gt;
&lt;p&gt;¿Qué pasa si MCP no está disponible? El patrón maneja esto elegantemente:&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;FALLBACK_MODE se activa cuando:
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;  - Plugin MCP de Atlassian no disponible
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;Acciones:
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;  - Saltar Fase 1 (resolución de proyecto)
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;  - Saltar Fase 3 (verificación de duplicados)
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;  - Fase 6: Output markdown a .claude&#x2F;reports&#x2F;jira-drafts&#x2F;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;La capa de inteligencia (Fases 4-5) funciona idénticamente ya sea conectada a Jira o no. La capa de I&#x2F;O degrada graciosamente a output de archivo local.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;&lt;strong&gt;★ Momento de Enseñanza: Frontmatter de Command y Agent&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Template de Command&lt;&#x2F;strong&gt;:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;yaml&quot; class=&quot;language-yaml z-code&quot;&gt;&lt;code class=&quot;language-yaml&quot; data-lang=&quot;yaml&quot;&gt;&lt;span class=&quot;z-source z-yaml&quot;&gt;&lt;span class=&quot;z-entity z-other z-document z-begin z-yaml&quot;&gt;---&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-yaml&quot;&gt;&lt;span class=&quot;z-string z-unquoted z-plain z-out z-yaml&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;name&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value z-mapping z-yaml&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-unquoted z-plain z-out z-yaml&quot;&gt;generate-jira-task&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-yaml&quot;&gt;&lt;span class=&quot;z-string z-unquoted z-plain z-out z-yaml&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;description&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value z-mapping z-yaml&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-unquoted z-plain z-out z-yaml&quot;&gt;Generar tarea Jira desde informe de depuración&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-yaml&quot;&gt;&lt;span class=&quot;z-string z-unquoted z-plain z-out z-yaml&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;allowed-tools&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value z-mapping z-yaml&quot;&gt;:&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-yaml&quot;&gt;  &lt;span class=&quot;z-punctuation z-definition z-block z-sequence z-item z-yaml&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-unquoted z-plain z-out z-yaml&quot;&gt;Read&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-yaml&quot;&gt;  &lt;span class=&quot;z-punctuation z-definition z-block z-sequence z-item z-yaml&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-unquoted z-plain z-out z-yaml&quot;&gt;Write&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-yaml&quot;&gt;  &lt;span class=&quot;z-punctuation z-definition z-block z-sequence z-item z-yaml&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-unquoted z-plain z-out z-yaml&quot;&gt;Glob&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-yaml&quot;&gt;  &lt;span class=&quot;z-punctuation z-definition z-block z-sequence z-item z-yaml&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-unquoted z-plain z-out z-yaml&quot;&gt;Grep&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-yaml&quot;&gt;  &lt;span class=&quot;z-punctuation z-definition z-block z-sequence z-item z-yaml&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-unquoted z-plain z-out z-yaml&quot;&gt;Task&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-yaml&quot;&gt;  &lt;span class=&quot;z-punctuation z-definition z-block z-sequence z-item z-yaml&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-unquoted z-plain z-out z-yaml&quot;&gt;AskUserQuestion&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-yaml&quot;&gt;&lt;span class=&quot;z-string z-unquoted z-plain z-out z-yaml&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;argument-hint&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value z-mapping z-yaml&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-yaml&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-yaml&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;[archivo-informe]&lt;span class=&quot;z-punctuation z-definition z-string z-end z-yaml&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-yaml&quot;&gt;&lt;span class=&quot;z-entity z-other z-document z-begin z-yaml&quot;&gt;---&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;strong&gt;Template de Agent&lt;&#x2F;strong&gt;:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;yaml&quot; class=&quot;language-yaml z-code&quot;&gt;&lt;code class=&quot;language-yaml&quot; data-lang=&quot;yaml&quot;&gt;&lt;span class=&quot;z-source z-yaml&quot;&gt;&lt;span class=&quot;z-entity z-other z-document z-begin z-yaml&quot;&gt;---&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-yaml&quot;&gt;&lt;span class=&quot;z-string z-unquoted z-plain z-out z-yaml&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;name&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value z-mapping z-yaml&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-unquoted z-plain z-out z-yaml&quot;&gt;implementation-planner&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-yaml&quot;&gt;&lt;span class=&quot;z-string z-unquoted z-plain z-out z-yaml&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;description&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value z-mapping z-yaml&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-control z-flow z-block-scalar z-literal z-yaml&quot;&gt;|&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-yaml&quot;&gt;&lt;span class=&quot;z-string z-unquoted z-block z-yaml&quot;&gt;  Usa este agente para analizar informes de depuración y crear planes de implementación.
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-yaml&quot;&gt;&lt;span class=&quot;z-string z-unquoted z-block z-yaml&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-unquoted z-plain z-out z-yaml&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;model&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value z-mapping z-yaml&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-unquoted z-plain z-out z-yaml&quot;&gt;inherit&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-yaml&quot;&gt;&lt;span class=&quot;z-string z-unquoted z-plain z-out z-yaml&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;color&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value z-mapping z-yaml&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-unquoted z-plain z-out z-yaml&quot;&gt;cyan&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-yaml&quot;&gt;&lt;span class=&quot;z-string z-unquoted z-plain z-out z-yaml&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;tools&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value z-mapping z-yaml&quot;&gt;:&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-yaml&quot;&gt;  &lt;span class=&quot;z-punctuation z-definition z-block z-sequence z-item z-yaml&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-unquoted z-plain z-out z-yaml&quot;&gt;Read&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-yaml&quot;&gt;  &lt;span class=&quot;z-punctuation z-definition z-block z-sequence z-item z-yaml&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-unquoted z-plain z-out z-yaml&quot;&gt;Grep&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-yaml&quot;&gt;  &lt;span class=&quot;z-punctuation z-definition z-block z-sequence z-item z-yaml&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-unquoted z-plain z-out z-yaml&quot;&gt;Glob&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-yaml&quot;&gt;&lt;span class=&quot;z-entity z-other z-document z-begin z-yaml&quot;&gt;---&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Nota: Los agentes &lt;strong&gt;no&lt;&#x2F;strong&gt; deben incluir herramientas MCP en su lista de tools—no funcionarán de todos modos.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;acto-v-el-retorno&quot;&gt;Acto V: El Retorno&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;lo-que-funciona-ahora&quot;&gt;Lo Que Funciona Ahora&lt;&#x2F;h3&gt;
&lt;p&gt;El plugin agent-team-creator ahora funciona confiablemente con tres commands:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&#x2F;generate-agent-team&lt;&#x2F;code&gt; - Analiza códigos base y genera agentes especializados&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;&#x2F;generate-debugger&lt;&#x2F;code&gt; - Crea agentes de depuración específicos del proyecto&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;&#x2F;generate-jira-task&lt;&#x2F;code&gt; - Convierte informes de depuración a tareas Jira&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Cada uno sigue el Patrón de Arquitectura Híbrida. Los commands manejan I&#x2F;O. Los agentes manejan razonamiento. El sistema degrada graciosamente cuando los servicios no están disponibles.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;lecciones-aprendidas&quot;&gt;Lecciones Aprendidas&lt;&#x2F;h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Lección&lt;&#x2F;th&gt;&lt;th&gt;Implicación&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Confía pero verifica documentación&lt;&#x2F;td&gt;&lt;td&gt;Construye pruebas mínimas de concepto antes de comprometerte con arquitecturas&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Las restricciones revelan claridad&lt;&#x2F;td&gt;&lt;td&gt;El patrón híbrido es más limpio que mi diseño original sin restricciones&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;La sincronización es tu responsabilidad&lt;&#x2F;td&gt;&lt;td&gt;Automatízala. Hazla memoria muscular.&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Nombrar es funcional&lt;&#x2F;td&gt;&lt;td&gt;Los nombres de agentes influencian el comportamiento de la plataforma&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Explícito sobre implícito&lt;&#x2F;td&gt;&lt;td&gt;Nunca asumas herencia de herramientas; declara todo&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h3 id=&quot;checklist-de-inicio-rapido-para-nuevos-desarrolladores-de-plugins&quot;&gt;Checklist de Inicio Rápido para Nuevos Desarrolladores de Plugins&lt;&#x2F;h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Setup&lt;&#x2F;strong&gt;: Crea estructura de marketplace con schema JSON apropiado&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Desarrolla&lt;&#x2F;strong&gt;: Edita archivos solo en la fuente del marketplace&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Sync&lt;&#x2F;strong&gt;: Ejecuta script rsync después de cada cambio&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Reinicia&lt;&#x2F;strong&gt;: Cierra y reinicia Claude Code (no hay hot reload)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Prueba&lt;&#x2F;strong&gt;: Verifica disponibilidad del command con &lt;code&gt;&#x2F;help&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Depura&lt;&#x2F;strong&gt;: Usa &lt;code&gt;diff -r&lt;&#x2F;code&gt; y &lt;code&gt;jq&lt;&#x2F;code&gt; para validación&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;La lección clave: &lt;strong&gt;Commands para I&#x2F;O, Agents para razonamiento&lt;&#x2F;strong&gt;. Este patrón evita cada bug que encontré.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusión&lt;&#x2F;h2&gt;
&lt;p&gt;Construir agent-team-creator me enseñó más sobre arquitectura de agentes IA que cualquier documentación podría. Los bugs no fueron obstáculos—fueron maestros. Las restricciones no fueron limitaciones—fueron principios de diseño disfrazados.&lt;&#x2F;p&gt;
&lt;p&gt;El Patrón de Arquitectura Híbrida emergió de la necesidad, pero ahora creo que es superior a diseños sin restricciones. Límites claros entre capas de I&#x2F;O e inteligencia hacen sistemas más fáciles de probar, depurar, y extender. La degradación graciosa se vuelve natural cuando ya has separado concerns.&lt;&#x2F;p&gt;
&lt;p&gt;En la Parte 2 de esta serie, daré un paso atrás de los detalles prácticos y examinaré qué revelan estos descubrimientos sobre el diseño de frameworks de agentes más ampliamente. ¿Por qué los modelos de herencia se rompen en sistemas multi-agente? ¿Qué hace que la topología hub-and-spoke emerja naturalmente? ¿Y qué nos dice naming-as-behavior sobre sistemas IA en general?&lt;&#x2F;p&gt;
&lt;p&gt;Por ahora, si estás construyendo plugins de Claude Code: abraza las restricciones. Te enseñarán cosas que la documentación no puede.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;obten-el-plugin&quot;&gt;Obtén el Plugin&lt;&#x2F;h2&gt;
&lt;p&gt;El plugin es open source: &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;Cpicon&#x2F;claude-code-plugins&quot;&gt;Cpicon&#x2F;claude-code-plugins&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Usa la pestaña &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;Cpicon&#x2F;claude-code-plugins&#x2F;issues&quot;&gt;GitHub Issues&lt;&#x2F;a&gt; para solicitar features, reportar bugs, o discutir mejoras.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;&lt;strong&gt;Navegación de la Serie:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Parte 0&lt;&#x2F;strong&gt;: &lt;a href=&quot;&#x2F;posts&#x2F;claude-code-plugin-journey-part0&#x2F;&quot;&gt;Agent Team Creator&lt;&#x2F;a&gt; — Qué hace el plugin y cómo usarlo&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Parte 1&lt;&#x2F;strong&gt; (Estás aquí): Construyendo el plugin, lecciones aprendidas&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Parte 2&lt;&#x2F;strong&gt;: &lt;a href=&quot;&#x2F;posts&#x2F;claude-code-plugin-journey-part2&#x2F;&quot;&gt;La Paradoja de la Herencia&lt;&#x2F;a&gt; — Insights de investigación, patrones&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;&lt;em&gt;Este post está basado en observaciones empíricas de construir el plugin agent-team-creator. Todos los puntos de dolor y soluciones fueron documentados a través de sesiones reales de desarrollo.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
</content>
        <summary type="html">El Patrón de Arquitectura Híbrida: Lecciones de agent-team-creator

Esta es la Parte 1 de una serie de tres partes. Comienza con Parte 0: Agent Team Creator para ver qué hace el plugin, o continúa aquí para el viaje de desarrollo.

Pensé que construir un plugin de Claude Code tomaría un fin de semana. Tres días después de luchar con bugs de acceso a herramientas MCP, sincronización de archivos en tres ubicaciones, y documentación que prometía features que no funcionaban, me di cuenta de que estaba construyendo algo más valioso que un plugin—estaba mapeando territorio inexplorado.
Esta es la historia de construir agent-team-creator, un plugin de Claude Code que analiza códigos base y genera agentes IA específicos del proyecto. En el camino, descubrí un patrón que convirtió las limitaciones de la plataforma en claridad arquitectónica: el Patrón de Arquitectura Híbrida.
…</summary>
        </entry><entry xml:lang="es">
        <title>Claude Code Plugin Journey Parte 0: Agent Team Creator</title>
        <published>2026-01-06T10:00:00+00:00</published>
        <updated>2026-01-06T10:00:00+00:00</updated>
        <author>
            <name>Christian Picon Calderon</name>
        </author>
        <link rel="alternate" href="https://futurewithml.netlify.app/es/posts/claude-code-plugin-journey-part0/" type="text/html"/>
        <id>https://futurewithml.netlify.app/es/posts/claude-code-plugin-journey-part0/</id>
        
            <content type="html">&lt;h1 id=&quot;claude-code-plugin-journey-parte-0-agent-team-creator&quot;&gt;Claude Code Plugin Journey Parte 0: Agent Team Creator&lt;&#x2F;h1&gt;
&lt;p&gt;¿Qué pasaría si pudieras apuntar una IA a tu proyecto y hacer que genere especialistas que realmente entienden tu stack? No asistentes genéricos—agentes que conocen tu arquitectura, tus patrones, tus convenciones.&lt;&#x2F;p&gt;
&lt;p&gt;Eso es lo que hace &lt;code&gt;agent-team-creator&lt;&#x2F;code&gt;. Déjame mostrarte el flujo de trabajo.&lt;&#x2F;p&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;escenario-1-genera-tu-equipo-de-agentes&quot;&gt;Escenario 1: Genera tu Equipo de Agentes&lt;&#x2F;h2&gt;
&lt;p&gt;Comienzas un nuevo proyecto—o te unes a uno existente. El código base es desconocido. Necesitas ayuda, pero los consejos genéricos de IA no son suficientes.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Paso 1: Genera tu equipo de agentes&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;&#x2F;generate-agent-team
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Observa cómo el plugin analiza tu proyecto:&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;Analizando código base...
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;├── Lenguajes: Python (75%), TypeScript (20%), SQL (5%)
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;├── Frameworks: FastAPI, React, SQLAlchemy
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;├── Arquitectura: Monorepo con separación backend&#x2F;frontend
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;├── Patrones: Patrón repository, inyección de dependencias
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;Generando agentes especializados...
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;✓ fastapi-expert
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;  Conoce: Tus patrones de endpoints, modelos Pydantic, stack de middleware
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;✓ react-specialist
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;  Conoce: Tu librería de componentes, gestión de estado, patrones de hooks
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;✓ database-architect
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;  Conoce: Tus modelos SQLAlchemy, patrones de migración, convenciones de consultas
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;✓ test-strategist
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;  Conoce: Tus fixtures de pytest, patrones de mocking, utilidades de testing
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;Equipo guardado en .claude&#x2F;agents&#x2F;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;strong&gt;Paso 2: Usa tus agentes inmediatamente&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Ahora tienes especialistas conscientes del proyecto. Así es como usarlos:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Pregunta sobre arquitectura:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;Usa el agente fastapi-expert para explicar cómo funciona
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;la autenticación en este proyecto
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;strong&gt;Implementa una funcionalidad:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;Usa el agente react-specialist para ayudarme a añadir un nuevo
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;componente de dashboard siguiendo nuestros patrones existentes
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;strong&gt;Depura un problema:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;Usa el agente database-architect para ayudarme a entender por qué
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;esta consulta es lenta - revisa src&#x2F;repositories&#x2F;user_repo.py
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;strong&gt;Escribe tests:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;Usa el agente test-strategist para escribir tests de integración para
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;el nuevo endpoint de pagos siguiendo nuestras convenciones de testing
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;strong&gt;¿La diferencia?&lt;&#x2F;strong&gt; Estos agentes no dan consejos genéricos. Referencian &lt;em&gt;tus&lt;&#x2F;em&gt; archivos, &lt;em&gt;tus&lt;&#x2F;em&gt; patrones, &lt;em&gt;tus&lt;&#x2F;em&gt; convenciones.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;escenario-2-flujo-de-trabajo-avanzado-de-depuracion&quot;&gt;Escenario 2: Flujo de Trabajo Avanzado de Depuración&lt;&#x2F;h2&gt;
&lt;p&gt;Después de generar tu equipo de agentes, puedes crear un &lt;strong&gt;Project Debugger&lt;&#x2F;strong&gt;—un orquestador que coordina a tus especialistas para diagnosticar problemas complejos.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Paso 1: Genera el Project Debugger&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;&#x2F;generate-debugger
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;Descubriendo agentes del proyecto...
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;├── Encontrados: fastapi-expert, react-specialist, database-architect, test-strategist
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;Analizando arquitectura del proyecto...
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;├── Puntos de entrada identificados
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;├── Patrones de manejo de errores mapeados
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;├── Convenciones de logging detectadas
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;Generando project-debugger.md...
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;✓ Creado: .claude&#x2F;agents&#x2F;project-debugger.md
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;  - Orquesta tus 4 agentes especialistas
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;  - Produce informes de depuración estructurados
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;  - Identifica causas raíz con referencias archivo:línea
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;strong&gt;Paso 2: Usa el Debugger para investigar&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Cuando encuentres un bug, invoca el project debugger:&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;Usa el agente project-debugger para investigar: Los usuarios están
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;recibiendo errores 500 cuando envían el formulario de checkout
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;El debugger orquesta a tus especialistas:&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;Consultando fastapi-expert...
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;├── Trazado flujo de request a través de api&#x2F;routes&#x2F;checkout.py
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;├── Encontrado: PaymentService.process() lanza excepción no manejada
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;Consultando database-architect...
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;├── Verificado manejo de transacciones en repositories&#x2F;order_repo.py
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;├── Encontrado: Falta rollback en fallo de pago
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;Consultando test-strategist...
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;├── Revisada cobertura de tests para flujo de checkout
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;├── Encontrado: No hay test para escenario de fallo de pago
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;Generando informe de depuración...
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;strong&gt;Paso 3: Genera un informe de depuración&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;El debugger produce un informe estructurado guardado en &lt;code&gt;.claude&#x2F;reports&#x2F;debugging&#x2F;&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;markdown&quot; class=&quot;language-markdown z-code&quot;&gt;&lt;code class=&quot;language-markdown&quot; data-lang=&quot;markdown&quot;&gt;&lt;span class=&quot;z-text z-html z-markdown&quot;&gt;&lt;span class=&quot;z-meta z-block-level z-markdown&quot;&gt;&lt;span class=&quot;z-markup z-heading z-1 z-markdown&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-heading z-begin z-markdown&quot;&gt;#&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-markup z-heading z-1 z-markdown&quot;&gt;&lt;span class=&quot;z-entity z-name z-section z-markdown&quot;&gt;Informe de Depuración: Errores 500 en Checkout&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-whitespace z-newline z-markdown&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-html z-markdown&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-html z-markdown&quot;&gt;&lt;span class=&quot;z-meta z-block-level z-markdown&quot;&gt;&lt;span class=&quot;z-markup z-heading z-2 z-markdown&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-heading z-begin z-markdown&quot;&gt;##&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-markup z-heading z-2 z-markdown&quot;&gt;&lt;span class=&quot;z-entity z-name z-section z-markdown&quot;&gt;Causa Raíz&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-whitespace z-newline z-markdown&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-html z-markdown&quot;&gt;&lt;span class=&quot;z-meta z-paragraph z-markdown&quot;&gt;Falta manejo de excepciones en PaymentService.process()
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-html z-markdown&quot;&gt;&lt;span class=&quot;z-meta z-paragraph z-markdown&quot;&gt;(src&#x2F;services&#x2F;payment.py:45) combinado con falta de
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-html z-markdown&quot;&gt;&lt;span class=&quot;z-meta z-paragraph z-markdown&quot;&gt;rollback de transacción (src&#x2F;repositories&#x2F;order_repo.py:78)
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-html z-markdown&quot;&gt;&lt;span class=&quot;z-meta z-paragraph z-markdown&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-html z-markdown&quot;&gt;&lt;span class=&quot;z-meta z-block-level z-markdown&quot;&gt;&lt;span class=&quot;z-markup z-heading z-2 z-markdown&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-heading z-begin z-markdown&quot;&gt;##&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-markup z-heading z-2 z-markdown&quot;&gt;&lt;span class=&quot;z-entity z-name z-section z-markdown&quot;&gt;Evidencia&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-whitespace z-newline z-markdown&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-html z-markdown&quot;&gt;&lt;span class=&quot;z-markup z-list z-unnumbered z-bullet z-markdown&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-list_item z-markdown&quot;&gt;-&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-markup z-list z-unnumbered z-markdown&quot;&gt; &lt;span class=&quot;z-meta z-paragraph z-list z-markdown&quot;&gt;Archivo: src&#x2F;services&#x2F;payment.py:45-52
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-html z-markdown&quot;&gt;&lt;span class=&quot;z-markup z-list z-unnumbered z-markdown&quot;&gt;&lt;span class=&quot;z-meta z-paragraph z-list z-markdown&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-markup z-list z-unnumbered z-bullet z-markdown&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-list_item z-markdown&quot;&gt;-&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-markup z-list z-unnumbered z-markdown&quot;&gt;&lt;span class=&quot;z-meta z-paragraph z-list z-markdown&quot;&gt; Archivo: src&#x2F;repositories&#x2F;order_repo.py:78-85
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-html z-markdown&quot;&gt;&lt;span class=&quot;z-markup z-list z-unnumbered z-markdown&quot;&gt;&lt;span class=&quot;z-meta z-paragraph z-list z-markdown&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-markup z-list z-unnumbered z-bullet z-markdown&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-list_item z-markdown&quot;&gt;-&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-markup z-list z-unnumbered z-markdown&quot;&gt;&lt;span class=&quot;z-meta z-paragraph z-list z-markdown&quot;&gt; Test faltante: tests&#x2F;integration&#x2F;test_checkout.py
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-html z-markdown&quot;&gt;&lt;span class=&quot;z-markup z-list z-unnumbered z-markdown&quot;&gt;&lt;span class=&quot;z-meta z-paragraph z-list z-markdown&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-markup z-list z-unnumbered z-markdown&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-html z-markdown&quot;&gt;&lt;span class=&quot;z-markup z-list z-unnumbered z-markdown&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block-level z-markdown&quot;&gt;&lt;span class=&quot;z-markup z-heading z-2 z-markdown&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-heading z-begin z-markdown&quot;&gt;##&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-markup z-heading z-2 z-markdown&quot;&gt;&lt;span class=&quot;z-entity z-name z-section z-markdown&quot;&gt;Corrección Recomendada&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-whitespace z-newline z-markdown&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-html z-markdown&quot;&gt;&lt;span class=&quot;z-markup z-list z-numbered z-bullet z-markdown&quot;&gt;1&lt;span class=&quot;z-punctuation z-definition z-list_item z-markdown&quot;&gt;.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-markup z-list z-numbered z-markdown&quot;&gt; &lt;span class=&quot;z-meta z-paragraph z-list z-markdown&quot;&gt;Añadir try&#x2F;except en payment.py:45
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-html z-markdown&quot;&gt;&lt;span class=&quot;z-markup z-list z-numbered z-markdown&quot;&gt;&lt;span class=&quot;z-meta z-paragraph z-list z-markdown&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-markup z-list z-numbered z-bullet z-markdown&quot;&gt;2&lt;span class=&quot;z-punctuation z-definition z-list_item z-markdown&quot;&gt;.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-markup z-list z-numbered z-markdown&quot;&gt;&lt;span class=&quot;z-meta z-paragraph z-list z-markdown&quot;&gt; Implementar rollback en order_repo.py:78
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-html z-markdown&quot;&gt;&lt;span class=&quot;z-markup z-list z-numbered z-markdown&quot;&gt;&lt;span class=&quot;z-meta z-paragraph z-list z-markdown&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-markup z-list z-numbered z-bullet z-markdown&quot;&gt;3&lt;span class=&quot;z-punctuation z-definition z-list_item z-markdown&quot;&gt;.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-markup z-list z-numbered z-markdown&quot;&gt;&lt;span class=&quot;z-meta z-paragraph z-list z-markdown&quot;&gt; Añadir test de escenario de fallo
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-html z-markdown&quot;&gt;&lt;span class=&quot;z-markup z-list z-numbered z-markdown&quot;&gt;&lt;span class=&quot;z-meta z-paragraph z-list z-markdown&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-markup z-list z-numbered z-markdown&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-html z-markdown&quot;&gt;&lt;span class=&quot;z-markup z-list z-numbered z-markdown&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block-level z-markdown&quot;&gt;&lt;span class=&quot;z-markup z-heading z-2 z-markdown&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-heading z-begin z-markdown&quot;&gt;##&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-markup z-heading z-2 z-markdown&quot;&gt;&lt;span class=&quot;z-entity z-name z-section z-markdown&quot;&gt;Efectos Secundarios&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-whitespace z-newline z-markdown&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-html z-markdown&quot;&gt;&lt;span class=&quot;z-markup z-list z-unnumbered z-bullet z-markdown&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-list_item z-markdown&quot;&gt;-&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-markup z-list z-unnumbered z-markdown&quot;&gt; &lt;span class=&quot;z-meta z-paragraph z-list z-markdown&quot;&gt;Los pedidos pueden estar en estado inconsistente (necesita migración)
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;strong&gt;Paso 4: Crea un ticket de Jira desde el informe&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Ahora convierte ese informe en una tarea de Jira. El comando encuentra automáticamente el informe de depuración más reciente:&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;&#x2F;generate-jira-task
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;Buscando último informe de depuración...
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;├── Encontrado: .claude&#x2F;reports&#x2F;debugging&#x2F;report-2026-01-06-1430.md
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;Cargando informe de depuración...
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;Buscando issues similares...
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;├── Buscando: &amp;quot;checkout payment exception rollback&amp;quot;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;├── Encontrados 2 issues potencialmente relacionados:
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;  PROJ-234: &amp;quot;Payment processing timeout errors&amp;quot;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;           Estado: En Progreso
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;  PROJ-189: &amp;quot;Checkout form validation issues&amp;quot;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;           Estado: Hecho
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;¿Cómo deseas proceder?
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;&amp;gt; Crear nueva tarea de todos modos
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;&amp;gt; Abortar - Actualizaré un issue existente
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Si eliges crear una nueva tarea:&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;Creando issue de Jira...
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;✓ Creado: PROJ-456 &amp;quot;Fix checkout 500 errors: missing exception handling&amp;quot;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;  https:&#x2F;&#x2F;yourcompany.atlassian.net&#x2F;browse&#x2F;PROJ-456
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;La verificación de duplicados previene llenar tu backlog con issues relacionados. Si el bug es una variante de un issue existente, puedes actualizar ese ticket en lugar de crear uno nuevo.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;¿No tienes Jira configurado?&lt;&#x2F;strong&gt; El comando degrada gracefully a generar un archivo markdown listo para copiar en &lt;code&gt;.claude&#x2F;reports&#x2F;jira-drafts&#x2F;&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;escenario-3-flujo-de-trabajo-repetible-para-multiples-bugs&quot;&gt;Escenario 3: Flujo de Trabajo Repetible para Múltiples Bugs&lt;&#x2F;h2&gt;
&lt;p&gt;Cada investigación de bug crea su propio informe de depuración, que lleva a su propio ticket de Jira. Así es como el flujo escala a través de múltiples issues:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Lunes: Problema de rendimiento de API&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;Usa el agente project-debugger para investigar: ¿Por qué están
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;subiendo los tiempos de respuesta de la API durante horas pico?
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Informe guardado: &lt;code&gt;.claude&#x2F;reports&#x2F;debugging&#x2F;report-2026-01-06-0900.md&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;&#x2F;generate-jira-task
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Creado: &lt;code&gt;PROJ-457 &quot;Optimize database connection pooling for peak load&quot;&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;&lt;strong&gt;Martes: Bug de renderizado en frontend&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;Usa el agente project-debugger para investigar: El gráfico del
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;dashboard no se actualiza cuando llegan nuevos datos
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Informe guardado: &lt;code&gt;.claude&#x2F;reports&#x2F;debugging&#x2F;report-2026-01-07-1100.md&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;&#x2F;generate-jira-task
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Creado: &lt;code&gt;PROJ-458 &quot;Fix React state synchronization in DashboardChart component&quot;&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;&lt;strong&gt;Miércoles: Caso edge de autenticación&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;Usa el agente project-debugger para investigar: Los usuarios están
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;siendo deslogueados aleatoriamente después de cambios de contraseña
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Informe guardado: &lt;code&gt;.claude&#x2F;reports&#x2F;debugging&#x2F;report-2026-01-08-1400.md&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;&#x2F;generate-jira-task
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Creado: &lt;code&gt;PROJ-459 &quot;Handle session invalidation on password change correctly&quot;&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;Cada investigación es independiente. El debugger crea informes con timestamp, y &lt;code&gt;&#x2F;generate-jira-task&lt;&#x2F;code&gt; siempre toma el más reciente. Tu historial de depuración se acumula en &lt;code&gt;.claude&#x2F;reports&#x2F;debugging&#x2F;&lt;&#x2F;code&gt;, dándote un archivo buscable de investigaciones pasadas.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;el-flujo-de-trabajo-completo&quot;&gt;El Flujo de Trabajo Completo&lt;&#x2F;h2&gt;




&lt;div class=&quot;workflow-container&quot; id=&quot;workflow&quot;&gt;
    &lt;canvas class=&quot;workflow-canvas&quot; aria-label=&quot;Workflow visualization&quot;&gt;&lt;&#x2F;canvas&gt;
&lt;&#x2F;div&gt;

&lt;script&gt;
(function() {
    const containerId = &#x27;workflow&#x27;;

    &#x2F;&#x2F; Decode HTML entities (Tera encodes &#x2F; as &amp;#x2F;)
    function decodeHTML(str) {
        const textarea = document.createElement(&#x27;textarea&#x27;);
        textarea.innerHTML = str;
        return textarea.value;
    }

    const stepsData = [
        
        
        { title: decodeHTML(&#x27;&amp;#x2F;generate-agent-team&#x27;), desc: decodeHTML(&#x27;Crea agentes especialistas&#x27;) },
        
        
        { title: decodeHTML(&#x27;Usa agentes diariamente&#x27;), desc: decodeHTML(&#x27;fastapi-expert react-specialist&#x27;) },
        
        
        { title: decodeHTML(&#x27;&amp;#x2F;generate-debugger&#x27;), desc: decodeHTML(&#x27;Crea project-debugger&#x27;) },
        
        
        { title: decodeHTML(&#x27;Depura issues&#x27;), desc: decodeHTML(&#x27;Guarda en .claude&amp;#x2F;reports&amp;#x2F;&#x27;) },
        
        
        { title: decodeHTML(&#x27;&amp;#x2F;generate-jira-task&#x27;), desc: decodeHTML(&#x27;Crea ticket de Jira&#x27;) }
        
    ];

    function initWorkflow() {
        const container = document.getElementById(containerId);
        if (!container) return;

        const canvas = container.querySelector(&#x27;.workflow-canvas&#x27;);
        const ctx = canvas.getContext(&#x27;2d&#x27;);

        let particles = [];
        let time = 0;

        const colors = {
            primary: &#x27;#00d4ff&#x27;,
            secondary: &#x27;#8b5cf6&#x27;,
            accent: &#x27;#00ff88&#x27;,
            particle: &#x27;#00ff88&#x27;,
            connection: &#x27;rgba(0, 212, 255, 0.4)&#x27;,
            text: &#x27;#e0e0e4&#x27;,
            subtext: &#x27;#8888a0&#x27;
        };

        function resize() {
            const rect = container.getBoundingClientRect();
            canvas.width = rect.width;
            canvas.height = Math.max(550, stepsData.length * 130 + 100);
            container.style.height = canvas.height + &#x27;px&#x27;;
        }
        resize();
        window.addEventListener(&#x27;resize&#x27;, resize);

        function getStepPositions() {
            const centerX = canvas.width &#x2F; 2;
            const startY = 70;
            const stepHeight = 120;

            return stepsData.map((step, i) =&gt; ({
                ...step,
                x: centerX,
                y: startY + i * stepHeight,
                width: Math.min(450, canvas.width * 0.85),
                height: 90,
                color: i % 2 === 0 ? colors.primary : colors.secondary
            }));
        }

        function createParticle(from, to) {
            return {
                fromX: from.x,
                fromY: from.y + from.height &#x2F; 2,
                toX: to.x,
                toY: to.y - to.height &#x2F; 2,
                progress: Math.random(),
                speed: 0.008 + Math.random() * 0.004
            };
        }

        function draw() {
            ctx.clearRect(0, 0, canvas.width, canvas.height);
            const positions = getStepPositions();

            &#x2F;&#x2F; Draw connections
            ctx.strokeStyle = colors.connection;
            ctx.lineWidth = 3;
            for (let i = 0; i &lt; positions.length - 1; i++) {
                const from = positions[i];
                const to = positions[i + 1];

                ctx.beginPath();
                ctx.moveTo(from.x, from.y + from.height &#x2F; 2);
                ctx.lineTo(to.x, to.y - to.height &#x2F; 2);
                ctx.stroke();

                &#x2F;&#x2F; Arrow
                const midY = (from.y + from.height &#x2F; 2 + to.y - to.height &#x2F; 2) &#x2F; 2;
                ctx.fillStyle = colors.connection;
                ctx.beginPath();
                ctx.moveTo(from.x - 6, midY - 4);
                ctx.lineTo(from.x, midY + 6);
                ctx.lineTo(from.x + 6, midY - 4);
                ctx.closePath();
                ctx.fill();
            }

            &#x2F;&#x2F; Draw step boxes
            positions.forEach((pos, i) =&gt; {
                const x = pos.x - pos.width &#x2F; 2;
                const y = pos.y - pos.height &#x2F; 2;

                &#x2F;&#x2F; Glow
                ctx.shadowColor = pos.color;
                ctx.shadowBlur = 20;

                &#x2F;&#x2F; Box with rounded corners
                ctx.fillStyle = pos.color;
                ctx.beginPath();
                const radius = 8;
                ctx.moveTo(x + radius, y);
                ctx.lineTo(x + pos.width - radius, y);
                ctx.quadraticCurveTo(x + pos.width, y, x + pos.width, y + radius);
                ctx.lineTo(x + pos.width, y + pos.height - radius);
                ctx.quadraticCurveTo(x + pos.width, y + pos.height, x + pos.width - radius, y + pos.height);
                ctx.lineTo(x + radius, y + pos.height);
                ctx.quadraticCurveTo(x, y + pos.height, x, y + pos.height - radius);
                ctx.lineTo(x, y + radius);
                ctx.quadraticCurveTo(x, y, x + radius, y);
                ctx.closePath();
                ctx.fill();

                ctx.shadowBlur = 0;

                &#x2F;&#x2F; Border
                ctx.strokeStyle = colors.accent;
                ctx.lineWidth = 2;
                ctx.stroke();

                &#x2F;&#x2F; Step number
                ctx.fillStyle = &#x27;#0a0a0f&#x27;;
                ctx.font = &#x27;bold 18px JetBrains Mono, monospace&#x27;;
                ctx.textAlign = &#x27;left&#x27;;
                ctx.textBaseline = &#x27;middle&#x27;;
                ctx.fillText((i + 1) + &#x27;.&#x27;, x + 16, pos.y);

                &#x2F;&#x2F; Title
                ctx.fillStyle = &#x27;#0a0a0f&#x27;;
                ctx.font = &#x27;bold 16px JetBrains Mono, monospace&#x27;;
                ctx.textAlign = &#x27;center&#x27;;
                ctx.fillText(pos.title, pos.x + 12, pos.y - 10);

                &#x2F;&#x2F; Description (if exists)
                if (pos.desc) {
                    ctx.fillStyle = &#x27;rgba(10, 10, 15, 0.8)&#x27;;
                    ctx.font = &#x27;14px JetBrains Mono, monospace&#x27;;
                    ctx.fillText(pos.desc, pos.x + 12, pos.y + 16);
                }
            });

            &#x2F;&#x2F; Update and draw particles
            particles.forEach(p =&gt; {
                p.progress += p.speed;
                if (p.progress &gt;= 1) {
                    p.progress = 0;
                }

                const ease = p.progress * p.progress * (3 - 2 * p.progress);
                const x = p.fromX + (p.toX - p.fromX) * ease;
                const y = p.fromY + (p.toY - p.fromY) * ease;

                ctx.fillStyle = colors.particle;
                ctx.shadowColor = colors.particle;
                ctx.shadowBlur = 12;
                ctx.beginPath();
                ctx.arc(x, y, 4, 0, Math.PI * 2);
                ctx.fill();
                ctx.shadowBlur = 0;
            });

            time++;
            requestAnimationFrame(draw);
        }

        &#x2F;&#x2F; Initialize particles
        const positions = getStepPositions();
        for (let i = 0; i &lt; positions.length - 1; i++) {
            const p = createParticle(positions[i], positions[i + 1]);
            p.progress = i * 0.3;
            particles.push(p);
        }

        if (!window.matchMedia(&#x27;(prefers-reduced-motion: reduce)&#x27;).matches) {
            draw();
        } else {
            &#x2F;&#x2F; Static version
            const positions = getStepPositions();
            positions.forEach((pos, i) =&gt; {
                const x = pos.x - pos.width &#x2F; 2;
                const y = pos.y - pos.height &#x2F; 2;

                ctx.fillStyle = pos.color;
                ctx.beginPath();
                ctx.roundRect(x, y, pos.width, pos.height, 8);
                ctx.fill();

                ctx.fillStyle = &#x27;#0a0a0f&#x27;;
                ctx.font = &#x27;bold 16px JetBrains Mono&#x27;;
                ctx.textAlign = &#x27;center&#x27;;
                ctx.fillText(pos.title, pos.x, pos.y);
            });
        }
    }

    if (document.readyState === &#x27;loading&#x27;) {
        document.addEventListener(&#x27;DOMContentLoaded&#x27;, initWorkflow);
    } else {
        initWorkflow();
    }
})();
&lt;&#x2F;script&gt;

&lt;style&gt;
.workflow-container {
    background: var(--bg-0);
    border: 1px solid var(--divider-color);
    border-radius: 12px;
    padding: 1rem;
    margin: 1.5rem 0;
    position: relative;
    min-height: 550px;
}

.workflow-canvas {
    width: 100%;
    display: block;
}

@media (max-width: 768px) {
    .workflow-container {
        padding: 0.5rem;
    }
}
&lt;&#x2F;style&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;inicio-rapido&quot;&gt;Inicio Rápido&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;instalacion&quot;&gt;Instalación&lt;&#x2F;h3&gt;
&lt;p&gt;Instala directamente desde el marketplace de GitHub—no requiere clonar:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; class=&quot;language-bash z-code&quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-begin z-shell&quot;&gt;#&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt; Añade el marketplace (configuración única)&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;&#x2F;plugin&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; marketplace add Cpicon&#x2F;claude-code-plugins&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-begin z-shell&quot;&gt;#&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt; Instala el plugin&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;&#x2F;plugin&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; install agent-team-creator&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Eso es todo. El plugin está listo para usar inmediatamente.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;primeros-comandos&quot;&gt;Primeros Comandos&lt;&#x2F;h3&gt;
&lt;ol&gt;
&lt;li&gt;Navega a tu proyecto&lt;&#x2F;li&gt;
&lt;li&gt;Ejecuta &lt;code&gt;&#x2F;generate-agent-team&lt;&#x2F;code&gt; para crear tus agentes especialistas&lt;&#x2F;li&gt;
&lt;li&gt;Comienza a usar tus especialistas: &lt;code&gt;Usa el agente [nombre-agente] para...&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Ejecuta &lt;code&gt;&#x2F;generate-debugger&lt;&#x2F;code&gt; para crear tu project debugger&lt;&#x2F;li&gt;
&lt;li&gt;Usa el debugger para investigar bugs: &lt;code&gt;Usa el agente project-debugger para investigar...&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Ejecuta &lt;code&gt;&#x2F;generate-jira-task&lt;&#x2F;code&gt; para convertir el informe de depuración en un ticket&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;lo-que-obtienes&quot;&gt;Lo Que Obtienes&lt;&#x2F;h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Comando&lt;&#x2F;th&gt;&lt;th&gt;Salida&lt;&#x2F;th&gt;&lt;th&gt;Valor&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;&#x2F;generate-agent-team&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;3-6 agentes especialistas&lt;&#x2F;td&gt;&lt;td&gt;Ayuda consciente del proyecto para features, preguntas, depuración&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;&#x2F;generate-debugger&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Agente orquestador&lt;&#x2F;td&gt;&lt;td&gt;Coordina especialistas para investigaciones complejas&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;&#x2F;generate-jira-task&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Ticket Jira o markdown&lt;&#x2F;td&gt;&lt;td&gt;Auto-encuentra último informe, crea ticket accionable&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h3 id=&quot;ahorro-de-tiempo&quot;&gt;Ahorro de Tiempo&lt;&#x2F;h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Tarea&lt;&#x2F;th&gt;&lt;th&gt;Antes&lt;&#x2F;th&gt;&lt;th&gt;Después&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Obtener ayuda consciente del proyecto&lt;&#x2F;td&gt;&lt;td&gt;N&#x2F;A (solo genérico)&lt;&#x2F;td&gt;&lt;td&gt;Inmediato&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Depurar issues complejos&lt;&#x2F;td&gt;&lt;td&gt;Horas de investigación&lt;&#x2F;td&gt;&lt;td&gt;Informes estructurados&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Escribir tickets de Jira&lt;&#x2F;td&gt;&lt;td&gt;15-30 min&lt;&#x2F;td&gt;&lt;td&gt;2-5 min&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;pruebalo-tu-mismo&quot;&gt;Pruébalo Tú Mismo&lt;&#x2F;h2&gt;
&lt;p&gt;El plugin es open source y está disponible en GitHub: &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;Cpicon&#x2F;claude-code-plugins&quot;&gt;Cpicon&#x2F;claude-code-plugins&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Instálalo con dos comandos, ejecuta &lt;code&gt;&#x2F;generate-agent-team&lt;&#x2F;code&gt;, y observa qué especialistas emergen para tu proyecto.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;contribuir-y-feedback&quot;&gt;Contribuir y Feedback&lt;&#x2F;h3&gt;
&lt;p&gt;¿Tienes ideas para mejoras? ¿Encontraste un bug? La pestaña &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;Cpicon&#x2F;claude-code-plugins&#x2F;issues&quot;&gt;GitHub Issues&lt;&#x2F;a&gt; es donde puedes:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Solicitar features&lt;&#x2F;strong&gt; — Sugerir nuevas capacidades o mejoras&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Reportar bugs&lt;&#x2F;strong&gt; — Ayudar a mejorar la fiabilidad reportando issues que encuentres&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Discutir mejoras&lt;&#x2F;strong&gt; — Compartir ideas para mantenimiento y desarrollo del plugin&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Tu feedback da forma al roadmap del plugin.&lt;&#x2F;p&gt;
&lt;p&gt;En la &lt;a href=&quot;&#x2F;posts&#x2F;claude-code-plugin-journey-part1&#x2F;&quot;&gt;Parte 1&lt;&#x2F;a&gt;, te mostraré cómo construí este plugin—los bugs que encontré, los patrones que descubrí, y por qué la arquitectura funciona como lo hace.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;&lt;strong&gt;Navegación de la Serie:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Parte 0&lt;&#x2F;strong&gt; (Estás aquí): Qué hace el plugin y cómo usarlo&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Parte 1&lt;&#x2F;strong&gt;: &lt;a href=&quot;&#x2F;posts&#x2F;claude-code-plugin-journey-part1&#x2F;&quot;&gt;El Patrón de Arquitectura Híbrida&lt;&#x2F;a&gt; — Construyendo el plugin&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Parte 2&lt;&#x2F;strong&gt;: &lt;a href=&quot;&#x2F;posts&#x2F;claude-code-plugin-journey-part2&#x2F;&quot;&gt;La Paradoja de la Herencia&lt;&#x2F;a&gt; — Insights de investigación&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        <summary type="html">Claude Code Plugin Journey Parte 0: Agent Team Creator
¿Qué pasaría si pudieras apuntar una IA a tu proyecto y hacer que genere especialistas que realmente entienden tu stack? No asistentes genéricos—agentes que conocen tu arquitectura, tus patrones, tus convenciones.
Eso es lo que hace agent-team-creator. Déjame mostrarte el flujo de trabajo.
…</summary>
        </entry>
</feed>
