[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6ENXWB9WS5NQG1W9TWWPXZP":3,"skill-same:01M6ENXWB9WS5NQG1W9TWWPXZP":62},{"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":28,"linkOnly":29,"markdownContent":30,"markdownBody":31,"frontMatter":32,"refName":33,"commitSha":34,"skillDirectory":35,"forksCount":36,"repositoryHtmlUrl":37,"repositoryHomepageUrl":38,"ownerHtmlUrl":39,"ownerBlogUrl":6,"ownerDescription":40,"updatedAt":41,"install":42,"resources":55},"01M6ENXWB9WS5NQG1W9TWWPXZP","py-alembic-patterns",null,"Alembic migration patterns for PostgreSQL. Use when creating migrations, reviewing autogenerated migrations, or handling schema changes safely.","ComeOnOliver\u002Fskillshub","ComeOnOliver","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F43215937?v=4","01M6E5JNFECJAAVFE0W7SMWWD2","Haoran Shu","01M6E5JNNDQS7AJZDYFQ8TPZCK",67,"MIT","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fcjharmath\u002Fpy-alembic-patterns\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27],"patterns","alembic","py alembic patterns","postgresql","use","schema","migration","migrations","autogenerated","2026-11-10 10:12:30",false,"---\nname: py-alembic-patterns\ndescription: Alembic migration patterns for PostgreSQL. Use when creating migrations, reviewing autogenerated migrations, or handling schema changes safely.\n---\n\n# Alembic Migration Patterns\n\n## Problem Statement\n\nAlembic autogenerate is convenient but misses things and sometimes generates dangerous migrations. Schema changes are high-risk - bad migrations cause data loss or downtime. Every migration needs human review.\n\n---\n\n## Pattern: Migration Commands\n\n```bash\n# Generate migration from model changes\nuv run alembic revision --autogenerate -m \"Add user preferences table\"\n\n# Apply migrations\nuv run alembic upgrade head\n\n# Rollback one migration\nuv run alembic downgrade -1\n\n# Rollback to specific revision\nuv run alembic downgrade abc123\n\n# Show current revision\nuv run alembic current\n\n# Show migration history\nuv run alembic history\n\n# Show pending migrations\nuv run alembic history --indicate-current\n```\n\n---\n\n## Pattern: Reviewing Autogenerated Migrations\n\n**ALWAYS review autogenerated migrations. They often need fixes.**\n\n### What Autogenerate Catches\n- Table creation\u002Fdeletion\n- Column addition\u002Fremoval\n- Column type changes\n- Foreign key changes\n- Index changes (sometimes)\n\n### What Autogenerate Misses\n- Column renames (sees as drop + add = DATA LOSS)\n- Table renames (same problem)\n- Data migrations\n- Constraint names\n- Partial indexes\n- Complex index changes\n- Check constraints\n- Triggers and functions\n\n```python\n# ❌ DANGEROUS: Autogenerated for column rename\ndef upgrade():\n    op.drop_column(\"users\", \"name\")      # DATA LOSS!\n    op.add_column(\"users\", sa.Column(\"full_name\", sa.String()))\n\n# ✅ CORRECT: Manual rename\ndef upgrade():\n    op.alter_column(\"users\", \"name\", new_column_name=\"full_name\")\n\ndef downgrade():\n    op.alter_column(\"users\", \"full_name\", new_column_name=\"name\")\n```\n\n---\n\n## Pattern: Safe Migration Structure\n\n```python\n\"\"\"Add user preferences table.\n\nRevision ID: abc123\nRevises: def456\nCreate Date: 2024-01-15 10:30:00.000000\n\"\"\"\nfrom alembic import op\nimport sqlalchemy as sa\nfrom sqlalchemy.dialects import postgresql\n\n# revision identifiers\nrevision = \"abc123\"\ndown_revision = \"def456\"\nbranch_labels = None\ndepends_on = None\n\n\ndef upgrade() -> None:\n    # Always explicit, never rely on defaults\n    op.create_table(\n        \"user_preferences\",\n        sa.Column(\"id\", postgresql.UUID(as_uuid=True), primary_key=True),\n        sa.Column(\"user_id\", postgresql.UUID(as_uuid=True), nullable=False),\n        sa.Column(\"theme\", sa.String(50), nullable=False, server_default=\"light\"),\n        sa.Column(\"notifications_enabled\", sa.Boolean(), nullable=False, server_default=\"true\"),\n        sa.Column(\"created_at\", sa.DateTime(timezone=True), server_default=sa.func.now()),\n    )\n    \n    # Explicit index names\n    op.create_index(\n        \"ix_user_preferences_user_id\",\n        \"user_preferences\",\n        [\"user_id\"],\n    )\n    \n    # Foreign key with explicit name\n    op.create_foreign_key(\n        \"fk_user_preferences_user_id\",\n        \"user_preferences\",\n        \"users\",\n        [\"user_id\"],\n        [\"id\"],\n        ondelete=\"CASCADE\",\n    )\n\n\ndef downgrade() -> None:\n    # Always implement downgrade!\n    op.drop_constraint(\"fk_user_preferences_user_id\", \"user_preferences\", type_=\"foreignkey\")\n    op.drop_index(\"ix_user_preferences_user_id\", \"user_preferences\")\n    op.drop_table(\"user_preferences\")\n```\n\n---\n\n## Pattern: Adding Non-Nullable Columns\n\n**Problem:** Adding NOT NULL column to existing table fails if table has rows.\n\n```python\n# ❌ WRONG: Fails if table has data\ndef upgrade():\n    op.add_column(\"users\", sa.Column(\"role\", sa.String(50), nullable=False))\n\n# ✅ CORRECT: Three-step process\ndef upgrade():\n    # Step 1: Add as nullable\n    op.add_column(\"users\", sa.Column(\"role\", sa.String(50), nullable=True))\n    \n    # Step 2: Backfill existing rows\n    op.execute(\"UPDATE users SET role = 'member' WHERE role IS NULL\")\n    \n    # Step 3: Add NOT NULL constraint\n    op.alter_column(\"users\", \"role\", nullable=False)\n\ndef downgrade():\n    op.drop_column(\"users\", \"role\")\n```\n\n---\n\n## Pattern: Data Migrations\n\n**Problem:** Need to transform existing data during schema change.\n\n```python\nfrom sqlalchemy import text\n\ndef upgrade():\n    # Get connection for data operations\n    connection = op.get_bind()\n    \n    # Add new column\n    op.add_column(\"assessments\", sa.Column(\"status\", sa.String(20)))\n    \n    # Migrate data\n    connection.execute(\n        text(\"\"\"\n            UPDATE assessments \n            SET status = CASE \n                WHEN completed_at IS NOT NULL THEN 'completed'\n                WHEN started_at IS NOT NULL THEN 'in_progress'\n                ELSE 'pending'\n            END\n        \"\"\")\n    )\n    \n    # Now safe to add NOT NULL\n    op.alter_column(\"assessments\", \"status\", nullable=False)\n\n\ndef downgrade():\n    op.drop_column(\"assessments\", \"status\")\n```\n\n---\n\n## Pattern: Large Table Migrations\n\n**Problem:** Migrations on large tables can lock the table for too long.\n\n```python\ndef upgrade():\n    # ✅ CORRECT: Add index concurrently (no lock)\n    op.execute(\n        \"CREATE INDEX CONCURRENTLY ix_events_user_id ON events (user_id)\"\n    )\n    \n    # Note: CONCURRENTLY requires autocommit mode\n    # Add to migration file:\n    # from alembic import context\n    # context.configure(transaction_per_migration=False)\n\ndef downgrade():\n    op.execute(\"DROP INDEX CONCURRENTLY IF EXISTS ix_events_user_id\")\n\n\n# For column changes on large tables, consider:\n# 1. Add new column (nullable)\n# 2. Backfill in batches via separate script\n# 3. Add constraint in separate migration\n```\n\n---\n\n## Pattern: Enum Changes\n\n**Problem:** PostgreSQL enums are tricky to modify.\n\n```python\n# Adding a value to existing enum\ndef upgrade():\n    # PostgreSQL-specific: Add value to enum\n    op.execute(\"ALTER TYPE assessment_status ADD VALUE 'archived'\")\n\ndef downgrade():\n    # Can't remove enum values in PostgreSQL!\n    # Options:\n    # 1. Leave it (usually fine)\n    # 2. Recreate enum (complex, requires data migration)\n    pass\n\n\n# Creating new enum\ndef upgrade():\n    # Create enum type first\n    assessment_status = postgresql.ENUM(\n        \"draft\", \"active\", \"completed\", \"archived\",\n        name=\"assessment_status\",\n        create_type=True,\n    )\n    assessment_status.create(op.get_bind())\n    \n    # Then use it\n    op.add_column(\n        \"assessments\",\n        sa.Column(\"status\", assessment_status, nullable=False, server_default=\"draft\"),\n    )\n\ndef downgrade():\n    op.drop_column(\"assessments\", \"status\")\n    op.execute(\"DROP TYPE assessment_status\")\n```\n\n---\n\n## Pattern: Multiple Heads (Branching)\n\n**Problem:** Multiple developers creating migrations simultaneously.\n\n```bash\n# Check for multiple heads\nuv run alembic heads\n\n# If multiple heads, create merge migration\nuv run alembic merge -m \"Merge heads\" abc123 def456\n\n# Or specify down_revision as tuple\ndown_revision = (\"abc123\", \"def456\")\n```\n\n---\n\n## Pattern: Testing Migrations\n\n```python\n# test_migrations.py\nimport pytest\nfrom alembic import command\nfrom alembic.config import Config\n\n@pytest.fixture\ndef alembic_config():\n    config = Config(\"alembic.ini\")\n    return config\n\ndef test_upgrade_downgrade(alembic_config, test_db):\n    \"\"\"Test migrations can upgrade and downgrade.\"\"\"\n    # Upgrade to head\n    command.upgrade(alembic_config, \"head\")\n    \n    # Downgrade to base\n    command.downgrade(alembic_config, \"base\")\n    \n    # Upgrade again\n    command.upgrade(alembic_config, \"head\")\n\ndef test_migration_has_downgrade():\n    \"\"\"Ensure all migrations have downgrade.\"\"\"\n    # Parse migration files and check downgrade isn't just 'pass'\n    ...\n```\n\n---\n\n## Migration Review Checklist\n\nBefore applying any migration:\n\n- [ ] Downgrade function implemented (not just `pass`)\n- [ ] Column renames use `alter_column`, not drop+add\n- [ ] Non-nullable columns added with default or backfill\n- [ ] Large table operations consider locking\n- [ ] Indexes have explicit names\n- [ ] Foreign keys have explicit names and ON DELETE behavior\n- [ ] Enums created before use\n- [ ] Data migrations tested with real data volumes\n- [ ] Migration tested: upgrade, downgrade, upgrade\n\n---\n\n## Production Safety\n\n```python\n# Set statement timeout to prevent long locks\ndef upgrade():\n    op.execute(\"SET statement_timeout = '5s'\")\n    \n    # Your migration here\n    \n    op.execute(\"SET statement_timeout = '0'\")  # Reset\n```\n\n```bash\n# Always backup before production migrations\npg_dump -h host -U user -d dbname > backup_before_migration.sql\n\n# Apply with --sql to preview\nuv run alembic upgrade head --sql\n\n# Apply for real\nuv run alembic upgrade head\n```\n\n---\n\n## Common Issues\n\n| Issue | Likely Cause | Solution |\n|-------|--------------|----------|\n| \"Target database is not up to date\" | Pending migrations | Run `alembic upgrade head` |\n| \"Can't locate revision\" | Missing migration file | Check version history |\n| Multiple heads | Concurrent development | Create merge migration |\n| Lock timeout | Long-running migration | Use CONCURRENTLY, batch updates |\n| Data loss on deploy | Column rename as drop+add | Review autogenerated carefully |\n","# Alembic Migration Patterns\n\n## Problem Statement\n\nAlembic autogenerate is convenient but misses things and sometimes generates dangerous migrations. Schema changes are high-risk - bad migrations cause data loss or downtime. Every migration needs human review.\n\n---\n\n## Pattern: Migration Commands\n\n```bash\n# Generate migration from model changes\nuv run alembic revision --autogenerate -m \"Add user preferences table\"\n\n# Apply migrations\nuv run alembic upgrade head\n\n# Rollback one migration\nuv run alembic downgrade -1\n\n# Rollback to specific revision\nuv run alembic downgrade abc123\n\n# Show current revision\nuv run alembic current\n\n# Show migration history\nuv run alembic history\n\n# Show pending migrations\nuv run alembic history --indicate-current\n```\n\n---\n\n## Pattern: Reviewing Autogenerated Migrations\n\n**ALWAYS review autogenerated migrations. They often need fixes.**\n\n### What Autogenerate Catches\n- Table creation\u002Fdeletion\n- Column addition\u002Fremoval\n- Column type changes\n- Foreign key changes\n- Index changes (sometimes)\n\n### What Autogenerate Misses\n- Column renames (sees as drop + add = DATA LOSS)\n- Table renames (same problem)\n- Data migrations\n- Constraint names\n- Partial indexes\n- Complex index changes\n- Check constraints\n- Triggers and functions\n\n```python\n# ❌ DANGEROUS: Autogenerated for column rename\ndef upgrade():\n    op.drop_column(\"users\", \"name\")      # DATA LOSS!\n    op.add_column(\"users\", sa.Column(\"full_name\", sa.String()))\n\n# ✅ CORRECT: Manual rename\ndef upgrade():\n    op.alter_column(\"users\", \"name\", new_column_name=\"full_name\")\n\ndef downgrade():\n    op.alter_column(\"users\", \"full_name\", new_column_name=\"name\")\n```\n\n---\n\n## Pattern: Safe Migration Structure\n\n```python\n\"\"\"Add user preferences table.\n\nRevision ID: abc123\nRevises: def456\nCreate Date: 2024-01-15 10:30:00.000000\n\"\"\"\nfrom alembic import op\nimport sqlalchemy as sa\nfrom sqlalchemy.dialects import postgresql\n\n# revision identifiers\nrevision = \"abc123\"\ndown_revision = \"def456\"\nbranch_labels = None\ndepends_on = None\n\n\ndef upgrade() -> None:\n    # Always explicit, never rely on defaults\n    op.create_table(\n        \"user_preferences\",\n        sa.Column(\"id\", postgresql.UUID(as_uuid=True), primary_key=True),\n        sa.Column(\"user_id\", postgresql.UUID(as_uuid=True), nullable=False),\n        sa.Column(\"theme\", sa.String(50), nullable=False, server_default=\"light\"),\n        sa.Column(\"notifications_enabled\", sa.Boolean(), nullable=False, server_default=\"true\"),\n        sa.Column(\"created_at\", sa.DateTime(timezone=True), server_default=sa.func.now()),\n    )\n    \n    # Explicit index names\n    op.create_index(\n        \"ix_user_preferences_user_id\",\n        \"user_preferences\",\n        [\"user_id\"],\n    )\n    \n    # Foreign key with explicit name\n    op.create_foreign_key(\n        \"fk_user_preferences_user_id\",\n        \"user_preferences\",\n        \"users\",\n        [\"user_id\"],\n        [\"id\"],\n        ondelete=\"CASCADE\",\n    )\n\n\ndef downgrade() -> None:\n    # Always implement downgrade!\n    op.drop_constraint(\"fk_user_preferences_user_id\", \"user_preferences\", type_=\"foreignkey\")\n    op.drop_index(\"ix_user_preferences_user_id\", \"user_preferences\")\n    op.drop_table(\"user_preferences\")\n```\n\n---\n\n## Pattern: Adding Non-Nullable Columns\n\n**Problem:** Adding NOT NULL column to existing table fails if table has rows.\n\n```python\n# ❌ WRONG: Fails if table has data\ndef upgrade():\n    op.add_column(\"users\", sa.Column(\"role\", sa.String(50), nullable=False))\n\n# ✅ CORRECT: Three-step process\ndef upgrade():\n    # Step 1: Add as nullable\n    op.add_column(\"users\", sa.Column(\"role\", sa.String(50), nullable=True))\n    \n    # Step 2: Backfill existing rows\n    op.execute(\"UPDATE users SET role = 'member' WHERE role IS NULL\")\n    \n    # Step 3: Add NOT NULL constraint\n    op.alter_column(\"users\", \"role\", nullable=False)\n\ndef downgrade():\n    op.drop_column(\"users\", \"role\")\n```\n\n---\n\n## Pattern: Data Migrations\n\n**Problem:** Need to transform existing data during schema change.\n\n```python\nfrom sqlalchemy import text\n\ndef upgrade():\n    # Get connection for data operations\n    connection = op.get_bind()\n    \n    # Add new column\n    op.add_column(\"assessments\", sa.Column(\"status\", sa.String(20)))\n    \n    # Migrate data\n    connection.execute(\n        text(\"\"\"\n            UPDATE assessments \n            SET status = CASE \n                WHEN completed_at IS NOT NULL THEN 'completed'\n                WHEN started_at IS NOT NULL THEN 'in_progress'\n                ELSE 'pending'\n            END\n        \"\"\")\n    )\n    \n    # Now safe to add NOT NULL\n    op.alter_column(\"assessments\", \"status\", nullable=False)\n\n\ndef downgrade():\n    op.drop_column(\"assessments\", \"status\")\n```\n\n---\n\n## Pattern: Large Table Migrations\n\n**Problem:** Migrations on large tables can lock the table for too long.\n\n```python\ndef upgrade():\n    # ✅ CORRECT: Add index concurrently (no lock)\n    op.execute(\n        \"CREATE INDEX CONCURRENTLY ix_events_user_id ON events (user_id)\"\n    )\n    \n    # Note: CONCURRENTLY requires autocommit mode\n    # Add to migration file:\n    # from alembic import context\n    # context.configure(transaction_per_migration=False)\n\ndef downgrade():\n    op.execute(\"DROP INDEX CONCURRENTLY IF EXISTS ix_events_user_id\")\n\n\n# For column changes on large tables, consider:\n# 1. Add new column (nullable)\n# 2. Backfill in batches via separate script\n# 3. Add constraint in separate migration\n```\n\n---\n\n## Pattern: Enum Changes\n\n**Problem:** PostgreSQL enums are tricky to modify.\n\n```python\n# Adding a value to existing enum\ndef upgrade():\n    # PostgreSQL-specific: Add value to enum\n    op.execute(\"ALTER TYPE assessment_status ADD VALUE 'archived'\")\n\ndef downgrade():\n    # Can't remove enum values in PostgreSQL!\n    # Options:\n    # 1. Leave it (usually fine)\n    # 2. Recreate enum (complex, requires data migration)\n    pass\n\n\n# Creating new enum\ndef upgrade():\n    # Create enum type first\n    assessment_status = postgresql.ENUM(\n        \"draft\", \"active\", \"completed\", \"archived\",\n        name=\"assessment_status\",\n        create_type=True,\n    )\n    assessment_status.create(op.get_bind())\n    \n    # Then use it\n    op.add_column(\n        \"assessments\",\n        sa.Column(\"status\", assessment_status, nullable=False, server_default=\"draft\"),\n    )\n\ndef downgrade():\n    op.drop_column(\"assessments\", \"status\")\n    op.execute(\"DROP TYPE assessment_status\")\n```\n\n---\n\n## Pattern: Multiple Heads (Branching)\n\n**Problem:** Multiple developers creating migrations simultaneously.\n\n```bash\n# Check for multiple heads\nuv run alembic heads\n\n# If multiple heads, create merge migration\nuv run alembic merge -m \"Merge heads\" abc123 def456\n\n# Or specify down_revision as tuple\ndown_revision = (\"abc123\", \"def456\")\n```\n\n---\n\n## Pattern: Testing Migrations\n\n```python\n# test_migrations.py\nimport pytest\nfrom alembic import command\nfrom alembic.config import Config\n\n@pytest.fixture\ndef alembic_config():\n    config = Config(\"alembic.ini\")\n    return config\n\ndef test_upgrade_downgrade(alembic_config, test_db):\n    \"\"\"Test migrations can upgrade and downgrade.\"\"\"\n    # Upgrade to head\n    command.upgrade(alembic_config, \"head\")\n    \n    # Downgrade to base\n    command.downgrade(alembic_config, \"base\")\n    \n    # Upgrade again\n    command.upgrade(alembic_config, \"head\")\n\ndef test_migration_has_downgrade():\n    \"\"\"Ensure all migrations have downgrade.\"\"\"\n    # Parse migration files and check downgrade isn't just 'pass'\n    ...\n```\n\n---\n\n## Migration Review Checklist\n\nBefore applying any migration:\n\n- [ ] Downgrade function implemented (not just `pass`)\n- [ ] Column renames use `alter_column`, not drop+add\n- [ ] Non-nullable columns added with default or backfill\n- [ ] Large table operations consider locking\n- [ ] Indexes have explicit names\n- [ ] Foreign keys have explicit names and ON DELETE behavior\n- [ ] Enums created before use\n- [ ] Data migrations tested with real data volumes\n- [ ] Migration tested: upgrade, downgrade, upgrade\n\n---\n\n## Production Safety\n\n```python\n# Set statement timeout to prevent long locks\ndef upgrade():\n    op.execute(\"SET statement_timeout = '5s'\")\n    \n    # Your migration here\n    \n    op.execute(\"SET statement_timeout = '0'\")  # Reset\n```\n\n```bash\n# Always backup before production migrations\npg_dump -h host -U user -d dbname > backup_before_migration.sql\n\n# Apply with --sql to preview\nuv run alembic upgrade head --sql\n\n# Apply for real\nuv run alembic upgrade head\n```\n\n---\n\n## Common Issues\n\n| Issue | Likely Cause | Solution |\n|-------|--------------|----------|\n| \"Target database is not up to date\" | Pending migrations | Run `alembic upgrade head` |\n| \"Can't locate revision\" | Missing migration file | Check version history |\n| Multiple heads | Concurrent development | Create merge migration |\n| Lock timeout | Long-running migration | Use CONCURRENTLY, batch updates |\n| Data loss on deploy | Column rename as drop+add | Review autogenerated carefully |\n",{"name":5,"description":7},"main","def8531e65114c0fca8fb8551c1871ee0eed705c","skills\u002Faiskillstore\u002Fmarketplace\u002Fcjharmath\u002Fpy-alembic-patterns",24,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub","https:\u002F\u002Fskillshub.wtf","https:\u002F\u002Fgithub.com\u002FComeOnOliver","AI & Blockchain Engineer\r\n","2026-06-24 22:07:19",{"source":8,"skillName":5,"commands":43,"prompt":53,"zipAvailable":54},[44,47,50],{"tool":45,"command":46},"npx","npx skills add ComeOnOliver\u002Fskillshub --skill py-alembic-patterns",{"tool":48,"command":49},"bunx","bunx skills add ComeOnOliver\u002Fskillshub --skill py-alembic-patterns",{"tool":51,"command":52},"pnpm","pnpm dlx skills add ComeOnOliver\u002Fskillshub --skill py-alembic-patterns","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fcjharmath\u002Fpy-alembic-patterns\u002FSKILL.md",true,[56],{"path":57,"resourceType":58,"resourceTypeDesc":59,"sizeBytes":60,"sourceHtmlUrl":61},"skill-report.json","REFERENCE","参考文档",11474,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fcjharmath\u002Fpy-alembic-patterns\u002Fskill-report.json",[63,77,87,96,102,109],{"skillNo":64,"name":65,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":66,"categories":67,"keywords":73,"publishedAt":28},"01M6FKJN13GMG4KY57J3QD8GY5","model-hierarchy-skill","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzscole\u002Fmodel-hierarchy-skill\u002Fmodel-hierarchy-skill\u002FSKILL.md",[68],{"categoryNo":69,"categoryName":70,"taxonomyType":71,"taxonomyTypeDesc":72},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[74,75,76],"model","model hierarchy","model hierarchy skill",{"skillNo":78,"name":79,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":80,"categories":81,"keywords":83,"publishedAt":28},"01M6FKJJJ6GCAMR4PPPRD12M5X","zoom-mcp","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-mcp\u002FSKILL.md",[82],{"categoryNo":69,"categoryName":70,"taxonomyType":71,"taxonomyTypeDesc":72},[84,85,86],"MCP","zoom","zoom mcp",{"skillNo":88,"name":89,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":90,"categories":91,"keywords":92,"publishedAt":28},"01M6FKJE3KYT3KPEZMEEHYKA6K","zoom-apps-sdk","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-apps-sdk\u002FSKILL.md",[],[93,94,95,85],"sdk","zoom apps sdk","apps",{"skillNo":97,"name":98,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":99,"categories":100,"keywords":101,"publishedAt":28},"01M6FKJ9EDH9Q5VWDF8HAJRSP0","windows","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwindows\u002FSKILL.md",[],[98],{"skillNo":103,"name":104,"nameZh":6,"description":6,"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":108,"publishedAt":28},"01M6FKJ666BEEFC3AE9GJ72Q93","whiteboard","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwhiteboard\u002FSKILL.md",[107],{"categoryNo":69,"categoryName":70,"taxonomyType":71,"taxonomyTypeDesc":72},[104],{"skillNo":110,"name":111,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":112,"categories":113,"keywords":114,"publishedAt":28},"01M6FKJ21WFCDGTJQ2Q91T9DVW","websockets","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwebsockets\u002FSKILL.md",[],[111]]