Communitygithub.com

Varnan-Tech/opendirectory

Génère des graphiques de visualisation de données (barres, lignes, aires, camemberts, anneaux, nuages de points, radar, treemap) au format PNG en utilisant Apache ECharts v6. Résolution par défaut 1080×1080px, 5 préréglages de style, annotations de surbrillance. Déclenché lorsque l'utilisateur dit « créer un graphique », « visualiser des données », « faire un diagramme en barres », « courbe », « camembert », « visualisation de données », « représenter ces données », « tracer », « graphique » ou « visualiser ces nombres ».

Qu'est-ce que opendirectory ?

Cette compétence génère des graphiques de visualisation de données haute résolution (PNG 2× retina) en utilisant Apache ECharts v6, rendus via un Chromium headless avec Playwright. Elle prend en charge tous les types de graphiques courants (barres, lignes, aires, camemberts, anneaux, nuages de points, radar, treemap) et inclut une logique d'inférence de type pour les demandes ambiguës (par exemple, « area » devient `type: 'line'` avec `areaStyle: {}`). La compétence applique automatiquement des règles critiques pour éviter les bugs connus d'ECharts, comme l'enregistrement des événements `finished` et `rendered` avant `setOption()`, et la définition explicite de `xAxis.type: 'category'`. Cinq préréglages de style (clean-slate, midnight-editorial, matt-gray, electric-burst, brutalist) offrent des palettes de couleurs et des polices prédéfinies. L'utilisateur peut spécifier les données sous forme de JSON ou CSV, un titre, un sous-titre, une source, des dimensions personnalisées et un point de données à mettre en surbrillance. Le processus comprend une étape d'auto-vérification (QA) rigoureuse avant l'exportation, garantissant que le HTML et le PNG générés respectent les normes de qualité et les règles de conception.

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

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

graphic-chart

Génère des graphiques de visualisation de données au format PNG. Rend le HTML avec Apache ECharts v6 dans Chromium headless via Playwright → captures d'écran en qualité rétine 2×.

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


Règles critiques (à lire avant chaque génération)

  1. type area → type: 'line' + areaStyle: {} — ECharts n'a pas de type: 'area'.
  2. doughnut → type: 'pie' + radius: ['40%', '70%'] — ECharts n'a pas de type: 'doughnut'.
  3. Signal de préparation : enregistrer chart.on('finished', fn) AVANT chart.setOption() — Bug ECharts #14101/#17500 : si l'écouteur est enregistré après setOption, il ne se déclenche jamais silencieusement. Toujours enregistrer les événements finished et rendered avant setOption.
  4. xAxis.type: 'category' doit être explicite — ECharts ne l'infère pas à partir des données. L'oublier produit un graphique vide.
  5. Les étiquettes de catégories vont dans xAxis.data, pas dans un tableau data.labels. La structure ECharts est plate : { xAxis, yAxis, series, grid, title, legend } — pas imbriquée sous data ou options.
  6. Les étiquettes de données sont entièrement intégrées — utiliser label: { show: true } sur n'importe quelle série. Aucun plugin nécessaire.
  7. Mettre en surbrillance une barre/point spécifique via itemStyle par élément — placer { value: N, itemStyle: { color: '#...' } } directement dans le tableau data. Ne PAS utiliser de tableaux backgroundColor de type Chart.js.
  8. L'initialisation ECharts utilise un conteneur <div>, pas <canvas> — echarts.init(document.getElementById('chart')). Le div conteneur nécessite des dimensions explicites.
  9. animation: false dans l'option — désactive l'animation pour un rendu instantané. Toujours enregistrer les événements finished + rendered avant setOption pour le signal de préparation.
  10. Ne jamais déverser le HTML dans le chat. Sauvegarder dans un fichier, afficher uniquement le résumé.
  11. Le titre énonce l'information clé, pas le sujet. « Les revenus ont triplé en 12 mois » pas « Revenus mensuels ».
  12. Camembert/Anneaux : utiliser le padding: 64px 80px du corps et .chart-container { max-height: 860px } — empêche le remplissage bord à bord lorsqu'il n'y a pas de titre.

Étape 1 : Réception

Requis : chart_type, data

Paramètres optionnels et valeurs par défaut :

ParamètreDéfautDescription
chart_type—bar / line / area / pie / doughnut / scatter / radar / treemap
data—Tableau JSON ou CSV — requis
title—Énonce l'information clé, ≤10 mots
subtitle—Ligne de contexte d'une phrase
styleclean-slateclean-slate / midnight-editorial / matt-gray / electric-burst / brutalist
dimensions1080x1080Pixels LxH (PNG de sortie = 2× via deviceScaleFactor)
x_label—Texte de l'étiquette de l'axe X
y_label—Texte de l'étiquette de l'axe Y
source—Source de données affichée dans le pied de page
highlight—Étiquette de données à mettre en surbrillance (ex. "T4", "Dec", index 3)

Si chart_type ou data est manquant, demander exactement :

"Pour créer le graphique, j'ai besoin de :

  1. Type de graphique — bar / line / area / pie / doughnut / scatter / radar / treemap
  2. Données — fournir sous forme de tableau JSON ou CSV (ex. [12, 18, 22, 25, 31] avec les étiquettes ['Q1','Q2','Q3','Q4','Q5'])

Optionnel : titre, style (défaut : clean-slate), dimensions (défaut : 1080×1080), mettre en surbrillance un point de données spécifique"

Si les deux sont présents → passer à l'Étape 2.


Étape 2 : Architecture interne (jamais montrée à l'utilisateur)

1. Normaliser le type de graphique :

  • area → line + areaStyle: {} sur la série
  • doughnut → pie + radius: ['40%', '70%'] sur la série
  • horizontal bar → bar + échanger xAxis/yAxis (axe des catégories sur y)
  • Tous les autres : utiliser tels quels

2. Lire references/chart-library.md — charger la spécification de configuration complète pour ce type de graphique.

3. Lire references/style-presets.md — charger les tokens CSS + la palette de données pour le style choisi.

4. S'engager sur la direction de conception :

DécisionDériver de
TonProfessionnel / éditorial / audacieux / technique — correspondre au public des données
Histoire des donnéesInformation unique que ce graphique prouve (devient le titre)
Stratégie de surbrillanceQuel point de données a besoin d'emphase visuelle et pourquoi ?
Arrière-planClair (clean-slate, matt-gray) ou foncé (midnight-editorial, electric-burst, brutalist)

5. Analyser les données :

  • Tableau simple [12, 18, 22] → series.data, les étiquettes fournies séparément
  • Tableau d'objets [{x: 'Jan', y: 12}] → xAxis.data à partir des clés x, series.data à partir des valeurs y
  • CSV : analyser la ligne d'en-tête comme xAxis.data, la ligne de valeurs comme series.data
  • Multi-séries : entrées series multiples chacune avec type, name, data
  • Nuage de points : format series.data: [[x1,y1], [x2,y2], ...]

6. Analyser les dimensions : "1080x1080" → L=1080, H=1080. Corps = LxH. PNG de sortie = 2L × 2H.


Étape 3 : Génération HTML

Tout lire AVANT de générer :

  • references/chart-library.md pour la spécification complète de configuration ECharts de ce type de graphique
  • references/style-presets.md pour les tokens CSS + la palette du style choisi

Structure HTML requise :

<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
[lien CDN de la police depuis le préréglage de style]
<style>
:root {
  [tous les tokens CSS du préréglage de style]
}

*, *::before, *::after { margin: 0; padding: 0; box-sizing: border-box; }
html, body {
  width: [L]px; height: [H]px;
  overflow: hidden;
  background: var(--bg);
  font-family: var(--font-body);
}
body {
  display: flex;
  flex-direction: column;
  padding: 40px 48px 32px;   /* camembert/anneau : utiliser 64px 80px */
}

/* Le conteneur ECharts doit avoir une taille explicite */
.chart-container {
  flex: 1;
  min-height: 0;
  /* camembert/anneau uniquement : 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 titre ou sous-titre : <div class="chart-header"><div class="chart-title">...</div>...</div>]

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

[si source : <div class="chart-footer">Source : [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' });

  // CRITIQUE : enregistrer les événements AVANT setOption — bug ECharts #14101/#17500
  // 'finished' peut ne pas se déclencher silencieusement s'il est enregistré après setOption avec animation:false
  chart.on('finished', () => {
    window.__chartReady = true;
  });
  // Mécanisme de secours via 'rendered'
  chart.on('rendered', () => {
    clearTimeout(window.__renderDebounce);
    window.__renderDebounce = setTimeout(() => { window.__chartReady = true; }, 100);
  });

  const palette = [palette du préréglage de style];

  const option = {
    animation: false,                            // rendu instantané pour la capture d'écran

    backgroundColor: 'transparent',             // le CSS du corps gère la couleur de fond

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

    [configuration titre si le paramètre titre est fourni],
    [configuration légende selon le type de graphique],
    [configuration grille selon le type de graphique],
    [configuration xAxis selon le type de graphique],
    [configuration yAxis selon le type de graphique],

    series: [{
      [configuration complète de la série depuis chart-library.md pour ce type]
      [couleurs de la palette appliquées selon le type de graphique]
      [si surbrillance : itemStyle par élément sur le point de données en surbrillance]
    }]
  };

  chart.setOption(option);   // setOption VIENT TOUJOURS après l'enregistrement des événements
});
</script>
</body>
</html>

Règles de qualité de conception :

  • Police du titre : fontWeight: 'bold', fontSize: 20–24 — pas de titres fins
  • Lignes de grille : faible opacité (0.06–0.10) — subordonnées aux données
  • Barres : barMaxWidth: 60, arrondies via itemStyle.borderRadius: [4,4,0,0]
  • Lignes : smooth: true pour des courbes naturelles, symbolSize: 8 pour les points
  • Camembert/Anneau : label.formatter: '{b}\n{d}%' pour les étiquettes intégrées sur les parts
  • Préréglages sombres : grille rgba(255,255,255,0.07), couleur des lignes/repères d'axe rgba(255,255,255,0.15)
  • Infobulle : show: false — PNG statique, pas d'interaction au survol
  • Lorsqu'aucun titre n'est fourni : ignorer .chart-header, omettre le titre de l'option ECharts

Étape 4 : Auto-QA (corriger chaque échec avant l'Étape 5)

Structure :

  • Le conteneur est un <div>, pas un <canvas>
  • window.__chartReady = false déclaré avant document.fonts.ready
  • chart.on('finished', ...) enregistré AVANT chart.setOption()
  • Mécanisme de secours chart.on('rendered', ...) enregistré AVANT chart.setOption()
  • animation: false dans l'objet option
  • chart.setOption(option) est le DERNIER appel dans le bloc d'initialisation

Spécifique au type :

  • Aire : type: 'line' + areaStyle: {} — pas de type: 'area'
  • Anneau : type: 'pie' + radius: ['40%', '70%'] — pas de type: 'doughnut'
  • Barres : xAxis.type: 'category' défini explicitement
  • Données de catégorie dans xAxis.data (pas data.labels)
  • Camembert/Anneau : body padding: 64px 80px + .chart-container { max-height: 860px }
  • Surbrillance : { value: N, itemStyle: { color } } par élément dans le tableau data

Conception :

  • Toutes les couleurs de la palette proviennent de references/style-presets.md
  • Le titre énonce l'information clé (pas seulement le sujet)
  • tooltip: { show: false } ou omis (pas de survol sur PNG statique)
  • Préréglage sombre : les couleurs de la grille/des axes utilisent rgba(255,255,255,...)
  • Source dans le pied de page si le paramètre source est fourni
  • Étiquettes de données visibles (intégré label: { show: true } sur la série)

Étape 5 : Exportation

Déterminer le slug à partir du titre ou du type de graphique + contexte des données (kebab-case, ≤30 caractères) :

mkdir -p chart/[slug]

Sauvegarder le HTML : chart/[slug]/chart.html

Vérification rapide dans le navigateur :

open chart/[slug]/chart.html

Lancer l'exportation (remplacer [skill-root] par le chemin réel vers le répertoire de cette compétence) :

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

Le script installe Playwright lors de la première exécution (~200 Mo de téléchargement Chromium), puis capture le graphique à deviceScaleFactor: 2.


Étape 6 : Résumé de sortie

## Graphique : [titre]
Date : [AAAA-MM-JJ] | Type : [chart_type] | Style : [style]
Dimensions : [L×H]px → PNG : [2L×2H]px @2× retina

Fichiers
  Source :   chart/[slug]/chart.html
  Sortie :   chart/[slug]/chart.png
  Taille :   [X] Ko

Liste de vérification
- [ ] Le titre énonce clairement l'information clé
- [ ] Les étiquettes de données sont lisibles à la taille d'affichage
- [ ] La surbrillance est visible sur le point de données correct
- [ ] L'attribution de la source est présente dans le pied de page

Conseils (à montrer lorsque l'utilisateur demande des conseils)

"Fournissez des données structurées — JSON ou CSV, pas de descriptions en prose."

"Nommez le type de graphique explicitement. 'diagramme en barres comparant T1–T4' pas 'un graphique montrant les trimestres'."

"Spécifiez l'histoire des données. 'mettre en surbrillance T4 qui a surpassé tous les autres' donne le contexte d'annotation."

✅ Bon : "Créez un graphique en lignes. Titre : 'De 12k$ à 95k$ de ARR en 12 mois'. Données : [12, 18, 22, 25, 31, 38, 44, 52, 61, 68, 78, 95] (Jan–Déc 2024). Mettre en surbrillance Décembre. Source : CRM interne. Style : electric-burst."

❌ Mauvais : "faites un graphique sur la croissance de notre entreprise"

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 associés