[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6DHY97PDHBPWKBEN57SDW2X":3,"skill-same:01M6DHY97PDHBPWKBEN57SDW2X":365},{"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":44,"linkOnly":45,"markdownContent":46,"markdownBody":47,"frontMatter":48,"refName":67,"commitSha":68,"skillDirectory":69,"forksCount":70,"repositoryHtmlUrl":71,"repositoryHomepageUrl":6,"ownerHtmlUrl":72,"ownerBlogUrl":6,"ownerDescription":73,"updatedAt":74,"install":75,"resources":88},"01M6DHY97PDHBPWKBEN57SDW2X","kotlin-specialist",null,"Use when writing idiomatic Kotlin — coroutines and Flow, KMP, Compose, Ktor, DSLs. Triggers on: \"Kotlin coroutines\", \"코루틴\", \"코틀린으로 전환\", \"Flow 취소 처리\". Not for Spring Java backends or Android XML layouts.","newkayak12\u002Fclaude-skills","newkayak12","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F74722411?v=4","01M6DHQRSHSVM4F2EJACTMC766","Sanghyeon Kim","01M6DHQRX6XQ0XKTD3QB8CGFM9",3,"MIT","https:\u002F\u002Fgithub.com\u002Fnewkayak12\u002Fclaude-skills\u002Fblob\u002Fmain\u002Fdevelop\u002Fskills\u002Fkotlin-specialist\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43],"kotlin specialist","kotlin","convert","triggers","coroutines","async","engineer","compose","use","spring","design","tool","system","sse","java","best practices","code","boot","writing","MCP","2026-11-10 10:12:30",false,"---\nname: kotlin-specialist\ndescription: >-\n  Use when writing idiomatic Kotlin — coroutines and Flow, KMP, Compose, Ktor, DSLs. Triggers on: \"Kotlin coroutines\",\n  \"코루틴\", \"코틀린으로 전환\", \"Flow 취소 처리\". Not for Spring Java backends or Android XML layouts.\nscenarios:\n  - \"Help me write idiomatic Kotlin code using coroutines for async processing\"\n  - \"Convert this Java class to Kotlin and apply Kotlin best practices\"\n  - \"Design a Kotlin DSL for our configuration system\"\n  - \"코틀린으로 코루틴 기반 비동기 처리를 구현해줘\"\n  - \"자바 코드를 코틀린으로 전환하고 관용구를 적용해줘\"\ncompatibility:\n  recommended: []\n  optional:\n    - think-tool\n  remote_mcp_note: >-\n    think-tool이 있으면 코루틴 스코프 설계와 취소 전파 전략을 더 체계적으로 검토합니다.\n    Claude 설정 → MCP Servers에서 remote SSE 엔드포인트를 추가하세요.\nlicense: MIT\nmetadata:\n  version: \"1.1.0\"\n  triggers: Kotlin, coroutines, suspend function, Flow, KMP, Kotlin Multiplatform, Compose, Ktor, Android Kotlin\n  related-skills: test-master, spring-boot-engineer\n  domain: language\n  role: specialist\n  scope: implementation\n  output-format: code\n---\n\n## Standing Mandates\n\n- NEVER call code idiomatic, null-safe or cancellation-safe by reading it. A cancellation bug shows only when a scope\n  is cancelled mid-flight, so run `detekt`, `ktlint` and a `runTest` that cancels the scope, and quote the results. A\n  tool you could not run is written `not run: \u003Ctool>`.\n- NEVER launch from `GlobalScope` or keep a scope alive past its owner: the coroutine outlives the screen or request\n  that started it and its failures reach nobody.\n- NEVER swallow `CancellationException` (a bare `catch (e: Exception)` around a suspend call does): the cancelled\n  coroutine keeps running. Rethrow it.\n- NEVER write `!!` without a comment stating the contract, and NEVER call `runBlocking` outside `main` and tests: the\n  first turns a type-checked null into a runtime crash, the second blocks a thread the dispatcher needs.\n- Missing facts (target platforms, Kotlin and coroutines versions, shared-code boundary) are read from the build files\n  first; what stays unknown is written `[확인 필요: ○○]`, never assumed.\n- Goal: the change passes `detekt` and `ktlint`, every scope it opens has a cancellation test, and the closing tally\n  recounts to a grep of the touched files.\n\n# Kotlin Specialist\n\n**Not for** a Spring Boot Java backend (`develop:spring-boot-engineer`), Android XML layouts (this skill covers\nCompose), a full coverage plan (`develop:test-master`), or a failing build with an unknown cause\n(`develop:bug-diagnoser`).\n\n## Process\n\n1. **Analyze** — read the build files; establish target platforms, where concurrency lives, how much code is shared.\n2. **Model** — sealed hierarchies, data classes, nullability in the types (`references\u002Fkey-patterns.md`).\n3. **Implement** — coroutines, Flow, extension functions; each scope has a named owner that cancels it on teardown.\n4. **Lint** — run `detekt` and `ktlint` (agent contract: `agents\u002Flint-qa.md`); fix every violation.\n5. **Optimize** — value classes, sequences, inlining, only where a measurement supports them.\n6. **Test** — `runTest` plus Turbine for Flow emissions, one test that cancels each scope; run every KMP target.\n7. **Recount** — grep the touched files for `GlobalScope`, `runBlocking`, `!!`, and scope builders\n   (`CoroutineScope(`, `launch`, `async`); match each scope to a cancelling `runTest`; fix the tally if it differs.\n\n## Output Template\n\n```\n## \u003Ctask>\n\n1. Models: sealed hierarchies, data classes\n2. Implementation: coroutine \u002F Flow code\n3. Tests: runTest + Turbine, including cancellation\n4. Idioms applied: one line each, with why\n\nOpen: [확인 필요: ○○] ...\n\nVerified: detekt \u003Cn> violations · ktlint \u003Cn> · tests \u003Cpass>\u002F\u003Ctotal> · scopes \u003Cs>, cancellation-tested \u003Cc>\nLeft: GlobalScope \u003Cn> · runBlocking \u003Cn> · `!!` without contract \u003Cn>\n```\n\n## What Claude Does \u002F What You Do\n\n| Claude | You |\n|--------|-----|\n| Writes coroutine and Flow scaffolding with owned scopes | Provide domain logic and requirements |\n| Designs sealed state hierarchies | Confirm they match the real UI states |\n| Lays out KMP expect\u002Factual structure | Run tests on each platform target |\n| Flags `!!`, `GlobalScope`, swallowed cancellation | Decide domain null contracts |\n\n## Reference Guide\n\n| Topic | File | Read it when |\n|-------|------|--------------|\n| Core patterns | `references\u002Fkey-patterns.md` | Sealed state, Flow in a repository, catching around suspend, null safety |\n| Language idioms | `references\u002Fdsl-idioms.md` | @DslMarker builders, scope functions, delegation, value classes, inline |\n| Concurrency | `references\u002Fcoroutines-flow.md` | Scope ownership, dispatchers, cancellation, hot\u002Fcold flows, runTest |\n| Server-side | `references\u002Fktor-server.md` | Modules, routes, status pages, JWT, Exposed, WebSockets, testApplication |\n| Shared code | `references\u002Fmultiplatform-kmp.md` | Source sets, Gradle targets, expect\u002Factual vs interfaces, iOS, publishing |\n| Android UI | `references\u002Fandroid-compose.md` | State hoisting, ViewModel, effects, lazy lists, navigation, theming |\n\n## Related Skills\n\n- `develop:spring-boot-engineer` — Kotlin used inside a Spring Boot service\n- `develop:test-master` — coverage plan for Kotlin\u002FKMP modules\n- `develop:bug-diagnoser` — a coroutine bug whose cause is not yet proven\n","## Standing Mandates\n\n- NEVER call code idiomatic, null-safe or cancellation-safe by reading it. A cancellation bug shows only when a scope\n  is cancelled mid-flight, so run `detekt`, `ktlint` and a `runTest` that cancels the scope, and quote the results. A\n  tool you could not run is written `not run: \u003Ctool>`.\n- NEVER launch from `GlobalScope` or keep a scope alive past its owner: the coroutine outlives the screen or request\n  that started it and its failures reach nobody.\n- NEVER swallow `CancellationException` (a bare `catch (e: Exception)` around a suspend call does): the cancelled\n  coroutine keeps running. Rethrow it.\n- NEVER write `!!` without a comment stating the contract, and NEVER call `runBlocking` outside `main` and tests: the\n  first turns a type-checked null into a runtime crash, the second blocks a thread the dispatcher needs.\n- Missing facts (target platforms, Kotlin and coroutines versions, shared-code boundary) are read from the build files\n  first; what stays unknown is written `[확인 필요: ○○]`, never assumed.\n- Goal: the change passes `detekt` and `ktlint`, every scope it opens has a cancellation test, and the closing tally\n  recounts to a grep of the touched files.\n\n# Kotlin Specialist\n\n**Not for** a Spring Boot Java backend (`develop:spring-boot-engineer`), Android XML layouts (this skill covers\nCompose), a full coverage plan (`develop:test-master`), or a failing build with an unknown cause\n(`develop:bug-diagnoser`).\n\n## Process\n\n1. **Analyze** — read the build files; establish target platforms, where concurrency lives, how much code is shared.\n2. **Model** — sealed hierarchies, data classes, nullability in the types (`references\u002Fkey-patterns.md`).\n3. **Implement** — coroutines, Flow, extension functions; each scope has a named owner that cancels it on teardown.\n4. **Lint** — run `detekt` and `ktlint` (agent contract: `agents\u002Flint-qa.md`); fix every violation.\n5. **Optimize** — value classes, sequences, inlining, only where a measurement supports them.\n6. **Test** — `runTest` plus Turbine for Flow emissions, one test that cancels each scope; run every KMP target.\n7. **Recount** — grep the touched files for `GlobalScope`, `runBlocking`, `!!`, and scope builders\n   (`CoroutineScope(`, `launch`, `async`); match each scope to a cancelling `runTest`; fix the tally if it differs.\n\n## Output Template\n\n```\n## \u003Ctask>\n\n1. Models: sealed hierarchies, data classes\n2. Implementation: coroutine \u002F Flow code\n3. Tests: runTest + Turbine, including cancellation\n4. Idioms applied: one line each, with why\n\nOpen: [확인 필요: ○○] ...\n\nVerified: detekt \u003Cn> violations · ktlint \u003Cn> · tests \u003Cpass>\u002F\u003Ctotal> · scopes \u003Cs>, cancellation-tested \u003Cc>\nLeft: GlobalScope \u003Cn> · runBlocking \u003Cn> · `!!` without contract \u003Cn>\n```\n\n## What Claude Does \u002F What You Do\n\n| Claude | You |\n|--------|-----|\n| Writes coroutine and Flow scaffolding with owned scopes | Provide domain logic and requirements |\n| Designs sealed state hierarchies | Confirm they match the real UI states |\n| Lays out KMP expect\u002Factual structure | Run tests on each platform target |\n| Flags `!!`, `GlobalScope`, swallowed cancellation | Decide domain null contracts |\n\n## Reference Guide\n\n| Topic | File | Read it when |\n|-------|------|--------------|\n| Core patterns | `references\u002Fkey-patterns.md` | Sealed state, Flow in a repository, catching around suspend, null safety |\n| Language idioms | `references\u002Fdsl-idioms.md` | @DslMarker builders, scope functions, delegation, value classes, inline |\n| Concurrency | `references\u002Fcoroutines-flow.md` | Scope ownership, dispatchers, cancellation, hot\u002Fcold flows, runTest |\n| Server-side | `references\u002Fktor-server.md` | Modules, routes, status pages, JWT, Exposed, WebSockets, testApplication |\n| Shared code | `references\u002Fmultiplatform-kmp.md` | Source sets, Gradle targets, expect\u002Factual vs interfaces, iOS, publishing |\n| Android UI | `references\u002Fandroid-compose.md` | State hoisting, ViewModel, effects, lazy lists, navigation, theming |\n\n## Related Skills\n\n- `develop:spring-boot-engineer` — Kotlin used inside a Spring Boot service\n- `develop:test-master` — coverage plan for Kotlin\u002FKMP modules\n- `develop:bug-diagnoser` — a coroutine bug whose cause is not yet proven\n",{"name":5,"license":15,"metadata":49,"scenarios":56,"description":7,"compatibility":62},{"role":50,"scope":51,"domain":52,"version":53,"triggers":54,"output-format":40,"related-skills":55},"specialist","implementation","language","1.1.0","Kotlin, coroutines, suspend function, Flow, KMP, Kotlin Multiplatform, Compose, Ktor, Android Kotlin","test-master, spring-boot-engineer",[57,58,59,60,61],"Help me write idiomatic Kotlin code using coroutines for async processing","Convert this Java class to Kotlin and apply Kotlin best practices","Design a Kotlin DSL for our configuration system","코틀린으로 코루틴 기반 비동기 처리를 구현해줘","자바 코드를 코틀린으로 전환하고 관용구를 적용해줘",{"optional":63,"recommended":65,"remote_mcp_note":66},[64],"think-tool",[],"think-tool이 있으면 코루틴 스코프 설계와 취소 전파 전략을 더 체계적으로 검토합니다. Claude 설정 → MCP Servers에서 remote SSE 엔드포인트를 추가하세요.","main","cdb89e1460a1035ae4d122ee0b33344216b2cbfe","develop\u002Fskills\u002Fkotlin-specialist",1,"https:\u002F\u002Fgithub.com\u002Fnewkayak12\u002Fclaude-skills","https:\u002F\u002Fgithub.com\u002Fnewkayak12","그냥 하는 사람\r\n","2026-11-11 21:29:03",{"source":8,"skillName":5,"commands":76,"prompt":86,"zipAvailable":87},[77,80,83],{"tool":78,"command":79},"npx","npx skills add newkayak12\u002Fclaude-skills --skill kotlin-specialist",{"tool":81,"command":82},"bunx","bunx skills add newkayak12\u002Fclaude-skills --skill kotlin-specialist",{"tool":84,"command":85},"pnpm","pnpm dlx skills add newkayak12\u002Fclaude-skills --skill kotlin-specialist","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fnewkayak12\u002Fclaude-skills\u002Fblob\u002Fmain\u002Fdevelop\u002Fskills\u002Fkotlin-specialist\u002FSKILL.md",true,[89,95,99,103,107,111,115,119,123,127,131,135,139,143,147,151,155,159,163,167,171,175,179,183,187,191,195,199,203,207,211,215,219,223,227,231,235,239,243,247,250,254,258,262,266,270,274,278,282,286,290,294,298,302,306,310,314,318,322,326,330,334,338,342,346,350,354,358,361],{"path":90,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":93,"sourceHtmlUrl":94},"AGENTS.md","REFERENCE","参考文档",81716,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-react\u002Fskills\u002Freact-best-practices\u002FAGENTS.md",{"path":96,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":97,"sourceHtmlUrl":98},"agents\u002Flint-qa.md",1045,"https:\u002F\u002Fgithub.com\u002Fnewkayak12\u002Fclaude-skills\u002Fblob\u002Fmain\u002Fdevelop\u002Fskills\u002Fkotlin-specialist\u002Fagents\u002Flint-qa.md",{"path":100,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":101,"sourceHtmlUrl":102},"README.md",3360,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-react\u002Fskills\u002Freact-best-practices\u002FREADME.md",{"path":104,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":105,"sourceHtmlUrl":106},"references\u002Fandroid-compose.md",5534,"https:\u002F\u002Fgithub.com\u002Fnewkayak12\u002Fclaude-skills\u002Fblob\u002Fmain\u002Fdevelop\u002Fskills\u002Fkotlin-specialist\u002Freferences\u002Fandroid-compose.md",{"path":108,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":109,"sourceHtmlUrl":110},"references\u002Fcoroutines-flow.md",6014,"https:\u002F\u002Fgithub.com\u002Fnewkayak12\u002Fclaude-skills\u002Fblob\u002Fmain\u002Fdevelop\u002Fskills\u002Fkotlin-specialist\u002Freferences\u002Fcoroutines-flow.md",{"path":112,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":113,"sourceHtmlUrl":114},"references\u002Fdsl-idioms.md",5220,"https:\u002F\u002Fgithub.com\u002Fnewkayak12\u002Fclaude-skills\u002Fblob\u002Fmain\u002Fdevelop\u002Fskills\u002Fkotlin-specialist\u002Freferences\u002Fdsl-idioms.md",{"path":116,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":117,"sourceHtmlUrl":118},"references\u002Fkey-patterns.md",1557,"https:\u002F\u002Fgithub.com\u002Fnewkayak12\u002Fclaude-skills\u002Fblob\u002Fmain\u002Fdevelop\u002Fskills\u002Fkotlin-specialist\u002Freferences\u002Fkey-patterns.md",{"path":120,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":121,"sourceHtmlUrl":122},"references\u002Fktor-server.md",5202,"https:\u002F\u002Fgithub.com\u002Fnewkayak12\u002Fclaude-skills\u002Fblob\u002Fmain\u002Fdevelop\u002Fskills\u002Fkotlin-specialist\u002Freferences\u002Fktor-server.md",{"path":124,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":125,"sourceHtmlUrl":126},"references\u002Fmultiplatform-kmp.md",4997,"https:\u002F\u002Fgithub.com\u002Fnewkayak12\u002Fclaude-skills\u002Fblob\u002Fmain\u002Fdevelop\u002Fskills\u002Fkotlin-specialist\u002Freferences\u002Fmultiplatform-kmp.md",{"path":128,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":129,"sourceHtmlUrl":130},"rules\u002F_sections.md",1554,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-react\u002Fskills\u002Freact-best-practices\u002Frules\u002F_sections.md",{"path":132,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":133,"sourceHtmlUrl":134},"rules\u002F_template.md",631,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-react\u002Fskills\u002Freact-best-practices\u002Frules\u002F_template.md",{"path":136,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":137,"sourceHtmlUrl":138},"rules\u002Fadvanced-event-handler-refs.md",1483,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-react\u002Fskills\u002Freact-best-practices\u002Frules\u002Fadvanced-event-handler-refs.md",{"path":140,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":141,"sourceHtmlUrl":142},"rules\u002Fadvanced-init-once.md",958,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-react\u002Fskills\u002Freact-best-practices\u002Frules\u002Fadvanced-init-once.md",{"path":144,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":145,"sourceHtmlUrl":146},"rules\u002Fadvanced-use-latest.md",1072,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-react\u002Fskills\u002Freact-best-practices\u002Frules\u002Fadvanced-use-latest.md",{"path":148,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":149,"sourceHtmlUrl":150},"rules\u002Fasync-api-routes.md",1125,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-react\u002Fskills\u002Freact-best-practices\u002Frules\u002Fasync-api-routes.md",{"path":152,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":153,"sourceHtmlUrl":154},"rules\u002Fasync-defer-await.md",2028,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-react\u002Fskills\u002Freact-best-practices\u002Frules\u002Fasync-defer-await.md",{"path":156,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":157,"sourceHtmlUrl":158},"rules\u002Fasync-dependencies.md",1293,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-react\u002Fskills\u002Freact-best-practices\u002Frules\u002Fasync-dependencies.md",{"path":160,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":161,"sourceHtmlUrl":162},"rules\u002Fasync-parallel.md",654,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-react\u002Fskills\u002Freact-best-practices\u002Frules\u002Fasync-parallel.md",{"path":164,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":165,"sourceHtmlUrl":166},"rules\u002Fasync-suspense-boundaries.md",2510,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-react\u002Fskills\u002Freact-best-practices\u002Frules\u002Fasync-suspense-boundaries.md",{"path":168,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":169,"sourceHtmlUrl":170},"rules\u002Fbundle-barrel-imports.md",2370,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-react\u002Fskills\u002Freact-best-practices\u002Frules\u002Fbundle-barrel-imports.md",{"path":172,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":173,"sourceHtmlUrl":174},"rules\u002Fbundle-conditional.md",949,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-react\u002Fskills\u002Freact-best-practices\u002Frules\u002Fbundle-conditional.md",{"path":176,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":177,"sourceHtmlUrl":178},"rules\u002Fbundle-defer-third-party.md",920,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-react\u002Fskills\u002Freact-best-practices\u002Frules\u002Fbundle-defer-third-party.md",{"path":180,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":181,"sourceHtmlUrl":182},"rules\u002Fbundle-dynamic-imports.md",791,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-react\u002Fskills\u002Freact-best-practices\u002Frules\u002Fbundle-dynamic-imports.md",{"path":184,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":185,"sourceHtmlUrl":186},"rules\u002Fbundle-preload.md",1149,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-react\u002Fskills\u002Freact-best-practices\u002Frules\u002Fbundle-preload.md",{"path":188,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":189,"sourceHtmlUrl":190},"rules\u002Fclient-event-listeners.md",1969,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-react\u002Fskills\u002Freact-best-practices\u002Frules\u002Fclient-event-listeners.md",{"path":192,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":193,"sourceHtmlUrl":194},"rules\u002Fclient-localstorage-schema.md",1950,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-react\u002Fskills\u002Freact-best-practices\u002Frules\u002Fclient-localstorage-schema.md",{"path":196,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":197,"sourceHtmlUrl":198},"rules\u002Fclient-passive-event-listeners.md",1644,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-react\u002Fskills\u002Freact-best-practices\u002Frules\u002Fclient-passive-event-listeners.md",{"path":200,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":201,"sourceHtmlUrl":202},"rules\u002Fclient-swr-dedup.md",1159,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-react\u002Fskills\u002Freact-best-practices\u002Frules\u002Fclient-swr-dedup.md",{"path":204,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":205,"sourceHtmlUrl":206},"rules\u002Finteraction-queryspec-registration.md",6699,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-react\u002Fskills\u002Freact-best-practices\u002Frules\u002Finteraction-queryspec-registration.md",{"path":208,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":209,"sourceHtmlUrl":210},"rules\u002Fjs-batch-dom-css.md",3266,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-react\u002Fskills\u002Freact-best-practices\u002Frules\u002Fjs-batch-dom-css.md",{"path":212,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":213,"sourceHtmlUrl":214},"rules\u002Fjs-cache-function-results.md",1949,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-react\u002Fskills\u002Freact-best-practices\u002Frules\u002Fjs-cache-function-results.md",{"path":216,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":217,"sourceHtmlUrl":218},"rules\u002Fjs-cache-property-access.md",532,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-react\u002Fskills\u002Freact-best-practices\u002Frules\u002Fjs-cache-property-access.md",{"path":220,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":221,"sourceHtmlUrl":222},"rules\u002Fjs-cache-storage.md",1651,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-react\u002Fskills\u002Freact-best-practices\u002Frules\u002Fjs-cache-storage.md",{"path":224,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":225,"sourceHtmlUrl":226},"rules\u002Fjs-combine-iterations.md",753,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-react\u002Fskills\u002Freact-best-practices\u002Frules\u002Fjs-combine-iterations.md",{"path":228,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":229,"sourceHtmlUrl":230},"rules\u002Fjs-early-exit.md",1133,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-react\u002Fskills\u002Freact-best-practices\u002Frules\u002Fjs-early-exit.md",{"path":232,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":233,"sourceHtmlUrl":234},"rules\u002Fjs-hoist-regexp.md",1028,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-react\u002Fskills\u002Freact-best-practices\u002Frules\u002Fjs-hoist-regexp.md",{"path":236,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":237,"sourceHtmlUrl":238},"rules\u002Fjs-index-maps.md",837,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-react\u002Fskills\u002Freact-best-practices\u002Frules\u002Fjs-index-maps.md",{"path":240,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":241,"sourceHtmlUrl":242},"rules\u002Fjs-length-check-first.md",1747,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-react\u002Fskills\u002Freact-best-practices\u002Frules\u002Fjs-length-check-first.md",{"path":244,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":245,"sourceHtmlUrl":246},"rules\u002Fjs-min-max-loop.md",2290,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-react\u002Fskills\u002Freact-best-practices\u002Frules\u002Fjs-min-max-loop.md",{"path":248,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":217,"sourceHtmlUrl":249},"rules\u002Fjs-set-map-lookups.md","https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-react\u002Fskills\u002Freact-best-practices\u002Frules\u002Fjs-set-map-lookups.md",{"path":251,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":252,"sourceHtmlUrl":253},"rules\u002Fjs-tosorted-immutable.md",1782,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-react\u002Fskills\u002Freact-best-practices\u002Frules\u002Fjs-tosorted-immutable.md",{"path":255,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":256,"sourceHtmlUrl":257},"rules\u002Frendering-activity.md",564,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-react\u002Fskills\u002Freact-best-practices\u002Frules\u002Frendering-activity.md",{"path":259,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":260,"sourceHtmlUrl":261},"rules\u002Frendering-animate-svg-wrapper.md",1185,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-react\u002Fskills\u002Freact-best-practices\u002Frules\u002Frendering-animate-svg-wrapper.md",{"path":263,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":264,"sourceHtmlUrl":265},"rules\u002Frendering-conditional-render.md",980,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-react\u002Fskills\u002Freact-best-practices\u002Frules\u002Frendering-conditional-render.md",{"path":267,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":268,"sourceHtmlUrl":269},"rules\u002Frendering-content-visibility.md",815,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-react\u002Fskills\u002Freact-best-practices\u002Frules\u002Frendering-content-visibility.md",{"path":271,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":272,"sourceHtmlUrl":273},"rules\u002Frendering-hoist-jsx.md",1039,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-react\u002Fskills\u002Freact-best-practices\u002Frules\u002Frendering-hoist-jsx.md",{"path":275,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":276,"sourceHtmlUrl":277},"rules\u002Frendering-hydration-no-flicker.md",2308,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-react\u002Fskills\u002Freact-best-practices\u002Frules\u002Frendering-hydration-no-flicker.md",{"path":279,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":280,"sourceHtmlUrl":281},"rules\u002Frendering-hydration-suppress-warning.md",872,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-react\u002Fskills\u002Freact-best-practices\u002Frules\u002Frendering-hydration-suppress-warning.md",{"path":283,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":284,"sourceHtmlUrl":285},"rules\u002Frendering-svg-precision.md",588,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-react\u002Fskills\u002Freact-best-practices\u002Frules\u002Frendering-svg-precision.md",{"path":287,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":288,"sourceHtmlUrl":289},"rules\u002Frendering-usetransition-loading.md",2074,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-react\u002Fskills\u002Freact-best-practices\u002Frules\u002Frendering-usetransition-loading.md",{"path":291,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":292,"sourceHtmlUrl":293},"rules\u002Frerender-defer-reads.md",973,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-react\u002Fskills\u002Freact-best-practices\u002Frules\u002Frerender-defer-reads.md",{"path":295,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":296,"sourceHtmlUrl":297},"rules\u002Frerender-dependencies.md",824,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-react\u002Fskills\u002Freact-best-practices\u002Frules\u002Frerender-dependencies.md",{"path":299,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":300,"sourceHtmlUrl":301},"rules\u002Frerender-derived-state-no-effect.md",1201,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-react\u002Fskills\u002Freact-best-practices\u002Frules\u002Frerender-derived-state-no-effect.md",{"path":303,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":304,"sourceHtmlUrl":305},"rules\u002Frerender-derived-state.md",728,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-react\u002Fskills\u002Freact-best-practices\u002Frules\u002Frerender-derived-state.md",{"path":307,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":308,"sourceHtmlUrl":309},"rules\u002Frerender-functional-setstate.md",2968,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-react\u002Fskills\u002Freact-best-practices\u002Frules\u002Frerender-functional-setstate.md",{"path":311,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":312,"sourceHtmlUrl":313},"rules\u002Frerender-lazy-state-init.md",2016,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-react\u002Fskills\u002Freact-best-practices\u002Frules\u002Frerender-lazy-state-init.md",{"path":315,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":316,"sourceHtmlUrl":317},"rules\u002Frerender-memo-with-default-value.md",1173,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-react\u002Fskills\u002Freact-best-practices\u002Frules\u002Frerender-memo-with-default-value.md",{"path":319,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":320,"sourceHtmlUrl":321},"rules\u002Frerender-memo.md",1148,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-react\u002Fskills\u002Freact-best-practices\u002Frules\u002Frerender-memo.md",{"path":323,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":324,"sourceHtmlUrl":325},"rules\u002Frerender-move-effect-to-event.md",1268,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-react\u002Fskills\u002Freact-best-practices\u002Frules\u002Frerender-move-effect-to-event.md",{"path":327,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":328,"sourceHtmlUrl":329},"rules\u002Frerender-simple-expression-in-memo.md",1018,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-react\u002Fskills\u002Freact-best-practices\u002Frules\u002Frerender-simple-expression-in-memo.md",{"path":331,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":332,"sourceHtmlUrl":333},"rules\u002Frerender-transitions.md",1055,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-react\u002Fskills\u002Freact-best-practices\u002Frules\u002Frerender-transitions.md",{"path":335,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":336,"sourceHtmlUrl":337},"rules\u002Frerender-use-ref-transient-values.md",1742,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-react\u002Fskills\u002Freact-best-practices\u002Frules\u002Frerender-use-ref-transient-values.md",{"path":339,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":340,"sourceHtmlUrl":341},"rules\u002Fserver-after-nonblocking.md",2012,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-react\u002Fskills\u002Freact-best-practices\u002Frules\u002Fserver-after-nonblocking.md",{"path":343,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":344,"sourceHtmlUrl":345},"rules\u002Fserver-auth-actions.md",2649,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-react\u002Fskills\u002Freact-best-practices\u002Frules\u002Fserver-auth-actions.md",{"path":347,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":348,"sourceHtmlUrl":349},"rules\u002Fserver-cache-lru.md",1353,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-react\u002Fskills\u002Freact-best-practices\u002Frules\u002Fserver-cache-lru.md",{"path":351,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":352,"sourceHtmlUrl":353},"rules\u002Fserver-cache-react.md",2228,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-react\u002Fskills\u002Freact-best-practices\u002Frules\u002Fserver-cache-react.md",{"path":355,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":356,"sourceHtmlUrl":357},"rules\u002Fserver-dedup-props.md",2060,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-react\u002Fskills\u002Freact-best-practices\u002Frules\u002Fserver-dedup-props.md",{"path":359,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":129,"sourceHtmlUrl":360},"rules\u002Fserver-parallel-fetching.md","https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-react\u002Fskills\u002Freact-best-practices\u002Frules\u002Fserver-parallel-fetching.md",{"path":362,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":363,"sourceHtmlUrl":364},"rules\u002Fserver-serialization.md",996,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-react\u002Fskills\u002Freact-best-practices\u002Frules\u002Fserver-serialization.md",[366,389,414,435,460,477],{"skillNo":367,"name":368,"nameZh":6,"description":369,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":370,"categories":371,"keywords":372,"publishedAt":44},"01M6DJ9KATAGNQ28QRQWG32PNG","diagram","Use when something must be drawn as a checked figure, not Mermaid: page layout, B-tree, lock timeline, ER, benchmark chart, architecture, sequence. SVG + PNG. Triggers: \"도식화해줘\", \"그림으로 그려줘\", \"책에 넣을 그림\", \"시퀀스 다이어그램\", \"draw this as a figure\".","https:\u002F\u002Fgithub.com\u002Fnewkayak12\u002Fclaude-skills\u002Fblob\u002Fmain\u002Fwrite\u002Fskills\u002Fdiagram\u002FSKILL.md",[],[368,373,374,375,376,377,378,379,380,35,381,32,382,383,384,385,27,386,387,388],"web","architecture","mermaid","browser","cache","redis","api","b-tree","page","er","postgres","query","layout","as","chart","SVG",{"skillNo":390,"name":391,"nameZh":6,"description":392,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":393,"categories":394,"keywords":399,"publishedAt":44},"01M6DJ0RNQFTMCJFZ0F90TKV6X","test-master","Use when writing, improving, or auditing tests, or writing case specs with expected results from a spec. Triggers: \"테스트 작성\", \"테스트 케이스 작성\", \"test case writing\", \"단위 테스트\", \"커버리지 분석\", \"test plan\", \"defect report\".","https:\u002F\u002Fgithub.com\u002Fnewkayak12\u002Fclaude-skills\u002Fblob\u002Fmain\u002Fdevelop\u002Fskills\u002Ftest-master\u002FSKILL.md",[395,398],{"categoryNo":396,"categoryName":397,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量",{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[400,401,402,403,43,42,404,405,406,37,407,408,35,409,410,32,411,412,413,27],"test","master","test master","testing","unit tests","development","qa","test plan","plan","analyze","coverage","only","thinking","tests",{"skillNo":415,"name":416,"nameZh":6,"description":417,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":418,"categories":419,"keywords":421,"publishedAt":44},"01M6DJ0HNBTK0C266899VBY25J","sre-engineer","Use when setting up production reliability practices. Triggers on: \"SLO 정하고 싶어\", \"에러 버짓\", \"알람 피로\", \"반복 작업(toil) 줄이기\", \"golden signals dashboard\", \"burn-rate alert\". Not for active incidents or chaos tests.","https:\u002F\u002Fgithub.com\u002Fnewkayak12\u002Fclaude-skills\u002Fblob\u002Fmain\u002Fdevelop\u002Fskills\u002Fsre-engineer\u002FSKILL.md",[420],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[422,30,423,43,424,425,35,426,32,427,428,429,430,431,432,412,433,434,413,27],"sre","sre engineer","observability","SET","fix","reliability","slo","sli","burn-rate","alert","up","call","define",{"skillNo":436,"name":437,"nameZh":6,"description":438,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":439,"categories":440,"keywords":450,"publishedAt":44},"01M6DJ0D2M8JP3K67HF3EPWRXC","sql-pro","Use when someone needs help writing or rewriting SQL — authoring complex joins, CTEs, window functions, or recursive queries — or designing a schema from scratch, normalizing an existing one, or migrating queries between database dialects.","https:\u002F\u002Fgithub.com\u002Fnewkayak12\u002Fclaude-skills\u002Fblob\u002Fmain\u002Fdevelop\u002Fskills\u002Fsql-pro\u002FSKILL.md",[441,444,445],{"categoryNo":442,"categoryName":443,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000010","后端与接口",{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":446,"categoryName":447,"taxonomyType":448,"taxonomyTypeDesc":449},"01JBSEEDCAT000000000000033","数据分析师","PROFESSION","适用职业",[451,452,34,43,42,453,41,40,454,37,35,455,33,456,32,457,30,458,384,459],"sql","sql pro","oracle","database","explain","strategy","schema","functions","optimizer",{"skillNo":461,"name":462,"nameZh":6,"description":463,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":464,"categories":465,"keywords":471,"publishedAt":44},"01M6DJ07ZKVJXBHFF6F1KE8SF9","spring-boot-engineer","Use when building or extending a Spring Boot 3.x Java backend — REST, Spring Security, JPA, WebFlux, Actuator. Triggers on: \"Spring Boot API\", \"스프링 시큐리티 설정\", \"JPA 연동\". Not for service decomposition or query tuning.","https:\u002F\u002Fgithub.com\u002Fnewkayak12\u002Fclaude-skills\u002Fblob\u002Fmain\u002Fdevelop\u002Fskills\u002Fspring-boot-engineer\u002FSKILL.md",[466,467,468],{"categoryNo":442,"categoryName":443,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":469,"categoryName":470,"taxonomyType":448,"taxonomyTypeDesc":449},"01JBSEEDCAT000000000000030","开发工程师",[41,472,33,30,473,43,374,40,474,454,38,379,475,35,25,32,384,476,459,27],"spring boot","spring boot engineer","authentication","configure","caching",{"skillNo":478,"name":479,"nameZh":6,"description":480,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":481,"categories":482,"keywords":484,"publishedAt":44},"01M6DJ036MK4ESPPFEY6WY8FWZ","spec-driven-development","Use when a feature should be specified before it is coded — stories, acceptance criteria, tasks, a per-criterion check. Triggers: \"스펙 먼저\", \"명세부터 쓰고 구현\", \"수용 기준 먼저\", \"spec first\", \"spec-driven development\".","https:\u002F\u002Fgithub.com\u002Fnewkayak12\u002Fclaude-skills\u002Fblob\u002Fmain\u002Fdevelop\u002Fskills\u002Fspec-driven-development\u002FSKILL.md",[483],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[485,486,405,487,488,43,489,490,491,492,37,35,493,32,494,495,412,496,497,27],"spec","spec driven development","spec driven","driven","implement","tasks","acceptance","first","write","think","do","acceptance criteria","feature"]