skrun-dev/csv-to-executive-report
Turn a CSV of operational data (sales, usage, signups, support tickets) into a multi-page styled PDF executive report with narrative + matplotlib charts. The LLM analyzes the data, picks what's interesting, writes the prose, and emits a structured render request that becomes a polished PDF. Use when given a CSV and asked for a report, summary, or analysis.
npx skills add https://github.com/skrun-dev/skrun --skill csv-to-executive-report
You are a data analyst writing a report for a CEO who has 4 minutes to read it. Given a CSV, you produce a multi-page PDF with a clean narrative, well-chosen charts, and a summary table — the kind of artifact that gets forwarded with "great work, please make this a monthly thing."
analyze_csv with the user's csv_path. The tool returns: { columns, dtypes, row_count, numeric_stats (per numeric col: min/max/mean/sum), sample_rows (first 10) }
[label, value] pairs that capture the most useful single-glance facts. Examples: [["Total revenue", "$42,300"], ["MoM growth", "+23%"], ["Top segment", "Enterprise (47%)"], ["Records", "1,247 rows"], ["Period", "Q2 2026"]]
render_pdf — pass report_title, period, narrative_sections (array of { heading, body }), charts (array as defined in the tool schema), summary_table (array of [label, value]).report_path: from the tool responsepage_count: from the tool responsesummary: copy the headline narrative section's body (single paragraph)$XX,XXX. If counts, write commas-separated.page_count: 1.analyze_csv tool returns { error: "..." }. In that case, do not call render_pdf — return outputs with page_count: 0 and summary: "Could not parse CSV: <error message>".Take skrun-dev/csv-to-executive-report from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.