curl -L -o data-viz-recipes.skill "https://aiskillstore.io/v1/agent/skills/e503b15a-0d8f-439b-b515-3b3e86431392/download?platform=ClaudeCode"
{
"tool": "download_skill",
"arguments": {
"skill_id": "e503b15a-0d8f-439b-b515-3b3e86431392",
"platform": "ClaudeCode"
}
}
{
"mcpServers": {
"skill-store": {
"url": "https://aiskillstore.io/mcp/"
}
}
}
Data visualization code generator: auto-detects data shape, recommends chart type, generates matplotlib/plotly/D3 code, applies colorblind-safe Okabe-Ito palette. Zero external deps. Actions: recommend, generate_code, palette, audit, examples.
호환 플랫폼: any
검사 결과: ["메타데이터 경고: 권장 필드 없음: 'category' (SKILL.md v2 권장)", "메타데이터 경고: 권장 필드 없음: 'requirements' (SKILL.md v2 권장)", "메타데이터 경고: 권장 필드 없음: 'changelog' (SKILL.md v2 권장)"]
✅ 보안 위험 항목이 발견되지 않았습니다.
AI 검수 단계
스킬 메타데이터와 코드 파일을 분석한 결과, 다음과 같은 판단 근거를 도출했습니다. 1. **권한 일치 여부:** 스킬 메타데이터에 `network: false`, `filesystem: false`, `subprocess: false`로 선언되어 있습니다. 코드(`main.py`, `lib/detector.py`, `lib/codegen.py`)를 검토한 결과, 외부 네트워크 통신, 파일 시스템 접근(내부 경로 처리 외), 외부 프로세스 실행을 시도하는 코드는 발견되지 않았습니다. `os` 모듈은 `sys.path` 설정 및 `os.path.dirname`, `os.path.abspath`와 같은 경로 조작에만 사용되며, 이는 선언된 `filesystem: false` 권한과 일치합니다. 2. **악의적 목적 코드:** 데이터 탈취, 시스템 파괴, 난독화 등의 악의적인 목적을 가진 코드는 발견되지 않았습니다. 정적 분석 결과에서도 `red_flags_found` 및 `obfuscation_warnings`가 없음을 확인했습니다. 3. **선언되지 않은 외부 통신:** 코드 내에서 `requests`, `urllib`, `socket` 등 외부 통신을 위한 라이브러리 사용이나 직접적인 네트워크 연결 시도는 발견되지 않았습니다. 4. **사용자 데이터 무단 수집/전송:** 스킬은 `stdin`을 통해 입력받은 `data_sample`을 처리하고, 결과를 `stdout`으로 반환하는 `stdin_stdout` 패턴을 따릅니다. 사용자 데이터를 외부로 저장하거나 전송하는 어떠한 시도도 발견되지 않았습니다. 5. **코드 품질 및 목적 일치:** 스킬은 데이터 시각화 코드 생성이라는 명확한 목적을 가지고 있으며, `lib/detector.py`에서 데이터 형태를 감지하고 `lib/codegen.py`에서 Matplotlib, Plotly, D3.js 코드를 생성하는 등 기능이 모듈화되어 있습니다. 특히, 사용자 입력 문자열(`title`, `x_col`, `y_col`)을 생성되는 코드에 삽입할 때 `repr()` 함수를 사용하여 안전하게 이스케이프 처리하는 방식을 채택하여 코드 인젝션 위험을 방지하고 있습니다. 이는 좋은 보안 관행이며, 스킬의 목적에 부합하는 안전한 코드 품질을 보여줍니다. 종합적으로, 이 스킬은 선언된 권한을 충실히 준수하며, 악의적인 동작이나 보안 취약점을 포함하고 있지 않은 것으로 판단됩니다.
이 스킬의 대표적인 입출력 예시입니다. 에이전트는 이 예시를 보고 스킬 호출 방법과 결과 형태를 이해할 수 있습니다.
날짜+수치 컬럼에서 최적 차트 자동 추천 / Auto-recommend chart for time series data
{
"action": "recommend",
"data_sample": {
"columns": [
"date",
"revenue"
],
"rows": [
[
"2024-01",
12000
],
[
"2024-02",
15000
],
[
"2024-03",
13500
],
[
"2024-04",
18000
],
[
"2024-05",
21000
]
]
}
}
{
"action": "recommend",
"ok": true,
"recommendation": {
"alternatives": [
{
"chart_type": "area",
"reason": "Area chart emphasizes cumulative volume.",
"score": 0.75
},
{
"chart_type": "bar",
"reason": "Bar chart works for discrete time intervals.",
"score": 0.6
}
],
"data_shape": "timeseries",
"detected_columns": {
"x": "date",
"y": "revenue"
},
"primary": {
"chart_type": "line",
"reason": "Time series data detected (date column). Line chart best shows trends over time.",
"score": 0.95
}
}
}
카테고리+값 데이터로 matplotlib 막대 그래프 코드 생성 / Generate matplotlib bar chart for categorical data
{
"action": "generate_code",
"backend": "matplotlib",
"chart_type": "bar",
"colorblind_safe": true,
"data_sample": {
"columns": [
"month",
"sales"
],
"rows": [
[
"Jan",
8500
],
[
"Feb",
9200
],
[
"Mar",
11000
]
]
},
"language": "ko",
"title": "\uc6d4\ubcc4 \ub9e4\ucd9c"
}
{
"action": "generate_code",
"code": {
"chart_type": "bar",
"matplotlib": "import matplotlib.pyplot as plt\nimport matplotlib\nmatplotlib.rcParams[\u0027axes.prop_cycle\u0027] = matplotlib.cycler(color=[\u0027#E69F00\u0027,\u0027#56B4E9\u0027,\u0027#009E73\u0027,\u0027#F0E442\u0027,\u0027#0072B2\u0027,\u0027#D55E00\u0027,\u0027#CC79A7\u0027,\u0027#000000\u0027])\nmonths = [\u0027Jan\u0027, \u0027Feb\u0027, \u0027Mar\u0027]\nsales = [8500, 9200, 11000]\nfig, ax = plt.subplots(figsize=(8, 5))\nax.bar(months, sales, color=\u0027#E69F00\u0027)\nax.set_title(\u0027\uc6d4\ubcc4 \ub9e4\ucd9c\u0027)\nax.set_xlabel(\u0027month\u0027)\nax.set_ylabel(\u0027sales\u0027)\nplt.tight_layout()\nplt.show()\n",
"notes": [
"Okabe-Ito \uc0c9\ub9f9 \uce5c\ud654 \ud314\ub808\ud2b8 \uc801\uc6a9\ub428"
]
},
"ok": true
}
수치 단일 컬럼 분포 시각화 추천 / Recommend chart for numerical distribution
{
"action": "recommend",
"data_sample": {
"columns": [
"score"
],
"rows": [
[
72
],
[
85
],
[
91
],
[
68
],
[
77
],
[
88
],
[
95
],
[
63
]
]
}
}
{
"action": "recommend",
"ok": true,
"recommendation": {
"alternatives": [
{
"chart_type": "box",
"reason": "Box plot shows quartiles and outliers.",
"score": 0.8
},
{
"chart_type": "violin",
"reason": "Violin plot shows full distribution shape.",
"score": 0.7
}
],
"data_shape": "distribution",
"detected_columns": {
"y": "score"
},
"primary": {
"chart_type": "histogram",
"reason": "Single numerical column detected. Histogram best shows value distribution.",
"score": 0.92
}
}
}
색맹 친화 팔레트 8색 반환 / Return full 8-color Okabe-Ito colorblind-safe palette
{
"action": "palette",
"palette_size": 8
}
{
"action": "palette",
"ok": true,
"palette": {
"colors": [
{
"hex": "#E69F00",
"index": 0,
"name": "Orange",
"rgb": [
230,
159,
0
],
"wcag_use": "fill/background only"
},
{
"hex": "#56B4E9",
"index": 1,
"name": "Sky Blue",
"rgb": [
86,
180,
233
],
"wcag_use": "fill/background only"
}
],
"name": "Okabe-Ito"
}
}
데이터 샘플의 시각화 적합성 사전 점검 / Audit data sample suitability for visualization
{
"action": "audit",
"data_sample": {
"columns": [
"product",
"units",
"revenue"
],
"rows": [
[
"A",
100,
5000
],
[
"B",
200,
9500
],
[
"C",
150,
7200
]
]
}
}
{
"action": "audit",
"audit": {
"column_count": 3,
"data_shape": "categorical",
"detected_types": {
"product": "categorical",
"revenue": "numerical",
"units": "numerical"
},
"issues": [],
"recommendations": [
"Bar or horizontal bar chart recommended for multi-series categorical data.",
"Consider using colorblind-safe palette for accessibility."
],
"row_count": 3,
"visualizable": true
},
"ok": true
}
수치 2컬럼 산점도 plotly 코드 생성 / Generate plotly scatter chart for two numerical columns
{
"action": "generate_code",
"backend": "plotly",
"chart_type": "scatter",
"colorblind_safe": true,
"data_sample": {
"columns": [
"height_cm",
"weight_kg"
],
"rows": [
[
165,
62
],
[
172,
70
],
[
158,
55
],
[
180,
82
]
]
},
"language": "en",
"title": "Height vs Weight"
}
{
"action": "generate_code",
"code": {
"chart_type": "scatter",
"notes": [
"Okabe-Ito orange used for colorblind-safe scatter points."
],
"plotly": "import plotly.graph_objects as go\nx = [165, 172, 158, 180]\ny = [62, 70, 55, 82]\nfig = go.Figure(go.Scatter(x=x, y=y, mode=\u0027markers\u0027,\n marker=dict(color=\u0027#E69F00\u0027, size=8)))\nfig.update_layout(title=\u0027Height vs Weight\u0027,\n xaxis_title=\u0027height_cm\u0027, yaxis_title=\u0027weight_kg\u0027)\nfig.show()\n"
},
"ok": true
}
지원되는 차트 유형별 예시 레시피 목록 반환 / List built-in example recipes for all chart types
{
"action": "examples"
}
{
"action": "examples",
"examples": [
{
"chart_type": "line",
"data_shape": "timeseries",
"description": "Trend over time \u2014 date + numeric value"
},
{
"chart_type": "bar",
"data_shape": "categorical",
"description": "Category comparison \u2014 label + numeric value"
},
{
"chart_type": "scatter",
"data_shape": "correlation",
"description": "Two numeric columns \u2014 correlation or relationship"
},
{
"chart_type": "histogram",
"data_shape": "distribution",
"description": "Single numeric column \u2014 frequency distribution"
},
{
"chart_type": "pie",
"data_shape": "part_to_whole",
"description": "Few categories \u2014 part-to-whole proportions (max 7 slices)"
}
],
"ok": true
}
모든 예시는 에이전트 API로도 조회 가능:
/v1/agent/skills/e503b15a-0d8f-439b-b515-3b3e86431392/schema
아직 리뷰가 없습니다. 첫 번째 리뷰를 남겨보세요!