[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6AEAS01THK5JVHPVW4YXBPR":3,"skill-same:01M6AEAS01THK5JVHPVW4YXBPR":76},{"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":43,"linkOnly":44,"markdownContent":45,"markdownBody":46,"frontMatter":47,"refName":52,"commitSha":53,"skillDirectory":54,"forksCount":55,"repositoryHtmlUrl":56,"repositoryHomepageUrl":57,"ownerHtmlUrl":58,"ownerBlogUrl":59,"ownerDescription":60,"updatedAt":61,"install":62,"resources":75},"01M6AEAS01THK5JVHPVW4YXBPR","upstash-redis",null,"Use Redis over HTTP from serverless and edge runtimes with @upstash\u002Fredis, and add rate limiting with @upstash\u002Fratelimit. Use when the user mentions Upstash Redis, needs Redis from a Next.js route handler or middleware, Vercel, Cloudflare Workers, Deno, or Bun without TCP connection pooling, or wants cache-aside with TTLs, a session store, counters, or a 429 rate limiter using fixed window, sliding window, or token bucket. DO NOT use for self-hosted or TCP Redis clients (ioredis, node-redis), Redis Cluster administration, or vector similarity search.","github\u002Fawesome-copilot","github","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F9919?v=4","01M6AC83DS133TPXFSP1DHNCC6","GitHub","01M6AD3PBDYPK7NVFJNJ66Y8RS",41046,"MIT","https:\u002F\u002Fgithub.com\u002Fgithub\u002Fawesome-copilot\u002Fblob\u002Fmain\u002Fskills\u002Fupstash-redis\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42],"upstash","redis","upstash redis","route","when","rate","window","pooling","redis cluster","middleware","connection pooling","token","self","next","http","fetch","node","Similarity Search","edge","cache","tcp","vector","search","cloudflare","2026-11-10 10:12:30",false,"---\nname: upstash-redis\ndescription: >\n  Use Redis over HTTP from serverless and edge runtimes with @upstash\u002Fredis, and\n  add rate limiting with @upstash\u002Fratelimit. Use when the user mentions Upstash\n  Redis, needs Redis from a Next.js route handler or middleware, Vercel,\n  Cloudflare Workers, Deno, or Bun without TCP connection pooling, or wants\n  cache-aside with TTLs, a session store, counters, or a 429 rate limiter using\n  fixed window, sliding window, or token bucket. DO NOT use for self-hosted or\n  TCP Redis clients (ioredis, node-redis), Redis Cluster administration, or\n  vector similarity search.\nlicense: MIT\ncompatibility: \"@upstash\u002Fredis 1.x, @upstash\u002Fratelimit 2.x, Node.js 18+ or any runtime with global fetch\"\nmetadata:\n  author: Upstash\n---\n\n# Upstash Redis Skill\n\nThis skill covers the three things serverless apps most often need Redis for:\ncaching, sessions, and rate limiting. The client talks to Redis over HTTP, so\nit works where a long-lived TCP connection does not (edge middleware, short\nlived functions). Follow the steps in order; each ends with a checkpoint.\n\n## Requirements and limitations\n\n- An Upstash Redis database (hosted service; usage-based pricing with a free\n  tier). Credentials are a REST URL and token from the database page.\n- Environment variables `UPSTASH_REDIS_REST_URL` and `UPSTASH_REDIS_REST_TOKEN`.\n- Every command is an HTTP request. Batch with `pipeline()` or `MGET`\u002F`MSET`\n  when you issue many commands per request; avoid `KEYS *` in production.\n- Values are serialized automatically (objects, arrays, numbers round-trip).\n  Do not `JSON.stringify` before `set` or `parseInt` after `get`.\n\n## Step 1 — Install and create one client per module\n\n```bash\nnpm install @upstash\u002Fredis @upstash\u002Fratelimit\n```\n\n```ts\n\u002F\u002F lib\u002Fredis.ts\nimport { Redis } from \"@upstash\u002Fredis\";\n\n\u002F\u002F Reads UPSTASH_REDIS_REST_URL and UPSTASH_REDIS_REST_TOKEN\nexport const redis = Redis.fromEnv();\n```\n\nCreate the client at module scope, not inside the request handler, so\nephemeral caches and pipelines can be reused across invocations.\n\n> **Checkpoint**: `await redis.ping()` returns `\"PONG\"`.\n\n## Step 2 — Cache-aside with TTL\n\n```ts\nimport { redis } from \"@\u002Flib\u002Fredis\";\n\ntype User = { id: string; name: string; plan: \"free\" | \"pro\" };\n\nexport async function getUser(userId: string): Promise\u003CUser | null> {\n  const key = `user:${userId}`;\n  const cached = await redis.get\u003CUser>(key);\n  if (cached) return cached;\n\n  const user = await db.users.findById(userId); \u002F\u002F your data source\n  if (user) await redis.set(key, user, { ex: 3600 }); \u002F\u002F 1 hour TTL\n  return user;\n}\n\nexport async function updateUser(userId: string, patch: Partial\u003CUser>) {\n  const user = await db.users.update(userId, patch);\n  await redis.set(`user:${userId}`, user, { ex: 3600 }); \u002F\u002F write-through\n  return user;\n}\n\nexport async function deleteUser(userId: string) {\n  await db.users.delete(userId);\n  await redis.del(`user:${userId}`); \u002F\u002F invalidate\n}\n```\n\nAlways set a TTL on cache entries; namespace keys (`user:123`, `session:abc`).\n\n> **Checkpoint**: second call to `getUser` returns without hitting the database\n> and `await redis.ttl(\"user:123\")` is positive.\n\n## Step 3 — Sessions with sliding expiration\n\n```ts\nimport { redis } from \"@\u002Flib\u002Fredis\";\n\nconst SESSION_TTL = 60 * 60 * 24; \u002F\u002F 24 hours\n\nexport async function createSession(userId: string, data: Record\u003Cstring, unknown>) {\n  const sessionId = crypto.randomUUID();\n  await redis.set(`session:${sessionId}`, { userId, ...data, createdAt: Date.now() }, { ex: SESSION_TTL });\n  return sessionId;\n}\n\nexport async function getSession\u003CT = Record\u003Cstring, unknown>>(sessionId: string) {\n  const session = await redis.get\u003CT>(`session:${sessionId}`);\n  if (session) await redis.expire(`session:${sessionId}`, SESSION_TTL); \u002F\u002F slide\n  return session;\n}\n\nexport async function destroySession(sessionId: string) {\n  await redis.del(`session:${sessionId}`);\n}\n```\n\nStore the session id in an `HttpOnly; Secure; SameSite` cookie; never put the\nRedis token in client code.\n\n> **Checkpoint**: `getSession` after `createSession` returns the object with\n> `userId`; after `destroySession` it returns `null`.\n\n## Step 4 — Rate limiting a route handler\n\n```ts\n\u002F\u002F app\u002Fapi\u002Fsearch\u002Froute.ts (Next.js App Router; same pattern for any fetch handler)\nimport { Ratelimit } from \"@upstash\u002Fratelimit\";\nimport { Redis } from \"@upstash\u002Fredis\";\n\nconst ratelimit = new Ratelimit({\n  redis: Redis.fromEnv(),\n  limiter: Ratelimit.slidingWindow(10, \"10 s\"), \u002F\u002F 10 requests per 10 seconds\n  prefix: \"ratelimit:search\", \u002F\u002F isolate keys per limiter\n});\n\nexport async function POST(request: Request) {\n  const ip = request.headers.get(\"x-forwarded-for\")?.split(\",\")[0]?.trim() ?? \"anonymous\";\n  const { success, limit, remaining, reset } = await ratelimit.limit(ip);\n\n  if (!success) {\n    return new Response(\"Too Many Requests\", {\n      status: 429,\n      headers: {\n        \"X-RateLimit-Limit\": String(limit),\n        \"X-RateLimit-Remaining\": String(remaining),\n        \"Retry-After\": String(Math.max(0, Math.ceil((reset - Date.now()) \u002F 1000))),\n      },\n    });\n  }\n\n  \u002F\u002F handle the request\n  return Response.json({ ok: true });\n}\n```\n\n- Identifier: use the user id or API key when authenticated; fall back to IP.\n- Algorithms: `Ratelimit.fixedWindow(n, \"1 m\")` (cheapest), `slidingWindow`\n  (smooth boundaries, default choice), `tokenBucket(refill, \"10 s\", max)`\n  (allows bursts). Windows accept `ms`, `s`, `m`, `h`, `d`.\n- Tiers: create one `Ratelimit` per tier with different `prefix` values.\n- Edge middleware \u002F Cloudflare Workers with `analytics: true`: the result has a\n  `pending` promise; pass it to `context.waitUntil(pending)` so background work\n  finishes before the runtime exits.\n- `reset` is a Unix timestamp in milliseconds.\n\n> **Checkpoint**: the 11th request within 10 seconds returns 429 with a\n> `Retry-After` header; after the window it succeeds again.\n\n## Common pitfalls\n\n- **Creating clients inside handlers**: the limiter's in-memory\n  `ephemeralCache` only helps when the instance outlives the request.\n- **Manual JSON**: `redis.set(\"k\", JSON.stringify(v))` then `redis.get` returns\n  an already-parsed object; double parsing throws.\n- **No TTL on cache keys**: memory grows until eviction; always pass `{ ex }`.\n- **Trusting `x-forwarded-for` blindly**: take the first hop, or use the\n  platform's IP helper, when behind a proxy.\n- **Forgetting `pending`** on edge runtimes with analytics or multi-region\n  limiters.\n\n## When NOT to use this skill\n\n- Long-running servers with a TCP Redis connection already in place: keep\n  ioredis\u002Fnode-redis.\n- Vector search or RAG: use a vector database skill instead.\n- Sub-millisecond, in-process caching: use an in-memory LRU.\n\n## References\n\n- https:\u002F\u002Fupstash.com\u002Fdocs\u002Fredis\u002Fsdks\u002Fts\u002Foverview\n- https:\u002F\u002Fupstash.com\u002Fdocs\u002Fredis\u002Fsdks\u002Fratelimit-ts\u002Foverview\n- https:\u002F\u002Fgithub.com\u002Fupstash\u002Fredis-js\n- https:\u002F\u002Fgithub.com\u002Fupstash\u002Fratelimit-js\n","# Upstash Redis Skill\n\nThis skill covers the three things serverless apps most often need Redis for:\ncaching, sessions, and rate limiting. The client talks to Redis over HTTP, so\nit works where a long-lived TCP connection does not (edge middleware, short\nlived functions). Follow the steps in order; each ends with a checkpoint.\n\n## Requirements and limitations\n\n- An Upstash Redis database (hosted service; usage-based pricing with a free\n  tier). Credentials are a REST URL and token from the database page.\n- Environment variables `UPSTASH_REDIS_REST_URL` and `UPSTASH_REDIS_REST_TOKEN`.\n- Every command is an HTTP request. Batch with `pipeline()` or `MGET`\u002F`MSET`\n  when you issue many commands per request; avoid `KEYS *` in production.\n- Values are serialized automatically (objects, arrays, numbers round-trip).\n  Do not `JSON.stringify` before `set` or `parseInt` after `get`.\n\n## Step 1 — Install and create one client per module\n\n```bash\nnpm install @upstash\u002Fredis @upstash\u002Fratelimit\n```\n\n```ts\n\u002F\u002F lib\u002Fredis.ts\nimport { Redis } from \"@upstash\u002Fredis\";\n\n\u002F\u002F Reads UPSTASH_REDIS_REST_URL and UPSTASH_REDIS_REST_TOKEN\nexport const redis = Redis.fromEnv();\n```\n\nCreate the client at module scope, not inside the request handler, so\nephemeral caches and pipelines can be reused across invocations.\n\n> **Checkpoint**: `await redis.ping()` returns `\"PONG\"`.\n\n## Step 2 — Cache-aside with TTL\n\n```ts\nimport { redis } from \"@\u002Flib\u002Fredis\";\n\ntype User = { id: string; name: string; plan: \"free\" | \"pro\" };\n\nexport async function getUser(userId: string): Promise\u003CUser | null> {\n  const key = `user:${userId}`;\n  const cached = await redis.get\u003CUser>(key);\n  if (cached) return cached;\n\n  const user = await db.users.findById(userId); \u002F\u002F your data source\n  if (user) await redis.set(key, user, { ex: 3600 }); \u002F\u002F 1 hour TTL\n  return user;\n}\n\nexport async function updateUser(userId: string, patch: Partial\u003CUser>) {\n  const user = await db.users.update(userId, patch);\n  await redis.set(`user:${userId}`, user, { ex: 3600 }); \u002F\u002F write-through\n  return user;\n}\n\nexport async function deleteUser(userId: string) {\n  await db.users.delete(userId);\n  await redis.del(`user:${userId}`); \u002F\u002F invalidate\n}\n```\n\nAlways set a TTL on cache entries; namespace keys (`user:123`, `session:abc`).\n\n> **Checkpoint**: second call to `getUser` returns without hitting the database\n> and `await redis.ttl(\"user:123\")` is positive.\n\n## Step 3 — Sessions with sliding expiration\n\n```ts\nimport { redis } from \"@\u002Flib\u002Fredis\";\n\nconst SESSION_TTL = 60 * 60 * 24; \u002F\u002F 24 hours\n\nexport async function createSession(userId: string, data: Record\u003Cstring, unknown>) {\n  const sessionId = crypto.randomUUID();\n  await redis.set(`session:${sessionId}`, { userId, ...data, createdAt: Date.now() }, { ex: SESSION_TTL });\n  return sessionId;\n}\n\nexport async function getSession\u003CT = Record\u003Cstring, unknown>>(sessionId: string) {\n  const session = await redis.get\u003CT>(`session:${sessionId}`);\n  if (session) await redis.expire(`session:${sessionId}`, SESSION_TTL); \u002F\u002F slide\n  return session;\n}\n\nexport async function destroySession(sessionId: string) {\n  await redis.del(`session:${sessionId}`);\n}\n```\n\nStore the session id in an `HttpOnly; Secure; SameSite` cookie; never put the\nRedis token in client code.\n\n> **Checkpoint**: `getSession` after `createSession` returns the object with\n> `userId`; after `destroySession` it returns `null`.\n\n## Step 4 — Rate limiting a route handler\n\n```ts\n\u002F\u002F app\u002Fapi\u002Fsearch\u002Froute.ts (Next.js App Router; same pattern for any fetch handler)\nimport { Ratelimit } from \"@upstash\u002Fratelimit\";\nimport { Redis } from \"@upstash\u002Fredis\";\n\nconst ratelimit = new Ratelimit({\n  redis: Redis.fromEnv(),\n  limiter: Ratelimit.slidingWindow(10, \"10 s\"), \u002F\u002F 10 requests per 10 seconds\n  prefix: \"ratelimit:search\", \u002F\u002F isolate keys per limiter\n});\n\nexport async function POST(request: Request) {\n  const ip = request.headers.get(\"x-forwarded-for\")?.split(\",\")[0]?.trim() ?? \"anonymous\";\n  const { success, limit, remaining, reset } = await ratelimit.limit(ip);\n\n  if (!success) {\n    return new Response(\"Too Many Requests\", {\n      status: 429,\n      headers: {\n        \"X-RateLimit-Limit\": String(limit),\n        \"X-RateLimit-Remaining\": String(remaining),\n        \"Retry-After\": String(Math.max(0, Math.ceil((reset - Date.now()) \u002F 1000))),\n      },\n    });\n  }\n\n  \u002F\u002F handle the request\n  return Response.json({ ok: true });\n}\n```\n\n- Identifier: use the user id or API key when authenticated; fall back to IP.\n- Algorithms: `Ratelimit.fixedWindow(n, \"1 m\")` (cheapest), `slidingWindow`\n  (smooth boundaries, default choice), `tokenBucket(refill, \"10 s\", max)`\n  (allows bursts). Windows accept `ms`, `s`, `m`, `h`, `d`.\n- Tiers: create one `Ratelimit` per tier with different `prefix` values.\n- Edge middleware \u002F Cloudflare Workers with `analytics: true`: the result has a\n  `pending` promise; pass it to `context.waitUntil(pending)` so background work\n  finishes before the runtime exits.\n- `reset` is a Unix timestamp in milliseconds.\n\n> **Checkpoint**: the 11th request within 10 seconds returns 429 with a\n> `Retry-After` header; after the window it succeeds again.\n\n## Common pitfalls\n\n- **Creating clients inside handlers**: the limiter's in-memory\n  `ephemeralCache` only helps when the instance outlives the request.\n- **Manual JSON**: `redis.set(\"k\", JSON.stringify(v))` then `redis.get` returns\n  an already-parsed object; double parsing throws.\n- **No TTL on cache keys**: memory grows until eviction; always pass `{ ex }`.\n- **Trusting `x-forwarded-for` blindly**: take the first hop, or use the\n  platform's IP helper, when behind a proxy.\n- **Forgetting `pending`** on edge runtimes with analytics or multi-region\n  limiters.\n\n## When NOT to use this skill\n\n- Long-running servers with a TCP Redis connection already in place: keep\n  ioredis\u002Fnode-redis.\n- Vector search or RAG: use a vector database skill instead.\n- Sub-millisecond, in-process caching: use an in-memory LRU.\n\n## References\n\n- https:\u002F\u002Fupstash.com\u002Fdocs\u002Fredis\u002Fsdks\u002Fts\u002Foverview\n- https:\u002F\u002Fupstash.com\u002Fdocs\u002Fredis\u002Fsdks\u002Fratelimit-ts\u002Foverview\n- https:\u002F\u002Fgithub.com\u002Fupstash\u002Fredis-js\n- https:\u002F\u002Fgithub.com\u002Fupstash\u002Fratelimit-js\n",{"name":5,"license":15,"metadata":48,"description":50,"compatibility":51},{"author":49},"Upstash","Use Redis over HTTP from serverless and edge runtimes with @upstash\u002Fredis, and add rate limiting with @upstash\u002Fratelimit. Use when the user mentions Upstash Redis, needs Redis from a Next.js route handler or middleware, Vercel, Cloudflare Workers, Deno, or Bun without TCP connection pooling, or wants cache-aside with TTLs, a session store, counters, or a 429 rate limiter using fixed window, sliding window, or token bucket. DO NOT use for self-hosted or TCP Redis clients (ioredis, node-redis), Redis Cluster administration, or vector similarity search.\n","@upstash\u002Fredis 1.x, @upstash\u002Fratelimit 2.x, Node.js 18+ or any runtime with global fetch","main","5269f7ea2d6c3a9bfda5ed878b6726cf509121fd","skills\u002Fupstash-redis",5340,"https:\u002F\u002Fgithub.com\u002Fgithub\u002Fawesome-copilot","https:\u002F\u002Fawesome-copilot.github.com\u002F","https:\u002F\u002Fgithub.com\u002Fgithub","https:\u002F\u002Fgithub.com\u002Fabout","How people build software.","2026-11-11 13:41:32",{"source":8,"skillName":5,"commands":63,"prompt":73,"zipAvailable":74},[64,67,70],{"tool":65,"command":66},"npx","npx skills add github\u002Fawesome-copilot --skill upstash-redis",{"tool":68,"command":69},"bunx","bunx skills add github\u002Fawesome-copilot --skill upstash-redis",{"tool":71,"command":72},"pnpm","pnpm dlx skills add github\u002Fawesome-copilot --skill upstash-redis","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fgithub\u002Fawesome-copilot\u002Fblob\u002Fmain\u002Fskills\u002Fupstash-redis\u002FSKILL.md",true,[],[77,111,139,169,202,219],{"skillNo":78,"name":79,"nameZh":6,"description":80,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":81,"categories":82,"keywords":91,"publishedAt":43},"01M70KXZNX9ES38N2A8M58ZZMZ","supabase-rls-policies","Write, review, and test Supabase Row Level Security (RLS) policies so that one user cannot read or change another user's rows. Use when creating or changing tables, policies, views, or security definer functions in a Supabase project, when reviewing a migration that touches RLS, or when asked to prove user isolation with pgTAP tests that sign in as two users.","https:\u002F\u002Fgithub.com\u002Fgithub\u002Fawesome-copilot\u002Fblob\u002Fmain\u002Fskills\u002Fsupabase-rls-policies\u002FSKILL.md",[83,88],{"categoryNo":84,"categoryName":85,"taxonomyType":86,"taxonomyTypeDesc":87},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",{"categoryNo":89,"categoryName":90,"taxonomyType":86,"taxonomyTypeDesc":87},"01JBSEEDCAT000000000000023","Skill与智能体开发",[92,93,94,95,96,23,97,98,99,100,101,102,103,104,105,106,107,108,109,110],"supabase","rls","supabase rls","supabase rls policies","project","review","change","read","write","security","isolation","tables","as","tests","prove","use","users","functions","with",{"skillNo":112,"name":113,"nameZh":6,"description":114,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":115,"categories":116,"keywords":118,"publishedAt":43},"01M70KWA5YWXDV6V8DZ19E3T2Y","skill-distribution-audit","Audit a skill collection before release or investigate installer omissions, archived\u002Ftemplate leakage, duplicate identities, and manifest drift. Reconcile the intended public source set, distribution manifest, and actual discovery output for a specified consumer version. Includes a deterministic set-comparison helper.","https:\u002F\u002Fgithub.com\u002Fgithub\u002Fawesome-copilot\u002Fblob\u002Fmain\u002Fskills\u002Fskill-distribution-audit\u002FSKILL.md",[117],{"categoryNo":89,"categoryName":90,"taxonomyType":86,"taxonomyTypeDesc":87},[119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138],"distribution","skill distribution audit","audit","SET","deterministic","installer","for","discovery","comparison","helper","manifest","version","collection","drift","output","investigate","duplicate","template","release","reconcile",{"skillNo":140,"name":141,"nameZh":6,"description":142,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":143,"sourceHtmlUrl":144,"categories":145,"keywords":151,"publishedAt":43},"01M70KCJPFVW7PPQ49CC5R8JGK","logicapps-custom-code-net10-migration","Migrate Azure Logic Apps Standard local-function custom-code projects from .NET 8 to .NET 10. Use for legacy Logic Apps custom-code workspace upgrades, project\u002Fpackage configuration, custom-worker settings, publication, and integrated VS Code debugging. Not for ordinary .NET applications, standalone Azure Functions, Consumption workflows, or cloud deployment.","https:\u002F\u002Fgithub.com\u002Fgithub\u002Fawesome-copilot\u002Fblob\u002Fmain\u002Fskills\u002Flogicapps-custom-code-net10-migration\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fgithub\u002Fawesome-copilot\u002Fblob\u002Fmain\u002Fskills\u002Flogicapps-custom-code-net10-migration\u002FSKILL.md",[146],{"categoryNo":147,"categoryName":148,"taxonomyType":149,"taxonomyTypeDesc":150},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[152,153,154,155,156,157,125,96,158,159,160,161,162,163,164,107,165,166,167,168],"custom","code","logicapps custom code net10 migration","migration","projects","standalone","deployment","applications","local","azure","worker","upgrades","package","apps","Legacy","debugging","workflows",{"skillNo":170,"name":171,"nameZh":6,"description":172,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":173,"sourceHtmlUrl":174,"categories":175,"keywords":180,"publishedAt":43},"01M6AEBN37RQMXJ3298PEY7PG1","winmd-api-search","Find and explore Windows desktop APIs. Use when building features that need platform capabilities — camera, file access, notifications, UI controls, AI\u002FML, sensors, networking, etc. Discovers the right API for a task and retrieves full type details (methods, properties, events, enumeration values).","https:\u002F\u002Fgithub.com\u002Fgithub\u002Fawesome-copilot\u002Fblob\u002Fmain\u002Fskills\u002Fwinmd-api-search\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Fgithub\u002Fawesome-copilot\u002Fblob\u002Fmain\u002Fskills\u002Fwinmd-api-search\u002FSKILL.md",[176,179],{"categoryNo":177,"categoryName":178,"taxonomyType":86,"taxonomyTypeDesc":87},"01JBSEEDCAT000000000000010","后端与接口",{"categoryNo":147,"categoryName":148,"taxonomyType":149,"taxonomyTypeDesc":150},[181,41,182,183,184,185,186,187,188,189,190,191,192,193,194,23,195,196,197,198,199,125,200,201],"winmd api search","api","windows","desktop","file access","enumeration","ui","ml","file","networking","capabilities","notifications","explore","access","features","full","camera","events","platform","methods","controls",{"skillNo":203,"name":204,"nameZh":6,"description":205,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":206,"licenseFileUrl":207,"sourceHtmlUrl":208,"categories":209,"keywords":215,"publishedAt":43},"01M6AE571R3SC1ZGE202B3NB5S","resemble-detect","Deepfake detection and media safety — detect AI-generated audio, images, video, and text, trace synthesis sources, apply watermarks, verify speaker identity, and analyze media intelligence using Resemble AI","Apache-2.0","https:\u002F\u002Fgithub.com\u002Fgithub\u002Fawesome-copilot\u002Fblob\u002Fmain\u002Fskills\u002Fresemble-detect\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fgithub\u002Fawesome-copilot\u002Fblob\u002Fmain\u002Fskills\u002Fresemble-detect\u002FSKILL.md",[210,211,214],{"categoryNo":177,"categoryName":178,"taxonomyType":86,"taxonomyTypeDesc":87},{"categoryNo":212,"categoryName":213,"taxonomyType":86,"taxonomyTypeDesc":87},"01JBSEEDCAT000000000000016","图像与多媒体",{"categoryNo":89,"categoryName":90,"taxonomyType":86,"taxonomyTypeDesc":87},[216,122,189,217,218],"resemble detect","https","identity",{"skillNo":220,"name":221,"nameZh":6,"description":222,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":206,"licenseFileUrl":223,"sourceHtmlUrl":224,"categories":225,"keywords":230,"publishedAt":43},"01M6AE30BSK2HCY4TQQ22Z8JRD","quality-playbook","Run a complete quality engineering audit on any codebase. Derives behavioral requirements from the code, generates spec-traced functional tests, runs a three-pass code review with regression tests, executes a multi-model spec audit (Council of Three), and produces a consolidated bug report with TDD-verified patches. Finds the 35% of real defects that structural code review alone cannot catch. Works with any language. Trigger on 'quality playbook', 'spec audit', 'Council of Three', 'fitness-to-purpose', or 'coverage theater'.","https:\u002F\u002Fgithub.com\u002Fgithub\u002Fawesome-copilot\u002Fblob\u002Fmain\u002Fskills\u002Fquality-playbook\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Fgithub\u002Fawesome-copilot\u002Fblob\u002Fmain\u002Fskills\u002Fquality-playbook\u002FSKILL.md",[226,229],{"categoryNo":227,"categoryName":228,"taxonomyType":86,"taxonomyTypeDesc":87},"01JBSEEDCAT000000000000007","代码审查",{"categoryNo":89,"categoryName":90,"taxonomyType":86,"taxonomyTypeDesc":87},[231,232,233,234,153,97,9,121,235,236,217,237,238,239,240,241,242,243,244,245,246,247,105,248,249,250,251],"playbook","quality playbook","quality","code review","tdd","run","report","spec","bug report","council","engineering","functional","spec audit","bug","verified","multi-model","three","coverage","model","regression","structural"]