用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/MarieLynneBlock/arcanum-artifex --skill api-design命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
Check that a Copilot customisation asset (skill, workflow, agent, instruction, or prompt folder) stays standalone and copyable, with no runtime dependency on paths outside its own folder. Use when packaging an asset for reuse, reviewing whether an asset can be copied out of this repo, or investigating why a copied asset breaks elsewhere.
Audit Markdown links, images, and local anchors for broken relative references. Use when reviewing documentation changes, moving or renaming assets, updating indexes, or investigating broken links.
Validate YAML frontmatter of Copilot customisation assets in this lab (SKILL.md, WORKFLOW.md, *.agent.md, *.instructions.md, *.prompt.md). Use when adding, reviewing, or fixing an asset's frontmatter, or when asked to check whether an asset follows repository conventions.
基于 SOC 职业分类
正在显示 SKILL.md
| name | api-design |
| description | Applies REST and GraphQL design principles to produce or review an API contract. |
| version | 1.0.0 |
| tags | ["api","rest","graphql","design","contract"] |
| metadata | {"skill-author":"Marie-Lynne Block"} |
Applies REST and GraphQL design principles to produce or review an API contract. It covers resource modelling, URL conventions, HTTP semantics, request/response schemas, error formats, versioning strategy, and authentication patterns — producing OpenAPI-compatible snippets or GraphQL schema fragments.
| Principle | Guidance |
|---|---|
| Resource naming | Nouns, plural, lowercase, hyphenated: /orders, /line-items. Never verbs in URLs. |
| HTTP methods | GET read, POST create, PUT full replace, PATCH partial update, DELETE remove |
| Idempotency | GET, PUT, DELETE must be idempotent. POST is not. PATCH should be designed to be. |
| Status codes | 200 OK, 201 Created, 204 No Content, 400 Bad Request, 401 Unauthorised, 403 Forbidden, 404 Not Found, 409 Conflict, 422 Unprocessable Entity, 500 Internal Server Error |
| Filtering/sorting | Query parameters: ?status=active&sort=created_at&order=desc&page=2&per_page=25 |
| Versioning | URI prefix (/v1/) for breaking changes; header versioning (Accept: application/vnd.api+json;version=2) for content negotiation |
Consistent error bodies across all endpoints:
{
"error": {
"code": "VALIDATION_ERROR",
"message": "Human-readable description",
"details": [
{ "field": "email", "issue": "must be a valid email address" }
]
}
}
query for reads, mutation for writes, subscription for real-time.OrderLine). Field names: camelCase (lineItems).edges, node, pageInfo).input CreateOrderInput { ... }.type CreateOrderResult = Order | ValidationError.Identify the API type. REST or GraphQL? If not stated, recommend based on use case (REST for CRUD-heavy APIs, GraphQL for flexible querying across related data).
Model the resources or types. Identify the entities involved and their relationships. Name them clearly.
Define the operations. For REST: map resources to endpoints and HTTP methods. For GraphQL: define queries, mutations, and types.
Design request/response schemas. Specify field names, types, and validation rules. Call out optional vs. required fields.
Define the error contract. Consistent error format across all operations.
Address versioning and authentication. State the versioning strategy and authentication mechanism.
Flag design concerns. Identify any REST anti-patterns, N+1 risks (GraphQL), or security gaps.
Produce the output using the format below.
openapi: 3.1.0
info:
title: [API name]
version: 1.0.0
paths:
/[resource]:
get:
summary: List [resources]
parameters:
- name: status
in: query
schema:
type: string
responses:
'200':
description: Success
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/[Resource]'
'401':
$ref: '#/components/responses/Unauthorised'
/[resource]/{id}:
get:
summary: Get [resource] by ID
parameters:
- name: id
in: path
required:
[]
[, ]
type Query {
[resource](id: ID!): [Resource]
[resources](filter: [Resource]FilterInput, first: Int, after: String): [Resource]Connection!
}
type Mutation {
create[Resource](input: Create[Resource]Input!): Create[Resource]Result!
}
type [Resource] {
id: ID!
# fields
createdAt DateTime
CreateResource
CreateResourceResult Resource ValidationError
ValidationError
String
FieldError
### Design decisions
- [Decision and rationale]
### Concerns / open questions
- [Anti-pattern, risk, or unresolved design question]
Input: "Design a REST API for creating and managing orders. An order has line items, a customer, and a status."
Expected output: OpenAPI snippet with /orders (GET, POST) and /orders/{id} (GET, PATCH, DELETE) and /orders/{id}/line-items (GET, POST). Order schema with status enum. Error contract. Design note on whether to embed line items in the order response or use a separate endpoint.
Input: User shares a GraphQL schema where a User type has a posts field returning a plain list with no pagination.
Expected output: Concern flagged for missing pagination (N+1 and performance risk at scale). Suggested fix using Relay connection pattern. Note on missing input types for mutations.
/createOrder, /getUser), it is an anti-pattern — model it as a resource operation instead.info, servers, and security sections.?api_key=...) — they appear in server logs and browser history.