[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6QPZF3E57KYHS75PBZM2B10":3,"skill-same:01M6QPZF3E57KYHS75PBZM2B10":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},"01M6QPZF3E57KYHS75PBZM2B10","naming-registry",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\u002Fnaming-registry\u002FSKILL.md",[],[18,19,20],"registry","naming","naming registry","2026-11-10 10:12:30",false,"# Naming Registry Skill\n\n## Overview\n\nThe naming registry is the single source of truth for ALL field names, column names,\nAPI field names, and aliases used across the entire stack (Python ORM, Pydantic models,\nTypeScript frontend).\n\n## Registry Files\n\n| File | Role | Editable? |\n|------|------|-----------|\n| `registry\u002Fnaming_registry.json` | Source of truth | YES — edit this |\n| `backend\u002Fsrc\u002F\u003Cproject_slug>\u002Fcore\u002Fregistry_constants.py` | Generated Python constants | NO — auto-generated |\n| `frontend\u002Fsrc\u002Fconfig\u002Fregistry.ts` | Generated TypeScript constants | NO — auto-generated |\n| `registry\u002Fgenerate_registry.py` | Code generator script | YES — maintain this |\n\n## Workflow: Adding a New Field\n\n1. Edit `registry\u002Fnaming_registry.json` — add the field definition\n2. Run `task generate-registry` to regenerate constants\n3. Import the constant from `registry_constants.py` in Python code\n4. Import from `registry.ts` in TypeScript code\n5. NEVER hardcode the field name as a string literal\n\n## Usage Patterns\n\n### Python — ORM Column Names\n\n```python\nfrom \u003Cproject_slug>.core.registry_constants import ORM\n\nclass Claim(ORMBase):\n    __tablename__ = \"claims\"\n\n    id: Mapped[int] = mapped_column(\n        ORM.Claim.id,\n        Integer,\n        primary_key=True,\n    )\n```\n\n### Python — Pydantic Aliases\n\n```python\nfrom \u003Cproject_slug>.core.registry_constants import Pydantic, APIFields\n\nclass ClaimModel(BaseModel):\n    id: Annotated[\n        int | None,\n        Field(\n            default=None,\n            validation_alias=AliasChoices(Pydantic.Claim.id, APIFields.claims.id),\n            serialization_alias=Pydantic.Claim.id,\n            description=\"Unique claim identifier\",\n            examples=[1, 42],\n        ),\n    ]\n```\n\n### Python — API Field Names\n\n```python\nfrom \u003Cproject_slug>.core.registry_constants import APIFields\n\nform_data.get(APIFields.claims.diagnosis)\n```\n\n### TypeScript — Frontend\n\n```typescript\nimport { Routes, StatusText } from \"..\u002Fconfig\u002Fregistry\";\n\nconst url = Routes.cases.orchestrateCase();\n```\n\n## Rules\n\n- NEVER hardcode field names as string literals\n- NEVER hand-edit generated files (`registry_constants.py`, `registry.ts`)\n- ALWAYS run generator after editing `naming_registry.json`\n- ALWAYS import from registry constants, never from the JSON directly\n- Maintain consistency: ORM name = Pydantic alias = API field name (unless explicit mapping)\n",{},"main","f726ce2f2bb4e3bcc2f56c066598f4acd910c5ee",".claude\u002Fskills\u002Fnaming-registry","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 naming-registry",{"tool":38,"command":39},"bunx","bunx skills add lfr-ai\u002Fcopier-fullstack-template --skill naming-registry",{"tool":41,"command":42},"pnpm","pnpm dlx skills add lfr-ai\u002Fcopier-fullstack-template --skill naming-registry","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Flfr-ai\u002Fcopier-fullstack-template\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fnaming-registry\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"]