[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6JCZ2W6WGX2CM1DJHFTKXAM":3,"skill-same:01M6JCZ2W6WGX2CM1DJHFTKXAM":63},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"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":6,"updatedAt":48,"install":49,"resources":62},"01M6JCZ2W6WGX2CM1DJHFTKXAM","fastapi-patterns",null,"FastAPI patterns for async APIs, dependency injection, Pydantic request and response models, OpenAPI docs, tests, security, and production readiness.","S3YED\u002Fappie-kit","S3YED","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F62743867?v=4","01M6JBKBRRVP6KMS0VWZ27T3R6","01M6JBKBX0KG30284PW1DBYJT1",14,"MIT","https:\u002F\u002Fgithub.com\u002FS3YED\u002Fappie-kit\u002Fblob\u002Fmaster\u002Fskills\u002Fecc\u002Ffastapi-patterns\u002FSKILL.md",[],[18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35],"fastapi patterns","fastapi","patterns","models","for","readiness","tests","dependency injection","production readiness","community","docs","async","dependency","openapi","injection","Production","Pydantic","security","2026-11-10 10:12:30",false,"---\nname: fastapi-patterns\ndescription: FastAPI patterns for async APIs, dependency injection, Pydantic request and response models, OpenAPI docs, tests, security, and production readiness.\norigin: community\n---\n\n# FastAPI Patterns\n\nProduction-oriented patterns for FastAPI services.\n\n## When to Use\n\n- Building or reviewing a FastAPI app.\n- Splitting routers, schemas, dependencies, and database access.\n- Writing async endpoints that call a database or external service.\n- Adding authentication, authorization, OpenAPI docs, tests, or deployment settings.\n- Checking a FastAPI PR for copy-pasteable examples and production risks.\n\n## How It Works\n\nTreat the FastAPI app as a thin HTTP layer over explicit dependencies and service code:\n\n- `main.py` owns app construction, middleware, exception handlers, and router registration.\n- `schemas\u002F` owns Pydantic request and response models.\n- `dependencies.py` owns database, auth, pagination, and request-scoped dependencies.\n- `services\u002F` or `crud\u002F` owns business and persistence operations.\n- `tests\u002F` overrides dependencies instead of opening production resources.\n\nPrefer small routers and explicit `response_model` declarations. Keep raw ORM objects, secrets, and framework globals out of response schemas.\n\n## Project Layout\n\n```text\napp\u002F\n|-- main.py\n|-- config.py\n|-- dependencies.py\n|-- exceptions.py\n|-- api\u002F\n|   `-- routes\u002F\n|       |-- users.py\n|       `-- health.py\n|-- core\u002F\n|   |-- security.py\n|   `-- middleware.py\n|-- db\u002F\n|   |-- session.py\n|   `-- crud.py\n|-- models\u002F\n|-- schemas\u002F\n`-- tests\u002F\n```\n\n## Application Factory\n\nUse a factory so tests and workers can build the app with controlled settings.\n\n```python\nfrom contextlib import asynccontextmanager\n\nfrom fastapi import FastAPI\nfrom fastapi.middleware.cors import CORSMiddleware\n\nfrom app.api.routes import health, users\nfrom app.config import settings\nfrom app.db.session import close_db, init_db\nfrom app.exceptions import register_exception_handlers\n\n\n@asynccontextmanager\nasync def lifespan(app: FastAPI):\n    await init_db()\n    yield\n    await close_db()\n\n\ndef create_app() -> FastAPI:\n    app = FastAPI(\n        title=settings.api_title,\n        version=settings.api_version,\n        lifespan=lifespan,\n    )\n\n    app.add_middleware(\n        CORSMiddleware,\n        allow_origins=settings.cors_origins,\n        allow_credentials=bool(settings.cors_origins),\n        allow_methods=[\"GET\", \"POST\", \"PUT\", \"PATCH\", \"DELETE\"],\n        allow_headers=[\"Authorization\", \"Content-Type\"],\n    )\n\n    register_exception_handlers(app)\n    app.include_router(health.router, prefix=\"\u002Fhealth\", tags=[\"health\"])\n    app.include_router(users.router, prefix=\"\u002Fapi\u002Fv1\u002Fusers\", tags=[\"users\"])\n    return app\n\n\napp = create_app()\n```\n\nDo not use `allow_origins=[\"*\"]` with `allow_credentials=True`; browsers reject that combination and Starlette disallows it for credentialed requests.\n\n## Pydantic Schemas\n\nKeep request, update, and response models separate.\n\n```python\nfrom datetime import datetime\nfrom typing import Annotated\nfrom uuid import UUID\n\nfrom pydantic import BaseModel, ConfigDict, EmailStr, Field\n\n\nclass UserBase(BaseModel):\n    email: EmailStr\n    full_name: Annotated[str, Field(min_length=1, max_length=100)]\n\n\nclass UserCreate(UserBase):\n    password: Annotated[str, Field(min_length=12, max_length=128)]\n\n\nclass UserUpdate(BaseModel):\n    email: EmailStr | None = None\n    full_name: Annotated[str | None, Field(min_length=1, max_length=100)] = None\n\n\nclass UserResponse(UserBase):\n    model_config = ConfigDict(from_attributes=True)\n\n    id: UUID\n    created_at: datetime\n    updated_at: datetime\n```\n\nResponse models must never include password hashes, access tokens, refresh tokens, or internal authorization state.\n\n## Dependencies\n\nUse dependency injection for request-scoped resources.\n\n```python\nfrom collections.abc import AsyncIterator\nfrom uuid import UUID\n\nfrom fastapi import Depends, HTTPException, status\nfrom fastapi.security import OAuth2PasswordBearer\nfrom sqlalchemy.ext.asyncio import AsyncSession\n\nfrom app.core.security import decode_token\nfrom app.db.session import session_factory\nfrom app.models.user import User\n\n\noauth2_scheme = OAuth2PasswordBearer(tokenUrl=\"\u002Fapi\u002Fv1\u002Fauth\u002Flogin\")\n\n\nasync def get_db() -> AsyncIterator[AsyncSession]:\n    async with session_factory() as session:\n        try:\n            yield session\n            await session.commit()\n        except Exception:\n            await session.rollback()\n            raise\n\n\nasync def get_current_user(\n    token: str = Depends(oauth2_scheme),\n    db: AsyncSession = Depends(get_db),\n) -> User:\n    payload = decode_token(token)\n    user_id = UUID(payload[\"sub\"])\n    user = await db.get(User, user_id)\n    if user is None:\n        raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail=\"Invalid token\")\n    return user\n```\n\nAvoid creating sessions, clients, or credentials inline inside route handlers.\n\n## Async Endpoints\n\nKeep route handlers async when they perform I\u002FO, and use async libraries inside them.\n\n```python\nfrom fastapi import APIRouter, Depends, Query\nfrom sqlalchemy import select\nfrom sqlalchemy.ext.asyncio import AsyncSession\n\nfrom app.dependencies import get_current_user, get_db\nfrom app.models.user import User\nfrom app.schemas.user import UserResponse\n\n\nrouter = APIRouter()\n\n\n@router.get(\"\u002F\", response_model=list[UserResponse])\nasync def list_users(\n    limit: int = Query(default=50, ge=1, le=100),\n    offset: int = Query(default=0, ge=0),\n    db: AsyncSession = Depends(get_db),\n    current_user: User = Depends(get_current_user),\n):\n    result = await db.execute(\n        select(User).order_by(User.created_at.desc()).limit(limit).offset(offset)\n    )\n    return result.scalars().all()\n```\n\nUse `httpx.AsyncClient` for external HTTP calls from async handlers. Do not call `requests` in an async route.\n\n## Error Handling\n\nCentralize domain exceptions and keep response shapes stable.\n\n```python\nfrom fastapi import FastAPI, Request\nfrom fastapi.responses import JSONResponse\n\n\nclass ApiError(Exception):\n    def __init__(self, status_code: int, code: str, message: str):\n        self.status_code = status_code\n        self.code = code\n        self.message = message\n\n\ndef register_exception_handlers(app: FastAPI) -> None:\n    @app.exception_handler(ApiError)\n    async def api_error_handler(request: Request, exc: ApiError):\n        return JSONResponse(\n            status_code=exc.status_code,\n            content={\"error\": {\"code\": exc.code, \"message\": exc.message}},\n        )\n```\n\n## OpenAPI Customization\n\nAssign the custom OpenAPI callable to `app.openapi`; do not just call the function once.\n\n```python\nfrom fastapi import FastAPI\nfrom fastapi.openapi.utils import get_openapi\n\n\ndef install_openapi(app: FastAPI) -> None:\n    def custom_openapi():\n        if app.openapi_schema:\n            return app.openapi_schema\n        app.openapi_schema = get_openapi(\n            title=\"Service API\",\n            version=\"1.0.0\",\n            routes=app.routes,\n        )\n        return app.openapi_schema\n\n    app.openapi = custom_openapi\n```\n\n## Testing\n\nOverride the dependency used by `Depends`, not an internal helper that route handlers never reference.\n\n```python\nimport pytest\nfrom httpx import ASGITransport, AsyncClient\nfrom sqlalchemy.ext.asyncio import AsyncSession\n\nfrom app.dependencies import get_db\nfrom app.main import create_app\n\n\n@pytest.fixture\nasync def client(test_session: AsyncSession):\n    app = create_app()\n\n    async def override_get_db():\n        yield test_session\n\n    app.dependency_overrides[get_db] = override_get_db\n    async with AsyncClient(\n        transport=ASGITransport(app=app),\n        base_url=\"http:\u002F\u002Ftest\",\n    ) as test_client:\n        yield test_client\n    app.dependency_overrides.clear()\n```\n\n## Security Checklist\n\n- Hash passwords with `argon2-cffi`, `bcrypt`, or a current passlib-compatible hasher.\n- Validate JWT issuer, audience, expiry, and signing algorithm.\n- Keep CORS origins environment-specific.\n- Put rate limits on auth and write-heavy endpoints.\n- Use Pydantic models for all request bodies.\n- Use ORM parameter binding or SQLAlchemy Core expressions; never build SQL with f-strings.\n- Redact tokens, authorization headers, cookies, and passwords from logs.\n- Run dependency audit tooling in CI.\n\n## Performance Checklist\n\n- Configure database connection pooling explicitly.\n- Add pagination to list endpoints.\n- Watch for N+1 queries and use eager loading intentionally.\n- Use async HTTP\u002Fdatabase clients in async paths.\n- Add compression only after checking payload size and CPU tradeoffs.\n- Cache stable expensive reads behind explicit invalidation.\n\n## Examples\n\nUse these examples as patterns, not as project-wide templates:\n\n- Application factory: configure middleware and routers once in `create_app`.\n- Schema split: `UserCreate`, `UserUpdate`, and `UserResponse` have different responsibilities.\n- Dependency override: tests override `get_db` directly.\n- OpenAPI customization: assign `app.openapi = custom_openapi`.\n\n## See Also\n\n- Agent: `fastapi-reviewer`\n- Command: `\u002Ffastapi-review`\n- Skill: `python-patterns`\n- Skill: `python-testing`\n- Skill: `api-design`\n","# FastAPI Patterns\n\nProduction-oriented patterns for FastAPI services.\n\n## When to Use\n\n- Building or reviewing a FastAPI app.\n- Splitting routers, schemas, dependencies, and database access.\n- Writing async endpoints that call a database or external service.\n- Adding authentication, authorization, OpenAPI docs, tests, or deployment settings.\n- Checking a FastAPI PR for copy-pasteable examples and production risks.\n\n## How It Works\n\nTreat the FastAPI app as a thin HTTP layer over explicit dependencies and service code:\n\n- `main.py` owns app construction, middleware, exception handlers, and router registration.\n- `schemas\u002F` owns Pydantic request and response models.\n- `dependencies.py` owns database, auth, pagination, and request-scoped dependencies.\n- `services\u002F` or `crud\u002F` owns business and persistence operations.\n- `tests\u002F` overrides dependencies instead of opening production resources.\n\nPrefer small routers and explicit `response_model` declarations. Keep raw ORM objects, secrets, and framework globals out of response schemas.\n\n## Project Layout\n\n```text\napp\u002F\n|-- main.py\n|-- config.py\n|-- dependencies.py\n|-- exceptions.py\n|-- api\u002F\n|   `-- routes\u002F\n|       |-- users.py\n|       `-- health.py\n|-- core\u002F\n|   |-- security.py\n|   `-- middleware.py\n|-- db\u002F\n|   |-- session.py\n|   `-- crud.py\n|-- models\u002F\n|-- schemas\u002F\n`-- tests\u002F\n```\n\n## Application Factory\n\nUse a factory so tests and workers can build the app with controlled settings.\n\n```python\nfrom contextlib import asynccontextmanager\n\nfrom fastapi import FastAPI\nfrom fastapi.middleware.cors import CORSMiddleware\n\nfrom app.api.routes import health, users\nfrom app.config import settings\nfrom app.db.session import close_db, init_db\nfrom app.exceptions import register_exception_handlers\n\n\n@asynccontextmanager\nasync def lifespan(app: FastAPI):\n    await init_db()\n    yield\n    await close_db()\n\n\ndef create_app() -> FastAPI:\n    app = FastAPI(\n        title=settings.api_title,\n        version=settings.api_version,\n        lifespan=lifespan,\n    )\n\n    app.add_middleware(\n        CORSMiddleware,\n        allow_origins=settings.cors_origins,\n        allow_credentials=bool(settings.cors_origins),\n        allow_methods=[\"GET\", \"POST\", \"PUT\", \"PATCH\", \"DELETE\"],\n        allow_headers=[\"Authorization\", \"Content-Type\"],\n    )\n\n    register_exception_handlers(app)\n    app.include_router(health.router, prefix=\"\u002Fhealth\", tags=[\"health\"])\n    app.include_router(users.router, prefix=\"\u002Fapi\u002Fv1\u002Fusers\", tags=[\"users\"])\n    return app\n\n\napp = create_app()\n```\n\nDo not use `allow_origins=[\"*\"]` with `allow_credentials=True`; browsers reject that combination and Starlette disallows it for credentialed requests.\n\n## Pydantic Schemas\n\nKeep request, update, and response models separate.\n\n```python\nfrom datetime import datetime\nfrom typing import Annotated\nfrom uuid import UUID\n\nfrom pydantic import BaseModel, ConfigDict, EmailStr, Field\n\n\nclass UserBase(BaseModel):\n    email: EmailStr\n    full_name: Annotated[str, Field(min_length=1, max_length=100)]\n\n\nclass UserCreate(UserBase):\n    password: Annotated[str, Field(min_length=12, max_length=128)]\n\n\nclass UserUpdate(BaseModel):\n    email: EmailStr | None = None\n    full_name: Annotated[str | None, Field(min_length=1, max_length=100)] = None\n\n\nclass UserResponse(UserBase):\n    model_config = ConfigDict(from_attributes=True)\n\n    id: UUID\n    created_at: datetime\n    updated_at: datetime\n```\n\nResponse models must never include password hashes, access tokens, refresh tokens, or internal authorization state.\n\n## Dependencies\n\nUse dependency injection for request-scoped resources.\n\n```python\nfrom collections.abc import AsyncIterator\nfrom uuid import UUID\n\nfrom fastapi import Depends, HTTPException, status\nfrom fastapi.security import OAuth2PasswordBearer\nfrom sqlalchemy.ext.asyncio import AsyncSession\n\nfrom app.core.security import decode_token\nfrom app.db.session import session_factory\nfrom app.models.user import User\n\n\noauth2_scheme = OAuth2PasswordBearer(tokenUrl=\"\u002Fapi\u002Fv1\u002Fauth\u002Flogin\")\n\n\nasync def get_db() -> AsyncIterator[AsyncSession]:\n    async with session_factory() as session:\n        try:\n            yield session\n            await session.commit()\n        except Exception:\n            await session.rollback()\n            raise\n\n\nasync def get_current_user(\n    token: str = Depends(oauth2_scheme),\n    db: AsyncSession = Depends(get_db),\n) -> User:\n    payload = decode_token(token)\n    user_id = UUID(payload[\"sub\"])\n    user = await db.get(User, user_id)\n    if user is None:\n        raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail=\"Invalid token\")\n    return user\n```\n\nAvoid creating sessions, clients, or credentials inline inside route handlers.\n\n## Async Endpoints\n\nKeep route handlers async when they perform I\u002FO, and use async libraries inside them.\n\n```python\nfrom fastapi import APIRouter, Depends, Query\nfrom sqlalchemy import select\nfrom sqlalchemy.ext.asyncio import AsyncSession\n\nfrom app.dependencies import get_current_user, get_db\nfrom app.models.user import User\nfrom app.schemas.user import UserResponse\n\n\nrouter = APIRouter()\n\n\n@router.get(\"\u002F\", response_model=list[UserResponse])\nasync def list_users(\n    limit: int = Query(default=50, ge=1, le=100),\n    offset: int = Query(default=0, ge=0),\n    db: AsyncSession = Depends(get_db),\n    current_user: User = Depends(get_current_user),\n):\n    result = await db.execute(\n        select(User).order_by(User.created_at.desc()).limit(limit).offset(offset)\n    )\n    return result.scalars().all()\n```\n\nUse `httpx.AsyncClient` for external HTTP calls from async handlers. Do not call `requests` in an async route.\n\n## Error Handling\n\nCentralize domain exceptions and keep response shapes stable.\n\n```python\nfrom fastapi import FastAPI, Request\nfrom fastapi.responses import JSONResponse\n\n\nclass ApiError(Exception):\n    def __init__(self, status_code: int, code: str, message: str):\n        self.status_code = status_code\n        self.code = code\n        self.message = message\n\n\ndef register_exception_handlers(app: FastAPI) -> None:\n    @app.exception_handler(ApiError)\n    async def api_error_handler(request: Request, exc: ApiError):\n        return JSONResponse(\n            status_code=exc.status_code,\n            content={\"error\": {\"code\": exc.code, \"message\": exc.message}},\n        )\n```\n\n## OpenAPI Customization\n\nAssign the custom OpenAPI callable to `app.openapi`; do not just call the function once.\n\n```python\nfrom fastapi import FastAPI\nfrom fastapi.openapi.utils import get_openapi\n\n\ndef install_openapi(app: FastAPI) -> None:\n    def custom_openapi():\n        if app.openapi_schema:\n            return app.openapi_schema\n        app.openapi_schema = get_openapi(\n            title=\"Service API\",\n            version=\"1.0.0\",\n            routes=app.routes,\n        )\n        return app.openapi_schema\n\n    app.openapi = custom_openapi\n```\n\n## Testing\n\nOverride the dependency used by `Depends`, not an internal helper that route handlers never reference.\n\n```python\nimport pytest\nfrom httpx import ASGITransport, AsyncClient\nfrom sqlalchemy.ext.asyncio import AsyncSession\n\nfrom app.dependencies import get_db\nfrom app.main import create_app\n\n\n@pytest.fixture\nasync def client(test_session: AsyncSession):\n    app = create_app()\n\n    async def override_get_db():\n        yield test_session\n\n    app.dependency_overrides[get_db] = override_get_db\n    async with AsyncClient(\n        transport=ASGITransport(app=app),\n        base_url=\"http:\u002F\u002Ftest\",\n    ) as test_client:\n        yield test_client\n    app.dependency_overrides.clear()\n```\n\n## Security Checklist\n\n- Hash passwords with `argon2-cffi`, `bcrypt`, or a current passlib-compatible hasher.\n- Validate JWT issuer, audience, expiry, and signing algorithm.\n- Keep CORS origins environment-specific.\n- Put rate limits on auth and write-heavy endpoints.\n- Use Pydantic models for all request bodies.\n- Use ORM parameter binding or SQLAlchemy Core expressions; never build SQL with f-strings.\n- Redact tokens, authorization headers, cookies, and passwords from logs.\n- Run dependency audit tooling in CI.\n\n## Performance Checklist\n\n- Configure database connection pooling explicitly.\n- Add pagination to list endpoints.\n- Watch for N+1 queries and use eager loading intentionally.\n- Use async HTTP\u002Fdatabase clients in async paths.\n- Add compression only after checking payload size and CPU tradeoffs.\n- Cache stable expensive reads behind explicit invalidation.\n\n## Examples\n\nUse these examples as patterns, not as project-wide templates:\n\n- Application factory: configure middleware and routers once in `create_app`.\n- Schema split: `UserCreate`, `UserUpdate`, and `UserResponse` have different responsibilities.\n- Dependency override: tests override `get_db` directly.\n- OpenAPI customization: assign `app.openapi = custom_openapi`.\n\n## See Also\n\n- Agent: `fastapi-reviewer`\n- Command: `\u002Ffastapi-review`\n- Skill: `python-patterns`\n- Skill: `python-testing`\n- Skill: `api-design`\n",{"name":5,"origin":27,"description":7},"master","8ec37df6d71fb664ea19d32c079e7d3ff931a8e0","skills\u002Fecc\u002Ffastapi-patterns",3,"https:\u002F\u002Fgithub.com\u002FS3YED\u002Fappie-kit","https:\u002F\u002Fweblyfe.ai","https:\u002F\u002Fgithub.com\u002FS3YED","2026-08-27 01:54:02",{"source":8,"skillName":5,"commands":50,"prompt":60,"zipAvailable":61},[51,54,57],{"tool":52,"command":53},"npx","npx skills add S3YED\u002Fappie-kit --skill fastapi-patterns",{"tool":55,"command":56},"bunx","bunx skills add S3YED\u002Fappie-kit --skill fastapi-patterns",{"tool":58,"command":59},"pnpm","pnpm dlx skills add S3YED\u002Fappie-kit --skill fastapi-patterns","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FS3YED\u002Fappie-kit\u002Fblob\u002Fmaster\u002Fskills\u002Fecc\u002Ffastapi-patterns\u002FSKILL.md",true,[],[64,100,135,161,192,216],{"skillNo":65,"name":66,"nameZh":6,"description":67,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":68,"categories":69,"keywords":81,"publishedAt":36},"01M6JFD4M6N4DSGC7TXEJ5R3J2","ai-music","AI music generation and audio tools: HeartMuLa lyrics-to-music generation, songwriting craft (+ Suno prompts), and audio spectrogram\u002Ffeature visualization.","https:\u002F\u002Fgithub.com\u002FS3YED\u002Fappie-kit\u002Fblob\u002Fmaster\u002Fskills\u002Fwethlete\u002Fai-music\u002FSKILL.md",[70,75,78],{"categoryNo":71,"categoryName":72,"taxonomyType":73,"taxonomyTypeDesc":74},"01JBSEEDCAT000000000000013","分析与可视化","SCENARIO","使用场景",{"categoryNo":76,"categoryName":77,"taxonomyType":73,"taxonomyTypeDesc":74},"01JBSEEDCAT000000000000016","图像与多媒体",{"categoryNo":79,"categoryName":80,"taxonomyType":73,"taxonomyTypeDesc":74},"01JBSEEDCAT000000000000023","Skill与智能体开发",[82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99],"music","ai music","humanizer","visualization","Tools","Audio","hermes","hermes agent","songwriting","suno","lyrics","prompts","heartmula","craft","generation","feature","ai music generation","music generation",{"skillNo":101,"name":102,"nameZh":6,"description":103,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":104,"categories":105,"keywords":114,"publishedAt":36},"01M6JFCZE4XNFQFMNZDHKHT5V5","agentic-webdesign-design-system-ingestion","Use v0 Design Systems 2.0, Bolt Design System Agents, or Lovable to generate production UI from a client's real design system components — not generic Tailwind. Use when building a client website where brand consistency matters.","https:\u002F\u002Fgithub.com\u002FS3YED\u002Fappie-kit\u002Fblob\u002Fmaster\u002Fskills\u002Fweb-design\u002Fagentic-webdesign-design-system-ingestion\u002FSKILL.md",[106,109],{"categoryNo":107,"categoryName":108,"taxonomyType":73,"taxonomyTypeDesc":74},"01JBSEEDCAT000000000000015","视觉设计",{"categoryNo":110,"categoryName":111,"taxonomyType":112,"taxonomyTypeDesc":113},"01JBSEEDCAT000000000000032","设计师","PROFESSION","适用职业",[115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134],"design","agentic","design system","system","ingestion","webdesign","agentic webdesign design system ingestion","components","generate","design systems","website","ui","Tailwind","bolt","lovable","v0","design-system","wed","design system components","appie",{"skillNo":136,"name":137,"nameZh":6,"description":138,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":139,"categories":140,"keywords":143,"publishedAt":36},"01M6JFCVPX3913CFAS6QQJ33ZB","agentic-webdesign-agent-elements","Use 21st.dev Agent Elements — 25 shadcn\u002Fui components purpose-built for AI agent UIs. Tool cards (Bash, Edit, Search, Plan, Subagent, MCP), chat, input, streaming. Open source, shadcn-registry install, no runtime lock-in.","https:\u002F\u002Fgithub.com\u002FS3YED\u002Fappie-kit\u002Fblob\u002Fmaster\u002Fskills\u002Fweb-design\u002Fagentic-webdesign-agent-elements\u002FSKILL.md",[141,142],{"categoryNo":79,"categoryName":80,"taxonomyType":73,"taxonomyTypeDesc":74},{"categoryNo":110,"categoryName":111,"taxonomyType":112,"taxonomyTypeDesc":113},[116,144,120,145,146,147,122,148,149,150,151,152,153,154,155,156,157,158,159,160],"elements","agentic webdesign agent elements","MCP","ai agent","registry","search","streaming","open source","open","Bash","plan","subagent","edit","install","input","lock","source",{"skillNo":162,"name":163,"nameZh":6,"description":164,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":165,"categories":166,"keywords":171,"publishedAt":36},"01M6JFCQC7H65M9QJ6TRE71BS1","vercel-deployment","Deploy static sites and frontends to Vercel — handles both CLI and REST API paths, including the CLI token sanitization workaround.","https:\u002F\u002Fgithub.com\u002FS3YED\u002Fappie-kit\u002Fblob\u002Fmaster\u002Fskills\u002Fsoftware-development\u002Fvercel-deployment\u002FSKILL.md",[167,170],{"categoryNo":168,"categoryName":169,"taxonomyType":73,"taxonomyTypeDesc":74},"01JBSEEDCAT000000000000011","运维与部署",{"categoryNo":79,"categoryName":80,"taxonomyType":73,"taxonomyTypeDesc":74},[172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191],"deployment","vercel deployment","vercel","macos","cli","linux","windows","deploy","vercel deploy","REST","api","site","deploy to vercel","token","rest api","host","sites","paths","sanitization","static site",{"skillNo":193,"name":194,"nameZh":6,"description":195,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":196,"categories":197,"keywords":199,"publishedAt":36},"01M6JFCM4SMTXBM5A01BK2YQG1","software-quality-workflows","Umbrella workflow for TDD, debugging, code simplification, spikes, pre-commit review, and debugger-assisted investigation.","https:\u002F\u002Fgithub.com\u002FS3YED\u002Fappie-kit\u002Fblob\u002Fmaster\u002Fskills\u002Fsoftware-development\u002Fsoftware-quality-workflows\u002FSKILL.md",[198],{"categoryNo":79,"categoryName":80,"taxonomyType":73,"taxonomyTypeDesc":74},[200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,22],"workflows","quality","software","software quality workflows","review","tdd","workflow","commit","debugging","code","debugger","pre-commit","investigation","code simplification","user","simplification",{"skillNo":217,"name":218,"nameZh":6,"description":219,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":220,"categories":221,"keywords":229,"publishedAt":36},"01M6JFCGD0M6CEATY01W7YN6DB","react-component-refactoring","Safely refactor large React components into smaller, maintainable pieces using proven patterns","https:\u002F\u002Fgithub.com\u002FS3YED\u002Fappie-kit\u002Fblob\u002Fmaster\u002Fskills\u002Fsoftware-development\u002Freact-component-refactoring\u002FSKILL.md",[222,225,228],{"categoryNo":223,"categoryName":224,"taxonomyType":73,"taxonomyTypeDesc":74},"01JBSEEDCAT000000000000007","代码审查",{"categoryNo":226,"categoryName":227,"taxonomyType":73,"taxonomyTypeDesc":74},"01JBSEEDCAT000000000000009","前端开发",{"categoryNo":79,"categoryName":80,"taxonomyType":73,"taxonomyTypeDesc":74},[230,231,232,233,234,235,236,237,175,238,239,122,240,178,241,209,242,243,20,244],"react","component","refactoring","component refactoring","react component","react component refactoring","frontend","writing","safe","typescript","react components","modular","refactor","simplify","test-driven-development"]