[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M79A0PH6CY0WCACSWZP7Z2VW":3,"skill-same:01M79A0PH6CY0WCACSWZP7Z2VW":44},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":19,"linkOnly":20,"markdownContent":21,"markdownBody":22,"frontMatter":23,"refName":24,"commitSha":25,"skillDirectory":26,"forksCount":14,"repositoryHtmlUrl":27,"repositoryHomepageUrl":6,"ownerHtmlUrl":28,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":29,"install":30,"resources":43},"01M79A0PH6CY0WCACSWZP7Z2VW","bun-redis",null,"Use when working with Redis in Bun (ioredis, Upstash), caching, pub\u002Fsub, session storage, or key-value operations.","Elogic360\u002Fsoftware-factory","Elogic360","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F156535519?v=4","01M74NH3F0RB13PWB7JZDE2V80","elogic360","01M74NH3FPC65082MDZVMFHDM3",0,"MIT","https:\u002F\u002Fgithub.com\u002FElogic360\u002Fsoftware-factory\u002Fblob\u002Fmain\u002Fintegrations\u002Fclaude-skills-secondsky\u002Fplugins\u002Fbun\u002Fskills\u002Fbun-redis\u002FSKILL.md",[],[],"2026-11-15 14:19:17",false,"---\nname: bun-redis\ndescription: Use when working with Redis in Bun (ioredis, Upstash), caching, pub\u002Fsub, session storage, or key-value operations.\nlicense: MIT\n---\n\n# Bun Redis\n\nRedis integration with Bun using popular Redis clients.\n\n## Client Options\n\n| Client | Best For | Install |\n|--------|----------|---------|\n| `ioredis` | Self-hosted Redis | `bun add ioredis` |\n| `@upstash\u002Fredis` | Serverless\u002FEdge | `bun add @upstash\u002Fredis` |\n| `redis` | Official Node client | `bun add redis` |\n\n## ioredis Setup\n\n```typescript\nimport Redis from \"ioredis\";\n\n\u002F\u002F Default connection\nconst redis = new Redis();\n\n\u002F\u002F With options\nconst redis = new Redis({\n  host: \"localhost\",\n  port: 6379,\n  password: \"secret\",\n  db: 0,\n});\n\n\u002F\u002F Connection string\nconst redis = new Redis(\"redis:\u002F\u002F:password@localhost:6379\u002F0\");\n\n\u002F\u002F TLS connection\nconst redis = new Redis({\n  host: \"redis.example.com\",\n  port: 6380,\n  tls: {},\n});\n```\n\n## Basic Operations\n\n```typescript\nimport Redis from \"ioredis\";\n\nconst redis = new Redis();\n\n\u002F\u002F Strings\nawait redis.set(\"name\", \"Alice\");\nawait redis.set(\"count\", \"100\");\nawait redis.setex(\"temp\", 60, \"expires in 60s\"); \u002F\u002F With TTL\n\nconst name = await redis.get(\"name\"); \u002F\u002F \"Alice\"\nconst count = await redis.incr(\"count\"); \u002F\u002F 101\nawait redis.del(\"name\");\n\n\u002F\u002F Check existence\nconst exists = await redis.exists(\"name\"); \u002F\u002F 0 or 1\n\n\u002F\u002F TTL\nawait redis.expire(\"key\", 3600); \u002F\u002F Set 1 hour TTL\nconst ttl = await redis.ttl(\"key\"); \u002F\u002F Get remaining TTL\n```\n\n## Data Structures\n\n### Hashes\n\n```typescript\n\u002F\u002F Set hash fields\nawait redis.hset(\"user:1\", {\n  name: \"Alice\",\n  email: \"alice@example.com\",\n  age: \"30\",\n});\n\n\u002F\u002F Get single field\nconst name = await redis.hget(\"user:1\", \"name\");\n\n\u002F\u002F Get all fields\nconst user = await redis.hgetall(\"user:1\");\n\u002F\u002F { name: \"Alice\", email: \"...\", age: \"30\" }\n\n\u002F\u002F Increment field\nawait redis.hincrby(\"user:1\", \"visits\", 1);\n```\n\n### Lists\n\n```typescript\n\u002F\u002F Add to list\nawait redis.rpush(\"queue\", \"task1\", \"task2\");\nawait redis.lpush(\"queue\", \"urgent\");\n\n\u002F\u002F Pop from list\nconst task = await redis.lpop(\"queue\"); \u002F\u002F \"urgent\"\nconst blocking = await redis.blpop(\"queue\", 5); \u002F\u002F Wait 5s\n\n\u002F\u002F Range\nconst items = await redis.lrange(\"queue\", 0, -1);\n```\n\n### Sets\n\n```typescript\n\u002F\u002F Add members\nawait redis.sadd(\"tags\", \"javascript\", \"typescript\", \"bun\");\n\n\u002F\u002F Check membership\nconst isMember = await redis.sismember(\"tags\", \"bun\"); \u002F\u002F 1\n\n\u002F\u002F Get all members\nconst tags = await redis.smembers(\"tags\");\n\n\u002F\u002F Set operations\nawait redis.sinter(\"tags1\", \"tags2\"); \u002F\u002F Intersection\nawait redis.sunion(\"tags1\", \"tags2\"); \u002F\u002F Union\n```\n\n### Sorted Sets\n\n```typescript\n\u002F\u002F Add with scores\nawait redis.zadd(\"leaderboard\", 100, \"alice\", 200, \"bob\", 150, \"charlie\");\n\n\u002F\u002F Get by rank\nconst top3 = await redis.zrevrange(\"leaderboard\", 0, 2, \"WITHSCORES\");\n\n\u002F\u002F Get by score range\nconst highScores = await redis.zrangebyscore(\"leaderboard\", 100, 200);\n\n\u002F\u002F Increment score\nawait redis.zincrby(\"leaderboard\", 50, \"alice\");\n```\n\n## JSON (RedisJSON)\n\n```typescript\n\u002F\u002F Requires RedisJSON module\nawait redis.call(\"JSON.SET\", \"user:1\", \"$\", JSON.stringify({\n  name: \"Alice\",\n  settings: { theme: \"dark\" },\n}));\n\nconst user = await redis.call(\"JSON.GET\", \"user:1\");\nconst settings = await redis.call(\"JSON.GET\", \"user:1\", \"$.settings\");\n```\n\n## Pub\u002FSub\n\n```typescript\nimport Redis from \"ioredis\";\n\n\u002F\u002F Publisher\nconst pub = new Redis();\n\n\u002F\u002F Subscriber\nconst sub = new Redis();\n\n\u002F\u002F Subscribe to channel\nsub.subscribe(\"notifications\", (err, count) => {\n  console.log(`Subscribed to ${count} channels`);\n});\n\n\u002F\u002F Handle messages\nsub.on(\"message\", (channel, message) => {\n  console.log(`${channel}: ${message}`);\n});\n\n\u002F\u002F Publish\nawait pub.publish(\"notifications\", JSON.stringify({\n  type: \"alert\",\n  message: \"Hello!\",\n}));\n\n\u002F\u002F Pattern subscribe\nsub.psubscribe(\"user:*\");\nsub.on(\"pmessage\", (pattern, channel, message) => {\n  console.log(`${pattern} -> ${channel}: ${message}`);\n});\n```\n\n## Transactions\n\n```typescript\n\u002F\u002F Multi\u002FExec\nconst results = await redis\n  .multi()\n  .set(\"key1\", \"value1\")\n  .set(\"key2\", \"value2\")\n  .incr(\"counter\")\n  .exec();\n\n\u002F\u002F Pipeline (no atomicity, better performance)\nconst pipeline = redis.pipeline();\npipeline.set(\"key1\", \"value1\");\npipeline.set(\"key2\", \"value2\");\npipeline.incr(\"counter\");\nconst results = await pipeline.exec();\n```\n\n## Upstash Redis (Serverless)\n\n```typescript\nimport { Redis } from \"@upstash\u002Fredis\";\n\nconst redis = new Redis({\n  url: process.env.UPSTASH_REDIS_REST_URL,\n  token: process.env.UPSTASH_REDIS_REST_TOKEN,\n});\n\n\u002F\u002F Same API as ioredis\nawait redis.set(\"key\", \"value\");\nconst value = await redis.get(\"key\");\n\n\u002F\u002F With automatic JSON serialization\nawait redis.set(\"user\", { name: \"Alice\", age: 30 });\nconst user = await redis.get\u003C{ name: string; age: number }>(\"user\");\n```\n\n## Caching Patterns\n\n### Cache-Aside\n\n```typescript\nasync function getUser(id: string) {\n  \u002F\u002F Check cache\n  const cached = await redis.get(`user:${id}`);\n  if (cached) {\n    return JSON.parse(cached);\n  }\n\n  \u002F\u002F Fetch from database\n  const user = await db.query.users.findFirst({\n    where: eq(users.id, id),\n  });\n\n  \u002F\u002F Cache for 1 hour\n  if (user) {\n    await redis.setex(`user:${id}`, 3600, JSON.stringify(user));\n  }\n\n  return user;\n}\n```\n\n### Write-Through\n\n```typescript\nasync function updateUser(id: string, data: UserUpdate) {\n  \u002F\u002F Update database\n  await db.update(users).set(data).where(eq(users.id, id));\n\n  \u002F\u002F Update cache\n  const user = await db.query.users.findFirst({\n    where: eq(users.id, id),\n  });\n  await redis.setex(`user:${id}`, 3600, JSON.stringify(user));\n\n  return user;\n}\n```\n\n### Rate Limiting\n\n```typescript\nasync function rateLimit(key: string, limit: number, window: number) {\n  const current = await redis.incr(key);\n\n  if (current === 1) {\n    await redis.expire(key, window);\n  }\n\n  return current \u003C= limit;\n}\n\n\u002F\u002F Usage\nconst allowed = await rateLimit(`rate:${userId}`, 100, 60);\nif (!allowed) {\n  throw new Error(\"Rate limit exceeded\");\n}\n```\n\n## Session Storage\n\n```typescript\nimport { Hono } from \"hono\";\nimport Redis from \"ioredis\";\nimport { v4 as uuid } from \"uuid\";\n\nconst redis = new Redis();\nconst app = new Hono();\n\napp.use(\"*\", async (c, next) => {\n  const sessionId = c.req.header(\"X-Session-Id\") || uuid();\n  const session = await redis.hgetall(`session:${sessionId}`);\n\n  c.set(\"session\", session);\n  c.set(\"sessionId\", sessionId);\n\n  await next();\n\n  \u002F\u002F Save session\n  const updatedSession = c.get(\"session\");\n  if (Object.keys(updatedSession).length > 0) {\n    await redis.hset(`session:${sessionId}`, updatedSession);\n    await redis.expire(`session:${sessionId}`, 86400); \u002F\u002F 24h\n  }\n});\n```\n\n## Common Errors\n\n| Error | Cause | Fix |\n|-------|-------|-----|\n| `ECONNREFUSED` | Redis not running | Start Redis server |\n| `NOAUTH` | Authentication required | Provide password |\n| `WRONGTYPE` | Wrong data type | Check key type |\n| `OOM` | Out of memory | Configure maxmemory |\n\n## When to Load References\n\nLoad `references\u002Fclustering.md` when:\n- Redis Cluster setup\n- Sentinel configuration\n- High availability patterns\n\nLoad `references\u002Flua-scripts.md` when:\n- Custom Lua scripts\n- Atomic operations\n- Complex transactions\n","# Bun Redis\n\nRedis integration with Bun using popular Redis clients.\n\n## Client Options\n\n| Client | Best For | Install |\n|--------|----------|---------|\n| `ioredis` | Self-hosted Redis | `bun add ioredis` |\n| `@upstash\u002Fredis` | Serverless\u002FEdge | `bun add @upstash\u002Fredis` |\n| `redis` | Official Node client | `bun add redis` |\n\n## ioredis Setup\n\n```typescript\nimport Redis from \"ioredis\";\n\n\u002F\u002F Default connection\nconst redis = new Redis();\n\n\u002F\u002F With options\nconst redis = new Redis({\n  host: \"localhost\",\n  port: 6379,\n  password: \"secret\",\n  db: 0,\n});\n\n\u002F\u002F Connection string\nconst redis = new Redis(\"redis:\u002F\u002F:password@localhost:6379\u002F0\");\n\n\u002F\u002F TLS connection\nconst redis = new Redis({\n  host: \"redis.example.com\",\n  port: 6380,\n  tls: {},\n});\n```\n\n## Basic Operations\n\n```typescript\nimport Redis from \"ioredis\";\n\nconst redis = new Redis();\n\n\u002F\u002F Strings\nawait redis.set(\"name\", \"Alice\");\nawait redis.set(\"count\", \"100\");\nawait redis.setex(\"temp\", 60, \"expires in 60s\"); \u002F\u002F With TTL\n\nconst name = await redis.get(\"name\"); \u002F\u002F \"Alice\"\nconst count = await redis.incr(\"count\"); \u002F\u002F 101\nawait redis.del(\"name\");\n\n\u002F\u002F Check existence\nconst exists = await redis.exists(\"name\"); \u002F\u002F 0 or 1\n\n\u002F\u002F TTL\nawait redis.expire(\"key\", 3600); \u002F\u002F Set 1 hour TTL\nconst ttl = await redis.ttl(\"key\"); \u002F\u002F Get remaining TTL\n```\n\n## Data Structures\n\n### Hashes\n\n```typescript\n\u002F\u002F Set hash fields\nawait redis.hset(\"user:1\", {\n  name: \"Alice\",\n  email: \"alice@example.com\",\n  age: \"30\",\n});\n\n\u002F\u002F Get single field\nconst name = await redis.hget(\"user:1\", \"name\");\n\n\u002F\u002F Get all fields\nconst user = await redis.hgetall(\"user:1\");\n\u002F\u002F { name: \"Alice\", email: \"...\", age: \"30\" }\n\n\u002F\u002F Increment field\nawait redis.hincrby(\"user:1\", \"visits\", 1);\n```\n\n### Lists\n\n```typescript\n\u002F\u002F Add to list\nawait redis.rpush(\"queue\", \"task1\", \"task2\");\nawait redis.lpush(\"queue\", \"urgent\");\n\n\u002F\u002F Pop from list\nconst task = await redis.lpop(\"queue\"); \u002F\u002F \"urgent\"\nconst blocking = await redis.blpop(\"queue\", 5); \u002F\u002F Wait 5s\n\n\u002F\u002F Range\nconst items = await redis.lrange(\"queue\", 0, -1);\n```\n\n### Sets\n\n```typescript\n\u002F\u002F Add members\nawait redis.sadd(\"tags\", \"javascript\", \"typescript\", \"bun\");\n\n\u002F\u002F Check membership\nconst isMember = await redis.sismember(\"tags\", \"bun\"); \u002F\u002F 1\n\n\u002F\u002F Get all members\nconst tags = await redis.smembers(\"tags\");\n\n\u002F\u002F Set operations\nawait redis.sinter(\"tags1\", \"tags2\"); \u002F\u002F Intersection\nawait redis.sunion(\"tags1\", \"tags2\"); \u002F\u002F Union\n```\n\n### Sorted Sets\n\n```typescript\n\u002F\u002F Add with scores\nawait redis.zadd(\"leaderboard\", 100, \"alice\", 200, \"bob\", 150, \"charlie\");\n\n\u002F\u002F Get by rank\nconst top3 = await redis.zrevrange(\"leaderboard\", 0, 2, \"WITHSCORES\");\n\n\u002F\u002F Get by score range\nconst highScores = await redis.zrangebyscore(\"leaderboard\", 100, 200);\n\n\u002F\u002F Increment score\nawait redis.zincrby(\"leaderboard\", 50, \"alice\");\n```\n\n## JSON (RedisJSON)\n\n```typescript\n\u002F\u002F Requires RedisJSON module\nawait redis.call(\"JSON.SET\", \"user:1\", \"$\", JSON.stringify({\n  name: \"Alice\",\n  settings: { theme: \"dark\" },\n}));\n\nconst user = await redis.call(\"JSON.GET\", \"user:1\");\nconst settings = await redis.call(\"JSON.GET\", \"user:1\", \"$.settings\");\n```\n\n## Pub\u002FSub\n\n```typescript\nimport Redis from \"ioredis\";\n\n\u002F\u002F Publisher\nconst pub = new Redis();\n\n\u002F\u002F Subscriber\nconst sub = new Redis();\n\n\u002F\u002F Subscribe to channel\nsub.subscribe(\"notifications\", (err, count) => {\n  console.log(`Subscribed to ${count} channels`);\n});\n\n\u002F\u002F Handle messages\nsub.on(\"message\", (channel, message) => {\n  console.log(`${channel}: ${message}`);\n});\n\n\u002F\u002F Publish\nawait pub.publish(\"notifications\", JSON.stringify({\n  type: \"alert\",\n  message: \"Hello!\",\n}));\n\n\u002F\u002F Pattern subscribe\nsub.psubscribe(\"user:*\");\nsub.on(\"pmessage\", (pattern, channel, message) => {\n  console.log(`${pattern} -> ${channel}: ${message}`);\n});\n```\n\n## Transactions\n\n```typescript\n\u002F\u002F Multi\u002FExec\nconst results = await redis\n  .multi()\n  .set(\"key1\", \"value1\")\n  .set(\"key2\", \"value2\")\n  .incr(\"counter\")\n  .exec();\n\n\u002F\u002F Pipeline (no atomicity, better performance)\nconst pipeline = redis.pipeline();\npipeline.set(\"key1\", \"value1\");\npipeline.set(\"key2\", \"value2\");\npipeline.incr(\"counter\");\nconst results = await pipeline.exec();\n```\n\n## Upstash Redis (Serverless)\n\n```typescript\nimport { Redis } from \"@upstash\u002Fredis\";\n\nconst redis = new Redis({\n  url: process.env.UPSTASH_REDIS_REST_URL,\n  token: process.env.UPSTASH_REDIS_REST_TOKEN,\n});\n\n\u002F\u002F Same API as ioredis\nawait redis.set(\"key\", \"value\");\nconst value = await redis.get(\"key\");\n\n\u002F\u002F With automatic JSON serialization\nawait redis.set(\"user\", { name: \"Alice\", age: 30 });\nconst user = await redis.get\u003C{ name: string; age: number }>(\"user\");\n```\n\n## Caching Patterns\n\n### Cache-Aside\n\n```typescript\nasync function getUser(id: string) {\n  \u002F\u002F Check cache\n  const cached = await redis.get(`user:${id}`);\n  if (cached) {\n    return JSON.parse(cached);\n  }\n\n  \u002F\u002F Fetch from database\n  const user = await db.query.users.findFirst({\n    where: eq(users.id, id),\n  });\n\n  \u002F\u002F Cache for 1 hour\n  if (user) {\n    await redis.setex(`user:${id}`, 3600, JSON.stringify(user));\n  }\n\n  return user;\n}\n```\n\n### Write-Through\n\n```typescript\nasync function updateUser(id: string, data: UserUpdate) {\n  \u002F\u002F Update database\n  await db.update(users).set(data).where(eq(users.id, id));\n\n  \u002F\u002F Update cache\n  const user = await db.query.users.findFirst({\n    where: eq(users.id, id),\n  });\n  await redis.setex(`user:${id}`, 3600, JSON.stringify(user));\n\n  return user;\n}\n```\n\n### Rate Limiting\n\n```typescript\nasync function rateLimit(key: string, limit: number, window: number) {\n  const current = await redis.incr(key);\n\n  if (current === 1) {\n    await redis.expire(key, window);\n  }\n\n  return current \u003C= limit;\n}\n\n\u002F\u002F Usage\nconst allowed = await rateLimit(`rate:${userId}`, 100, 60);\nif (!allowed) {\n  throw new Error(\"Rate limit exceeded\");\n}\n```\n\n## Session Storage\n\n```typescript\nimport { Hono } from \"hono\";\nimport Redis from \"ioredis\";\nimport { v4 as uuid } from \"uuid\";\n\nconst redis = new Redis();\nconst app = new Hono();\n\napp.use(\"*\", async (c, next) => {\n  const sessionId = c.req.header(\"X-Session-Id\") || uuid();\n  const session = await redis.hgetall(`session:${sessionId}`);\n\n  c.set(\"session\", session);\n  c.set(\"sessionId\", sessionId);\n\n  await next();\n\n  \u002F\u002F Save session\n  const updatedSession = c.get(\"session\");\n  if (Object.keys(updatedSession).length > 0) {\n    await redis.hset(`session:${sessionId}`, updatedSession);\n    await redis.expire(`session:${sessionId}`, 86400); \u002F\u002F 24h\n  }\n});\n```\n\n## Common Errors\n\n| Error | Cause | Fix |\n|-------|-------|-----|\n| `ECONNREFUSED` | Redis not running | Start Redis server |\n| `NOAUTH` | Authentication required | Provide password |\n| `WRONGTYPE` | Wrong data type | Check key type |\n| `OOM` | Out of memory | Configure maxmemory |\n\n## When to Load References\n\nLoad `references\u002Fclustering.md` when:\n- Redis Cluster setup\n- Sentinel configuration\n- High availability patterns\n\nLoad `references\u002Flua-scripts.md` when:\n- Custom Lua scripts\n- Atomic operations\n- Complex transactions\n",{"name":5,"license":15,"description":7},"main","c475fc64e94e803b50d14a791dfee8853fbb2c5c","integrations\u002Fclaude-skills-secondsky\u002Fplugins\u002Fbun\u002Fskills\u002Fbun-redis","https:\u002F\u002Fgithub.com\u002FElogic360\u002Fsoftware-factory","https:\u002F\u002Fgithub.com\u002FElogic360","2026-11-08 22:21:22",{"source":8,"skillName":5,"commands":31,"prompt":41,"zipAvailable":42},[32,35,38],{"tool":33,"command":34},"npx","npx skills add Elogic360\u002Fsoftware-factory --skill bun-redis",{"tool":36,"command":37},"bunx","bunx skills add Elogic360\u002Fsoftware-factory --skill bun-redis",{"tool":39,"command":40},"pnpm","pnpm dlx skills add Elogic360\u002Fsoftware-factory --skill bun-redis","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FElogic360\u002Fsoftware-factory\u002Fblob\u002Fmain\u002Fintegrations\u002Fclaude-skills-secondsky\u002Fplugins\u002Fbun\u002Fskills\u002Fbun-redis\u002FSKILL.md",true,[],[45,53,60,67,74,81],{"skillNo":46,"name":47,"nameZh":6,"description":48,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":49,"licenseFileUrl":6,"sourceHtmlUrl":50,"categories":51,"keywords":52,"publishedAt":19},"01M79G206MT3J6S0GY3C45P2KV","vss-summarize-video","Use to summarize a recorded video via the LVS summarization microservice (HITL-gated) with a VLM fallback. Not for report generation or live RTSP captioning.","Apache-2.0","https:\u002F\u002Fgithub.com\u002FElogic360\u002Fsoftware-factory\u002Fblob\u002Fmain\u002Fskills\u002Fnvidia\u002Fvss-summarize-video\u002FSKILL.md",[],[],{"skillNo":54,"name":55,"nameZh":6,"description":56,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":49,"licenseFileUrl":6,"sourceHtmlUrl":57,"categories":58,"keywords":59,"publishedAt":19},"01M79G1WN63PGRE8CKD47WEBQ5","vss-setup-video-analytics-api","Use to deploy the vss-video-analytics-api REST service standalone (config-source, data-log bind, Elasticsearch, optional Kafka). Not for full warehouse deploy.","https:\u002F\u002Fgithub.com\u002FElogic360\u002Fsoftware-factory\u002Fblob\u002Fmain\u002Fskills\u002Fnvidia\u002Fvss-setup-video-analytics-api\u002FSKILL.md",[],[],{"skillNo":61,"name":62,"nameZh":6,"description":63,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":49,"licenseFileUrl":6,"sourceHtmlUrl":64,"categories":65,"keywords":66,"publishedAt":19},"01M79G1S9F7VY3EF6H53PRP5AN","vss-setup-behavior-analytics","Use to deploy the vss-behavior-analytics service standalone (entrypoint, config-source, optional calibration). Not for the full warehouse deploy.","https:\u002F\u002Fgithub.com\u002FElogic360\u002Fsoftware-factory\u002Fblob\u002Fmain\u002Fskills\u002Fnvidia\u002Fvss-setup-behavior-analytics\u002FSKILL.md",[],[],{"skillNo":68,"name":69,"nameZh":6,"description":70,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":49,"licenseFileUrl":6,"sourceHtmlUrl":71,"categories":72,"keywords":73,"publishedAt":19},"01M79G1N1S1Y27PFZPYMNK1MTQ","vss-search-archive","Use this skill to run top-level VSS fusion search on archived video, or to ingest video files \u002F RTSP streams for search. Do NOT use for ad-hoc visual Q&A (use vss-ask-video), live captioning (use vss-deploy-dense-captioning), or video summarization and reports (use vss-summarize-video).","https:\u002F\u002Fgithub.com\u002FElogic360\u002Fsoftware-factory\u002Fblob\u002Fmain\u002Fskills\u002Fnvidia\u002Fvss-search-archive\u002FSKILL.md",[],[],{"skillNo":75,"name":76,"nameZh":6,"description":77,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":49,"licenseFileUrl":6,"sourceHtmlUrl":78,"categories":79,"keywords":80,"publishedAt":19},"01M79G1H6WN0Q6C0VCAXCZX6B7","vss-query-analytics","Use this skill when reading video-analytics metrics, incidents, alerts, and sensor data via the VA-MCP server (port 9901). Not for live VLM or incident-range narrative reports.","https:\u002F\u002Fgithub.com\u002FElogic360\u002Fsoftware-factory\u002Fblob\u002Fmain\u002Fskills\u002Fnvidia\u002Fvss-query-analytics\u002FSKILL.md",[],[],{"skillNo":82,"name":83,"nameZh":6,"description":84,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":49,"licenseFileUrl":6,"sourceHtmlUrl":85,"categories":86,"keywords":87,"publishedAt":19},"01M79G1DYPNXQS7QHZ0AAF5FX5","vss-manage-video-io-storage","Use to call the VIOS REST API (sensor list, timelines, clip extraction, snapshots, add\u002Fdelete sensors and streams). Not for VLM inference or search.","https:\u002F\u002Fgithub.com\u002FElogic360\u002Fsoftware-factory\u002Fblob\u002Fmain\u002Fskills\u002Fnvidia\u002Fvss-manage-video-io-storage\u002FSKILL.md",[],[]]