[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6EBJDWR73RJ84SMMR43PCHA":3,"skill-same:01M6EBJDWR73RJ84SMMR43PCHA":111},{"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":33,"linkOnly":34,"markdownContent":35,"markdownBody":36,"frontMatter":37,"refName":38,"commitSha":39,"skillDirectory":40,"forksCount":41,"repositoryHtmlUrl":42,"repositoryHomepageUrl":43,"ownerHtmlUrl":44,"ownerBlogUrl":6,"ownerDescription":45,"updatedAt":46,"install":47,"resources":60},"01M6EBJDWR73RJ84SMMR43PCHA","nestjs-configuration",null,"Environment variables validation and ConfigModule setup. Use when validating environment variables with Joi\u002FZod or configuring ConfigModule in NestJS. (triggers: .env, app.module.ts, **\u002Fconfig.ts, ConfigModule, Joi, env)","ComeOnOliver\u002Fskillshub","ComeOnOliver","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F43215937?v=4","01M6E5JNFECJAAVFE0W7SMWWD2","Haoran Shu","01M6E5JNNDQS7AJZDYFQ8TPZCK",66,"MIT","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002FHoangNguyen0403\u002Fagent-skills-standard\u002Fnestjs-configuration\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32],"nestjs","configuration","nestjs configuration","config","setup","validation","zod","environment","use","triggers","module","app","env","environment variables","2026-11-10 10:12:30",false,"---\nname: nestjs-configuration\ndescription: \"Environment variables validation and ConfigModule setup. Use when validating environment variables with Joi\u002FZod or configuring ConfigModule in NestJS. (triggers: .env, app.module.ts, **\u002Fconfig.ts, ConfigModule, Joi, env)\"\n---\n\n# NestJS Configuration Standards\n\n## **Priority: P1 (OPERATIONAL)**\n\nEnvironment configuration and validation patterns for NestJS applications.\n\n## Setup\n\n1. **Library**: Use `@nestjs\u002Fconfig`.\n2. **Initialization**: Import `ConfigModule.forRoot({ isGlobal: true })` in `AppModule`.\n\n## Validation\n\n- **Mandatory**: Validate environment variables at startup.\n- **Tool**: Use `joi` or a custom validation class.\n- **Effect**: The app **must crash** immediately if a required env var (e.g., `DB_URL`) is missing.\n\n```typescript\n\u002F\u002F app.module.ts\nConfigModule.forRoot({\n  validationSchema: Joi.object({\n    NODE_ENV: Joi.string()\n      .valid('development', 'production')\n      .default('development'),\n    PORT: Joi.number().default(3000),\n    DATABASE_URL: Joi.string().required(),\n  }),\n});\n```\n\n## Usage\n\n- **Injection**: Inject `ConfigService` to access values.\n- **Typing**: Avoid magic strings. Use a type-safe getter helper or a dedicated configuration object\u002Finterface.\n- **Secrets**: Never commit `.env` files. Add `.env*` to `.gitignore`.\n\n## ⚠️ Adding New Variables\n\nWhen adding a new environment variable to the application, you **MUST** update all of the following:\n\n1. **`src\u002Fconfig\u002Fenv.validation.ts`**: Add the class property with appropriate `class-validator` decorators.\n2. **`.env.example`**: Add a placeholder value so other developers know about it.\n3. **`.env.development` \u002F `.env.test`**: Add the actual development values.\n4. **CI\u002FCD Pipelines & Infrastructure**: You **MUST** map the new variable in your deployment scripts (e.g., `.github\u002Fworkflows\u002F*.yml`, `gitlab-ci.yml`, Terraform, or Azure Pipelines). Most modern cloud platforms (Cloud Run, ECS, Kubernetes) require explicit mapping of secrets\u002Fenv-vars into the container runtime. Failure to do this will cause the production deployment to crash or silently fail.\n\n\n## Anti-Patterns\n\n- **No unchecked env vars**: Validate all required variables at startup; app must crash if missing.\n- **No committed secrets**: Add `.env*` to `.gitignore`; load values via ConfigService only.\n- **No new vars without CI\u002FCD update**: Always update `env.validation.ts`, `.env.example`, and pipeline manifests.\n\n","# NestJS Configuration Standards\n\n## **Priority: P1 (OPERATIONAL)**\n\nEnvironment configuration and validation patterns for NestJS applications.\n\n## Setup\n\n1. **Library**: Use `@nestjs\u002Fconfig`.\n2. **Initialization**: Import `ConfigModule.forRoot({ isGlobal: true })` in `AppModule`.\n\n## Validation\n\n- **Mandatory**: Validate environment variables at startup.\n- **Tool**: Use `joi` or a custom validation class.\n- **Effect**: The app **must crash** immediately if a required env var (e.g., `DB_URL`) is missing.\n\n```typescript\n\u002F\u002F app.module.ts\nConfigModule.forRoot({\n  validationSchema: Joi.object({\n    NODE_ENV: Joi.string()\n      .valid('development', 'production')\n      .default('development'),\n    PORT: Joi.number().default(3000),\n    DATABASE_URL: Joi.string().required(),\n  }),\n});\n```\n\n## Usage\n\n- **Injection**: Inject `ConfigService` to access values.\n- **Typing**: Avoid magic strings. Use a type-safe getter helper or a dedicated configuration object\u002Finterface.\n- **Secrets**: Never commit `.env` files. Add `.env*` to `.gitignore`.\n\n## ⚠️ Adding New Variables\n\nWhen adding a new environment variable to the application, you **MUST** update all of the following:\n\n1. **`src\u002Fconfig\u002Fenv.validation.ts`**: Add the class property with appropriate `class-validator` decorators.\n2. **`.env.example`**: Add a placeholder value so other developers know about it.\n3. **`.env.development` \u002F `.env.test`**: Add the actual development values.\n4. **CI\u002FCD Pipelines & Infrastructure**: You **MUST** map the new variable in your deployment scripts (e.g., `.github\u002Fworkflows\u002F*.yml`, `gitlab-ci.yml`, Terraform, or Azure Pipelines). Most modern cloud platforms (Cloud Run, ECS, Kubernetes) require explicit mapping of secrets\u002Fenv-vars into the container runtime. Failure to do this will cause the production deployment to crash or silently fail.\n\n\n## Anti-Patterns\n\n- **No unchecked env vars**: Validate all required variables at startup; app must crash if missing.\n- **No committed secrets**: Add `.env*` to `.gitignore`; load values via ConfigService only.\n- **No new vars without CI\u002FCD update**: Always update `env.validation.ts`, `.env.example`, and pipeline manifests.\n\n",{"name":5,"description":7},"main","def8531e65114c0fca8fb8551c1871ee0eed705c","skills\u002FHoangNguyen0403\u002Fagent-skills-standard\u002Fnestjs-configuration",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":48,"prompt":58,"zipAvailable":59},[49,52,55],{"tool":50,"command":51},"npx","npx skills add ComeOnOliver\u002Fskillshub --skill nestjs-configuration",{"tool":53,"command":54},"bunx","bunx skills add ComeOnOliver\u002Fskillshub --skill nestjs-configuration",{"tool":56,"command":57},"pnpm","pnpm dlx skills add ComeOnOliver\u002Fskillshub --skill nestjs-configuration","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002FHoangNguyen0403\u002Fagent-skills-standard\u002Fnestjs-configuration\u002FSKILL.md",true,[61,67,73,77,83,87,91,95,99,103,107],{"path":62,"resourceType":63,"resourceTypeDesc":64,"sizeBytes":65,"sourceHtmlUrl":66},"forms.md","REFERENCE","参考文档",11854,"https:\u002F\u002Fgithub.com\u002Fa1627418541\u002F-\u002Fblob\u002Fmain\u002F.pi\u002Fskills\u002Fpdf\u002Fforms.md",{"path":68,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":71,"sourceHtmlUrl":72},"LICENSE.txt","LICENSE","许可证",1467,"https:\u002F\u002Fgithub.com\u002Fa1627418541\u002F-\u002Fblob\u002Fmain\u002F.pi\u002Fskills\u002Fpdf\u002FLICENSE.txt",{"path":74,"resourceType":63,"resourceTypeDesc":64,"sizeBytes":75,"sourceHtmlUrl":76},"reference.md",16692,"https:\u002F\u002Fgithub.com\u002Fa1627418541\u002F-\u002Fblob\u002Fmain\u002F.pi\u002Fskills\u002Fpdf\u002Freference.md",{"path":78,"resourceType":79,"resourceTypeDesc":80,"sizeBytes":81,"sourceHtmlUrl":82},"scripts\u002Fcheck_bounding_boxes.py","SCRIPT","脚本",2774,"https:\u002F\u002Fgithub.com\u002Fa1627418541\u002F-\u002Fblob\u002Fmain\u002F.pi\u002Fskills\u002Fpdf\u002Fscripts\u002Fcheck_bounding_boxes.py",{"path":84,"resourceType":79,"resourceTypeDesc":80,"sizeBytes":85,"sourceHtmlUrl":86},"scripts\u002Fcheck_fillable_fields.py",268,"https:\u002F\u002Fgithub.com\u002Fa1627418541\u002F-\u002Fblob\u002Fmain\u002F.pi\u002Fskills\u002Fpdf\u002Fscripts\u002Fcheck_fillable_fields.py",{"path":88,"resourceType":79,"resourceTypeDesc":80,"sizeBytes":89,"sourceHtmlUrl":90},"scripts\u002Fconvert_pdf_to_images.py",1008,"https:\u002F\u002Fgithub.com\u002Fa1627418541\u002F-\u002Fblob\u002Fmain\u002F.pi\u002Fskills\u002Fpdf\u002Fscripts\u002Fconvert_pdf_to_images.py",{"path":92,"resourceType":79,"resourceTypeDesc":80,"sizeBytes":93,"sourceHtmlUrl":94},"scripts\u002Fcreate_validation_image.py",1258,"https:\u002F\u002Fgithub.com\u002Fa1627418541\u002F-\u002Fblob\u002Fmain\u002F.pi\u002Fskills\u002Fpdf\u002Fscripts\u002Fcreate_validation_image.py",{"path":96,"resourceType":79,"resourceTypeDesc":80,"sizeBytes":97,"sourceHtmlUrl":98},"scripts\u002Fextract_form_field_info.py",4300,"https:\u002F\u002Fgithub.com\u002Fa1627418541\u002F-\u002Fblob\u002Fmain\u002F.pi\u002Fskills\u002Fpdf\u002Fscripts\u002Fextract_form_field_info.py",{"path":100,"resourceType":79,"resourceTypeDesc":80,"sizeBytes":101,"sourceHtmlUrl":102},"scripts\u002Fextract_form_structure.py",3945,"https:\u002F\u002Fgithub.com\u002Fa1627418541\u002F-\u002Fblob\u002Fmain\u002F.pi\u002Fskills\u002Fpdf\u002Fscripts\u002Fextract_form_structure.py",{"path":104,"resourceType":79,"resourceTypeDesc":80,"sizeBytes":105,"sourceHtmlUrl":106},"scripts\u002Ffill_fillable_fields.py",3819,"https:\u002F\u002Fgithub.com\u002Fa1627418541\u002F-\u002Fblob\u002Fmain\u002F.pi\u002Fskills\u002Fpdf\u002Fscripts\u002Ffill_fillable_fields.py",{"path":108,"resourceType":79,"resourceTypeDesc":80,"sizeBytes":109,"sourceHtmlUrl":110},"scripts\u002Ffill_pdf_form_with_annotations.py",3235,"https:\u002F\u002Fgithub.com\u002Fa1627418541\u002F-\u002Fblob\u002Fmain\u002F.pi\u002Fskills\u002Fpdf\u002Fscripts\u002Ffill_pdf_form_with_annotations.py",[112,126,136,145,151,158],{"skillNo":113,"name":114,"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":115,"categories":116,"keywords":122,"publishedAt":33},"01M6FKJN13GMG4KY57J3QD8GY5","model-hierarchy-skill","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzscole\u002Fmodel-hierarchy-skill\u002Fmodel-hierarchy-skill\u002FSKILL.md",[117],{"categoryNo":118,"categoryName":119,"taxonomyType":120,"taxonomyTypeDesc":121},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[123,124,125],"model","model hierarchy","model hierarchy skill",{"skillNo":127,"name":128,"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":129,"categories":130,"keywords":132,"publishedAt":33},"01M6FKJJJ6GCAMR4PPPRD12M5X","zoom-mcp","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-mcp\u002FSKILL.md",[131],{"categoryNo":118,"categoryName":119,"taxonomyType":120,"taxonomyTypeDesc":121},[133,134,135],"MCP","zoom","zoom mcp",{"skillNo":137,"name":138,"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":139,"categories":140,"keywords":141,"publishedAt":33},"01M6FKJE3KYT3KPEZMEEHYKA6K","zoom-apps-sdk","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-apps-sdk\u002FSKILL.md",[],[142,143,144,134],"sdk","zoom apps sdk","apps",{"skillNo":146,"name":147,"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":148,"categories":149,"keywords":150,"publishedAt":33},"01M6FKJ9EDH9Q5VWDF8HAJRSP0","windows","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwindows\u002FSKILL.md",[],[147],{"skillNo":152,"name":153,"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":154,"categories":155,"keywords":157,"publishedAt":33},"01M6FKJ666BEEFC3AE9GJ72Q93","whiteboard","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwhiteboard\u002FSKILL.md",[156],{"categoryNo":118,"categoryName":119,"taxonomyType":120,"taxonomyTypeDesc":121},[153],{"skillNo":159,"name":160,"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":161,"categories":162,"keywords":163,"publishedAt":33},"01M6FKJ21WFCDGTJQ2Q91T9DVW","websockets","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwebsockets\u002FSKILL.md",[],[160]]