[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6DRW7FKBS1RCW536BFXKDZX":3,"skill-same:01M6DRW7FKBS1RCW536BFXKDZX":183},{"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":38,"linkOnly":39,"markdownContent":40,"markdownBody":41,"frontMatter":42,"refName":43,"commitSha":44,"skillDirectory":45,"forksCount":46,"repositoryHtmlUrl":47,"repositoryHomepageUrl":6,"ownerHtmlUrl":48,"ownerBlogUrl":6,"ownerDescription":49,"updatedAt":50,"install":51,"resources":64},"01M6DRW7FKBS1RCW536BFXKDZX","templatecentral:migrate",null,"Use when adopting or upgrading a project, switching its DB access layer, or extracting a Next.js backend — FastAPI, NestJS, Next.js, Vite + React.","cljiahao\u002Ftemplatecentral","cljiahao","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F35331421?v=4","01M6DRV6NWCVVF2JTATHZRHMR7","Clarence Lee","01M6DRV6T9A7R49YGTJ3Z5FB3Z",4,"MIT","https:\u002F\u002Fgithub.com\u002Fcljiahao\u002Ftemplatecentral\u002Fblob\u002Fmain\u002Fskills\u002Fmigrate\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000010","后端与接口","SCENARIO","使用场景",[24,5,25,26,27,28,29,30,31,32,33,34,35,36,37],"migrate","react","Next.js","js","access","fastapi","use","backend","vite","nestjs","next","project","switching","db","2026-11-10 10:12:30",false,"---\nname: templatecentral:migrate\ndescription: Use when adopting or upgrading a project, switching its DB access layer, or extracting a Next.js backend — FastAPI, NestJS, Next.js, Vite + React.\n---\n\n**Step 1** — Pick the path (under `\u003Cskill-dir>\u002F`):\n\n| Type | Path |\n|---|---|\n| **Adopt \u002F upgrade** — retrofit the harness, or upgrade a templateCentral project | `general\u002Fimplementation.md` |\n| **DB access layer** — fastapi: SQLAlchemy password → AWS IAM auth; nestjs\u002Fnextjs: Drizzle → Kysely (vite-react has no database layer: tell the user and stop) | `database\u002F\u003Cfastapi\\|nestjs\\|nextjs>.md` |\n| **Backend extraction** — Next.js API routes → NestJS or FastAPI service | `nextjs-backend-extraction.md` |\n| **Portal framing** — pre-6.2.0 app framed only by its appCentral portal (`APPCENTRAL_PORTAL_ORIGIN`) | `portal-frame-ancestors.md` |\n\n**Step 2** — Run:\n> `\u003Cskill-dir>` = this skill's directory (\"Base directory for this skill\"); substitute the absolute path — it is **not** a shell variable.\n\n`cat \"\u003Cskill-dir>\u002F\u003Cpath>\"`\n\n**Step 3** — Follow the loaded guide exactly.\n","**Step 1** — Pick the path (under `\u003Cskill-dir>\u002F`):\n\n| Type | Path |\n|---|---|\n| **Adopt \u002F upgrade** — retrofit the harness, or upgrade a templateCentral project | `general\u002Fimplementation.md` |\n| **DB access layer** — fastapi: SQLAlchemy password → AWS IAM auth; nestjs\u002Fnextjs: Drizzle → Kysely (vite-react has no database layer: tell the user and stop) | `database\u002F\u003Cfastapi\\|nestjs\\|nextjs>.md` |\n| **Backend extraction** — Next.js API routes → NestJS or FastAPI service | `nextjs-backend-extraction.md` |\n| **Portal framing** — pre-6.2.0 app framed only by its appCentral portal (`APPCENTRAL_PORTAL_ORIGIN`) | `portal-frame-ancestors.md` |\n\n**Step 2** — Run:\n> `\u003Cskill-dir>` = this skill's directory (\"Base directory for this skill\"); substitute the absolute path — it is **not** a shell variable.\n\n`cat \"\u003Cskill-dir>\u002F\u003Cpath>\"`\n\n**Step 3** — Follow the loaded guide exactly.\n",{"name":5,"description":7},"main","bcc00e4a4707d0b2d67cd41ca77dd8ef1a13a339","skills\u002Fmigrate",1,"https:\u002F\u002Fgithub.com\u002Fcljiahao\u002Ftemplatecentral","https:\u002F\u002Fgithub.com\u002Fcljiahao","Aim To be a Full Stack Dev","2026-11-12 17:09:26",{"source":8,"skillName":5,"commands":52,"prompt":62,"zipAvailable":63},[53,56,59],{"tool":54,"command":55},"npx","npx skills add cljiahao\u002Ftemplatecentral --skill \"templatecentral:migrate\"",{"tool":57,"command":58},"bunx","bunx skills add cljiahao\u002Ftemplatecentral --skill \"templatecentral:migrate\"",{"tool":60,"command":61},"pnpm","pnpm dlx skills add cljiahao\u002Ftemplatecentral --skill \"templatecentral:migrate\"","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fcljiahao\u002Ftemplatecentral\u002Fblob\u002Fmain\u002Fskills\u002Fmigrate\u002FSKILL.md",true,[65,71,75,79,83,89,95,99,103,107,111,115,119,123,127,131,135,139,143,147,151,155,159,163,167,171,175,179],{"path":66,"resourceType":67,"resourceTypeDesc":68,"sizeBytes":69,"sourceHtmlUrl":70},"agents\u002Fopenai.yaml","REFERENCE","参考文档",104,"https:\u002F\u002Fgithub.com\u002Findigoai-us\u002Fhq-core\u002Fblob\u002Fmain\u002Fcore\u002Fworkers\u002Fpublic\u002Fqa-tester\u002Fskills\u002Fagent-browser\u002Fagents\u002Fopenai.yaml",{"path":72,"resourceType":67,"resourceTypeDesc":68,"sizeBytes":73,"sourceHtmlUrl":74},"database\u002Fdrizzle-to-kysely.md",4288,"https:\u002F\u002Fgithub.com\u002Fcljiahao\u002Ftemplatecentral\u002Fblob\u002Fmain\u002Fskills\u002Fmigrate\u002Fdatabase\u002Fdrizzle-to-kysely.md",{"path":76,"resourceType":67,"resourceTypeDesc":68,"sizeBytes":77,"sourceHtmlUrl":78},"database\u002Ffastapi.md",6084,"https:\u002F\u002Fgithub.com\u002Fcljiahao\u002Ftemplatecentral\u002Fblob\u002Fmain\u002Fskills\u002Fmigrate\u002Fdatabase\u002Ffastapi.md",{"path":80,"resourceType":67,"resourceTypeDesc":68,"sizeBytes":81,"sourceHtmlUrl":82},"database\u002Fnestjs.md",4934,"https:\u002F\u002Fgithub.com\u002Fcljiahao\u002Ftemplatecentral\u002Fblob\u002Fmain\u002Fskills\u002Fmigrate\u002Fdatabase\u002Fnestjs.md",{"path":84,"resourceType":85,"resourceTypeDesc":86,"sizeBytes":87,"sourceHtmlUrl":88},"database\u002Fnestjs\u002Ftemplate.manifest","OTHER","其他",555,"https:\u002F\u002Fgithub.com\u002Fcljiahao\u002Ftemplatecentral\u002Fblob\u002Fmain\u002Fskills\u002Fmigrate\u002Fdatabase\u002Fnestjs\u002Ftemplate.manifest",{"path":90,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":93,"sourceHtmlUrl":94},"database\u002Fnestjs\u002Ftemplate\u002Fsrc\u002Fdatabase\u002Fkysely.service.ts","SCRIPT","脚本",1643,"https:\u002F\u002Fgithub.com\u002Fcljiahao\u002Ftemplatecentral\u002Fblob\u002Fmain\u002Fskills\u002Fmigrate\u002Fdatabase\u002Fnestjs\u002Ftemplate\u002Fsrc\u002Fdatabase\u002Fkysely.service.ts",{"path":96,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":97,"sourceHtmlUrl":98},"database\u002Fnestjs\u002Ftemplate\u002Fsrc\u002Fdatabase\u002Fmigrate.ts",2037,"https:\u002F\u002Fgithub.com\u002Fcljiahao\u002Ftemplatecentral\u002Fblob\u002Fmain\u002Fskills\u002Fmigrate\u002Fdatabase\u002Fnestjs\u002Ftemplate\u002Fsrc\u002Fdatabase\u002Fmigrate.ts",{"path":100,"resourceType":67,"resourceTypeDesc":68,"sizeBytes":101,"sourceHtmlUrl":102},"database\u002Fnextjs.md",4090,"https:\u002F\u002Fgithub.com\u002Fcljiahao\u002Ftemplatecentral\u002Fblob\u002Fmain\u002Fskills\u002Fmigrate\u002Fdatabase\u002Fnextjs.md",{"path":104,"resourceType":85,"resourceTypeDesc":86,"sizeBytes":105,"sourceHtmlUrl":106},"database\u002Fnextjs\u002Ftemplate.manifest",580,"https:\u002F\u002Fgithub.com\u002Fcljiahao\u002Ftemplatecentral\u002Fblob\u002Fmain\u002Fskills\u002Fmigrate\u002Fdatabase\u002Fnextjs\u002Ftemplate.manifest",{"path":108,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":109,"sourceHtmlUrl":110},"database\u002Fnextjs\u002Ftemplate\u002Fsrc\u002Fintegrations\u002Fdatabase\u002Fkysely-client.ts",1235,"https:\u002F\u002Fgithub.com\u002Fcljiahao\u002Ftemplatecentral\u002Fblob\u002Fmain\u002Fskills\u002Fmigrate\u002Fdatabase\u002Fnextjs\u002Ftemplate\u002Fsrc\u002Fintegrations\u002Fdatabase\u002Fkysely-client.ts",{"path":112,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":113,"sourceHtmlUrl":114},"database\u002Fnextjs\u002Ftemplate\u002Fsrc\u002Fintegrations\u002Fdatabase\u002Fmigrate.ts",1020,"https:\u002F\u002Fgithub.com\u002Fcljiahao\u002Ftemplatecentral\u002Fblob\u002Fmain\u002Fskills\u002Fmigrate\u002Fdatabase\u002Fnextjs\u002Ftemplate\u002Fsrc\u002Fintegrations\u002Fdatabase\u002Fmigrate.ts",{"path":116,"resourceType":67,"resourceTypeDesc":68,"sizeBytes":117,"sourceHtmlUrl":118},"general\u002Fimplementation.md",7991,"https:\u002F\u002Fgithub.com\u002Fcljiahao\u002Ftemplatecentral\u002Fblob\u002Fmain\u002Fskills\u002Fmigrate\u002Fgeneral\u002Fimplementation.md",{"path":120,"resourceType":67,"resourceTypeDesc":68,"sizeBytes":121,"sourceHtmlUrl":122},"general\u002Fphase-4-upgrade.md",13663,"https:\u002F\u002Fgithub.com\u002Fcljiahao\u002Ftemplatecentral\u002Fblob\u002Fmain\u002Fskills\u002Fmigrate\u002Fgeneral\u002Fphase-4-upgrade.md",{"path":124,"resourceType":67,"resourceTypeDesc":68,"sizeBytes":125,"sourceHtmlUrl":126},"general\u002Fphase-5-health-check.md",8421,"https:\u002F\u002Fgithub.com\u002Fcljiahao\u002Ftemplatecentral\u002Fblob\u002Fmain\u002Fskills\u002Fmigrate\u002Fgeneral\u002Fphase-5-health-check.md",{"path":128,"resourceType":67,"resourceTypeDesc":68,"sizeBytes":129,"sourceHtmlUrl":130},"nextjs-backend-extraction.md",927,"https:\u002F\u002Fgithub.com\u002Fcljiahao\u002Ftemplatecentral\u002Fblob\u002Fmain\u002Fskills\u002Fmigrate\u002Fnextjs-backend-extraction.md",{"path":132,"resourceType":67,"resourceTypeDesc":68,"sizeBytes":133,"sourceHtmlUrl":134},"nextjs-backend-extraction\u002Fcommon.md",9553,"https:\u002F\u002Fgithub.com\u002Fcljiahao\u002Ftemplatecentral\u002Fblob\u002Fmain\u002Fskills\u002Fmigrate\u002Fnextjs-backend-extraction\u002Fcommon.md",{"path":136,"resourceType":67,"resourceTypeDesc":68,"sizeBytes":137,"sourceHtmlUrl":138},"nextjs-backend-extraction\u002Ffastapi.md",8760,"https:\u002F\u002Fgithub.com\u002Fcljiahao\u002Ftemplatecentral\u002Fblob\u002Fmain\u002Fskills\u002Fmigrate\u002Fnextjs-backend-extraction\u002Ffastapi.md",{"path":140,"resourceType":67,"resourceTypeDesc":68,"sizeBytes":141,"sourceHtmlUrl":142},"nextjs-backend-extraction\u002Fnestjs.md",8677,"https:\u002F\u002Fgithub.com\u002Fcljiahao\u002Ftemplatecentral\u002Fblob\u002Fmain\u002Fskills\u002Fmigrate\u002Fnextjs-backend-extraction\u002Fnestjs.md",{"path":144,"resourceType":67,"resourceTypeDesc":68,"sizeBytes":145,"sourceHtmlUrl":146},"portal-frame-ancestors.md",6877,"https:\u002F\u002Fgithub.com\u002Fcljiahao\u002Ftemplatecentral\u002Fblob\u002Fmain\u002Fskills\u002Fmigrate\u002Fportal-frame-ancestors.md",{"path":148,"resourceType":67,"resourceTypeDesc":68,"sizeBytes":149,"sourceHtmlUrl":150},"references\u002Fauthentication.md",5019,"https:\u002F\u002Fgithub.com\u002Findigoai-us\u002Fhq-core\u002Fblob\u002Fmain\u002Fcore\u002Fworkers\u002Fpublic\u002Fqa-tester\u002Fskills\u002Fagent-browser\u002Freferences\u002Fauthentication.md",{"path":152,"resourceType":67,"resourceTypeDesc":68,"sizeBytes":153,"sourceHtmlUrl":154},"references\u002Fcommands.md",13125,"https:\u002F\u002Fgithub.com\u002Findigoai-us\u002Fhq-core\u002Fblob\u002Fmain\u002Fcore\u002Fworkers\u002Fpublic\u002Fqa-tester\u002Fskills\u002Fagent-browser\u002Freferences\u002Fcommands.md",{"path":156,"resourceType":67,"resourceTypeDesc":68,"sizeBytes":157,"sourceHtmlUrl":158},"references\u002Fproxy-support.md",4686,"https:\u002F\u002Fgithub.com\u002Findigoai-us\u002Fhq-core\u002Fblob\u002Fmain\u002Fcore\u002Fworkers\u002Fpublic\u002Fqa-tester\u002Fskills\u002Fagent-browser\u002Freferences\u002Fproxy-support.md",{"path":160,"resourceType":67,"resourceTypeDesc":68,"sizeBytes":161,"sourceHtmlUrl":162},"references\u002Fsession-management.md",5803,"https:\u002F\u002Fgithub.com\u002Findigoai-us\u002Fhq-core\u002Fblob\u002Fmain\u002Fcore\u002Fworkers\u002Fpublic\u002Fqa-tester\u002Fskills\u002Fagent-browser\u002Freferences\u002Fsession-management.md",{"path":164,"resourceType":67,"resourceTypeDesc":68,"sizeBytes":165,"sourceHtmlUrl":166},"references\u002Fsnapshot-refs.md",4299,"https:\u002F\u002Fgithub.com\u002Findigoai-us\u002Fhq-core\u002Fblob\u002Fmain\u002Fcore\u002Fworkers\u002Fpublic\u002Fqa-tester\u002Fskills\u002Fagent-browser\u002Freferences\u002Fsnapshot-refs.md",{"path":168,"resourceType":67,"resourceTypeDesc":68,"sizeBytes":169,"sourceHtmlUrl":170},"references\u002Fvideo-recording.md",3569,"https:\u002F\u002Fgithub.com\u002Findigoai-us\u002Fhq-core\u002Fblob\u002Fmain\u002Fcore\u002Fworkers\u002Fpublic\u002Fqa-tester\u002Fskills\u002Fagent-browser\u002Freferences\u002Fvideo-recording.md",{"path":172,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":173,"sourceHtmlUrl":174},"templates\u002Fauthenticated-session.sh",3221,"https:\u002F\u002Fgithub.com\u002Findigoai-us\u002Fhq-core\u002Fblob\u002Fmain\u002Fcore\u002Fworkers\u002Fpublic\u002Fqa-tester\u002Fskills\u002Fagent-browser\u002Ftemplates\u002Fauthenticated-session.sh",{"path":176,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":177,"sourceHtmlUrl":178},"templates\u002Fcapture-workflow.sh",1832,"https:\u002F\u002Fgithub.com\u002Findigoai-us\u002Fhq-core\u002Fblob\u002Fmain\u002Fcore\u002Fworkers\u002Fpublic\u002Fqa-tester\u002Fskills\u002Fagent-browser\u002Ftemplates\u002Fcapture-workflow.sh",{"path":180,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":181,"sourceHtmlUrl":182},"templates\u002Fform-automation.sh",1838,"https:\u002F\u002Fgithub.com\u002Findigoai-us\u002Fhq-core\u002Fblob\u002Fmain\u002Fcore\u002Fworkers\u002Fpublic\u002Fqa-tester\u002Fskills\u002Fagent-browser\u002Ftemplates\u002Fform-automation.sh",[184,193,212,220,226,232],{"skillNo":185,"name":186,"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":187,"categories":188,"keywords":192,"publishedAt":38},"01M6DRX95TVDEYBWJ6A0REWRV9","test","https:\u002F\u002Fgithub.com\u002Fcljiahao\u002Ftemplatecentral\u002Fblob\u002Fmain\u002Fskills\u002Ftest\u002FSKILL.md",[189],{"categoryNo":190,"categoryName":191,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量",[186],{"skillNo":194,"name":195,"nameZh":6,"description":196,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":197,"categories":198,"keywords":199,"publishedAt":38},"01M6DRX5RTNPJDWY9F9X7Q4BKY","templatecentral:standards","Use when reviewing code quality, naming conventions, validation patterns, drift, or full-stack type contracts in a templateCentral project.","https:\u002F\u002Fgithub.com\u002Fcljiahao\u002Ftemplatecentral\u002Fblob\u002Fmain\u002Fskills\u002Fstandards\u002FSKILL.md",[],[195,200,201,202,203,204,205,30,206,207,208,209,35,210,211],"standards","code quality","code","validation","stack","quality","contracts","patterns","drift","conventions","full","type",{"skillNo":213,"name":214,"nameZh":6,"description":215,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":216,"categories":217,"keywords":218,"publishedAt":38},"01M6DRWE3SBMKPSNR56DTG86PR","templatecentral:scaffold","Use when creating a new FastAPI, NestJS, Next.js, or Vite+React project from scratch.","https:\u002F\u002Fgithub.com\u002Fcljiahao\u002Ftemplatecentral\u002Fblob\u002Fmain\u002Fskills\u002Fscaffold\u002FSKILL.md",[],[214,219,34,30,35,33,25,26,27,29,32],"scaffold",{"skillNo":221,"name":222,"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":223,"categories":224,"keywords":225,"publishedAt":38},"01M6DRWBRR9KTWFA2NB8RKGV8E","review","https:\u002F\u002Fgithub.com\u002Fcljiahao\u002Ftemplatecentral\u002Fblob\u002Fmain\u002Fskills\u002Freview\u002FSKILL.md",[],[222],{"skillNo":227,"name":228,"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":229,"categories":230,"keywords":231,"publishedAt":38},"01M6DRW5C5ABZ9262NAXXK6Y7V","cleanup","https:\u002F\u002Fgithub.com\u002Fcljiahao\u002Ftemplatecentral\u002Fblob\u002Fmain\u002Fskills\u002Fcleanup\u002FSKILL.md",[],[228],{"skillNo":233,"name":234,"nameZh":6,"description":235,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":236,"categories":237,"keywords":238,"publishedAt":38},"01M6DRVK1GB0P3T3XSX1175SZC","templatecentral:add","Use when adding any capability to a FastAPI, NestJS, Next.js, or Vite+React project — auth, database, tests, components, logging, and more.","https:\u002F\u002Fgithub.com\u002Fcljiahao\u002Ftemplatecentral\u002Fblob\u002Fmain\u002Fskills\u002Fadd\u002FSKILL.md",[],[234,33,25,239,240,241,26,27,29,30,32,34,35,242,243],"auth","database","logging","tests","components"]