[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6ENVVR0DY29MMHT447ZV0T8":3,"skill-same:01M6ENVVR0DY29MMHT447ZV0T8":71},{"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":33,"linkOnly":34,"markdownContent":35,"markdownBody":36,"frontMatter":37,"refName":38,"commitSha":39,"skillDirectory":40,"forksCount":41,"repositoryHtmlUrl":42,"repositoryHomepageUrl":43,"ownerHtmlUrl":44,"ownerBlogUrl":6,"ownerDescription":45,"updatedAt":46,"install":47,"resources":60},"01M6ENVVR0DY29MMHT447ZV0T8","structured-logging",null,"Guide for writing effective log messages using wide events \u002F canonical log lines. Use when writing logging code, adding instrumentation, improving observability, or reviewing log statements. Teaches high-cardinality, high-dimensionality structured logging that enables debugging.","ComeOnOliver\u002Fskillshub","ComeOnOliver","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F43215937?v=4","01M6E5JNFECJAAVFE0W7SMWWD2","Haoran Shu","01M6E5JNNDQS7AJZDYFQ8TPZCK",66,"MIT","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fchemiseblanc\u002Fstructured-logging\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32],"logging","structured","structured logging","writing","debugging","code","observability","messages","guide","use","log","instrumentation","wide events","events","2026-11-10 10:12:30",false,"---\nname: structured-logging\ndescription: Guide for writing effective log messages using wide events \u002F canonical log lines. Use when writing logging code, adding instrumentation, improving observability, or reviewing log statements. Teaches high-cardinality, high-dimensionality structured logging that enables debugging.\n---\n\n# Structured Logging\n\n## Core Principle\n\nEmit **one wide event per request per service**, not scattered log statements.\n\n- Build context throughout the request lifecycle\n- Emit once at the end (in a finally block)\n- Optimize for **querying**, not writing\n- Include high-cardinality fields (user_id, request_id) that enable debugging\n- Include high-dimensionality (50+ fields) capturing full context\n\n## Anti-patterns\n\nAvoid these common mistakes:\n\n```\n\u002F\u002F String concatenation - loses structure\nlog(\"User \" + userId + \" payment failed: \" + error)\n\n\u002F\u002F Scattered statements - 17 lines for one request\nlog(\"Starting request\")\nlog(\"Validating token\")\nlog(\"Token valid\")\nlog(\"Fetching user\")\nlog(\"User found\")\nlog(\"Processing payment\")\nlog(\"Payment failed\")\n\n\u002F\u002F Low cardinality only - can't debug specific users\nlog({level: \"error\", message: \"Payment failed\"})\n\n\u002F\u002F Missing business context - no debugging power\nlog({user_id: \"123\", error: \"failed\"})\n```\n\n## Wide Event Structure\n\nOne comprehensive event per request:\n\n```json\n{\n  \"timestamp\": \"2025-01-15T10:23:45.612Z\",\n  \"level\": \"error\",\n\n  \"request_id\": \"req_8bf7ec2d\",\n  \"trace_id\": \"abc123\",\n  \"span_id\": \"span_456\",\n\n  \"service\": \"checkout-service\",\n  \"version\": \"2.4.1\",\n  \"deployment_id\": \"deploy_789\",\n  \"region\": \"us-east-1\",\n\n  \"method\": \"POST\",\n  \"path\": \"\u002Fapi\u002Fcheckout\",\n  \"status_code\": 500,\n  \"duration_ms\": 1247,\n\n  \"user\": {\n    \"id\": \"user_456\",\n    \"subscription\": \"premium\",\n    \"account_age_days\": 847,\n    \"lifetime_value_cents\": 284700\n  },\n\n  \"cart\": {\n    \"id\": \"cart_xyz\",\n    \"item_count\": 3,\n    \"total_cents\": 15999,\n    \"coupon_applied\": \"SAVE20\"\n  },\n\n  \"payment\": {\n    \"method\": \"card\",\n    \"provider\": \"stripe\",\n    \"latency_ms\": 1089,\n    \"attempt\": 3\n  },\n\n  \"error\": {\n    \"type\": \"PaymentError\",\n    \"code\": \"card_declined\",\n    \"message\": \"Card declined by issuer\",\n    \"retriable\": false,\n    \"stripe_decline_code\": \"insufficient_funds\"\n  },\n\n  \"feature_flags\": {\n    \"new_checkout_flow\": true,\n    \"express_payment\": false\n  },\n\n  \"timing\": {\n    \"db_query_ms\": 45,\n    \"external_api_ms\": 1089,\n    \"db_queries_count\": 3,\n    \"cache_hit\": false\n  }\n}\n```\n\nFor the comprehensive field reference, see [references\u002Fwide-event-fields.md](references\u002Fwide-event-fields.md).\n\n## Log Levels\n\nUse log levels to indicate severity and required action:\n\n| Level | When to Use | Examples |\n|-------|-------------|----------|\n| **ERROR** | Request failed, needs investigation | Unhandled exception, 5xx response, data corruption |\n| **WARN** | Degraded but recovered | Retry succeeded, fallback used, rate limit approaching, deprecated API called |\n| **INFO** | Normal request completion | The canonical log line for successful requests |\n| **DEBUG** | Detailed diagnostics | Cache lookups, query plans, intermediate state (usually sampled out in production) |\n\nThe wide event's `level` field reflects the worst outcome of the request:\n- Request succeeded normally: `info`\n- Request succeeded after retry\u002Ffallback: `warn`\n- Request failed: `error`\n\n## Examples\n\n### Bad: Scattered Logs\n\n```\nlog.info(\"Incoming request\", {path: \"\u002Fcheckout\"})\nlog.debug(\"Fetching user\")\nlog.debug(\"User found\", {user_id: \"123\"})\nlog.debug(\"Fetching cart\")\nlog.info(\"Processing payment\")\nlog.warn(\"Payment attempt 1 failed, retrying\")\nlog.warn(\"Payment attempt 2 failed, retrying\")\nlog.error(\"Payment failed after 3 attempts\")\n```\n\n### Good: Single Wide Event\n\n```\nlog.error({\n  request_id: \"req_abc\",\n  path: \"\u002Fcheckout\",\n  method: \"POST\",\n  status_code: 500,\n  duration_ms: 3200,\n  user: {id: \"123\", subscription: \"premium\"},\n  cart: {item_count: 3, total_cents: 15999},\n  payment: {\n    provider: \"stripe\",\n    attempts: 3,\n    latency_ms: 2800\n  },\n  error: {\n    type: \"PaymentError\",\n    code: \"card_declined\",\n    retriable: false\n  }\n})\n```\n\n### Bad: Missing Context\n\n```\nlog.error(\"Database query failed\", {error: \"timeout\"})\n```\n\n### Good: Full Context\n\n```\nlog.error({\n  request_id: \"req_xyz\",\n  user: {id: \"user_789\", subscription: \"enterprise\"},\n  operation: \"fetch_orders\",\n  database: {\n    host: \"db-prod-01\",\n    query_duration_ms: 30000,\n    timeout_ms: 30000,\n    table: \"orders\",\n    rows_scanned: 1500000\n  },\n  error: {\n    type: \"DatabaseError\",\n    code: \"QUERY_TIMEOUT\",\n    message: \"Query exceeded 30s timeout\",\n    retriable: true,\n    suggestion: \"Add index on orders.user_id or paginate results\"\n  }\n})\n```\n\n## Implementation Pattern\n\nBuild the event throughout the request, emit once at the end:\n\n```\nfunction loggingMiddleware(handler):\n    return function(request):\n        start_time = now()\n\n        \u002F\u002F Initialize wide event\n        event = {\n            request_id: request.id,\n            trace_id: request.trace_id,\n            timestamp: start_time,\n            method: request.method,\n            path: request.path,\n            service: SERVICE_NAME,\n            version: SERVICE_VERSION\n        }\n\n        \u002F\u002F Make event available to handlers\n        request.wide_event = event\n\n        try:\n            response = handler(request)\n            event.status_code = response.status\n            event.level = \"info\"\n            return response\n\n        catch error:\n            event.status_code = 500\n            event.level = \"error\"\n            event.error = {\n                type: error.name,\n                message: error.message,\n                code: error.code,\n                retriable: error.retriable ?? false\n            }\n            throw error\n\n        finally:\n            event.duration_ms = now() - start_time\n            logger.log(event)\n```\n\nIn handlers, enrich with business context:\n\n```\nfunction checkoutHandler(request):\n    event = request.wide_event\n\n    \u002F\u002F Add user context\n    user = getUser(request)\n    event.user = {\n        id: user.id,\n        subscription: user.tier,\n        account_age_days: daysSince(user.created_at),\n        lifetime_value_cents: user.ltv\n    }\n\n    \u002F\u002F Add business context\n    cart = getCart(user.id)\n    event.cart = {\n        id: cart.id,\n        item_count: cart.items.length,\n        total_cents: cart.total\n    }\n\n    \u002F\u002F Track timing for external calls\n    payment_start = now()\n    result = processPayment(cart)\n    event.payment = {\n        provider: \"stripe\",\n        latency_ms: now() - payment_start,\n        attempt: result.attempt_number\n    }\n\n    return response(result)\n```\n\n## Querying Power\n\nWide events enable queries that scattered logs cannot:\n\n```sql\n-- Find all checkout failures for premium users with new checkout flow\nSELECT * FROM logs\nWHERE path = '\u002Fcheckout'\n  AND status_code >= 500\n  AND user.subscription = 'premium'\n  AND feature_flags.new_checkout_flow = true\n  AND timestamp > now() - interval '1 hour'\n\n-- Analyze payment failures by error code and user tier\nSELECT\n  error.code,\n  user.subscription,\n  count(*) as failures,\n  avg(payment.latency_ms) as avg_latency\nFROM logs\nWHERE error.type = 'PaymentError'\nGROUP BY error.code, user.subscription\n\n-- Find slow requests for enterprise customers\nSELECT * FROM logs\nWHERE duration_ms > 2000\n  AND user.subscription = 'enterprise'\nORDER BY duration_ms DESC\n```\n","# Structured Logging\n\n## Core Principle\n\nEmit **one wide event per request per service**, not scattered log statements.\n\n- Build context throughout the request lifecycle\n- Emit once at the end (in a finally block)\n- Optimize for **querying**, not writing\n- Include high-cardinality fields (user_id, request_id) that enable debugging\n- Include high-dimensionality (50+ fields) capturing full context\n\n## Anti-patterns\n\nAvoid these common mistakes:\n\n```\n\u002F\u002F String concatenation - loses structure\nlog(\"User \" + userId + \" payment failed: \" + error)\n\n\u002F\u002F Scattered statements - 17 lines for one request\nlog(\"Starting request\")\nlog(\"Validating token\")\nlog(\"Token valid\")\nlog(\"Fetching user\")\nlog(\"User found\")\nlog(\"Processing payment\")\nlog(\"Payment failed\")\n\n\u002F\u002F Low cardinality only - can't debug specific users\nlog({level: \"error\", message: \"Payment failed\"})\n\n\u002F\u002F Missing business context - no debugging power\nlog({user_id: \"123\", error: \"failed\"})\n```\n\n## Wide Event Structure\n\nOne comprehensive event per request:\n\n```json\n{\n  \"timestamp\": \"2025-01-15T10:23:45.612Z\",\n  \"level\": \"error\",\n\n  \"request_id\": \"req_8bf7ec2d\",\n  \"trace_id\": \"abc123\",\n  \"span_id\": \"span_456\",\n\n  \"service\": \"checkout-service\",\n  \"version\": \"2.4.1\",\n  \"deployment_id\": \"deploy_789\",\n  \"region\": \"us-east-1\",\n\n  \"method\": \"POST\",\n  \"path\": \"\u002Fapi\u002Fcheckout\",\n  \"status_code\": 500,\n  \"duration_ms\": 1247,\n\n  \"user\": {\n    \"id\": \"user_456\",\n    \"subscription\": \"premium\",\n    \"account_age_days\": 847,\n    \"lifetime_value_cents\": 284700\n  },\n\n  \"cart\": {\n    \"id\": \"cart_xyz\",\n    \"item_count\": 3,\n    \"total_cents\": 15999,\n    \"coupon_applied\": \"SAVE20\"\n  },\n\n  \"payment\": {\n    \"method\": \"card\",\n    \"provider\": \"stripe\",\n    \"latency_ms\": 1089,\n    \"attempt\": 3\n  },\n\n  \"error\": {\n    \"type\": \"PaymentError\",\n    \"code\": \"card_declined\",\n    \"message\": \"Card declined by issuer\",\n    \"retriable\": false,\n    \"stripe_decline_code\": \"insufficient_funds\"\n  },\n\n  \"feature_flags\": {\n    \"new_checkout_flow\": true,\n    \"express_payment\": false\n  },\n\n  \"timing\": {\n    \"db_query_ms\": 45,\n    \"external_api_ms\": 1089,\n    \"db_queries_count\": 3,\n    \"cache_hit\": false\n  }\n}\n```\n\nFor the comprehensive field reference, see [references\u002Fwide-event-fields.md](references\u002Fwide-event-fields.md).\n\n## Log Levels\n\nUse log levels to indicate severity and required action:\n\n| Level | When to Use | Examples |\n|-------|-------------|----------|\n| **ERROR** | Request failed, needs investigation | Unhandled exception, 5xx response, data corruption |\n| **WARN** | Degraded but recovered | Retry succeeded, fallback used, rate limit approaching, deprecated API called |\n| **INFO** | Normal request completion | The canonical log line for successful requests |\n| **DEBUG** | Detailed diagnostics | Cache lookups, query plans, intermediate state (usually sampled out in production) |\n\nThe wide event's `level` field reflects the worst outcome of the request:\n- Request succeeded normally: `info`\n- Request succeeded after retry\u002Ffallback: `warn`\n- Request failed: `error`\n\n## Examples\n\n### Bad: Scattered Logs\n\n```\nlog.info(\"Incoming request\", {path: \"\u002Fcheckout\"})\nlog.debug(\"Fetching user\")\nlog.debug(\"User found\", {user_id: \"123\"})\nlog.debug(\"Fetching cart\")\nlog.info(\"Processing payment\")\nlog.warn(\"Payment attempt 1 failed, retrying\")\nlog.warn(\"Payment attempt 2 failed, retrying\")\nlog.error(\"Payment failed after 3 attempts\")\n```\n\n### Good: Single Wide Event\n\n```\nlog.error({\n  request_id: \"req_abc\",\n  path: \"\u002Fcheckout\",\n  method: \"POST\",\n  status_code: 500,\n  duration_ms: 3200,\n  user: {id: \"123\", subscription: \"premium\"},\n  cart: {item_count: 3, total_cents: 15999},\n  payment: {\n    provider: \"stripe\",\n    attempts: 3,\n    latency_ms: 2800\n  },\n  error: {\n    type: \"PaymentError\",\n    code: \"card_declined\",\n    retriable: false\n  }\n})\n```\n\n### Bad: Missing Context\n\n```\nlog.error(\"Database query failed\", {error: \"timeout\"})\n```\n\n### Good: Full Context\n\n```\nlog.error({\n  request_id: \"req_xyz\",\n  user: {id: \"user_789\", subscription: \"enterprise\"},\n  operation: \"fetch_orders\",\n  database: {\n    host: \"db-prod-01\",\n    query_duration_ms: 30000,\n    timeout_ms: 30000,\n    table: \"orders\",\n    rows_scanned: 1500000\n  },\n  error: {\n    type: \"DatabaseError\",\n    code: \"QUERY_TIMEOUT\",\n    message: \"Query exceeded 30s timeout\",\n    retriable: true,\n    suggestion: \"Add index on orders.user_id or paginate results\"\n  }\n})\n```\n\n## Implementation Pattern\n\nBuild the event throughout the request, emit once at the end:\n\n```\nfunction loggingMiddleware(handler):\n    return function(request):\n        start_time = now()\n\n        \u002F\u002F Initialize wide event\n        event = {\n            request_id: request.id,\n            trace_id: request.trace_id,\n            timestamp: start_time,\n            method: request.method,\n            path: request.path,\n            service: SERVICE_NAME,\n            version: SERVICE_VERSION\n        }\n\n        \u002F\u002F Make event available to handlers\n        request.wide_event = event\n\n        try:\n            response = handler(request)\n            event.status_code = response.status\n            event.level = \"info\"\n            return response\n\n        catch error:\n            event.status_code = 500\n            event.level = \"error\"\n            event.error = {\n                type: error.name,\n                message: error.message,\n                code: error.code,\n                retriable: error.retriable ?? false\n            }\n            throw error\n\n        finally:\n            event.duration_ms = now() - start_time\n            logger.log(event)\n```\n\nIn handlers, enrich with business context:\n\n```\nfunction checkoutHandler(request):\n    event = request.wide_event\n\n    \u002F\u002F Add user context\n    user = getUser(request)\n    event.user = {\n        id: user.id,\n        subscription: user.tier,\n        account_age_days: daysSince(user.created_at),\n        lifetime_value_cents: user.ltv\n    }\n\n    \u002F\u002F Add business context\n    cart = getCart(user.id)\n    event.cart = {\n        id: cart.id,\n        item_count: cart.items.length,\n        total_cents: cart.total\n    }\n\n    \u002F\u002F Track timing for external calls\n    payment_start = now()\n    result = processPayment(cart)\n    event.payment = {\n        provider: \"stripe\",\n        latency_ms: now() - payment_start,\n        attempt: result.attempt_number\n    }\n\n    return response(result)\n```\n\n## Querying Power\n\nWide events enable queries that scattered logs cannot:\n\n```sql\n-- Find all checkout failures for premium users with new checkout flow\nSELECT * FROM logs\nWHERE path = '\u002Fcheckout'\n  AND status_code >= 500\n  AND user.subscription = 'premium'\n  AND feature_flags.new_checkout_flow = true\n  AND timestamp > now() - interval '1 hour'\n\n-- Analyze payment failures by error code and user tier\nSELECT\n  error.code,\n  user.subscription,\n  count(*) as failures,\n  avg(payment.latency_ms) as avg_latency\nFROM logs\nWHERE error.type = 'PaymentError'\nGROUP BY error.code, user.subscription\n\n-- Find slow requests for enterprise customers\nSELECT * FROM logs\nWHERE duration_ms > 2000\n  AND user.subscription = 'enterprise'\nORDER BY duration_ms DESC\n```\n",{"name":5,"description":7},"main","def8531e65114c0fca8fb8551c1871ee0eed705c","skills\u002Faiskillstore\u002Fmarketplace\u002Fchemiseblanc\u002Fstructured-logging",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":8,"skillName":5,"commands":48,"prompt":58,"zipAvailable":59},[49,52,55],{"tool":50,"command":51},"npx","npx skills add ComeOnOliver\u002Fskillshub --skill structured-logging",{"tool":53,"command":54},"bunx","bunx skills add ComeOnOliver\u002Fskillshub --skill structured-logging",{"tool":56,"command":57},"pnpm","pnpm dlx skills add ComeOnOliver\u002Fskillshub --skill structured-logging","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fchemiseblanc\u002Fstructured-logging\u002FSKILL.md",true,[61,67],{"path":62,"resourceType":63,"resourceTypeDesc":64,"sizeBytes":65,"sourceHtmlUrl":66},"references\u002Fwide-event-fields.md","REFERENCE","参考文档",7088,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fchemiseblanc\u002Fstructured-logging\u002Freferences\u002Fwide-event-fields.md",{"path":68,"resourceType":63,"resourceTypeDesc":64,"sizeBytes":69,"sourceHtmlUrl":70},"skill-report.json",24401,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fchemiseblanc\u002Fstructured-logging\u002Fskill-report.json",[72,86,96,105,111,118],{"skillNo":73,"name":74,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":75,"categories":76,"keywords":82,"publishedAt":33},"01M6FKJN13GMG4KY57J3QD8GY5","model-hierarchy-skill","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzscole\u002Fmodel-hierarchy-skill\u002Fmodel-hierarchy-skill\u002FSKILL.md",[77],{"categoryNo":78,"categoryName":79,"taxonomyType":80,"taxonomyTypeDesc":81},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[83,84,85],"model","model hierarchy","model hierarchy skill",{"skillNo":87,"name":88,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":89,"categories":90,"keywords":92,"publishedAt":33},"01M6FKJJJ6GCAMR4PPPRD12M5X","zoom-mcp","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-mcp\u002FSKILL.md",[91],{"categoryNo":78,"categoryName":79,"taxonomyType":80,"taxonomyTypeDesc":81},[93,94,95],"MCP","zoom","zoom mcp",{"skillNo":97,"name":98,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":99,"categories":100,"keywords":101,"publishedAt":33},"01M6FKJE3KYT3KPEZMEEHYKA6K","zoom-apps-sdk","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-apps-sdk\u002FSKILL.md",[],[102,103,104,94],"sdk","zoom apps sdk","apps",{"skillNo":106,"name":107,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":108,"categories":109,"keywords":110,"publishedAt":33},"01M6FKJ9EDH9Q5VWDF8HAJRSP0","windows","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwindows\u002FSKILL.md",[],[107],{"skillNo":112,"name":113,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":114,"categories":115,"keywords":117,"publishedAt":33},"01M6FKJ666BEEFC3AE9GJ72Q93","whiteboard","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwhiteboard\u002FSKILL.md",[116],{"categoryNo":78,"categoryName":79,"taxonomyType":80,"taxonomyTypeDesc":81},[113],{"skillNo":119,"name":120,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":121,"categories":122,"keywords":123,"publishedAt":33},"01M6FKJ21WFCDGTJQ2Q91T9DVW","websockets","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwebsockets\u002FSKILL.md",[],[120]]