[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6CD2HMDD13ZXBKHF0RBCG0H":3,"skill-same:01M6CD2HMDD13ZXBKHF0RBCG0H":67},{"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":35,"linkOnly":36,"markdownContent":37,"markdownBody":38,"frontMatter":39,"refName":41,"commitSha":42,"skillDirectory":43,"forksCount":44,"repositoryHtmlUrl":45,"repositoryHomepageUrl":6,"ownerHtmlUrl":46,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":47,"install":48,"resources":60},"01M6CD2HMDD13ZXBKHF0RBCG0H","python-error-handling",null,"Python error handling patterns including input validation, exception hierarchies, and partial failure handling. Use when implementing validation logic, designing exception strategies, handling batch processing failures, or building robust APIs.","cercova-studios\u002F10x-swe","cercova-studios","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F217108198?v=4","01M6CCYGHXTH80N3BXRW6KESTE","Cercova Studios","01M6CCYGPADH5MJDR0VNNR775C",1,"MIT","https:\u002F\u002Fgithub.com\u002Fcercova-studios\u002F10x-swe\u002Fblob\u002Fmain\u002Fplugins\u002F10x-swe\u002Fskills\u002Fpython-error-handling\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34],"python","python error handling","error handling","error","validation","error handling patterns","use","batch","processing","implementing","Input Validation","when","strategies","logic","input","patterns","2026-11-10 10:12:30",false,"---\nname: python-error-handling\ndescription: Python error handling patterns including input validation, exception hierarchies, and partial failure handling. Use when implementing validation logic, designing exception strategies, handling batch processing failures, or building robust APIs.\ndisable-model-invocation: true\n---\n\n# Python Error Handling\n\nBuild robust Python applications with proper input validation, meaningful exceptions, and graceful failure handling. Good error handling makes debugging easier and systems more reliable.\n\n## When to Use This Skill\n\n- Validating user input and API parameters\n- Designing exception hierarchies for applications\n- Handling partial failures in batch operations\n- Converting external data to domain types\n- Building user-friendly error messages\n- Implementing fail-fast validation patterns\n\n## Core Concepts\n\n### 1. Fail Fast\n\nValidate inputs early, before expensive operations. Report all validation errors at once when possible.\n\n### 2. Meaningful Exceptions\n\nUse appropriate exception types with context. Messages should explain what failed, why, and how to fix it.\n\n### 3. Partial Failures\n\nIn batch operations, don't let one failure abort everything. Track successes and failures separately.\n\n### 4. Preserve Context\n\nChain exceptions to maintain the full error trail for debugging.\n\n## Quick Start\n\n```python\ndef fetch_page(url: str, page_size: int) -> Page:\n    if not url:\n        raise ValueError(\"'url' is required\")\n    if not 1 \u003C= page_size \u003C= 100:\n        raise ValueError(f\"'page_size' must be 1-100, got {page_size}\")\n    # Now safe to proceed...\n```\n\n## Fundamental Patterns\n\n### Pattern 1: Early Input Validation\n\nValidate all inputs at API boundaries before any processing begins.\n\n```python\ndef process_order(\n    order_id: str,\n    quantity: int,\n    discount_percent: float,\n) -> OrderResult:\n    \"\"\"Process an order with validation.\"\"\"\n    # Validate required fields\n    if not order_id:\n        raise ValueError(\"'order_id' is required\")\n\n    # Validate ranges\n    if quantity \u003C= 0:\n        raise ValueError(f\"'quantity' must be positive, got {quantity}\")\n\n    if not 0 \u003C= discount_percent \u003C= 100:\n        raise ValueError(\n            f\"'discount_percent' must be 0-100, got {discount_percent}\"\n        )\n\n    # Validation passed, proceed with processing\n    return _process_validated_order(order_id, quantity, discount_percent)\n```\n\n### Pattern 2: Convert to Domain Types Early\n\nParse strings and external data into typed domain objects at system boundaries.\n\n```python\nfrom enum import Enum\n\nclass OutputFormat(Enum):\n    JSON = \"json\"\n    CSV = \"csv\"\n    PARQUET = \"parquet\"\n\ndef parse_output_format(value: str) -> OutputFormat:\n    \"\"\"Parse string to OutputFormat enum.\n\n    Args:\n        value: Format string from user input.\n\n    Returns:\n        Validated OutputFormat enum member.\n\n    Raises:\n        ValueError: If format is not recognized.\n    \"\"\"\n    try:\n        return OutputFormat(value.lower())\n    except ValueError:\n        valid_formats = [f.value for f in OutputFormat]\n        raise ValueError(\n            f\"Invalid format '{value}'. \"\n            f\"Valid options: {', '.join(valid_formats)}\"\n        )\n\n# Usage at API boundary\ndef export_data(data: list[dict], format_str: str) -> bytes:\n    output_format = parse_output_format(format_str)  # Fail fast\n    # Rest of function uses typed OutputFormat\n    ...\n```\n\n### Pattern 3: Pydantic for Complex Validation\n\nUse Pydantic models for structured input validation with automatic error messages.\n\n```python\nfrom pydantic import BaseModel, Field, field_validator\n\nclass CreateUserInput(BaseModel):\n    \"\"\"Input model for user creation.\"\"\"\n\n    email: str = Field(..., min_length=5, max_length=255)\n    name: str = Field(..., min_length=1, max_length=100)\n    age: int = Field(ge=0, le=150)\n\n    @field_validator(\"email\")\n    @classmethod\n    def validate_email_format(cls, v: str) -> str:\n        if \"@\" not in v or \".\" not in v.split(\"@\")[-1]:\n            raise ValueError(\"Invalid email format\")\n        return v.lower()\n\n    @field_validator(\"name\")\n    @classmethod\n    def normalize_name(cls, v: str) -> str:\n        return v.strip().title()\n\n# Usage\ntry:\n    user_input = CreateUserInput(\n        email=\"user@example.com\",\n        name=\"john doe\",\n        age=25,\n    )\nexcept ValidationError as e:\n    # Pydantic provides detailed error information\n    print(e.errors())\n```\n\n### Pattern 4: Map Errors to Standard Exceptions\n\nUse Python's built-in exception types appropriately, adding context as needed.\n\n| Failure Type | Exception | Example |\n|--------------|-----------|---------|\n| Invalid input | `ValueError` | Bad parameter values |\n| Wrong type | `TypeError` | Expected string, got int |\n| Missing item | `KeyError` | Dict key not found |\n| Operational failure | `RuntimeError` | Service unavailable |\n| Timeout | `TimeoutError` | Operation took too long |\n| File not found | `FileNotFoundError` | Path doesn't exist |\n| Permission denied | `PermissionError` | Access forbidden |\n\n```python\n# Good: Specific exception with context\nraise ValueError(f\"'page_size' must be 1-100, got {page_size}\")\n\n# Avoid: Generic exception, no context\nraise Exception(\"Invalid parameter\")\n```\n\n## Advanced Patterns\n\n### Pattern 5: Custom Exceptions with Context\n\nCreate domain-specific exceptions that carry structured information.\n\n```python\nclass ApiError(Exception):\n    \"\"\"Base exception for API errors.\"\"\"\n\n    def __init__(\n        self,\n        message: str,\n        status_code: int,\n        response_body: str | None = None,\n    ) -> None:\n        self.status_code = status_code\n        self.response_body = response_body\n        super().__init__(message)\n\nclass RateLimitError(ApiError):\n    \"\"\"Raised when rate limit is exceeded.\"\"\"\n\n    def __init__(self, retry_after: int) -> None:\n        self.retry_after = retry_after\n        super().__init__(\n            f\"Rate limit exceeded. Retry after {retry_after}s\",\n            status_code=429,\n        )\n\n# Usage\ndef handle_response(response: Response) -> dict:\n    match response.status_code:\n        case 200:\n            return response.json()\n        case 401:\n            raise ApiError(\"Invalid credentials\", 401)\n        case 404:\n            raise ApiError(f\"Resource not found: {response.url}\", 404)\n        case 429:\n            retry_after = int(response.headers.get(\"Retry-After\", 60))\n            raise RateLimitError(retry_after)\n        case code if 400 \u003C= code \u003C 500:\n            raise ApiError(f\"Client error: {response.text}\", code)\n        case code if code >= 500:\n            raise ApiError(f\"Server error: {response.text}\", code)\n```\n\n### Pattern 6: Exception Chaining\n\nPreserve the original exception when re-raising to maintain the debug trail.\n\n```python\nimport httpx\n\nclass ServiceError(Exception):\n    \"\"\"High-level service operation failed.\"\"\"\n    pass\n\ndef upload_file(path: str) -> str:\n    \"\"\"Upload file and return URL.\"\"\"\n    try:\n        with open(path, \"rb\") as f:\n            response = httpx.post(\"https:\u002F\u002Fupload.example.com\", files={\"file\": f})\n            response.raise_for_status()\n            return response.json()[\"url\"]\n    except FileNotFoundError as e:\n        raise ServiceError(f\"Upload failed: file not found at '{path}'\") from e\n    except httpx.HTTPStatusError as e:\n        raise ServiceError(\n            f\"Upload failed: server returned {e.response.status_code}\"\n        ) from e\n    except httpx.RequestError as e:\n        raise ServiceError(f\"Upload failed: network error\") from e\n```\n\n### Pattern 7: Batch Processing with Partial Failures\n\nNever let one bad item abort an entire batch. Track results per item.\n\n```python\nfrom dataclasses import dataclass\n\n@dataclass\nclass BatchResult[T]:\n    \"\"\"Results from batch processing.\"\"\"\n\n    succeeded: dict[int, T]  # index -> result\n    failed: dict[int, Exception]  # index -> error\n\n    @property\n    def success_count(self) -> int:\n        return len(self.succeeded)\n\n    @property\n    def failure_count(self) -> int:\n        return len(self.failed)\n\n    @property\n    def all_succeeded(self) -> bool:\n        return len(self.failed) == 0\n\ndef process_batch(items: list[Item]) -> BatchResult[ProcessedItem]:\n    \"\"\"Process items, capturing individual failures.\n\n    Args:\n        items: Items to process.\n\n    Returns:\n        BatchResult with succeeded and failed items by index.\n    \"\"\"\n    succeeded: dict[int, ProcessedItem] = {}\n    failed: dict[int, Exception] = {}\n\n    for idx, item in enumerate(items):\n        try:\n            result = process_single_item(item)\n            succeeded[idx] = result\n        except Exception as e:\n            failed[idx] = e\n\n    return BatchResult(succeeded=succeeded, failed=failed)\n\n# Caller handles partial results\nresult = process_batch(items)\nif not result.all_succeeded:\n    logger.warning(\n        f\"Batch completed with {result.failure_count} failures\",\n        failed_indices=list(result.failed.keys()),\n    )\n```\n\n### Pattern 8: Progress Reporting for Long Operations\n\nProvide visibility into batch progress without coupling business logic to UI.\n\n```python\nfrom collections.abc import Callable\n\nProgressCallback = Callable[[int, int, str], None]  # current, total, status\n\ndef process_large_batch(\n    items: list[Item],\n    on_progress: ProgressCallback | None = None,\n) -> BatchResult:\n    \"\"\"Process batch with optional progress reporting.\n\n    Args:\n        items: Items to process.\n        on_progress: Optional callback receiving (current, total, status).\n    \"\"\"\n    total = len(items)\n    succeeded = {}\n    failed = {}\n\n    for idx, item in enumerate(items):\n        if on_progress:\n            on_progress(idx, total, f\"Processing {item.id}\")\n\n        try:\n            succeeded[idx] = process_single_item(item)\n        except Exception as e:\n            failed[idx] = e\n\n    if on_progress:\n        on_progress(total, total, \"Complete\")\n\n    return BatchResult(succeeded=succeeded, failed=failed)\n```\n\n## Best Practices Summary\n\n1. **Validate early** - Check inputs before expensive operations\n2. **Use specific exceptions** - `ValueError`, `TypeError`, not generic `Exception`\n3. **Include context** - Messages should explain what, why, and how to fix\n4. **Convert types at boundaries** - Parse strings to enums\u002Fdomain types early\n5. **Chain exceptions** - Use `raise ... from e` to preserve debug info\n6. **Handle partial failures** - Don't abort batches on single item errors\n7. **Use Pydantic** - For complex input validation with structured errors\n8. **Document failure modes** - Docstrings should list possible exceptions\n9. **Log with context** - Include IDs, counts, and other debugging info\n10. **Test error paths** - Verify exceptions are raised correctly\n","# Python Error Handling\n\nBuild robust Python applications with proper input validation, meaningful exceptions, and graceful failure handling. Good error handling makes debugging easier and systems more reliable.\n\n## When to Use This Skill\n\n- Validating user input and API parameters\n- Designing exception hierarchies for applications\n- Handling partial failures in batch operations\n- Converting external data to domain types\n- Building user-friendly error messages\n- Implementing fail-fast validation patterns\n\n## Core Concepts\n\n### 1. Fail Fast\n\nValidate inputs early, before expensive operations. Report all validation errors at once when possible.\n\n### 2. Meaningful Exceptions\n\nUse appropriate exception types with context. Messages should explain what failed, why, and how to fix it.\n\n### 3. Partial Failures\n\nIn batch operations, don't let one failure abort everything. Track successes and failures separately.\n\n### 4. Preserve Context\n\nChain exceptions to maintain the full error trail for debugging.\n\n## Quick Start\n\n```python\ndef fetch_page(url: str, page_size: int) -> Page:\n    if not url:\n        raise ValueError(\"'url' is required\")\n    if not 1 \u003C= page_size \u003C= 100:\n        raise ValueError(f\"'page_size' must be 1-100, got {page_size}\")\n    # Now safe to proceed...\n```\n\n## Fundamental Patterns\n\n### Pattern 1: Early Input Validation\n\nValidate all inputs at API boundaries before any processing begins.\n\n```python\ndef process_order(\n    order_id: str,\n    quantity: int,\n    discount_percent: float,\n) -> OrderResult:\n    \"\"\"Process an order with validation.\"\"\"\n    # Validate required fields\n    if not order_id:\n        raise ValueError(\"'order_id' is required\")\n\n    # Validate ranges\n    if quantity \u003C= 0:\n        raise ValueError(f\"'quantity' must be positive, got {quantity}\")\n\n    if not 0 \u003C= discount_percent \u003C= 100:\n        raise ValueError(\n            f\"'discount_percent' must be 0-100, got {discount_percent}\"\n        )\n\n    # Validation passed, proceed with processing\n    return _process_validated_order(order_id, quantity, discount_percent)\n```\n\n### Pattern 2: Convert to Domain Types Early\n\nParse strings and external data into typed domain objects at system boundaries.\n\n```python\nfrom enum import Enum\n\nclass OutputFormat(Enum):\n    JSON = \"json\"\n    CSV = \"csv\"\n    PARQUET = \"parquet\"\n\ndef parse_output_format(value: str) -> OutputFormat:\n    \"\"\"Parse string to OutputFormat enum.\n\n    Args:\n        value: Format string from user input.\n\n    Returns:\n        Validated OutputFormat enum member.\n\n    Raises:\n        ValueError: If format is not recognized.\n    \"\"\"\n    try:\n        return OutputFormat(value.lower())\n    except ValueError:\n        valid_formats = [f.value for f in OutputFormat]\n        raise ValueError(\n            f\"Invalid format '{value}'. \"\n            f\"Valid options: {', '.join(valid_formats)}\"\n        )\n\n# Usage at API boundary\ndef export_data(data: list[dict], format_str: str) -> bytes:\n    output_format = parse_output_format(format_str)  # Fail fast\n    # Rest of function uses typed OutputFormat\n    ...\n```\n\n### Pattern 3: Pydantic for Complex Validation\n\nUse Pydantic models for structured input validation with automatic error messages.\n\n```python\nfrom pydantic import BaseModel, Field, field_validator\n\nclass CreateUserInput(BaseModel):\n    \"\"\"Input model for user creation.\"\"\"\n\n    email: str = Field(..., min_length=5, max_length=255)\n    name: str = Field(..., min_length=1, max_length=100)\n    age: int = Field(ge=0, le=150)\n\n    @field_validator(\"email\")\n    @classmethod\n    def validate_email_format(cls, v: str) -> str:\n        if \"@\" not in v or \".\" not in v.split(\"@\")[-1]:\n            raise ValueError(\"Invalid email format\")\n        return v.lower()\n\n    @field_validator(\"name\")\n    @classmethod\n    def normalize_name(cls, v: str) -> str:\n        return v.strip().title()\n\n# Usage\ntry:\n    user_input = CreateUserInput(\n        email=\"user@example.com\",\n        name=\"john doe\",\n        age=25,\n    )\nexcept ValidationError as e:\n    # Pydantic provides detailed error information\n    print(e.errors())\n```\n\n### Pattern 4: Map Errors to Standard Exceptions\n\nUse Python's built-in exception types appropriately, adding context as needed.\n\n| Failure Type | Exception | Example |\n|--------------|-----------|---------|\n| Invalid input | `ValueError` | Bad parameter values |\n| Wrong type | `TypeError` | Expected string, got int |\n| Missing item | `KeyError` | Dict key not found |\n| Operational failure | `RuntimeError` | Service unavailable |\n| Timeout | `TimeoutError` | Operation took too long |\n| File not found | `FileNotFoundError` | Path doesn't exist |\n| Permission denied | `PermissionError` | Access forbidden |\n\n```python\n# Good: Specific exception with context\nraise ValueError(f\"'page_size' must be 1-100, got {page_size}\")\n\n# Avoid: Generic exception, no context\nraise Exception(\"Invalid parameter\")\n```\n\n## Advanced Patterns\n\n### Pattern 5: Custom Exceptions with Context\n\nCreate domain-specific exceptions that carry structured information.\n\n```python\nclass ApiError(Exception):\n    \"\"\"Base exception for API errors.\"\"\"\n\n    def __init__(\n        self,\n        message: str,\n        status_code: int,\n        response_body: str | None = None,\n    ) -> None:\n        self.status_code = status_code\n        self.response_body = response_body\n        super().__init__(message)\n\nclass RateLimitError(ApiError):\n    \"\"\"Raised when rate limit is exceeded.\"\"\"\n\n    def __init__(self, retry_after: int) -> None:\n        self.retry_after = retry_after\n        super().__init__(\n            f\"Rate limit exceeded. Retry after {retry_after}s\",\n            status_code=429,\n        )\n\n# Usage\ndef handle_response(response: Response) -> dict:\n    match response.status_code:\n        case 200:\n            return response.json()\n        case 401:\n            raise ApiError(\"Invalid credentials\", 401)\n        case 404:\n            raise ApiError(f\"Resource not found: {response.url}\", 404)\n        case 429:\n            retry_after = int(response.headers.get(\"Retry-After\", 60))\n            raise RateLimitError(retry_after)\n        case code if 400 \u003C= code \u003C 500:\n            raise ApiError(f\"Client error: {response.text}\", code)\n        case code if code >= 500:\n            raise ApiError(f\"Server error: {response.text}\", code)\n```\n\n### Pattern 6: Exception Chaining\n\nPreserve the original exception when re-raising to maintain the debug trail.\n\n```python\nimport httpx\n\nclass ServiceError(Exception):\n    \"\"\"High-level service operation failed.\"\"\"\n    pass\n\ndef upload_file(path: str) -> str:\n    \"\"\"Upload file and return URL.\"\"\"\n    try:\n        with open(path, \"rb\") as f:\n            response = httpx.post(\"https:\u002F\u002Fupload.example.com\", files={\"file\": f})\n            response.raise_for_status()\n            return response.json()[\"url\"]\n    except FileNotFoundError as e:\n        raise ServiceError(f\"Upload failed: file not found at '{path}'\") from e\n    except httpx.HTTPStatusError as e:\n        raise ServiceError(\n            f\"Upload failed: server returned {e.response.status_code}\"\n        ) from e\n    except httpx.RequestError as e:\n        raise ServiceError(f\"Upload failed: network error\") from e\n```\n\n### Pattern 7: Batch Processing with Partial Failures\n\nNever let one bad item abort an entire batch. Track results per item.\n\n```python\nfrom dataclasses import dataclass\n\n@dataclass\nclass BatchResult[T]:\n    \"\"\"Results from batch processing.\"\"\"\n\n    succeeded: dict[int, T]  # index -> result\n    failed: dict[int, Exception]  # index -> error\n\n    @property\n    def success_count(self) -> int:\n        return len(self.succeeded)\n\n    @property\n    def failure_count(self) -> int:\n        return len(self.failed)\n\n    @property\n    def all_succeeded(self) -> bool:\n        return len(self.failed) == 0\n\ndef process_batch(items: list[Item]) -> BatchResult[ProcessedItem]:\n    \"\"\"Process items, capturing individual failures.\n\n    Args:\n        items: Items to process.\n\n    Returns:\n        BatchResult with succeeded and failed items by index.\n    \"\"\"\n    succeeded: dict[int, ProcessedItem] = {}\n    failed: dict[int, Exception] = {}\n\n    for idx, item in enumerate(items):\n        try:\n            result = process_single_item(item)\n            succeeded[idx] = result\n        except Exception as e:\n            failed[idx] = e\n\n    return BatchResult(succeeded=succeeded, failed=failed)\n\n# Caller handles partial results\nresult = process_batch(items)\nif not result.all_succeeded:\n    logger.warning(\n        f\"Batch completed with {result.failure_count} failures\",\n        failed_indices=list(result.failed.keys()),\n    )\n```\n\n### Pattern 8: Progress Reporting for Long Operations\n\nProvide visibility into batch progress without coupling business logic to UI.\n\n```python\nfrom collections.abc import Callable\n\nProgressCallback = Callable[[int, int, str], None]  # current, total, status\n\ndef process_large_batch(\n    items: list[Item],\n    on_progress: ProgressCallback | None = None,\n) -> BatchResult:\n    \"\"\"Process batch with optional progress reporting.\n\n    Args:\n        items: Items to process.\n        on_progress: Optional callback receiving (current, total, status).\n    \"\"\"\n    total = len(items)\n    succeeded = {}\n    failed = {}\n\n    for idx, item in enumerate(items):\n        if on_progress:\n            on_progress(idx, total, f\"Processing {item.id}\")\n\n        try:\n            succeeded[idx] = process_single_item(item)\n        except Exception as e:\n            failed[idx] = e\n\n    if on_progress:\n        on_progress(total, total, \"Complete\")\n\n    return BatchResult(succeeded=succeeded, failed=failed)\n```\n\n## Best Practices Summary\n\n1. **Validate early** - Check inputs before expensive operations\n2. **Use specific exceptions** - `ValueError`, `TypeError`, not generic `Exception`\n3. **Include context** - Messages should explain what, why, and how to fix\n4. **Convert types at boundaries** - Parse strings to enums\u002Fdomain types early\n5. **Chain exceptions** - Use `raise ... from e` to preserve debug info\n6. **Handle partial failures** - Don't abort batches on single item errors\n7. **Use Pydantic** - For complex input validation with structured errors\n8. **Document failure modes** - Docstrings should list possible exceptions\n9. **Log with context** - Include IDs, counts, and other debugging info\n10. **Test error paths** - Verify exceptions are raised correctly\n",{"name":5,"description":7,"disable-model-invocation":40},true,"main","224d7699a283a75bd3f75d4d8b03b15aca0ae309","plugins\u002F10x-swe\u002Fskills\u002Fpython-error-handling",0,"https:\u002F\u002Fgithub.com\u002Fcercova-studios\u002F10x-swe","https:\u002F\u002Fgithub.com\u002Fcercova-studios","2026-11-12 07:39:44",{"source":8,"skillName":5,"commands":49,"prompt":59,"zipAvailable":40},[50,53,56],{"tool":51,"command":52},"npx","npx skills add cercova-studios\u002F10x-swe --skill python-error-handling",{"tool":54,"command":55},"bunx","bunx skills add cercova-studios\u002F10x-swe --skill python-error-handling",{"tool":57,"command":58},"pnpm","pnpm dlx skills add cercova-studios\u002F10x-swe --skill python-error-handling","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fcercova-studios\u002F10x-swe\u002Fblob\u002Fmain\u002Fplugins\u002F10x-swe\u002Fskills\u002Fpython-error-handling\u002FSKILL.md",[61],{"path":62,"resourceType":63,"resourceTypeDesc":64,"sizeBytes":65,"sourceHtmlUrl":66},"agents\u002Fopenai.yaml","REFERENCE","参考文档",43,"https:\u002F\u002Fgithub.com\u002Fcercova-studios\u002F10x-swe\u002Fblob\u002Fmain\u002Fplugins\u002F10x-swe\u002Fskills\u002Fpython-error-handling\u002Fagents\u002Fopenai.yaml",[68,108,145,165,184,196],{"skillNo":69,"name":70,"nameZh":6,"description":71,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":72,"licenseFileUrl":73,"sourceHtmlUrl":74,"categories":75,"keywords":81,"publishedAt":35},"01M6CD3T6EQ9N5KPNXCM6ABHVA","turnstile-spin","Set up Cloudflare Turnstile end-to-end in a project. Scan the codebase, create the widget via the Cloudflare API, embed it where user requests need bot verification (form submissions, SPA actions, API endpoints, download links, comment or vote submissions, etc.), wire canonical server-side siteverify in the customer's existing backend, validate, and persist the skill. Load this when a user asks to add Turnstile, set up CAPTCHA, protect a form or endpoint from bots, or fix a Turnstile integration. Uses Cloudflare's documented Turnstile contract.","Apache-2.0","https:\u002F\u002Fgithub.com\u002Fcercova-studios\u002F10x-swe\u002Fblob\u002Fmain\u002Fplugins\u002F10x-swe\u002Fskills\u002Fturnstile-spin\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fcercova-studios\u002F10x-swe\u002Fblob\u002Fmain\u002Fplugins\u002F10x-swe\u002Fskills\u002Fturnstile-spin\u002FSKILL.md",[76],{"categoryNo":77,"categoryName":78,"taxonomyType":79,"taxonomyTypeDesc":80},"01JBSEEDCAT000000000000010","后端与接口","SCENARIO","使用场景",[82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,30],"turnstile spin","SET","nextjs","actions","up","fix","cloudflare","bot","api","permissions","create","astro","server","verification","plugin","endpoints","customer","backend","sveltekit","integration","app","bots","spa","project","end","SWE",{"skillNo":109,"name":110,"nameZh":6,"description":111,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":72,"licenseFileUrl":112,"sourceHtmlUrl":113,"categories":114,"keywords":126,"publishedAt":35},"01M6CD0BJYRNV610HYYPX933RE","frontend-design","Create distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.","https:\u002F\u002Fgithub.com\u002Fcercova-studios\u002F10x-swe\u002Fblob\u002Fmain\u002Fplugins\u002F10x-swe\u002Fskills\u002Ffrontend-design\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Fcercova-studios\u002F10x-swe\u002Fblob\u002Fmain\u002Fplugins\u002F10x-swe\u002Fskills\u002Ffrontend-design\u002FSKILL.md",[115,118,121],{"categoryNo":116,"categoryName":117,"taxonomyType":79,"taxonomyTypeDesc":80},"01JBSEEDCAT000000000000009","前端开发",{"categoryNo":119,"categoryName":120,"taxonomyType":79,"taxonomyTypeDesc":80},"01JBSEEDCAT000000000000015","视觉设计",{"categoryNo":122,"categoryName":123,"taxonomyType":124,"taxonomyTypeDesc":125},"01JBSEEDCAT000000000000032","设计师","PROFESSION","适用职业",[127,128,129,92,130,131,132,133,134,135,25,136,137,138,139,140,141,30,142,143,144],"frontend design","frontend","design","web","quality","applications","creative","web components","Production","code","components","user","generic","aesthetics","pages","with","high","build",{"skillNo":146,"name":147,"nameZh":6,"description":148,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":149,"categories":150,"keywords":151,"publishedAt":35},"01M6CD4QX8C4DST98AY21HEYCM","source-insights","Prepare inspected source evidence, preserve exact citations, and publish reviewed insights into an explicit local library.","https:\u002F\u002Fgithub.com\u002Fcercova-studios\u002F10x-swe\u002Fblob\u002Fmain\u002Fplugins\u002Fknowledge\u002Fskills\u002Fsource-insights\u002FSKILL.md",[],[152,153,154,155,156,157,158,159,160,161,162,163,164],"source insights","insights","source","publish","Citations","evidence","library","workflows","prepare","session","global","local","preserve",{"skillNo":166,"name":167,"nameZh":6,"description":168,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":169,"categories":170,"keywords":174,"publishedAt":35},"01M6CD4N1HVNC1EXPEBZT7YS31","skill-graph","Discover skills and workflows through independent lexical search, relationship paths and a terminal graph.","https:\u002F\u002Fgithub.com\u002Fcercova-studios\u002F10x-swe\u002Fblob\u002Fmain\u002Fplugins\u002Fknowledge\u002Fskills\u002Fskill-graph\u002FSKILL.md",[171],{"categoryNo":172,"categoryName":173,"taxonomyType":79,"taxonomyTypeDesc":80},"01JBSEEDCAT000000000000023","Skill与智能体开发",[175,176,96,159,177,178,179,162,180,181,182,107,183],"graph","skill graph","terminal","10x","search","discover skills","discover","paths","relationship",{"skillNo":185,"name":186,"nameZh":6,"description":187,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":188,"categories":189,"keywords":190,"publishedAt":35},"01M6CD4HQKXNZ57YEGD8QVK6Z6","session-search","Recall public session turns with exact provenance, bounded excerpts and independent piped exports.","https:\u002F\u002Fgithub.com\u002Fcercova-studios\u002F10x-swe\u002Fblob\u002Fmain\u002Fplugins\u002Fknowledge\u002Fskills\u002Fsession-search\u002FSKILL.md",[],[179,161,191,192,159,193,194,162,142,153,154,195],"session search","public","provenance","recall","bounded",{"skillNo":197,"name":198,"nameZh":6,"description":199,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":200,"categories":201,"keywords":208,"publishedAt":35},"01M6CD4ET7DVNBYPDAMAYMSK2T","newsletter","Produce a private local AI newsletter from bounded public research, with cited deep dives, HTML\u002FMarkdown output, Dagu scheduling and seven-day retention.","https:\u002F\u002Fgithub.com\u002Fcercova-studios\u002F10x-swe\u002Fblob\u002Fmain\u002Fplugins\u002Fknowledge\u002Fskills\u002Fnewsletter\u002FSKILL.md",[202,205],{"categoryNo":203,"categoryName":204,"taxonomyType":79,"taxonomyTypeDesc":80},"01JBSEEDCAT000000000000005","邮件与沟通",{"categoryNo":206,"categoryName":207,"taxonomyType":79,"taxonomyTypeDesc":80},"01JBSEEDCAT000000000000021","资料检索与研究",[198,209,210,211,212,192,159,213,214,215,216,162,142,217,218,163,195,219],"local ai","dagu","produce","research","markdown","scheduling","html","daily","deep","retention","output"]