[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6EZG0YPAPZP3S5ER34XK9CT":3,"skill-same:01M6EZG0YPAPZP3S5ER34XK9CT":84},{"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":39,"linkOnly":40,"markdownContent":41,"markdownBody":42,"frontMatter":43,"refName":62,"commitSha":63,"skillDirectory":64,"forksCount":65,"repositoryHtmlUrl":66,"repositoryHomepageUrl":6,"ownerHtmlUrl":67,"ownerBlogUrl":6,"ownerDescription":68,"updatedAt":69,"install":70,"resources":83},"01M6EZG0YPAPZP3S5ER34XK9CT","error-handling-logging-patterns",null,"Implement structured logging, error hierarchies, and observability patterns for production systems. Covers structured JSON logging, error classification, correlation IDs, and alerting integration. Triggers on logging architecture, error handling strategy, or observability requests.","luokai0\u002Fai-agent-skills-by-luo-kai","luokai0","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F266954973?v=4","01M6E16VNT42JB8B3X3254QWJ7","luo kai","01M6E16VTFVP6S5XJF1V1MPV90",14,"MIT","https:\u002F\u002Fgithub.com\u002Fluokai0\u002Fai-agent-skills-by-luo-kai\u002Fblob\u002Fmain\u002Fai-agent-skills\u002F21-external-registries\u002F18-organvm-skills\u002Fdevelopment\u002Ferror-handling-logging-patterns\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38],"error handling logging patterns","error","error handling","logging","patterns","classification","structured logging","triggers","error-handling","configuration-management","strategy","context","implement","ids","monitoring","alerting","observability","debugging","resilience","architecture","2026-11-10 10:12:30",false,"---\nname: error-handling-logging-patterns\ndescription: Implement structured logging, error hierarchies, and observability patterns for production systems. Covers structured JSON logging, error classification, correlation IDs, and alerting integration. Triggers on logging architecture, error handling strategy, or observability requests.\nlicense: MIT\ncomplexity: intermediate\ntime_to_learn: 30min\ntags:\n  - logging\n  - error-handling\n  - observability\n  - structured-logging\n  - monitoring\ngovernance_phases: [build, prove]\norgan_affinity: [all]\ntriggers: [user-asks-about-logging, user-asks-about-error-handling, context:observability, context:debugging, context:monitoring]\ncomplements: [resilience-patterns, backend-implementation-patterns, configuration-management]\n---\n\n# Error Handling & Logging Patterns\n\nBuild systems that are debuggable in production through structured logging and intentional error handling.\n\n## Error Hierarchy Design\n\n### Custom Exception Classes\n\n```python\nclass AppError(Exception):\n    \"\"\"Base error for the application.\"\"\"\n    def __init__(self, message: str, code: str = \"INTERNAL_ERROR\", status: int = 500):\n        self.message = message\n        self.code = code\n        self.status = status\n        super().__init__(message)\n\nclass NotFoundError(AppError):\n    def __init__(self, entity: str, id: str):\n        super().__init__(f\"{entity} '{id}' not found\", code=\"NOT_FOUND\", status=404)\n\nclass ValidationError(AppError):\n    def __init__(self, field: str, reason: str):\n        super().__init__(f\"Invalid {field}: {reason}\", code=\"VALIDATION_ERROR\", status=400)\n\nclass ExternalServiceError(AppError):\n    def __init__(self, service: str, detail: str):\n        super().__init__(f\"{service} error: {detail}\", code=\"EXTERNAL_ERROR\", status=502)\n```\n\n### Error Classification\n\n| Category | Retry? | Log Level | Alert? |\n|----------|--------|-----------|--------|\n| Validation error | No | WARNING | No |\n| Not found | No | INFO | No |\n| Auth failure | No | WARNING | Rate-based |\n| Transient external | Yes | WARNING | After retries |\n| Persistent external | No | ERROR | Yes |\n| Internal bug | No | CRITICAL | Immediate |\n\n## Structured Logging\n\n### Setup with structlog\n\n```python\nimport structlog\nimport logging\n\ndef configure_logging(log_level: str = \"INFO\", json_output: bool = True):\n    processors = [\n        structlog.contextvars.merge_contextvars,\n        structlog.processors.add_log_level,\n        structlog.processors.TimeStamper(fmt=\"iso\"),\n        structlog.processors.StackInfoRenderer(),\n    ]\n\n    if json_output:\n        processors.append(structlog.processors.JSONRenderer())\n    else:\n        processors.append(structlog.dev.ConsoleRenderer())\n\n    structlog.configure(\n        processors=processors,\n        wrapper_class=structlog.make_filtering_bound_logger(\n            getattr(logging, log_level.upper())\n        ),\n        context_class=dict,\n        logger_factory=structlog.PrintLoggerFactory(),\n    )\n\nlog = structlog.get_logger()\n```\n\n### Contextual Logging\n\n```python\nimport structlog\nfrom contextvars import ContextVar\n\nrequest_id_var: ContextVar[str] = ContextVar(\"request_id\", default=\"\")\n\n# Bind context per request\nstructlog.contextvars.bind_contextvars(\n    request_id=request_id,\n    user_id=user.id,\n    organ=\"IV\",\n)\n\n# All subsequent log calls include this context\nlog.info(\"processing_request\", path=\"\u002Fapi\u002Fskills\", method=\"GET\")\n# Output: {\"event\": \"processing_request\", \"request_id\": \"abc-123\", \"user_id\": \"u42\", \"path\": \"\u002Fapi\u002Fskills\", ...}\n```\n\n### Log Levels by Purpose\n\n| Level | Purpose | Example |\n|-------|---------|---------|\n| DEBUG | Detailed flow tracing | Query parameters, cache hits |\n| INFO | Business events | User created, skill activated |\n| WARNING | Recoverable issues | Retry attempt, deprecated usage |\n| ERROR | Failures needing attention | External service down, data inconsistency |\n| CRITICAL | System-level failures | Database unreachable, out of memory |\n\n## Request Middleware\n\n### FastAPI Correlation IDs\n\n```python\nimport uuid\nfrom starlette.middleware.base import BaseHTTPMiddleware\n\nclass CorrelationMiddleware(BaseHTTPMiddleware):\n    async def dispatch(self, request, call_next):\n        request_id = request.headers.get(\"X-Request-ID\", str(uuid.uuid4()))\n        structlog.contextvars.bind_contextvars(request_id=request_id)\n\n        log.info(\"request_started\",\n            method=request.method,\n            path=request.url.path,\n        )\n\n        try:\n            response = await call_next(request)\n            log.info(\"request_completed\",\n                status=response.status_code,\n            )\n            response.headers[\"X-Request-ID\"] = request_id\n            return response\n        except Exception as e:\n            log.error(\"request_failed\", error=str(e), exc_info=True)\n            raise\n        finally:\n            structlog.contextvars.unbind_contextvars(\"request_id\")\n```\n\n### Error Response Handler\n\n```python\nfrom fastapi import Request\nfrom fastapi.responses import JSONResponse\n\n@app.exception_handler(AppError)\nasync def app_error_handler(request: Request, exc: AppError):\n    log.warning(\"app_error\", code=exc.code, message=exc.message)\n    return JSONResponse(\n        status_code=exc.status,\n        content={\"error\": {\"code\": exc.code, \"message\": exc.message}},\n    )\n\n@app.exception_handler(Exception)\nasync def unhandled_error_handler(request: Request, exc: Exception):\n    log.error(\"unhandled_error\", error=str(exc), exc_info=True)\n    return JSONResponse(\n        status_code=500,\n        content={\"error\": {\"code\": \"INTERNAL_ERROR\", \"message\": \"An unexpected error occurred\"}},\n    )\n```\n\n## Logging Patterns\n\n### Operation Logging\n\n```python\nasync def process_skill(skill_id: str):\n    log.info(\"skill_processing_started\", skill_id=skill_id)\n    try:\n        result = await validate_skill(skill_id)\n        log.info(\"skill_processing_completed\", skill_id=skill_id, status=result.status)\n        return result\n    except ValidationError as e:\n        log.warning(\"skill_validation_failed\", skill_id=skill_id, error=e.message)\n        raise\n    except Exception as e:\n        log.error(\"skill_processing_failed\", skill_id=skill_id, error=str(e), exc_info=True)\n        raise\n```\n\n### Sensitive Data Filtering\n\n```python\nSENSITIVE_KEYS = {\"password\", \"token\", \"secret\", \"api_key\", \"authorization\"}\n\ndef sanitize_log_data(data: dict) -> dict:\n    return {\n        k: \"***REDACTED***\" if k.lower() in SENSITIVE_KEYS else v\n        for k, v in data.items()\n    }\n```\n\n### Performance Logging\n\n```python\nimport time\nfrom contextlib import contextmanager\n\n@contextmanager\ndef log_duration(operation: str, **extra):\n    start = time.perf_counter()\n    try:\n        yield\n    finally:\n        duration_ms = (time.perf_counter() - start) * 1000\n        log.info(f\"{operation}_duration\", duration_ms=round(duration_ms, 2), **extra)\n```\n\n## Log Aggregation Integration\n\n### JSON Format for Ingestion\n\n```json\n{\n  \"timestamp\": \"2026-03-20T10:58:00Z\",\n  \"level\": \"info\",\n  \"event\": \"request_completed\",\n  \"request_id\": \"abc-123\",\n  \"method\": \"GET\",\n  \"path\": \"\u002Fapi\u002Fskills\",\n  \"status\": 200,\n  \"duration_ms\": 42.5,\n  \"service\": \"a-i--skills\",\n  \"organ\": \"IV\"\n}\n```\n\n### Common Fields\n\nAlways include: `timestamp`, `level`, `event`, `service`, `request_id`. Optionally: `user_id`, `organ`, `duration_ms`, `error`.\n\n## Anti-Patterns\n\n- **Logging PII or secrets** — Always filter sensitive fields before logging\n- **String interpolation in log calls** — Use structured fields: `log.info(\"x\", user=id)` not `log.info(f\"user {id}\")`\n- **Catching and silencing exceptions** — Log or re-raise; never `except: pass`\n- **Inconsistent log levels** — Define team conventions and stick to them\n- **No correlation IDs** — Impossible to trace requests across services without them\n- **Logging in tight loops** — Rate-limit or sample high-frequency events\n","# Error Handling & Logging Patterns\n\nBuild systems that are debuggable in production through structured logging and intentional error handling.\n\n## Error Hierarchy Design\n\n### Custom Exception Classes\n\n```python\nclass AppError(Exception):\n    \"\"\"Base error for the application.\"\"\"\n    def __init__(self, message: str, code: str = \"INTERNAL_ERROR\", status: int = 500):\n        self.message = message\n        self.code = code\n        self.status = status\n        super().__init__(message)\n\nclass NotFoundError(AppError):\n    def __init__(self, entity: str, id: str):\n        super().__init__(f\"{entity} '{id}' not found\", code=\"NOT_FOUND\", status=404)\n\nclass ValidationError(AppError):\n    def __init__(self, field: str, reason: str):\n        super().__init__(f\"Invalid {field}: {reason}\", code=\"VALIDATION_ERROR\", status=400)\n\nclass ExternalServiceError(AppError):\n    def __init__(self, service: str, detail: str):\n        super().__init__(f\"{service} error: {detail}\", code=\"EXTERNAL_ERROR\", status=502)\n```\n\n### Error Classification\n\n| Category | Retry? | Log Level | Alert? |\n|----------|--------|-----------|--------|\n| Validation error | No | WARNING | No |\n| Not found | No | INFO | No |\n| Auth failure | No | WARNING | Rate-based |\n| Transient external | Yes | WARNING | After retries |\n| Persistent external | No | ERROR | Yes |\n| Internal bug | No | CRITICAL | Immediate |\n\n## Structured Logging\n\n### Setup with structlog\n\n```python\nimport structlog\nimport logging\n\ndef configure_logging(log_level: str = \"INFO\", json_output: bool = True):\n    processors = [\n        structlog.contextvars.merge_contextvars,\n        structlog.processors.add_log_level,\n        structlog.processors.TimeStamper(fmt=\"iso\"),\n        structlog.processors.StackInfoRenderer(),\n    ]\n\n    if json_output:\n        processors.append(structlog.processors.JSONRenderer())\n    else:\n        processors.append(structlog.dev.ConsoleRenderer())\n\n    structlog.configure(\n        processors=processors,\n        wrapper_class=structlog.make_filtering_bound_logger(\n            getattr(logging, log_level.upper())\n        ),\n        context_class=dict,\n        logger_factory=structlog.PrintLoggerFactory(),\n    )\n\nlog = structlog.get_logger()\n```\n\n### Contextual Logging\n\n```python\nimport structlog\nfrom contextvars import ContextVar\n\nrequest_id_var: ContextVar[str] = ContextVar(\"request_id\", default=\"\")\n\n# Bind context per request\nstructlog.contextvars.bind_contextvars(\n    request_id=request_id,\n    user_id=user.id,\n    organ=\"IV\",\n)\n\n# All subsequent log calls include this context\nlog.info(\"processing_request\", path=\"\u002Fapi\u002Fskills\", method=\"GET\")\n# Output: {\"event\": \"processing_request\", \"request_id\": \"abc-123\", \"user_id\": \"u42\", \"path\": \"\u002Fapi\u002Fskills\", ...}\n```\n\n### Log Levels by Purpose\n\n| Level | Purpose | Example |\n|-------|---------|---------|\n| DEBUG | Detailed flow tracing | Query parameters, cache hits |\n| INFO | Business events | User created, skill activated |\n| WARNING | Recoverable issues | Retry attempt, deprecated usage |\n| ERROR | Failures needing attention | External service down, data inconsistency |\n| CRITICAL | System-level failures | Database unreachable, out of memory |\n\n## Request Middleware\n\n### FastAPI Correlation IDs\n\n```python\nimport uuid\nfrom starlette.middleware.base import BaseHTTPMiddleware\n\nclass CorrelationMiddleware(BaseHTTPMiddleware):\n    async def dispatch(self, request, call_next):\n        request_id = request.headers.get(\"X-Request-ID\", str(uuid.uuid4()))\n        structlog.contextvars.bind_contextvars(request_id=request_id)\n\n        log.info(\"request_started\",\n            method=request.method,\n            path=request.url.path,\n        )\n\n        try:\n            response = await call_next(request)\n            log.info(\"request_completed\",\n                status=response.status_code,\n            )\n            response.headers[\"X-Request-ID\"] = request_id\n            return response\n        except Exception as e:\n            log.error(\"request_failed\", error=str(e), exc_info=True)\n            raise\n        finally:\n            structlog.contextvars.unbind_contextvars(\"request_id\")\n```\n\n### Error Response Handler\n\n```python\nfrom fastapi import Request\nfrom fastapi.responses import JSONResponse\n\n@app.exception_handler(AppError)\nasync def app_error_handler(request: Request, exc: AppError):\n    log.warning(\"app_error\", code=exc.code, message=exc.message)\n    return JSONResponse(\n        status_code=exc.status,\n        content={\"error\": {\"code\": exc.code, \"message\": exc.message}},\n    )\n\n@app.exception_handler(Exception)\nasync def unhandled_error_handler(request: Request, exc: Exception):\n    log.error(\"unhandled_error\", error=str(exc), exc_info=True)\n    return JSONResponse(\n        status_code=500,\n        content={\"error\": {\"code\": \"INTERNAL_ERROR\", \"message\": \"An unexpected error occurred\"}},\n    )\n```\n\n## Logging Patterns\n\n### Operation Logging\n\n```python\nasync def process_skill(skill_id: str):\n    log.info(\"skill_processing_started\", skill_id=skill_id)\n    try:\n        result = await validate_skill(skill_id)\n        log.info(\"skill_processing_completed\", skill_id=skill_id, status=result.status)\n        return result\n    except ValidationError as e:\n        log.warning(\"skill_validation_failed\", skill_id=skill_id, error=e.message)\n        raise\n    except Exception as e:\n        log.error(\"skill_processing_failed\", skill_id=skill_id, error=str(e), exc_info=True)\n        raise\n```\n\n### Sensitive Data Filtering\n\n```python\nSENSITIVE_KEYS = {\"password\", \"token\", \"secret\", \"api_key\", \"authorization\"}\n\ndef sanitize_log_data(data: dict) -> dict:\n    return {\n        k: \"***REDACTED***\" if k.lower() in SENSITIVE_KEYS else v\n        for k, v in data.items()\n    }\n```\n\n### Performance Logging\n\n```python\nimport time\nfrom contextlib import contextmanager\n\n@contextmanager\ndef log_duration(operation: str, **extra):\n    start = time.perf_counter()\n    try:\n        yield\n    finally:\n        duration_ms = (time.perf_counter() - start) * 1000\n        log.info(f\"{operation}_duration\", duration_ms=round(duration_ms, 2), **extra)\n```\n\n## Log Aggregation Integration\n\n### JSON Format for Ingestion\n\n```json\n{\n  \"timestamp\": \"2026-03-20T10:58:00Z\",\n  \"level\": \"info\",\n  \"event\": \"request_completed\",\n  \"request_id\": \"abc-123\",\n  \"method\": \"GET\",\n  \"path\": \"\u002Fapi\u002Fskills\",\n  \"status\": 200,\n  \"duration_ms\": 42.5,\n  \"service\": \"a-i--skills\",\n  \"organ\": \"IV\"\n}\n```\n\n### Common Fields\n\nAlways include: `timestamp`, `level`, `event`, `service`, `request_id`. Optionally: `user_id`, `organ`, `duration_ms`, `error`.\n\n## Anti-Patterns\n\n- **Logging PII or secrets** — Always filter sensitive fields before logging\n- **String interpolation in log calls** — Use structured fields: `log.info(\"x\", user=id)` not `log.info(f\"user {id}\")`\n- **Catching and silencing exceptions** — Log or re-raise; never `except: pass`\n- **Inconsistent log levels** — Define team conventions and stick to them\n- **No correlation IDs** — Impossible to trace requests across services without them\n- **Logging in tight loops** — Rate-limit or sample high-frequency events\n",{"name":5,"tags":44,"license":15,"triggers":46,"complexity":52,"complements":53,"description":7,"time_to_learn":56,"organ_affinity":57,"governance_phases":59},[22,27,35,45,33],"structured-logging",[47,48,49,50,51],"user-asks-about-logging","user-asks-about-error-handling","context:observability","context:debugging","context:monitoring","intermediate",[54,55,28],"resilience-patterns","backend-implementation-patterns","30min",[58],"all",[60,61],"build","prove","main","4d2fb89cdfb75f3f6fd3c6c5ec9ad90ea129eb3c","ai-agent-skills\u002F21-external-registries\u002F18-organvm-skills\u002Fdevelopment\u002Ferror-handling-logging-patterns",2,"https:\u002F\u002Fgithub.com\u002Fluokai0\u002Fai-agent-skills-by-luo-kai","https:\u002F\u002Fgithub.com\u002Fluokai0","a solo builder.","2026-05-06 04:29:04",{"source":8,"skillName":5,"commands":71,"prompt":81,"zipAvailable":82},[72,75,78],{"tool":73,"command":74},"npx","npx skills add luokai0\u002Fai-agent-skills-by-luo-kai --skill error-handling-logging-patterns",{"tool":76,"command":77},"bunx","bunx skills add luokai0\u002Fai-agent-skills-by-luo-kai --skill error-handling-logging-patterns",{"tool":79,"command":80},"pnpm","pnpm dlx skills add luokai0\u002Fai-agent-skills-by-luo-kai --skill error-handling-logging-patterns","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fluokai0\u002Fai-agent-skills-by-luo-kai\u002Fblob\u002Fmain\u002Fai-agent-skills\u002F21-external-registries\u002F18-organvm-skills\u002Fdevelopment\u002Ferror-handling-logging-patterns\u002FSKILL.md",true,[],[85,112,129,158,191,228],{"skillNo":86,"name":87,"nameZh":6,"description":88,"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":91,"publishedAt":39},"01M6F2SKTE208174C7S7JJCZC7","write-contracts","Generates secure Aptos Move V2 smart contracts with Object model, Digital Asset integration, security patterns, and storage type guidance. Includes comprehensive storage decision framework for optimal data structure selection. Triggers on: 'write contract', 'create NFT collection', 'build marketplace', 'implement minting', 'generate Move module', 'create token contract', 'build DAO', 'implement staking'. Ask storage questions when: 'store', 'track', 'registry', 'mapping', 'list', 'collection'.","https:\u002F\u002Fgithub.com\u002Fluokai0\u002Fai-agent-skills-by-luo-kai\u002Fblob\u002Fmain\u002Fai-agent-skills\u002F22-clawhub-skills\u002Fwrite-contracts\u002FSKILL.md",[],[92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111],"write","contracts","write contracts","storage","secure","create","generate","collection","model","decision","ask","smart-contracts","selection","objects","structure","nft","token","aptos","critical","move",{"skillNo":113,"name":114,"nameZh":6,"description":115,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":116,"categories":117,"keywords":118,"publishedAt":39},"01M6F2RFXJ6T9MKW0A7N7GM45B","web-search","通用网络搜索技能，支持多引擎搜索（百度、必应、DuckDuckGo），无需API密钥即可获取实时信息","https:\u002F\u002Fgithub.com\u002Fluokai0\u002Fai-agent-skills-by-luo-kai\u002Fblob\u002Fmain\u002Fai-agent-skills\u002F22-clawhub-skills\u002Fweb-search-ex-skill\u002FSKILL.md",[],[119,120,121,122,123,124,125,126,127,128],"web","search","web search","搜索","baidu","bing","duckduckgo","百度","多引擎","internet",{"skillNo":130,"name":131,"nameZh":6,"description":132,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":133,"categories":134,"keywords":140,"publishedAt":39},"01M6F2K968G1FZEZFPW2E6B222","solo-build","Execute implementation plan tasks with TDD workflow, auto-commit, and phase gates. Use when user says \"build it\", \"start building\", \"execute plan\", \"implement tasks\", \"ship it\", or references a track ID. Do NOT use for planning (use \u002Fplan) or scaffolding (use \u002Fscaffold).","https:\u002F\u002Fgithub.com\u002Fluokai0\u002Fai-agent-skills-by-luo-kai\u002Fblob\u002Fmain\u002Fai-agent-skills\u002F22-clawhub-skills\u002Fsolo-build\u002FSKILL.md",[135],{"categoryNo":136,"categoryName":137,"taxonomyType":138,"taxonomyTypeDesc":139},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[60,141,142,143,144,145,146,147,120,148,149,150,92,151,152,153,154,155,156,157],"solo","solo build","MCP","workflow","commit","tasks","code","Bash","plan","read","auto","references","context7","query","scaffolding","ship it","project",{"skillNo":159,"name":160,"nameZh":6,"description":161,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":162,"categories":163,"keywords":170,"publishedAt":39},"01M6F2GKN39SGHSPWYB3662YC8","react-email","Use when building HTML email templates with React components, adding a visual email editor to an application using the React Email visual editor, rendering emails to HTML, or sending emails with Resend. Covers welcome emails, password resets, notifications, order confirmations, newsletters, transactional emails, and the embeddable email editor component.","https:\u002F\u002Fgithub.com\u002Fluokai0\u002Fai-agent-skills-by-luo-kai\u002Fblob\u002Fmain\u002Fai-agent-skills\u002F22-clawhub-skills\u002Freact-email-skills\u002FSKILL.md",[164,167],{"categoryNo":165,"categoryName":166,"taxonomyType":138,"taxonomyTypeDesc":139},"01JBSEEDCAT000000000000005","邮件与沟通",{"categoryNo":168,"categoryName":169,"taxonomyType":138,"taxonomyTypeDesc":139},"01JBSEEDCAT000000000000009","前端开发",[171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190],"react","email","react email","github","editor","components","react components","component","welcome","https","notifications","password","node","use","html","resend","visual","emails","rendering","with",{"skillNo":192,"name":193,"nameZh":6,"description":194,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":195,"categories":196,"keywords":209,"publishedAt":39},"01M6F2FBVGVDFSG8SSFJGXA40C","APITester Agent-Driven API Testing","Test API endpoints and document responses. Define tests in plain English, run them, get formatted results. Agent-driven Postman alternative.","https:\u002F\u002Fgithub.com\u002Fluokai0\u002Fai-agent-skills-by-luo-kai\u002Fblob\u002Fmain\u002Fai-agent-skills\u002F22-clawhub-skills\u002Fopenclaw-api-tester\u002FSKILL.md",[197,200,203,204],{"categoryNo":198,"categoryName":199,"taxonomyType":138,"taxonomyTypeDesc":139},"01JBSEEDCAT000000000000008","测试与质量",{"categoryNo":201,"categoryName":202,"taxonomyType":138,"taxonomyTypeDesc":139},"01JBSEEDCAT000000000000010","后端与接口",{"categoryNo":136,"categoryName":137,"taxonomyType":138,"taxonomyTypeDesc":139},{"categoryNo":205,"categoryName":206,"taxonomyType":207,"taxonomyTypeDesc":208},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227],"testing","api","api testing","driven","APITester Agent Driven API Testing","test","run","postman","results","plain english","tester","endpoints","document","get","define","tests","english","api-tester",{"skillNo":229,"name":230,"nameZh":6,"description":231,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":232,"categories":233,"keywords":234,"publishedAt":39},"01M6F273Y3NGAPVJZ608BC0G9G","hubspot-implementation-plan","Generate a phased implementation plan from a HubSpot audit report. Creates prioritized, sequenced cleanup processes with effort estimates, dependencies, and automation feasibility. Use after running \u002Fhubspot-audit.","https:\u002F\u002Fgithub.com\u002Fluokai0\u002Fai-agent-skills-by-luo-kai\u002Fblob\u002Fmain\u002Fai-agent-skills\u002F22-clawhub-skills\u002Fhubspot-implementation-plan\u002FSKILL.md",[],[149,235,236,237,238,239,240,98,241,242,243,244,245,184,246,247,190,248],"implementation","hubspot","hubspot implementation plan","automation","feasibility","cleanup","planning","report","audit","audit report","phased implementation","dependencies","processes","hubspot audit"]