Communitygithub.com

baronguyen001/ai-automation-skills

Transforme une liste de dictionnaires de résultats en un CSV structuré et un tableau Markdown à partir d'une seule spécification de colonnes – déclarez les colonnes une fois, obtenez les deux formats, avec un ordre stable et un échappement sécurisé, bibliothèque standard uniquement, sans pandas.

Qu'est-ce que ai-automation-skills ?

Cette compétence vous permet de convertir facilement une liste de dictionnaires (résultats d'un run) en deux formats de sortie : un fichier CSV structuré pour les tableurs et un tableau Markdown pour les commentaires PR ou les digests Telegram. Le principal avantage est qu'il suffit de définir les colonnes une seule fois (clé, en-tête, formateur optionnel) et la même spécification est utilisée pour les deux sorties, garantissant une cohérence parfaite et évitant les dérives. Cette approche utilise uniquement la bibliothèque standard Python, sans pandas, ce qui la rend légère et facile à intégrer dans n'importe quel projet. Le mécanisme assure un ordre stable des colonnes, un échappement correct des virgules dans le CSV et des barres verticales dans le Markdown, et gère les clés manquantes comme des cellules vides sans faire planter le script.

Compatible avec~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/baronguyen001/ai-automation-skills/tree/HEAD/skills/csv-report-writer

Demander à votre IA préférée

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

Documentation

Générateur de rapports CSV

Utilisez cette compétence lorsqu'un travail produit une liste de lignes de résultats et que vous souhaitez un CSV propre pour les tableurs ainsi qu'un tableau Markdown pour un commentaire de PR ou un digest Telegram – à partir d'une seule définition de colonnes, afin que les deux sorties ne divergent jamais. Vous déclarez les colonnes (clé, en-tête, formateur optionnel) une fois ; l'assistant émet les deux formats, dans un ordre stable des colonnes, avec un bon échappement CSV et des pipes échappés pour Markdown. Pas de pandas.

Quand invoquer

  • L'utilisateur dit : "écris les résultats dans un CSV", "exporte un rapport", "fais un tableau Markdown de ça", "sauvegarde la sortie du run sous forme de tableur".
  • Le code dans la conversation contient une list[dict] (ou une liste d'objets) qu'il affiche actuellement de manière ad hoc.

Quand NE PAS invoquer

  • Les données nécessitent un vrai travail de dataframe – jointures, group-by, pivots ; utilisez pandas/polars à la place.
  • Un résultat scalaire unique, où un CSV/tableau est excessif.

Exemple concret

Entrée utilisateur :

J'ai une liste de tokens scannés avec un score et un prix. Enregistre un CSV et donne-moi aussi un tableau Markdown pour le digest Telegram.

Sortie :

# Copiez assets/report.py dans votre projet, puis :
from report import Column, write_csv, to_markdown

columns = [
    Column("symbol", "Symbole"),
    Column("score", "Score", fmt=lambda v: f"{v:.1f}"),
    Column("price_usd", "Prix", fmt=lambda v: f"${v:,.4f}"),
]
rows = [
    {"symbol": "ABC", "score": 8.4, "price_usd": 0.0123},
    {"symbol": "XYZ", "score": 6.1, "price_usd": 1.5},
]

write_csv("scan.csv", columns, rows)        # CSV structuré, ordre stable des colonnes
print(to_markdown(columns, rows))           # mêmes colonnes, tableau Markdown

Les deux sorties utilisent exactement les mêmes colonnes dans le même ordre, donc le CSV et le tableau du digest concordent toujours.

Motif à appliquer

  1. Déclarez chaque Column(key, header, fmt=...) une fois ; les deux rédacteurs consomment la même liste, donc les en-têtes et l'ordre restent synchronisés.
  2. Gardez l'ordre des colonnes stable et explicite – ne vous fiez pas à l'ordre d'insertion du dictionnaire de lignes arbitraires.
  3. Laissez le callable fmt gérer la présentation (devise, arrondi) ; stockez les valeurs brutes dans les dictionnaires de lignes.
  4. Utilisez csv.writer pour un marquage correct ; échappez les | et les nouvelles lignes dans le tableau Markdown pour qu'il ne casse jamais la mise en page.
  5. Traitez une clé manquante comme une cellule vide plutôt que de planter, afin que les lignes partielles soient tout de même rapportées.

Référence : assets/report.py.

Source

Issu de l'utilisation en production dans les projets d'automatisation de l'auteur. v1.0.0. Voir aussi : [[pr-body-formatter]], [[sqlite-state]], [[telegram-alerter]].

→ Construisez le bot complet avec Trawlkit.

Individual skills in this repo

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

baronguyen001/ai-automation-skills

Schedule any script to run on a recurring schedule on Windows (Task Scheduler) or Linux (cron) - register, list, and remove jobs from one command, with logging to a file and a guard against overlapping runs. Use for schedule a script, run nightly, set up a cron job, windows task scheduler, or run on a timer.

baronguyen001/ai-automation-skills

Strip HTML to clean plain text with the standard library only (no BeautifulSoup/lxml): drops script/style, turns block tags into line breaks, and collapses whitespace. Use when the user wants readable text from an HTML page/email, to clean scraped HTML before sending it to an LLM, or to build a text index from web content.

baronguyen001/ai-automation-skills

Persist records between scheduled runs as append-only JSON Lines (one object per line) with streaming reads and optional key-based dedup, stdlib only. Use when the user wants to log run results to JSONL, append events to a file, dedup records by id across runs, or keep a simple durable history without a database.

baronguyen001/ai-automation-skills

Extract text and simple table-like rows from a PDF for downstream AI without OCR binaries. Use when the user asks to read a PDF, turn a PDF into text, pull simple tables from statements/reports, or feed PDF content into an LLM pipeline.

baronguyen001/ai-automation-skills

Rotate a pool of HTTP/SOCKS proxies with round-robin selection, failure tracking, and a cooldown that benches dead proxies before retrying. BYO proxy list via env - none are shipped. Use for rotate proxies, spread requests across proxies, avoid IP bans, retry through a different proxy, or proxy health check.

baronguyen001/ai-automation-skills

Parse an RSS 2.0 or Atom feed into normalized item dicts (title, link, id, published, summary) with the standard library only - no feedparser. Use when the user asks to read an RSS/Atom feed, poll a blog/news feed, extract feed entries, or watch a site that publishes a feed.

baronguyen001/ai-automation-skills

Upload and download run artifacts from S3-compatible storage with BYO bucket and credentials from env. Use when the user asks to store scraper output, archive reports, publish artifacts to object storage, fetch a prior run file, or use MinIO/R2/Spaces/S3 without hardcoding credentials.

baronguyen001/ai-automation-skills

Draft a short-form TikTok/Reels/Shorts or long-form video script from a topic and creator persona file - hook variants, beat-structured body, CTA, b-roll cues, caption overlays, and [STORY]/[NUMBER] slots so the model never fabricates personal facts. Use for write a video script, tiktok script, youtube script, or /shortform-script.

baronguyen001/ai-automation-skills

Give scheduled scripts memory between runs with one SQLite file - a seen-set for dedup, a key/value cursor to resume where you left off, and order-preserving new-item filtering. Use for dedup across runs, don't re-alert the same item, remember the last id, resume a scraper, or persist state between cron runs.

Skills associés