diff --git a/.claude/agents/blog-article-composer.md b/.claude/agents/blog-article-composer.md new file mode 100644 index 0000000..6afc993 --- /dev/null +++ b/.claude/agents/blog-article-composer.md @@ -0,0 +1,282 @@ +--- +name: blog-article-composer +description: "Use PROACTIVELY when user mentions creating, writing, drafting, or planning blog posts or articles. Delegate when user says 'blog', 'artículo', 'post', 'escribir contenido', or discusses content creation for the Código Sin Siesta website." +tools: Read, Write, Bash, Glob, Grep +model: sonnet +--- + +# Purpose +Expert blog article composer for the Código Sin Siesta Docusaurus website. Specializes in creating high-quality technical content in Spanish, following Docusaurus conventions, SEO best practices, and the project's established guidelines. + +## Core Responsibilities +1. **Content Creation**: Write original, engaging technical articles in Spanish with professional quality +2. **Structure Management**: Create proper file structure (simple .md or directory with assets) +3. **Metadata Configuration**: Apply correct frontmatter and author configuration +4. **SEO Optimization**: Ensure titles, tags, descriptions are optimized for search and discovery +5. **Integration Validation**: Verify the article integrates correctly with the Docusaurus site + +## Instructions + +### 1. Initial Assessment +When a blog article request is received: +- **Clarify the topic**: What subject should the article cover? +- **Determine scope**: Tutorial? Opinion piece? News? Technical deep-dive? +- **Identify assets needed**: Will it need images, code examples, diagrams? +- **Check existing content**: Use Grep to search for related articles to avoid duplication + +### 2. Planning Phase +Before writing, create a clear plan: +- **Title**: Craft an engaging, SEO-friendly title in Spanish +- **Structure outline**: Introduction, main sections, conclusion +- **Target audience**: Beginners, intermediate, advanced developers? +- **Key takeaways**: What should readers learn? +- **Tags**: Identify 3-5 relevant tags +- **Slug**: Create a clean, descriptive URL slug + +### 3. File Structure Decision +Choose appropriate structure: + +**Simple post** (single file): +``` +blog/YYYY-MM-DD-titulo.md +``` +Use when: No custom images or assets needed + +**Directory post** (with assets): +``` +blog/YYYY-MM-DD-titulo/ + ├── index.md + └── imagen.png +``` +Use when: Article includes images, diagrams, or multiple assets + +### 4. Frontmatter Template +Every article MUST include this frontmatter structure: + +```markdown +--- +slug: url-amigable-sin-fecha +title: Título Completo del Artículo +authors: [codigosinsiesta] +tags: [tag1, tag2, tag3] +--- +``` + +**Critical Rules**: +- `slug`: No incluir fecha, solo título descriptivo (e.g., "introduccion-react-hooks") +- `authors`: ALWAYS use `[codigosinsiesta]` unless explicitly instructed otherwise +- `tags`: Use lowercase, Spanish terms when appropriate +- Do NOT add custom fields unless specifically requested + +### 5. Content Structure +Every article should follow this pattern: + +```markdown +--- +[frontmatter] +--- + +[1-2 párrafos de introducción que enganchen al lector y expliquen qué aprenderá] + + + +## Sección Principal 1 +[Contenido detallado...] + +## Sección Principal 2 +[Contenido detallado...] + +## Conclusión +[Resumen de puntos clave y próximos pasos] +``` + +**Best Practices**: +- **Introduction**: Hook the reader, explain value proposition +- ****: MUST appear after intro (shows as preview on blog index) +- **Headings**: Use H2 (##) for main sections, H3 (###) for subsections +- **Code blocks**: Always specify language for syntax highlighting +- **Lists**: Use for clarity and scannability +- **Links**: Use absolute paths (`/docs/intro`) or full URLs + +### 6. Writing Guidelines + +**Language & Tone**: +- Write in **Spanish** (default language of the site) +- Professional but approachable tone +- Use "tú" (informal) when addressing readers +- Explain technical concepts clearly +- Use examples and analogies + +**Code Examples**: +```javascript +// Always include comments explaining key points +const ejemplo = "con sintaxis highlight"; +``` + +**Technical Quality**: +- Verify code examples work +- Include console output or expected results +- Mention versions when relevant +- Link to official documentation + +**SEO Considerations**: +- Title: 50-60 characters, includes main keyword +- First paragraph: Contains target keywords naturally +- Headers: Descriptive and keyword-rich +- Images: Use descriptive filenames (e.g., `react-hooks-diagram.png`) + +### 7. Author Configuration +Check if author exists in `blog/authors.yml`: + +```bash +# Read authors file +Read: blog/authors.yml +``` + +If adding a new author (ONLY when explicitly requested): +```yaml +username: + name: Full Name + title: Title/Role + url: https://github.com/username + image_url: https://github.com/username.png +``` + +**Default**: ALWAYS use `authors: [codigosinsiesta]` unless told otherwise + +### 8. File Creation Process + +**Step 1**: Determine date format +```bash +# Use current date in YYYY-MM-DD format +``` + +**Step 2**: Create file/directory +```bash +# Simple post +Write: blog/2025-12-18-ejemplo.md + +# Directory post +Bash: mkdir -p blog/2025-12-18-ejemplo +Write: blog/2025-12-18-ejemplo/index.md +``` + +**Step 3**: Write complete content with frontmatter + +**Step 4**: If images needed, note their location for user to provide + +### 9. Validation Steps + +Before finalizing: +1. **Frontmatter check**: All required fields present and correctly formatted +2. **Truncate marker**: `` present after introduction +3. **Language**: Entire article in Spanish (unless code/technical terms) +4. **Links**: No broken links, paths are correct +5. **Code blocks**: All have language specifiers +6. **File location**: Correct naming convention (YYYY-MM-DD-titulo) + +### 10. Local Testing Instructions + +After creating the article, provide these instructions to the user: + +```bash +# Start development server to preview +bun start + +# Open http://localhost:3000/blog +# Verify the article appears and renders correctly +``` + +### 11. Asset Management + +If the article needs images: +1. Create directory structure: `blog/YYYY-MM-DD-titulo/` +2. Place `index.md` inside +3. Instruct user where to place images +4. Reference images with: `![Alt text](./imagen.png)` + +### 12. Common Tags Reference + +Suggest appropriate tags from these common categories: +- **Technologies**: javascript, typescript, react, nodejs, python, docusaurus +- **Topics**: tutorial, web-dev, backend, frontend, devops, testing, ai +- **Level**: principiante, intermedio, avanzado +- **Content type**: guia, opinion, noticias, recursos + +## Report Format + +After creating or planning an article, report back with: + +### Article Created Successfully + +**File**: `/Users/alejandro/dev/codigosinsiesta/blog/YYYY-MM-DD-titulo[.md or /index.md]` + +**Title**: [Article Title] + +**Tags**: [tag1, tag2, tag3] + +**Structure**: +- [X] Frontmatter configured +- [X] Introduction with hook +- [X] Truncate marker placed +- [X] Main sections: [list sections] +- [X] Conclusion with takeaways +- [X] Code examples (if applicable) + +**Next Steps**: +1. Review the content at the file path above +2. Test locally: `bun start` and visit http://localhost:3000/blog +3. If article includes images, place them in: [directory path] +4. When satisfied, commit and push to trigger deployment + +**Preview URL** (after deployment): `https://codigosinsiesta.github.io/blog/[slug]` + +--- + +### If Planning Only + +**Proposed Article Plan** + +**Title**: [Proposed Title] +**Slug**: [proposed-slug] +**Tags**: [tag1, tag2, tag3] + +**Outline**: +1. Introduction + - [Key points to cover] +2. [Section 1] + - [Subsections] +3. [Section 2] + - [Subsections] +4. Conclusion + - [Summary points] + +**Estimated Length**: [X words / X sections] + +**Assets Needed**: [Images, diagrams, code repos, etc.] + +**Ready to proceed?** Confirm and I'll create the article file. + +--- + +## Error Handling + +If encountering issues: +- **Missing blog directory**: Create it with `mkdir -p blog` +- **Invalid date format**: Use YYYY-MM-DD strictly +- **Author not found**: Add to `blog/authors.yml` or use default `codigosinsiesta` +- **Frontmatter errors**: Validate YAML syntax carefully + +## Quality Checklist + +Before marking an article complete: +- [ ] Spanish language throughout (except code/terms) +- [ ] Engaging introduction +- [ ] `` after intro +- [ ] Proper heading hierarchy (H2, H3) +- [ ] Code blocks have language tags +- [ ] All links work +- [ ] Frontmatter complete and valid +- [ ] File naming convention followed +- [ ] Tags are relevant and lowercase +- [ ] SEO-friendly title and structure diff --git a/.claude/plan-articulo-claude-code.md b/.claude/plan-articulo-claude-code.md new file mode 100644 index 0000000..609e514 --- /dev/null +++ b/.claude/plan-articulo-claude-code.md @@ -0,0 +1,161 @@ +# Plan: Artículo sobre Skills, MCP, Sub-agents y Slash Commands en Claude Code + +**Fecha de inicio**: 2025-12-19 +**Estado**: COMPLETADO ✅ + +## Objetivo + +Crear un artículo educativo comprehensivo sobre las cuatro piezas fundamentales de extensión en Claude Code (Skills, MCP Servers, Sub-agents, Slash Commands) para la documentación del sitio Código Sin Siesta. + +## Requisitos + +### Estructura del Artículo +- [x] Introducción (200-300 palabras) +- [x] Fundamentos: La Arquitectura de Claude Code (300-400 palabras) +- [x] Comparativa: Cuatro Tipos de Extensión (800-1000 palabras) +- [x] Matriz de Decisión: Cuándo Usar Cada Uno (400-500 palabras) +- [x] Patrones de Composición (400-500 palabras) +- [x] Ejemplos Prácticos (500-600 palabras) +- [x] Mejores Prácticas y Lecciones Aprendidas (300-400 palabras) +- [x] Conclusión (150-200 palabras) + +### Contenido Clave +- [x] Core Four: contexto, modelo, prompt, herramientas +- [x] Tabla comparativa de características +- [x] Árbol de decisión para elegir mecanismo +- [x] Ejemplos concretos de cada patrón +- [x] Anti-patrones comunes +- [x] Patrones de composición (Skill + MCP, escalada gradual, etc.) +- [x] Casos prácticos completos con código + +### Aspectos Técnicos +- [x] Formato: Markdown compatible con Docusaurus +- [x] Idioma: Español +- [x] Tono: Educativo, práctico, directo +- [x] Longitud: 3000-3500 palabras +- [x] Ejemplos de código real +- [x] Referencias a documentación oficial + +### Integración con el Sitio +- [x] Crear archivo en `/docs/herramientas/claude-code-skills-mcp.md` +- [x] Actualizar `sidebars.js` para incluir el artículo +- [x] Verificar frontmatter correcto +- [x] Configurar sidebar_position + +## Progreso + +### Fase 1: Investigación y Análisis ✅ +- [x] Revisar estructura del proyecto +- [x] Verificar configuración de autores +- [x] Analizar estructura de docs existentes +- [x] Identificar ubicación apropiada (docs/herramientas) + +### Fase 2: Redacción del Artículo ✅ +- [x] Introducción: Por qué entender estas piezas es crítico +- [x] Fundamentos: Core Four y arquitectura base +- [x] Comparativa detallada de los 4 mecanismos +- [x] Tabla comparativa completa +- [x] Matriz de decisión con árbol visual +- [x] Ejemplos concretos por cada camino +- [x] Anti-patrones documentados +- [x] 4 patrones de composición principales +- [x] 3 ejemplos prácticos completos +- [x] Mejores prácticas con ejemplos de ✅/❌ +- [x] Conclusión con visión del futuro +- [x] Referencias y recursos + +### Fase 3: Integración ✅ +- [x] Crear archivo en ubicación correcta +- [x] Configurar frontmatter apropiado +- [x] Actualizar sidebars.js +- [x] Añadir a la sección "Herramientas" + +### Fase 4: Validación (Pendiente para el usuario) +- [ ] Testing local: `bun start` +- [ ] Verificar rendering correcto +- [ ] Verificar navegación en sidebar +- [ ] Review de contenido +- [ ] Commit y deploy + +## Decisiones de Diseño + +### Ubicación +**Decisión**: Colocar en `/docs/herramientas/` en lugar de blog +**Razón**: Es contenido educativo permanente, no un post temporal. Mejor como documentación de referencia. + +### Estructura +**Decisión**: Archivo único (no directorio con assets) +**Razón**: No requiere imágenes personalizadas, los diagramas ASCII/texto son suficientes. + +### Enfoque +**Decisión**: Énfasis en "cuándo usar cada uno" más que "cómo configurar" +**Razón**: La configuración técnica está en la docs oficial. El valor añadido es la guía de decisión arquitectónica. + +### Ejemplos +**Decisión**: 3 ejemplos completos en lugar de muchos fragmentos +**Razón**: Mostrar el razonamiento completo de escalada y composición es más valioso que snippets aislados. + +## Entregables + +### Archivos Creados +1. `/Users/alejandro/dev/codigosinsiesta/docs/herramientas/claude-code-skills-mcp.md` + - Artículo completo (≈3400 palabras) + - Frontmatter con sidebar_position: 5 + - 8 secciones principales + - 3 ejemplos prácticos completos + - Tabla comparativa + - Árbol de decisión + - Referencias y recursos + +2. `/Users/alejandro/dev/codigosinsiesta/sidebars.js` (actualizado) + - Añadido 'herramientas/claude-code-skills-mcp' al final de la categoría Herramientas + +3. `/Users/alejandro/dev/codigosinsiesta/.claude/plan-articulo-claude-code.md` (este archivo) + - Documentación del plan y progreso + +## Métricas + +- **Palabras**: ≈3400 (dentro del rango 3000-3500) +- **Secciones**: 8 principales + subsecciones +- **Ejemplos de código**: 15+ bloques +- **Tablas**: 1 comparativa completa +- **Diagramas**: 1 árbol de decisión ASCII +- **Referencias**: 5 enlaces a documentación oficial + +## Próximos Pasos (Para el Usuario) + +1. **Testing local**: + ```bash + cd /Users/alejandro/dev/codigosinsiesta + bun start + ``` + +2. **Verificar**: + - Abrir http://localhost:3000/docs/herramientas/claude-code-skills-mcp + - Verificar que el artículo se renderiza correctamente + - Verificar que aparece en el sidebar bajo "Herramientas" + - Review del contenido y tono + +3. **Deploy** (cuando esté satisfecho): + ```bash + git add docs/herramientas/claude-code-skills-mcp.md sidebars.js + git commit -m "docs: Agregar artículo sobre Skills, MCP, Sub-agents y Slash Commands en Claude Code" + git push origin main + ``` + +4. **URL final** (después del deploy): + - https://codigosinsiesta.github.io/docs/herramientas/claude-code-skills-mcp + +## Notas Finales + +- Artículo creado siguiendo instrucciones de no incluir al autor Claude +- Contenido en español manteniendo consistencia con el resto del sitio +- Enfoque educativo y práctico, evitando superlátivos excesivos +- Ejemplos reales y aplicables +- Balance entre profundidad técnica y accesibilidad +- Referencias a fuentes primarias (docs oficiales, video de YouTube) + +--- + +**Estado final**: COMPLETADO ✅ +**Archivos listos para review y deploy** diff --git a/bun.lock b/bun.lock index 4d44cfc..a84e11b 100644 --- a/bun.lock +++ b/bun.lock @@ -7,6 +7,7 @@ "dependencies": { "@docusaurus/core": "3.9.2", "@docusaurus/preset-classic": "3.9.2", + "@docusaurus/theme-mermaid": "^3.9.2", "@mdx-js/react": "^3.0.0", "clsx": "^2.0.0", "prism-react-renderer": "^2.3.0", @@ -64,6 +65,8 @@ "@algolia/requester-node-http": ["@algolia/requester-node-http@5.46.0", "", { "dependencies": { "@algolia/client-common": "5.46.0" } }, "sha512-xaqXyna5yBZ+r1SJ9my/DM6vfTqJg9FJgVydRJ0lnO+D5NhqGW/qaRG/iBGKr/d4fho34el6WakV7BqJvrl/HQ=="], + "@antfu/install-pkg": ["@antfu/install-pkg@1.1.0", "", { "dependencies": { "package-manager-detector": "^1.3.0", "tinyexec": "^1.0.1" } }, "sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ=="], + "@babel/code-frame": ["@babel/code-frame@7.27.1", "", { "dependencies": { "@babel/helper-validator-identifier": "7.28.5", "js-tokens": "4.0.0", "picocolors": "1.1.1" } }, "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg=="], "@babel/compat-data": ["@babel/compat-data@7.28.5", "", {}, "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA=="], @@ -270,6 +273,18 @@ "@babel/types": ["@babel/types@7.28.5", "", { "dependencies": { "@babel/helper-string-parser": "7.27.1", "@babel/helper-validator-identifier": "7.28.5" } }, "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA=="], + "@braintree/sanitize-url": ["@braintree/sanitize-url@7.1.1", "", {}, "sha512-i1L7noDNxtFyL5DmZafWy1wRVhGehQmzZaz1HiN5e7iylJMSZR7ekOV7NsIqa5qBldlLrsKv4HbgFUVlQrz8Mw=="], + + "@chevrotain/cst-dts-gen": ["@chevrotain/cst-dts-gen@11.0.3", "", { "dependencies": { "@chevrotain/gast": "11.0.3", "@chevrotain/types": "11.0.3", "lodash-es": "4.17.21" } }, "sha512-BvIKpRLeS/8UbfxXxgC33xOumsacaeCKAjAeLyOn7Pcp95HiRbrpl14S+9vaZLolnbssPIUuiUd8IvgkRyt6NQ=="], + + "@chevrotain/gast": ["@chevrotain/gast@11.0.3", "", { "dependencies": { "@chevrotain/types": "11.0.3", "lodash-es": "4.17.21" } }, "sha512-+qNfcoNk70PyS/uxmj3li5NiECO+2YKZZQMbmjTqRI3Qchu8Hig/Q9vgkHpI3alNjr7M+a2St5pw5w5F6NL5/Q=="], + + "@chevrotain/regexp-to-ast": ["@chevrotain/regexp-to-ast@11.0.3", "", {}, "sha512-1fMHaBZxLFvWI067AVbGJav1eRY7N8DDvYCTwGBiE/ytKBgP8azTdgyrKyWZ9Mfh09eHWb5PgTSO8wi7U824RA=="], + + "@chevrotain/types": ["@chevrotain/types@11.0.3", "", {}, "sha512-gsiM3G8b58kZC2HaWR50gu6Y1440cHiJ+i3JUvcp/35JchYejb2+5MVeJK0iKThYpAa/P2PYFV4hoi44HD+aHQ=="], + + "@chevrotain/utils": ["@chevrotain/utils@11.0.3", "", {}, "sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ=="], + "@colors/colors": ["@colors/colors@1.5.0", "", {}, "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ=="], "@csstools/cascade-layer-name-parser": ["@csstools/cascade-layer-name-parser@2.0.5", "", { "peerDependencies": { "@csstools/css-parser-algorithms": "3.0.5", "@csstools/css-tokenizer": "3.0.4" } }, "sha512-p1ko5eHgV+MgXFVa4STPKpvPxr6ReS8oS2jzTukjR74i5zJNyWO1ZM1m8YKBXnzDKWfBN1ztLYlHxbVemDD88A=="], @@ -416,6 +431,8 @@ "@docusaurus/theme-common": ["@docusaurus/theme-common@3.9.2", "", { "dependencies": { "@docusaurus/mdx-loader": "3.9.2", "@docusaurus/module-type-aliases": "3.9.2", "@docusaurus/utils": "3.9.2", "@docusaurus/utils-common": "3.9.2", "@types/history": "4.7.11", "@types/react": "19.2.7", "@types/react-router-config": "5.0.11", "clsx": "2.1.1", "parse-numeric-range": "1.3.0", "prism-react-renderer": "2.4.1", "tslib": "2.8.1", "utility-types": "3.11.0" }, "peerDependencies": { "@docusaurus/plugin-content-docs": "3.9.2", "react": "19.2.1", "react-dom": "19.2.1" } }, "sha512-6c4DAbR6n6nPbnZhY2V3tzpnKnGL+6aOsLvFL26VRqhlczli9eWG0VDUNoCQEPnGwDMhPS42UhSAnz5pThm5Ag=="], + "@docusaurus/theme-mermaid": ["@docusaurus/theme-mermaid@3.9.2", "", { "dependencies": { "@docusaurus/core": "3.9.2", "@docusaurus/module-type-aliases": "3.9.2", "@docusaurus/theme-common": "3.9.2", "@docusaurus/types": "3.9.2", "@docusaurus/utils-validation": "3.9.2", "mermaid": ">=11.6.0", "tslib": "^2.6.0" }, "peerDependencies": { "@mermaid-js/layout-elk": "^0.1.9", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@mermaid-js/layout-elk"] }, "sha512-5vhShRDq/ntLzdInsQkTdoKWSzw8d1jB17sNPYhA/KvYYFXfuVEGHLM6nrf8MFbV8TruAHDG21Fn3W4lO8GaDw=="], + "@docusaurus/theme-search-algolia": ["@docusaurus/theme-search-algolia@3.9.2", "", { "dependencies": { "@docsearch/react": "4.3.2", "@docusaurus/core": "3.9.2", "@docusaurus/logger": "3.9.2", "@docusaurus/plugin-content-docs": "3.9.2", "@docusaurus/theme-common": "3.9.2", "@docusaurus/theme-translations": "3.9.2", "@docusaurus/utils": "3.9.2", "@docusaurus/utils-validation": "3.9.2", "algoliasearch": "5.46.0", "algoliasearch-helper": "3.26.1", "clsx": "2.1.1", "eta": "2.2.0", "fs-extra": "11.3.2", "lodash": "4.17.21", "tslib": "2.8.1", "utility-types": "3.11.0" }, "peerDependencies": { "react": "19.2.1", "react-dom": "19.2.1" } }, "sha512-GBDSFNwjnh5/LdkxCKQHkgO2pIMX1447BxYUBG2wBiajS21uj64a+gH/qlbQjDLxmGrbrllBrtJkUHxIsiwRnw=="], "@docusaurus/theme-translations": ["@docusaurus/theme-translations@3.9.2", "", { "dependencies": { "fs-extra": "11.3.2", "tslib": "2.8.1" } }, "sha512-vIryvpP18ON9T9rjgMRFLr2xJVDpw1rtagEGf8Ccce4CkTrvM/fRB8N2nyWYOW5u3DdjkwKw5fBa+3tbn9P4PA=="], @@ -432,6 +449,10 @@ "@hapi/topo": ["@hapi/topo@5.1.0", "", { "dependencies": { "@hapi/hoek": "9.3.0" } }, "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg=="], + "@iconify/types": ["@iconify/types@2.0.0", "", {}, "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg=="], + + "@iconify/utils": ["@iconify/utils@3.1.0", "", { "dependencies": { "@antfu/install-pkg": "^1.1.0", "@iconify/types": "^2.0.0", "mlly": "^1.8.0" } }, "sha512-Zlzem1ZXhI1iHeeERabLNzBHdOa4VhQbqAcOQaMKuTuyZCpwKbC2R4Dd0Zo3g9EAc+Y4fiarO8HIHRAth7+skw=="], + "@jest/schemas": ["@jest/schemas@29.6.3", "", { "dependencies": { "@sinclair/typebox": "0.27.8" } }, "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA=="], "@jest/types": ["@jest/types@29.6.3", "", { "dependencies": { "@jest/schemas": "29.6.3", "@types/istanbul-lib-coverage": "2.0.6", "@types/istanbul-reports": "3.0.4", "@types/node": "25.0.0", "@types/yargs": "17.0.35", "chalk": "4.1.2" } }, "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw=="], @@ -466,6 +487,8 @@ "@mdx-js/react": ["@mdx-js/react@3.1.1", "", { "dependencies": { "@types/mdx": "2.0.13" }, "peerDependencies": { "@types/react": "19.2.7", "react": "19.2.1" } }, "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw=="], + "@mermaid-js/parser": ["@mermaid-js/parser@0.6.3", "", { "dependencies": { "langium": "3.3.1" } }, "sha512-lnjOhe7zyHjc+If7yT4zoedx2vo4sHaTmtkl1+or8BRTnCtDmcTpAjpzDSfCZrshM5bCoz0GyidzadJAH1xobA=="], + "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "1.2.0" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="], "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="], @@ -536,6 +559,68 @@ "@types/connect-history-api-fallback": ["@types/connect-history-api-fallback@1.5.4", "", { "dependencies": { "@types/express-serve-static-core": "4.19.7", "@types/node": "25.0.0" } }, "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw=="], + "@types/d3": ["@types/d3@7.4.3", "", { "dependencies": { "@types/d3-array": "*", "@types/d3-axis": "*", "@types/d3-brush": "*", "@types/d3-chord": "*", "@types/d3-color": "*", "@types/d3-contour": "*", "@types/d3-delaunay": "*", "@types/d3-dispatch": "*", "@types/d3-drag": "*", "@types/d3-dsv": "*", "@types/d3-ease": "*", "@types/d3-fetch": "*", "@types/d3-force": "*", "@types/d3-format": "*", "@types/d3-geo": "*", "@types/d3-hierarchy": "*", "@types/d3-interpolate": "*", "@types/d3-path": "*", "@types/d3-polygon": "*", "@types/d3-quadtree": "*", "@types/d3-random": "*", "@types/d3-scale": "*", "@types/d3-scale-chromatic": "*", "@types/d3-selection": "*", "@types/d3-shape": "*", "@types/d3-time": "*", "@types/d3-time-format": "*", "@types/d3-timer": "*", "@types/d3-transition": "*", "@types/d3-zoom": "*" } }, "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww=="], + + "@types/d3-array": ["@types/d3-array@3.2.2", "", {}, "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw=="], + + "@types/d3-axis": ["@types/d3-axis@3.0.6", "", { "dependencies": { "@types/d3-selection": "*" } }, "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw=="], + + "@types/d3-brush": ["@types/d3-brush@3.0.6", "", { "dependencies": { "@types/d3-selection": "*" } }, "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A=="], + + "@types/d3-chord": ["@types/d3-chord@3.0.6", "", {}, "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg=="], + + "@types/d3-color": ["@types/d3-color@3.1.3", "", {}, "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A=="], + + "@types/d3-contour": ["@types/d3-contour@3.0.6", "", { "dependencies": { "@types/d3-array": "*", "@types/geojson": "*" } }, "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg=="], + + "@types/d3-delaunay": ["@types/d3-delaunay@6.0.4", "", {}, "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw=="], + + "@types/d3-dispatch": ["@types/d3-dispatch@3.0.7", "", {}, "sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA=="], + + "@types/d3-drag": ["@types/d3-drag@3.0.7", "", { "dependencies": { "@types/d3-selection": "*" } }, "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ=="], + + "@types/d3-dsv": ["@types/d3-dsv@3.0.7", "", {}, "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g=="], + + "@types/d3-ease": ["@types/d3-ease@3.0.2", "", {}, "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA=="], + + "@types/d3-fetch": ["@types/d3-fetch@3.0.7", "", { "dependencies": { "@types/d3-dsv": "*" } }, "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA=="], + + "@types/d3-force": ["@types/d3-force@3.0.10", "", {}, "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw=="], + + "@types/d3-format": ["@types/d3-format@3.0.4", "", {}, "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g=="], + + "@types/d3-geo": ["@types/d3-geo@3.1.0", "", { "dependencies": { "@types/geojson": "*" } }, "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ=="], + + "@types/d3-hierarchy": ["@types/d3-hierarchy@3.1.7", "", {}, "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg=="], + + "@types/d3-interpolate": ["@types/d3-interpolate@3.0.4", "", { "dependencies": { "@types/d3-color": "*" } }, "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA=="], + + "@types/d3-path": ["@types/d3-path@3.1.1", "", {}, "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg=="], + + "@types/d3-polygon": ["@types/d3-polygon@3.0.2", "", {}, "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA=="], + + "@types/d3-quadtree": ["@types/d3-quadtree@3.0.6", "", {}, "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg=="], + + "@types/d3-random": ["@types/d3-random@3.0.3", "", {}, "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ=="], + + "@types/d3-scale": ["@types/d3-scale@4.0.9", "", { "dependencies": { "@types/d3-time": "*" } }, "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw=="], + + "@types/d3-scale-chromatic": ["@types/d3-scale-chromatic@3.1.0", "", {}, "sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ=="], + + "@types/d3-selection": ["@types/d3-selection@3.0.11", "", {}, "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w=="], + + "@types/d3-shape": ["@types/d3-shape@3.1.7", "", { "dependencies": { "@types/d3-path": "*" } }, "sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg=="], + + "@types/d3-time": ["@types/d3-time@3.0.4", "", {}, "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g=="], + + "@types/d3-time-format": ["@types/d3-time-format@4.0.3", "", {}, "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg=="], + + "@types/d3-timer": ["@types/d3-timer@3.0.2", "", {}, "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw=="], + + "@types/d3-transition": ["@types/d3-transition@3.0.9", "", { "dependencies": { "@types/d3-selection": "*" } }, "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg=="], + + "@types/d3-zoom": ["@types/d3-zoom@3.0.8", "", { "dependencies": { "@types/d3-interpolate": "*", "@types/d3-selection": "*" } }, "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw=="], + "@types/debug": ["@types/debug@4.1.12", "", { "dependencies": { "@types/ms": "2.1.0" } }, "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ=="], "@types/eslint": ["@types/eslint@9.6.1", "", { "dependencies": { "@types/estree": "1.0.8", "@types/json-schema": "7.0.15" } }, "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag=="], @@ -550,6 +635,8 @@ "@types/express-serve-static-core": ["@types/express-serve-static-core@4.19.7", "", { "dependencies": { "@types/node": "25.0.0", "@types/qs": "6.14.0", "@types/range-parser": "1.2.7", "@types/send": "1.2.1" } }, "sha512-FvPtiIf1LfhzsaIXhv/PHan/2FeQBbtBDtfX2QfvPxdUelMDEckK08SM6nqo1MIZY3RUlfA+HV8+hFUSio78qg=="], + "@types/geojson": ["@types/geojson@7946.0.16", "", {}, "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg=="], + "@types/gtag.js": ["@types/gtag.js@0.0.12", "", {}, "sha512-YQV9bUsemkzG81Ea295/nF/5GijnD2Af7QhEofh7xu+kvCN6RdodgNwwGWXB5GMI3NoyvQo0odNctoH/qLMIpg=="], "@types/hast": ["@types/hast@3.0.4", "", { "dependencies": { "@types/unist": "3.0.3" } }, "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ=="], @@ -610,6 +697,8 @@ "@types/sockjs": ["@types/sockjs@0.3.36", "", { "dependencies": { "@types/node": "25.0.0" } }, "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q=="], + "@types/trusted-types": ["@types/trusted-types@2.0.7", "", {}, "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw=="], + "@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="], "@types/ws": ["@types/ws@8.18.1", "", { "dependencies": { "@types/node": "25.0.0" } }, "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg=="], @@ -786,6 +875,10 @@ "cheerio-select": ["cheerio-select@2.1.0", "", { "dependencies": { "boolbase": "1.0.0", "css-select": "5.2.2", "css-what": "6.2.2", "domelementtype": "2.3.0", "domhandler": "5.0.3", "domutils": "3.2.2" } }, "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g=="], + "chevrotain": ["chevrotain@11.0.3", "", { "dependencies": { "@chevrotain/cst-dts-gen": "11.0.3", "@chevrotain/gast": "11.0.3", "@chevrotain/regexp-to-ast": "11.0.3", "@chevrotain/types": "11.0.3", "@chevrotain/utils": "11.0.3", "lodash-es": "4.17.21" } }, "sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw=="], + + "chevrotain-allstar": ["chevrotain-allstar@0.3.1", "", { "dependencies": { "lodash-es": "^4.17.21" }, "peerDependencies": { "chevrotain": "^11.0.0" } }, "sha512-b7g+y9A0v4mxCW1qUhf3BSVPg+/NvGErk/dOkrDaHA0nQIQGAtrOjlX//9OQtRlSCy+x9rfB5N8yC71lH1nvMw=="], + "chokidar": ["chokidar@3.6.0", "", { "dependencies": { "anymatch": "3.1.3", "braces": "3.0.3", "glob-parent": "5.1.2", "is-binary-path": "2.1.0", "is-glob": "4.0.3", "normalize-path": "3.0.0", "readdirp": "3.6.0" }, "optionalDependencies": { "fsevents": "2.3.3" } }, "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw=="], "chrome-trace-event": ["chrome-trace-event@1.0.4", "", {}, "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ=="], @@ -828,6 +921,8 @@ "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], + "confbox": ["confbox@0.1.8", "", {}, "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w=="], + "config-chain": ["config-chain@1.1.13", "", { "dependencies": { "ini": "1.3.8", "proto-list": "1.2.4" } }, "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ=="], "configstore": ["configstore@6.0.0", "", { "dependencies": { "dot-prop": "6.0.1", "graceful-fs": "4.2.11", "unique-string": "3.0.0", "write-file-atomic": "3.0.3", "xdg-basedir": "5.1.0" } }, "sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA=="], @@ -856,6 +951,8 @@ "core-util-is": ["core-util-is@1.0.3", "", {}, "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="], + "cose-base": ["cose-base@1.0.3", "", { "dependencies": { "layout-base": "^1.0.0" } }, "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg=="], + "cosmiconfig": ["cosmiconfig@8.3.6", "", { "dependencies": { "import-fresh": "3.3.1", "js-yaml": "4.1.1", "parse-json": "5.2.0", "path-type": "4.0.0" } }, "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA=="], "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "3.1.1", "shebang-command": "2.0.0", "which": "2.0.2" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], @@ -896,6 +993,80 @@ "csstype": ["csstype@3.2.3", "", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="], + "cytoscape": ["cytoscape@3.33.1", "", {}, "sha512-iJc4TwyANnOGR1OmWhsS9ayRS3s+XQ185FmuHObThD+5AeJCakAAbWv8KimMTt08xCCLNgneQwFp+JRJOr9qGQ=="], + + "cytoscape-cose-bilkent": ["cytoscape-cose-bilkent@4.1.0", "", { "dependencies": { "cose-base": "^1.0.0" }, "peerDependencies": { "cytoscape": "^3.2.0" } }, "sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ=="], + + "cytoscape-fcose": ["cytoscape-fcose@2.2.0", "", { "dependencies": { "cose-base": "^2.2.0" }, "peerDependencies": { "cytoscape": "^3.2.0" } }, "sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ=="], + + "d3": ["d3@7.9.0", "", { "dependencies": { "d3-array": "3", "d3-axis": "3", "d3-brush": "3", "d3-chord": "3", "d3-color": "3", "d3-contour": "4", "d3-delaunay": "6", "d3-dispatch": "3", "d3-drag": "3", "d3-dsv": "3", "d3-ease": "3", "d3-fetch": "3", "d3-force": "3", "d3-format": "3", "d3-geo": "3", "d3-hierarchy": "3", "d3-interpolate": "3", "d3-path": "3", "d3-polygon": "3", "d3-quadtree": "3", "d3-random": "3", "d3-scale": "4", "d3-scale-chromatic": "3", "d3-selection": "3", "d3-shape": "3", "d3-time": "3", "d3-time-format": "4", "d3-timer": "3", "d3-transition": "3", "d3-zoom": "3" } }, "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA=="], + + "d3-array": ["d3-array@3.2.4", "", { "dependencies": { "internmap": "1 - 2" } }, "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg=="], + + "d3-axis": ["d3-axis@3.0.0", "", {}, "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw=="], + + "d3-brush": ["d3-brush@3.0.0", "", { "dependencies": { "d3-dispatch": "1 - 3", "d3-drag": "2 - 3", "d3-interpolate": "1 - 3", "d3-selection": "3", "d3-transition": "3" } }, "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ=="], + + "d3-chord": ["d3-chord@3.0.1", "", { "dependencies": { "d3-path": "1 - 3" } }, "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g=="], + + "d3-color": ["d3-color@3.1.0", "", {}, "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA=="], + + "d3-contour": ["d3-contour@4.0.2", "", { "dependencies": { "d3-array": "^3.2.0" } }, "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA=="], + + "d3-delaunay": ["d3-delaunay@6.0.4", "", { "dependencies": { "delaunator": "5" } }, "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A=="], + + "d3-dispatch": ["d3-dispatch@3.0.1", "", {}, "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg=="], + + "d3-drag": ["d3-drag@3.0.0", "", { "dependencies": { "d3-dispatch": "1 - 3", "d3-selection": "3" } }, "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg=="], + + "d3-dsv": ["d3-dsv@3.0.1", "", { "dependencies": { "commander": "7", "iconv-lite": "0.6", "rw": "1" }, "bin": { "csv2json": "bin/dsv2json.js", "csv2tsv": "bin/dsv2dsv.js", "dsv2dsv": "bin/dsv2dsv.js", "dsv2json": "bin/dsv2json.js", "json2csv": "bin/json2dsv.js", "json2dsv": "bin/json2dsv.js", "json2tsv": "bin/json2dsv.js", "tsv2csv": "bin/dsv2dsv.js", "tsv2json": "bin/dsv2json.js" } }, "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q=="], + + "d3-ease": ["d3-ease@3.0.1", "", {}, "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w=="], + + "d3-fetch": ["d3-fetch@3.0.1", "", { "dependencies": { "d3-dsv": "1 - 3" } }, "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw=="], + + "d3-force": ["d3-force@3.0.0", "", { "dependencies": { "d3-dispatch": "1 - 3", "d3-quadtree": "1 - 3", "d3-timer": "1 - 3" } }, "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg=="], + + "d3-format": ["d3-format@3.1.0", "", {}, "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA=="], + + "d3-geo": ["d3-geo@3.1.1", "", { "dependencies": { "d3-array": "2.5.0 - 3" } }, "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q=="], + + "d3-hierarchy": ["d3-hierarchy@3.1.2", "", {}, "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA=="], + + "d3-interpolate": ["d3-interpolate@3.0.1", "", { "dependencies": { "d3-color": "1 - 3" } }, "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g=="], + + "d3-path": ["d3-path@3.1.0", "", {}, "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ=="], + + "d3-polygon": ["d3-polygon@3.0.1", "", {}, "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg=="], + + "d3-quadtree": ["d3-quadtree@3.0.1", "", {}, "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw=="], + + "d3-random": ["d3-random@3.0.1", "", {}, "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ=="], + + "d3-sankey": ["d3-sankey@0.12.3", "", { "dependencies": { "d3-array": "1 - 2", "d3-shape": "^1.2.0" } }, "sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ=="], + + "d3-scale": ["d3-scale@4.0.2", "", { "dependencies": { "d3-array": "2.10.0 - 3", "d3-format": "1 - 3", "d3-interpolate": "1.2.0 - 3", "d3-time": "2.1.1 - 3", "d3-time-format": "2 - 4" } }, "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ=="], + + "d3-scale-chromatic": ["d3-scale-chromatic@3.1.0", "", { "dependencies": { "d3-color": "1 - 3", "d3-interpolate": "1 - 3" } }, "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ=="], + + "d3-selection": ["d3-selection@3.0.0", "", {}, "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ=="], + + "d3-shape": ["d3-shape@3.2.0", "", { "dependencies": { "d3-path": "^3.1.0" } }, "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA=="], + + "d3-time": ["d3-time@3.1.0", "", { "dependencies": { "d3-array": "2 - 3" } }, "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q=="], + + "d3-time-format": ["d3-time-format@4.1.0", "", { "dependencies": { "d3-time": "1 - 3" } }, "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg=="], + + "d3-timer": ["d3-timer@3.0.1", "", {}, "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA=="], + + "d3-transition": ["d3-transition@3.0.1", "", { "dependencies": { "d3-color": "1 - 3", "d3-dispatch": "1 - 3", "d3-ease": "1 - 3", "d3-interpolate": "1 - 3", "d3-timer": "1 - 3" }, "peerDependencies": { "d3-selection": "2 - 3" } }, "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w=="], + + "d3-zoom": ["d3-zoom@3.0.0", "", { "dependencies": { "d3-dispatch": "1 - 3", "d3-drag": "2 - 3", "d3-interpolate": "1 - 3", "d3-selection": "2 - 3", "d3-transition": "2 - 3" } }, "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw=="], + + "dagre-d3-es": ["dagre-d3-es@7.0.13", "", { "dependencies": { "d3": "^7.9.0", "lodash-es": "^4.17.21" } }, "sha512-efEhnxpSuwpYOKRm/L5KbqoZmNNukHa/Flty4Wp62JRvgH2ojwVgPgdYyr4twpieZnyRDdIH7PY2mopX26+j2Q=="], + + "dayjs": ["dayjs@1.11.19", "", {}, "sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw=="], + "debounce": ["debounce@1.2.1", "", {}, "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug=="], "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], @@ -920,6 +1091,8 @@ "define-properties": ["define-properties@1.2.1", "", { "dependencies": { "define-data-property": "1.1.4", "has-property-descriptors": "1.0.2", "object-keys": "1.1.1" } }, "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg=="], + "delaunator": ["delaunator@5.0.1", "", { "dependencies": { "robust-predicates": "^3.0.2" } }, "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw=="], + "depd": ["depd@2.0.0", "", {}, "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="], "dequal": ["dequal@2.0.3", "", {}, "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="], @@ -944,6 +1117,8 @@ "domhandler": ["domhandler@5.0.3", "", { "dependencies": { "domelementtype": "2.3.0" } }, "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w=="], + "dompurify": ["dompurify@3.3.1", "", { "optionalDependencies": { "@types/trusted-types": "^2.0.7" } }, "sha512-qkdCKzLNtrgPFP1Vo+98FRzJnBRGe4ffyCea9IwHB1fyxPOeNTHpLKYGd4Uk9xvNoH0ZoOjwZxNptyMwqrId1Q=="], + "domutils": ["domutils@3.2.2", "", { "dependencies": { "dom-serializer": "2.0.0", "domelementtype": "2.3.0", "domhandler": "5.0.3" } }, "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw=="], "dot-case": ["dot-case@3.0.4", "", { "dependencies": { "no-case": "3.0.4", "tslib": "2.8.1" } }, "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w=="], @@ -1122,6 +1297,8 @@ "gzip-size": ["gzip-size@6.0.0", "", { "dependencies": { "duplexer": "0.1.2" } }, "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q=="], + "hachure-fill": ["hachure-fill@0.5.2", "", {}, "sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg=="], + "handle-thing": ["handle-thing@2.0.1", "", {}, "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg=="], "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], @@ -1212,6 +1389,8 @@ "inline-style-parser": ["inline-style-parser@0.2.7", "", {}, "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA=="], + "internmap": ["internmap@2.0.3", "", {}, "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg=="], + "invariant": ["invariant@2.2.4", "", { "dependencies": { "loose-envify": "1.4.0" } }, "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA=="], "ipaddr.js": ["ipaddr.js@2.3.0", "", {}, "sha512-Zv/pA+ciVFbCSBBjGfaKUya/CcGmUHzTydLMaTwrUUEM2DIEO3iZvueGxmacvmN50fGpGVKeTXpb2LcYQxeVdg=="], @@ -1302,16 +1481,24 @@ "jsonfile": ["jsonfile@6.2.0", "", { "dependencies": { "universalify": "2.0.1" }, "optionalDependencies": { "graceful-fs": "4.2.11" } }, "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg=="], + "katex": ["katex@0.16.27", "", { "dependencies": { "commander": "^8.3.0" }, "bin": { "katex": "cli.js" } }, "sha512-aeQoDkuRWSqQN6nSvVCEFvfXdqo1OQiCmmW1kc9xSdjutPv7BGO7pqY9sQRJpMOGrEdfDgF2TfRXe5eUAD2Waw=="], + "keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="], + "khroma": ["khroma@2.1.0", "", {}, "sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw=="], + "kind-of": ["kind-of@6.0.3", "", {}, "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw=="], "kleur": ["kleur@3.0.3", "", {}, "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w=="], + "langium": ["langium@3.3.1", "", { "dependencies": { "chevrotain": "~11.0.3", "chevrotain-allstar": "~0.3.0", "vscode-languageserver": "~9.0.1", "vscode-languageserver-textdocument": "~1.0.11", "vscode-uri": "~3.0.8" } }, "sha512-QJv/h939gDpvT+9SiLVlY7tZC3xB2qK57v0J04Sh9wpMb6MP1q8gB21L3WIo8T5P1MSMg3Ep14L7KkDCFG3y4w=="], + "latest-version": ["latest-version@7.0.0", "", { "dependencies": { "package-json": "8.1.1" } }, "sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg=="], "launch-editor": ["launch-editor@2.12.0", "", { "dependencies": { "picocolors": "1.1.1", "shell-quote": "1.8.3" } }, "sha512-giOHXoOtifjdHqUamwKq6c49GzBdLjvxrd2D+Q4V6uOHopJv7p9VJxikDsQ/CBXZbEITgUqSVHXLTG3VhPP1Dg=="], + "layout-base": ["layout-base@1.0.2", "", {}, "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg=="], + "leven": ["leven@3.1.0", "", {}, "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A=="], "lilconfig": ["lilconfig@3.1.3", "", {}, "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw=="], @@ -1326,6 +1513,8 @@ "lodash": ["lodash@4.17.21", "", {}, "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="], + "lodash-es": ["lodash-es@4.17.22", "", {}, "sha512-XEawp1t0gxSi9x01glktRZ5HDy0HXqrM0x5pXQM98EaI0NxO6jVM7omDOxsuEo5UIASAnm2bRp1Jt/e0a2XU8Q=="], + "lodash.debounce": ["lodash.debounce@4.0.8", "", {}, "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow=="], "lodash.memoize": ["lodash.memoize@4.1.2", "", {}, "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag=="], @@ -1398,6 +1587,8 @@ "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="], + "mermaid": ["mermaid@11.12.2", "", { "dependencies": { "@braintree/sanitize-url": "^7.1.1", "@iconify/utils": "^3.0.1", "@mermaid-js/parser": "^0.6.3", "@types/d3": "^7.4.3", "cytoscape": "^3.29.3", "cytoscape-cose-bilkent": "^4.1.0", "cytoscape-fcose": "^2.2.0", "d3": "^7.9.0", "d3-sankey": "^0.12.3", "dagre-d3-es": "7.0.13", "dayjs": "^1.11.18", "dompurify": "^3.2.5", "katex": "^0.16.22", "khroma": "^2.1.0", "lodash-es": "^4.17.21", "marked": "^16.2.1", "roughjs": "^4.6.6", "stylis": "^4.3.6", "ts-dedent": "^2.2.0", "uuid": "^11.1.0" } }, "sha512-n34QPDPEKmaeCG4WDMGy0OT6PSyxKCfy2pJgShP+Qow2KLrvWjclwbc3yXfSIf4BanqWEhQEpngWwNp/XhZt6w=="], + "methods": ["methods@1.1.2", "", {}, "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w=="], "micromark": ["micromark@4.0.2", "", { "dependencies": { "@types/debug": "4.1.12", "debug": "4.4.3", "decode-named-character-reference": "1.2.0", "devlop": "1.1.0", "micromark-core-commonmark": "2.0.3", "micromark-factory-space": "2.0.1", "micromark-util-character": "2.1.1", "micromark-util-chunked": "2.0.1", "micromark-util-combine-extensions": "2.0.1", "micromark-util-decode-numeric-character-reference": "2.0.2", "micromark-util-encode": "2.0.1", "micromark-util-normalize-identifier": "2.0.1", "micromark-util-resolve-all": "2.0.1", "micromark-util-sanitize-uri": "2.0.1", "micromark-util-subtokenize": "2.1.0", "micromark-util-symbol": "2.0.1", "micromark-util-types": "2.0.2" } }, "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA=="], @@ -1494,6 +1685,8 @@ "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="], + "mlly": ["mlly@1.8.0", "", { "dependencies": { "acorn": "^8.15.0", "pathe": "^2.0.3", "pkg-types": "^1.3.1", "ufo": "^1.6.1" } }, "sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g=="], + "mrmime": ["mrmime@2.0.1", "", {}, "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ=="], "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], @@ -1566,6 +1759,8 @@ "package-json": ["package-json@8.1.1", "", { "dependencies": { "got": "12.6.1", "registry-auth-token": "5.1.0", "registry-url": "6.0.1", "semver": "7.7.3" } }, "sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA=="], + "package-manager-detector": ["package-manager-detector@1.6.0", "", {}, "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA=="], + "param-case": ["param-case@3.0.4", "", { "dependencies": { "dot-case": "3.0.4", "tslib": "2.8.1" } }, "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A=="], "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "3.1.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], @@ -1584,6 +1779,8 @@ "pascal-case": ["pascal-case@3.1.2", "", { "dependencies": { "no-case": "3.0.4", "tslib": "2.8.1" } }, "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g=="], + "path-data-parser": ["path-data-parser@0.1.0", "", {}, "sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w=="], + "path-exists": ["path-exists@5.0.0", "", {}, "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ=="], "path-is-inside": ["path-is-inside@1.0.2", "", {}, "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w=="], @@ -1596,12 +1793,20 @@ "path-type": ["path-type@4.0.0", "", {}, "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="], + "pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], + "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], "picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], "pkg-dir": ["pkg-dir@7.0.0", "", { "dependencies": { "find-up": "6.3.0" } }, "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA=="], + "pkg-types": ["pkg-types@1.3.1", "", { "dependencies": { "confbox": "^0.1.8", "mlly": "^1.7.4", "pathe": "^2.0.1" } }, "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ=="], + + "points-on-curve": ["points-on-curve@0.2.0", "", {}, "sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A=="], + + "points-on-path": ["points-on-path@0.2.1", "", { "dependencies": { "path-data-parser": "0.1.0", "points-on-curve": "0.2.0" } }, "sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g=="], + "postcss": ["postcss@8.5.6", "", { "dependencies": { "nanoid": "3.3.11", "picocolors": "1.1.1", "source-map-js": "1.2.1" } }, "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="], "postcss-attribute-case-insensitive": ["postcss-attribute-case-insensitive@7.0.1", "", { "dependencies": { "postcss-selector-parser": "7.1.1" }, "peerDependencies": { "postcss": "8.5.6" } }, "sha512-Uai+SupNSqzlschRyNx3kbCTWgY/2hcwtHEI/ej2LJWc9JJ77qKgGptd8DHwY1mXtZ7Aoh4z4yxfwMBue9eNgw=="], @@ -1866,12 +2071,18 @@ "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="], + "robust-predicates": ["robust-predicates@3.0.2", "", {}, "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg=="], + + "roughjs": ["roughjs@4.6.6", "", { "dependencies": { "hachure-fill": "^0.5.2", "path-data-parser": "^0.1.0", "points-on-curve": "^0.2.0", "points-on-path": "^0.2.1" } }, "sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ=="], + "rtlcss": ["rtlcss@4.3.0", "", { "dependencies": { "escalade": "3.2.0", "picocolors": "1.1.1", "postcss": "8.5.6", "strip-json-comments": "3.1.1" }, "bin": { "rtlcss": "bin/rtlcss.js" } }, "sha512-FI+pHEn7Wc4NqKXMXFM+VAYKEj/mRIcW4h24YVwVtyjI+EqGrLc2Hx/Ny0lrZ21cBWU2goLy36eqMcNj3AQJig=="], "run-applescript": ["run-applescript@7.1.0", "", {}, "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q=="], "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "1.2.3" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], + "rw": ["rw@1.3.3", "", {}, "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ=="], + "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="], @@ -1988,6 +2199,8 @@ "stylehacks": ["stylehacks@6.1.1", "", { "dependencies": { "browserslist": "4.28.1", "postcss-selector-parser": "6.1.2" }, "peerDependencies": { "postcss": "8.5.6" } }, "sha512-gSTTEQ670cJNoaeIp9KX6lZmm8LJ3jPB5yJmX8Zq/wQxOsAFXV3qjWzHas3YYk1qesuVIyYWWUpZ0vSE/dTSGg=="], + "stylis": ["stylis@4.3.6", "", {}, "sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ=="], + "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], @@ -2014,6 +2227,8 @@ "tiny-warning": ["tiny-warning@1.0.3", "", {}, "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA=="], + "tinyexec": ["tinyexec@1.0.2", "", {}, "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg=="], + "tinypool": ["tinypool@1.1.1", "", {}, "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg=="], "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], @@ -2028,6 +2243,8 @@ "trough": ["trough@2.2.0", "", {}, "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw=="], + "ts-dedent": ["ts-dedent@2.2.0", "", {}, "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ=="], + "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], "type-fest": ["type-fest@2.19.0", "", {}, "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA=="], @@ -2036,6 +2253,8 @@ "typedarray-to-buffer": ["typedarray-to-buffer@3.1.5", "", { "dependencies": { "is-typedarray": "1.0.0" } }, "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q=="], + "ufo": ["ufo@1.6.1", "", {}, "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA=="], + "undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="], "unicode-canonical-property-names-ecmascript": ["unicode-canonical-property-names-ecmascript@2.0.1", "", {}, "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg=="], @@ -2086,7 +2305,7 @@ "utils-merge": ["utils-merge@1.0.1", "", {}, "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA=="], - "uuid": ["uuid@8.3.2", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="], + "uuid": ["uuid@11.1.0", "", { "bin": { "uuid": "dist/esm/bin/uuid" } }, "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A=="], "value-equal": ["value-equal@1.0.1", "", {}, "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw=="], @@ -2098,6 +2317,18 @@ "vfile-message": ["vfile-message@4.0.3", "", { "dependencies": { "@types/unist": "3.0.3", "unist-util-stringify-position": "4.0.0" } }, "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw=="], + "vscode-jsonrpc": ["vscode-jsonrpc@8.2.0", "", {}, "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA=="], + + "vscode-languageserver": ["vscode-languageserver@9.0.1", "", { "dependencies": { "vscode-languageserver-protocol": "3.17.5" }, "bin": { "installServerIntoExtension": "bin/installServerIntoExtension" } }, "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g=="], + + "vscode-languageserver-protocol": ["vscode-languageserver-protocol@3.17.5", "", { "dependencies": { "vscode-jsonrpc": "8.2.0", "vscode-languageserver-types": "3.17.5" } }, "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg=="], + + "vscode-languageserver-textdocument": ["vscode-languageserver-textdocument@1.0.12", "", {}, "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA=="], + + "vscode-languageserver-types": ["vscode-languageserver-types@3.17.5", "", {}, "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg=="], + + "vscode-uri": ["vscode-uri@3.0.8", "", {}, "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw=="], + "watchpack": ["watchpack@2.4.4", "", { "dependencies": { "glob-to-regexp": "0.4.1", "graceful-fs": "4.2.11" } }, "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA=="], "wbuf": ["wbuf@1.7.3", "", { "dependencies": { "minimalistic-assert": "1.0.1" } }, "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA=="], @@ -2160,6 +2391,10 @@ "@babel/preset-env/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + "@chevrotain/cst-dts-gen/lodash-es": ["lodash-es@4.17.21", "", {}, "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw=="], + + "@chevrotain/gast/lodash-es": ["lodash-es@4.17.21", "", {}, "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw=="], + "@docusaurus/core/webpack-merge": ["webpack-merge@6.0.1", "", { "dependencies": { "clone-deep": "4.0.1", "flat": "5.0.2", "wildcard": "2.0.1" } }, "sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg=="], "@pnpm/network.ca-file/graceful-fs": ["graceful-fs@4.2.10", "", {}, "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA=="], @@ -2182,6 +2417,8 @@ "cheerio-select/css-select": ["css-select@5.2.2", "", { "dependencies": { "boolbase": "1.0.0", "css-what": "6.2.2", "domhandler": "5.0.3", "domutils": "3.2.2", "nth-check": "2.1.1" } }, "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw=="], + "chevrotain/lodash-es": ["lodash-es@4.17.21", "", {}, "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw=="], + "clean-css/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], "cli-table3/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "8.0.0", "is-fullwidth-code-point": "3.0.0", "strip-ansi": "6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], @@ -2208,6 +2445,16 @@ "csso/css-tree": ["css-tree@2.2.1", "", { "dependencies": { "mdn-data": "2.0.28", "source-map-js": "1.2.1" } }, "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA=="], + "cytoscape-fcose/cose-base": ["cose-base@2.2.0", "", { "dependencies": { "layout-base": "^2.0.0" } }, "sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g=="], + + "d3-dsv/commander": ["commander@7.2.0", "", {}, "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw=="], + + "d3-dsv/iconv-lite": ["iconv-lite@0.6.3", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="], + + "d3-sankey/d3-array": ["d3-array@2.12.1", "", { "dependencies": { "internmap": "^1.0.0" } }, "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ=="], + + "d3-sankey/d3-shape": ["d3-shape@1.3.7", "", { "dependencies": { "d3-path": "1" } }, "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw=="], + "decompress-response/mimic-response": ["mimic-response@3.1.0", "", {}, "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ=="], "dot-prop/is-obj": ["is-obj@2.0.0", "", {}, "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w=="], @@ -2244,6 +2491,8 @@ "jest-worker/supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], + "katex/commander": ["commander@8.3.0", "", {}, "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww=="], + "mdast-util-find-and-replace/escape-string-regexp": ["escape-string-regexp@5.0.0", "", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="], "mdast-util-from-markdown/micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="], @@ -2416,6 +2665,8 @@ "sitemap/@types/node": ["@types/node@17.0.45", "", {}, "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw=="], + "sockjs/uuid": ["uuid@8.3.2", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="], + "source-map-support/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], "stylehacks/postcss-selector-parser": ["postcss-selector-parser@6.1.2", "", { "dependencies": { "cssesc": "3.0.0", "util-deprecate": "1.0.2" } }, "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg=="], @@ -2468,6 +2719,12 @@ "csso/css-tree/mdn-data": ["mdn-data@2.0.28", "", {}, "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g=="], + "cytoscape-fcose/cose-base/layout-base": ["layout-base@2.0.1", "", {}, "sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg=="], + + "d3-sankey/d3-array/internmap": ["internmap@1.0.1", "", {}, "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw=="], + + "d3-sankey/d3-shape/d3-path": ["d3-path@1.0.9", "", {}, "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg=="], + "express/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], "file-loader/schema-utils/ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "3.1.3", "fast-json-stable-stringify": "2.1.0", "json-schema-traverse": "0.4.1", "uri-js": "4.4.1" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], diff --git a/docs/arquitectura-ia/guia-composicion/01-fundamentos-core-four.md b/docs/arquitectura-ia/guia-composicion/01-fundamentos-core-four.md new file mode 100644 index 0000000..5102713 --- /dev/null +++ b/docs/arquitectura-ia/guia-composicion/01-fundamentos-core-four.md @@ -0,0 +1,119 @@ +--- +sidebar_position: 1 +title: Fundamentos y Core Four +--- + +# Fundamentos y Core Four: La Arquitectura de Claude Code + +## Introducción: Cuatro Piezas, Un Sistema Composicional + +En 2025, el desarrollo asistido por IA ha evolucionado más allá de los simples prompts en una interfaz de chat. Claude Code y herramientas similares ahora ofrecen múltiples mecanismos de extensión: **Skills**, **Slash Commands**, **MCP Servers** y **Sub-agents**. Entender cuándo usar cada uno no es solo una cuestión de preferencia personal, sino de arquitectura fundamental. + +El error más común que cometen los desarrolladores al adoptar estas herramientas es tratarlas como alternativas intercambiables. Convertir todos los slash commands en skills, anidar sub-agents innecesariamente, o crear MCPs cuando un simple prompt bastaría. La realidad es que estas cuatro piezas **no son substitutos**, son **composicionales**: cada una resuelve un problema específico y juntas forman un sistema coherente para el desarrollo agentico. + +Esta guía te ayudará a comprender cuándo usar cada mecanismo, cómo componen entre sí, y qué patrones de diseño aplicar para evitar la sobre-ingeniería. El objetivo no es maximizar el uso de todas las capacidades avanzadas, sino elegir la herramienta correcta para cada trabajo y mantener la arquitectura simple y mantenible. + +## Fundamentos: La Arquitectura de Claude Code + +Antes de comparar Skills, MCP, Sub-agents y Slash Commands, es crucial entender los **Core Four**: los cuatro elementos fundamentales que componen cualquier agente en Claude Code. + +### Los Core Four + +1. **Contexto**: La memoria de trabajo del agente. Incluye CLAUDE.md (instrucciones de proyecto), archivos leídos, conversación actual, y estado acumulado. + +2. **Modelo**: El LLM subyacente (Claude Opus 4.5, Sonnet 4.5, Haiku 4.5). Determina capacidad de razonamiento, velocidad, y costo. + +3. **Prompt**: La unidad fundamental de instrucción. Define qué debe hacer el agente, cómo debe pensarlo, y qué formato seguir. + +4. **Herramientas**: Las capacidades que el agente puede invocar (Read, Write, Bash, Grep, MCP servers personalizados, etc.). + +```mermaid +graph TB + A["📚 Contexto
(Memoria de trabajo)"] + B["🧠 Modelo
(Claude Opus/Sonnet/Haiku)"] + C["💬 Prompt
(Instrucción fundamental)"] + D["🔧 Herramientas
(Read, Write, Bash, MCP...)"] + + E["Agente Coherente"] + + A --> E + B --> E + C --> E + D --> E + + style A fill:#0288d1,stroke:#fff,stroke-width:2px,color:#fff + style B fill:#7b1fa2,stroke:#fff,stroke-width:2px,color:#fff + style C fill:#2e7d32,stroke:#fff,stroke-width:2px,color:#fff + style D fill:#e65100,stroke:#fff,stroke-width:2px,color:#fff + style E fill:#f57c00,stroke:#fff,stroke-width:2px,color:#fff +``` + +★ Insight ───────────────────────────────────── +Los Core Four are **elementos independientes** que se combinan para formar un agente funcional. Modificar cualquiera de ellos (cambiar modelo, mejorar prompt, agregar herramientas) afecta el comportamiento total. Las cuatro extensiones que veremos (Skills, Slash Commands, MCP, Sub-agents) son simplemente formas de modificar estos elementos de manera composicional. +───────────────────────────────────────────────── + +### El Prompt Sigue Siendo Fundamental + +Aquí está la verdad incómoda que muchos desarrolladores olvidan al emocionarse con Skills y Sub-agents: **el prompt es la unidad fundamental de todo**. No importa cuán sofisticada sea tu arquitectura de skills o cuántos MCP servers tengas configurados, todo se reduce a qué le estás diciendo al modelo que haga. + +Esto significa: + +- **Empezar con prompts simples**: Antes de crear un skill reutilizable, afina el prompt conversacionalmente. +- **Prompt engineering primero**: La mayoría de problemas se resuelven con mejor redacción del prompt, no con más abstracciones. +- **No entregar control prematuramente**: Subir a skills o sub-agents muy rápido puede oscurecer el reasoning crítico. + +### Cómo Se Componen Estas Piezas + +Los cuatro mecanismos (Skills, Slash Commands, MCP, Sub-agents) son formas de **modificar o extender los Core Four**: + +- **Skills** modifican el contexto y el prompt automáticamente cuando el modelo detecta relevancia +- **Slash Commands** invocan prompts predefinidos manualmente con argumentos opcionales +- **MCP Servers** extienden las herramientas disponibles para conectar sistemas externos +- **Sub-agents** crean instancias separadas con su propio contexto, modelo, prompt y herramientas + +La clave del diseño arquitectónico efectivo es entender qué estás modificando y por qué. + +```mermaid +graph TB + subgraph CoreFour["Core Four Fundamental"] + CTX["📚 Contexto"] + MODEL["🧠 Modelo"] + PROMPT["💬 Prompt"] + TOOLS["🔧 Herramientas"] + end + + subgraph Extensiones["Cuatro Mecanismos de Extensión"] + SKILL["⚡ Skills
(Contexto + Prompt)"] + SLASH["⌨️ Slash Commands
(Prompt + Manual)"] + MCP["🔌 MCP Servers
(Herramientas)"] + SUBAGENT["🤖 Sub-agents
(Todos separados)"] + end + + CTX -.->|modifica| SKILL + PROMPT -.->|modifica| SKILL + + PROMPT -.->|invoca| SLASH + + TOOLS -.->|extiende| MCP + + CTX -.->|aislado| SUBAGENT + MODEL -.->|aislado| SUBAGENT + PROMPT -.->|aislado| SUBAGENT + TOOLS -.->|aislado| SUBAGENT + + style CoreFour fill:#37474f,stroke:#fff,stroke-width:2px,color:#fff + style Extensiones fill:#455a64,stroke:#fff,stroke-width:2px,color:#fff + style SKILL fill:#2e7d32,stroke:#fff,stroke-width:2px,color:#fff + style SLASH fill:#1976d2,stroke:#fff,stroke-width:2px,color:#fff + style MCP fill:#9c27b0,stroke:#fff,stroke-width:2px,color:#fff + style SUBAGENT fill:#f57c00,stroke:#fff,stroke-width:2px,color:#fff +``` + +★ Insight ───────────────────────────────────── +Cada mecanismo de extensión **modifica un subconjunto diferente** de los Core Four. Un skill modifica contexto y prompt (automáticamente), un slash command solo invoca un prompt (manualmente), MCP extiende herramientas, y los sub-agents crean una **copia completamente aislada** de todos los elementos. Esto es la razón por la cual no son intercambiables - cada uno resuelve un problema diferente. +───────────────────────────────────────────────── + +--- + +**Siguiente paso:** [Comparativa y Decisión: Cuándo usar cada mecanismo](./02-comparativa-y-decision.md) + diff --git a/docs/arquitectura-ia/guia-composicion/02-comparativa-y-decision.md b/docs/arquitectura-ia/guia-composicion/02-comparativa-y-decision.md new file mode 100644 index 0000000..44f64f6 --- /dev/null +++ b/docs/arquitectura-ia/guia-composicion/02-comparativa-y-decision.md @@ -0,0 +1,240 @@ +--- +sidebar_position: 2 +title: Comparativa y Decisión +--- + +## Comparativa: Cuatro Tipos de Extensión + +### Skills: Automatización Modelo-Invocada + +**Definición**: Bloques de contexto y prompt reutilizables que Claude activa autónomamente cuando detecta relevancia. + +**Características clave**: +- **Invocación**: El modelo decide cuándo activarlos basándose en la descripción +- **Ubicación**: `~/.claude/skills/`, `.claude/skills/`, o dentro de plugins +- **Estructura**: Directorio con `SKILL.md` (required) + archivos opcionales de soporte +- **Ámbito**: Contexto inyectado en la conversación actual + +**Cuándo usarlos**: +- Procedimientos organizacionales que se aplican recurrentemente +- Directrices de marca o estilo que deben seguirse automáticamente +- Fórmulas o cálculos especializados que se usan frecuentemente +- Extracción de datos de formatos específicos (PDFs, logs, etc.) + +**Ejemplo de SKILL.md**: +```yaml +--- +description: Genera mensajes de commit siguiendo Conventional Commits con emojis según tipo +--- + +# Commit Message Skill + +Cuando el usuario solicite crear un commit, genera el mensaje siguiendo esta estructura: + +1. **Tipo con emoji**: + - feat: ✨ + - fix: 🐛 + - docs: 📝 + - style: 💄 + - refactor: ♻️ + +2. **Formato**: `tipo(scope): descripción` + +3. **Cuerpo** (opcional): Explicación de cambios complejos + +Ejemplo: +``` +✨ feat(auth): agregar autenticación con OAuth + +Implementa flujo de OAuth 2.0 con Google y GitHub. +Incluye refresh tokens y manejo de expiración. +``` +``` + +**Anti-patrón común**: Convertir todos los slash commands en skills. Si es un flujo que el usuario dispara manualmente y no se repite automáticamente, probablemente debería quedarse como slash command. + +### Slash Commands: Control Usuario-Invocado + +**Definición**: Comandos explícitos que el usuario ejecuta manualmente, con soporte para argumentos. + +**Características clave**: +- **Invocación**: Manual, por el usuario escribiendo `/command` +- **Ubicación**: Definidos en settings de Claude Code +- **Estructura**: JSON con nombre, descripción, y prompt +- **Ámbito**: Ejecutan en el contexto de la conversación actual + +**Cuándo usarlos**: +- Flujos one-off que requieren disparo manual +- Workflows específicos que el usuario controla explícitamente +- Acciones con parámetros variables (paths, nombres, valores) +- Tareas que están en fase de experimentación antes de automatizarse + +**Ejemplo de configuración**: +```json +{ + "commands": [ + { + "name": "review-pr", + "description": "Analiza los cambios de un PR y genera comentarios de revisión", + "prompt": "Revisa los cambios del PR actual:\n1. Lee git diff\n2. Identifica issues de código, seguridad, o performance\n3. Genera comentarios constructivos en formato markdown\n4. Sugiere mejoras sin ser pedante" + } + ] +} +``` + +**Escalada natural**: Si un slash command se usa recurrentemente y siempre en el mismo contexto, considera convertirlo en skill para automatización. + +### MCP Servers: Conectividad Externa + +**Definición**: Model Context Protocol servers que actúan como adaptadores universales a sistemas externos. + +**Características clave**: +- **Invocación**: El modelo los usa como herramientas cuando necesita capacidades externas +- **Ubicación**: Configurados en settings, pueden ser locales o remotos +- **Estructura**: Ejecutables que exponen resources, tools, y prompts según el protocolo MCP +- **Ámbito**: Extienden las herramientas disponibles globalmente + +**Cuándo usarlos**: +- Integración con servicios externos (Google Drive, Slack, GitHub) +- Acceso a bases de datos o APIs propias +- Herramientas del sistema que necesitas invocar programáticamente +- Cualquier funcionalidad que no viene incluida en Claude Code por defecto + +**Ejemplos de uso común**: +- MCP Google Drive: Leer/escribir documentos en Drive +- MCP GitHub: Crear issues, comentar PRs, actualizar labels +- MCP Slack: Enviar mensajes, leer canales +- MCP Filesystem: Acceso extendido a filesystem con permisos específicos +- MCP Database: Ejecutar queries en PostgreSQL, MySQL, etc. + +**Composición con Skills**: Un skill puede invocar tools de un MCP server. Ejemplo: un skill de "extracción de datos de PDF" puede usar un MCP server que maneja lectores especializados de PDF. + +### Sub-agents: Especialización y Paralelismo + +**Definición**: Instancias independientes de Claude con su propio contexto, prompt de sistema, y restricción de herramientas. + +**Características clave**: +- **Invocación**: Explícitamente mediante llamadas a sub-agent +- **Ubicación**: Definidos en `.claude/agents/` +- **Estructura**: Archivo con system prompt y configuración de tools +- **Ámbito**: Contexto completamente aislado, no ven la conversación principal + +**Cuándo usarlos**: +- **Paralelización**: Procesar múltiples items concurrentemente (analizar 10 archivos en paralelo) +- **Especialización**: Tareas que requieren contexto diferenciado (un agente solo para testing, otro solo para docs) +- **Restricción de herramientas**: Limitar deliberadamente qué puede hacer el agente (solo lectura, sin bash, etc.) + +**Ejemplo de definición**: +```yaml +--- +name: test-specialist +description: Agente especializado en escribir tests unitarios +--- + +# System Prompt + +Eres un especialista en testing. Solo te enfocas en escribir tests unitarios con alta cobertura. + +## Reglas: +- Usa Jest/Vitest según el proyecto +- Cubre edge cases y error handling +- No modifiques código de producción, solo tests +- Genera mocks cuando sea necesario + +## Tools permitidas: +- Read: para leer código fuente +- Write: solo para archivos *.test.js o *.spec.js +- Grep: para encontrar patrones de testing +``` + +**Regla de oro**: Si necesitas paralelizar, usa sub-agents. Si solo necesitas contexto especializado sin paralelismo, considera si un skill con instrucciones claras bastaría. + +### Tabla Comparativa + +| Característica | Skills | Slash Commands | MCP Servers | Sub-agents | +|----------------|--------|----------------|-------------|------------| +| **Invocación** | Automática (modelo) | Manual (usuario) | Automática (tool) | Explícita (llamada) | +| **Cuándo se activa** | Contexto relevante | Escribir `/cmd` | Necesidad externa | Llamada directa | +| **Contexto** | ✅ Compartido | ✅ Compartido | ❌ N/A | 🔒 Aislado | +| **Reusabilidad** | ⭐ Alta | 🆗 Media | 🔥 Muy alta | 🆗 Media | +| **Paralelización** | ❌ No | ❌ No | ❌ No | ✅ Sí (Core use case) | +| **Complejidad setup**| 🆗 Media | ⚡ Baja | ⚙️ Alta | 🆗 Media | + +--- + +**Siguiente paso:** [Patrones de Diseño: Componiendo con elegancia](./03-patrones-de-diseno.md) + +## Matriz de Decisión: Cuándo Usar Cada Uno + +### Árbol de Decisión + +```mermaid +graph TD + A["¿Necesitas conectividad
externa?
(API, DB, servicio)"] + A -->|SÍ| MCP["🔌 MCP Server"] + A -->|NO| B["¿Necesitas
paralelizar
procesamiento?"] + + B -->|SÍ| SUBAGENT["🤖 Sub-agents"] + B -->|NO| C["¿Es un procedimiento
recurrente que debería
ser automático?"] + + C -->|SÍ| SKILL["⚡ Skill"] + C -->|NO| D["¿Es un flujo one-off
que el usuario
dispara manualmente?"] + + D -->|SÍ| SLASH["⌨️ Slash Command"] + D -->|NO| PROMPT["💬 Prompt
conversacional simple"] + + style MCP fill:#9c27b0,stroke:#fff,stroke-width:2px,color:#fff + style SUBAGENT fill:#f57c00,stroke:#fff,stroke-width:2px,color:#fff + style SKILL fill:#2e7d32,stroke:#fff,stroke-width:2px,color:#fff + style SLASH fill:#1976d2,stroke:#fff,stroke-width:2px,color:#fff + style PROMPT fill:#616161,stroke:#fff,stroke-width:2px,color:#fff + style A fill:#455a64,stroke:#fff,stroke-width:2px,color:#fff + style B fill:#455a64,stroke:#fff,stroke-width:2px,color:#fff + style C fill:#455a64,stroke:#fff,stroke-width:2px,color:#fff + style D fill:#455a64,stroke:#fff,stroke-width:2px,color:#fff +``` + +### Ejemplos Concretos por Camino + +**Caso: Generar mensajes de commit** +- **Primera vez**: Prompt conversacional ("genera un commit message para estos cambios") +- **Se repite frecuentemente**: Slash command `/commit-msg` para control manual +- **Se usa en todos los commits**: Skill que se activa automáticamente al detectar `git commit` + +**Caso: Enviar notificaciones a Slack** +- **Solución**: MCP Server de Slack +- **Por qué no un skill**: Requiere integración externa, no solo contexto +- **Por qué no un sub-agent**: No necesitas aislamiento ni paralelización + +**Caso: Analizar 50 archivos de log para encontrar patrones** +- **Solución**: Sub-agents (uno por cada 5 archivos, por ejemplo) +- **Por qué no un skill**: Requiere paralelización, un skill ejecutaría secuencialmente +- **Por qué no un slash command**: Es trabajo computacional, no un flujo manual simple + +**Caso: Aplicar directrices de marca en documentación** +- **Solución**: Skill con las reglas de estilo +- **Por qué no un slash command**: Debería aplicarse automáticamente, no manualmente +- **Por qué no un MCP**: No requiere conectividad externa +- **Por qué no un sub-agent**: No requiere paralelización ni contexto aislado + +### Anti-patrones Comunes + +**❌ Skill-itis**: Convertir todo en skills +- Síntoma: Tienes 30+ skills y no estás seguro cuáles se activan +- Problema: Descripciones vagas que causan activaciones incorrectas +- Solución: Empezar con prompts, escalar solo lo recurrente + +**❌ MCP para todo**: Crear MCPs cuando no hay integración externa +- Síntoma: MCP que solo lee/escribe archivos locales +- Problema: Overhead innecesario, ya tienes esas herramientas +- Solución: Usar tools nativas de Claude Code primero + +**❌ Sub-agents anidados**: Crear cadenas largas de sub-agents llamando sub-agents +- Síntoma: "Subagent A llama a Subagent B que llama a Subagent C" +- Problema: Debugging imposible, fiabilidad baja, contexto fragmentado +- Solución: Máximo 2 niveles de profundidad, preferir composición horizontal + +**❌ Slash commands para todo**: Crear 50 comandos para cada tarea +- Síntoma: Lista de `/` que parece una aplicación CLI completa +- Problema: Carga cognitiva alta, difícil recordar todos +- Solución: Solo flujos verdaderamente recurrentes y manuales diff --git a/docs/arquitectura-ia/guia-composicion/03-patrones-de-diseno.md b/docs/arquitectura-ia/guia-composicion/03-patrones-de-diseno.md new file mode 100644 index 0000000..d28cfae --- /dev/null +++ b/docs/arquitectura-ia/guia-composicion/03-patrones-de-diseno.md @@ -0,0 +1,243 @@ +--- +sidebar_position: 3 +title: Patrones de Diseño +--- + +## Patrones de Composición + +Las cuatro piezas no existen en aislamiento. Los patrones más poderosos surgen de combinarlas inteligentemente. + +### Patrón 1: Skill + MCP (Automatización con Conectividad) + +**Caso de uso**: Extraer datos de documentos en Google Drive y generar reportes + +```yaml +# .claude/skills/drive-report-extractor/SKILL.md +--- +description: Extrae datos de hojas de cálculo en Drive y genera reportes en markdown +--- + +Cuando el usuario pida "generar reporte de ventas" o similar: + +1. Usa el MCP de Google Drive para listar archivos en la carpeta "Ventas" +2. Lee las hojas de cálculo del mes actual +3. Extrae métricas clave (total, promedio, top 5 productos) +4. Genera un reporte en markdown con gráficos en ASCII +5. Guarda el reporte en `reports/ventas-YYYY-MM.md` +``` + +**Por qué funciona**: El skill proporciona el procedimiento automático, el MCP proporciona la conectividad. Claude activa el skill cuando detecta la intención y usa el MCP como herramienta. + +```mermaid +sequenceDiagram + autonumber + actor Usuario + participant Claude + participant Skill + participant MCP as MCP Google Drive + participant Drive as Google Drive + + Usuario->>Claude: "Generar reporte de ventas" + Claude->>Claude: Detecta intención 'reporte de ventas' + Claude->>Skill: Activa skill automáticamente + + Skill->>MCP: Listar archivos en carpeta 'Ventas' + MCP->>Drive: Lee carpeta + Drive-->>MCP: Lista de archivos + MCP-->>Skill: Archivos JSON + + Skill->>MCP: Descargar hoja de cálculo + MCP->>Drive: Obtiene contenido + Drive-->>MCP: Datos de la hoja + MCP-->>Skill: Datos estructurados + + Skill->>Skill: Procesa y extrae métricas + Skill->>Claude: Datos listos para reportar + + Claude->>Usuario: Reporte generado ✅ +``` + +★ Insight ───────────────────────────────────── +**Composición Skill + MCP = Automatización potente**. El skill define el "qué y cuándo", el MCP define el "cómo conectar". Docusaurus renderizará este diagrama automáticamente - la sintaxis Mermaid es nativa en Docusaurus 3. +───────────────────────────────────────────────── + +### Patrón 2: Prompt → Slash Command → Skill (Escalada Gradual) + +**Evolución de una funcionalidad de testing**: + +**Fase 1: Prompt conversacional** +``` +Usuario: "Genera tests para este componente React" +Claude: [Analiza componente, escribe tests] +``` + +**Fase 2: Se repite frecuentemente → Slash Command** +```json +{ + "name": "gen-tests", + "description": "Genera tests unitarios para componente React", + "prompt": "Lee el componente en {path}, analiza props y state, genera tests con React Testing Library cubriendo rendering, eventos, y edge cases" +} +``` + +**Fase 3: Es parte del workflow estándar → Skill** +```yaml +--- +description: Genera automáticamente tests cuando se crea un componente React nuevo +--- + +Cuando detectes que se ha creado un archivo .jsx o .tsx nuevo: +1. Analiza el componente +2. Genera archivo de tests correspondiente en __tests__/ +3. Cubre rendering básico, props, y eventos +``` + +**Lección**: No saltar directamente a skills. Dejar que el patrón de uso emerja naturalmente. + +```mermaid +timeline + title Patrón: Escalada Gradual + section Día 1 + Prompt conversacional: Usuario pregunta en chat + section Semana 1 + Se repite diariamente: Crear Slash Command + section Mes 1 + Parte del workflow estándar: Convertir en Skill + + section Métrica + Conversacional: Manual, único + Slash Command: Manual, reutilizable + Skill: Automático, integrado +``` + +★ Insight ───────────────────────────────────── +**Esta escalada no es aleatoria**. Cada etapa proporciona retroalimentación sobre si el siguiente nivel de abstracción está justificado. Si un prompt conversacional se usa una sola vez, no necesita slash command. Si un slash command se invoca manualmente cada día, merece automatización como skill. +───────────────────────────────────────────────── + +### Patrón 3: Sub-agents para Procesamiento Paralelo con Agregación + +**Caso de uso**: Analizar codebase grande para identificar vulnerabilidades de seguridad + +```javascript +// Llamada desde agente principal +const files = await glob("**/*.js"); +const batches = chunk(files, 10); // 10 archivos por sub-agent + +const results = await Promise.all( + batches.map(batch => + invokeSubAgent("security-analyzer", { files: batch }) + ) +); +``` + +> **Nota técnica**: `invokeSubAgent` es una función conceptual que representa la capacidad de Claude Code para delegar tareas. La implementación real puede variar según la versión de las herramientas o si estás usando la API de agentes directamente. + +// Agregar resultados +const vulnerabilities = results.flat(); +generateReport(vulnerabilities); +``` + +--- + +**Siguiente paso:** [Casos Prácticos: Implementaciones reales](./04-casos-practicos.md) + +**Sub-agent `security-analyzer`**: +```yaml +--- +name: security-analyzer +description: Analiza archivos JavaScript buscando vulnerabilidades de seguridad +--- + +# System Prompt + +Analiza los archivos proporcionados buscando: +- SQL injection +- XSS vulnerabilities +- Insecure dependencies +- Hardcoded secrets + +Para cada issue encontrado, reporta: +- Archivo y línea +- Tipo de vulnerabilidad +- Severidad (baja/media/alta/crítica) +- Recomendación de fix +``` + +**Por qué funciona**: Los sub-agents procesan batches en paralelo, el agente principal agrega resultados. Sin paralelización, analizar 1000 archivos sería lentísimo. + +```mermaid +graph TB + MAIN["🎯 Agente Principal"] + + MAIN -->|Divide en batches| BATCH["10 archivos x batch"] + BATCH --> SUB1["🤖 Sub-agent 1
(Archivos 1-10)"] + BATCH --> SUB2["🤖 Sub-agent 2
(Archivos 11-20)"] + BATCH --> SUB3["🤖 Sub-agent 3
(Archivos 21-30)"] + BATCH --> SUBN["🤖 Sub-agent N
(...)"] + + SUB1 -->|Analiza en paralelo| RESULTS["Resultados"] + SUB2 -->|Analiza en paralelo| RESULTS + SUB3 -->|Analiza en paralelo| RESULTS + SUBN -->|Analiza en paralelo| RESULTS + + RESULTS -->|Agrega| REPORT["📊 Reporte Final
Vulnerabilidades compiladas"] + + style MAIN fill:#f57c00,stroke:#fff,stroke-width:2px,color:#fff + style BATCH fill:#616161,stroke:#fff,stroke-width:2px,color:#fff + style SUB1 fill:#f57c00,stroke:#fff,stroke-width:2px,color:#fff + style SUB2 fill:#f57c00,stroke:#fff,stroke-width:2px,color:#fff + style SUB3 fill:#f57c00,stroke:#fff,stroke-width:2px,color:#fff + style SUBN fill:#f57c00,stroke:#fff,stroke-width:2px,color:#fff + style RESULTS fill:#616161,stroke:#fff,stroke-width:2px,color:#fff + style REPORT fill:#2e7d32,stroke:#fff,stroke-width:2px,color:#fff +``` + +★ Insight ───────────────────────────────────── +**Paralelización = Aceleración exponencial**. Si analizas 100 archivos secuencialmente a 2 minutos por agente = 200 minutos. Con 10 sub-agents en paralelo = 20 minutos. Pero cada sub-agent es una instancia completamente aislada, lo que mantiene el contexto manejable y evita contaminación entre batches. +───────────────────────────────────────────────── + +### Patrón 4: CLAUDE.md como Contexto Base + Skills como Especialización + +**CLAUDE.md (contexto global del proyecto)**: +```markdown +# Proyecto: E-commerce Platform + +## Stack +- Frontend: Next.js 14, TypeScript, Tailwind +- Backend: Node.js, Express, PostgreSQL +- Testing: Jest, React Testing Library + +## Convenciones +- Todos los componentes en TypeScript +- Tests en `__tests__/` directories +- API routes en `pages/api/` +``` + +**Skill específico**: +```yaml +--- +description: Genera componentes React siguiendo convenciones del proyecto +--- + +Al crear componentes React nuevos: +1. Usa TypeScript (según CLAUDE.md) +2. Aplica Tailwind para estilos +3. Incluye PropTypes con JSDoc +4. Genera test correspondiente en __tests__/ +5. Exporta como named export +``` + +**Por qué funciona**: CLAUDE.md establece contexto base que todos (skills, sub-agents, conversación principal) comparten. Skills añaden especialización sin repetir contexto global. + +### Evitar la Sobre-ingeniería + +**Regla del 80/20**: El 80% de tus necesidades se resuelven con prompts conversacionales bien redactados. Solo el 20% requiere skills, sub-agents, o MCPs personalizados. + +**Checklist antes de crear abstracciones**: +- ✅ ¿He refinado el prompt conversacionalmente al menos 3 veces? +- ✅ ¿Este patrón se repite al menos 5 veces por semana? +- ✅ ¿La automatización realmente ahorra tiempo vs. invocación manual? +- ✅ ¿La descripción del skill es lo suficientemente específica para activarse correctamente? +- ✅ ¿El sub-agent realmente necesita contexto aislado o paralelización? + +Si respondes "no" a alguna, probablemente no necesitas la abstracción todavía. diff --git a/docs/arquitectura-ia/guia-composicion/04-casos-practicos.md b/docs/arquitectura-ia/guia-composicion/04-casos-practicos.md new file mode 100644 index 0000000..b6deb72 --- /dev/null +++ b/docs/arquitectura-ia/guia-composicion/04-casos-practicos.md @@ -0,0 +1,282 @@ +--- +sidebar_position: 4 +title: Casos Prácticos +--- + +## Ejemplos Prácticos + +### Ejemplo 1: Sistema de Commit Messages (Escalada Completa) + +**Contexto**: Equipo que quiere estandarizar mensajes de commit siguiendo Conventional Commits. + +**Fase 1: Prompt conversacional (día 1)** +``` +Usuario: "Genera un commit message para estos cambios" +Claude: [Lee git diff, genera mensaje] +``` + +**Fase 2: Slash Command (semana 1, se repite diariamente)** +```json +{ + "name": "commit", + "description": "Genera mensaje de commit siguiendo Conventional Commits", + "prompt": "Lee git diff, analiza cambios, genera mensaje de commit siguiendo Conventional Commits (feat/fix/docs/etc). Incluye scope si aplica. Descripción concisa en imperativo." +} +``` + +**Uso**: +``` +Usuario: /commit +Claude: [Analiza cambios, genera] +``` + +**Fase 3: Skill (mes 1, es parte del workflow estándar)** +```yaml +--- +description: Genera mensajes de commit automáticamente siguiendo Conventional Commits cuando el usuario mencione crear un commit +--- + +# Commit Message Skill + +Cuando el usuario solicite crear un commit o mencione "commit these changes": + +1. Lee `git diff --staged` para ver cambios preparados +2. Analiza la naturaleza de los cambios: + - feat: nueva funcionalidad + - fix: corrección de bug + - docs: cambios en documentación + - style: formateo, sin cambios de lógica + - refactor: reestructuración de código + - test: añadir o corregir tests + +3. Genera mensaje con formato: + ``` + tipo(scope): descripción breve + + [cuerpo opcional explicando el "por qué"] + ``` + +4. Usa imperativo ("add" no "added"), primera línea ≤50 caracteres +``` + +**Reasoning de la escalada**: +- **Prompt → Slash Command**: Se usa diariamente, merece un comando rápido +- **Slash Command → Skill**: Es parte del workflow de todos los commits, la automatización elimina fricción + +```mermaid +graph LR + A["Día 1
Prompt"] -->|Funciona| B["Semana 1
/commit"] + B -->|Se repite diariamente| C["Mes 1
⚡ Skill
automático"] + + A -.->|Costo: Manual cada vez| COST1["⚠️ Fricción"] + B -.->|Costo: Escribir /command| COST2["📌 Tolerable"] + C -.->|Costo: 0, automático| COST3["✅ Óptimo"] + + style A fill:#f57c00,stroke:#fff,stroke-width:2px,color:#fff + style B fill:#1976d2,stroke:#fff,stroke-width:2px,color:#fff + style C fill:#2e7d32,stroke:#fff,stroke-width:2px,color:#fff + style COST1 fill:#c62828,stroke:#fff,stroke-width:2px,color:#fff + style COST2 fill:#f57f17,stroke:#fff,stroke-width:2px,color:#fff + style COST3 fill:#388e3c,stroke:#fff,stroke-width:2px,color:#fff +``` + +### Ejemplo 2: Procesamiento de Documentos (Skill + MCP) + +**Contexto**: Startup que necesita procesar facturas PDF subidas a Google Drive. + +**Solución**: Skill + MCP Google Drive + MCP PDF Parser + +> 💡 **Requisito**: Este ejemplo asume que tienes configurados los servidores MCP correspondientes en tu `claude_desktop_config.json` o en los settings de Claude Code. + +**MCP Setup** (en settings): +```json +{ + "mcpServers": { + "google-drive": { + "command": "npx", + "args": ["-y", "@modelcontextprotocol/server-gdrive"] + }, + "pdf-parser": { + "command": "python", + "args": ["/path/to/pdf_parser_mcp.py"] + } + } +} +``` + +**Skill**: +```yaml +--- +description: Procesa facturas PDF de Google Drive y extrae datos estructurados +--- + +# Invoice Processor Skill + +Cuando el usuario pida "procesar facturas" o "extraer datos de facturas": + +1. **Listar archivos**: + - Usa MCP Google Drive para listar archivos en carpeta "Facturas/Pendientes" + - Filtra solo PDFs del mes actual + +2. **Extraer datos**: + - Para cada PDF, usa MCP PDF Parser para extraer texto + - Identifica campos clave: + * Número de factura + * Fecha + * Proveedor + * Monto total + * Items y cantidades + +3. **Estructurar datos**: + - Genera JSON con datos extraídos + - Valida que todos los campos requeridos estén presentes + +4. **Guardar resultados**: + - Escribe JSON a `data/invoices/YYYY-MM.json` + - Mueve PDFs procesados a carpeta "Facturas/Procesadas" en Drive + +5. **Reportar**: + - Resume cantidad de facturas procesadas + - Lista cualquier PDF con datos incompletos +``` + +**Flujo de uso**: +``` +Usuario: "Procesa las facturas de este mes" +Claude: [Skill se activa] + → Llama a MCP Google Drive (listar archivos) + → Llama a MCP PDF Parser (extraer texto) + → Genera JSON estructurado + → Mueve archivos en Drive + → Reporta resultados +``` + +```mermaid +graph TB + subgraph User["Usuario"] + REQ["Procesa facturas"] + end + + subgraph System["Sistema Claude Code"] + SKILL["⚡ Invoice
Processor Skill"] + + subgraph MCPs["MCP Servers"] + GDRIVE["📁 Google Drive
(listar, mover)"] + PDF["📄 PDF Parser
(extraer texto)"] + end + + PROC["Procesar datos
(JSON)"] + end + + subgraph External["Servicios Externos"] + DRIVE["Google Drive
(Carpetas: Pendientes,
Procesadas)"] + end + + REQ -->|Activa| SKILL + SKILL -->|Usa| GDRIVE + SKILL -->|Usa| PDF + SKILL -->|Estructura| PROC + + GDRIVE ↔️ DRIVE + PDF -.->|Lee de| DRIVE + + PROC -->|Genera| OUTPUT["📊 JSON
estructurado"] + + style REQ fill:#f57c00,stroke:#fff,stroke-width:2px,color:#fff + style SKILL fill:#2e7d32,stroke:#fff,stroke-width:2px,color:#fff + style GDRIVE fill:#9c27b0,stroke:#fff,stroke-width:2px,color:#fff + style PDF fill:#9c27b0,stroke:#fff,stroke-width:2px,color:#fff + style PROC fill:#1976d2,stroke:#fff,stroke-width:2px,color:#fff + style DRIVE fill:#616161,stroke:#fff,stroke-width:2px,color:#fff + style OUTPUT fill:#388e3c,stroke:#fff,stroke-width:2px,color:#fff +``` + +--- + +**Siguiente paso:** [Mejores Prácticas y Recursos](./05-mejores-practicas-y-recursos.md) + +**Por qué esta arquitectura**: +- **Skill**: Procedimiento recurrente (cada mes), debe ser automático +- **MCP Google Drive**: Conectividad externa a Drive +- **MCP PDF Parser**: Funcionalidad especializada no nativa en Claude Code +- **No sub-agents**: No hay necesidad de paralelización (pocas facturas) ni especialización de contexto + +★ Insight ───────────────────────────────────── +Observa cómo **Skill + MCP** permite a Claude "razonar" sobre tareas complejas sin escribir código. El skill describe el flujo conceptualmente, los MCPs manejan la conectividad técnica. Sin this pattern, terminarías escribiendo scripts bash complejos o aplicaciones personalizadas. +───────────────────────────────────────────────── + +### Ejemplo 3: Análisis Paralelo de Codebase (Sub-agents) + +**Contexto**: Analizar codebase de 500 archivos para generar documentación de API. + +**Solución**: Sub-agents para paralelizar procesamiento + +**Sub-agent `api-doc-generator`**: +```yaml +--- +name: api-doc-generator +description: Analiza archivos de código y genera documentación de API +--- + +# System Prompt + +Eres un especialista en documentación de APIs. Analiza los archivos proporcionados y genera documentación en formato markdown. + +## Para cada endpoint/función: +- Nombre y signatura +- Descripción de qué hace +- Parámetros (tipo, requerido/opcional, descripción) +- Retorno (tipo, descripción) +- Ejemplos de uso +- Errores posibles + +## Formato: +Usa markdown con headers apropiados. Incluye ejemplos de código. + +## Tools permitidas: +- Read: para leer archivos de código +``` + +**Script de invocación** (desde agente principal o slash command): +```javascript +// Desde prompt del agente principal o slash command + +// 1. Encontrar todos los archivos de API +const apiFiles = await glob("src/api/**/*.js"); + +// 2. Dividir en batches de 10 archivos +const batches = []; +for (let i = 0; i < apiFiles.length; i += 10) { + batches.push(apiFiles.slice(i, i + 10)); +} + +// 3. Procesar en paralelo con sub-agents +console.log(`Procesando ${apiFiles.length} archivos en ${batches.length} batches...`); + +const results = await Promise.all( + batches.map((batch, idx) => { + return invokeSubAgent("api-doc-generator", { + files: batch, + outputFile: `docs/api/batch-${idx}.md` + }); + }) +); + +// 4. Agregar resultados en un índice +const indexContent = `# API Documentation\n\n` + + results.map((r, i) => `- [Batch ${i}](./batch-${i}.md)`).join('\n'); + +await writeFile('docs/api/index.md', indexContent); + +console.log(`✅ Documentación generada en docs/api/`); +``` + +**Por qué sub-agents**: +- **Paralelización**: 500 archivos secuencialmente tomaría horas, con 10 sub-agents procesando 50 archivos cada uno es mucho más rápido +- **Contexto aislado**: Cada sub-agent solo ve su batch, evita contaminar contexto +- **Restricción de herramientas**: El sub-agent solo necesita Read, no puede modificar código accidentalmente + +**Por qué NO alternatives**: +- **Skill solo**: No puede paralelizar, sería secuencial +- **Prompt simple**: Contexto explotaría con 500 archivos +- **MCP**: No hay integración externa, solo procesamiento diff --git a/docs/arquitectura-ia/guia-composicion/05-mejores-practicas-y-recursos.md b/docs/arquitectura-ia/guia-composicion/05-mejores-practicas-y-recursos.md new file mode 100644 index 0000000..55da9d6 --- /dev/null +++ b/docs/arquitectura-ia/guia-composicion/05-mejores-practicas-y-recursos.md @@ -0,0 +1,185 @@ +--- +sidebar_position: 5 +title: Mejores Prácticas y Recursos +--- + +## Mejores Prácticas y Lecciones Aprendidas + +### Keep Skills Focused + +**❌ Mal: Skill genérico que hace demasiado** +```yaml +--- +description: Ayuda con el desarrollo web +--- + +Ayuda con HTML, CSS, JavaScript, React, Vue, testing, deployment, y debugging. +``` + +**Problema**: Descripción demasiado vaga, se activará en contextos incorrectos. + +**✅ Bien: Skill específico** +```yaml +--- +description: Genera componentes React con TypeScript siguiendo convenciones del proyecto +--- + +Cuando el usuario pida crear un componente React: +1. Usa TypeScript +2. Aplica props typing con interface +3. Incluye JSDoc +4. Genera test correspondiente +``` + +**Lección**: Un skill debe resolver **una cosa bien**, no muchas cosas mediocre. + +### Write Specific Descriptions + +La descripción del skill es **crítica** para que Claude lo active correctamente. + +**❌ Mal**: +```yaml +--- +description: Ayuda con commits +--- +``` + +**✅ Bien**: +```yaml +--- +description: Genera mensajes de commit siguiendo Conventional Commits cuando el usuario mencione crear un commit o commit changes +--- +``` + +**Tips**: +- Incluir palabras clave que el usuario usaría ("crear commit", "commit changes") +- Ser específico sobre el dominio ("Conventional Commits", no solo "commits") +- Evitar ambigüedad ("ayuda con" es vago) + +### Restrict Tools en Sub-agents + +**❌ Mal: Sub-agent con acceso completo** +```yaml +--- +name: doc-generator +--- + +Genera documentación del código. + +# Tools: todas disponibles +``` + +**Problema**: Si un bug en el prompt, podría modificar código de producción accidentalmente. + +**✅ Bien: Restrict tools a lo necesario** +```yaml +--- +name: doc-generator +tools: + - Read + - Write: "docs/**/*.md" # Solo puede escribir en docs/ +--- + +Genera documentación del código. +``` + +**Lección**: Aplicar principio de least privilege. Si el sub-agent solo lee código y escribe docs, no necesita Bash, Grep, ni Write en otros directorios. + +### Prompt Engineering Primero + +**Workflow recomendado**: + +1. **Empezar conversacional**: Refinar el prompt en conversación hasta que funcione perfectamente +2. **Capturar el prompt final**: Guardar la versión que funciona +3. **Evaluar reusabilidad**: ¿Se usará frecuentemente? ¿Es siempre igual? +4. **Escalar gradualmente**: + - Si es manual y frecuente → Slash command + - Si debe ser automático → Skill + - Si necesita paralelismo → Sub-agent + - Si necesita integración externa → MCP + +**Anti-patrón**: Saltar directamente a crear skills sin probar el prompt conversacionalmente. Resultado: skills con prompts mal refinados que no funcionan bien. + +### Composición > Sobre-ingeniería + +**❌ Mal: Arquitectura innecesariamente compleja** +``` +Skill A llama a Sub-agent B que usa MCP C que llama a otro Sub-agent D +``` + +**Problema**: Debugging imposible, cadena de dependencias frágil, fiabilidad baja. + +**✅ Bien: Composición simple** +``` +Skill usa MCP directamente +O: Sub-agents paralelos que reportan a agente principal +``` + +**Regla**: Máximo **2 niveles de profundidad** en composición. Preferir composición horizontal (sub-agents en paralelo) sobre vertical (anidamiento). + +### Testing e Iteración + +**Skills y Sub-agents necesitan testing**: + +1. **Crear casos de prueba**: Situaciones específicas donde el skill debería activarse +2. **Verificar activación**: ¿Se activa cuando debe? ¿No se activa cuando no debe? +3. **Probar edge cases**: Inputs malformados, archivos inexistentes, etc. +4. **Iterar descripciones**: Refinar descripción del skill según falsos positivos/negativos + +**Ejemplo de test log**: +```markdown +# Test: Commit Message Skill + +## Caso 1: Usuario dice "create a commit" +- ✅ Skill se activó +- ✅ Generó mensaje Conventional Commit correcto + +## Caso 2: Usuario dice "what's the last commit?" +- ❌ Skill se activó (falso positivo) +- Fix: Mejorar descripción para especificar "crear" no "consultar" + +## Caso 3: Usuario hace commit con git directamente +- ⚠️ Skill no se activó (esperado, no hay mención en conversación) +``` + +## Conclusión: Skills como Nivel Composicional Superior + +Skills, MCP Servers, Sub-agents y Slash Commands no son tecnologías competidoras, son piezas complementarias de un sistema composicional. Entender cuándo usar cada uno es la diferencia entre una arquitectura elegante y un sistema sobre-ingenierizado. + +**El prompt es la unidad fundamental**. Todo lo demás (skills, sub-agents, MCPs) son formas de componer, reutilizar, y escalar prompts. No entregues el control a abstracciones complejas prematuramente. Empieza con prompts conversacionales, refina, y solo entonces escala. + +**Skills son automatización contextual**. Cuando un procedimiento se repite frecuentemente y debe ser automático, skills son la respuesta. Pero no conviertas todo en skills. La carga cognitiva de 50 skills con descripciones vagas es peor que 5 slash commands bien documentados. + +**MCP es conectividad**. Para integrar sistemas externos, no hay substituto. Pero no crees un MCP solo porque puedes. Usa las herramientas nativas de Claude Code cuando basten. + +**Sub-agents son para paralelismo y especialización**. Si necesitas procesar 100 archivos en paralelo, o restringir deliberadamente el contexto y herramientas de una tarea, sub-agents son ideales. Pero evita cadenas largas de sub-agents anidados. + +**Slash commands son control manual**. Para flujos que el usuario dispara explícitamente y que están en fase de experimentación, slash commands proveen el balance perfecto entre reusabilidad y flexibilidad. + +El futuro de la programación agentica no es maximizar el uso de todas las capacidades avanzadas, sino elegir la herramienta correcta para cada trabajo y componer con elegancia. Keep it simple, iterate, y escala solo cuando el patrón de uso lo justifique. + +## Referencias y Recursos + +### Documentación Oficial + +- [Claude Code Docs - Inicio](https://code.claude.com/docs) +- [Skills en Claude Code](https://code.claude.com/docs/en/skills) +- [Sub-agents en Claude Code](https://code.claude.com/docs/en/sub-agents) +- [Model Context Protocol Specification](https://modelcontextprotocol.io) +- [Repositorio de MCP Servers oficiales](https://github.com/modelcontextprotocol/servers) + +### Artículos y Guías + +- [Skills Explained - Anthropic Blog](https://claude.com/blog/skills-explained) +- [Claude Code Best Practices](https://www.anthropic.com/engineering/claude-code-best-practices) +- [Understanding Claude Code's Full Stack: MCP, Skills, Subagents, and Hooks](https://alexop.dev/posts/understanding-claude-code-full-stack/) +- [Video: Skills Composicionales en Claude Code](https://www.youtube.com/watch?v=kFpLzCVLA20) + +### Estándares y Convenciones + +- [Conventional Commits](https://www.conventionalcommits.org/) +- [Semantic Versioning](https://semver.org/) + +--- + +*Última actualización: Diciembre 2025* diff --git a/docs/arquitectura-ia/guia-composicion/_category_.json b/docs/arquitectura-ia/guia-composicion/_category_.json new file mode 100644 index 0000000..168dfdc --- /dev/null +++ b/docs/arquitectura-ia/guia-composicion/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "Guía de Composición de Agentes", + "position": 3, + "link": { + "type": "generated-index", + "description": "Aprende a combinar Skills, MCP Servers, Sub-agents y Slash Commands para construir sistemas agenticos robustos." + } +} diff --git a/docusaurus.config.js b/docusaurus.config.js index cbe8785..53f8022 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -38,6 +38,10 @@ const config = { locales: ['es'], }, + markdown: { + mermaid: true, + }, + presets: [ [ 'classic', @@ -72,6 +76,8 @@ const config = { ], ], + themes: ['@docusaurus/theme-mermaid'], + themeConfig: /** @type {import('@docusaurus/preset-classic').ThemeConfig} */ ({ @@ -80,6 +86,9 @@ const config = { colorMode: { respectPrefersColorScheme: true, }, + mermaid: { + theme: { light: 'default', dark: 'dark' }, + }, navbar: { title: 'Código Sin Siesta', logo: { diff --git a/package.json b/package.json index a6465af..ac03694 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "private": true, "scripts": { "docusaurus": "docusaurus", - "start": "docusaurus start", + "start": "docusaurus start --no-open", "build": "docusaurus build", "swizzle": "docusaurus swizzle", "deploy": "docusaurus deploy", @@ -16,6 +16,7 @@ "dependencies": { "@docusaurus/core": "3.9.2", "@docusaurus/preset-classic": "3.9.2", + "@docusaurus/theme-mermaid": "^3.9.2", "@mdx-js/react": "^3.0.0", "clsx": "^2.0.0", "prism-react-renderer": "^2.3.0", diff --git a/sidebars.js b/sidebars.js index 85c6b9b..851bfbb 100644 --- a/sidebars.js +++ b/sidebars.js @@ -61,6 +61,17 @@ const sidebars = { items: [ 'arquitectura-ia/patrones', 'arquitectura-ia/design-decisions', + { + type: 'category', + label: 'Guía de Composición', + items: [ + 'arquitectura-ia/guia-composicion/fundamentos-core-four', + 'arquitectura-ia/guia-composicion/comparativa-y-decision', + 'arquitectura-ia/guia-composicion/patrones-de-diseno', + 'arquitectura-ia/guia-composicion/casos-practicos', + 'arquitectura-ia/guia-composicion/mejores-practicas-y-recursos', + ], + }, 'arquitectura-ia/testing-strategies', 'arquitectura-ia/security-patterns', ],