[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6EBXX4PHBWM10S8PX5Y2NMS":3,"skill-same:01M6EBXX4PHBWM10S8PX5Y2NMS":150},{"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":38,"linkOnly":39,"markdownContent":40,"markdownBody":41,"frontMatter":42,"refName":43,"commitSha":44,"skillDirectory":45,"forksCount":46,"repositoryHtmlUrl":47,"repositoryHomepageUrl":48,"ownerHtmlUrl":49,"ownerBlogUrl":6,"ownerDescription":50,"updatedAt":51,"install":52,"resources":65},"01M6EBXX4PHBWM10S8PX5Y2NMS","typescript-tooling",null,"Development tools, linting, and build config for TypeScript. Use when configuring ESLint, Prettier, Jest, Vitest, tsconfig, or any TS build tooling. (triggers: tsconfig.json, .eslintrc.*, jest.config.*, package.json, eslint, prettier, jest, vitest, build, compile, lint)","ComeOnOliver\u002Fskillshub","ComeOnOliver","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F43215937?v=4","01M6E5JNFECJAAVFE0W7SMWWD2","Haoran Shu","01M6E5JNNDQS7AJZDYFQ8TPZCK",67,"MIT","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002FHoangNguyen0403\u002Fagent-skills-standard\u002Ftypescript-tooling\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37],"TypeScript Tooling","tooling","typescript","json","linting","eslint","triggers","jest","prettier","build","use","vitest","Tools","package","compile","development tools","lint","development","config","2026-11-10 10:12:30",false,"---\nname: typescript-tooling\ndescription: 'Development tools, linting, and build config for TypeScript. Use when configuring ESLint, Prettier, Jest, Vitest, tsconfig, or any TS build tooling. (triggers: tsconfig.json, .eslintrc.*, jest.config.*, package.json, eslint, prettier, jest, vitest, build, compile, lint)'\n---\n\n# TypeScript Tooling\n\n## **Priority: P1 (OPERATIONAL)**\n\nEssential tooling for TypeScript development and maintenance.\n\n## Implementation Guidelines\n\n- **Compiler**: Use **`tsc`** for CI builds; **`esbuild`** or **`ts-node`** for development.\n- **Linting**: Enforce **`ESLint`** with **`@typescript-eslint\u002Frecommended`**. Enable **`strict type checking`**.\n- **Formatting**: Mandate **`Prettier`** via **`lint-staged`** and **`.prettierrc`**.\n- **Testing**: Use **`Vitest`** (or **`Jest`**) for unit\u002Fintegration testing. Target **`> 80%`** line coverage.\n- **Builds**: Use **`tsup`** (for library bundling) or **`Vite`** (for web applications).\n- **TypeScript Config**: Ensure **`tsconfig.json`** has **`strict: true`**, **`noImplicitAny: true`**, and **`esModuleInterop: true`**.\n- **CI\u002FCD**: Always run **`tsc --noEmit`** explicitly in the build pipeline to catch type errors.\n- **Error Supression**: Favor **`@ts-expect-error`** over `@ts-ignore` for documented edge-cases.\n\n## ESLint Configuration\n\n### Strict Mode Requirement\n\n**CRITICAL**: Every file in the project, including tests (`.spec.ts`), must adhere to strict type-checked rules. NEVER turn off `@typescript-eslint\u002Fno-explicit-any` or `no-unsafe-*` rules.\n\n### Common Linting Issues & Solutions\n\n#### Request Object Typing\n\n**Problem**: Using `any` for Express request objects or creating duplicate inline interfaces.\n**Solution**: Use the centralized interfaces in `src\u002Fcommon\u002Finterfaces\u002Frequest.interface.ts`.\n\n```typescript\nimport { RequestWithUser } from 'src\u002Fcommon\u002Finterfaces\u002Frequest.interface';\n```\n\n#### Unused Parameters\n\n**Problem**: Function parameters marked as unused by linter.\n**Solution**: Prefix the parameter with an underscore (e.g., `_data`) or remove it. NEVER use `eslint-disable`.\n\n#### Test Mock Typing\n\n**Problem**: Jest mocks triggering unsafe type warnings when `expect.any()` or custom mocks are used.\n**Solution**: Cast the mock or expectation using `as unknown as TargetType`.\n\n```typescript\nmockRepo.save.mockResolvedValue(result as unknown as User);\n```\n\n## Configuration\n\n```json\n\u002F\u002F tsconfig.json\n{\n  \"compilerOptions\": {\n    \"strict\": true,\n    \"noImplicitReturns\": true,\n    \"noUnusedLocals\": true\n  }\n}\n```\n\n## Verification Workflow (Mandatory)\n\nAfter editing any `.ts` \u002F `.tsx` file:\n\n1. Call `getDiagnostics` (typescript-lsp MCP tool) — surfaces type errors in real time.\n2. Run `tsc --noEmit` in CI — catches project-wide errors LSP may miss.\n3. Run `eslint --fix` — auto-fix formatting and lint violations.\n\n`getDiagnostics` is the fastest feedback loop. Use it before every commit on modified files.\n\n**LSP Exploration**: Use `getHover` to inspect inferred types inline. Use `getReferences` before renaming any symbol to verify all call sites.\n\n## References\n\nSee [references\u002FREFERENCE.md](references\u002FREFERENCE.md) for CI config, test setup, and advanced ESLint rules.\n\n","# TypeScript Tooling\n\n## **Priority: P1 (OPERATIONAL)**\n\nEssential tooling for TypeScript development and maintenance.\n\n## Implementation Guidelines\n\n- **Compiler**: Use **`tsc`** for CI builds; **`esbuild`** or **`ts-node`** for development.\n- **Linting**: Enforce **`ESLint`** with **`@typescript-eslint\u002Frecommended`**. Enable **`strict type checking`**.\n- **Formatting**: Mandate **`Prettier`** via **`lint-staged`** and **`.prettierrc`**.\n- **Testing**: Use **`Vitest`** (or **`Jest`**) for unit\u002Fintegration testing. Target **`> 80%`** line coverage.\n- **Builds**: Use **`tsup`** (for library bundling) or **`Vite`** (for web applications).\n- **TypeScript Config**: Ensure **`tsconfig.json`** has **`strict: true`**, **`noImplicitAny: true`**, and **`esModuleInterop: true`**.\n- **CI\u002FCD**: Always run **`tsc --noEmit`** explicitly in the build pipeline to catch type errors.\n- **Error Supression**: Favor **`@ts-expect-error`** over `@ts-ignore` for documented edge-cases.\n\n## ESLint Configuration\n\n### Strict Mode Requirement\n\n**CRITICAL**: Every file in the project, including tests (`.spec.ts`), must adhere to strict type-checked rules. NEVER turn off `@typescript-eslint\u002Fno-explicit-any` or `no-unsafe-*` rules.\n\n### Common Linting Issues & Solutions\n\n#### Request Object Typing\n\n**Problem**: Using `any` for Express request objects or creating duplicate inline interfaces.\n**Solution**: Use the centralized interfaces in `src\u002Fcommon\u002Finterfaces\u002Frequest.interface.ts`.\n\n```typescript\nimport { RequestWithUser } from 'src\u002Fcommon\u002Finterfaces\u002Frequest.interface';\n```\n\n#### Unused Parameters\n\n**Problem**: Function parameters marked as unused by linter.\n**Solution**: Prefix the parameter with an underscore (e.g., `_data`) or remove it. NEVER use `eslint-disable`.\n\n#### Test Mock Typing\n\n**Problem**: Jest mocks triggering unsafe type warnings when `expect.any()` or custom mocks are used.\n**Solution**: Cast the mock or expectation using `as unknown as TargetType`.\n\n```typescript\nmockRepo.save.mockResolvedValue(result as unknown as User);\n```\n\n## Configuration\n\n```json\n\u002F\u002F tsconfig.json\n{\n  \"compilerOptions\": {\n    \"strict\": true,\n    \"noImplicitReturns\": true,\n    \"noUnusedLocals\": true\n  }\n}\n```\n\n## Verification Workflow (Mandatory)\n\nAfter editing any `.ts` \u002F `.tsx` file:\n\n1. Call `getDiagnostics` (typescript-lsp MCP tool) — surfaces type errors in real time.\n2. Run `tsc --noEmit` in CI — catches project-wide errors LSP may miss.\n3. Run `eslint --fix` — auto-fix formatting and lint violations.\n\n`getDiagnostics` is the fastest feedback loop. Use it before every commit on modified files.\n\n**LSP Exploration**: Use `getHover` to inspect inferred types inline. Use `getReferences` before renaming any symbol to verify all call sites.\n\n## References\n\nSee [references\u002FREFERENCE.md](references\u002FREFERENCE.md) for CI config, test setup, and advanced ESLint rules.\n\n",{"name":5,"description":7},"main","def8531e65114c0fca8fb8551c1871ee0eed705c","skills\u002FHoangNguyen0403\u002Fagent-skills-standard\u002Ftypescript-tooling",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":53,"prompt":63,"zipAvailable":64},[54,57,60],{"tool":55,"command":56},"npx","npx skills add ComeOnOliver\u002Fskillshub --skill typescript-tooling",{"tool":58,"command":59},"bunx","bunx skills add ComeOnOliver\u002Fskillshub --skill typescript-tooling",{"tool":61,"command":62},"pnpm","pnpm dlx skills add ComeOnOliver\u002Fskillshub --skill typescript-tooling","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002FHoangNguyen0403\u002Fagent-skills-standard\u002Ftypescript-tooling\u002FSKILL.md",true,[66,72,78,82,86,90,94,98,102,106,110,114,118,122,126,130,134,138,142,146],{"path":67,"resourceType":68,"resourceTypeDesc":69,"sizeBytes":70,"sourceHtmlUrl":71},"data\u002Fdomain-complexity.csv","ASSET","资产文件",7324,"https:\u002F\u002Fgithub.com\u002FdevelopAgent\u002Fbmad-start\u002Fblob\u002Fmain\u002F.kilocode\u002Fskills\u002Fbmad-create-prd\u002Fdata\u002Fdomain-complexity.csv",{"path":73,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":76,"sourceHtmlUrl":77},"data\u002Fprd-purpose.md","REFERENCE","参考文档",7246,"https:\u002F\u002Fgithub.com\u002FdevelopAgent\u002Fbmad-start\u002Fblob\u002Fmain\u002F.kilocode\u002Fskills\u002Fbmad-create-prd\u002Fdata\u002Fprd-purpose.md",{"path":79,"resourceType":68,"resourceTypeDesc":69,"sizeBytes":80,"sourceHtmlUrl":81},"data\u002Fproject-types.csv",3144,"https:\u002F\u002Fgithub.com\u002FdevelopAgent\u002Fbmad-start\u002Fblob\u002Fmain\u002F.kilocode\u002Fskills\u002Fbmad-create-prd\u002Fdata\u002Fproject-types.csv",{"path":83,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":84,"sourceHtmlUrl":85},"steps-c\u002Fstep-01-init.md",7785,"https:\u002F\u002Fgithub.com\u002FdevelopAgent\u002Fbmad-start\u002Fblob\u002Fmain\u002F.kilocode\u002Fskills\u002Fbmad-create-prd\u002Fsteps-c\u002Fstep-01-init.md",{"path":87,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":88,"sourceHtmlUrl":89},"steps-c\u002Fstep-01b-continue.md",5751,"https:\u002F\u002Fgithub.com\u002FdevelopAgent\u002Fbmad-start\u002Fblob\u002Fmain\u002F.kilocode\u002Fskills\u002Fbmad-create-prd\u002Fsteps-c\u002Fstep-01b-continue.md",{"path":91,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":92,"sourceHtmlUrl":93},"steps-c\u002Fstep-02-discovery.md",8096,"https:\u002F\u002Fgithub.com\u002FdevelopAgent\u002Fbmad-start\u002Fblob\u002Fmain\u002F.kilocode\u002Fskills\u002Fbmad-create-prd\u002Fsteps-c\u002Fstep-02-discovery.md",{"path":95,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":96,"sourceHtmlUrl":97},"steps-c\u002Fstep-02b-vision.md",6775,"https:\u002F\u002Fgithub.com\u002FdevelopAgent\u002Fbmad-start\u002Fblob\u002Fmain\u002F.kilocode\u002Fskills\u002Fbmad-create-prd\u002Fsteps-c\u002Fstep-02b-vision.md",{"path":99,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":100,"sourceHtmlUrl":101},"steps-c\u002Fstep-02c-executive-summary.md",7250,"https:\u002F\u002Fgithub.com\u002FdevelopAgent\u002Fbmad-start\u002Fblob\u002Fmain\u002F.kilocode\u002Fskills\u002Fbmad-create-prd\u002Fsteps-c\u002Fstep-02c-executive-summary.md",{"path":103,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":104,"sourceHtmlUrl":105},"steps-c\u002Fstep-03-success.md",9189,"https:\u002F\u002Fgithub.com\u002FdevelopAgent\u002Fbmad-start\u002Fblob\u002Fmain\u002F.kilocode\u002Fskills\u002Fbmad-create-prd\u002Fsteps-c\u002Fstep-03-success.md",{"path":107,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":108,"sourceHtmlUrl":109},"steps-c\u002Fstep-04-journeys.md",9040,"https:\u002F\u002Fgithub.com\u002FdevelopAgent\u002Fbmad-start\u002Fblob\u002Fmain\u002F.kilocode\u002Fskills\u002Fbmad-create-prd\u002Fsteps-c\u002Fstep-04-journeys.md",{"path":111,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":112,"sourceHtmlUrl":113},"steps-c\u002Fstep-05-domain.md",6919,"https:\u002F\u002Fgithub.com\u002FdevelopAgent\u002Fbmad-start\u002Fblob\u002Fmain\u002F.kilocode\u002Fskills\u002Fbmad-create-prd\u002Fsteps-c\u002Fstep-05-domain.md",{"path":115,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":116,"sourceHtmlUrl":117},"steps-c\u002Fstep-06-innovation.md",8680,"https:\u002F\u002Fgithub.com\u002FdevelopAgent\u002Fbmad-start\u002Fblob\u002Fmain\u002F.kilocode\u002Fskills\u002Fbmad-create-prd\u002Fsteps-c\u002Fstep-06-innovation.md",{"path":119,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":120,"sourceHtmlUrl":121},"steps-c\u002Fstep-07-project-type.md",8799,"https:\u002F\u002Fgithub.com\u002FdevelopAgent\u002Fbmad-start\u002Fblob\u002Fmain\u002F.kilocode\u002Fskills\u002Fbmad-create-prd\u002Fsteps-c\u002Fstep-07-project-type.md",{"path":123,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":124,"sourceHtmlUrl":125},"steps-c\u002Fstep-08-scoping.md",7870,"https:\u002F\u002Fgithub.com\u002FdevelopAgent\u002Fbmad-start\u002Fblob\u002Fmain\u002F.kilocode\u002Fskills\u002Fbmad-create-prd\u002Fsteps-c\u002Fstep-08-scoping.md",{"path":127,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":128,"sourceHtmlUrl":129},"steps-c\u002Fstep-09-functional.md",9199,"https:\u002F\u002Fgithub.com\u002FdevelopAgent\u002Fbmad-start\u002Fblob\u002Fmain\u002F.kilocode\u002Fskills\u002Fbmad-create-prd\u002Fsteps-c\u002Fstep-09-functional.md",{"path":131,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":132,"sourceHtmlUrl":133},"steps-c\u002Fstep-10-nonfunctional.md",9000,"https:\u002F\u002Fgithub.com\u002FdevelopAgent\u002Fbmad-start\u002Fblob\u002Fmain\u002F.kilocode\u002Fskills\u002Fbmad-create-prd\u002Fsteps-c\u002Fstep-10-nonfunctional.md",{"path":135,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":136,"sourceHtmlUrl":137},"steps-c\u002Fstep-11-polish.md",9329,"https:\u002F\u002Fgithub.com\u002FdevelopAgent\u002Fbmad-start\u002Fblob\u002Fmain\u002F.kilocode\u002Fskills\u002Fbmad-create-prd\u002Fsteps-c\u002Fstep-11-polish.md",{"path":139,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":140,"sourceHtmlUrl":141},"steps-c\u002Fstep-12-complete.md",4861,"https:\u002F\u002Fgithub.com\u002FdevelopAgent\u002Fbmad-start\u002Fblob\u002Fmain\u002F.kilocode\u002Fskills\u002Fbmad-create-prd\u002Fsteps-c\u002Fstep-12-complete.md",{"path":143,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":144,"sourceHtmlUrl":145},"templates\u002Fprd-template.md",164,"https:\u002F\u002Fgithub.com\u002FdevelopAgent\u002Fbmad-start\u002Fblob\u002Fmain\u002F.kilocode\u002Fskills\u002Fbmad-create-prd\u002Ftemplates\u002Fprd-template.md",{"path":147,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":148,"sourceHtmlUrl":149},"workflow.md",2923,"https:\u002F\u002Fgithub.com\u002FdevelopAgent\u002Fbmad-start\u002Fblob\u002Fmain\u002F.kilocode\u002Fskills\u002Fbmad-create-prd\u002Fworkflow.md",[151,165,175,184,190,197],{"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":161,"publishedAt":38},"01M6FKJN13GMG4KY57J3QD8GY5","model-hierarchy-skill","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzscole\u002Fmodel-hierarchy-skill\u002Fmodel-hierarchy-skill\u002FSKILL.md",[156],{"categoryNo":157,"categoryName":158,"taxonomyType":159,"taxonomyTypeDesc":160},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[162,163,164],"model","model hierarchy","model hierarchy skill",{"skillNo":166,"name":167,"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":168,"categories":169,"keywords":171,"publishedAt":38},"01M6FKJJJ6GCAMR4PPPRD12M5X","zoom-mcp","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-mcp\u002FSKILL.md",[170],{"categoryNo":157,"categoryName":158,"taxonomyType":159,"taxonomyTypeDesc":160},[172,173,174],"MCP","zoom","zoom mcp",{"skillNo":176,"name":177,"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":178,"categories":179,"keywords":180,"publishedAt":38},"01M6FKJE3KYT3KPEZMEEHYKA6K","zoom-apps-sdk","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-apps-sdk\u002FSKILL.md",[],[181,182,183,173],"sdk","zoom apps sdk","apps",{"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":189,"publishedAt":38},"01M6FKJ9EDH9Q5VWDF8HAJRSP0","windows","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwindows\u002FSKILL.md",[],[186],{"skillNo":191,"name":192,"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":193,"categories":194,"keywords":196,"publishedAt":38},"01M6FKJ666BEEFC3AE9GJ72Q93","whiteboard","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwhiteboard\u002FSKILL.md",[195],{"categoryNo":157,"categoryName":158,"taxonomyType":159,"taxonomyTypeDesc":160},[192],{"skillNo":198,"name":199,"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":200,"categories":201,"keywords":202,"publishedAt":38},"01M6FKJ21WFCDGTJQ2Q91T9DVW","websockets","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwebsockets\u002FSKILL.md",[],[199]]