Agent Skills
› code-yeongyu/oh-my-openagent
› visualize
visualize
GitHub用于生成内联自包含HTML页面(图表、表格等),通过加载数据科学家和前端技能处理数据与设计,确保无网络依赖且适配主题。
Trigger Scenarios
需要可视化展示数据时
回答内容适合用页面而非纯文本呈现时
Install
npx skills add code-yeongyu/oh-my-openagent --skill visualize -g -y
SKILL.md
Frontmatter
{
"name": "visualize",
"description": "Builds a self-contained HTML page (chart, table, diagram, dashboard) to show inline in a thread. Use before calling show_html_page, html_preview or html_render, or whenever an answer reads better as a page than as prose."
}
Visualize
A page shown inline sits beside a reply, in the reader's theme, and is read in a few seconds. It earns its place only by being clearer than the paragraph it replaces. This skill owns what is particular to such a page. The data work belongs to data-scientist and the design work to frontend: load those skills for their parts instead of improvising them here.
The loop
Do these in order. Never show a page you have not looked at.
- Data: load
data-scientist. Compute every figure with its engines (DuckDB or Polars), at the grain the reader needs, and follow itsreferences/visualization.mdfor which chart answers which question. Keep the query: every number on the page must trace back to it. - Design: load
frontend. Use it for hierarchy, type, spacing and states. This page's constraints replace its design-system gate: the page brings no palette or fonts of its own and uses the theme the host injects (below). - Build one self-contained page under the constraints below.
- Preview and look. Render with
html_previewin dark and in light, at the reply's width and at 390 px. Read the screenshot and the console, fix what you see, and preview again. Wherehtml_previewis not offered, open the page file in a browser through thebrowserskill and capture the same four views. - Show it with
show_html_page(OmO) orhtml_render(other hosts), with the height the preview measured. Then write only what the page does not already say.
Constraints of an inline page
- No network. Inline every script, style, font and image (
data:URIs); the sandbox blocks every request, so a CDN library leaves a blank chart. Draw with hand-written SVG when a library cannot be inlined. - Theme from the host. Color only through the injected custom properties:
--background,--foreground,--muted,--muted-foreground,--card,--border,--primary,--accent,--destructive,--warning,--success, the series colors--chart-1to--chart-6, and--font-sans,--font-mono,--radius. They hold in both themes and change live; a literal color does neither. A page opened outside the app gets only a few of them, so give each a fallback for both themes:var(--chart-2, light-dark(#0d9488, #2dd4bf)). - Part of the reply, not a card. Fluid width, no outer padding, border or banner. Give charts fixed pixel heights, not heights that scale with the width. A fluid SVG stretched with
preserveAspectRatio="none"stretches its text too, so put axis labels in HTML beside it, positioned by percentage. - Readable without scripts. On the web a page first renders with scripts off, until the reader presses Run page. Put the figure itself in markup or SVG, and use scripts only for interaction.
- Traceable. Show how the numbers were computed in a small, muted "How this was computed" block (the query or aggregation), and state caveats near the figure when they change how a number reads: dropped rows, a partial window, a small sample.
- Designed empty and error states. No data, or a failed query, is stated in the same visual language, never as a blank frame.
- Links. A link opens only after the reader confirms it in the app, which shows its full address. Keep data out of link addresses.
Before you show it
- The title states the finding, not the dataset name.
- Axis labels carry units, numbers use tabular figures and a sensible precision, and nothing clips at 390 px.
- The series colors separate in both themes, and the console is clean.
Version History
- 2785f13 Current 2026-10-19 21:26


