[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6J5ANCGCES95X8A91VEASSC":3,"skill-same:01M6J5ANCGCES95X8A91VEASSC":74},{"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":36,"linkOnly":37,"markdownContent":38,"markdownBody":39,"frontMatter":40,"refName":41,"commitSha":42,"skillDirectory":43,"forksCount":44,"repositoryHtmlUrl":45,"repositoryHomepageUrl":46,"ownerHtmlUrl":47,"ownerBlogUrl":6,"ownerDescription":48,"updatedAt":49,"install":50,"resources":63},"01M6J5ANCGCES95X8A91VEASSC","mk-typescript",null,"Use when writing TypeScript code, fixing type errors, or configuring strict type safety. Auto-activates on .ts\u002F.tsx files. Covers null handling, utility types, and ESLint.","ngocsangyem\u002FMeowKit","ngocsangyem","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F33769536?v=4","01M6J3FSMJAG9PVQEGRT7AQ9J2","Sang Nguyen","01M6J3FSRTJG0MNP6NV71639RM",16,"MIT","https:\u002F\u002Fgithub.com\u002Fngocsangyem\u002FMeowKit\u002Fblob\u002Fmain\u002Fpackages\u002Fmewkit\u002Fsrc\u002Fmigrate\u002Fmodules\u002Fcursor\u002Froot\u002F.cursor\u002Fskills\u002Fmk-typescript\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35],"typescript","mk typescript","when","writing","errors","writing typescript","types","utility","eslint","type","files","tsx","auto","use","Safety","Type Safety","code","2026-11-10 10:12:30",false,"---\nname: \"mk-typescript\"\ndescription: \"Use when writing TypeScript code, fixing type errors, or configuring strict type safety. Auto-activates on .ts\u002F.tsx files. Covers null handling, utility types, and ESLint.\"\n---\n\n\u003C!-- Improvements over source skills:\n- Split from 361-line monolith to SKILL.md + references\u002F (Phase 1: CLASS A)\n- Framework-agnostic (removed React-specific patterns from frontend-development)\n- Integrated with security-rules.md (no `any` types already enforced)\n- Added workflow phase anchoring (Phase 3 Build)\n-->\n\n# TypeScript Expert\n\nStrict TypeScript patterns for type safety, null handling, and modern best practices.\n\n## When to Use\n\n**Auto-activate on:** `.ts`, `.tsx`, `.js`, `.jsx` files, type errors, ESLint issues, \"fix types\", \"add types\", \"TypeScript help\"\n\n**Explicit:** `the typescript skill [concern]`\n\n**Do NOT invoke for:** Vue-specific patterns (use mk:vue), visual design (use mk:frontend-design)\n\n## Workflow Integration\n\nOperates in **Phase 3 (Build GREEN)**. Output supports the `developer` agent.\n\n## Process\n\n1. **Detect concern** — type error? new code? refactor? ESLint config?\n2. **Load relevant reference** — strict-null, type-safety, utility-types, or eslint\n3. **Apply patterns** — implement using strict TS patterns from references\n4. **Verify** — `npx tsc --noEmit` must pass with zero errors\n\n## Core Rules (always apply)\n\n- **NEVER** use `any` — use `unknown` + type guards (security-rules.md)\n- **NEVER** use `type assertion` — use `unknown` + type guards (security-rules.md)\n- **NEVER** use implicit truthiness for null checks — use explicit `=== null || === undefined`\n- **ALWAYS** use strict TypeScript config: `strict: true`, `noUncheckedIndexedAccess: true`\n- **ALWAYS** use `type` imports: `import type { X } from 'y'`\n- **PREFER** named exports over default exports\n- **PREFER** discriminated unions over type assertions\n\n## Anti-Patterns\n\n| Don't                         | Do Instead                                   |\n| ----------------------------- | -------------------------------------------- |\n| `as any` or `as unknown as X` | Proper type narrowing with guards            |\n| `if (value)` for null check   | `if (value !== null && value !== undefined)` |\n| `export default`              | `export const X` \u002F `export function X`       |\n| `Object` type                 | `Record\u003Cstring, unknown>`                    |\n| Implicit return types         | Explicit return type annotations             |\n| `enum` (runtime overhead)     | `as const` satisfies or union types          |\n\n## Output Format\n\n```\n## TypeScript: {concern}\n\n**Files:** {list of .ts\u002F.tsx files modified}\n**Config:** {tsconfig changes if any}\n\n### Changes Applied\n{numbered list of type improvements}\n\n### Verification\n{tsc --noEmit output — must show 0 errors}\n```\n\n## References\n\n| Reference                                                 | When to load     | Content                                                         |\n| --------------------------------------------------------- | ---------------- | --------------------------------------------------------------- |\n| **[strict-patterns.md](.\u002Freferences\u002Fstrict-patterns.md)** | Type safety work | Null handling, discriminated unions, type guards, utility types |\n| **[review-checklist.md](.\u002Freferences\u002Freview-checklist.md)** | When reviewing TypeScript code | Prioritized checklist: CRITICAL (security), HIGH (type safety, async, errors), MEDIUM (React, perf) |\n\n## Failure Handling\n\n| Failure                            | Recovery                                                   |\n| ---------------------------------- | ---------------------------------------------------------- |\n| `tsc --noEmit` fails after changes | Fix errors before proceeding — never ship with type errors |\n| No tsconfig.json found             | Suggest creating one with strict config                    |\n| Third-party types missing          | `npm install @types\u002F{package}`                             |\n\n## Gotchas\n\n- **`as` cast silences narrowing errors and hides real bugs** — `value as User` tells TS to trust you, not validate; a malformed API response passes the cast and crashes at runtime; use a type guard or Zod parse at the boundary instead.\n- **`moduleResolution: \"bundler\"` breaks `import type` in non-bundler contexts** — tsconfig `moduleResolution: bundler` (Vite\u002Fesbuild default) allows extensionless imports that Node.js `--esm` rejects at runtime; flip to `nodenext` for backend code or keep dual configs per target.\n- **`noUncheckedIndexedAccess: true` makes every array index `T | undefined`** — enabling this flag (required by strict config) means `arr[0]` is `string | undefined` not `string`; code that was type-correct before will error until every indexed access is null-guarded.\n- **Declaration merging in ambient `.d.ts` files silently adds properties to global types** — a `declare module 'express'` block in any `.d.ts` in the project augments Express's types globally; two libraries doing this with conflicting shapes cause TS2300 duplicate identifier errors that appear far from the source.\n- **Template literal types create unique brands that break assignability** — `type UserId = \\`user_\\${string}\\`` is not assignable from `string`; passing a plain `string` where `UserId` is expected fails even though values look identical at runtime; always brand at the input boundary with a parse function.\n- **`enum` generates runtime JS objects, causing tree-shaking failures** — enums are not erased; a `const enum` inside a library published as `.js` is inlined at compile time but not consumable by projects that don't re-compile the source; use `as const` satisfies patterns for exported enums.","\u003C!-- Improvements over source skills:\n- Split from 361-line monolith to SKILL.md + references\u002F (Phase 1: CLASS A)\n- Framework-agnostic (removed React-specific patterns from frontend-development)\n- Integrated with security-rules.md (no `any` types already enforced)\n- Added workflow phase anchoring (Phase 3 Build)\n-->\n\n# TypeScript Expert\n\nStrict TypeScript patterns for type safety, null handling, and modern best practices.\n\n## When to Use\n\n**Auto-activate on:** `.ts`, `.tsx`, `.js`, `.jsx` files, type errors, ESLint issues, \"fix types\", \"add types\", \"TypeScript help\"\n\n**Explicit:** `the typescript skill [concern]`\n\n**Do NOT invoke for:** Vue-specific patterns (use mk:vue), visual design (use mk:frontend-design)\n\n## Workflow Integration\n\nOperates in **Phase 3 (Build GREEN)**. Output supports the `developer` agent.\n\n## Process\n\n1. **Detect concern** — type error? new code? refactor? ESLint config?\n2. **Load relevant reference** — strict-null, type-safety, utility-types, or eslint\n3. **Apply patterns** — implement using strict TS patterns from references\n4. **Verify** — `npx tsc --noEmit` must pass with zero errors\n\n## Core Rules (always apply)\n\n- **NEVER** use `any` — use `unknown` + type guards (security-rules.md)\n- **NEVER** use `type assertion` — use `unknown` + type guards (security-rules.md)\n- **NEVER** use implicit truthiness for null checks — use explicit `=== null || === undefined`\n- **ALWAYS** use strict TypeScript config: `strict: true`, `noUncheckedIndexedAccess: true`\n- **ALWAYS** use `type` imports: `import type { X } from 'y'`\n- **PREFER** named exports over default exports\n- **PREFER** discriminated unions over type assertions\n\n## Anti-Patterns\n\n| Don't                         | Do Instead                                   |\n| ----------------------------- | -------------------------------------------- |\n| `as any` or `as unknown as X` | Proper type narrowing with guards            |\n| `if (value)` for null check   | `if (value !== null && value !== undefined)` |\n| `export default`              | `export const X` \u002F `export function X`       |\n| `Object` type                 | `Record\u003Cstring, unknown>`                    |\n| Implicit return types         | Explicit return type annotations             |\n| `enum` (runtime overhead)     | `as const` satisfies or union types          |\n\n## Output Format\n\n```\n## TypeScript: {concern}\n\n**Files:** {list of .ts\u002F.tsx files modified}\n**Config:** {tsconfig changes if any}\n\n### Changes Applied\n{numbered list of type improvements}\n\n### Verification\n{tsc --noEmit output — must show 0 errors}\n```\n\n## References\n\n| Reference                                                 | When to load     | Content                                                         |\n| --------------------------------------------------------- | ---------------- | --------------------------------------------------------------- |\n| **[strict-patterns.md](.\u002Freferences\u002Fstrict-patterns.md)** | Type safety work | Null handling, discriminated unions, type guards, utility types |\n| **[review-checklist.md](.\u002Freferences\u002Freview-checklist.md)** | When reviewing TypeScript code | Prioritized checklist: CRITICAL (security), HIGH (type safety, async, errors), MEDIUM (React, perf) |\n\n## Failure Handling\n\n| Failure                            | Recovery                                                   |\n| ---------------------------------- | ---------------------------------------------------------- |\n| `tsc --noEmit` fails after changes | Fix errors before proceeding — never ship with type errors |\n| No tsconfig.json found             | Suggest creating one with strict config                    |\n| Third-party types missing          | `npm install @types\u002F{package}`                             |\n\n## Gotchas\n\n- **`as` cast silences narrowing errors and hides real bugs** — `value as User` tells TS to trust you, not validate; a malformed API response passes the cast and crashes at runtime; use a type guard or Zod parse at the boundary instead.\n- **`moduleResolution: \"bundler\"` breaks `import type` in non-bundler contexts** — tsconfig `moduleResolution: bundler` (Vite\u002Fesbuild default) allows extensionless imports that Node.js `--esm` rejects at runtime; flip to `nodenext` for backend code or keep dual configs per target.\n- **`noUncheckedIndexedAccess: true` makes every array index `T | undefined`** — enabling this flag (required by strict config) means `arr[0]` is `string | undefined` not `string`; code that was type-correct before will error until every indexed access is null-guarded.\n- **Declaration merging in ambient `.d.ts` files silently adds properties to global types** — a `declare module 'express'` block in any `.d.ts` in the project augments Express's types globally; two libraries doing this with conflicting shapes cause TS2300 duplicate identifier errors that appear far from the source.\n- **Template literal types create unique brands that break assignability** — `type UserId = \\`user_\\${string}\\`` is not assignable from `string`; passing a plain `string` where `UserId` is expected fails even though values look identical at runtime; always brand at the input boundary with a parse function.\n- **`enum` generates runtime JS objects, causing tree-shaking failures** — enums are not erased; a `const enum` inside a library published as `.js` is inlined at compile time but not consumable by projects that don't re-compile the source; use `as const` satisfies patterns for exported enums.",{"name":5,"description":7},"main","0b5569142101a45a6dc48d1b01bfae8801383fb7","packages\u002Fmewkit\u002Fsrc\u002Fmigrate\u002Fmodules\u002Fcursor\u002Froot\u002F.cursor\u002Fskills\u002Fmk-typescript",3,"https:\u002F\u002Fgithub.com\u002Fngocsangyem\u002FMeowKit","https:\u002F\u002Fdocs.meowkit.dev\u002F","https:\u002F\u002Fgithub.com\u002Fngocsangyem","Keep moving forward","2026-11-11 08:46:37",{"source":8,"skillName":5,"commands":51,"prompt":61,"zipAvailable":62},[52,55,58],{"tool":53,"command":54},"npx","npx skills add ngocsangyem\u002FMeowKit --skill mk-typescript",{"tool":56,"command":57},"bunx","bunx skills add ngocsangyem\u002FMeowKit --skill mk-typescript",{"tool":59,"command":60},"pnpm","pnpm dlx skills add ngocsangyem\u002FMeowKit --skill mk-typescript","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fngocsangyem\u002FMeowKit\u002Fblob\u002Fmain\u002Fpackages\u002Fmewkit\u002Fsrc\u002Fmigrate\u002Fmodules\u002Fcursor\u002Froot\u002F.cursor\u002Fskills\u002Fmk-typescript\u002FSKILL.md",true,[64,70],{"path":65,"resourceType":66,"resourceTypeDesc":67,"sizeBytes":68,"sourceHtmlUrl":69},"references\u002Freview-checklist.md","REFERENCE","参考文档",3452,"https:\u002F\u002Fgithub.com\u002Fngocsangyem\u002FMeowKit\u002Fblob\u002Fmain\u002Fpackages\u002Fmewkit\u002Fsrc\u002Fmigrate\u002Fmodules\u002Fcursor\u002Froot\u002F.cursor\u002Fskills\u002Fmk-typescript\u002Freferences\u002Freview-checklist.md",{"path":71,"resourceType":66,"resourceTypeDesc":67,"sizeBytes":72,"sourceHtmlUrl":73},"references\u002Fstrict-patterns.md",3132,"https:\u002F\u002Fgithub.com\u002Fngocsangyem\u002FMeowKit\u002Fblob\u002Fmain\u002Fpackages\u002Fmewkit\u002Fsrc\u002Fmigrate\u002Fmodules\u002Fcursor\u002Froot\u002F.cursor\u002Fskills\u002Fmk-typescript\u002Freferences\u002Fstrict-patterns.md",[75,94,112,118,130,154],{"skillNo":76,"name":77,"nameZh":6,"description":78,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":79,"categories":80,"keywords":81,"publishedAt":36},"01M6J4NFDY0KY3XXJ6E5WBASAF","mk-sequential-thinking","Structured step-by-step reasoning before acting, to avoid guessing. For complex debugging, multi-step analysis, hypothesis checks. NOT for being stuck on approach (mk:problem-solving).","https:\u002F\u002Fgithub.com\u002Fngocsangyem\u002FMeowKit\u002Fblob\u002Fmain\u002Fpackages\u002Fmewkit\u002Fsrc\u002Fmigrate\u002Fmodules\u002Fcodex\u002Froot\u002F.agents\u002Fskills\u002Fmk-sequential-thinking\u002FSKILL.md",[],[82,83,84,85,86,87,88,89,90,91,92,93],"mk sequential thinking","sequential thinking","thinking","structured","problem","problem-solving","analysis","hypothesis","reasoning","for","debugging","multi",{"skillNo":95,"name":96,"nameZh":6,"description":97,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":98,"categories":99,"keywords":105,"publishedAt":36},"01M6J5D3G7C0V3BZ97Y61WB172","mk:fixture-valid","A valid fixture used to verify the skill structure validator.","https:\u002F\u002Fgithub.com\u002Fngocsangyem\u002FMeowKit\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fskill-creator\u002Fvalid\u002FSKILL.md",[100],{"categoryNo":101,"categoryName":102,"taxonomyType":103,"taxonomyTypeDesc":104},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[106,107,108,109,110,111],"mk:fixture valid","fixture","valid","verify","structure","validator",{"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":117,"publishedAt":36},"01M6J5CZRVSN8T4BZM0Y42CXJY","invalid","https:\u002F\u002Fgithub.com\u002Fngocsangyem\u002FMeowKit\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fskill-creator\u002Finvalid\u002FSKILL.md",[],[114],{"skillNo":119,"name":120,"nameZh":6,"description":121,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":122,"categories":123,"keywords":125,"publishedAt":36},"01M6J5CVN0N8KP9JFAWCV2PC2T","mk:sample-skill","Sample skill for fixture purposes — small enough to land below noise floor.","https:\u002F\u002Fgithub.com\u002Fngocsangyem\u002FMeowKit\u002Fblob\u002Fmain\u002Fpackages\u002Fmewkit\u002Ftests\u002Ffixtures\u002Fcontext-audit\u002F.claude\u002Fskills\u002Fsample-skill\u002FSKILL.md",[124],{"categoryNo":101,"categoryName":102,"taxonomyType":103,"taxonomyTypeDesc":104},[126,127,128,129,107,91],"mk:sample skill","sample","sample skill","land",{"skillNo":131,"name":132,"nameZh":6,"description":133,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":134,"categories":135,"keywords":137,"publishedAt":36},"01M6J5CP99X9S0B7XCSBX6H5P2","mk-worktree","Manages git worktrees for parallel agent isolation: creates parallel\u002F{name}-{timestamp} branches, merges with conflict detection. NOT for user feature branches (use git worktree directly).","https:\u002F\u002Fgithub.com\u002Fngocsangyem\u002FMeowKit\u002Fblob\u002Fmain\u002Fpackages\u002Fmewkit\u002Fsrc\u002Fmigrate\u002Fmodules\u002Fcursor\u002Froot\u002F.cursor\u002Fskills\u002Fmk-worktree\u002FSKILL.md",[136],{"categoryNo":101,"categoryName":102,"taxonomyType":103,"taxonomyTypeDesc":104},[138,139,140,141,32,142,143,144,145,146,147,148,91,149,150,151,152,153],"mk worktree","worktree","user","git worktrees","worktrees","branches","conflict","feature","isolation","name","with","parallel","timestamp","git","detection","git worktree",{"skillNo":155,"name":156,"nameZh":6,"description":157,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":158,"categories":159,"keywords":161,"publishedAt":36},"01M6J5CJT8ZGXH9YYJ7GV3R2B4","mk-workflow-orchestrator","Auto-invoked 7-phase workflow for complex-feature intent; fasttrack mode for pre-approved specs. NOT for explicit single tasks (mk:cook), green-field builds (mk:autobuild), or simple fixes (mk:fix).","https:\u002F\u002Fgithub.com\u002Fngocsangyem\u002FMeowKit\u002Fblob\u002Fmain\u002Fpackages\u002Fmewkit\u002Fsrc\u002Fmigrate\u002Fmodules\u002Fcursor\u002Froot\u002F.cursor\u002Fskills\u002Fmk-workflow-orchestrator\u002FSKILL.md",[160],{"categoryNo":101,"categoryName":102,"taxonomyType":103,"taxonomyTypeDesc":104},[162,163,164,165,166,167,168,31,169,170,171,145,172,173,91,174,175,176,177,178,179,180],"mk workflow orchestrator","workflow orchestrator","orchestrator","workflow","green-field","tasks","fix","simple","intent","green","autobuild","mode","fixes","mk:autobuild","mk:cook","mk:fix","fasttrack","complex-feature","phase"]