[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6JNX6SDMPWWQS2M39J8RYMG":3,"skill-same:01M6JNX6SDMPWWQS2M39J8RYMG":100},{"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":31,"publishedAt":52,"linkOnly":53,"markdownContent":54,"markdownBody":55,"frontMatter":56,"refName":57,"commitSha":58,"skillDirectory":59,"forksCount":60,"repositoryHtmlUrl":61,"repositoryHomepageUrl":62,"ownerHtmlUrl":63,"ownerBlogUrl":64,"ownerDescription":6,"updatedAt":65,"install":66,"resources":79},"01M6JNX6SDMPWWQS2M39J8RYMG","filter_benchmark",null,"Benchmark and performance-test Django ORM filters on large datasets. Use this skill whenever the user wants to test filter performance, check query plans with EXPLAIN ANALYZE, generate bulk test data for filters, verify index usage, or benchmark any queryset filter in the Saleor codebase. Trigger this even when the user says things like \"test the filter on a big dataset\", \"check if the index is used\", \"generate data for performance testing\", \"run explain analyze on this filter\", or \"benchmark this query\".","LongLeo287\u002FOmniClaw","LongLeo287","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F141803367?v=4","01M6JK75C62VCNZKR5BRZ386YV","LongLeo","01M6JK75GQ78TSP1ZPXNKK3MCH",9,"MIT","https:\u002F\u002Fgithub.com\u002FLongLeo287\u002FOmniClaw\u002Fblob\u002Fmain\u002Fecosystem\u002Fskills\u002Ffilter_benchmark\u002FSKILL.md",[18,23,26],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",{"categoryNo":27,"categoryName":28,"taxonomyType":29,"taxonomyTypeDesc":30},"01JBSEEDCAT000000000000033","数据分析师","PROFESSION","适用职业",[32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51],"filter benchmark","benchmark","filter","filters","things","for","usage","bulk","dataset","trigger","query","testing","orm","django","analyze","data","run","generate","performance testing","performance","2026-11-10 10:12:30",false,"---\nname: filter_benchmark\n\ndescription: Benchmark and performance-test Django ORM filters on large datasets. Use this skill whenever the user wants to test filter performance, check query plans with EXPLAIN ANALYZE, generate bulk test data for filters, verify index usage, or benchmark any queryset filter in the Saleor codebase. Trigger this even when the user says things like \"test the filter on a big dataset\", \"check if the index is used\", \"generate data for performance testing\", \"run explain analyze on this filter\", or \"benchmark this query\".\n---\n\n# Filter Benchmark\n\nPerformance-test Django ORM filters by generating bulk data, extracting the SQL query, and running EXPLAIN ANALYZE to verify index usage and query efficiency.\n\n## Overview\n\nWhen adding or modifying filters in the Saleor GraphQL layer, it's critical to verify they perform well on large datasets — a filter that looks correct on 10 rows can cause full table scans on 100k+. This skill automates the full benchmarking workflow:\n\n1. **Identify** — Read the filter code, understand what fields and joins it touches, check existing indexes\n2. **Generate data** — Write a bulk population script that creates realistic, varied data targeting the exact fields the filter uses\n3. **Populate** — Run the script in Django shell to reach 100k+ rows\n4. **Extract SQL** — Get the actual query the filter produces from the Django ORM\n5. **EXPLAIN ANALYZE** — Run the query plan analysis and check for seq scans, missing indexes, and performance issues\n6. **Report** — Summarize findings and suggest concrete fixes (new indexes, query rewrites)\n\n## Step 1: Identify what to benchmark\n\nRead the filter code to understand:\n- Which model(s) are being filtered\n- Which fields are involved (including related model fields for subquery filters)\n- What indexes exist on those fields (check the model's `Meta.indexes`)\n- What filter input combinations matter (e.g., date ranges, enum values, subqueries with `Exists`)\n\nLook at the filter function source — it lives in `saleor\u002Fgraphql\u002F\u003Capp>\u002Ffilters.py`. Understand the ORM query it builds (`.filter()`, `Q()`, `Exists()`, `OuterRef()`, etc.) because the test data must exercise all code paths.\n\n## Step 2: Generate bulk data script\n\nWrite a Python script that creates test data with enough variety to exercise the filter. The script should:\n\n- Use `bulk_create` with `ignore_conflicts=True` for maximum speed\n- Create data in batches (1000-5000 objects per batch) to avoid memory issues\n- Vary the field values that the filter targets so the query planner sees realistic data distribution\n- For date fields: spread values across a wide range (months\u002Fyears), not just a narrow window\n- For enum\u002Fchoice fields: distribute across all possible values\n- For related objects (e.g., events on a transaction): create multiple per parent with varied attributes\n- Handle required foreign keys by creating or reusing minimal parent objects (orders, checkouts, etc.)\n- Use `timezone.now()` and `timedelta` for date generation\n- Override `auto_now` \u002F `auto_now_add` fields via `bulk_update` after creation when needed\n\nThe script should be a function that creates ~1000 objects per call. The user will call it in a loop to reach 100k+.\n\n**Example structure:**\n\n```python\nimport random\nfrom datetime import timedelta\nfrom decimal import Decimal\n\nfrom django.utils import timezone\n\nfrom saleor.payment.models import TransactionItem, TransactionEvent\nfrom saleor.payment import TransactionEventType\n\n\ndef populate(batch_size=1000):\n    \"\"\"Create batch_size TransactionItems with varied events.\"\"\"\n    now = timezone.now()\n\n    # Create TransactionItems\n    transactions = TransactionItem.objects.bulk_create(\n        [\n            TransactionItem(\n                currency=\"USD\",\n                charged_value=Decimal(\"10.00\"),\n                # Vary dates across 2 years\n                created_at=now - timedelta(days=random.randint(0, 730)),\n            )\n            for _ in range(batch_size)\n        ]\n    )\n\n    # Override auto_now\u002Fauto_now_add fields with varied values via bulk_update\n    for t in transactions:\n        t.created_at = now - timedelta(days=random.randint(0, 730))\n        t.modified_at = now - timedelta(days=random.randint(0, 365))\n    TransactionItem.objects.bulk_update(transactions, [\"created_at\", \"modified_at\"])\n\n    # Create events for each transaction\n    event_types = [e.value for e in TransactionEventType]\n    events = []\n    for t in transactions:\n        num_events = random.randint(1, 4)\n        for _ in range(num_events):\n            events.append(\n                TransactionEvent(\n                    transaction=t,\n                    type=random.choice(event_types),\n                    amount_value=Decimal(\"10.00\"),\n                    currency=\"USD\",\n                    created_at=now - timedelta(days=random.randint(0, 730)),\n                )\n            )\n    TransactionEvent.objects.bulk_create(events)\n    print(\n        f\"Created {len(transactions)} transactions and {len(events)} events. \"\n        f\"Total: {TransactionItem.objects.count()} transactions, \"\n        f\"{TransactionEvent.objects.count()} events\"\n    )\n```\n\nAdapt this pattern to whatever model and filter is being tested. The key principle: the data must vary on exactly the fields the filter touches.\n\n## Step 3: Populate the database\n\nRun the population script in Django shell. Activate the venv first:\n\n```bash\nsource .venv\u002Fbin\u002Factivate && python manage.py shell\n```\n\nThen in the shell, run the function in a loop:\n\n```python\nfor i in range(100):\n    populate()\n```\n\nThis reaches 100k objects. Monitor the output to confirm counts are growing. If the database already has data from a previous run, check counts first and only add what's needed.\n\n## Step 4: Extract the SQL query\n\nGet the actual SQL that the filter produces. There are two approaches — use whichever fits best:\n\n### Approach A: From the filter function directly\n\nOpen a Django shell and call the filter function with representative input values, then print the query:\n\n```python\nfrom saleor.payment.models import TransactionItem\nfrom saleor.graphql.payment.filters import filter_where_created_at_range\n\nqs = TransactionItem.objects.all()\nfiltered = filter_where_created_at_range(qs, None, {\"gte\": \"2025-01-01T00:00:00Z\", \"lte\": \"2025-06-01T00:00:00Z\"})\nprint(str(filtered.query))\n```\n\n### Approach B: From a test with breakpoint\n\nAdd a `breakpoint()` right after the filter call in the filter function, run a test that hits it, then in the debugger:\n\n```python\nprint(str(qs.query))\n```\n\nUse this approach when the filter input is complex (e.g., involves GraphQL variable resolution or multiple conditions).\n\n### Approach C: Using `.explain()` directly\n\n```python\nprint(qs.explain(analyze=True, verbose=True, buffers=True))\n```\n\nThis runs EXPLAIN ANALYZE directly from Django without needing psql. Useful for a quick check, but the `data.sql` + `make explain` approach gives JSON output which is easier to analyze.\n\n## Step 5: Analyze queries and generate report\n\nUse the helper script at `.claude\u002Fskills\u002Ffilter-benchmark\u002Fanalyze_query.py`. It does everything in one call per queryset:\n- Runs EXPLAIN ANALYZE with default planner settings\n- Runs EXPLAIN ANALYZE with `enable_seqscan = OFF` to verify index availability\n- Detects red flags (Seq Scans on large tables, row estimate mismatches, sorts, nested loops with inner seq scans)\n- Saves JSON plans to `\u002Ftmp`\n- Uploads plans to explain.dalibo.com for interactive visualization\n\nRun in Django shell:\n\n```python\nimport sys; sys.path.insert(0, \".claude\u002Fskills\u002Ffilter-benchmark\")\nfrom analyze_query import analyze, report\n\n# Analyze each queryset — prints quick summary + warnings inline\nanalyze(filtered_qs, \"created_at range\")\nanalyze(another_qs, \"events by type\")\n\n# Print a full markdown report with Dalibo links\nreport()\n```\n\nBefore analyzing, verify the querysets actually return rows. If EXPLAIN ANALYZE shows 0 rows, the filter input values don't match the generated data — adjust filter parameters (widen date range, use existing event types) and re-run.\n\nThe `report()` output includes a summary table and per-query details. Use it as the basis for the final report to the user, adding:\n\n**1. Dataset size** — how many objects of each model, how field values are distributed\n\n**2. Recommendations** — if there are warnings, suggest concrete fixes:\n- Missing index: show the migration to add it (use `AddIndexConcurrently`)\n- Suboptimal query: suggest ORM changes in the filter function\n- Missing composite index: when filtering on multiple fields together\n\n## Step 6: Wrap up\n\nAfter presenting the report with Dalibo links, ask the user if they want to clean up the test data. If yes, delete the objects in reverse dependency order (child models first, then parents) to avoid foreign key violations. Use `.delete()` with filtering to target only the bulk-created data — for example, filter by the date range or other markers used during generation. Print counts of deleted objects for confirmation.\n","# Filter Benchmark\n\nPerformance-test Django ORM filters by generating bulk data, extracting the SQL query, and running EXPLAIN ANALYZE to verify index usage and query efficiency.\n\n## Overview\n\nWhen adding or modifying filters in the Saleor GraphQL layer, it's critical to verify they perform well on large datasets — a filter that looks correct on 10 rows can cause full table scans on 100k+. This skill automates the full benchmarking workflow:\n\n1. **Identify** — Read the filter code, understand what fields and joins it touches, check existing indexes\n2. **Generate data** — Write a bulk population script that creates realistic, varied data targeting the exact fields the filter uses\n3. **Populate** — Run the script in Django shell to reach 100k+ rows\n4. **Extract SQL** — Get the actual query the filter produces from the Django ORM\n5. **EXPLAIN ANALYZE** — Run the query plan analysis and check for seq scans, missing indexes, and performance issues\n6. **Report** — Summarize findings and suggest concrete fixes (new indexes, query rewrites)\n\n## Step 1: Identify what to benchmark\n\nRead the filter code to understand:\n- Which model(s) are being filtered\n- Which fields are involved (including related model fields for subquery filters)\n- What indexes exist on those fields (check the model's `Meta.indexes`)\n- What filter input combinations matter (e.g., date ranges, enum values, subqueries with `Exists`)\n\nLook at the filter function source — it lives in `saleor\u002Fgraphql\u002F\u003Capp>\u002Ffilters.py`. Understand the ORM query it builds (`.filter()`, `Q()`, `Exists()`, `OuterRef()`, etc.) because the test data must exercise all code paths.\n\n## Step 2: Generate bulk data script\n\nWrite a Python script that creates test data with enough variety to exercise the filter. The script should:\n\n- Use `bulk_create` with `ignore_conflicts=True` for maximum speed\n- Create data in batches (1000-5000 objects per batch) to avoid memory issues\n- Vary the field values that the filter targets so the query planner sees realistic data distribution\n- For date fields: spread values across a wide range (months\u002Fyears), not just a narrow window\n- For enum\u002Fchoice fields: distribute across all possible values\n- For related objects (e.g., events on a transaction): create multiple per parent with varied attributes\n- Handle required foreign keys by creating or reusing minimal parent objects (orders, checkouts, etc.)\n- Use `timezone.now()` and `timedelta` for date generation\n- Override `auto_now` \u002F `auto_now_add` fields via `bulk_update` after creation when needed\n\nThe script should be a function that creates ~1000 objects per call. The user will call it in a loop to reach 100k+.\n\n**Example structure:**\n\n```python\nimport random\nfrom datetime import timedelta\nfrom decimal import Decimal\n\nfrom django.utils import timezone\n\nfrom saleor.payment.models import TransactionItem, TransactionEvent\nfrom saleor.payment import TransactionEventType\n\n\ndef populate(batch_size=1000):\n    \"\"\"Create batch_size TransactionItems with varied events.\"\"\"\n    now = timezone.now()\n\n    # Create TransactionItems\n    transactions = TransactionItem.objects.bulk_create(\n        [\n            TransactionItem(\n                currency=\"USD\",\n                charged_value=Decimal(\"10.00\"),\n                # Vary dates across 2 years\n                created_at=now - timedelta(days=random.randint(0, 730)),\n            )\n            for _ in range(batch_size)\n        ]\n    )\n\n    # Override auto_now\u002Fauto_now_add fields with varied values via bulk_update\n    for t in transactions:\n        t.created_at = now - timedelta(days=random.randint(0, 730))\n        t.modified_at = now - timedelta(days=random.randint(0, 365))\n    TransactionItem.objects.bulk_update(transactions, [\"created_at\", \"modified_at\"])\n\n    # Create events for each transaction\n    event_types = [e.value for e in TransactionEventType]\n    events = []\n    for t in transactions:\n        num_events = random.randint(1, 4)\n        for _ in range(num_events):\n            events.append(\n                TransactionEvent(\n                    transaction=t,\n                    type=random.choice(event_types),\n                    amount_value=Decimal(\"10.00\"),\n                    currency=\"USD\",\n                    created_at=now - timedelta(days=random.randint(0, 730)),\n                )\n            )\n    TransactionEvent.objects.bulk_create(events)\n    print(\n        f\"Created {len(transactions)} transactions and {len(events)} events. \"\n        f\"Total: {TransactionItem.objects.count()} transactions, \"\n        f\"{TransactionEvent.objects.count()} events\"\n    )\n```\n\nAdapt this pattern to whatever model and filter is being tested. The key principle: the data must vary on exactly the fields the filter touches.\n\n## Step 3: Populate the database\n\nRun the population script in Django shell. Activate the venv first:\n\n```bash\nsource .venv\u002Fbin\u002Factivate && python manage.py shell\n```\n\nThen in the shell, run the function in a loop:\n\n```python\nfor i in range(100):\n    populate()\n```\n\nThis reaches 100k objects. Monitor the output to confirm counts are growing. If the database already has data from a previous run, check counts first and only add what's needed.\n\n## Step 4: Extract the SQL query\n\nGet the actual SQL that the filter produces. There are two approaches — use whichever fits best:\n\n### Approach A: From the filter function directly\n\nOpen a Django shell and call the filter function with representative input values, then print the query:\n\n```python\nfrom saleor.payment.models import TransactionItem\nfrom saleor.graphql.payment.filters import filter_where_created_at_range\n\nqs = TransactionItem.objects.all()\nfiltered = filter_where_created_at_range(qs, None, {\"gte\": \"2025-01-01T00:00:00Z\", \"lte\": \"2025-06-01T00:00:00Z\"})\nprint(str(filtered.query))\n```\n\n### Approach B: From a test with breakpoint\n\nAdd a `breakpoint()` right after the filter call in the filter function, run a test that hits it, then in the debugger:\n\n```python\nprint(str(qs.query))\n```\n\nUse this approach when the filter input is complex (e.g., involves GraphQL variable resolution or multiple conditions).\n\n### Approach C: Using `.explain()` directly\n\n```python\nprint(qs.explain(analyze=True, verbose=True, buffers=True))\n```\n\nThis runs EXPLAIN ANALYZE directly from Django without needing psql. Useful for a quick check, but the `data.sql` + `make explain` approach gives JSON output which is easier to analyze.\n\n## Step 5: Analyze queries and generate report\n\nUse the helper script at `.claude\u002Fskills\u002Ffilter-benchmark\u002Fanalyze_query.py`. It does everything in one call per queryset:\n- Runs EXPLAIN ANALYZE with default planner settings\n- Runs EXPLAIN ANALYZE with `enable_seqscan = OFF` to verify index availability\n- Detects red flags (Seq Scans on large tables, row estimate mismatches, sorts, nested loops with inner seq scans)\n- Saves JSON plans to `\u002Ftmp`\n- Uploads plans to explain.dalibo.com for interactive visualization\n\nRun in Django shell:\n\n```python\nimport sys; sys.path.insert(0, \".claude\u002Fskills\u002Ffilter-benchmark\")\nfrom analyze_query import analyze, report\n\n# Analyze each queryset — prints quick summary + warnings inline\nanalyze(filtered_qs, \"created_at range\")\nanalyze(another_qs, \"events by type\")\n\n# Print a full markdown report with Dalibo links\nreport()\n```\n\nBefore analyzing, verify the querysets actually return rows. If EXPLAIN ANALYZE shows 0 rows, the filter input values don't match the generated data — adjust filter parameters (widen date range, use existing event types) and re-run.\n\nThe `report()` output includes a summary table and per-query details. Use it as the basis for the final report to the user, adding:\n\n**1. Dataset size** — how many objects of each model, how field values are distributed\n\n**2. Recommendations** — if there are warnings, suggest concrete fixes:\n- Missing index: show the migration to add it (use `AddIndexConcurrently`)\n- Suboptimal query: suggest ORM changes in the filter function\n- Missing composite index: when filtering on multiple fields together\n\n## Step 6: Wrap up\n\nAfter presenting the report with Dalibo links, ask the user if they want to clean up the test data. If yes, delete the objects in reverse dependency order (child models first, then parents) to avoid foreign key violations. Use `.delete()` with filtering to target only the bulk-created data — for example, filter by the date range or other markers used during generation. Print counts of deleted objects for confirmation.\n",{"name":5,"description":7},"main","c173cdffe08e788a99b91928a831b476b8434838","ecosystem\u002Fskills\u002Ffilter_benchmark",0,"https:\u002F\u002Fgithub.com\u002FLongLeo287\u002FOmniClaw","https:\u002F\u002Fportfolio-longleo.vercel.app\u002Flabs\u002Fomniclaw.html","https:\u002F\u002Fgithub.com\u002FLongLeo287","https:\u002F\u002Fwww.facebook.com\u002FResourceRookie2023","2026-09-30 00:58:05",{"source":8,"skillName":5,"commands":67,"prompt":77,"zipAvailable":78},[68,71,74],{"tool":69,"command":70},"npx","npx skills add LongLeo287\u002FOmniClaw --skill filter_benchmark",{"tool":72,"command":73},"bunx","bunx skills add LongLeo287\u002FOmniClaw --skill filter_benchmark",{"tool":75,"command":76},"pnpm","pnpm dlx skills add LongLeo287\u002FOmniClaw --skill filter_benchmark","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FLongLeo287\u002FOmniClaw\u002Fblob\u002Fmain\u002Fecosystem\u002Fskills\u002Ffilter_benchmark\u002FSKILL.md",true,[80,86,92,96],{"path":81,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":84,"sourceHtmlUrl":85},"_DIR_IDENTITY.md","REFERENCE","参考文档",154,"https:\u002F\u002Fgithub.com\u002FLongLeo287\u002FOmniClaw\u002Fblob\u002Fmain\u002Fecosystem\u002Fskills\u002Ffilter_benchmark\u002F_DIR_IDENTITY.md",{"path":87,"resourceType":88,"resourceTypeDesc":89,"sizeBytes":90,"sourceHtmlUrl":91},"analyze_query.py","SCRIPT","脚本",8371,"https:\u002F\u002Fgithub.com\u002FLongLeo287\u002FOmniClaw\u002Fblob\u002Fmain\u002Fecosystem\u002Fskills\u002Ffilter_benchmark\u002Fanalyze_query.py",{"path":93,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":94,"sourceHtmlUrl":95},"README.md",467,"https:\u002F\u002Fgithub.com\u002FLongLeo287\u002FOmniClaw\u002Fblob\u002Fmain\u002Fecosystem\u002Fskills\u002Ffilter_benchmark\u002FREADME.md",{"path":97,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":98,"sourceHtmlUrl":99},"schema.json",450,"https:\u002F\u002Fgithub.com\u002FLongLeo287\u002FOmniClaw\u002Fblob\u002Fmain\u002Fecosystem\u002Fskills\u002Ffilter_benchmark\u002Fschema.json",[101,136,157,185,201,227],{"skillNo":102,"name":103,"nameZh":6,"description":104,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":105,"categories":106,"keywords":115,"publishedAt":52},"01M6JR0KQP4MHT32TN40D9CBFX","UI-UX Pro Max","Advanced UI\u002FUX analysis and generation skills with data-driven patterns. Python scripts (core.py, search.py) for systematic UI pattern extraction, design system generation, and component search from curated data sources.","https:\u002F\u002Fgithub.com\u002FLongLeo287\u002FOmniClaw\u002Fblob\u002Fmain\u002Fecosystem\u002Fui_components\u002Fui_ux_pro_max\u002FSKILL.md",[107,110,111,114],{"categoryNo":108,"categoryName":109,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000015","视觉设计",{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":112,"categoryName":113,"taxonomyType":29,"taxonomyTypeDesc":30},"01JBSEEDCAT000000000000032","设计师",{"categoryNo":27,"categoryName":28,"taxonomyType":29,"taxonomyTypeDesc":30},[116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135],"ux","ui","ui ux pro max","max","pro","ui ux","design","component","search","analysis","team","rd","ui-ux","active","systematic","scripts","pattern extraction","sources","advanced","data-driven",{"skillNo":137,"name":138,"nameZh":6,"description":139,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":140,"categories":141,"keywords":143,"publishedAt":52},"01M6JR0EF5AEQHP2FSTB57H05P","shadcn-ui","Expert guidance for integrating and building applications with shadcn\u002Fui components, including component discovery, installation, customization, and best practices.","https:\u002F\u002Fgithub.com\u002FLongLeo287\u002FOmniClaw\u002Fblob\u002Fmain\u002Fecosystem\u002Fui_components\u002Fshadcn_ui\u002FSKILL.md",[142],{"categoryNo":112,"categoryName":113,"taxonomyType":29,"taxonomyTypeDesc":30},[144,117,145,146,123,147,148,149,150,126,151,152,153,129,154,155,156,37],"shadcn","shadcn ui","components","core","best practices","applications","discovery","customization","guidance","expert","installation","ui components","with",{"skillNo":158,"name":159,"nameZh":6,"description":160,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":161,"categories":162,"keywords":166,"publishedAt":52},"01M6JR08F51BEN17RHFYX65WVE","zustand_store_ts","Create Zustand stores with TypeScript, subscribeWithSelector middleware, and proper state\u002Faction separation. Use when building React state management, creating global stores, or implementing reactive state patterns with Zustand.","https:\u002F\u002Fgithub.com\u002FLongLeo287\u002FOmniClaw\u002Fblob\u002Fmain\u002Fecosystem\u002Fskills\u002Fzustand_store_ts\u002FSKILL.md",[163],{"categoryNo":164,"categoryName":165,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000009","前端开发",[167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,156,183,184],"zustand store ts","zustand","store","typescript","microsoft","react","create","state management","state","react state management","management","global","use","patterns","separation","middleware","action","implementing",{"skillNo":186,"name":168,"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":52},"01M6JR00TDMVAFFCZXZ04AN7Q7","Zustand state management guide. Use when working with store code (src\u002Fstore\u002F**), implementing actions, managing state, or creating slices. Triggers on Zustand store development, state management questions, or action implementation.","https:\u002F\u002Fgithub.com\u002FLongLeo287\u002FOmniClaw\u002Fblob\u002Fmain\u002Fecosystem\u002Fskills\u002Fzustand\u002FSKILL.md",[],[168,191,174,192,175,193,194,177,195,179,196,197,198,169,156,199,200,183,184],"development","code","actions","src","guide","implementation","zustand state","triggers","questions","zustand state management",{"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":211,"publishedAt":52},"01M6JQZSWV4KWJP112G6XHEP44","youtube_summarizer","Automatically fetch YouTube video transcripts, generate structured summaries, and send full transcripts to messaging platforms. Detects YouTube URLs and provides metadata, key insights, and downloadable transcripts.","https:\u002F\u002Fgithub.com\u002FLongLeo287\u002FOmniClaw\u002Fblob\u002Fmain\u002Fecosystem\u002Fskills\u002Fyoutube_summarizer\u002FSKILL.md",[207,210],{"categoryNo":208,"categoryName":209,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000016","图像与多媒体",{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[212,213,214,49,215,216,217,218,219,220,221,222,223,224,225,226],"youtube","youtube summarizer","summarizer","metadata","messaging","Video","fetch","telegram","transcription","summarization","structured","full","insights","transcripts","summaries",{"skillNo":228,"name":229,"nameZh":6,"description":230,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":231,"categories":232,"keywords":233,"publishedAt":52},"01M6JQZN3QJB6B77JGKJD62DQT","youtube_clipper","YouTube 视频智能剪辑工具。下载视频和字幕，AI 分析生成精细章节（几分钟级别）， 用户选择片段后自动剪辑、翻译字幕为中英双语、烧录字幕到视频，并生成总结文案。 使用场景：当用户需要剪辑 YouTube 视频、生成短视频片段、制作双语字幕版本时。 关键词：视频剪辑、YouTube、字幕翻译、双语字幕、视频下载、clip video","https:\u002F\u002Fgithub.com\u002FLongLeo287\u002FOmniClaw\u002Fblob\u002Fmain\u002Fecosystem\u002Fskills\u002Fyoutube_clipper\u002FSKILL.md",[],[212,234,235,217,236,237,238,239,240,241,242,243,244,245,246,247,248],"clipper","youtube clipper","Bash","下载","视频","生成","关键词","翻译","read","write","clip","总结","工具","文案","sonnet"]