[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6EFF07FMSZWZ3FN5YF1E8HX":3,"skill-same:01M6EFF07FMSZWZ3FN5YF1E8HX":149},{"skillNo":4,"name":5,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":20,"linkOnly":21,"markdownContent":22,"markdownBody":22,"frontMatter":23,"refName":24,"commitSha":25,"skillDirectory":26,"forksCount":27,"repositoryHtmlUrl":28,"repositoryHomepageUrl":29,"ownerHtmlUrl":30,"ownerBlogUrl":6,"ownerDescription":31,"updatedAt":32,"install":33,"resources":46},"01M6EFF07FMSZWZ3FN5YF1E8HX","maps-geolocation",null,"ComeOnOliver\u002Fskillshub","ComeOnOliver","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F43215937?v=4","01M6E5JNFECJAAVFE0W7SMWWD2","Haoran Shu","01M6E5JNNDQS7AJZDYFQ8TPZCK",67,"MIT","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002FTerminalSkills\u002Fskills\u002Fmaps-geolocation\u002FSKILL.md",[],[18,19],"maps","maps geolocation","2026-11-10 10:12:30",false,"# Maps & Geolocation\n\n## Overview\n\nBuild location-based applications using mapping and geolocation APIs. This skill covers four major platforms — Google Maps Platform, Mapbox, Leaflet (open-source), and OpenStreetMap\u002FNominatim (free) — for geocoding, routing, interactive maps, geofencing, heatmaps, store locators, fleet tracking, and address autocomplete. Choose based on budget: Google Maps for full-featured commercial use, Mapbox for custom styling, Leaflet+OSM for zero-cost self-hosted solutions.\n\n## Instructions\n\n### Step 1: Platform Selection & Setup\n\n**Google Maps Platform** ($200\u002Fmonth free credit):\n```bash\n# Enable: Maps JS API, Geocoding API, Directions API, Places API, Distance Matrix API\nexport GOOGLE_MAPS_API_KEY=\"AIzaSy...\"\n```\n\n**Mapbox** (50,000 free map loads\u002Fmonth):\n```bash\nexport MAPBOX_ACCESS_TOKEN=\"pk.eyJ1...\"\n```\n\n**Leaflet + OpenStreetMap** (completely free, no API key):\n```html\n\u003Clink rel=\"stylesheet\" href=\"https:\u002F\u002Funpkg.com\u002Fleaflet@1.9\u002Fdist\u002Fleaflet.css\" \u002F>\n\u003Cscript src=\"https:\u002F\u002Funpkg.com\u002Fleaflet@1.9\u002Fdist\u002Fleaflet.js\">\u003C\u002Fscript>\n```\n\n**Nominatim** (free geocoding, 1 req\u002Fsec rate limit, no key needed).\n\n### Step 2: Geocoding & Reverse Geocoding\n\n```typescript\n\u002F\u002F Google Geocoding\nasync function geocode(address: string) {\n  const res = await fetch(\n    `https:\u002F\u002Fmaps.googleapis.com\u002Fmaps\u002Fapi\u002Fgeocode\u002Fjson?address=${encodeURIComponent(address)}&key=${API_KEY}`\n  );\n  const data = await res.json();\n  const r = data.results[0];\n  return { lat: r.geometry.location.lat, lng: r.geometry.location.lng, formatted: r.formatted_address };\n}\n\n\u002F\u002F Nominatim (free, no key — requires User-Agent header per TOS)\nasync function nominatimGeocode(query: string) {\n  const res = await fetch(\n    `https:\u002F\u002Fnominatim.openstreetmap.org\u002Fsearch?q=${encodeURIComponent(query)}&format=json&limit=5`,\n    { headers: { \"User-Agent\": \"MyApp\u002F1.0 (contact@myapp.com)\" } }\n  );\n  return res.json();\n}\n\n\u002F\u002F Batch geocoding with rate limiting\nasync function batchGeocode(addresses: string[], delayMs = 100) {\n  const results = [];\n  for (const addr of addresses) {\n    try { results.push({ address: addr, ...await geocode(addr) }); }\n    catch (err) { results.push({ address: addr, lat: null, lng: null, error: err.message }); }\n    await new Promise(r => setTimeout(r, delayMs));\n  }\n  return results;\n}\n```\n\n### Step 3: Interactive Maps\n\n**Leaflet + OpenStreetMap (free):**\n```javascript\nconst map = L.map(\"map\").setView([48.8566, 2.3522], 12);\nL.tileLayer(\"https:\u002F\u002F{s}.tile.openstreetmap.org\u002F{z}\u002F{x}\u002F{y}.png\", {\n  attribution: '&copy; OpenStreetMap contributors',\n}).addTo(map);\n\nL.marker([48.8584, 2.2945]).addTo(map)\n  .bindPopup(\"\u003Cb>Eiffel Tower\u003C\u002Fb>\u003Cbr>Paris, France\").openPopup();\n\n\u002F\u002F Load GeoJSON layer\nfetch(\"\u002Fdata\u002Fzones.geojson\").then(r => r.json()).then(data => {\n  L.geoJSON(data, {\n    style: { color: \"#ef4444\", weight: 2, fillOpacity: 0.1 },\n    onEachFeature: (feature, layer) => layer.bindPopup(feature.properties.name),\n  }).addTo(map);\n});\n```\n\n**Mapbox GL JS** (vector tiles, custom styles):\n```javascript\nmapboxgl.accessToken = \"pk.eyJ1...\";\nconst map = new mapboxgl.Map({\n  container: \"map\", style: \"mapbox:\u002F\u002Fstyles\u002Fmapbox\u002Fstreets-v12\",\n  center: [2.3522, 48.8566], zoom: 12,\n});\nnew mapboxgl.Marker({ color: \"#ef4444\" })\n  .setLngLat([2.2945, 48.8584])\n  .setPopup(new mapboxgl.Popup().setHTML(\"\u003Ch3>Eiffel Tower\u003C\u002Fh3>\"))\n  .addTo(map);\nmap.addControl(new mapboxgl.NavigationControl());\n```\n\n### Step 4: Routing & Distance Matrix\n\n```typescript\n\u002F\u002F Google Directions\nasync function getRoute(origin: string, destination: string, mode = \"driving\") {\n  const res = await fetch(\n    `https:\u002F\u002Fmaps.googleapis.com\u002Fmaps\u002Fapi\u002Fdirections\u002Fjson?origin=${encodeURIComponent(origin)}&destination=${encodeURIComponent(destination)}&mode=${mode}&key=${API_KEY}`\n  );\n  const data = await res.json();\n  const leg = data.routes[0].legs[0];\n  return { distance: leg.distance.text, duration: leg.duration.text, polyline: data.routes[0].overview_polyline.points };\n}\n\n\u002F\u002F Distance Matrix (many-to-many)\nasync function distanceMatrix(origins: string[], destinations: string[]) {\n  const res = await fetch(\n    `https:\u002F\u002Fmaps.googleapis.com\u002Fmaps\u002Fapi\u002Fdistancematrix\u002Fjson?origins=${origins.map(encodeURIComponent).join(\"|\")}&destinations=${destinations.map(encodeURIComponent).join(\"|\")}&key=${API_KEY}`\n  );\n  return res.json();\n}\n\n\u002F\u002F OSRM (free, no key)\nasync function osrmRoute(coords: [number, number][]) {\n  const wp = coords.map(c => c.join(\",\")).join(\";\");\n  const res = await fetch(`https:\u002F\u002Frouter.project-osrm.org\u002Froute\u002Fv1\u002Fdriving\u002F${wp}?overview=full&geometries=geojson`);\n  const data = await res.json();\n  return { distance: data.routes[0].distance, duration: data.routes[0].duration, geometry: data.routes[0].geometry };\n}\n```\n\n### Step 5: Geofencing & Utilities\n\n```typescript\n\u002F\u002F Haversine distance (meters)\nfunction haversineDistance(lat1: number, lng1: number, lat2: number, lng2: number): number {\n  const R = 6371000;\n  const dLat = ((lat2 - lat1) * Math.PI) \u002F 180;\n  const dLng = ((lng2 - lng1) * Math.PI) \u002F 180;\n  const a = Math.sin(dLat \u002F 2) ** 2 +\n    Math.cos((lat1 * Math.PI) \u002F 180) * Math.cos((lat2 * Math.PI) \u002F 180) * Math.sin(dLng \u002F 2) ** 2;\n  return R * 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));\n}\n\n\u002F\u002F Point-in-polygon check\nfunction pointInPolygon(point: [number, number], polygon: [number, number][]): boolean {\n  const [x, y] = point;\n  let inside = false;\n  for (let i = 0, j = polygon.length - 1; i \u003C polygon.length; j = i++) {\n    const [xi, yi] = polygon[i], [xj, yj] = polygon[j];\n    if ((yi > y) !== (yj > y) && x \u003C ((xj - xi) * (y - yi)) \u002F (yj - yi) + xi) inside = !inside;\n  }\n  return inside;\n}\n\n\u002F\u002F Circular geofence check\nfunction isInRadius(point: [number, number], center: [number, number], radiusMeters: number): boolean {\n  return haversineDistance(point[0], point[1], center[0], center[1]) \u003C= radiusMeters;\n}\n```\n\n### Step 6: Store Locator & Route Optimization\n\n**Nearby search with PostGIS:**\n```sql\nSELECT id, name, address, lat, lng,\n  ST_DistanceSphere(ST_MakePoint(lng, lat), ST_MakePoint($1, $2)) AS distance_meters\nFROM stores\nWHERE ST_DWithin(ST_MakePoint(lng, lat)::geography, ST_MakePoint($1, $2)::geography, $3)\nORDER BY distance_meters LIMIT $4;\n```\n\n**Route optimization** (Google Directions with waypoint reordering):\n```typescript\nasync function optimizeRoute(origin: string, destination: string, waypoints: string[]) {\n  const res = await fetch(\n    `https:\u002F\u002Fmaps.googleapis.com\u002Fmaps\u002Fapi\u002Fdirections\u002Fjson?origin=${encodeURIComponent(origin)}&destination=${encodeURIComponent(destination)}&waypoints=optimize:true|${waypoints.map(encodeURIComponent).join(\"|\")}&key=${API_KEY}`\n  );\n  const route = (await res.json()).routes[0];\n  return {\n    optimizedOrder: route.waypoint_order,\n    totalDistance: route.legs.reduce((s: number, l: any) => s + l.distance.value, 0),\n    totalDuration: route.legs.reduce((s: number, l: any) => s + l.duration.value, 0),\n  };\n}\n```\n\n## Examples\n\n### Example 1: Store locator with address search for a coffee chain\n\n**User prompt:** \"Build a store locator for our coffee shops. The user types an address, we geocode it, find the 5 nearest stores within 10km from our PostgreSQL database, and display them on a Leaflet map with distance labels.\"\n\nThe agent will create a geocoding function using Google Geocoding API (or Nominatim for free) to convert the user's address input to coordinates. It will write a PostGIS SQL query using `ST_DWithin` to find the 5 nearest stores within 10,000 meters, returning name, address, coordinates, and distance. On the frontend, it will initialize a Leaflet map centered on the searched location, add a marker for each store with a popup showing name, address, and distance in km, and fit the map bounds to show all results.\n\n### Example 2: Delivery fleet route optimization with geofence alerts\n\n**User prompt:** \"Optimize the delivery route for a driver starting from our Berlin warehouse with 6 drop-off addresses, then set up a 200m geofence around each stop that logs arrival timestamps.\"\n\nThe agent will call the Google Directions API with `waypoints=optimize:true` to reorder the 6 stops for minimum travel time, returning the optimal sequence, total distance, and estimated duration. It will then create a geofence monitor with a 200-meter circular zone around each stop using the haversine distance function, checking incoming GPS coordinates against each fence and logging enter\u002Fexit events with timestamps to track delivery progress.\n\n## Guidelines\n\n- **Choose the right platform for cost** — Google Maps charges per API call after $200\u002Fmonth free credit; Mapbox offers 50,000 free map loads; Leaflet + OSM + Nominatim is entirely free but rate-limited to 1 request\u002Fsecond.\n- **Always include attribution** — OpenStreetMap requires visible attribution on rendered maps; Mapbox and Google have their own attribution requirements that must not be removed.\n- **Rate-limit geocoding requests** — add delays between batch geocoding calls (100ms+ for Google, 1 second for Nominatim) to avoid hitting rate limits and getting blocked.\n- **Close GeoJSON polygon rings** — the first and last coordinate in a polygon must be identical; omitting this causes rendering failures and invalid geometry errors across all platforms.\n- **Cache geocoding results** — store lat\u002Flng in your database after the first lookup to avoid repeated API calls for the same addresses, which both saves cost and improves response times.\n- **Validate coordinate order** — Google Maps uses `{lat, lng}` objects, Mapbox and GeoJSON use `[lng, lat]` arrays; mixing these up is the most common source of misplaced markers.\n",{},"main","def8531e65114c0fca8fb8551c1871ee0eed705c","skills\u002FTerminalSkills\u002Fskills\u002Fmaps-geolocation",24,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub","https:\u002F\u002Fskillshub.wtf","https:\u002F\u002Fgithub.com\u002FComeOnOliver","AI & Blockchain Engineer\r\n","2026-06-24 22:07:19",{"source":7,"skillName":5,"commands":34,"prompt":44,"zipAvailable":45},[35,38,41],{"tool":36,"command":37},"npx","npx skills add ComeOnOliver\u002Fskillshub --skill maps-geolocation",{"tool":39,"command":40},"bunx","bunx skills add ComeOnOliver\u002Fskillshub --skill maps-geolocation",{"tool":42,"command":43},"pnpm","pnpm dlx skills add ComeOnOliver\u002Fskillshub --skill maps-geolocation","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002FTerminalSkills\u002Fskills\u002Fmaps-geolocation\u002FSKILL.md",true,[47,53,57,63,67,71,75,79,83,87,91,95,99,103,107,111,115,119,123,127,131,137,141,145],{"path":48,"resourceType":49,"resourceTypeDesc":50,"sizeBytes":51,"sourceHtmlUrl":52},"BENCHMARK.md","REFERENCE","参考文档",5526,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Ftilegym-converting-cutile-to-triton\u002FBENCHMARK.md",{"path":54,"resourceType":49,"resourceTypeDesc":50,"sizeBytes":55,"sourceHtmlUrl":56},"evals\u002Fevals.json",5399,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Ftilegym-converting-cutile-to-triton\u002Fevals\u002Fevals.json",{"path":58,"resourceType":59,"resourceTypeDesc":60,"sizeBytes":61,"sourceHtmlUrl":62},"examples\u002F01_vector_add\u002Fcutile_kernel.py","SCRIPT","脚本",3862,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Ftilegym-converting-cutile-to-triton\u002Fexamples\u002F01_vector_add\u002Fcutile_kernel.py",{"path":64,"resourceType":59,"resourceTypeDesc":60,"sizeBytes":65,"sourceHtmlUrl":66},"examples\u002F01_vector_add\u002Ftriton_kernel.py",3395,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Ftilegym-converting-cutile-to-triton\u002Fexamples\u002F01_vector_add\u002Ftriton_kernel.py",{"path":68,"resourceType":59,"resourceTypeDesc":60,"sizeBytes":69,"sourceHtmlUrl":70},"examples\u002F02_softmax\u002Fcutile_kernel.py",5004,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Ftilegym-converting-cutile-to-triton\u002Fexamples\u002F02_softmax\u002Fcutile_kernel.py",{"path":72,"resourceType":59,"resourceTypeDesc":60,"sizeBytes":73,"sourceHtmlUrl":74},"examples\u002F02_softmax\u002Ftriton_kernel.py",8872,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Ftilegym-converting-cutile-to-triton\u002Fexamples\u002F02_softmax\u002Ftriton_kernel.py",{"path":76,"resourceType":59,"resourceTypeDesc":60,"sizeBytes":77,"sourceHtmlUrl":78},"examples\u002F03_layernorm\u002Fcutile_kernel.py",10818,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Ftilegym-converting-cutile-to-triton\u002Fexamples\u002F03_layernorm\u002Fcutile_kernel.py",{"path":80,"resourceType":59,"resourceTypeDesc":60,"sizeBytes":81,"sourceHtmlUrl":82},"examples\u002F03_layernorm\u002Ftriton_kernel.py",12036,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Ftilegym-converting-cutile-to-triton\u002Fexamples\u002F03_layernorm\u002Ftriton_kernel.py",{"path":84,"resourceType":59,"resourceTypeDesc":60,"sizeBytes":85,"sourceHtmlUrl":86},"examples\u002F04_matmul\u002Fcutile_kernel.py",6957,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Ftilegym-converting-cutile-to-triton\u002Fexamples\u002F04_matmul\u002Fcutile_kernel.py",{"path":88,"resourceType":59,"resourceTypeDesc":60,"sizeBytes":89,"sourceHtmlUrl":90},"examples\u002F04_matmul\u002Ftriton_kernel.py",13640,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Ftilegym-converting-cutile-to-triton\u002Fexamples\u002F04_matmul\u002Ftriton_kernel.py",{"path":92,"resourceType":59,"resourceTypeDesc":60,"sizeBytes":93,"sourceHtmlUrl":94},"examples\u002F05_attention\u002Fcutile_kernel.py",8011,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Ftilegym-converting-cutile-to-triton\u002Fexamples\u002F05_attention\u002Fcutile_kernel.py",{"path":96,"resourceType":59,"resourceTypeDesc":60,"sizeBytes":97,"sourceHtmlUrl":98},"examples\u002F05_attention\u002Ftriton_kernel.py",17945,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Ftilegym-converting-cutile-to-triton\u002Fexamples\u002F05_attention\u002Ftriton_kernel.py",{"path":100,"resourceType":49,"resourceTypeDesc":50,"sizeBytes":101,"sourceHtmlUrl":102},"references\u002Fapi-mapping.md",17281,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Ftilegym-converting-cutile-to-triton\u002Freferences\u002Fapi-mapping.md",{"path":104,"resourceType":49,"resourceTypeDesc":50,"sizeBytes":105,"sourceHtmlUrl":106},"references\u002Fdebugging.md",11686,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Ftilegym-converting-cutile-to-triton\u002Freferences\u002Fdebugging.md",{"path":108,"resourceType":49,"resourceTypeDesc":50,"sizeBytes":109,"sourceHtmlUrl":110},"references\u002Fgotchas.md",4180,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Ftilegym-converting-cutile-to-triton\u002Freferences\u002Fgotchas.md",{"path":112,"resourceType":49,"resourceTypeDesc":50,"sizeBytes":113,"sourceHtmlUrl":114},"references\u002Fharness-integration.md",6476,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Ftilegym-converting-cutile-to-triton\u002Freferences\u002Fharness-integration.md",{"path":116,"resourceType":49,"resourceTypeDesc":50,"sizeBytes":117,"sourceHtmlUrl":118},"references\u002Foptimization-strategy.md",7999,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Ftilegym-converting-cutile-to-triton\u002Freferences\u002Foptimization-strategy.md",{"path":120,"resourceType":49,"resourceTypeDesc":50,"sizeBytes":121,"sourceHtmlUrl":122},"references\u002Foptimizing-reference.md",24007,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Ftilegym-converting-cutile-to-triton\u002Freferences\u002Foptimizing-reference.md",{"path":124,"resourceType":49,"resourceTypeDesc":50,"sizeBytes":125,"sourceHtmlUrl":126},"references\u002Fperformance-gotchas.md",2375,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Ftilegym-converting-cutile-to-triton\u002Freferences\u002Fperformance-gotchas.md",{"path":128,"resourceType":49,"resourceTypeDesc":50,"sizeBytes":129,"sourceHtmlUrl":130},"skill-card.md",4273,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Ftilegym-converting-cutile-to-triton\u002Fskill-card.md",{"path":132,"resourceType":133,"resourceTypeDesc":134,"sizeBytes":135,"sourceHtmlUrl":136},"skill.oms.sig","OTHER","其他",9577,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Ftilegym-converting-cutile-to-triton\u002Fskill.oms.sig",{"path":138,"resourceType":49,"resourceTypeDesc":50,"sizeBytes":139,"sourceHtmlUrl":140},"translations\u002Fadvanced-patterns.md",8076,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Ftilegym-converting-cutile-to-triton\u002Ftranslations\u002Fadvanced-patterns.md",{"path":142,"resourceType":49,"resourceTypeDesc":50,"sizeBytes":143,"sourceHtmlUrl":144},"translations\u002Ffile-structure.md",3119,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Ftilegym-converting-cutile-to-triton\u002Ftranslations\u002Ffile-structure.md",{"path":146,"resourceType":49,"resourceTypeDesc":50,"sizeBytes":147,"sourceHtmlUrl":148},"translations\u002Fworkflow.md",26722,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Ftilegym-converting-cutile-to-triton\u002Ftranslations\u002Fworkflow.md",[150,164,174,183,189,196],{"skillNo":151,"name":152,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":153,"categories":154,"keywords":160,"publishedAt":20},"01M6FKJN13GMG4KY57J3QD8GY5","model-hierarchy-skill","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzscole\u002Fmodel-hierarchy-skill\u002Fmodel-hierarchy-skill\u002FSKILL.md",[155],{"categoryNo":156,"categoryName":157,"taxonomyType":158,"taxonomyTypeDesc":159},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[161,162,163],"model","model hierarchy","model hierarchy skill",{"skillNo":165,"name":166,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":167,"categories":168,"keywords":170,"publishedAt":20},"01M6FKJJJ6GCAMR4PPPRD12M5X","zoom-mcp","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-mcp\u002FSKILL.md",[169],{"categoryNo":156,"categoryName":157,"taxonomyType":158,"taxonomyTypeDesc":159},[171,172,173],"MCP","zoom","zoom mcp",{"skillNo":175,"name":176,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":177,"categories":178,"keywords":179,"publishedAt":20},"01M6FKJE3KYT3KPEZMEEHYKA6K","zoom-apps-sdk","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-apps-sdk\u002FSKILL.md",[],[180,181,182,172],"sdk","zoom apps sdk","apps",{"skillNo":184,"name":185,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":186,"categories":187,"keywords":188,"publishedAt":20},"01M6FKJ9EDH9Q5VWDF8HAJRSP0","windows","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwindows\u002FSKILL.md",[],[185],{"skillNo":190,"name":191,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":192,"categories":193,"keywords":195,"publishedAt":20},"01M6FKJ666BEEFC3AE9GJ72Q93","whiteboard","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwhiteboard\u002FSKILL.md",[194],{"categoryNo":156,"categoryName":157,"taxonomyType":158,"taxonomyTypeDesc":159},[191],{"skillNo":197,"name":198,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":199,"categories":200,"keywords":201,"publishedAt":20},"01M6FKJ21WFCDGTJQ2Q91T9DVW","websockets","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwebsockets\u002FSKILL.md",[],[198]]