Skip to content

Commit 854f6a5

Browse files
Copilotlixun910Ihor Dykhta
authored
feat: Add SKILL.md for keplergl python package (#3429)
* Add SKILL.md and map type reference files for keplergl-jupyter Agent-Logs-Url: https://github.com/keplergl/kepler.gl/sessions/b75ca334-0504-44a7-8f53-3418eebc3f65 Co-authored-by: lixun910 <2423887+lixun910@users.noreply.github.com> * Add AI coding assistant guide section to bindings/python README.md Agent-Logs-Url: https://github.com/keplergl/kepler.gl/sessions/d4f6dcf5-876f-43cc-9faf-1c9cd60bd9fd Co-authored-by: lixun910 <2423887+lixun910@users.noreply.github.com> * Rename SKILL.md to CLAUDE.md following Claude Code standard protocol and update README Agent-Logs-Url: https://github.com/keplergl/kepler.gl/sessions/098df374-1773-49d4-8a4c-e13a34df7c47 Co-authored-by: lixun910 <2423887+lixun910@users.noreply.github.com> * Plan: rewrite SKILL.md with YAML frontmatter per official Claude Code skills protocol Agent-Logs-Url: https://github.com/keplergl/kepler.gl/sessions/098df374-1773-49d4-8a4c-e13a34df7c47 Co-authored-by: lixun910 <2423887+lixun910@users.noreply.github.com> * Rewrite SKILL.md with YAML frontmatter per Claude Code skills protocol and update README Agent-Logs-Url: https://github.com/keplergl/kepler.gl/sessions/098df374-1773-49d4-8a4c-e13a34df7c47 Co-authored-by: lixun910 <2423887+lixun910@users.noreply.github.com> * Make skill-references always installed alongside SKILL.md, remove optional step Agent-Logs-Url: https://github.com/keplergl/kepler.gl/sessions/b1583189-44ad-47cf-947d-453f2fcfd433 Co-authored-by: lixun910 <2423887+lixun910@users.noreply.github.com> * Document default quantile+vibrant color guidance and custom-break workflow in SKILL Agent-Logs-Url: https://github.com/keplergl/kepler.gl/sessions/55d2a3b1-1d4e-4eaa-af09-c8f5f26ad2b9 Co-authored-by: lixun910 <2423887+lixun910@users.noreply.github.com> * Address PR review thread feedback for Python skill docs Agent-Logs-Url: https://github.com/keplergl/kepler.gl/sessions/d4300622-677a-4b98-81ca-4cd43ad5e5c5 Co-authored-by: lixun910 <2423887+lixun910@users.noreply.github.com> * docs(python): add Codex skill setup and packaging guidance Agent-Logs-Url: https://github.com/keplergl/kepler.gl/sessions/dca4bbac-713d-451b-9f10-0a76a069c50c Co-authored-by: lixun910 <2423887+lixun910@users.noreply.github.com> * docs(python): document Codex skill setup and distribution in README Agent-Logs-Url: https://github.com/keplergl/kepler.gl/sessions/dca4bbac-713d-451b-9f10-0a76a069c50c Co-authored-by: lixun910 <2423887+lixun910@users.noreply.github.com> * fix: add name to SKILL.md frontmatter, complete add_data/save_to_html API docs Agent-Logs-Url: https://github.com/keplergl/kepler.gl/sessions/3e282275-ba68-458f-a020-3816c8f0b74b Co-authored-by: lixun910 <2423887+lixun910@users.noreply.github.com> * docs(python): update SKILL.md with kepler.gl-jupyter requirements and visualChannels guidance - Added requirement for `kepler.gl-jupyter >= 0.4.0` to ensure compatibility with examples. - Clarified that `colorField`, `colorScale`, `sizeField`, and `heightField` should be placed under `visualChannels` instead of `config` to avoid silent errors. - Included a new example for creating a GeoJSON choropleth map using visual channels. * Add keplergl-map skill files for Python integration - Introduced `cursor-plugin.json` and `plugin.json` to define the keplergl-map skill for interactive map visualizations. - Updated `README.md` to include references to the new summary panel feature. - Added SVG icons for the skill in both small and large sizes. - Created `summary-panel.md` to document the overlay feature for exported HTML maps. - Added `openai.yaml` for agent configuration related to the keplergl-map skill. * Update README.md and SKILL.md for keplergl-map skill - Expanded the setup instructions in README.md to include Codex alongside Claude Code. - Modified the `.save_to_html` method in SKILL.md to set `read_only` to false by default, enhancing usability. * Remove deprecated keplergl-map skill files and assets - Deleted `cursor-plugin.json`, `plugin.json`, and `SKILL.md` as they are no longer needed. - Removed associated SVG icons and YAML configuration for the OpenAI agent. - Cleaned up the README.md by removing references to the now-removed files and features. * Update publish workflow and plugin version - Added a step to build and zip the source package for the kepler.gl skill in the GitHub Actions workflow. - Updated the version in `plugin.json` from 1.0.0 to 0.0.1 to reflect a new release. * Update README.md to include direct download links for kepler.gl skill - Added specific download links for the kepler.gl skill for Claude, Codex, and source versions. - Clarified installation instructions for better user guidance. * follow up Signed-off-by: Ihor Dykhta <ihordykhta@Ihors-MacBook-Pro.local> --------- Signed-off-by: Ihor Dykhta <ihordykhta@Ihors-MacBook-Pro.local> Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: lixun910 <2423887+lixun910@users.noreply.github.com> Co-authored-by: Xun Li <lixun910@gmail.com> Co-authored-by: Ihor Dykhta <ihordykhta@Ihors-MacBook-Pro.local>
1 parent f00fd20 commit 854f6a5

16 files changed

Lines changed: 1323 additions & 0 deletions
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
name: Publish kepler.gl Skill
2+
3+
on:
4+
push:
5+
paths:
6+
- 'skill/SKILL.md'
7+
- 'skill/skill-references/**'
8+
- 'skill/agents/**'
9+
- 'skill/plugin.json'
10+
tags:
11+
- 'skill-v*'
12+
workflow_dispatch:
13+
14+
jobs:
15+
build-skills:
16+
runs-on: ubuntu-latest
17+
permissions:
18+
contents: write
19+
20+
steps:
21+
- uses: actions/checkout@v4
22+
23+
- name: Read skill version
24+
id: version
25+
run: |
26+
VERSION=$(python3 -c "import json; print(json.load(open('skill/plugin.json'))['version'])")
27+
echo "version=$VERSION" >> "$GITHUB_OUTPUT"
28+
29+
- name: Build Claude skill package
30+
run: |
31+
STAGING=$(mktemp -d)
32+
SKILL_DIR="$STAGING/kepler.gl"
33+
mkdir -p "$SKILL_DIR"
34+
35+
cp skill/SKILL.md "$SKILL_DIR/SKILL.md"
36+
cp -r skill/skill-references "$SKILL_DIR/skill-references"
37+
38+
(cd "$STAGING" && zip -r "$OLDPWD/kepler.gl-claude.zip" kepler.gl)
39+
rm -rf "$STAGING"
40+
41+
- name: Build Codex skill package
42+
run: |
43+
STAGING=$(mktemp -d)
44+
SKILL_DIR="$STAGING/kepler.gl"
45+
mkdir -p "$SKILL_DIR"
46+
47+
cp skill/SKILL.md "$SKILL_DIR/SKILL.md"
48+
cp -r skill/skill-references "$SKILL_DIR/skill-references"
49+
cp -r skill/agents "$SKILL_DIR/agents"
50+
51+
(cd "$STAGING" && zip -r "$OLDPWD/kepler.gl-codex.zip" kepler.gl)
52+
rm -rf "$STAGING"
53+
54+
- name: Upload Claude skill artifact
55+
uses: actions/upload-artifact@v4
56+
with:
57+
name: kepler.gl-claude-v${{ steps.version.outputs.version }}
58+
path: kepler.gl-claude.zip
59+
60+
- name: Upload Codex skill artifact
61+
uses: actions/upload-artifact@v4
62+
with:
63+
name: kepler.gl-codex-v${{ steps.version.outputs.version }}
64+
path: kepler.gl-codex.zip
65+
66+
- name: Build source package
67+
run: |
68+
zip -r kepler.gl-skill-source.zip skill/
69+
70+
- name: Attach packages to release
71+
if: startsWith(github.ref, 'refs/tags/skill-v')
72+
uses: softprops/action-gh-release@v2
73+
with:
74+
files: |
75+
kepler.gl-claude.zip
76+
kepler.gl-codex.zip
77+
kepler.gl-skill-source.zip

skill/README.md

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
# kepler.gl Skill for AI Coding Assistants
2+
3+
This directory contains the **kepler.gl** agent skill — a set of instructions and references that help AI coding assistants (Claude Code, Codex, Cursor, etc.) generate `keplergl` map scripts and exports consistently.
4+
5+
## Skill References
6+
7+
| Reference | Description |
8+
|-----------|-------------|
9+
| [point-map.md](skill-references/point-map.md) | Scatter plot from lat/lng |
10+
| [geojson-polygon-map.md](skill-references/geojson-polygon-map.md) | Polygons & lines from GeoJSON / GeoDataFrame |
11+
| [h3-hexagon-map.md](skill-references/h3-hexagon-map.md) | H3 spatial index hexagons |
12+
| [arc-line-map.md](skill-references/arc-line-map.md) | Origin–destination arcs & lines |
13+
| [heatmap.md](skill-references/heatmap.md) | Density heatmap from points |
14+
| [hexbin-aggregation-map.md](skill-references/hexbin-aggregation-map.md) | Spatial binning into hexagons |
15+
| [trip-animation-map.md](skill-references/trip-animation-map.md) | Animated trips along paths |
16+
| [summary-panel.md](skill-references/summary-panel.md) | SampleMapPanel-style info overlay in exported HTML |
17+
18+
## Quick Setup via AI Agent
19+
20+
The easiest way to get started is to prompt your AI agent:
21+
22+
> Help me install the kepler.gl skill from
23+
24+
- claude: https://github.com/keplergl/kepler.gl/releases/download/skill-v0.0.1/kepler.gl-claude.zip
25+
- codex: https://github.com/keplergl/kepler.gl/releases/download/skill-v0.0.1/kepler.gl-codex.zip
26+
- source: https://github.com/keplergl/kepler.gl/releases/download/skill-v0.0.1/kepler.gl-skill-source.zip
27+
28+
or just "kepler.gl github repo"
29+
30+
The agent will locate the skill file and set it up for you automatically.
31+
32+
## Example Prompt
33+
34+
> Create a map showing distribution of HR60 from natregimes.geojson.
35+
> Color the polygons by population, use a light theme.
36+
37+
The agent will generate a Python script and run it, producing a standalone HTML map file you can open in any browser.
38+
39+
## Versioning
40+
41+
The skill version is tracked in [`plugin.json`](plugin.json). Releases use the tag pattern `skill-v*` (e.g. `skill-v1.0.0`).
42+
43+
> **Note:** The download links above will return 404 until the first skill release is published. To publish, push a `skill-v*` tag (e.g. `git tag skill-v0.0.1 && git push origin skill-v0.0.1`) which triggers the `.github/workflows/publish-skill.yml` workflow to build and attach the zip packages to the GitHub release.

skill/SKILL.md

Lines changed: 210 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,210 @@
1+
---
2+
name: kepler.gl
3+
description: Create interactive map visualizations and export to standalone HTML using the keplergl Python package. Use when the user wants to create maps, visualize geospatial data, plot locations on a map, or generate HTML map files from DataFrames, GeoDataFrames, GeoJSON, or CSV data with coordinates.
4+
---
5+
6+
# Create Maps with keplergl
7+
8+
Use the `keplergl` Python package to create standalone, interactive HTML map files from geospatial data. The exported HTML loads kepler.gl from CDN — no JavaScript build or server is needed. The resulting `.html` file can be opened directly in any browser.
9+
10+
## Installation
11+
12+
```bash
13+
pip install keplergl
14+
```
15+
16+
Requires `keplergl >= 0.4.0`. Earlier versions use a different widget/serialization API and the examples in this skill will not work. Requirements: Python >= 3.9. Dependencies (`pandas`, `geopandas`, `shapely`) are installed automatically.
17+
18+
## Instructions
19+
20+
1. Import `KeplerGl` from `keplergl`
21+
2. Load data as a DataFrame, GeoDataFrame, GeoJSON dict, or CSV string
22+
3. Create a map with `KeplerGl(data={'name': data_object})`
23+
4. Optionally configure layers, colors, and map state via a `config` dict (default to quantile color scale and a vibrant palette for quantitative color encoding when the user does not specify)
24+
5. Export with `map.save_to_html(file_name='output.html', center_map=True)`
25+
6. The output HTML is fully standalone — open it in any browser
26+
27+
## API Reference
28+
29+
### `KeplerGl(data=None, config=None, height=400, mapbox_token="", use_arrow=False, show_docs=False, theme="", app_name="kepler.gl", **kwargs)`
30+
31+
| Parameter | Type | Default | Description |
32+
|-----------|------|---------|-------------|
33+
| `height` | int | 400 | Map height in pixels |
34+
| `data` | dict | None | `{"dataset_name": data_object}` |
35+
| `config` | dict | None | Map configuration (layers, filters, map state) |
36+
| `mapbox_token` | str | "" | Mapbox token (only for Mapbox basemap styles) |
37+
| `use_arrow` | bool | False | Serialize DataFrames as Arrow IPC (more compact, preserves types) |
38+
| `show_docs` | bool | False | Deprecated (kept for compatibility) |
39+
| `theme` | str | "" | `"light"`, `"dark"`, `"base"`, or `""` (default dark) |
40+
| `app_name` | str | "kepler.gl" | App name in header and HTML title |
41+
42+
### `.add_data(data, name="data", use_arrow=None)`
43+
44+
- `data`: DataFrame, GeoDataFrame, CSV string, GeoJSON dict, or GeoJSON string
45+
- `name`: Dataset identifier (default: `"data"`) — must match `dataId` in config if using a config
46+
- `use_arrow`: If `True`, serialize this DataFrame as Arrow IPC. If `None` (default), falls back to the widget-level `use_arrow` setting. Has no effect on GeoDataFrames.
47+
48+
### `.save_to_html(file_name="keplergl_map.html", data=None, config=None, read_only=False, center_map=True, mapbox_token="", json_encoder=str, app_name=None, theme=None)`
49+
50+
| Parameter | Type | Default | Description |
51+
|-----------|------|---------|-------------|
52+
| `file_name` | str | `"keplergl_map.html"` | Output file path |
53+
| `data` | dict | None | Data override for export (uses current widget data when None) |
54+
| `config` | dict | None | Config override for export (uses current widget config when None) |
55+
| `read_only` | bool | False | True = hide side panel |
56+
| `center_map` | bool | True | True = auto-fit map to data bounds |
57+
| `mapbox_token` | str | "" | Mapbox token override for export |
58+
| `json_encoder` | callable | str | Fallback encoder for non-JSON-native values in GeoDataFrames |
59+
| `app_name` | str | None | App name override for export title/header |
60+
| `theme` | str | None | Theme override for export (`"light"`, `"dark"`, `"base"`, or `""`) |
61+
62+
### `.config`
63+
64+
Read or set the map configuration dict. Use `map.config` after customizing in Jupyter UI, then save and reuse.
65+
66+
## Key Rules
67+
68+
- **`dataId` must match the dataset `name`** — every layer and filter references a dataset by `dataId`; this must match the key in the `data` dict or the `name` passed to `add_data()`.
69+
- **GeoJSON columns use `_geojson`** — when data is loaded as GeoJSON, the geometry column is internally named `_geojson` in configs.
70+
- **`colorField` / `colorScale` / `sizeField` / `heightField` etc. belong under `visualChannels`, NOT under `config`.** Putting them under `config` is silently ignored — the layer will render but the "Color Based On (field)" input shows empty. The layer object must have two siblings: `config` (for `dataId`, `columns`, `visConfig`, …) and `visualChannels` (for all field-to-channel mappings).
71+
- Columns named `latitude`/`lat`/`lng`/`longitude` are auto-detected as coordinates.
72+
- H3 hex IDs are auto-detected if a column contains valid H3 strings.
73+
- Use `center_map=True` to auto-fit map bounds. Use `read_only=True` to hide the side panel.
74+
- For numeric color encoding, if the user does not specify a color scale, use `visualChannels.colorScale: 'quantile'`.
75+
- For numeric color encoding, if the user does not specify a palette, use a vibrant sequential/diverging palette (for example, `colorRange.name: 'Global Warming'`).
76+
- If the user asks for custom class breaks, compute breakpoints in Python first (for example with `pygeoda`), add a derived classified/bin column to the dataset, and map colors using that derived field.
77+
- **No `SampleMapPanel` in standalone exports.** The `SampleMapPanel` React component lives in the kepler.gl demo app, not in the UMD bundle used by `save_to_html()`. To show a summary/legend overlay, inject an HTML+CSS `<div>` into the exported file (position it at `right: 56px` or `left: 66px` so it doesn't block map controls). See [Summary Panel Overlay](skill-references/summary-panel.md).
78+
79+
## Supported Data Formats
80+
81+
| Format | How to Load |
82+
|--------|-------------|
83+
| pandas DataFrame | Columns with `lat`/`lng` (or similar) for point data |
84+
| geopandas GeoDataFrame | Geometry column auto-detected. Interactive widget serialization uses GeoArrow (no CRS reprojection); HTML export path re-projects to EPSG:4326 when needed. |
85+
| CSV string | Raw CSV text with lat/lng or geometry columns |
86+
| GeoJSON dict | `Feature` or `FeatureCollection` as Python dict |
87+
| GeoJSON string | JSON string of GeoJSON |
88+
| WKT in DataFrame | DataFrame column containing WKT geometry strings |
89+
90+
## Layer Types
91+
92+
| Layer Type | Config `type` | Typical Data |
93+
|------------|---------------|--------------|
94+
| Point | `"point"` | DataFrame with lat/lng columns |
95+
| Arc | `"arc"` | DataFrame with origin/destination lat/lng |
96+
| Line | `"line"` | DataFrame with origin/destination lat/lng |
97+
| Hexbin | `"hexagon"` | DataFrame with lat/lng (aggregated spatially) |
98+
| Heatmap | `"heatmap"` | DataFrame with lat/lng |
99+
| H3 Hexagon | `"hexagonId"` | DataFrame with H3 hex ID column |
100+
| GeoJSON / Polygon | `"geojson"` | GeoJSON or GeoDataFrame with polygon/line geometries |
101+
| Cluster | `"cluster"` | DataFrame with lat/lng |
102+
| Icon | `"icon"` | DataFrame with lat/lng |
103+
| Trip | `"trip"` | GeoJSON with LineString + timestamps |
104+
| S2 | `"s2"` | DataFrame with S2 token column |
105+
106+
## Config Structure
107+
108+
```python
109+
config = {
110+
'version': 'v1',
111+
'config': {
112+
'visState': {
113+
'layers': [...], # Layer definitions
114+
'filters': [...], # Data filters
115+
'interactionConfig': {}, # Tooltips, brush, geocoder
116+
'splitMaps': [], # Split map views
117+
'layerBlending': 'normal' # 'normal', 'additive', 'subtractive'
118+
},
119+
'mapState': {
120+
'latitude': 37.76,
121+
'longitude': -122.4,
122+
'zoom': 11,
123+
'bearing': 0,
124+
'pitch': 0,
125+
'dragRotate': False,
126+
'isSplit': False
127+
},
128+
'mapStyle': {
129+
'styleType': 'dark-matter'
130+
}
131+
}
132+
}
133+
```
134+
135+
## Basemap Styles
136+
137+
Free (no token needed): `dark-matter`, `positron`, `voyager`, `dark-matter-nolabels`, `positron-nolabels`, `voyager-nolabels`
138+
139+
Mapbox (require `mapbox_token`): `dark`, `light`, `muted`, `muted_night`
140+
141+
## Additional Resources
142+
143+
For detailed per-layer-type examples with full config, see supporting files:
144+
145+
- [Point Map](skill-references/point-map.md) — Scatter plot from lat/lng
146+
- [GeoJSON / Polygon Map](skill-references/geojson-polygon-map.md) — Polygons, lines from GeoJSON or GeoDataFrame
147+
- [H3 Hexagon Map](skill-references/h3-hexagon-map.md) — H3 spatial index hexagons
148+
- [Arc / Line Map](skill-references/arc-line-map.md) — Origin-destination connections
149+
- [Heatmap](skill-references/heatmap.md) — Density heatmap from points
150+
- [Hexbin Aggregation Map](skill-references/hexbin-aggregation-map.md) — Spatial binning into hexagons
151+
- [Trip Animation Map](skill-references/trip-animation-map.md) — Animated trips along paths
152+
- [Summary Panel Overlay](skill-references/summary-panel.md) — Inject a SampleMapPanel-style info overlay into the exported HTML (for LISA/cluster counts, model summaries, custom legends)
153+
154+
## Examples
155+
156+
For full config examples per layer type, see:
157+
- [Point Map](skill-references/point-map.md) — includes quantile color + vibrant palette config
158+
- [GeoJSON / Polygon Map](skill-references/geojson-polygon-map.md) — includes choropleth config with `visualChannels`
159+
160+
### Quick start (auto-detected layers, no config needed)
161+
162+
```python
163+
from keplergl import KeplerGl
164+
import pandas as pd
165+
166+
df = pd.DataFrame({
167+
'lat': [37.7749, 34.0522, 40.7128],
168+
'lng': [-122.4194, -118.2437, -74.0060],
169+
'name': ['San Francisco', 'Los Angeles', 'New York'],
170+
'value': [15, 42, 27]
171+
})
172+
173+
map_1 = KeplerGl(data={'cities': df})
174+
map_1.save_to_html(file_name='cities_map.html', center_map=True)
175+
```
176+
177+
### GeoDataFrame from shapefile
178+
179+
```python
180+
from keplergl import KeplerGl
181+
import geopandas as gpd
182+
183+
gdf = gpd.read_file('shapefile.shp')
184+
map_1 = KeplerGl(data={'regions': gdf})
185+
map_1.save_to_html(file_name='regions_map.html', read_only=True, center_map=True)
186+
```
187+
188+
### Multiple datasets
189+
190+
```python
191+
map_1 = KeplerGl(data={
192+
'locations': points_df,
193+
'routes': routes_df
194+
})
195+
map_1.save_to_html(file_name='combined_map.html', center_map=True)
196+
```
197+
198+
### Save and reuse config
199+
200+
```python
201+
import json
202+
# Save
203+
with open('my_config.json', 'w') as f:
204+
json.dump(map_1.config, f)
205+
# Load
206+
with open('my_config.json', 'r') as f:
207+
config = json.load(f)
208+
map_2 = KeplerGl(data={'data_1': df}, config=config)
209+
map_2.save_to_html(file_name='map.html')
210+
```

skill/agents/assets/icon-large.svg

Lines changed: 6 additions & 0 deletions
Loading

skill/agents/assets/icon-small.svg

Lines changed: 6 additions & 0 deletions
Loading

skill/agents/openai.yaml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
interface:
2+
display_name: "kepler.gl Map"
3+
short_description: "Create interactive map visualizations with kepler.gl"
4+
icon_small: "./assets/icon-small.svg"
5+
icon_large: "./assets/icon-large.svg"
6+
brand_color: "#1FBAD6"
7+
default_prompt: "Create an interactive map visualization"
8+
9+
policy:
10+
allow_implicit_invocation: true
11+
12+
dependencies:
13+
tools: []

skill/cursor-plugin.json

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
{
2+
"name": "kepler.gl",
3+
"displayName": "kepler.gl Map",
4+
"version": "0.0.1",
5+
"description": "Create interactive map visualizations and export to standalone HTML using the keplergl Python package.",
6+
"publisher": "keplergl",
7+
"icon": "agents/assets/icon-large.svg",
8+
"categories": ["Data Science", "Visualization", "Maps"],
9+
"keywords": [
10+
"maps",
11+
"geospatial",
12+
"visualization",
13+
"kepler.gl",
14+
"GeoJSON",
15+
"DataFrame",
16+
"HTML",
17+
"interactive",
18+
"choropleth",
19+
"heatmap"
20+
],
21+
"homepage": "https://kepler.gl",
22+
"repository": {
23+
"type": "git",
24+
"url": "https://github.com/keplergl/kepler.gl",
25+
"directory": "bindings/python"
26+
},
27+
"license": "MIT",
28+
"skills": [
29+
{
30+
"path": "SKILL.md",
31+
"name": "kepler.gl",
32+
"description": "Create interactive map visualizations and export to standalone HTML using the keplergl Python package."
33+
}
34+
],
35+
"engines": {
36+
"cursor": ">=1.0.0"
37+
}
38+
}

0 commit comments

Comments
 (0)