[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6QQ97YEXRPA0REF58JR1VGF":3,"skill-same:01M6QQ97YEXRPA0REF58JR1VGF":72},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":28,"publishedAt":46,"linkOnly":47,"markdownContent":48,"markdownBody":49,"frontMatter":50,"refName":51,"commitSha":52,"skillDirectory":53,"forksCount":54,"repositoryHtmlUrl":55,"repositoryHomepageUrl":6,"ownerHtmlUrl":56,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":57,"install":58,"resources":71},"01M6QQ97YEXRPA0REF58JR1VGF","nestjs-api",null,"Create NestJS API endpoints with controllers, services, and modules. Use when adding API routes, backend features, validation, or any backend code change. This is the backend framework — every API change should follow NestJS patterns.","SimaDevelopment\u002Fopsiforce","SimaDevelopment","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F153810655?v=4","01M6QQ054MKBDSS43AND3FNHDK","Opsima","01M6QQ058VFT6EY7HCBVN49G8Z",42,"AGPL-3.0","https:\u002F\u002Fgithub.com\u002FSimaDevelopment\u002Fopsiforce\u002Fblob\u002Fmain\u002Fagent-config\u002Fskills\u002Fnestjs-api\u002FSKILL.md",[18,23],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000010","后端与接口","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":26,"taxonomyTypeDesc":27},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45],"nestjs api","api","nestjs","backend","nestjs patterns","features","with","patterns","endpoints","modules","change","use","services","framework","validation","code","create","2026-11-10 10:12:30",false,"---\nname: nestjs-api\ndescription: Create NestJS API endpoints with controllers, services, and modules. Use when adding API routes, backend features, validation, or any backend code change. This is the backend framework — every API change should follow NestJS patterns.\n---\n\n# NestJS API Development\n\nThe backend uses NestJS with the Fastify adapter. All routes are prefixed with `\u002Fapi` (set in `main.ts`). For real-time features (live updates, chat, server push) see the `websockets` skill.\n\n## Module pattern — every feature needs 3 files\n\n### 1. Module\n\n```typescript\nimport { Module } from \"@nestjs\u002Fcommon\"\nimport { TasksController } from \".\u002Ftasks.controller\"\nimport { TasksService } from \".\u002Ftasks.service\"\n\n@Module({\n  controllers: [TasksController],\n  providers: [TasksService],\n})\nexport class TasksModule {}\n```\n\n### 2. Controller (handles HTTP)\n\n```typescript\nimport { Controller, Get, Post, Put, Delete, Param, Body, Query, ParseIntPipe, BadRequestException } from \"@nestjs\u002Fcommon\"\nimport { TasksService } from \".\u002Ftasks.service\"\n\n@Controller(\"tasks\")\nexport class TasksController {\n  constructor(private readonly tasksService: TasksService) {}\n\n  @Get()\n  findAll(@Query(\"status\") status?: string) {\n    return this.tasksService.findAll(status)\n  }\n\n  @Get(\":id\")\n  findOne(@Param(\"id\", ParseIntPipe) id: number) {\n    return this.tasksService.findOne(id)\n  }\n\n  @Post()\n  create(@Body() body: { title: string; description?: string }) {\n    if (!body.title) throw new BadRequestException(\"Title is required\")\n    return this.tasksService.create(body.title, body.description)\n  }\n\n  @Put(\":id\")\n  update(@Param(\"id\", ParseIntPipe) id: number, @Body() body: { title?: string; description?: string; status?: string }) {\n    return this.tasksService.update(id, body)\n  }\n\n  @Delete(\":id\")\n  remove(@Param(\"id\", ParseIntPipe) id: number) {\n    this.tasksService.remove(id)\n    return { ok: true }\n  }\n}\n```\n\n### 3. Service (business logic + database)\n\n```typescript\nimport { Injectable, NotFoundException } from \"@nestjs\u002Fcommon\"\nimport { DatabaseService } from \"..\u002Fdatabase\u002Fdatabase.service\"\n\n@Injectable()\nexport class TasksService {\n  constructor(private readonly db: DatabaseService) {}\n\n  findAll(status?: string) {\n    if (status) {\n      return this.db.queryAll(\"SELECT * FROM tasks WHERE status = ? ORDER BY created_at DESC\", [status])\n    }\n    return this.db.queryAll(\"SELECT * FROM tasks ORDER BY created_at DESC\")\n  }\n\n  findOne(id: number) {\n    const task = this.db.queryOne(\"SELECT * FROM tasks WHERE id = ?\", [id])\n    if (!task) throw new NotFoundException(`Task ${id} not found`)\n    return task\n  }\n\n  create(title: string, description?: string) {\n    const result = this.db.run(\"INSERT INTO tasks (title, description) VALUES (?, ?)\", [title, description ?? null])\n    return this.findOne(result.lastInsertRowid as number)\n  }\n\n  update(id: number, data: { title?: string; description?: string; status?: string }) {\n    this.findOne(id)\n    this.db.run(\n      \"UPDATE tasks SET title = COALESCE(?, title), description = COALESCE(?, description), status = COALESCE(?, status), updated_at = datetime('now') WHERE id = ?\",\n      [data.title ?? null, data.description ?? null, data.status ?? null, id],\n    )\n    return this.findOne(id)\n  }\n\n  remove(id: number) {\n    this.findOne(id)\n    this.db.run(\"DELETE FROM tasks WHERE id = ?\", [id])\n  }\n}\n```\n\nName every column an update may touch — never build SQL from the request body's keys, which lets a client write any column. Register the module in `app.module.ts` (`web-app`).\n\n## DatabaseService methods\n\n`queryAll`, `queryOne`, `run` and `exec` are the whole API — the `sqlite` skill has their signatures and transactions.\n\n## Key decorators\n\n- `@Controller(\"path\")` — route prefix\n- `@Get()`, `@Post()`, `@Put()`, `@Delete()` — HTTP methods\n- `@Param(\"name\", ParseIntPipe)` — URL params with type coercion\n- `@Body()` — request body\n- `@Query(\"name\")` — query string params\n\n## Exceptions\n\n- `NotFoundException` → 404\n- `BadRequestException` → 400\n- `UnauthorizedException` → 401\n- `ForbiddenException` → 403\n- `ConflictException` → 409\n","# NestJS API Development\n\nThe backend uses NestJS with the Fastify adapter. All routes are prefixed with `\u002Fapi` (set in `main.ts`). For real-time features (live updates, chat, server push) see the `websockets` skill.\n\n## Module pattern — every feature needs 3 files\n\n### 1. Module\n\n```typescript\nimport { Module } from \"@nestjs\u002Fcommon\"\nimport { TasksController } from \".\u002Ftasks.controller\"\nimport { TasksService } from \".\u002Ftasks.service\"\n\n@Module({\n  controllers: [TasksController],\n  providers: [TasksService],\n})\nexport class TasksModule {}\n```\n\n### 2. Controller (handles HTTP)\n\n```typescript\nimport { Controller, Get, Post, Put, Delete, Param, Body, Query, ParseIntPipe, BadRequestException } from \"@nestjs\u002Fcommon\"\nimport { TasksService } from \".\u002Ftasks.service\"\n\n@Controller(\"tasks\")\nexport class TasksController {\n  constructor(private readonly tasksService: TasksService) {}\n\n  @Get()\n  findAll(@Query(\"status\") status?: string) {\n    return this.tasksService.findAll(status)\n  }\n\n  @Get(\":id\")\n  findOne(@Param(\"id\", ParseIntPipe) id: number) {\n    return this.tasksService.findOne(id)\n  }\n\n  @Post()\n  create(@Body() body: { title: string; description?: string }) {\n    if (!body.title) throw new BadRequestException(\"Title is required\")\n    return this.tasksService.create(body.title, body.description)\n  }\n\n  @Put(\":id\")\n  update(@Param(\"id\", ParseIntPipe) id: number, @Body() body: { title?: string; description?: string; status?: string }) {\n    return this.tasksService.update(id, body)\n  }\n\n  @Delete(\":id\")\n  remove(@Param(\"id\", ParseIntPipe) id: number) {\n    this.tasksService.remove(id)\n    return { ok: true }\n  }\n}\n```\n\n### 3. Service (business logic + database)\n\n```typescript\nimport { Injectable, NotFoundException } from \"@nestjs\u002Fcommon\"\nimport { DatabaseService } from \"..\u002Fdatabase\u002Fdatabase.service\"\n\n@Injectable()\nexport class TasksService {\n  constructor(private readonly db: DatabaseService) {}\n\n  findAll(status?: string) {\n    if (status) {\n      return this.db.queryAll(\"SELECT * FROM tasks WHERE status = ? ORDER BY created_at DESC\", [status])\n    }\n    return this.db.queryAll(\"SELECT * FROM tasks ORDER BY created_at DESC\")\n  }\n\n  findOne(id: number) {\n    const task = this.db.queryOne(\"SELECT * FROM tasks WHERE id = ?\", [id])\n    if (!task) throw new NotFoundException(`Task ${id} not found`)\n    return task\n  }\n\n  create(title: string, description?: string) {\n    const result = this.db.run(\"INSERT INTO tasks (title, description) VALUES (?, ?)\", [title, description ?? null])\n    return this.findOne(result.lastInsertRowid as number)\n  }\n\n  update(id: number, data: { title?: string; description?: string; status?: string }) {\n    this.findOne(id)\n    this.db.run(\n      \"UPDATE tasks SET title = COALESCE(?, title), description = COALESCE(?, description), status = COALESCE(?, status), updated_at = datetime('now') WHERE id = ?\",\n      [data.title ?? null, data.description ?? null, data.status ?? null, id],\n    )\n    return this.findOne(id)\n  }\n\n  remove(id: number) {\n    this.findOne(id)\n    this.db.run(\"DELETE FROM tasks WHERE id = ?\", [id])\n  }\n}\n```\n\nName every column an update may touch — never build SQL from the request body's keys, which lets a client write any column. Register the module in `app.module.ts` (`web-app`).\n\n## DatabaseService methods\n\n`queryAll`, `queryOne`, `run` and `exec` are the whole API — the `sqlite` skill has their signatures and transactions.\n\n## Key decorators\n\n- `@Controller(\"path\")` — route prefix\n- `@Get()`, `@Post()`, `@Put()`, `@Delete()` — HTTP methods\n- `@Param(\"name\", ParseIntPipe)` — URL params with type coercion\n- `@Body()` — request body\n- `@Query(\"name\")` — query string params\n\n## Exceptions\n\n- `NotFoundException` → 404\n- `BadRequestException` → 400\n- `UnauthorizedException` → 401\n- `ForbiddenException` → 403\n- `ConflictException` → 409\n",{"name":5,"description":7},"main","c54d8e35f50ac35b3b2c7ba8d4fca2205a740cb9","agent-config\u002Fskills\u002Fnestjs-api",9,"https:\u002F\u002Fgithub.com\u002FSimaDevelopment\u002Fopsiforce","https:\u002F\u002Fgithub.com\u002FSimaDevelopment","2026-11-05 06:13:10",{"source":8,"skillName":5,"commands":59,"prompt":69,"zipAvailable":70},[60,63,66],{"tool":61,"command":62},"npx","npx skills add SimaDevelopment\u002Fopsiforce --skill nestjs-api",{"tool":64,"command":65},"bunx","bunx skills add SimaDevelopment\u002Fopsiforce --skill nestjs-api",{"tool":67,"command":68},"pnpm","pnpm dlx skills add SimaDevelopment\u002Fopsiforce --skill nestjs-api","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FSimaDevelopment\u002Fopsiforce\u002Fblob\u002Fmain\u002Fagent-config\u002Fskills\u002Fnestjs-api\u002FSKILL.md",true,[],[73,105,125,146,156,181],{"skillNo":74,"name":75,"nameZh":6,"description":76,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":77,"categories":78,"keywords":86,"publishedAt":46},"01M6QQKHZFGFB6A111RW2A9WC0","figma-use","**MANDATORY prerequisite** — you MUST invoke this skill BEFORE every `use_figma` tool call. NEVER call `use_figma` directly without loading this skill first. Skipping it causes common, hard-to-debug failures. Trigger whenever the user wants to perform a write action or a unique read action that requires JavaScript execution in the Figma file context — e.g. create\u002Fedit\u002Fdelete nodes, set up variables or tokens, build components and variants, modify auto-layout or fills, bind variables to properties, or inspect file structure programmatically.","https:\u002F\u002Fgithub.com\u002FSimaDevelopment\u002Fopsiforce\u002Fblob\u002Fmain\u002Ffrontend\u002Fopencode\u002Fpackages\u002Fplugins\u002Ffigma\u002Fskills\u002Ffigma-use\u002FSKILL.md",[79,82,83],{"categoryNo":80,"categoryName":81,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",{"categoryNo":24,"categoryName":25,"taxonomyType":26,"taxonomyTypeDesc":27},{"categoryNo":84,"categoryName":85,"taxonomyType":26,"taxonomyTypeDesc":27},"01JBSEEDCAT000000000000032","设计师",[87,88,40,89,45,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104],"figma use","figma","components","delete","tool","read","write","edit","context","auto","structure","tokens","bind","Variables","you","inspect","variants","invoke",{"skillNo":106,"name":107,"nameZh":6,"description":108,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":109,"categories":110,"keywords":116,"publishedAt":46},"01M6QQK1AMA90K6DFAVANYQ9X3","figma-use-slides","This skill helps agents use Figma's use_figma MCP tool in the Slides context. Can be used alongside figma-use which has foundational context for using the use_figma tool.","https:\u002F\u002Fgithub.com\u002FSimaDevelopment\u002Fopsiforce\u002Fblob\u002Fmain\u002Ffrontend\u002Fopencode\u002Fpackages\u002Fplugins\u002Ffigma\u002Fskills\u002Ffigma-use-slides\u002FSKILL.md",[111,114,115],{"categoryNo":112,"categoryName":113,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000003","演示文稿",{"categoryNo":80,"categoryName":81,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":84,"categoryName":85,"taxonomyType":26,"taxonomyTypeDesc":27},[87,88,117,118,40,119,91,95,120,121,122,123,124],"figma use slides","slides","MCP","false","which","can","for","figma mcp",{"skillNo":126,"name":127,"nameZh":6,"description":128,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":129,"categories":130,"keywords":133,"publishedAt":46},"01M6QQJTR9QYK297WQ1X792D63","figma-use-motion","Motion \u002F animation context for the `use_figma` MCP tool — animating Figma nodes via manual keyframes, animation styles, easing, and timeline duration. Load alongside figma-use whenever a task involves adding, editing, or inspecting animation on a node.","https:\u002F\u002Fgithub.com\u002FSimaDevelopment\u002Fopsiforce\u002Fblob\u002Fmain\u002Ffrontend\u002Fopencode\u002Fpackages\u002Fplugins\u002Ffigma\u002Fskills\u002Ffigma-use-motion\u002FSKILL.md",[131,132],{"categoryNo":80,"categoryName":81,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":84,"categoryName":85,"taxonomyType":26,"taxonomyTypeDesc":27},[87,88,134,40,135,119,136,91,137,138,95,139,140,141,120,142,143,144,145,123],"figma use motion","motion","Animation","node","editing","Nodes","task","keyframes","via","styles","manual","load",{"skillNo":147,"name":148,"nameZh":6,"description":149,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":150,"categories":151,"keywords":154,"publishedAt":46},"01M6QQJNZ067ZRXZ6A0QB9M6SB","figma-use-figjam","This skill helps agents use Figma's use_figma MCP tool in the FigJam context. Can be used alongside figma-use which has foundational context for using the use_figma tool.","https:\u002F\u002Fgithub.com\u002FSimaDevelopment\u002Fopsiforce\u002Fblob\u002Fmain\u002Ffrontend\u002Fopencode\u002Fpackages\u002Fplugins\u002Ffigma\u002Fskills\u002Ffigma-use-figjam\u002FSKILL.md",[152,153],{"categoryNo":80,"categoryName":81,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":84,"categoryName":85,"taxonomyType":26,"taxonomyTypeDesc":27},[87,88,155,40,119,91,95,120,121,122,123,124],"figma use figjam",{"skillNo":157,"name":158,"nameZh":6,"description":159,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":160,"categories":161,"keywords":163,"publishedAt":46},"01M6QQJ7NEHXPE33VRVHYYM7YE","figma-swiftui","SwiftUI ↔ Figma translation. Use whenever the user mentions Swift, SwiftUI, iOS, iPhone, or iPad — in EITHER direction — translating a Figma design into SwiftUI (design → code), or pushing SwiftUI views \u002F screens \u002F tokens back into a Figma file (code → design). Triggers on phrases like 'implement this Figma design in SwiftUI', 'build this screen in Swift', 'push this SwiftUI view to Figma', 'mirror my Swift code in a Figma file', or whenever a Figma URL appears alongside `.swift` files \u002F an `.xcodeproj`. Routes to a direction-specific reference doc; loads alongside `figma-use` for the code → design path.","https:\u002F\u002Fgithub.com\u002FSimaDevelopment\u002Fopsiforce\u002Fblob\u002Fmain\u002Ffrontend\u002Fopencode\u002Fpackages\u002Fplugins\u002Ffigma\u002Fskills\u002Ffigma-swiftui\u002FSKILL.md",[162],{"categoryNo":84,"categoryName":85,"taxonomyType":26,"taxonomyTypeDesc":27},[88,164,165,166,167,44,168,169,170,171,172,173,174,175,120,176,177,178,179,180],"figma swiftui","swiftui","design","swift","push","doc","files","translation","back","either","iphone","ipad","screen","direction","URL","my","path",{"skillNo":182,"name":183,"nameZh":6,"description":184,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":185,"categories":186,"keywords":188,"publishedAt":46},"01M6QQJ3WZ3M90BZQ5TD305PKN","figma-shaders","**MANDATORY prerequisite** — load this skill before calling `create_shader` or `update_shader`. Use when the user asks to create, author, change, fix, or iterate on a shader effect, shader fill, custom effect, custom fill, or procedural shader in Figma.","https:\u002F\u002Fgithub.com\u002FSimaDevelopment\u002Fopsiforce\u002Fblob\u002Fmain\u002Ffrontend\u002Fopencode\u002Fpackages\u002Fplugins\u002Ffigma\u002Fskills\u002Ffigma-shaders\u002FSKILL.md",[187],{"categoryNo":84,"categoryName":85,"taxonomyType":26,"taxonomyTypeDesc":27},[189,88,190,39,45,191,192,193,194,40,195,196,120,197,145,198,199,200,201],"shaders","figma shaders","update","effect","user","fix","shader","calling","procedural","fill","iterate","custom","author"]