asana-api
Read and manage Asana tasks, projects, sections, comments, and workspaces. Use this whenever the user wants to list or search…
Compose polished charts (timeseries, bar, line, area, pie, scatter, or anything else the data calls for) from tabular data using the chartkit primitives, producing PNG, SVG, or self-contained interactive HTML. Use when the user asks to chart, graph, plot, or visualize data and
$ npx -y skills add anthropics/claude-tag-plugins --skill graphing --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/graphingContext preview
The summary Claude sees to decide when to auto-load this skill.
Compose polished charts (timeseries, bar, line, area, pie, scatter, or anything else the data calls for) from tabular data using the chartkit primitives, producing PNG, SVG, or self-contained interactive HTML. Use when the user asks to chart, graph, plot, or visualize data and
name: graphing description: Compose polished charts (timeseries, bar, line, area, pie, scatter, or anything else the data calls for) from tabular data using the chartkit primitives, producing PNG, SVG, or self-contained interactive HTML. Use when the user asks to chart, graph, plot, or visualize data and wants something better than raw matplotlib defaults.
You write the plotting code. The kit provides the parts that should stay consistent across every chart: typography, color derivation from the background, the title and caption frame, and offline HTML packaging. Everything about the chart itself is your judgement applied to the data in front of you.
Import `chartkit` by putting this skill's `scripts/` directory on `sys.path`. Use its absolute path, not a relative path, since your working directory is the user's project. The examples below write it as `/path/to/graphing/scripts`; substitute the real path.
Relevant primitives:
1. **Look at the data and decide what it deserves.** Shape, count, and meaning drive the choice: trends over time want lines or day bars, ranked categories want horizontal bars, parts of a whole with few slices can be a pie, correlation wants a scatter. Nothing limits you to those: stacked areas, dual axes, small multiples, annotated thresholds are all just code you write.
2. **Infer colors from context.** Check your conversation and memory for design indicators: a tailwind config, CSS variables, or brand guidelines, and consider the semantic meaning of the data (red or amber for errors, green for success). Pass the destination background to `theme(bg=...)` and brand colors to `palette(base=...)` or directly. Fall back to the defaults only when nothing is inferable. The font defaults to Inter and only changes when the user names a typeface or the destination has a documented brand font.
3. **Write a short script** in your scratchpad that imports chartkit, builds the figure with plain matplotlib (or a Recharts component for interactive output), calls `finish`, and saves.
4. **Render and look at the result.** Read the PNG back and check it with your own eyes before handing it over: labels legible, nothing overlapping, colors distinguishable, the story of the data actually visible. Fix and re-render until it is right.
PNG or SVG via matplotlib:
import sys
sys.path.insert(0, "/path/to/graphing/scripts")
import chartkit as ck
import matplotlib.pyplot as plt
c = ck.theme() # or theme(bg="#0f1419") for a dark surface
fig, ax = plt.subplots(figsize=(10, 5))
# ...plain matplotlib against the data, using c.accent, c.secondary, ck.palette(...)
ck.finish(ax, title="What the chart shows", subtitle="scope or time range",
source="source: where the data came from, date")
print(ck.save(fig, "out/report", formats=("png", "svg")))Interactive HTML via Recharts, written as plain `React.createElement` with no JSX and no build step:
component = """
(function () {
var e = React.createElement
var R = window.Recharts
var DATA = window.__CHART_DATA__
function App() {
return e(R.ResponsiveContainer, { width: "100%", height: 420 },
e(R.LineChart, { data: DATA },
e(R.CartesianGrid, { stroke: "GRID", vertical: false }),
e(R.XAxis, { dataKey: "x" }), e(R.YAxis, null),
e(R.Tooltip, null),
e(R.Line, { dataKey: "y", stroke: "ACCENT", strokeWidth: 2.4,
dot: false, isAnimationActive: false })))
}
ReactDOM.createRoot(document.getElementById("root")).render(e(App))
})()
"""
ck.write_html("out/report.html", data, component, title="What the chart shows")Substitute real colors from the theme into the component and keep `isAnimationActive: false` so the chart is complete the moment the file opens.
These are the defaults of good charts. Deviate when the data argues for it.
Plugins for @claude that connect the agent to common SaaS services. Each service is its own plugin, so a workspace can connect exactly the services it uses.
Read and manage Asana tasks, projects, sections, comments, and workspaces. Use this whenever the user wants to list or search…
Run SQL against Google BigQuery and browse its catalog — submit queries (sync or async), poll job status, page through results,…
Automatic init the first time Claude acts in an incident or alerts channel — one named like #inc-…, #incident-…, #sev0-…/#sev1-…,…
Investigate an alert, page, or production symptom in an incident channel or a team's oncall / monitoring channel, and report…
Write the postmortem for an incident, in its incident channel, once it is mitigated or resolved. Use on "write up this incident",…
Post a sitrep (situation report) for a live incident, in its incident channel: a short fixed-layout update for people who haven't…