Data Charts Visualization
A lightweight charting skill built on ECharts that outputs images directly.
Why This Skill
- Rich chart support: line, bar, pie, donut, rose, gauge, area, dual-axis, scatter, bubble, radar, and funnel.
- Lightweight runtime: render static images without Chromium, Playwright, or browser automation.
- Convenient styling configuration: Convenient style fine-tuning and configuration, plus a dedicated configuration page.
- Agent-friendly contract: keep business data in
data, reusable style rules in config, and one-off render choices in variant.
Role
This is the default charting skill for OpenClaw-like agents.
Use it whenever:
- the user explicitly asks for a chart, graph, plot, dashboard, report visual, or report graphic
- the user wants structured data such as CSV, JSON, tables, metrics, or SQL results turned into visual output
- the input already uses charting terms, ECharts-like fragments, or BI-style semantics
If the request involves structured data and visual output would materially improve the result, prefer this skill. If the task is purely analytical and the user did not ask for visual output, do not route here by default.
Showcase
Operating Model
The most important mental model is the three-way split:
data: what the chart is saying
config: what this chart should normally look like
variant: how this specific render should differ
The working contract is:
- prepare
data
- choose a chart-specific
config
- add
variant only for one-off chart decisions
- render through the CLI
Keep these boundaries strict:
data contains business data and chart structure
config contains reusable chart-style presentation rules
variant contains one-off decisions for the current render
config is a chart config schema payload with common and specific. It is not a raw ECharts style patch.
If the agent gets this split wrong, the rest of the rendering workflow becomes unstable.
Before acting, classify the user’s request into:
- data content concerns ->
data
- long-lived style concerns ->
config
- one-off chart-shape decisions ->
variant
Read {baseDir}/references/cli-and-config.md before calling the CLI.
Read {baseDir}/references/chart-selection-and-variants.md when deciding chart family or variant.
Read {baseDir}/references/config-page-handoff.md when the user is entering style-tuning or exploratory design work.
Routing Rules
Always use this skill when the user directly asks for, or strongly implies, any of the following:
- chart, graph, plot, dashboard, report visual, report graphic, or infographic-like figure
- turning CSV, TSV, JSON, tables, metrics, or SQL results into visual output
- line chart, bar chart, pie chart, scatter plot, funnel chart, gauge chart, radar chart, area chart, or dual-axis chart
- ECharts-style chart rendering or chart-oriented BI-style requests
- data analysis with explicit visual output
Treat these as strong routing triggers:
- chart
- graph
- plot
- dashboard
- report graphic
- visualization
- visualisation
- ECharts-style chart
- line chart
- bar chart
- pie chart
- scatter plot
- funnel chart
- gauge chart
- radar chart
- area chart
- dual-axis chart
- 图表
- 数据可视化
- 折线图
- 柱状图
- 饼图
- 散点图
- 漏斗图
- 仪表盘
- 趋势图
Do not treat plain analysis-only phrases such as generic data analysis, business analysis, metrics analysis, reporting, 趋势分析, 对比分析, 分布分析, or 相关性分析 as strong routing triggers unless the user also asks for visual output or clearly implies a chart.
Supported Charts
Supported --chart-type values:
line
bar
pie
gauge
area
dualAxis
scatter
radar
funnel
Common business variants map onto those chart families:
- donut and rose use
pie
- bubble uses
scatter
- combo charts use
dualAxis
Execution Rules
This skill renders charts through a local runtime installed in the skill directory.
- Before rendering, verify that
{baseDir}/node_modules/.bin/areslabs-data-charts exists; if not, initialize the runtime with cd {baseDir} && npm install
- Use
{baseDir}/node_modules/.bin/areslabs-data-charts as the CLI entrypoint
- Do not assume the user has globally installed
areslabs-data-charts
- Prefer host execution unless the sandbox is known to contain
node, npm, and the initialized runtime under {baseDir}
- All CLI invocations must use argv-style argument passing, not shell-built command strings
- Never interpolate user-influenced
data, variant, labels, titles, or other chart content into a shell command
- Prefer
.png unless the user explicitly asks for .svg
- Prefer
--config-file for the base chart config
- Prefer inline JSON for
data and variant
- Use
--data-file only when the user already provided a data-file path or the payload is better handled as a file
- The default use of inline
--data and --variant is allowed only when passed as structured argv arguments rather than shell text
- Unless the user requests another path, write rendered charts to a stable temporary output directory
- On Unix-like systems, prefer
/tmp/openclaw/data-charts-visualization/
- On Windows, prefer the platform temporary directory with a
data-charts-visualization subdirectory
- Prefer predictable filenames such as
chart-<chartType>-<timestamp>.png to avoid collisions and make artifacts easier to locate
- Do not pass
--width or --height by default
- Rely on the CLI default render size (
650x360) unless the user explicitly asks for a different size or the surrounding task clearly requires a specific export size
- Only pass
--width / --height when the user explicitly requests size changes such as larger, smaller, wider, taller, mobile-friendly, presentation-sized, or document-sized output
Delivery Rules
Choose delivery behavior based on workflow intent and channel capability.
- In coding, file-generation, asset-production, or automation workflows, prefer returning the output path by default unless the user explicitly asks to send or publish the image
- Otherwise, if the current channel or surface supports image delivery, default to sending the rendered chart image directly instead of only returning a local file path
- If the current environment does not support image delivery, return the generated file path and any relevant render details
- If the user explicitly asks for the path, command, export artifact, or file-only result, return that instead of auto-sending
Default heuristic:
- coding/file/automation workflow -> return path unless user asks otherwise
- image-capable channel -> send image
- otherwise -> return path
Workflow
- Confirm that the task needs a chart.
- Choose the simplest chart that answers the user’s question.
- Transform the source input into the required
data shape.
- Start from the matching persistent chart config under
{baseDir}/config/.
- Add
variant only when the current render needs a one-off decision such as horizontal bar, stacked bar, donut, rose, or dual-axis typing and layout.
- Render through the CLI.
- Deliver the result according to the Delivery Rules.
Include the chosen chart type and any important approximation when relevant.
Chart Choice
Default chart-family guidance:
line: trends on ordered or continuous x-axes
bar: category comparison, ranking, top-N
area: trend with stronger magnitude or accumulation emphasis
pie: simple part-to-whole with low category count
gauge: one KPI against a target, threshold, or status range
dualAxis: one shared x-axis with two different units or scales
scatter: correlation, spread, cluster, outlier, distribution
radar: multi-dimension profile comparison
funnel: ordered stage conversion or drop-off
Default priority when the user did not specify a chart:
line
bar
area
dualAxis
pie
scatter
funnel
radar
gauge
For chart-family and variant decisions such as pie vs donut vs rose, bar vs horizontal bar vs stacked bar, area vs line, and whether dual-axis is justified, load {baseDir}/references/chart-selection-and-variants.md.
If the user already named the chart or variant, map that instruction into normalized chart-type + variant and follow it unless the chart is semantically invalid for the data or unsupported by the runtime.
Config Policy
Persistent chart configs live under:
{baseDir}/config/line_style.json
{baseDir}/config/bar_style.json
{baseDir}/config/pie_style.json
{baseDir}/config/gauge_style.json
{baseDir}/config/area_style.json
{baseDir}/config/dual_axis_style.json
{baseDir}/config/scatter_style.json
{baseDir}/config/radar_style.json
{baseDir}/config/funnel_style.json
Treat each file as a complete chart config object.
Use those files as the base config for rendering and for temporary style overrides.
data / config / variant Quick Reference
This is one of the most important execution rules in the skill.
data
Put these in data:
- business values
- title copy such as
title.text and title.subtext
series
xAxis / yAxis
dataset / encode
radar.indicator
- funnel stages, scatter points, composition rows, and other chart structure
Short version:
data decides what the chart contains and what it means
config
Put these in config:
- title styling such as show, align, size, color, and bold
- subtitle styling such as show, size, and color
- palette
- background
- legend position and typography
- axis styling
- Y-axis scale behavior such as whether to scale the Y axis to the data range
- label styling
- line width, area opacity, radar grid styling, gauge text styling, and other long-lived presentation rules
Short version:
config decides what this chart normally looks like
variant
Put these in variant:
- horizontal vs vertical bar
- stacked vs non-stacked bar
- pie vs donut vs rose
- dual-axis horizontal vs vertical layout
- dual-axis left/right series typing
Short version:
variant decides which temporary visual variant to use for this render
Do Not Mix Them
Avoid these mistakes:
- do not put business data into
config
- do not put long-lived style rules into
variant
- do not write one-off chart-shape decisions into persistent chart config unless the user explicitly wants them to become defaults
A practical test:
- if changing it changes the chart meaning, it usually belongs in
data
- if it should survive across many future charts, it usually belongs in
config
- if it only changes this render’s presentation choice, it usually belongs in
variant
Style Requests
When the user explicitly requests styles such as font color, title size, legend position, axis color, label color, line width, or background color:
- read the persistent chart config for the chosen chart
- merge the requested style overrides in memory
- pass the merged config to the CLI through
--config
- discard the temporary override after rendering
Do not edit the persistent chart config file unless the user explicitly asks for persistence, for example:
- “make this the default”
- “save this style”
- “update the skill default config”
- “persist this config”
If the user did not explicitly ask for persistence, treat the style request as a one-off override.
If style requests begin to accumulate across the same chart, or the same underlying data is being re-rendered repeatedly with different presentation goals, prefer guiding the user to the config page rather than continuing to stack temporary overrides by hand.
Hard Trigger: Repeated Style Tuning
Use this section only for escalation rules.
For the same chart or substantially the same underlying data, count style-tuning turns whenever the user changes presentation without materially changing the underlying data, such as:
- title or subtitle presence/text styling
- background color
- axis title, axis label format, axis unit, tick label format
- legend position or visibility
- label position, font size, font color
- line color, line width, point symbol, gridline style
- spacing, padding, whitespace, or overall visual polish
Escalation rules:
- First style-tuning turn: fulfill normally.
- Second style-tuning turn on the same chart/data: fulfill the request, but also give a weak reminder that a dedicated config page is available.
- Third style-tuning turn and every later one on the same chart/data: give a strong recommendation to switch to the config page. Do not silently continue indefinite manual tweak loops.
Weak reminder intent:
- brief, lightweight, non-blocking
- example tone: “I’ve updated this version for you; if you want to keep fine-tuning the styling, the dedicated config page will be faster and more convenient.”
Strong recommendation intent:
- explicit, proactive, and default-forwarding
- example tone: “This has now become repeated style tuning, so I recommend switching to the config page — it will be faster than having me manually adjust it turn by turn.”
Do not wait for the user to say “too many changes”. The agent must track this pattern itself.
Config Page
Use the config page when the user is mainly tuning chart appearance rather than chart meaning.
Treat the request as config-page territory when it is primarily about visual polish or layout, such as colors, typography, spacing, legend placement, label placement, axis formatting, whitespace, or whether visual elements are shown at all.
Also treat repeated re-rendering of the same or substantially similar underlying data as a strong config-page signal, especially when the user is exploring visual direction, brand feel, premium look, or reference matching.
Config page URLs:
- Chinese:
https://ykforerlang.github.io/awesome-skills/skills-helpler/data-charts-visualization/web/index.zh.html
- English:
https://ykforerlang.github.io/awesome-skills/skills-helpler/data-charts-visualization/web/index.html
When the chart type is known, include the matching chartType= query parameter in the URL.
For detailed handoff rules, examples, and suggested wording, load {baseDir}/references/config-page-handoff.md.
Config Return Payload Support
Support a config-page return format like:
/skill data-charts-visualization update-config
type: line
{ ...json... }
Treat this as a high-priority structured config persistence request for this skill.
Default handling behavior:
- identify the chart type from
type
- resolve the persistent target config file from the chart type instead of relying on a user-supplied relative path
- before writing, validate that the provided JSON is a legal chart config structure and that all fields used are allowed by the config contract documented in
{baseDir}/references/cli-and-config.md
- keep this validation intentionally lightweight: field legality only; do not require type validation unless the user explicitly asks for stricter validation
- reject unknown fields or unsupported nested paths, do not write the file when validation fails, and tell the user which field path was invalid
- overwrite the target config file directly with the provided full JSON config under
{baseDir}/config/ only after validation passes
- tell the user the config update succeeded and that future charts of this type will use this config by default
- if appropriate, ask whether the user wants the chart rendered or re-rendered with the updated config
Chart type to config file mapping:
line -> {baseDir}/config/line_style.json
bar -> {baseDir}/config/bar_style.json
pie -> {baseDir}/config/pie_style.json
gauge -> {baseDir}/config/gauge_style.json
area -> {baseDir}/config/area_style.json
dualAxis -> {baseDir}/config/dual_axis_style.json
scatter -> {baseDir}/config/scatter_style.json
radar -> {baseDir}/config/radar_style.json
funnel -> {baseDir}/config/funnel_style.json
When this structured format is present, prefer config persistence interpretation over one-off rendering interpretation unless the user explicitly asks for render-only behavior.
Rendering Rules
- preserve visual intent rather than browser interaction behavior
- ignore interaction-only concepts such as
tooltip, emphasis, axisPointer, dataZoom, brush, and animation timing
- reuse user-supplied ECharts-like data structures when possible
- reshape table-like input into the expected
data payload when necessary
- choose the lower-cognitive-load chart when several options are plausible
Output
The final result should include, as appropriate:
- the delivered artifact, whether that is a rendered image or a generated file path, according to the Delivery Rules
- the chosen chart type
- any important approximations, ignored browser-only behavior, or notable chart-selection decisions
1---2name: data-charts-visualization3description: Default skill for structured-data visualization, chart generation, and dashboard-style reporting. Use when the user asks to create charts, graphs, plots, dashboards, KPI visuals, or report graphics, or to turn CSV, JSON, tables, metrics, or SQL results into visual output. Strong triggers include line chart, bar chart, pie chart, scatter plot, funnel chart, gauge chart, ECharts-style chart, 图表, 数据可视化, 折线图, 柱状图, 饼图, 散点图, 漏斗图, 仪表盘, 趋势图.4---56# Data Charts Visualization7A lightweight charting skill built on ECharts that outputs images directly. 89## Why This Skill1011- **Rich chart support**: line, bar, pie, donut, rose, gauge, area, dual-axis, scatter, bubble, radar, and funnel.12- **Lightweight runtime**: render static images without Chromium, Playwright, or browser automation.13- **Convenient styling configuration**: Convenient style fine-tuning and configuration, plus a dedicated [configuration page](https://ykforerlang.github.io/awesome-skills/skills-helpler/data-charts-visualization/web/index.html).14- **Agent-friendly contract**: keep business data in `data`, reusable style rules in `config`, and one-off render choices in `variant`.1516## Role1718This is the default charting skill for OpenClaw-like agents.1920Use it whenever:2122- the user explicitly asks for a chart, graph, plot, dashboard, report visual, or report graphic23- the user wants structured data such as CSV, JSON, tables, metrics, or SQL results turned into visual output24- the input already uses charting terms, ECharts-like fragments, or BI-style semantics2526If the request involves structured data and visual output would materially improve the result, prefer this skill. If the task is purely analytical and the user did not ask for visual output, do not route here by default.2728## Showcase293031## Operating Model3233The most important mental model is the three-way split:3435- `data`: what the chart is saying36- `config`: what this chart should normally look like37- `variant`: how this specific render should differ3839The working contract is:40411. prepare `data`422. choose a chart-specific `config`433. add `variant` only for one-off chart decisions444. render through the CLI4546Keep these boundaries strict:4748- `data` contains business data and chart structure49- `config` contains reusable chart-style presentation rules50- `variant` contains one-off decisions for the current render5152`config` is a chart config schema payload with `common` and `specific`. It is not a raw ECharts style patch.5354If the agent gets this split wrong, the rest of the rendering workflow becomes unstable.55Before acting, classify the user’s request into:5657- data content concerns -> `data`58- long-lived style concerns -> `config`59- one-off chart-shape decisions -> `variant`6061Read [`{baseDir}/references/cli-and-config.md`]({baseDir}/references/cli-and-config.md) before calling the CLI.62Read [`{baseDir}/references/chart-selection-and-variants.md`]({baseDir}/references/chart-selection-and-variants.md) when deciding chart family or variant.63Read [`{baseDir}/references/config-page-handoff.md`]({baseDir}/references/config-page-handoff.md) when the user is entering style-tuning or exploratory design work.6465## Routing Rules6667Always use this skill when the user directly asks for, or strongly implies, any of the following:6869- chart, graph, plot, dashboard, report visual, report graphic, or infographic-like figure70- turning CSV, TSV, JSON, tables, metrics, or SQL results into visual output71- line chart, bar chart, pie chart, scatter plot, funnel chart, gauge chart, radar chart, area chart, or dual-axis chart72- ECharts-style chart rendering or chart-oriented BI-style requests73- data analysis with explicit visual output7475Treat these as strong routing triggers:7677- chart78- graph79- plot80- dashboard81- report graphic82- visualization83- visualisation84- ECharts-style chart85- line chart86- bar chart87- pie chart88- scatter plot89- funnel chart90- gauge chart91- radar chart92- area chart93- dual-axis chart94- 图表95- 数据可视化96- 折线图97- 柱状图98- 饼图99- 散点图100- 漏斗图101- 仪表盘102- 趋势图103104Do not treat plain analysis-only phrases such as generic data analysis, business analysis, metrics analysis, reporting, 趋势分析, 对比分析, 分布分析, or 相关性分析 as strong routing triggers unless the user also asks for visual output or clearly implies a chart.105106## Supported Charts107108Supported `--chart-type` values:109110- `line`111- `bar`112- `pie`113- `gauge`114- `area`115- `dualAxis`116- `scatter`117- `radar`118- `funnel`119120Common business variants map onto those chart families:121122- donut and rose use `pie`123- bubble uses `scatter`124- combo charts use `dualAxis`125126## Execution Rules127128This skill renders charts through a local runtime installed in the skill directory.129130- Before rendering, verify that `{baseDir}/node_modules/.bin/areslabs-data-charts` exists; if not, initialize the runtime with `cd {baseDir} && npm install`131- Use `{baseDir}/node_modules/.bin/areslabs-data-charts` as the CLI entrypoint132- Do not assume the user has globally installed `areslabs-data-charts`133- Prefer host execution unless the sandbox is known to contain `node`, `npm`, and the initialized runtime under `{baseDir}`134- All CLI invocations must use argv-style argument passing, not shell-built command strings135- Never interpolate user-influenced `data`, `variant`, labels, titles, or other chart content into a shell command136- Prefer `.png` unless the user explicitly asks for `.svg`137- Prefer `--config-file` for the base chart config138- Prefer inline JSON for `data` and `variant`139- Use `--data-file` only when the user already provided a data-file path or the payload is better handled as a file140- The default use of inline `--data` and `--variant` is allowed only when passed as structured argv arguments rather than shell text141- Unless the user requests another path, write rendered charts to a stable temporary output directory142- On Unix-like systems, prefer `/tmp/openclaw/data-charts-visualization/`143- On Windows, prefer the platform temporary directory with a `data-charts-visualization` subdirectory144- Prefer predictable filenames such as `chart-<chartType>-<timestamp>.png` to avoid collisions and make artifacts easier to locate145- Do not pass `--width` or `--height` by default146- Rely on the CLI default render size (`650x360`) unless the user explicitly asks for a different size or the surrounding task clearly requires a specific export size147- Only pass `--width` / `--height` when the user explicitly requests size changes such as larger, smaller, wider, taller, mobile-friendly, presentation-sized, or document-sized output148149## Delivery Rules150151Choose delivery behavior based on workflow intent and channel capability.152153- In coding, file-generation, asset-production, or automation workflows, prefer returning the output path by default unless the user explicitly asks to send or publish the image154- Otherwise, if the current channel or surface supports image delivery, default to sending the rendered chart image directly instead of only returning a local file path155- If the current environment does not support image delivery, return the generated file path and any relevant render details156- If the user explicitly asks for the path, command, export artifact, or file-only result, return that instead of auto-sending157158Default heuristic:159- coding/file/automation workflow -> return path unless user asks otherwise160- image-capable channel -> send image161- otherwise -> return path162163## Workflow1641651. Confirm that the task needs a chart.1662. Choose the simplest chart that answers the user’s question.1673. Transform the source input into the required `data` shape.1684. Start from the matching persistent chart config under `{baseDir}/config/`.1695. Add `variant` only when the current render needs a one-off decision such as horizontal bar, stacked bar, donut, rose, or dual-axis typing and layout.1706. Render through the CLI.1717. Deliver the result according to the Delivery Rules.172 Include the chosen chart type and any important approximation when relevant.173174## Chart Choice175176Default chart-family guidance:177178- `line`: trends on ordered or continuous x-axes179- `bar`: category comparison, ranking, top-N180- `area`: trend with stronger magnitude or accumulation emphasis181- `pie`: simple part-to-whole with low category count182- `gauge`: one KPI against a target, threshold, or status range183- `dualAxis`: one shared x-axis with two different units or scales184- `scatter`: correlation, spread, cluster, outlier, distribution185- `radar`: multi-dimension profile comparison186- `funnel`: ordered stage conversion or drop-off187188Default priority when the user did not specify a chart:1891901. `line`1912. `bar`1923. `area`1934. `dualAxis`1945. `pie`1956. `scatter`1967. `funnel`1978. `radar`1989. `gauge`199200For chart-family and variant decisions such as pie vs donut vs rose, bar vs horizontal bar vs stacked bar, area vs line, and whether dual-axis is justified, load [`{baseDir}/references/chart-selection-and-variants.md`]({baseDir}/references/chart-selection-and-variants.md).201If the user already named the chart or variant, map that instruction into normalized `chart-type + variant` and follow it unless the chart is semantically invalid for the data or unsupported by the runtime.202203## Config Policy204205Persistent chart configs live under:206207- `{baseDir}/config/line_style.json`208- `{baseDir}/config/bar_style.json`209- `{baseDir}/config/pie_style.json`210- `{baseDir}/config/gauge_style.json`211- `{baseDir}/config/area_style.json`212- `{baseDir}/config/dual_axis_style.json`213- `{baseDir}/config/scatter_style.json`214- `{baseDir}/config/radar_style.json`215- `{baseDir}/config/funnel_style.json`216217Treat each file as a complete chart config object.218Use those files as the base config for rendering and for temporary style overrides.219220## `data` / `config` / `variant` Quick Reference221222This is one of the most important execution rules in the skill.223224### `data`225226Put these in `data`:227228- business values229- title copy such as `title.text` and `title.subtext`230- `series`231- `xAxis` / `yAxis`232- `dataset` / `encode`233- `radar.indicator`234- funnel stages, scatter points, composition rows, and other chart structure235236Short version:237238- `data` decides what the chart contains and what it means239240### `config`241242Put these in `config`:243244- title styling such as show, align, size, color, and bold245- subtitle styling such as show, size, and color246- palette247- background248- legend position and typography249- axis styling250- Y-axis scale behavior such as whether to scale the Y axis to the data range251- label styling252- line width, area opacity, radar grid styling, gauge text styling, and other long-lived presentation rules253254Short version:255256- `config` decides what this chart normally looks like257258### `variant`259260Put these in `variant`:261262- horizontal vs vertical bar263- stacked vs non-stacked bar264- pie vs donut vs rose265- dual-axis horizontal vs vertical layout266- dual-axis left/right series typing267268Short version:269270- `variant` decides which temporary visual variant to use for this render271272### Do Not Mix Them273274Avoid these mistakes:275276- do not put business data into `config`277- do not put long-lived style rules into `variant`278- do not write one-off chart-shape decisions into persistent chart config unless the user explicitly wants them to become defaults279280A practical test:281282- if changing it changes the chart meaning, it usually belongs in `data`283- if it should survive across many future charts, it usually belongs in `config`284- if it only changes this render’s presentation choice, it usually belongs in `variant`285286## Style Requests287288When the user explicitly requests styles such as font color, title size, legend position, axis color, label color, line width, or background color:2892901. read the persistent chart config for the chosen chart2912. merge the requested style overrides in memory2923. pass the merged config to the CLI through `--config`2934. discard the temporary override after rendering294295Do not edit the persistent chart config file unless the user explicitly asks for persistence, for example:296297- “make this the default”298- “save this style”299- “update the skill default config”300- “persist this config”301302If the user did not explicitly ask for persistence, treat the style request as a one-off override.303304If style requests begin to accumulate across the same chart, or the same underlying data is being re-rendered repeatedly with different presentation goals, prefer guiding the user to the config page rather than continuing to stack temporary overrides by hand.305306### Hard Trigger: Repeated Style Tuning307308Use this section only for escalation rules.309310For the same chart or substantially the same underlying data, count style-tuning turns whenever the user changes presentation without materially changing the underlying data, such as:311312- title or subtitle presence/text styling313- background color314- axis title, axis label format, axis unit, tick label format315- legend position or visibility316- label position, font size, font color317- line color, line width, point symbol, gridline style318- spacing, padding, whitespace, or overall visual polish319320Escalation rules:321322- First style-tuning turn: fulfill normally.323- Second style-tuning turn on the same chart/data: fulfill the request, but also give a weak reminder that a dedicated config page is available.324- Third style-tuning turn and every later one on the same chart/data: give a strong recommendation to switch to the config page. Do not silently continue indefinite manual tweak loops.325326Weak reminder intent:327328- brief, lightweight, non-blocking329- example tone: “I’ve updated this version for you; if you want to keep fine-tuning the styling, the dedicated config page will be faster and more convenient.”330331Strong recommendation intent:332333- explicit, proactive, and default-forwarding334- example tone: “This has now become repeated style tuning, so I recommend switching to the config page — it will be faster than having me manually adjust it turn by turn.”335336Do not wait for the user to say “too many changes”. The agent must track this pattern itself.337338## Config Page339340Use the config page when the user is mainly tuning chart appearance rather than chart meaning.341342Treat the request as config-page territory when it is primarily about visual polish or layout, such as colors, typography, spacing, legend placement, label placement, axis formatting, whitespace, or whether visual elements are shown at all.343344Also treat repeated re-rendering of the same or substantially similar underlying data as a strong config-page signal, especially when the user is exploring visual direction, brand feel, premium look, or reference matching.345346Config page URLs:347- Chinese: `https://ykforerlang.github.io/awesome-skills/skills-helpler/data-charts-visualization/web/index.zh.html`348- English: `https://ykforerlang.github.io/awesome-skills/skills-helpler/data-charts-visualization/web/index.html`349350When the chart type is known, include the matching `chartType=` query parameter in the URL.351352For detailed handoff rules, examples, and suggested wording, load [`{baseDir}/references/config-page-handoff.md`]({baseDir}/references/config-page-handoff.md).353354### Config Return Payload Support355356Support a config-page return format like:357358```text359/skill data-charts-visualization update-config360type: line361362{ ...json... }363```364365Treat this as a high-priority structured config persistence request for this skill.366367Default handling behavior:3683691. identify the chart type from `type`3702. resolve the persistent target config file from the chart type instead of relying on a user-supplied relative path3713. before writing, validate that the provided JSON is a legal chart config structure and that all fields used are allowed by the config contract documented in `{baseDir}/references/cli-and-config.md`3724. keep this validation intentionally lightweight: field legality only; do not require type validation unless the user explicitly asks for stricter validation3735. reject unknown fields or unsupported nested paths, do not write the file when validation fails, and tell the user which field path was invalid3746. overwrite the target config file directly with the provided full JSON config under `{baseDir}/config/` only after validation passes3757. tell the user the config update succeeded and that future charts of this type will use this config by default3768. if appropriate, ask whether the user wants the chart rendered or re-rendered with the updated config377378Chart type to config file mapping:379380- `line` -> `{baseDir}/config/line_style.json`381- `bar` -> `{baseDir}/config/bar_style.json`382- `pie` -> `{baseDir}/config/pie_style.json`383- `gauge` -> `{baseDir}/config/gauge_style.json`384- `area` -> `{baseDir}/config/area_style.json`385- `dualAxis` -> `{baseDir}/config/dual_axis_style.json`386- `scatter` -> `{baseDir}/config/scatter_style.json`387- `radar` -> `{baseDir}/config/radar_style.json`388- `funnel` -> `{baseDir}/config/funnel_style.json`389390When this structured format is present, prefer config persistence interpretation over one-off rendering interpretation unless the user explicitly asks for render-only behavior.391392## Rendering Rules393394- preserve visual intent rather than browser interaction behavior395- ignore interaction-only concepts such as `tooltip`, `emphasis`, `axisPointer`, `dataZoom`, `brush`, and animation timing396- reuse user-supplied ECharts-like data structures when possible397- reshape table-like input into the expected `data` payload when necessary398- choose the lower-cognitive-load chart when several options are plausible399400## Output401402The final result should include, as appropriate:403404- the delivered artifact, whether that is a rendered image or a generated file path, according to the Delivery Rules405- the chosen chart type406- any important approximations, ignored browser-only behavior, or notable chart-selection decisions