[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6GNH4MP6M853G8R5ZYDJV6T":3,"skill-same:01M6GNH4MP6M853G8R5ZYDJV6T":189},{"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":23,"publishedAt":46,"linkOnly":47,"markdownContent":48,"markdownBody":49,"frontMatter":50,"refName":109,"commitSha":110,"skillDirectory":111,"forksCount":112,"repositoryHtmlUrl":113,"repositoryHomepageUrl":6,"ownerHtmlUrl":114,"ownerBlogUrl":115,"ownerDescription":116,"updatedAt":117,"install":118,"resources":130},"01M6GNH4MP6M853G8R5ZYDJV6T","database-migration-assistant",null,"PostgreSQL migration assistant that plans, applies, and rolls back schema changes with drift detection for safe AI-agent execution.","jiayaoqijia\u002Fcryptoskill","jiayaoqijia","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F1453879?v=4","01M6GMYTX7Q7S504VC6E756ENR","YQ","01M6GMYV1QKJ1CC75MTTGT9PR0",81,"AGPL-3.0","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fai-crypto\u002Fxspoonai-official-database-migration-assistant\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000010","后端与接口","SCENARIO","使用场景",[24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45],"database","database migration","database migration assistant","migration","assistant","ai-agent","new","when","URL","false","dry","db","apple","drift","back","postgres","show","files","up","plan","postgresql","schema migration","2026-11-10 10:12:30",false,"﻿---\nname: database-migration-assistant\ndescription: PostgreSQL migration assistant that plans, applies, and rolls back schema changes with drift detection for safe AI-agent execution.\nauthor: Apple \u003Cskelitalynn@gmail.com>\nversion: 1.0.0\ntags:\n  - database\n  - postgres\n  - migration\n  - rollback\n  - schema\n  - productivity\n  - ai\ntriggers:\n  - type: keyword\n    keywords:\n      - migration\n      - database migration\n      - schema migration\n      - rollback\n      - drift\n      - postgres\n      - schema change\nparameters:\n  - name: action\n    type: string\n    required: false\n    description: Operation to perform (plan\u002Fapply\u002Frollback\u002Fgenerate).\n  - name: migrations_dir\n    type: string\n    required: false\n    default: migrations\n    description: Directory that contains versioned SQL migration files.\n  - name: dry_run\n    type: boolean\n    required: false\n    default: false\n    description: If true, show planned SQL without executing it.\n  - name: to_version\n    type: string\n    required: false\n    description: Target version for apply or rollback.\n  - name: name\n    type: string\n    required: false\n    description: Migration name when generating a template.\nprerequisites:\n  env_vars:\n    - DB_URL\n  skills: []\ncomposable: true\npersist_state: true\nscripts:\n  enabled: true\n  working_directory: .\u002Fscripts\n  definitions:\n    - name: plan_migrations\n      description: Build a migration plan and detect drift.\n      type: python\n      file: plan_migrations.py\n      timeout: 30\n    - name: apply_migrations\n      description: Apply pending up migrations (supports dry-run).\n      type: python\n      file: apply_migrations.py\n      timeout: 60\n    - name: rollback_migrations\n      description: Roll back the latest migration or down to a target version.\n      type: python\n      file: rollback_migrations.py\n      timeout: 60\n    - name: generate_migration\n      description: Generate a new migration SQL template.\n      type: python\n      file: generate_migration.py\n      timeout: 30\n---\n\n# Database Migration Assistant with Rollback\n\nA PostgreSQL migration assistant that makes schema changes safe and repeatable.  \nIt provides plan\u002Fapply\u002Frollback workflows with drift detection, and exposes stable CLI tools for AI agents to call.  \nDesigned for production safety: preview first, confirm, then execute.\n\n\n## Quick Start\n\n```python\nfrom spoon_ai.agents import SpoonReactSkill\n\nagent = SpoonReactSkill(\n    name=\"db_migration_agent\",\n    skill_paths=[\".\u002Fai-productivity\"],\n    scripts_enabled=True\n)\n\nresult = await agent.run(\"Plan database migrations for this project\")\nprint(result)\n\n```\n\n## Scripts\n\n| Script | Purpose |\n|--------|---------|\n| [plan_migrations.py](scripts\u002Fplan_migrations.py) | Build a migration plan and detect drift |\n| [apply_migrations.py](scripts\u002Fapply_migrations.py) | Apply pending up migrations (supports dry-run) |\n| [rollback_migrations.py](scripts\u002Frollback_migrations.py) | Roll back the latest migration or to a target version |\n| [generate_migration.py](scripts\u002Fgenerate_migration.py) | Generate a new migration SQL template |\n\n## Environment Variables\n\n| Variable | Required | Description |\n|----------|----------|-------------|\n| `DB_URL` | Yes | PostgreSQL connection string, e.g. postgresql:\u002F\u002Fuser:pass@host:5432\u002Fdb |\n\n## Best Practices\n\n1. Always run `plan` and review the output before `apply`.\n2. In production, require explicit confirmation and a recent backup.\n3. Treat migration files as append-only; never edit applied migrations.\n","# Database Migration Assistant with Rollback\n\nA PostgreSQL migration assistant that makes schema changes safe and repeatable.  \nIt provides plan\u002Fapply\u002Frollback workflows with drift detection, and exposes stable CLI tools for AI agents to call.  \nDesigned for production safety: preview first, confirm, then execute.\n\n\n## Quick Start\n\n```python\nfrom spoon_ai.agents import SpoonReactSkill\n\nagent = SpoonReactSkill(\n    name=\"db_migration_agent\",\n    skill_paths=[\".\u002Fai-productivity\"],\n    scripts_enabled=True\n)\n\nresult = await agent.run(\"Plan database migrations for this project\")\nprint(result)\n\n```\n\n## Scripts\n\n| Script | Purpose |\n|--------|---------|\n| [plan_migrations.py](scripts\u002Fplan_migrations.py) | Build a migration plan and detect drift |\n| [apply_migrations.py](scripts\u002Fapply_migrations.py) | Apply pending up migrations (supports dry-run) |\n| [rollback_migrations.py](scripts\u002Frollback_migrations.py) | Roll back the latest migration or to a target version |\n| [generate_migration.py](scripts\u002Fgenerate_migration.py) | Generate a new migration SQL template |\n\n## Environment Variables\n\n| Variable | Required | Description |\n|----------|----------|-------------|\n| `DB_URL` | Yes | PostgreSQL connection string, e.g. postgresql:\u002F\u002Fuser:pass@host:5432\u002Fdb |\n\n## Best Practices\n\n1. Always run `plan` and review the output before `apply`.\n2. In production, require explicit confirmation and a recent backup.\n3. Treat migration files as append-only; never edit applied migrations.\n",{"name":5,"tags":51,"author":56,"scripts":57,"version":80,"triggers":81,"composable":58,"parameters":86,"description":7,"persist_state":58,"prerequisites":105},[24,39,27,52,53,54,55],"rollback","schema","productivity","ai","Apple \u003Cskelitalynn@gmail.com>",{"enabled":58,"definitions":59,"working_directory":79},true,[60,66,71,75],{"file":61,"name":62,"type":63,"timeout":64,"description":65},"plan_migrations.py","plan_migrations","python",30,"Build a migration plan and detect drift.",{"file":67,"name":68,"type":63,"timeout":69,"description":70},"apply_migrations.py","apply_migrations",60,"Apply pending up migrations (supports dry-run).",{"file":72,"name":73,"type":63,"timeout":69,"description":74},"rollback_migrations.py","rollback_migrations","Roll back the latest migration or down to a target version.",{"file":76,"name":77,"type":63,"timeout":64,"description":78},"generate_migration.py","generate_migration","Generate a new migration SQL template.",".\u002Fscripts","1.0.0",[82],{"type":83,"keywords":84},"keyword",[27,25,45,52,37,39,85],"schema change",[87,91,95,99,102],{"name":88,"type":89,"required":47,"description":90},"action","string","Operation to perform (plan\u002Fapply\u002Frollback\u002Fgenerate).",{"name":92,"type":89,"default":93,"required":47,"description":94},"migrations_dir","migrations","Directory that contains versioned SQL migration files.",{"name":96,"type":97,"default":47,"required":47,"description":98},"dry_run","boolean","If true, show planned SQL without executing it.",{"name":100,"type":89,"required":47,"description":101},"to_version","Target version for apply or rollback.",{"name":103,"type":89,"required":47,"description":104},"name","Migration name when generating a template.",{"skills":106,"env_vars":107},[],[108],"DB_URL","main","3df1d0d67b30ff15236561f8c0f9f06d33f42dfd","skills\u002Fai-crypto\u002Fxspoonai-official-database-migration-assistant",17,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia","https:\u002F\u002Feth2030.com","Hardcore infra. Building @alt-research and applied cryptography.","2026-11-13 02:31:19",{"source":8,"skillName":5,"commands":119,"prompt":129,"zipAvailable":58},[120,123,126],{"tool":121,"command":122},"npx","npx skills add jiayaoqijia\u002Fcryptoskill --skill database-migration-assistant",{"tool":124,"command":125},"bunx","bunx skills add jiayaoqijia\u002Fcryptoskill --skill database-migration-assistant",{"tool":127,"command":128},"pnpm","pnpm dlx skills add jiayaoqijia\u002Fcryptoskill --skill database-migration-assistant","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fai-crypto\u002Fxspoonai-official-database-migration-assistant\u002FSKILL.md",[131,137,143,147,153,157,161,165,169,173,177,181,185],{"path":132,"resourceType":133,"resourceTypeDesc":134,"sizeBytes":135,"sourceHtmlUrl":136},"examples\u002Fdemo_agent.py","SCRIPT","脚本",639,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fai-crypto\u002Fxspoonai-official-database-migration-assistant\u002Fexamples\u002Fdemo_agent.py",{"path":138,"resourceType":139,"resourceTypeDesc":140,"sizeBytes":141,"sourceHtmlUrl":142},"examples\u002Fdemo_prompt.txt","REFERENCE","参考文档",93,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fai-crypto\u002Fxspoonai-official-database-migration-assistant\u002Fexamples\u002Fdemo_prompt.txt",{"path":144,"resourceType":139,"resourceTypeDesc":140,"sizeBytes":145,"sourceHtmlUrl":146},"examples\u002Fexample_usage.md",267,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fai-crypto\u002Fxspoonai-official-database-migration-assistant\u002Fexamples\u002Fexample_usage.md",{"path":148,"resourceType":149,"resourceTypeDesc":150,"sizeBytes":151,"sourceHtmlUrl":152},"examples\u002Fexample.env","OTHER","其他",57,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fai-crypto\u002Fxspoonai-official-database-migration-assistant\u002Fexamples\u002Fexample.env",{"path":154,"resourceType":149,"resourceTypeDesc":150,"sizeBytes":155,"sourceHtmlUrl":156},"migrations\u002F20260208_091909_create_users_table.sql",234,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fai-crypto\u002Fxspoonai-official-database-migration-assistant\u002Fmigrations\u002F20260208_091909_create_users_table.sql",{"path":158,"resourceType":139,"resourceTypeDesc":140,"sizeBytes":159,"sourceHtmlUrl":160},"README.md",7623,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fai-crypto\u002Fxspoonai-official-database-migration-assistant\u002FREADME.md",{"path":162,"resourceType":133,"resourceTypeDesc":134,"sizeBytes":163,"sourceHtmlUrl":164},"scripts\u002Fapply_migrations.py",3737,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fai-crypto\u002Fxspoonai-official-database-migration-assistant\u002Fscripts\u002Fapply_migrations.py",{"path":166,"resourceType":133,"resourceTypeDesc":134,"sizeBytes":167,"sourceHtmlUrl":168},"scripts\u002Fgenerate_migration.py",2378,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fai-crypto\u002Fxspoonai-official-database-migration-assistant\u002Fscripts\u002Fgenerate_migration.py",{"path":170,"resourceType":133,"resourceTypeDesc":134,"sizeBytes":171,"sourceHtmlUrl":172},"scripts\u002Fmigration_utils.py",4453,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fai-crypto\u002Fxspoonai-official-database-migration-assistant\u002Fscripts\u002Fmigration_utils.py",{"path":174,"resourceType":133,"resourceTypeDesc":134,"sizeBytes":175,"sourceHtmlUrl":176},"scripts\u002Fplan_migrations.py",2400,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fai-crypto\u002Fxspoonai-official-database-migration-assistant\u002Fscripts\u002Fplan_migrations.py",{"path":178,"resourceType":133,"resourceTypeDesc":134,"sizeBytes":179,"sourceHtmlUrl":180},"scripts\u002Frollback_migrations.py",3726,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fai-crypto\u002Fxspoonai-official-database-migration-assistant\u002Fscripts\u002Frollback_migrations.py",{"path":182,"resourceType":139,"resourceTypeDesc":140,"sizeBytes":183,"sourceHtmlUrl":184},"SOURCE.md",389,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fai-crypto\u002Fxspoonai-official-database-migration-assistant\u002FSOURCE.md",{"path":186,"resourceType":139,"resourceTypeDesc":140,"sizeBytes":187,"sourceHtmlUrl":188},"TRUST.auto.yaml",2197,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fai-crypto\u002Fxspoonai-official-database-migration-assistant\u002FTRUST.auto.yaml",[190,219,242,260,273,283],{"skillNo":191,"name":192,"nameZh":6,"description":193,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":194,"licenseFileUrl":195,"sourceHtmlUrl":196,"categories":197,"keywords":198,"publishedAt":46},"01M712C436EQYE43342Q4E7GG1","recipe-performance","Diagnose a specific MetaMask user flow's real-app performance and Sentry critical-user-flow telemetry with deterministic mm-harness recipes. Use for CUF boundaries, cold\u002Fwarm\u002Fbackground-resume behavior, latency regressions, lifecycle tags, duplicate or blocking network requests, long tasks, layout\u002Fpaint cost, screen redraws, React rerenders, or browser trace analysis where tests alone cannot prove the real app.","MIT","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fwallets\u002Fmetamask-official-recipe-performance\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fwallets\u002Fmetamask-official-recipe-performance\u002FSKILL.md",[],[199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218],"performance","recipe performance","recipe","mm","sentry","harness","app","deterministic","recipes","flow","cold","critical","analysis","tasks","react","browser","layout","screen","network","metamask",{"skillNo":220,"name":221,"nameZh":6,"description":222,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":223,"licenseFileUrl":224,"sourceHtmlUrl":225,"categories":226,"keywords":227,"publishedAt":46},"01M70XT2F8A5CQZ81JBP98KSW3","mexc-spot-websocket","MEXC Spot WebSocket workflows for public streams, protobuf handling, depth maintenance, listen keys, and private streams without exposing API keys.","Apache-2.0","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fexchanges\u002Fmncrftfrcnm-mexc-spot-websocket\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fexchanges\u002Fmncrftfrcnm-mexc-spot-websocket\u002FSKILL.md",[],[228,229,230,231,232,233,234,235,236,237,238,239,240,241],"mexc spot websocket","spot","websocket","api","workflows","public","listen","streams","depth","keys","for","api keys","maintenance","protobuf",{"skillNo":243,"name":244,"nameZh":6,"description":245,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":223,"licenseFileUrl":246,"sourceHtmlUrl":247,"categories":248,"keywords":249,"publishedAt":46},"01M70XT0MBXN3WZY1BKN0CPNKR","mexc-spot-rest","MEXC Spot REST workflows for public data, signed account requests, orders, wallet\u002Fadmin actions, and secure signing without exposing API keys.","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fexchanges\u002Fmncrftfrcnm-mexc-spot-rest\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fexchanges\u002Fmncrftfrcnm-mexc-spot-rest\u002FSKILL.md",[],[250,229,251,252,253,254,255,239,238,237,256,257,258,233,259,232,231],"mexc spot rest","REST","admin","signing","Wallet","requests","actions","secure","data","orders",{"skillNo":261,"name":262,"nameZh":6,"description":263,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":223,"licenseFileUrl":264,"sourceHtmlUrl":265,"categories":266,"keywords":267,"publishedAt":46},"01M70XSYSVZ2N0N91XCAR2CAK0","mexc-futures-websocket","MEXC Futures WebSocket workflows for public streams, private account\u002Forder\u002Fposition streams, ping\u002Fpong, subscriptions, and depth maintenance.","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fexchanges\u002Fmncrftfrcnm-mexc-futures-websocket\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fexchanges\u002Fmncrftfrcnm-mexc-futures-websocket\u002FSKILL.md",[],[268,269,230,270,271,240,238,272,236,235,233,232],"mexc futures websocket","futures","position","ping","subscriptions",{"skillNo":274,"name":275,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":194,"licenseFileUrl":276,"sourceHtmlUrl":277,"categories":278,"keywords":279,"publishedAt":46},"01M6H0ZWHVE5W04WG2DKQE2SQC","0xklen-version-and-refresh-sanctions-lists","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-version-and-refresh-sanctions-lists\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-version-and-refresh-sanctions-lists\u002FSKILL.md",[],[280,281,282],"refresh","0xklen version and refresh sanctions lists","version",{"skillNo":284,"name":285,"nameZh":6,"description":286,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":194,"licenseFileUrl":287,"sourceHtmlUrl":288,"categories":289,"keywords":290,"publishedAt":46},"01M6H0Z28Q3R8J0S799GJQWXM3","verify-tests-cover-changed-lines","Use when a PR adds code that the existing suite may not exercise. Measures patch coverage — the share of newly changed lines hit by tests — before approving.","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-verify-tests-cover-changed-lines\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-verify-tests-cover-changed-lines\u002FSKILL.md",[],[291,292,293,294,295,296,297,298,299,300,301],"tests","cover","verify tests cover changed lines","verify","coverage","pr","exercise","use","patch","code","share"]