[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6QPXH1DBASZ39H8CCBX8MSW":3,"skill-same:01M6QPXH1DBASZ39H8CCBX8MSW":46},{"skillNo":4,"name":5,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":21,"linkOnly":22,"markdownContent":23,"markdownBody":23,"frontMatter":24,"refName":25,"commitSha":26,"skillDirectory":27,"forksCount":13,"repositoryHtmlUrl":28,"repositoryHomepageUrl":6,"ownerHtmlUrl":29,"ownerBlogUrl":6,"ownerDescription":30,"updatedAt":31,"install":32,"resources":45},"01M6QPXH1DBASZ39H8CCBX8MSW","clean-architecture",null,"lfr-ai\u002Fcopier-fullstack-template","lfr-ai","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F233346551?v=4","01M6QPWTJWTSJV1TQTTY8ZPBYJ","Laurits Fromberg","01M6QPWTQ47BZGA4TH17H14N80",0,"MIT","https:\u002F\u002Fgithub.com\u002Flfr-ai\u002Fcopier-fullstack-template\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fclean-architecture\u002FSKILL.md",[],[18,19,20],"architecture","clean","clean architecture","2026-11-10 10:12:30",false,"# Clean Architecture Skill\n\n## Layer Hierarchy\n\n```text\nutils\u002F → config\u002F → core\u002F → infrastructure\u002F → ai\u002F → application\u002F → presentation\u002F\n```\n\nInner layers have ZERO knowledge of outer layers.\nOuter layers depend on inner layers through imports.\n\n## Dependency Rule\n\nThe fundamental invariant: **source-code dependencies always point inward**.\n\n| Layer | Location | Responsibility | Dependencies |\n|-------|----------|---------------|-------------|\n| `utils\u002F` | `backend\u002Fsrc\u002F\u003Cproject_slug>\u002Futils\u002F` | Enums, validators, types, retry policies | stdlib only |\n| `config\u002F` | `backend\u002Fsrc\u002F\u003Cproject_slug>\u002Fconfig\u002F` | Frozen dataclass configurations | `utils\u002F` |\n| `core\u002F` | `backend\u002Fsrc\u002F\u003Cproject_slug>\u002Fcore\u002F` | ORM models, Pydantic models, registry | `utils\u002F`, `config\u002F` |\n| `infrastructure\u002F` | `backend\u002Fsrc\u002F\u003Cproject_slug>\u002Finfrastructure\u002F` | Azure OpenAI, external API clients | `config\u002F`, `utils\u002F`, `core\u002F` |\n| `ai\u002F` | `backend\u002Fsrc\u002F\u003Cproject_slug>\u002Fai\u002F` | RAG pipeline, embeddings, LangGraph | `config\u002F`, `utils\u002F`, `core\u002F` |\n| `application\u002F` | `backend\u002Fsrc\u002F\u003Cproject_slug>\u002Fapplication\u002F` | Use cases, orchestration, services | `ai\u002F`, `infrastructure\u002F`, `core\u002F`, `config\u002F`, `utils\u002F` |\n| `presentation\u002F` | `backend\u002Fsrc\u002F\u003Cproject_slug>\u002Fpresentation\u002F` | FastAPI routes, middleware, DI | ALL layers |\n\n## Boundary Rules\n\n### Config Layer\n- ALL config objects: `@dataclass(frozen=True, slots=True)`\n- Config values from Azure Key Vault or environment variables\n- Never hardcode connection strings or secrets\n\n### Core Layer\n- ORM: SQLAlchemy 2.0+ with `Mapped` and `mapped_column`\n- Pydantic: `Annotated[type, Field(...)]` with `description` and `examples`\n- Registry: `registry_constants.py` generated from `registry\u002Fnaming_registry.json`\n- Never hardcode field names — always use registry constants\n\n### DI Wiring\n- `presentation\u002Fapi\u002Fdependencies.py` is the SINGLE wiring point\n- Application services receive dependencies through constructor injection\n- Never instantiate services directly in route handlers\n\n## Adding a New Layer Component\n\n1. Create module in the correct layer directory\n2. Import only from allowed layers (see table above)\n3. Add type hints, docstrings, and registry constants\n4. Wire dependencies in `dependencies.py` if needed\n5. Create tests in `tests\u002Funit\u002F` mirroring source structure\n\n## Common Violations\n\n| Violation | Example | Fix |\n|-----------|---------|-----|\n| Outward import | `utils\u002F` imports from `application\u002F` | Move shared code to `utils\u002F` |\n| Circular import | A ↔ B | Extract shared interface to lower layer |\n| Hardcoded DI | `service = MyService()` in route | Use `Depends()` from `dependencies.py` |\n| Mutable config | `@dataclass` without `frozen=True` | Add `frozen=True, slots=True` |\n| Hardcoded names | `\"claim_id\"` string literal | Use `ORM.Claim.id` from registry |\n",{},"main","f726ce2f2bb4e3bcc2f56c066598f4acd910c5ee",".claude\u002Fskills\u002Fclean-architecture","https:\u002F\u002Fgithub.com\u002Flfr-ai\u002Fcopier-fullstack-template","https:\u002F\u002Fgithub.com\u002Flfr-ai","Optimizing for elegance","2026-07-20 12:19:48",{"source":7,"skillName":5,"commands":33,"prompt":43,"zipAvailable":44},[34,37,40],{"tool":35,"command":36},"npx","npx skills add lfr-ai\u002Fcopier-fullstack-template --skill clean-architecture",{"tool":38,"command":39},"bunx","bunx skills add lfr-ai\u002Fcopier-fullstack-template --skill clean-architecture",{"tool":41,"command":42},"pnpm","pnpm dlx skills add lfr-ai\u002Fcopier-fullstack-template --skill clean-architecture","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Flfr-ai\u002Fcopier-fullstack-template\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fclean-architecture\u002FSKILL.md",true,[],[47,80,92,98,115,121],{"skillNo":48,"name":49,"nameZh":6,"description":50,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":51,"categories":52,"keywords":63,"publishedAt":21},"01M6QQGVYW8BZ3W165A5YMJ1PF","ui-ux-frontend","Frontend UX, accessibility, responsive layout, and Storybook interaction quality standards.","https:\u002F\u002Fgithub.com\u002Flfr-ai\u002Fcopier-fullstack-template\u002Fblob\u002Fmain\u002Ftemplate\u002F.github\u002Fskills\u002Fui-ux-frontend\u002FSKILL.md",[53,58],{"categoryNo":54,"categoryName":55,"taxonomyType":56,"taxonomyTypeDesc":57},"01JBSEEDCAT000000000000009","前端开发","SCENARIO","使用场景",{"categoryNo":59,"categoryName":60,"taxonomyType":61,"taxonomyTypeDesc":62},"01JBSEEDCAT000000000000032","设计师","PROFESSION","适用职业",[64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79],"ui ux","ui ux frontend","ui","ux","frontend","storybook","frontend ux","interaction","layout","responsive","mdx","tsx","standards","quality","accessibility","css",{"skillNo":81,"name":82,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":83,"categories":84,"keywords":88,"publishedAt":21},"01M6QQGS7N3ENQZR2Y5JBRYDHD","testing-conventions","https:\u002F\u002Fgithub.com\u002Flfr-ai\u002Fcopier-fullstack-template\u002Fblob\u002Fmain\u002Ftemplate\u002F.github\u002Fskills\u002Ftesting-conventions\u002FSKILL.md",[85],{"categoryNo":86,"categoryName":87,"taxonomyType":56,"taxonomyTypeDesc":57},"01JBSEEDCAT000000000000008","测试与质量",[89,90,91],"conventions","testing conventions","testing",{"skillNo":93,"name":94,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":95,"categories":96,"keywords":97,"publishedAt":21},"01M6QQGQKA9Q6A147WXMS7QPGX","tdd","https:\u002F\u002Fgithub.com\u002Flfr-ai\u002Fcopier-fullstack-template\u002Fblob\u002Fmain\u002Ftemplate\u002F.github\u002Fskills\u002Ftdd\u002FSKILL.md",[],[94],{"skillNo":99,"name":100,"nameZh":6,"description":101,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":102,"categories":103,"keywords":105,"publishedAt":21},"01M6QQG5AZPRWSR6SSCCDDPAM3","shadcn-ui","shadcn\u002Fui component conventions and composition patterns","https:\u002F\u002Fgithub.com\u002Flfr-ai\u002Fcopier-fullstack-template\u002Fblob\u002Fmain\u002Ftemplate\u002F.github\u002Fskills\u002Fshadcn-ui\u002FSKILL.md",[104],{"categoryNo":59,"categoryName":60,"taxonomyType":61,"taxonomyTypeDesc":62},[106,66,107,108,75,109,110,111,112,89,113,114],"shadcn ui","shadcn","component","Composition","src","composition patterns","presentation","patterns","ui component",{"skillNo":116,"name":117,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":118,"categories":119,"keywords":120,"publishedAt":21},"01M6QQG3WMMB8X8C4T8PR7WBV4","sdd","https:\u002F\u002Fgithub.com\u002Flfr-ai\u002Fcopier-fullstack-template\u002Fblob\u002Fmain\u002Ftemplate\u002F.github\u002Fskills\u002Fsdd\u002FSKILL.md",[],[117],{"skillNo":122,"name":123,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":124,"categories":125,"keywords":126,"publishedAt":21},"01M6QQG241NAC5PQFXFD01NR16","quality-gate","https:\u002F\u002Fgithub.com\u002Flfr-ai\u002Fcopier-fullstack-template\u002Fblob\u002Fmain\u002Ftemplate\u002F.github\u002Fskills\u002Fquality-gate\u002FSKILL.md",[],[127,77,128],"quality gate","gate"]