[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6CZKG6XDX7DPTGDH4CPNWSK":3,"skill-same:01M6CZKG6XDX7DPTGDH4CPNWSK":54},{"skillNo":4,"name":5,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":6,"repositoryNo":11,"starsCount":12,"licenseSpdxId":13,"licenseFileUrl":6,"sourceHtmlUrl":14,"categories":15,"keywords":16,"publishedAt":19,"linkOnly":20,"markdownContent":21,"markdownBody":21,"frontMatter":22,"refName":23,"commitSha":24,"skillDirectory":25,"forksCount":26,"repositoryHtmlUrl":27,"repositoryHomepageUrl":6,"ownerHtmlUrl":28,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":29,"install":30,"resources":43},"01M6CZKG6XDX7DPTGDH4CPNWSK","workleap-logging",null,"Testing-itay\u002FDevTools-Security-Lab","Testing-itay","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F230151326?v=4","01M6CZH4Q5Z571N5ZRZWMQ3YBS","01M6CZH4W55EHV4P1D3SNNRXSS",0,"MIT","https:\u002F\u002Fgithub.com\u002FTesting-itay\u002FDevTools-Security-Lab\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fworkleap-logging\u002FSKILL.md",[],[17,18],"logging","workleap logging","2026-11-10 10:12:30",false,"\n\n\n\n---\nname: workleap-logging\ndescription: |\n  Guide for @workleap\u002Flogging, a structured logging library for Workleap frontend TypeScript applications.\n\n  Use this skill when:\n  (1) Setting up or configuring @workleap\u002Flogging loggers (BrowserConsoleLogger, CompositeLogger)\n  (2) Using @workleap\u002Flogging API: log levels, chained segments, scopes, styled output\n  (3) Composing or filtering loggers for multi-destination logging (LogRocket, telemetry)\n  (4) Working with Squide's useLogger hook alongside @workleap\u002Flogging\n  (5) Reviewing PRs or troubleshooting logging code in Workleap TypeScript projects\n\n  This skill also applies when the user discusses frontend logging, console logging, or structured logging in a Workleap context without naming the package directly.\nmetadata:\n  version: 1.3\n---\n\n# Workleap Logging (@workleap\u002Flogging)\n\nA structured logging library for Workleap frontend applications. Provides composable, styled console logging with support for scopes, multiple log levels, and integration with telemetry tools.\n\nThe library exports four key types: `Logger` (base interface), `RootLogger` (extends Logger with scope support), `BrowserConsoleLogger`, and `CompositeLogger`.\n\n## Installation\n\n```bash\npnpm add @workleap\u002Flogging\n```\n\n## Core Concepts\n\n### Loggers\n- **BrowserConsoleLogger**: Outputs to browser console with styling support\n- **CompositeLogger**: Forwards logs to multiple underlying loggers\n- **createCompositeLogger(verbose, loggers)**: Factory function that creates a `CompositeLogger`. When `verbose` is `true` and no loggers are provided, it adds a `BrowserConsoleLogger`; otherwise it uses only the loggers you pass (an empty list produces no output). See `references\u002Fapi.md` for details.\n\n### Log Levels (lowest to highest severity)\n1. `debug` - Detailed diagnostic info for development\n2. `information` - General application flow events\n3. `warning` - Non-critical issues needing attention\n4. `error` - Failures that prevent functionality from completing (triggers alerting in production)\n5. `critical` - Severe errors risking data integrity\n\n### Scopes\n\nScopes buffer log entries in memory and output them as a grouped block when `.end()` is called. This makes it easier to trace multi-step operations in noisy console output.\n\n```ts\nconst scope = logger.startScope(\"User signup\");\nscope.debug(\"Validating...\");\nscope.information(\"Signup complete\");\nscope.end();\n```\n\nThe `Logger` interface doesn't expose `startScope` because scoping is a root-level concern. When using Squide's `useLogger()`, the return type is `Logger`, so cast to `RootLogger` to access scope methods:\n\n```ts\nimport { useLogger } from \"@squide\u002Ffirefly\";\nimport type { RootLogger } from \"@workleap\u002Flogging\";\n\nconst logger = useLogger();\n(logger as RootLogger).startScope(\"User signup\");\n```\n\n## Chained Segments\n\nBuild complex log entries by chaining segments. A chain without a terminal log level method (`.debug()`, `.error()`, etc.) silently produces no output — this is the most common source of missing logs.\n\n```ts\nlogger\n    .withText(\"Processing order\")\n    .withObject({ orderId: 123 })\n    .withError(new Error(\"Failed\"))\n    .error();\n\u002F\u002F Output: [error] Processing order { orderId: 123 } Error: Failed\n```\n\n## Common Pitfalls\n\n1. **Forgetting the terminal log method**: Chained segments without `.debug()`, `.error()`, etc. silently produce no output.\n2. **Not ending scopes**: Scoped entries are buffered in memory and only flushed to the console when `.end()` is called. Without it, the logs are silently lost.\n3. **Using `warning` for failures**: Reserve `error` for failures — `warning` is for non-critical issues. This distinction matters because production alerting and log filtering depend on accurate severity.\n4. **Logging sensitive data**: Log entries may appear in LogRocket session replays and browser dev tools, so including credentials or PII creates compliance and security exposure.\n5. **Missing error context**: Without `withObject()` for relevant data and `withError()` for exceptions, error logs lack the information needed to reproduce issues in production.\n\n## Reference Guide\n\n- **`references\u002Fapi.md`** — Read when you need constructor signatures, the full method list (styled text, line breaks, withObject, withError), scope lifecycle API, or createCompositeLogger details.\n- **`references\u002Fpatterns.md`** — Read when setting up a logger from scratch, integrating with LogRocket, implementing scoped logging for features\u002Foperations, or conducting a PR review of logging code.",{},"main","1188d0dcbd4e64256d35bfe14c955ba1c541b1de",".claude\u002Fskills\u002Fworkleap-logging",13,"https:\u002F\u002Fgithub.com\u002FTesting-itay\u002FDevTools-Security-Lab","https:\u002F\u002Fgithub.com\u002FTesting-itay","2026-10-16 16:13:27",{"source":7,"skillName":5,"commands":31,"prompt":41,"zipAvailable":42},[32,35,38],{"tool":33,"command":34},"npx","npx skills add Testing-itay\u002FDevTools-Security-Lab --skill workleap-logging",{"tool":36,"command":37},"bunx","bunx skills add Testing-itay\u002FDevTools-Security-Lab --skill workleap-logging",{"tool":39,"command":40},"pnpm","pnpm dlx skills add Testing-itay\u002FDevTools-Security-Lab --skill workleap-logging","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FTesting-itay\u002FDevTools-Security-Lab\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fworkleap-logging\u002FSKILL.md",true,[44,50],{"path":45,"resourceType":46,"resourceTypeDesc":47,"sizeBytes":48,"sourceHtmlUrl":49},"references\u002Fapi.md","REFERENCE","参考文档",2930,"https:\u002F\u002Fgithub.com\u002FTesting-itay\u002FDevTools-Security-Lab\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fworkleap-logging\u002Freferences\u002Fapi.md",{"path":51,"resourceType":46,"resourceTypeDesc":47,"sizeBytes":52,"sourceHtmlUrl":53},"references\u002Fpatterns.md",3011,"https:\u002F\u002Fgithub.com\u002FTesting-itay\u002FDevTools-Security-Lab\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fworkleap-logging\u002Freferences\u002Fpatterns.md",[55,64,73,82,91,96],{"skillNo":56,"name":57,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":6,"repositoryNo":11,"starsCount":12,"licenseSpdxId":13,"licenseFileUrl":6,"sourceHtmlUrl":58,"categories":59,"keywords":60,"publishedAt":19},"01M6CZR9VVRMS754ZKH7NPNMB1","sds-plugin-a11y-check","https:\u002F\u002Fgithub.com\u002FTesting-itay\u002FDevTools-Security-Lab\u002Fblob\u002Fmain\u002Fsrc\u002FnewDIR\u002Fbundles\u002Fplugins\u002Fsds-frontend-plugin\u002Fskills\u002Fsds-plugin-a11y-check\u002FSKILL.md",[],[61,62,63],"sds plugin a11y check","check","plugin",{"skillNo":65,"name":66,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":6,"repositoryNo":11,"starsCount":12,"licenseSpdxId":13,"licenseFileUrl":6,"sourceHtmlUrl":67,"categories":68,"keywords":69,"publishedAt":19},"01M6CZR8FQ30QGEV5D3SB6DDKP","endpoint-review","https:\u002F\u002Fgithub.com\u002FTesting-itay\u002FDevTools-Security-Lab\u002Fblob\u002Fmain\u002Fsrc\u002FnewDIR\u002Fbundles\u002Fplugins\u002Fpython-api-plugin\u002Fskills\u002Fendpoint-review\u002FSKILL.md",[],[70,71,72],"endpoint review","endpoint","review",{"skillNo":74,"name":75,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":6,"repositoryNo":11,"starsCount":12,"licenseSpdxId":13,"licenseFileUrl":6,"sourceHtmlUrl":76,"categories":77,"keywords":78,"publishedAt":19},"01M6CZR6TYBN5EMBM70E096E66","schema-draft","https:\u002F\u002Fgithub.com\u002FTesting-itay\u002FDevTools-Security-Lab\u002Fblob\u002Fmain\u002Fsrc\u002FnewDIR\u002Fbundles\u002Fplugins\u002Fpython-api-plugin\u002Fagents\u002Fpy-plugin-endpoint-designer\u002Fskills\u002Fschema-draft\u002FSKILL.md",[],[79,80,81],"schema","schema draft","draft",{"skillNo":83,"name":84,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":6,"repositoryNo":11,"starsCount":12,"licenseSpdxId":13,"licenseFileUrl":6,"sourceHtmlUrl":85,"categories":86,"keywords":87,"publishedAt":19},"01M6CZR5SDWF91FHDK54XHXS67","doc-outline","https:\u002F\u002Fgithub.com\u002FTesting-itay\u002FDevTools-Security-Lab\u002Fblob\u002Fmain\u002Fsrc\u002FnewDIR\u002Fbundles\u002Fplugins\u002Fai-documentation-workflow\u002Fskills\u002Fdoc-outline\u002FSKILL.md",[],[88,89,90],"doc outline","outline","doc",{"skillNo":92,"name":57,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":6,"repositoryNo":11,"starsCount":12,"licenseSpdxId":13,"licenseFileUrl":6,"sourceHtmlUrl":93,"categories":94,"keywords":95,"publishedAt":19},"01M6CZR3Z4WZCBA5FVJZB65B1Y","https:\u002F\u002Fgithub.com\u002FTesting-itay\u002FDevTools-Security-Lab\u002Fblob\u002Fmain\u002Fsrc\u002FnewD\u002FnewDIR\u002Fbundles\u002Fplugins\u002Fsds-frontend-plugin\u002Fskills\u002Fsds-plugin-a11y-check\u002FSKILL.md",[],[61,62,63],{"skillNo":97,"name":66,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":6,"repositoryNo":11,"starsCount":12,"licenseSpdxId":13,"licenseFileUrl":6,"sourceHtmlUrl":98,"categories":99,"keywords":100,"publishedAt":19},"01M6CZR2PR7T4XYSJJWQYYPXVW","https:\u002F\u002Fgithub.com\u002FTesting-itay\u002FDevTools-Security-Lab\u002Fblob\u002Fmain\u002Fsrc\u002FnewD\u002FnewDIR\u002Fbundles\u002Fplugins\u002Fpython-api-plugin\u002Fskills\u002Fendpoint-review\u002FSKILL.md",[],[72,70,71]]