用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/tomevault-io/skills-registry --skill fastapi-control-plane命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
| Use when this capability is needed.
> Use when this capability is needed.
Review architecture and API design for the vfs-s3 project. Use when the user mentions @architect, asks to review an issue's design, discuss module boundaries, API shape, or architectural decisions for vfs-s3. Also trigger when the user wants to create an ADR (Architecture Decision Record) or evaluate a technical approach for the project. Intended for dispatch from Codex automation or Claude routines; GitHub trigger phrase: @vfs-s3-bot please prepare design doc Use when this capability is needed.
基于 SOC 职业分类
正在显示 SKILL.md
| name | fastapi-control-plane |
| description | >- Use when this capability is needed. |
You guide the design and implementation of catalyst-api, the FastAPI control plane running on ECS Fargate. You enforce async-first patterns, construct-scoped routing, and API-lifecycle discipline per Enterprise API Management (Weir, Ch 7: API lifecycle) and Platform Engineering for Architects (Korbiacher et al., Ch 6: developer self-service, auth, tenancy). For thin routers, SOLID boundaries, and maintainable handler cores, invoke @clean-python-code.
Router organization — one router module per domain, mounted under versioned prefixes:
services/catalyst-api/catalyst/
routers/
tenants.py # /v1/tenants/...
environments.py # /v1/tenants/{t}/environments/...
landing_zones.py # /v1/tenants/{t}/environments/{e}/landing-zones/...
projects.py # /v1/.../projects/...
applications.py # /v1/.../applications/...
deployments.py # /v1/.../deployments/...
services_catalog.py # /v1/.../services/...
health.py # /v1/health, /v1/openapi.json
models/
constructs.py # ConstructAddress, Tenant, Environment, ...
deployments.py # DeployRequest, DeployStatus, ...
common.py # PaginatedResponse, ErrorResponse, ...
middleware/
auth.py # IAM / OIDC token validation
trace.py # X-Ray trace_id + request_id injection
error_handler.py # Global exception → structured JSON
dependencies/
db.py # Aurora connection pool (asyncpg via aioboto3 IAM auth)
github.py # GitHub App client (httpx)
construct_scope.py # Extract + validate construct address from path
Construct-scoped paths — the construct hierarchy embeds in the URL:
/v1/tenants/{tenant_slug}
/v1/tenants/{tenant_slug}/environments/{env_slug}
/v1/tenants/{tenant_slug}/environments/{env_slug}/landing-zones/{lz_slug}
.../{lz_slug}/projects/{project_slug}/applications/{app_slug}
Use a shared ConstructScope dependency that parses the path params into a ConstructAddress pydantic model and validates the caller's permission at that scope level.
Pydantic v2 models — every request/response is typed:
from pydantic import BaseModel, Field, ConfigDict
class TenantCreate(BaseModel):
model_config = ConfigDict(strict=True)
slug: str = Field(..., pattern=r"^[a-z0-9-]{2,40}$")
display_name: str = Field(..., min_length=1, max_length=120)
owner_email: str # validated as email by a field_validator
class TenantResponse(BaseModel):
model_config = ConfigDict(from_attributes=True)
slug: str
display_name: str
created_at: datetime
construct_address: str # e.g. "pharmacy"
Per Enterprise API Management Ch 5 (CRUD service pattern): keep request models minimal (what the caller provides) and response models rich (what the system knows).
Auth middleware — two layers:
catalyst CLI; resolved to a principal with scoped permissions.ConstructScope dependency asserts the principal has the required verb (read, create, deploy, etc.) at the resolved construct level. Deny by default; 403 or 404 (hide existence) as appropriate.Per Platform Engineering for Architects Ch 6 (pp 207-217): authentication and tenancy are foundational — never optional, never deferred.
Structured error responses — all errors return consistent JSON:
class ErrorResponse(BaseModel):
detail: str
code: str # e.g. "ILLEGAL_TRANSITION", "CONSTRUCT_NOT_FOUND"
trace_id: str | None = None
request_id: str | None = None
# Register as exception handlers in main.py
@app.exception_handler(ConstructNotFoundError)
async def construct_not_found(request, exc):
return JSONResponse(status_code=404, content=ErrorResponse(...).model_dump())
Health and metadata endpoints:
GET /v1/health → {"status": "ok", "version": "...", "aurora": "connected"}
GET /v1/openapi.json → generated OpenAPI 3.1 spec
Health checks Aurora connectivity and returns degraded if the pool is exhausted. Per Enterprise API Management Ch 7 (Observe phase): observability starts at the health endpoint.
Pagination — cursor-based, not offset:
class PaginatedResponse(BaseModel, Generic[T]):
items: list[T]
next_cursor: str | None = None
total_count: int | None = None # only when cheap to compute
Per Enterprise API Management Ch 5 (payload pagination, p130): cursor pagination scales; offset does not.
Dependency injection — use FastAPI Depends() for:
Logging — structlog only, never print():
import structlog
logger = structlog.get_logger()
# In handlers:
logger.info("deployment_created", deployment_id=dep.id,
construct_address=str(scope.address), actor=principal.id)
Every log line includes trace_id and request_id (injected by middleware).
Design-first workflow — per Enterprise API Management Ch 7 (API lifecycle, pp 206-231):
mock and try (p217): stub endpoints return 501 with the expected response shape so consumers can develop in parallel./v1/...); add Sunset header when deprecating.When helping with catalyst-api:
ConfigDict, and example valuesAGENTS.md service inventoryrequests library — use httpx (async-first, modern TLS).print() — log via structlog.AGENTS.md §7.datetime.utcnow() — use datetime.now(UTC).Idempotency-Key header or ULID-based dedup).Source: Cloud-Byte-Consulting/Catalyst — distributed by TomeVault.