[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6C2D4Y6HVVT11B8AXS8G3HM":3,"skill-same:01M6C2D4Y6HVVT11B8AXS8G3HM":70},{"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":32,"linkOnly":33,"markdownContent":34,"markdownBody":35,"frontMatter":36,"refName":41,"commitSha":42,"skillDirectory":43,"forksCount":44,"repositoryHtmlUrl":45,"repositoryHomepageUrl":46,"ownerHtmlUrl":47,"ownerBlogUrl":6,"ownerDescription":48,"updatedAt":49,"install":50,"resources":63},"01M6C2D4Y6HVVT11B8AXS8G3HM","backend-context",null,"Backend architecture, patterns and conventions for the Express.js 5 API. Trigger: When working on backend code, API routes, controllers, or database.","davidleonmayor\u002Fproyecto-grado-unimayor","davidleonmayor","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F142275316?v=4","01M6C2D07NAZV2VQE96MD4HWYW","David León","01M6C2D0BN278C193FYXQB3TME",3,"Apache-2.0","https:\u002F\u002Fgithub.com\u002Fdavidleonmayor\u002Fproyecto-grado-unimayor\u002Fblob\u002Fmain\u002Fskills\u002Fbackend-context\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000010","后端与接口","SCENARIO","使用场景",[24,25,26,27,28,29,30,31],"context","backend","backend context","architecture","code","database","api","js","2026-11-10 10:12:30",false,"---\nname: backend-context\ndescription: >\n  Backend architecture, patterns and conventions for the Express.js 5 API.\n  Trigger: When working on backend code, API routes, controllers, or database.\nlicense: Apache-2.0\nmetadata:\n  author: davidleonmayor\n  version: \"1.0\"\n  scope: [backend]\n---\n\n## Stack\n\n| Technology | Version | Purpose |\n|------------|---------|---------|\n| Express.js | 5 | HTTP framework |\n| TypeScript | 5 | Language |\n| Prisma | 6 | ORM |\n| MySQL | - | Database |\n| Zod | 4 | Env validation |\n| express-validator | 7 | Request validation |\n| JWT (jsonwebtoken) | 9 | Authentication |\n| Winston | 3 | Logging |\n| Morgan | 1 | HTTP request logging |\n| Multer | 2 | File uploads |\n| Brevo | 3 | Transactional emails |\n| Nodemailer | 7 | Email (fallback) |\n| Jest + ts-jest | - | Testing |\n| Supertest | 7 | HTTP testing |\n\n**File Naming Example:**\n- ✅ `sendAuthEmail.test.ts` (all tests with .test extencion)\n- ✅ `createToken.ts` (common files use camel case)\n- ✅ `auth.controller.ts` | `auth.route.ts` `auth.schema.ts` `auth.service.ts` (for each repositori spesification)\n- ✅ `AuthMiddleware.ts` (Uper camel case for classes)\n- ❌ `create-token.ts` (WRONG - do no separate be -)\n- ❌ `sign-up-validation.spec.ts` | `sing-up-validation.ts`(WRONG )\n\n## Scope Detection (ASK IF AMBIGUOUS)\n\n| User Says | Action |\n|-----------|--------|\n| \"a test\", \"one test\", \"new test\", \"add test\" | Create ONE test() in existing spec |\n| \"comprehensive tests\", \"all tests\", \"test suite\", \"generate tests\" | Create full suite |\n| \"create route\", \"create router\" | Trigger `backend-router` skill and add it |\n| \"create schema\", \"add validation\" | Trigger `backend-schema` skill and add it |\n\n**Examples:**\n- \"Create a test for user sign-up\" → ONE test only\n- \"Generate E2E tests for login page\" → Full suite\n- \"Add a test to verify form validation\" → ONE test to existing spec\n- \"create POST \u002Flogin route” → ONE route \n\n\n## Directory Structure\n\n```\nbackend\u002F\n├── prisma\u002F                   # Database schema, migrations, seeds\n│   ├── schema.prisma         # MySQL schema definition\n│   ├── migrations\u002F           # Prisma migration history\n│   ├── seed.ts               # Database seeder\n│   └── clear.ts              # Database cleanup script\n├── src\u002F\n│   ├── index.ts              # Entry point — instantiates Server\n│   ├── server.ts             # Server class (middlewares, routes, shutdown)\n│   ├── config\u002F               # App configuration (envs, prisma, logger, cors, email clients)\n│   ├── routes\u002F               # Route class definitions — mounted under \u002Fapi\u002F\n│   ├── controllers\u002F          # Request handlers for each domain\n│   ├── auth\u002F                 # Self-contained auth module (routes, controller, service, schema, tests)\n│   ├── common\u002F               # Shared code\n│   │   ├── middleware\u002F       # Auth, Role, validation, error handling, timeout\n│   │   ├── schema\u002F           # Global validation schemas\n│   │   └── utils\u002F            # Helpers (asyncHandler, createToken)\n│   ├── email\u002F                # Email templates (Brevo \u002F Nodemailer)\n│   ├── example\u002F              # Reference module for new features\n│   └── __test__\u002F             # Integration \u002F unit tests\n├── logs\u002F                     # Winston log output (gitignored)\n├── docs\u002F                     # Additional documentation\n└── jest.config.js            # Jest + ts-jest config\n```\n\n## Architecture\n\nThe backend uses two architectural patterns:\n\n**Repository pattern** — Self-contained modules under `src\u002F` with own routes, controller, service, schema, and tests. Each repository owns its full vertical slice.\n\n| Repository | Path | Description |\n|------------|------|-------------|\n| `auth` | `src\u002Fauth\u002F` | Authentication, JWT, password flows — [details](references\u002Fauth-context.md) |\n\n**Layered pattern** — Domains that share `src\u002Froutes\u002F`, `src\u002Fcontrollers\u002F` and `src\u002Fcommon\u002F`. Currently used by the remaining modules while migrating to repository pattern.\n\n| Domain | Routes | Controller |\n|--------|--------|------------|\n| projects | `src\u002Froutes\u002Fproject.routes.ts` | `src\u002Fcontrollers\u002Fproject.controller.ts` |\n| events | `src\u002Froutes\u002Fevent.routes.ts` | `src\u002Fcontrollers\u002Fevent.controller.ts` |\n| persons | `src\u002Froutes\u002Fperson.routes.ts` | `src\u002Fcontrollers\u002Fperson.controller.ts` |\n\n**Request flow:**\n\n```\nRequest → Middleware Chain → Route Class → Controller → Service → Prisma → MySQL\n                                              ↓\n                                         schema (express-validator)\n```\n\n**Layered responsibilities:**\n\n| Layer | Responsibility | Location |\n|-------|---------------|----------|\n| Server | Bootstrap, middleware chain, graceful shutdown | `src\u002Fserver.ts` |\n| Routes | HTTP method + path + middleware stack per endpoint | `src\u002Froutes\u002F`, `src\u002Fauth\u002Fauth.routes.ts` |\n| Controller | Parse request, call service\u002Fprisma, format response | `src\u002Fcontrollers\u002F`, `src\u002Fauth\u002Fauth.controller.ts` |\n| Service | Business logic, reusable operations | `src\u002Fauth\u002Fauth.service.ts` |\n| Schema | Request validation rules (express-validator) | `src\u002Fauth\u002Fauth.schema.ts`, `src\u002Fcommon\u002Fschema\u002F` |\n| Middleware | Cross-cutting: auth, roles, timeout, errors, logging | `src\u002Fcommon\u002Fmiddleware\u002F` |\n| Config | Singletons and env-validated settings | `src\u002Fconfig\u002F` |\n\n**Request lifecycle:**\n\n1. `requestTimeout(30s)` wraps the request\n2. Body parsers (`json`, `urlencoded`) with 10mb limit\n3. CORS via `corsConfig`\n4. Morgan HTTP logging\n5. `Routes.init(app)` matches the endpoint\n6. Route-level middleware chain (e.g. `authLimiter` → `validateSchema` → `authMiddleware` → controller)\n7. Controller handles logic, returns response\n8. Unmatched routes → `notFound` (404)\n9. Errors → `errorHandler` (global catch-all)\n\n## Critical Patterns\n\n### Server Class\n\n`server.ts` is a class-based Express setup. Middleware order matters:\n\n1. `requestTimeout(30000)` — 30s global timeout\n2. `express.json({ limit: '10mb' })` — body parser\n3. `cors(corsConfig)` — CORS\n4. `morganMiddleware` — HTTP logging\n5. Routes via `Routes.init(app)`\n6. `notFound` — 404 handler\n7. `errorHandler` — global error handler (always last)\n\n### Route Registration\n\nRoutes are class-based and mounted in `src\u002Froutes\u002Findex.ts`:\n\n```typescript\nexport class Routes {\n    public static init(app: Application) {\n        app.use(\"\u002Fapi\u002Fauth\", authRoutes.router);\n        app.use(\"\u002Fapi\u002Fprojects\", projectRoutes.router);\n        app.use(\"\u002Fapi\u002Fevents\", eventRoutes.router);\n        app.use(\"\u002Fapi\u002Fpersons\", personRoutes.router);\n    }\n}\n```\n\nAll API endpoints live under `\u002Fapi\u002F`.\n\n### Route Class Pattern\n\n```typescript\nexport class MyRoutes {\n    public router: Router;\n    private controller: MyController;\n    private authMiddleware: AuthMiddleware;\n\n    constructor() {\n        this.router = Router();\n        this.controller = new MyController();\n        this.authMiddleware = new AuthMiddleware();\n        this.initRoutes();\n    }\n\n    public initRoutes() {\n        this.router.get(\"\u002F\",\n            this.authMiddleware.isAuthenticatedUser,\n            this.controller.getItems\n        );\n    }\n}\n```\n\n### Authentication\n\n- JWT via `Bearer` token in `Authorization` header\n- `AuthMiddleware.isAuthenticatedUser` verifies token and attaches `req.user` (type `Partial\u003Cpersona>`)\n- Token created with `jsonwebtoken`, secret from `JWT_SECRET` env var\n\n### Authorization (Roles)\n\nRoles are determined by `actores` table (many-to-many between `persona` and `trabajo_grado` with `tipo_rol`):\n\n| Middleware | Allows |\n|------------|--------|\n| `isPrivilegedUser` | Director, Jurado, Coordinador de Carrera, Decano |\n| `isAdmin` | admin, Administrador, Admin |\n| `isCoordinator` | Coordinador de Carrera, Coordinador |\n| `isDirectorOrProfessor` | Director |\n\n### Prisma (Database)\n\n- Singleton in `config\u002Fprisma.ts` via `PrismaService.getInstance()`\n- Import: `import { prisma } from \"..\u002Fconfig\"`\n- MySQL database, models use Spanish names with `@@map(\"TABLE_NAME\")`\n- Key models: `persona`, `trabajo_grado`, `actores`, `seguimiento_tg`, `evento`\n\n### Environment Variables\n\nValidated with Zod in `config\u002Fenvs.ts`. Required vars:\n\n```\nNODE_ENV, PORT, DATABASE_URL, JWT_SECRET,\nFRONTEND_URL, NODEMAILER_*, BREVO_*\n```\n\nAccess: `import { envs } from \".\u002Fconfig\"`\n\n### Validation\n\nTwo approaches coexist:\n- `express-validator` via `validateSchema()` middleware — wraps `checkSchema()`\n- `zod` — used for env validation, available for request schemas\n\n### Error Handling\n\nGlobal error handler in `common\u002Fmiddleware\u002FerrorHandler.ts` handles:\n- Prisma errors (P2002 conflict, P2025 not found, P2003 FK violation)\n- JWT errors (invalid, expired)\n- JSON syntax errors\n- Generic errors with statusCode\n\n### Logging\n\nWinston logger with levels: error, warn, info, http, debug.\n- Console + file transports (`logs\u002Ferror.log`, `logs\u002Fcombined.log`)\n- Development: debug level. Production: warn level.\n- Import: `import { logger } from \"..\u002Fconfig\"`\n\n### File Uploads\n\nMulter handles file uploads. Two configs in `project.controller.ts`:\n- `upload` — general file uploads (PDF, images)\n- `excelUpload` — Excel bulk upload (.xlsx, .xls)\n\n## Commands\n\n```bash\npnpm dev                 # Dev server with nodemon (port 4000)\npnpm db:generate         # Generate Prisma client\npnpm db:migrate          # Run migrations\npnpm db:studio           # Open Prisma Studio\npnpm db:seed             # Seed database\npnpm db:clear            # Clear database\npnpm test                # Run tests (uses .env.test)\n```\n\n## Resources\n\n- **Repositories**: See [references\u002F](references\u002F) for detailed context on each repository module\n  - [auth-context.md](references\u002Fauth-context.md) — Auth repository: endpoints, schemas, JWT, password flows\n\n## Related AI Skills\n\n- **`backend-schema`**: Guidelines for creating `express-validator` schemas.\n- **`backend-router`**: Guidelines for writing class-based Express routers.\n","## Stack\n\n| Technology | Version | Purpose |\n|------------|---------|---------|\n| Express.js | 5 | HTTP framework |\n| TypeScript | 5 | Language |\n| Prisma | 6 | ORM |\n| MySQL | - | Database |\n| Zod | 4 | Env validation |\n| express-validator | 7 | Request validation |\n| JWT (jsonwebtoken) | 9 | Authentication |\n| Winston | 3 | Logging |\n| Morgan | 1 | HTTP request logging |\n| Multer | 2 | File uploads |\n| Brevo | 3 | Transactional emails |\n| Nodemailer | 7 | Email (fallback) |\n| Jest + ts-jest | - | Testing |\n| Supertest | 7 | HTTP testing |\n\n**File Naming Example:**\n- ✅ `sendAuthEmail.test.ts` (all tests with .test extencion)\n- ✅ `createToken.ts` (common files use camel case)\n- ✅ `auth.controller.ts` | `auth.route.ts` `auth.schema.ts` `auth.service.ts` (for each repositori spesification)\n- ✅ `AuthMiddleware.ts` (Uper camel case for classes)\n- ❌ `create-token.ts` (WRONG - do no separate be -)\n- ❌ `sign-up-validation.spec.ts` | `sing-up-validation.ts`(WRONG )\n\n## Scope Detection (ASK IF AMBIGUOUS)\n\n| User Says | Action |\n|-----------|--------|\n| \"a test\", \"one test\", \"new test\", \"add test\" | Create ONE test() in existing spec |\n| \"comprehensive tests\", \"all tests\", \"test suite\", \"generate tests\" | Create full suite |\n| \"create route\", \"create router\" | Trigger `backend-router` skill and add it |\n| \"create schema\", \"add validation\" | Trigger `backend-schema` skill and add it |\n\n**Examples:**\n- \"Create a test for user sign-up\" → ONE test only\n- \"Generate E2E tests for login page\" → Full suite\n- \"Add a test to verify form validation\" → ONE test to existing spec\n- \"create POST \u002Flogin route” → ONE route \n\n\n## Directory Structure\n\n```\nbackend\u002F\n├── prisma\u002F                   # Database schema, migrations, seeds\n│   ├── schema.prisma         # MySQL schema definition\n│   ├── migrations\u002F           # Prisma migration history\n│   ├── seed.ts               # Database seeder\n│   └── clear.ts              # Database cleanup script\n├── src\u002F\n│   ├── index.ts              # Entry point — instantiates Server\n│   ├── server.ts             # Server class (middlewares, routes, shutdown)\n│   ├── config\u002F               # App configuration (envs, prisma, logger, cors, email clients)\n│   ├── routes\u002F               # Route class definitions — mounted under \u002Fapi\u002F\n│   ├── controllers\u002F          # Request handlers for each domain\n│   ├── auth\u002F                 # Self-contained auth module (routes, controller, service, schema, tests)\n│   ├── common\u002F               # Shared code\n│   │   ├── middleware\u002F       # Auth, Role, validation, error handling, timeout\n│   │   ├── schema\u002F           # Global validation schemas\n│   │   └── utils\u002F            # Helpers (asyncHandler, createToken)\n│   ├── email\u002F                # Email templates (Brevo \u002F Nodemailer)\n│   ├── example\u002F              # Reference module for new features\n│   └── __test__\u002F             # Integration \u002F unit tests\n├── logs\u002F                     # Winston log output (gitignored)\n├── docs\u002F                     # Additional documentation\n└── jest.config.js            # Jest + ts-jest config\n```\n\n## Architecture\n\nThe backend uses two architectural patterns:\n\n**Repository pattern** — Self-contained modules under `src\u002F` with own routes, controller, service, schema, and tests. Each repository owns its full vertical slice.\n\n| Repository | Path | Description |\n|------------|------|-------------|\n| `auth` | `src\u002Fauth\u002F` | Authentication, JWT, password flows — [details](references\u002Fauth-context.md) |\n\n**Layered pattern** — Domains that share `src\u002Froutes\u002F`, `src\u002Fcontrollers\u002F` and `src\u002Fcommon\u002F`. Currently used by the remaining modules while migrating to repository pattern.\n\n| Domain | Routes | Controller |\n|--------|--------|------------|\n| projects | `src\u002Froutes\u002Fproject.routes.ts` | `src\u002Fcontrollers\u002Fproject.controller.ts` |\n| events | `src\u002Froutes\u002Fevent.routes.ts` | `src\u002Fcontrollers\u002Fevent.controller.ts` |\n| persons | `src\u002Froutes\u002Fperson.routes.ts` | `src\u002Fcontrollers\u002Fperson.controller.ts` |\n\n**Request flow:**\n\n```\nRequest → Middleware Chain → Route Class → Controller → Service → Prisma → MySQL\n                                              ↓\n                                         schema (express-validator)\n```\n\n**Layered responsibilities:**\n\n| Layer | Responsibility | Location |\n|-------|---------------|----------|\n| Server | Bootstrap, middleware chain, graceful shutdown | `src\u002Fserver.ts` |\n| Routes | HTTP method + path + middleware stack per endpoint | `src\u002Froutes\u002F`, `src\u002Fauth\u002Fauth.routes.ts` |\n| Controller | Parse request, call service\u002Fprisma, format response | `src\u002Fcontrollers\u002F`, `src\u002Fauth\u002Fauth.controller.ts` |\n| Service | Business logic, reusable operations | `src\u002Fauth\u002Fauth.service.ts` |\n| Schema | Request validation rules (express-validator) | `src\u002Fauth\u002Fauth.schema.ts`, `src\u002Fcommon\u002Fschema\u002F` |\n| Middleware | Cross-cutting: auth, roles, timeout, errors, logging | `src\u002Fcommon\u002Fmiddleware\u002F` |\n| Config | Singletons and env-validated settings | `src\u002Fconfig\u002F` |\n\n**Request lifecycle:**\n\n1. `requestTimeout(30s)` wraps the request\n2. Body parsers (`json`, `urlencoded`) with 10mb limit\n3. CORS via `corsConfig`\n4. Morgan HTTP logging\n5. `Routes.init(app)` matches the endpoint\n6. Route-level middleware chain (e.g. `authLimiter` → `validateSchema` → `authMiddleware` → controller)\n7. Controller handles logic, returns response\n8. Unmatched routes → `notFound` (404)\n9. Errors → `errorHandler` (global catch-all)\n\n## Critical Patterns\n\n### Server Class\n\n`server.ts` is a class-based Express setup. Middleware order matters:\n\n1. `requestTimeout(30000)` — 30s global timeout\n2. `express.json({ limit: '10mb' })` — body parser\n3. `cors(corsConfig)` — CORS\n4. `morganMiddleware` — HTTP logging\n5. Routes via `Routes.init(app)`\n6. `notFound` — 404 handler\n7. `errorHandler` — global error handler (always last)\n\n### Route Registration\n\nRoutes are class-based and mounted in `src\u002Froutes\u002Findex.ts`:\n\n```typescript\nexport class Routes {\n    public static init(app: Application) {\n        app.use(\"\u002Fapi\u002Fauth\", authRoutes.router);\n        app.use(\"\u002Fapi\u002Fprojects\", projectRoutes.router);\n        app.use(\"\u002Fapi\u002Fevents\", eventRoutes.router);\n        app.use(\"\u002Fapi\u002Fpersons\", personRoutes.router);\n    }\n}\n```\n\nAll API endpoints live under `\u002Fapi\u002F`.\n\n### Route Class Pattern\n\n```typescript\nexport class MyRoutes {\n    public router: Router;\n    private controller: MyController;\n    private authMiddleware: AuthMiddleware;\n\n    constructor() {\n        this.router = Router();\n        this.controller = new MyController();\n        this.authMiddleware = new AuthMiddleware();\n        this.initRoutes();\n    }\n\n    public initRoutes() {\n        this.router.get(\"\u002F\",\n            this.authMiddleware.isAuthenticatedUser,\n            this.controller.getItems\n        );\n    }\n}\n```\n\n### Authentication\n\n- JWT via `Bearer` token in `Authorization` header\n- `AuthMiddleware.isAuthenticatedUser` verifies token and attaches `req.user` (type `Partial\u003Cpersona>`)\n- Token created with `jsonwebtoken`, secret from `JWT_SECRET` env var\n\n### Authorization (Roles)\n\nRoles are determined by `actores` table (many-to-many between `persona` and `trabajo_grado` with `tipo_rol`):\n\n| Middleware | Allows |\n|------------|--------|\n| `isPrivilegedUser` | Director, Jurado, Coordinador de Carrera, Decano |\n| `isAdmin` | admin, Administrador, Admin |\n| `isCoordinator` | Coordinador de Carrera, Coordinador |\n| `isDirectorOrProfessor` | Director |\n\n### Prisma (Database)\n\n- Singleton in `config\u002Fprisma.ts` via `PrismaService.getInstance()`\n- Import: `import { prisma } from \"..\u002Fconfig\"`\n- MySQL database, models use Spanish names with `@@map(\"TABLE_NAME\")`\n- Key models: `persona`, `trabajo_grado`, `actores`, `seguimiento_tg`, `evento`\n\n### Environment Variables\n\nValidated with Zod in `config\u002Fenvs.ts`. Required vars:\n\n```\nNODE_ENV, PORT, DATABASE_URL, JWT_SECRET,\nFRONTEND_URL, NODEMAILER_*, BREVO_*\n```\n\nAccess: `import { envs } from \".\u002Fconfig\"`\n\n### Validation\n\nTwo approaches coexist:\n- `express-validator` via `validateSchema()` middleware — wraps `checkSchema()`\n- `zod` — used for env validation, available for request schemas\n\n### Error Handling\n\nGlobal error handler in `common\u002Fmiddleware\u002FerrorHandler.ts` handles:\n- Prisma errors (P2002 conflict, P2025 not found, P2003 FK violation)\n- JWT errors (invalid, expired)\n- JSON syntax errors\n- Generic errors with statusCode\n\n### Logging\n\nWinston logger with levels: error, warn, info, http, debug.\n- Console + file transports (`logs\u002Ferror.log`, `logs\u002Fcombined.log`)\n- Development: debug level. Production: warn level.\n- Import: `import { logger } from \"..\u002Fconfig\"`\n\n### File Uploads\n\nMulter handles file uploads. Two configs in `project.controller.ts`:\n- `upload` — general file uploads (PDF, images)\n- `excelUpload` — Excel bulk upload (.xlsx, .xls)\n\n## Commands\n\n```bash\npnpm dev                 # Dev server with nodemon (port 4000)\npnpm db:generate         # Generate Prisma client\npnpm db:migrate          # Run migrations\npnpm db:studio           # Open Prisma Studio\npnpm db:seed             # Seed database\npnpm db:clear            # Clear database\npnpm test                # Run tests (uses .env.test)\n```\n\n## Resources\n\n- **Repositories**: See [references\u002F](references\u002F) for detailed context on each repository module\n  - [auth-context.md](references\u002Fauth-context.md) — Auth repository: endpoints, schemas, JWT, password flows\n\n## Related AI Skills\n\n- **`backend-schema`**: Guidelines for creating `express-validator` schemas.\n- **`backend-router`**: Guidelines for writing class-based Express routers.\n",{"name":5,"license":15,"metadata":37,"description":40},{"scope":38,"author":9,"version":39},[25],"1.0","Backend architecture, patterns and conventions for the Express.js 5 API. Trigger: When working on backend code, API routes, controllers, or database.\n","main","3d76dc018cdded158c4f49df5edb56829229d265","skills\u002Fbackend-context",0,"https:\u002F\u002Fgithub.com\u002Fdavidleonmayor\u002Fproyecto-grado-unimayor","https:\u002F\u002Fproyecto-grado-unimayor-8rtknmpjt-davidleonmayors-projects.vercel.app\u002Fadmin","https:\u002F\u002Fgithub.com\u002Fdavidleonmayor","Full-stack developer focused on microservices backend","2026-11-11 00:05:51",{"source":8,"skillName":5,"commands":51,"prompt":61,"zipAvailable":62},[52,55,58],{"tool":53,"command":54},"npx","npx skills add davidleonmayor\u002Fproyecto-grado-unimayor --skill backend-context",{"tool":56,"command":57},"bunx","bunx skills add davidleonmayor\u002Fproyecto-grado-unimayor --skill backend-context",{"tool":59,"command":60},"pnpm","pnpm dlx skills add davidleonmayor\u002Fproyecto-grado-unimayor --skill backend-context","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fdavidleonmayor\u002Fproyecto-grado-unimayor\u002Fblob\u002Fmain\u002Fskills\u002Fbackend-context\u002FSKILL.md",true,[64],{"path":65,"resourceType":66,"resourceTypeDesc":67,"sizeBytes":68,"sourceHtmlUrl":69},"references\u002Fauth-context.md","REFERENCE","参考文档",5505,"https:\u002F\u002Fgithub.com\u002Fdavidleonmayor\u002Fproyecto-grado-unimayor\u002Fblob\u002Fmain\u002Fskills\u002Fbackend-context\u002Freferences\u002Fauth-context.md",[71,87,108,127,138,156],{"skillNo":72,"name":73,"nameZh":6,"description":74,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":75,"categories":76,"keywords":80,"publishedAt":32},"01M6C2DVB157H69PFWB1XXBVZS","skill-sync","Synchronizes skill metadata to AGENTS.md Auto-invoke sections. Trigger: When syncing skill metadata to AGENTS.md.","https:\u002F\u002Fgithub.com\u002Fdavidleonmayor\u002Fproyecto-grado-unimayor\u002Fblob\u002Fmain\u002Fskills\u002Fskill-sync\u002FSKILL.md",[77],{"categoryNo":78,"categoryName":79,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[81,82,83,84,85,86],"sync","skill sync","metadata","cloud","prowler","auto",{"skillNo":88,"name":89,"nameZh":6,"description":90,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":91,"categories":92,"keywords":94,"publishedAt":32},"01M6C2DRSV8QKEFA2J94YQKWK1","skill-creator","Creates new AI agent skills following the Agent Skills spec. Trigger: When user asks to create a new skill, add agent instructions, or document patterns for AI.","https:\u002F\u002Fgithub.com\u002Fdavidleonmayor\u002Fproyecto-grado-unimayor\u002Fblob\u002Fmain\u002Fskills\u002Fskill-creator\u002FSKILL.md",[93],{"categoryNo":78,"categoryName":79,"taxonomyType":21,"taxonomyTypeDesc":22},[95,96,97,98,84,85,99,100,101,102,103,104,105,106,107],"skill creator","spec","ai agent","create","Bash","grep","read","write","edit","instructions","user","webfetch","add agent",{"skillNo":109,"name":110,"nameZh":6,"description":111,"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":118,"publishedAt":32},"01M6C2DP81DY28MKM0RKFWJQHX","skill-commit","Creates professional git commits following conventional-commits format. Trigger: When creating commits, after completing code changes, when user asks to commit.","https:\u002F\u002Fgithub.com\u002Fdavidleonmayor\u002Fproyecto-grado-unimayor\u002Fblob\u002Fmain\u002Fskills\u002Fskill-commit\u002FSKILL.md",[114,117],{"categoryNo":115,"categoryName":116,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000009","前端开发",{"categoryNo":78,"categoryName":79,"taxonomyType":21,"taxonomyTypeDesc":22},[119,120,121,25,28,105,122,123,124,125,126],"commit","skill commit","landing","frontend","git commit","git","commits","format",{"skillNo":128,"name":129,"nameZh":6,"description":130,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":131,"categories":132,"keywords":133,"publishedAt":32},"01M6C2DMHK8HST60TFQHMK8D94","project-info","General monorepo structure and component overview. Trigger: When AI needs project context or component locations.","https:\u002F\u002Fgithub.com\u002Fdavidleonmayor\u002Fproyecto-grado-unimayor\u002Fblob\u002Fmain\u002Fskills\u002Fproject-info\u002FSKILL.md",[],[134,135,136,24,137],"project info","component","monorepo","overview",{"skillNo":139,"name":140,"nameZh":6,"description":141,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":142,"categories":143,"keywords":150,"publishedAt":32},"01M6C2DHT1Q0Q87WRYBCBH3QHG","frontend-context","Frontend architecture, patterns and conventions for the Next.js 15 app. Trigger: When working on frontend code, components, pages, or API integration.","https:\u002F\u002Fgithub.com\u002Fdavidleonmayor\u002Fproyecto-grado-unimayor\u002Fblob\u002Fmain\u002Fskills\u002Ffrontend-context\u002FSKILL.md",[144,145],{"categoryNo":115,"categoryName":116,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":146,"categoryName":147,"taxonomyType":148,"taxonomyTypeDesc":149},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[122,24,151,30,152,27,28,153,154,155,31],"frontend context","components","frontend architecture","integration","Next.js",{"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":166,"publishedAt":32},"01M6C2DESFJR14Z3G38F4KZCSG","express-mocks-testing","Unit testing pattern for Express 5 controllers using node-mocks-http and @prisma\u002Fclient mocks. Trigger: When writing unit tests for backend controllers, testing Express routes, or avoiding Supertest\u002FServer instantiation.","https:\u002F\u002Fgithub.com\u002Fdavidleonmayor\u002Fproyecto-grado-unimayor\u002Fblob\u002Fmain\u002Fskills\u002Fexpress-mocks-testing\u002FSKILL.md",[162,165],{"categoryNo":163,"categoryName":164,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量",{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[167,168,169,170,171,172,173,174,25],"express mocks testing","testing","writing","unit tests","http","server","programming","node"]