Communitygithub.com

Varnan-Tech/opendirectory

Genera gráficos de visualización de datos (barras, líneas, áreas, circular, dona, dispersión, radar, mapa de árbol) como PNG usando Apache ECharts v6. 1080×1080px predeterminado, 5 estilos predefinidos, anotaciones destacadas. Se activa cuando el usuario dice "crear un gráfico", "visualizar datos", "hacer un gráfico de barras", "gráfico de líneas", "gráfico circular", "visualización de datos", "graficar estos datos", "trazar", "gráfico" o "visualizar estos números".

¿Qué es opendirectory?

Esta habilidad (skill) permite a un agente de IA generar gráficos de visualización de datos como imágenes PNG de alta calidad. Es ideal para situaciones donde un usuario necesita representar datos numéricos visualmente para presentaciones, informes o análisis. La habilidad utiliza Apache ECharts v6 y un navegador Chrometime sin interfaz gráfica (headless) a través de Playwright para renderizar los gráficos. Soporta una amplia gama de tipos de gráficos, incluyendo barras, líneas, áreas, circular (pastel), dona, dispersión, radar y mapa de árbol. El proceso es automatizado: el agente recibe parámetros como el tipo de gráfico y los datos, construye un archivo HTML con la configuración de ECharts y las reglas de estilo, y luego exporta una captura de pantalla del gráfico renderizado. Está diseñado específicamente para agentes como Claude Code, Cursor o Codex, proporcionando un marcado detallado paso a paso, incluyendo reglas críticas para evitar errores comunes de ECharts, manejo de estilos predefinidos y un proceso de autoverificación (self-QA) para asegurar la calidad del resultado antes de la exportación.

Compatible con✓Claude Code~Codex CLI~Cursor✓Gemini CLI
npx skills add https://github.com/Varnan-Tech/opendirectory/tree/main/skills/graphic-chart

Preguntar en tu IA favorita

Abre un nuevo chat con esta habilidad de agente ya precargada.

Documentación

gráfico-chart

Genera gráficos de visualización de datos como PNG. Renderiza HTML con Apache ECharts v6 en Chromium sin interfaz gráfica a través de Playwright → capturas de pantalla con calidad retina 2×.

CDN: https://cdn.jsdelivr.net/npm/[email protected]/dist/echarts.min.js


Reglas críticas (leer antes de cada generación)

  1. Tipo area → type: 'line' + areaStyle: {} — ECharts no tiene type: 'area'.
  2. doughnut → type: 'pie' + radius: ['40%', '70%'] — ECharts no tiene type: 'doughnut'.
  3. Señal de listo: registrar chart.on('finished', fn) ANTES de chart.setOption() — Error de ECharts #14101/#17500: si el listener se registra después de setOption, nunca se dispara silenciosamente. Siempre registrar los eventos finished y rendered antes de setOption.
  4. xAxis.type: 'category' debe ser explícito — ECharts no lo infiere de los datos. Olvidar esto produce un gráfico en blanco.
  5. Las etiquetas de categoría van en xAxis.data, no en un arreglo data.labels. La estructura de ECharts es plana: { xAxis, yAxis, series, grid, title, legend } — no anidada bajo data o options.
  6. Las etiquetas de datos son totalmente integradas — usar label: { show: true } en cualquier serie. No se necesita plugin.
  7. Resaltar una barra/punto específico mediante itemStyle por elemento — poner { value: N, itemStyle: { color: '#...' } } directamente en el arreglo data. NO usar arreglos backgroundColor al estilo Chart.js.
  8. La inicialización de ECharts usa un contenedor <div>, no <canvas> — echarts.init(document.getElementById('chart')). El div contenedor necesita dimensiones explícitas.
  9. animation: false en la opción — desactiva la animación para renderizado instantáneo. Aún así, registrar los eventos finished + rendered antes de setOption para la señal de listo.
  10. Nunca volcar HTML en el chat. Guardar en archivo, mostrar solo el resumen.
  11. El título expresa la conclusión, no el tema. "Los ingresos crecieron 3× en 12 meses" no "Ingresos Mensuales".
  12. Gráfico circular/dona: usar padding: 64px 80px en el cuerpo y .chart-container { max-height: 860px } — evita el relleno de borde a borde cuando no hay título.

Paso 1: Captura de entrada

Requerido: chart_type, data

Parámetros opcionales y valores predeterminados:

ParámetroPredeterminadoDescripción
chart_type—bar / line / area / pie / doughnut / scatter / radar / treemap
data—Arreglo JSON o CSV — requerido
title—Expresa la conclusión, ≤10 palabras
subtitle—Línea de contexto de 1 oración
styleclean-slateclean-slate / midnight-editorial / matt-gray / electric-burst / brutalist
dimensions1080x1080WxH píxeles (PNG de salida = 2× mediante deviceScaleFactor)
x_label—Texto de la etiqueta del eje X
y_label—Texto de la etiqueta del eje Y
source—Fuente de datos mostrada en el pie de página
highlight—Etiqueta de datos a resaltar (ej. "Q4", "Dec", índice 3)

Si falta chart_type o data, preguntar exactamente:

"Para crear el gráfico, necesito:

  1. Tipo de gráfico — bar / line / area / pie / doughnut / scatter / radar / treemap
  2. Datos — proporcionar como arreglo JSON o CSV (ej. [12, 18, 22, 25, 31] con etiquetas ['Q1','Q2','Q3','Q4','Q5'])

Opcional: título, estilo (predeterminado: clean-slate), dimensiones (predeterminado: 1080×1080), resaltar un punto de datos específico"

Si ambos están presentes → saltar al Paso 2.


Paso 2: Arquitectura interna (nunca se muestra al usuario)

1. Normalizar el tipo de gráfico:

  • area → line + areaStyle: {} en la serie
  • doughnut → pie + radius: ['40%', '70%'] en la serie
  • horizontal bar → bar + intercambiar xAxis/yAxis (eje de categoría en y)
  • Todos los demás: usar tal cual

2. Leer references/chart-library.md — cargar la especificación de configuración completa para este tipo de gráfico.

3. Leer references/style-presets.md — cargar tokens CSS + paleta de datos para el estilo elegido.

4. Comprometerse con la dirección de diseño:

DecisiónDerivar de
TonoProfesional / editorial / audaz / técnico — coincidir con la audiencia de los datos
Historia de datosConclusión única que este gráfico demuestra (se convierte en el título)
Estrategia de resaltado¿Qué punto de datos necesita énfasis visual y por qué?
FondoClaro (clean-slate, matt-gray) u oscuro (midnight-editorial, electric-burst, brutalist)

5. Analizar datos:

  • Arreglo simple [12, 18, 22] → series.data, etiquetas proporcionadas por separado
  • Arreglo de objetos [{x: 'Jan', y: 12}] → xAxis.data de las claves x, series.data de los valores y
  • CSV: analizar la fila del encabezado como xAxis.data, la fila de valores como series.data
  • Múltiples series: múltiples entradas series cada una con type, name, data
  • Dispersión: series.data: [[x1,y1], [x2,y2], ...] formato

6. Analizar dimensiones: "1080x1080" → W=1080, H=1080. Cuerpo = WxH. PNG de salida = 2W × 2H.


Paso 3: Generación de HTML

Leer TODO antes de generar:

  • references/chart-library.md para la especificación completa de configuración de ECharts de este tipo de gráfico
  • references/style-presets.md para los tokens CSS + paleta del estilo elegido

Estructura HTML requerida:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
[enlace CDN de fuente desde el preset de estilo]
<style>
:root {
  [todos los tokens CSS del preset de estilo]
}

*, *::before, *::after { margin: 0; padding: 0; box-sizing: border-box; }
html, body {
  width: [W]px; height: [H]px;
  overflow: hidden;
  background: var(--bg);
  font-family: var(--font-body);
}
body {
  display: flex;
  flex-direction: column;
  padding: 40px 48px 32px;   /* gráfico circular/dona: usar 64px 80px */
}

/* El contenedor de ECharts debe tener un tamaño explícito */
.chart-container {
  flex: 1;
  min-height: 0;
  /* solo gráfico circular/dona: max-height: 860px; */
}

.chart-header { margin-bottom: 24px; }
.chart-title {
  font-family: var(--font-display);
  font-size: clamp(1.1rem, 2.5vw, 1.6rem);
  font-weight: 700;
  color: var(--text);
  line-height: 1.2;
}
.chart-subtitle {
  font-family: var(--font-body);
  font-size: clamp(0.75rem, 1.2vw, 0.9rem);
  color: var(--text-muted);
  margin-top: 6px;
  line-height: 1.5;
}
.chart-footer {
  margin-top: 14px;
  font-family: var(--font-body);
  font-size: 10px;
  color: var(--text-muted);
  opacity: 0.65;
}
</style>
</head>
<body>

[si hay título o subtítulo: <div class="chart-header"><div class="chart-title">...</div>...</div>]

<div id="chart" class="chart-container"></div>

[si hay source: <div class="chart-footer">Fuente: [source]</div>]

<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/echarts.min.js"></script>

<script>
window.__chartReady = false;

document.fonts.ready.then(() => {
  const container = document.getElementById('chart');
  const chart = echarts.init(container, null, { renderer: 'canvas' });

  // CRÍTICO: registrar eventos ANTES de setOption — Error de ECharts #14101/#17500
  // 'finished' puede no dispararse silenciosamente si se registra después de setOption con animation:false
  chart.on('finished', () => {
    window.__chartReady = true;
  });
  // Respaldo de seguridad mediante 'rendered'
  chart.on('rendered', () => {
    clearTimeout(window.__renderDebounce);
    window.__renderDebounce = setTimeout(() => { window.__chartReady = true; }, 100);
  });

  const palette = [paleta del preset de estilo];

  const option = {
    animation: false,                            // renderizado instantáneo para la captura

    backgroundColor: 'transparent',             // el CSS del cuerpo maneja el color de fondo

    textStyle: {
      fontFamily: '[valor de --font-body]',
      color: '[valor de --text-muted]',
    },

    [configuración de título si se proporcionó el parámetro title],
    [configuración de leyenda según el tipo de gráfico],
    [configuración de cuadrícula según el tipo de gráfico],
    [configuración de xAxis según el tipo de gráfico],
    [configuración de yAxis según el tipo de gráfico],

    series: [{
      [configuración completa de la serie desde chart-library.md para este tipo]
      [colores de paleta aplicados según el tipo de gráfico]
      [si hay highlight: itemStyle por elemento en el punto de datos resaltado]
    }]
  };

  chart.setOption(option);   // setOption SIEMPRE va después del registro de eventos
});
</script>
</body>
</html>

Reglas de calidad de diseño:

  • Fuente del título: fontWeight: 'bold', fontSize: 20–24 — sin títulos delgados
  • Líneas de cuadrícula: opacidad baja (0.06–0.10) — subordinadas a los datos
  • Barras: barMaxWidth: 60, redondeadas mediante itemStyle.borderRadius: [4,4,0,0]
  • Líneas: smooth: true para curvas naturales, symbolSize: 8 para puntos
  • Gráfico circular/dona: label.formatter: '{b}\n{d}%' para etiquetas integradas en las secciones
  • Presets oscuros: cuadrícula rgba(255,255,255,0.07), color de línea de eje/marca rgba(255,255,255,0.15)
  • Tooltip: show: false — PNG estático, sin interacción de hover
  • Cuando no se proporciona título: omitir .chart-header, omitir título en la opción de ECharts

Paso 4: Autoverificación (corregir cada fallo antes del Paso 5)

Estructura:

  • El contenedor es un <div>, no <canvas>
  • window.__chartReady = false declarado antes de document.fonts.ready
  • chart.on('finished', ...) registrado ANTES de chart.setOption()
  • chart.on('rendered', ...) respaldo con debounce registrado ANTES de chart.setOption()
  • animation: false en el objeto de opción
  • chart.setOption(option) es la ÚLTIMA llamada en el bloque de inicialización

Específico del tipo:

  • Área: type: 'line' + areaStyle: {} — no type: 'area'
  • Dona: type: 'pie' + radius: ['40%', '70%'] — no type: 'doughnut'
  • Barra: xAxis.type: 'category' establecido explícitamente
  • Datos de categoría en xAxis.data (no data.labels)
  • Gráfico circular/dona: padding: 64px 80px en el cuerpo + .chart-container { max-height: 860px }
  • Resaltado: { value: N, itemStyle: { color } } por elemento en el arreglo de datos

Diseño:

  • Todos los colores de la paleta de references/style-presets.md
  • El título expresa la conclusión (no solo el tema)
  • tooltip: { show: false } u omitido (sin hover en PNG estático)
  • Preset oscuro: colores de cuadrícula/eje usan rgba(255,255,255,...)
  • Fuente en el pie de página si se proporciona el parámetro source
  • Etiquetas de datos visibles (integrado label: { show: true } en la serie)

Paso 5: Exportación

Determinar slug a partir del título o tipo de gráfico + contexto de datos (kebab-case, ≤30 caracteres):

mkdir -p chart/[slug]

Guardar HTML: chart/[slug]/chart.html

Verificación rápida en el navegador:

open chart/[slug]/chart.html

Ejecutar exportación (reemplazar [skill-root] con la ruta real al directorio de esta habilidad):

bash [skill-root]/scripts/export-chart.sh \
  chart/[slug]/chart.html \
  chart/[slug]/chart.png \
  --width [W] \
  --height [H]

El script instala Playwright en la primera ejecución (~200MB de descarga de Chromium), luego captura el gráfico con deviceScaleFactor: 2.


Paso 6: Resumen de salida

## Gráfico: [título]
Fecha: [AAAA-MM-DD] | Tipo: [chart_type] | Estilo: [style]
Dimensiones: [W×H]px → PNG: [2W×2H]px @2× retina

Archivos
  Fuente:   chart/[slug]/chart.html
  Salida:   chart/[slug]/chart.png
  Tamaño:     [X] KB

Lista de verificación
- [ ] El título expresa la conclusión claramente
- [ ] Las etiquetas de datos son legibles en el tamaño de visualización
- [ ] El resaltado es visible en el punto de datos correcto
- [ ] Atribución de la fuente presente en el pie de página

Consejos rápidos (mostrar cuando el usuario pida orientación)

"Proporciona datos estructurados — JSON o CSV, no descripciones en prosa."

"Nombra el tipo de gráfico explícitamente. 'gráfico de barras que compara Q1–Q4' no 'un gráfico que muestra trimestres'."

"Especifica la historia de los datos. 'resalta Q4 que superó a todos los demás' da el contexto de la anotación."

✅ Bueno: "Crea un gráfico de líneas. Título: 'De $12k a $95k ARR en 12 Meses'. Datos: [12, 18, 22, 25, 31, 38, 44, 52, 61, 68, 78, 95] (Ene–Dic 2024). Resalta Diciembre. Fuente: CRM Interno. Estilo: electric-burst."

❌ Malo: "haz un gráfico sobre el crecimiento de nuestra empresa"

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

Varnan-Tech/opendirectory

Use when the user asks to generate a blog cover image, thumbnail, or article header. Automatically uses modern typography, brand logos, and Google Search grounding to create beautiful 16:9 images with Gemini 3.1 Flash Image Preview.

Varnan-Tech/opendirectory

World-class brand strategist and naming expert. Uses an interrogation-led discovery phase to extract your brand's DNA, then applies scientific naming frameworks (Phonosemantics) and automated multi-TLD domain checking.

Varnan-Tech/opendirectory

Use when the user asks to generate or update a project's CLAUDE or AGENTS context file from a codebase scan. Writes a focused file under 100 lines containing only the non-obvious build commands, conventions, and gotchas Claude Code needs.

Varnan-Tech/opendirectory

Use when the user wants to verify cold emails, enrich a lead list, or autonomously guess email addresses from a CSV using ValidEmail.co or the open-source Reacher engine.

Varnan-Tech/opendirectory

Competitive intelligence orchestrator tracking companies across 8+ platforms (GitHub, Twitter, Reddit, HN, PH, YC Jobs) with heat scores and AI briefings.

Varnan-Tech/opendirectory

Give it your product URL or description. It finds your top 5 competitors, runs three-track PR research across all of them (editorial, podcasts, communities), identifies which channels appear most frequently, looks up the journalist or host for each, and returns a tiered outreach list with story angles and ready-to-send cold pitch drafts tailored to your product. Use when asked to find PR opportunities, discover where competitors got featured, build a media outreach list, find which journalists cover my space, or get pitch templates for press coverage.

Varnan-Tech/opendirectory

Generate high-converting, deep-dive growth case studies in MDX format. Use this skill when asked to write a case study or blog post about a company's growth, tech stack, or product-led strategy. It handles the full pipeline (researching the company via Tavily, generating a 16:9 cover image, quality checking the draft, uploading assets to cloud storage, and pushing directly to the target repository).

Varnan-Tech/opendirectory

Scans your project for outdated npm, pip, Cargo, Go, or Ruby packages. Runs a CVE security audit. Fetches changelogs, summarizes breaking changes with Gemini, and opens one PR per risk group (patch, minor, major). Includes Diagnosis Mode for install conflicts. Use when asked to update dependencies, check for outdated packages, open dependency PRs, scan for package updates, audit for CVEs, or flag breaking changes in upgrades. Trigger when a user says "check for outdated packages", "update my dependencies", "open PRs for dependency updates", "scan for CVEs", or "which packages need upgrading".

Varnan-Tech/opendirectory

Generates and updates README.md and API reference docs by reading your codebase's functions, routes, types, schemas, and architecture. Uses graphify to build a knowledge graph first, then writes accurate docs from it. Use when asked to write docs, generate a README, document an API, update stale docs, create an API reference from code, add an architecture section, or document a project in any language. Trigger when a user says their docs are missing, outdated, or wants to document their codebase without writing it manually.

Varnan-Tech/opendirectory

Evaluates expired domain candidates against a target niche, scores them by topical relevance, historical activity level, and history cleanliness, then outputs a ranked shortlist with explainable reasoning and risk flags.

Varnan-Tech/opendirectory

Brutally honest developer-experience audit for a GitHub repo. Scores 10 DX dimensions (time-to-first-success, README clarity, visual proof, install, quick-start, docs, examples, community, trust, marketing), writes a shareable roast in the requested tone (brutal/honest/kind), produces a prioritized action plan ranked by impact × effort, and sketches an ideal README. Trigger when user says "roast my repo", "audit my README", "dx audit", "developer experience review", "score my GitHub project", "before launch checklist", or "make my repo shareable".

Varnan-Tech/opendirectory

Drafts and designs a complete HTML email newsletter from a topic or content brief. Outputs paste-ready HTML for Loops, Mailchimp, Beehiiv, Resend, or any standard email platform. Includes subject line options and plain-text fallback. Trigger when a user says "write a newsletter", "draft an email newsletter", "create an HTML email", "design an email for my subscribers", or "write a newsletter about [topic]".

Varnan-Tech/opendirectory

Takes a GitHub PR URL or the current branch and writes a plain-English explanation of what it does and why, then posts it as a PR comment. Use when asked to explain a PR, summarize a pull request, write a plain-English description of a PR, add a summary comment to a PR, or understand what a PR changes. Trigger when a user says "explain this PR", "summarize this pull request", "what does this PR do", "add a comment explaining the PR", or shares a GitHub PR URL and asks what it does.

Varnan-Tech/opendirectory

Audit how often LLMs recommend your brand vs competitors and generate a GEO action plan.

Varnan-Tech/opendirectory

Takes a competitor's public GitHub repo URL, fetches their open issues via the GitHub REST API, filters noise locally, clusters issues into 6 demand categories, computes a demand score per issue and per cluster, and outputs a ranked demand gap report with a GTM messaging brief. Use when asked to scan a competitor's GitHub issues, find what their users are begging for, turn GitHub complaints into product positioning, identify competitor feature gaps, or generate messaging from real user demand. Trigger when a user says "scan competitor issues", "what are users asking for on X repo", "find demand gaps in Y", "turn GitHub issues into messaging", or "what should I build based on competitor complaints".

Varnan-Tech/opendirectory

Find recurring confusion in your repo's GitHub Discussions, rank it by urgency, and draft the actual docs fixes and content angles — with verbatim community quotes and source links as evidence.

Varnan-Tech/opendirectory

SEO keyword research workflow for blog generation using Google Trends data. Use when writing blog posts, planning content calendars, or optimizing articles for search engines. Finds breakout keywords, builds content structure, and generates SEO-optimized blog outlines targeting tech and developer audiences.

Varnan-Tech/opendirectory

Generates a professionally designed case study PDF for B2B SaaS sales and marketing. Supports 7 page layouts, 9 style presets, 1-4 page output. Trigger when user says "create a case study", "write a customer story", "make a case study PDF", "design a success story", "turn this customer win into a PDF".

Varnan-Tech/opendirectory

Creates professionally designed B2B SaaS e-books in HTML + CSS, exported as print-ready PDF. 3–10 pages, 9 style presets, 11 page layout types. Trigger when user says "create an ebook", "design a lead magnet", "make a PDF guide", "build a gated content piece", "write a B2B ebook", "design a white paper", "create a nurture asset", or "make a PDF report".

Varnan-Tech/opendirectory

Fetches low-star App Store and Google Play reviews, clusters them into broken-promise patterns, and generates a ranked copy brief with positioning opportunities.

Skills relacionados