[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6CD26DDA4EY2JBEV2WBR1GA":3,"skill-same:01M6CD26DDA4EY2JBEV2WBR1GA":72},{"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":40,"linkOnly":41,"markdownContent":42,"markdownBody":43,"frontMatter":44,"refName":46,"commitSha":47,"skillDirectory":48,"forksCount":49,"repositoryHtmlUrl":50,"repositoryHomepageUrl":6,"ownerHtmlUrl":51,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":52,"install":53,"resources":65},"01M6CD26DDA4EY2JBEV2WBR1GA","python-background-jobs",null,"Python background job patterns including task queues, workers, and event-driven architecture. Use when implementing async task processing, job queues, long-running operations, or decoupling work from request\u002Fresponse cycles.","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-background-jobs\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39],"python","background","jobs","background jobs","python background jobs","implementing","decoupling","long","event","running","patterns","queues","request","when","async","processing","work","operations","architecture","workers","use","2026-11-10 10:12:30",false,"---\nname: python-background-jobs\ndescription: Python background job patterns including task queues, workers, and event-driven architecture. Use when implementing async task processing, job queues, long-running operations, or decoupling work from request\u002Fresponse cycles.\ndisable-model-invocation: true\n---\n\n# Python Background Jobs & Task Queues\n\nDecouple long-running or unreliable work from request\u002Fresponse cycles. Return immediately to the user while background workers handle the heavy lifting asynchronously.\n\n## When to Use This Skill\n\n- Processing tasks that take longer than a few seconds\n- Sending emails, notifications, or webhooks\n- Generating reports or exporting data\n- Processing uploads or media transformations\n- Integrating with unreliable external services\n- Building event-driven architectures\n\n## Core Concepts\n\n### 1. Task Queue Pattern\n\nAPI accepts request, enqueues a job, returns immediately with a job ID. Workers process jobs asynchronously.\n\n### 2. Idempotency\n\nTasks may be retried on failure. Design for safe re-execution.\n\n### 3. Job State Machine\n\nJobs transition through states: pending → running → succeeded\u002Ffailed.\n\n### 4. At-Least-Once Delivery\n\nMost queues guarantee at-least-once delivery. Your code must handle duplicates.\n\n## Quick Start\n\nThis skill uses Celery for examples, a widely adopted task queue. Alternatives like RQ, Dramatiq, and cloud-native solutions (AWS SQS, GCP Tasks) are equally valid choices.\n\n```python\nfrom celery import Celery\n\napp = Celery(\"tasks\", broker=\"redis:\u002F\u002Flocalhost:6379\")\n\n@app.task\ndef send_email(to: str, subject: str, body: str) -> None:\n    # This runs in a background worker\n    email_client.send(to, subject, body)\n\n# In your API handler\nsend_email.delay(\"user@example.com\", \"Welcome!\", \"Thanks for signing up\")\n```\n\n## Fundamental Patterns\n\n### Pattern 1: Return Job ID Immediately\n\nFor operations exceeding a few seconds, return a job ID and process asynchronously.\n\n```python\nfrom uuid import uuid4\nfrom dataclasses import dataclass\nfrom enum import Enum\nfrom datetime import datetime\n\nclass JobStatus(Enum):\n    PENDING = \"pending\"\n    RUNNING = \"running\"\n    SUCCEEDED = \"succeeded\"\n    FAILED = \"failed\"\n\n@dataclass\nclass Job:\n    id: str\n    status: JobStatus\n    created_at: datetime\n    started_at: datetime | None = None\n    completed_at: datetime | None = None\n    result: dict | None = None\n    error: str | None = None\n\n# API endpoint\nasync def start_export(request: ExportRequest) -> JobResponse:\n    \"\"\"Start export job and return job ID.\"\"\"\n    job_id = str(uuid4())\n\n    # Persist job record\n    await jobs_repo.create(Job(\n        id=job_id,\n        status=JobStatus.PENDING,\n        created_at=datetime.utcnow(),\n    ))\n\n    # Enqueue task for background processing\n    await task_queue.enqueue(\n        \"export_data\",\n        job_id=job_id,\n        params=request.model_dump(),\n    )\n\n    # Return immediately with job ID\n    return JobResponse(\n        job_id=job_id,\n        status=\"pending\",\n        poll_url=f\"\u002Fjobs\u002F{job_id}\",\n    )\n```\n\n### Pattern 2: Celery Task Configuration\n\nConfigure Celery tasks with proper retry and timeout settings.\n\n```python\nfrom celery import Celery\n\napp = Celery(\"tasks\", broker=\"redis:\u002F\u002Flocalhost:6379\")\n\n# Global configuration\napp.conf.update(\n    task_time_limit=3600,          # Hard limit: 1 hour\n    task_soft_time_limit=3000,      # Soft limit: 50 minutes\n    task_acks_late=True,            # Acknowledge after completion\n    task_reject_on_worker_lost=True,\n    worker_prefetch_multiplier=1,   # Don't prefetch too many tasks\n)\n\n@app.task(\n    bind=True,\n    max_retries=3,\n    default_retry_delay=60,\n    autoretry_for=(ConnectionError, TimeoutError),\n)\ndef process_payment(self, payment_id: str) -> dict:\n    \"\"\"Process payment with automatic retry on transient errors.\"\"\"\n    try:\n        result = payment_gateway.charge(payment_id)\n        return {\"status\": \"success\", \"transaction_id\": result.id}\n    except PaymentDeclinedError as e:\n        # Don't retry permanent failures\n        return {\"status\": \"declined\", \"reason\": str(e)}\n    except TransientError as e:\n        # Retry with exponential backoff\n        raise self.retry(exc=e, countdown=2 ** self.request.retries * 60)\n```\n\n### Pattern 3: Make Tasks Idempotent\n\nWorkers may retry on crash or timeout. Design for safe re-execution.\n\n```python\n@app.task(bind=True)\ndef process_order(self, order_id: str) -> None:\n    \"\"\"Process order idempotently.\"\"\"\n    order = orders_repo.get(order_id)\n\n    # Already processed? Return early\n    if order.status == OrderStatus.COMPLETED:\n        logger.info(\"Order already processed\", order_id=order_id)\n        return\n\n    # Already in progress? Check if we should continue\n    if order.status == OrderStatus.PROCESSING:\n        # Use idempotency key to avoid double-charging\n        pass\n\n    # Process with idempotency key\n    result = payment_provider.charge(\n        amount=order.total,\n        idempotency_key=f\"order-{order_id}\",  # Critical!\n    )\n\n    orders_repo.update(order_id, status=OrderStatus.COMPLETED)\n```\n\n**Idempotency Strategies:**\n\n1. **Check-before-write**: Verify state before action\n2. **Idempotency keys**: Use unique tokens with external services\n3. **Upsert patterns**: `INSERT ... ON CONFLICT UPDATE`\n4. **Deduplication window**: Track processed IDs for N hours\n\n### Pattern 4: Job State Management\n\nPersist job state transitions for visibility and debugging.\n\n```python\nclass JobRepository:\n    \"\"\"Repository for managing job state.\"\"\"\n\n    async def create(self, job: Job) -> Job:\n        \"\"\"Create new job record.\"\"\"\n        await self._db.execute(\n            \"\"\"INSERT INTO jobs (id, status, created_at)\n               VALUES ($1, $2, $3)\"\"\",\n            job.id, job.status.value, job.created_at,\n        )\n        return job\n\n    async def update_status(\n        self,\n        job_id: str,\n        status: JobStatus,\n        **fields,\n    ) -> None:\n        \"\"\"Update job status with timestamp.\"\"\"\n        updates = {\"status\": status.value, **fields}\n\n        if status == JobStatus.RUNNING:\n            updates[\"started_at\"] = datetime.utcnow()\n        elif status in (JobStatus.SUCCEEDED, JobStatus.FAILED):\n            updates[\"completed_at\"] = datetime.utcnow()\n\n        await self._db.execute(\n            \"UPDATE jobs SET status = $1, ... WHERE id = $2\",\n            updates, job_id,\n        )\n\n        logger.info(\n            \"Job status updated\",\n            job_id=job_id,\n            status=status.value,\n        )\n```\n\n## Advanced Patterns\n\n### Pattern 5: Dead Letter Queue\n\nHandle permanently failed tasks for manual inspection.\n\n```python\n@app.task(bind=True, max_retries=3)\ndef process_webhook(self, webhook_id: str, payload: dict) -> None:\n    \"\"\"Process webhook with DLQ for failures.\"\"\"\n    try:\n        result = send_webhook(payload)\n        if not result.success:\n            raise WebhookFailedError(result.error)\n    except Exception as e:\n        if self.request.retries >= self.max_retries:\n            # Move to dead letter queue for manual inspection\n            dead_letter_queue.send({\n                \"task\": \"process_webhook\",\n                \"webhook_id\": webhook_id,\n                \"payload\": payload,\n                \"error\": str(e),\n                \"attempts\": self.request.retries + 1,\n                \"failed_at\": datetime.utcnow().isoformat(),\n            })\n            logger.error(\n                \"Webhook moved to DLQ after max retries\",\n                webhook_id=webhook_id,\n                error=str(e),\n            )\n            return\n\n        # Exponential backoff retry\n        raise self.retry(exc=e, countdown=2 ** self.request.retries * 60)\n```\n\n### Pattern 6: Status Polling Endpoint\n\nProvide an endpoint for clients to check job status.\n\n```python\nfrom fastapi import FastAPI, HTTPException\n\napp = FastAPI()\n\n@app.get(\"\u002Fjobs\u002F{job_id}\")\nasync def get_job_status(job_id: str) -> JobStatusResponse:\n    \"\"\"Get current status of a background job.\"\"\"\n    job = await jobs_repo.get(job_id)\n\n    if job is None:\n        raise HTTPException(404, f\"Job {job_id} not found\")\n\n    return JobStatusResponse(\n        job_id=job.id,\n        status=job.status.value,\n        created_at=job.created_at,\n        started_at=job.started_at,\n        completed_at=job.completed_at,\n        result=job.result if job.status == JobStatus.SUCCEEDED else None,\n        error=job.error if job.status == JobStatus.FAILED else None,\n        # Helpful for clients\n        is_terminal=job.status in (JobStatus.SUCCEEDED, JobStatus.FAILED),\n    )\n```\n\n### Pattern 7: Task Chaining and Workflows\n\nCompose complex workflows from simple tasks.\n\n```python\nfrom celery import chain, group, chord\n\n# Simple chain: A → B → C\nworkflow = chain(\n    extract_data.s(source_id),\n    transform_data.s(),\n    load_data.s(destination_id),\n)\n\n# Parallel execution: A, B, C all at once\nparallel = group(\n    send_email.s(user_email),\n    send_sms.s(user_phone),\n    update_analytics.s(event_data),\n)\n\n# Chord: Run tasks in parallel, then a callback\n# Process all items, then send completion notification\nworkflow = chord(\n    [process_item.s(item_id) for item_id in item_ids],\n    send_completion_notification.s(batch_id),\n)\n\nworkflow.apply_async()\n```\n\n### Pattern 8: Alternative Task Queues\n\nChoose the right tool for your needs.\n\n**RQ (Redis Queue)**: Simple, Redis-based\n```python\nfrom rq import Queue\nfrom redis import Redis\n\nqueue = Queue(connection=Redis())\njob = queue.enqueue(send_email, \"user@example.com\", \"Subject\", \"Body\")\n```\n\n**Dramatiq**: Modern Celery alternative\n```python\nimport dramatiq\nfrom dramatiq.brokers.redis import RedisBroker\n\ndramatiq.set_broker(RedisBroker())\n\n@dramatiq.actor\ndef send_email(to: str, subject: str, body: str) -> None:\n    email_client.send(to, subject, body)\n```\n\n**Cloud-native options:**\n- AWS SQS + Lambda\n- Google Cloud Tasks\n- Azure Functions\n\n## Best Practices Summary\n\n1. **Return immediately** - Don't block requests for long operations\n2. **Persist job state** - Enable status polling and debugging\n3. **Make tasks idempotent** - Safe to retry on any failure\n4. **Use idempotency keys** - For external service calls\n5. **Set timeouts** - Both soft and hard limits\n6. **Implement DLQ** - Capture permanently failed tasks\n7. **Log transitions** - Track job state changes\n8. **Retry appropriately** - Exponential backoff for transient errors\n9. **Don't retry permanent failures** - Validation errors, invalid credentials\n10. **Monitor queue depth** - Alert on backlog growth\n","# Python Background Jobs & Task Queues\n\nDecouple long-running or unreliable work from request\u002Fresponse cycles. Return immediately to the user while background workers handle the heavy lifting asynchronously.\n\n## When to Use This Skill\n\n- Processing tasks that take longer than a few seconds\n- Sending emails, notifications, or webhooks\n- Generating reports or exporting data\n- Processing uploads or media transformations\n- Integrating with unreliable external services\n- Building event-driven architectures\n\n## Core Concepts\n\n### 1. Task Queue Pattern\n\nAPI accepts request, enqueues a job, returns immediately with a job ID. Workers process jobs asynchronously.\n\n### 2. Idempotency\n\nTasks may be retried on failure. Design for safe re-execution.\n\n### 3. Job State Machine\n\nJobs transition through states: pending → running → succeeded\u002Ffailed.\n\n### 4. At-Least-Once Delivery\n\nMost queues guarantee at-least-once delivery. Your code must handle duplicates.\n\n## Quick Start\n\nThis skill uses Celery for examples, a widely adopted task queue. Alternatives like RQ, Dramatiq, and cloud-native solutions (AWS SQS, GCP Tasks) are equally valid choices.\n\n```python\nfrom celery import Celery\n\napp = Celery(\"tasks\", broker=\"redis:\u002F\u002Flocalhost:6379\")\n\n@app.task\ndef send_email(to: str, subject: str, body: str) -> None:\n    # This runs in a background worker\n    email_client.send(to, subject, body)\n\n# In your API handler\nsend_email.delay(\"user@example.com\", \"Welcome!\", \"Thanks for signing up\")\n```\n\n## Fundamental Patterns\n\n### Pattern 1: Return Job ID Immediately\n\nFor operations exceeding a few seconds, return a job ID and process asynchronously.\n\n```python\nfrom uuid import uuid4\nfrom dataclasses import dataclass\nfrom enum import Enum\nfrom datetime import datetime\n\nclass JobStatus(Enum):\n    PENDING = \"pending\"\n    RUNNING = \"running\"\n    SUCCEEDED = \"succeeded\"\n    FAILED = \"failed\"\n\n@dataclass\nclass Job:\n    id: str\n    status: JobStatus\n    created_at: datetime\n    started_at: datetime | None = None\n    completed_at: datetime | None = None\n    result: dict | None = None\n    error: str | None = None\n\n# API endpoint\nasync def start_export(request: ExportRequest) -> JobResponse:\n    \"\"\"Start export job and return job ID.\"\"\"\n    job_id = str(uuid4())\n\n    # Persist job record\n    await jobs_repo.create(Job(\n        id=job_id,\n        status=JobStatus.PENDING,\n        created_at=datetime.utcnow(),\n    ))\n\n    # Enqueue task for background processing\n    await task_queue.enqueue(\n        \"export_data\",\n        job_id=job_id,\n        params=request.model_dump(),\n    )\n\n    # Return immediately with job ID\n    return JobResponse(\n        job_id=job_id,\n        status=\"pending\",\n        poll_url=f\"\u002Fjobs\u002F{job_id}\",\n    )\n```\n\n### Pattern 2: Celery Task Configuration\n\nConfigure Celery tasks with proper retry and timeout settings.\n\n```python\nfrom celery import Celery\n\napp = Celery(\"tasks\", broker=\"redis:\u002F\u002Flocalhost:6379\")\n\n# Global configuration\napp.conf.update(\n    task_time_limit=3600,          # Hard limit: 1 hour\n    task_soft_time_limit=3000,      # Soft limit: 50 minutes\n    task_acks_late=True,            # Acknowledge after completion\n    task_reject_on_worker_lost=True,\n    worker_prefetch_multiplier=1,   # Don't prefetch too many tasks\n)\n\n@app.task(\n    bind=True,\n    max_retries=3,\n    default_retry_delay=60,\n    autoretry_for=(ConnectionError, TimeoutError),\n)\ndef process_payment(self, payment_id: str) -> dict:\n    \"\"\"Process payment with automatic retry on transient errors.\"\"\"\n    try:\n        result = payment_gateway.charge(payment_id)\n        return {\"status\": \"success\", \"transaction_id\": result.id}\n    except PaymentDeclinedError as e:\n        # Don't retry permanent failures\n        return {\"status\": \"declined\", \"reason\": str(e)}\n    except TransientError as e:\n        # Retry with exponential backoff\n        raise self.retry(exc=e, countdown=2 ** self.request.retries * 60)\n```\n\n### Pattern 3: Make Tasks Idempotent\n\nWorkers may retry on crash or timeout. Design for safe re-execution.\n\n```python\n@app.task(bind=True)\ndef process_order(self, order_id: str) -> None:\n    \"\"\"Process order idempotently.\"\"\"\n    order = orders_repo.get(order_id)\n\n    # Already processed? Return early\n    if order.status == OrderStatus.COMPLETED:\n        logger.info(\"Order already processed\", order_id=order_id)\n        return\n\n    # Already in progress? Check if we should continue\n    if order.status == OrderStatus.PROCESSING:\n        # Use idempotency key to avoid double-charging\n        pass\n\n    # Process with idempotency key\n    result = payment_provider.charge(\n        amount=order.total,\n        idempotency_key=f\"order-{order_id}\",  # Critical!\n    )\n\n    orders_repo.update(order_id, status=OrderStatus.COMPLETED)\n```\n\n**Idempotency Strategies:**\n\n1. **Check-before-write**: Verify state before action\n2. **Idempotency keys**: Use unique tokens with external services\n3. **Upsert patterns**: `INSERT ... ON CONFLICT UPDATE`\n4. **Deduplication window**: Track processed IDs for N hours\n\n### Pattern 4: Job State Management\n\nPersist job state transitions for visibility and debugging.\n\n```python\nclass JobRepository:\n    \"\"\"Repository for managing job state.\"\"\"\n\n    async def create(self, job: Job) -> Job:\n        \"\"\"Create new job record.\"\"\"\n        await self._db.execute(\n            \"\"\"INSERT INTO jobs (id, status, created_at)\n               VALUES ($1, $2, $3)\"\"\",\n            job.id, job.status.value, job.created_at,\n        )\n        return job\n\n    async def update_status(\n        self,\n        job_id: str,\n        status: JobStatus,\n        **fields,\n    ) -> None:\n        \"\"\"Update job status with timestamp.\"\"\"\n        updates = {\"status\": status.value, **fields}\n\n        if status == JobStatus.RUNNING:\n            updates[\"started_at\"] = datetime.utcnow()\n        elif status in (JobStatus.SUCCEEDED, JobStatus.FAILED):\n            updates[\"completed_at\"] = datetime.utcnow()\n\n        await self._db.execute(\n            \"UPDATE jobs SET status = $1, ... WHERE id = $2\",\n            updates, job_id,\n        )\n\n        logger.info(\n            \"Job status updated\",\n            job_id=job_id,\n            status=status.value,\n        )\n```\n\n## Advanced Patterns\n\n### Pattern 5: Dead Letter Queue\n\nHandle permanently failed tasks for manual inspection.\n\n```python\n@app.task(bind=True, max_retries=3)\ndef process_webhook(self, webhook_id: str, payload: dict) -> None:\n    \"\"\"Process webhook with DLQ for failures.\"\"\"\n    try:\n        result = send_webhook(payload)\n        if not result.success:\n            raise WebhookFailedError(result.error)\n    except Exception as e:\n        if self.request.retries >= self.max_retries:\n            # Move to dead letter queue for manual inspection\n            dead_letter_queue.send({\n                \"task\": \"process_webhook\",\n                \"webhook_id\": webhook_id,\n                \"payload\": payload,\n                \"error\": str(e),\n                \"attempts\": self.request.retries + 1,\n                \"failed_at\": datetime.utcnow().isoformat(),\n            })\n            logger.error(\n                \"Webhook moved to DLQ after max retries\",\n                webhook_id=webhook_id,\n                error=str(e),\n            )\n            return\n\n        # Exponential backoff retry\n        raise self.retry(exc=e, countdown=2 ** self.request.retries * 60)\n```\n\n### Pattern 6: Status Polling Endpoint\n\nProvide an endpoint for clients to check job status.\n\n```python\nfrom fastapi import FastAPI, HTTPException\n\napp = FastAPI()\n\n@app.get(\"\u002Fjobs\u002F{job_id}\")\nasync def get_job_status(job_id: str) -> JobStatusResponse:\n    \"\"\"Get current status of a background job.\"\"\"\n    job = await jobs_repo.get(job_id)\n\n    if job is None:\n        raise HTTPException(404, f\"Job {job_id} not found\")\n\n    return JobStatusResponse(\n        job_id=job.id,\n        status=job.status.value,\n        created_at=job.created_at,\n        started_at=job.started_at,\n        completed_at=job.completed_at,\n        result=job.result if job.status == JobStatus.SUCCEEDED else None,\n        error=job.error if job.status == JobStatus.FAILED else None,\n        # Helpful for clients\n        is_terminal=job.status in (JobStatus.SUCCEEDED, JobStatus.FAILED),\n    )\n```\n\n### Pattern 7: Task Chaining and Workflows\n\nCompose complex workflows from simple tasks.\n\n```python\nfrom celery import chain, group, chord\n\n# Simple chain: A → B → C\nworkflow = chain(\n    extract_data.s(source_id),\n    transform_data.s(),\n    load_data.s(destination_id),\n)\n\n# Parallel execution: A, B, C all at once\nparallel = group(\n    send_email.s(user_email),\n    send_sms.s(user_phone),\n    update_analytics.s(event_data),\n)\n\n# Chord: Run tasks in parallel, then a callback\n# Process all items, then send completion notification\nworkflow = chord(\n    [process_item.s(item_id) for item_id in item_ids],\n    send_completion_notification.s(batch_id),\n)\n\nworkflow.apply_async()\n```\n\n### Pattern 8: Alternative Task Queues\n\nChoose the right tool for your needs.\n\n**RQ (Redis Queue)**: Simple, Redis-based\n```python\nfrom rq import Queue\nfrom redis import Redis\n\nqueue = Queue(connection=Redis())\njob = queue.enqueue(send_email, \"user@example.com\", \"Subject\", \"Body\")\n```\n\n**Dramatiq**: Modern Celery alternative\n```python\nimport dramatiq\nfrom dramatiq.brokers.redis import RedisBroker\n\ndramatiq.set_broker(RedisBroker())\n\n@dramatiq.actor\ndef send_email(to: str, subject: str, body: str) -> None:\n    email_client.send(to, subject, body)\n```\n\n**Cloud-native options:**\n- AWS SQS + Lambda\n- Google Cloud Tasks\n- Azure Functions\n\n## Best Practices Summary\n\n1. **Return immediately** - Don't block requests for long operations\n2. **Persist job state** - Enable status polling and debugging\n3. **Make tasks idempotent** - Safe to retry on any failure\n4. **Use idempotency keys** - For external service calls\n5. **Set timeouts** - Both soft and hard limits\n6. **Implement DLQ** - Capture permanently failed tasks\n7. **Log transitions** - Track job state changes\n8. **Retry appropriately** - Exponential backoff for transient errors\n9. **Don't retry permanent failures** - Validation errors, invalid credentials\n10. **Monitor queue depth** - Alert on backlog growth\n",{"name":5,"description":7,"disable-model-invocation":45},true,"main","224d7699a283a75bd3f75d4d8b03b15aca0ae309","plugins\u002F10x-swe\u002Fskills\u002Fpython-background-jobs",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":54,"prompt":64,"zipAvailable":45},[55,58,61],{"tool":56,"command":57},"npx","npx skills add cercova-studios\u002F10x-swe --skill python-background-jobs",{"tool":59,"command":60},"bunx","bunx skills add cercova-studios\u002F10x-swe --skill python-background-jobs",{"tool":62,"command":63},"pnpm","pnpm dlx skills add cercova-studios\u002F10x-swe --skill python-background-jobs","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fcercova-studios\u002F10x-swe\u002Fblob\u002Fmain\u002Fplugins\u002F10x-swe\u002Fskills\u002Fpython-background-jobs\u002FSKILL.md",[66],{"path":67,"resourceType":68,"resourceTypeDesc":69,"sizeBytes":70,"sourceHtmlUrl":71},"agents\u002Fopenai.yaml","REFERENCE","参考文档",43,"https:\u002F\u002Fgithub.com\u002Fcercova-studios\u002F10x-swe\u002Fblob\u002Fmain\u002Fplugins\u002F10x-swe\u002Fskills\u002Fpython-background-jobs\u002Fagents\u002Fopenai.yaml",[73,113,150,170,189,201],{"skillNo":74,"name":75,"nameZh":6,"description":76,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":77,"licenseFileUrl":78,"sourceHtmlUrl":79,"categories":80,"keywords":86,"publishedAt":40},"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",[81],{"categoryNo":82,"categoryName":83,"taxonomyType":84,"taxonomyTypeDesc":85},"01JBSEEDCAT000000000000010","后端与接口","SCENARIO","使用场景",[87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,32],"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":114,"name":115,"nameZh":6,"description":116,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":77,"licenseFileUrl":117,"sourceHtmlUrl":118,"categories":119,"keywords":131,"publishedAt":40},"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",[120,123,126],{"categoryNo":121,"categoryName":122,"taxonomyType":84,"taxonomyTypeDesc":85},"01JBSEEDCAT000000000000009","前端开发",{"categoryNo":124,"categoryName":125,"taxonomyType":84,"taxonomyTypeDesc":85},"01JBSEEDCAT000000000000015","视觉设计",{"categoryNo":127,"categoryName":128,"taxonomyType":129,"taxonomyTypeDesc":130},"01JBSEEDCAT000000000000032","设计师","PROFESSION","适用职业",[132,133,134,97,135,136,137,138,139,140,39,141,142,143,144,145,146,32,147,148,149],"frontend design","frontend","design","web","quality","applications","creative","web components","Production","code","components","user","generic","aesthetics","pages","with","high","build",{"skillNo":151,"name":152,"nameZh":6,"description":153,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":154,"categories":155,"keywords":156,"publishedAt":40},"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",[],[157,158,159,160,161,162,163,164,165,166,167,168,169],"source insights","insights","source","publish","Citations","evidence","library","workflows","prepare","session","global","local","preserve",{"skillNo":171,"name":172,"nameZh":6,"description":173,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":174,"categories":175,"keywords":179,"publishedAt":40},"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",[176],{"categoryNo":177,"categoryName":178,"taxonomyType":84,"taxonomyTypeDesc":85},"01JBSEEDCAT000000000000023","Skill与智能体开发",[180,181,101,164,182,183,184,167,185,186,187,112,188],"graph","skill graph","terminal","10x","search","discover skills","discover","paths","relationship",{"skillNo":190,"name":191,"nameZh":6,"description":192,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":193,"categories":194,"keywords":195,"publishedAt":40},"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",[],[184,166,196,197,164,198,199,167,147,158,159,200],"session search","public","provenance","recall","bounded",{"skillNo":202,"name":203,"nameZh":6,"description":204,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":205,"categories":206,"keywords":213,"publishedAt":40},"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",[207,210],{"categoryNo":208,"categoryName":209,"taxonomyType":84,"taxonomyTypeDesc":85},"01JBSEEDCAT000000000000005","邮件与沟通",{"categoryNo":211,"categoryName":212,"taxonomyType":84,"taxonomyTypeDesc":85},"01JBSEEDCAT000000000000021","资料检索与研究",[203,214,215,216,217,197,164,218,219,220,221,167,147,222,223,168,200,224],"local ai","dagu","produce","research","markdown","scheduling","html","daily","deep","retention","output"]