api-documentation
npx machina-cli add skill troykelly/claude-skills/api-documentation --openclawAPI Documentation Enforcement
Overview
Ensures all API changes are reflected in Swagger/OpenAPI documentation. When documentation drift is detected, work pauses until documentation is synchronized.
Core principle: API documentation is a first-class artifact, not an afterthought. No API change ships without documentation.
Announce at start: "I'm using api-documentation to verify Swagger/OpenAPI sync."
When This Skill Triggers
This skill is triggered when ANY of these file patterns are modified:
| Pattern | Framework | Trigger Reason |
|---|---|---|
**/routes/**/*.ts | Express/Fastify | Route definitions |
**/controllers/**/*.ts | NestJS/Express | Controller endpoints |
**/*.controller.ts | NestJS | Controller class |
**/api/**/*.py | FastAPI/Flask | API endpoints |
**/*_router.py | FastAPI | Router definitions |
**/handlers/**/*.go | Go | HTTP handlers |
**/schema*.ts | TypeScript | Schema definitions |
**/dto/**/*.ts | NestJS | Data transfer objects |
**/models/**/*.ts | Various | API models |
Documentation Locations
Check these locations for existing API documentation:
| File | Format | Standard |
|---|---|---|
openapi.yaml | YAML | OpenAPI 3.x |
openapi.json | JSON | OpenAPI 3.x |
swagger.yaml | YAML | Swagger 2.0 |
swagger.json | JSON | Swagger 2.0 |
docs/api.yaml | YAML | OpenAPI 3.x |
api/openapi.yaml | YAML | OpenAPI 3.x |
The Protocol
Step 1: Detect API Changes
# Check if current changes affect API
API_CHANGED=false
# Check common API file patterns
for pattern in "routes/" "controllers/" "api/" "handlers/" "*.controller.ts" "*_router.py"; do
if git diff --name-only HEAD~1 | grep -q "$pattern"; then
API_CHANGED=true
break
fi
done
# Check for schema/DTO changes
if git diff --name-only HEAD~1 | grep -qE "(schema|dto|model)"; then
API_CHANGED=true
fi
echo "API Changed: $API_CHANGED"
Step 2: Find Documentation File
find_api_docs() {
for file in openapi.yaml openapi.json swagger.yaml swagger.json \
docs/api.yaml docs/openapi.yaml api/openapi.yaml; do
if [ -f "$file" ]; then
echo "$file"
return 0
fi
done
return 1
}
DOC_FILE=$(find_api_docs)
if [ -z "$DOC_FILE" ]; then
echo "ERROR: No API documentation file found"
echo "PAUSE: Trigger documentation-audit skill"
fi
Step 3: Verify Sync
Compare API code with documentation:
verify_api_sync() {
local doc_file=$1
# Extract endpoints from code
CODE_ENDPOINTS=$(find . -name "*.ts" -path "*/routes/*" -exec grep -h "@(Get|Post|Put|Delete|Patch)" {} \; | \
sed 's/.*@\(Get\|Post\|Put\|Delete\|Patch\)(\([^)]*\)).*/\1 \2/' | sort -u)
# Extract endpoints from OpenAPI
DOC_ENDPOINTS=$(yq '.paths | keys[]' "$doc_file" 2>/dev/null | sort -u)
# Compare
MISSING=$(comm -23 <(echo "$CODE_ENDPOINTS" | sort) <(echo "$DOC_ENDPOINTS" | sort))
if [ -n "$MISSING" ]; then
echo "DRIFT DETECTED: Endpoints in code but not in docs:"
echo "$MISSING"
return 1
fi
return 0
}
Step 4: Handle Drift
If documentation drift is detected:
## API Documentation Drift Detected
**Status:** PAUSED
**Reason:** API documentation is out of sync with code
### Missing from Documentation
- `POST /api/users` (found in `routes/users.ts:45`)
- `GET /api/users/:id/profile` (found in `routes/users.ts:67`)
### Action Required
1. Invoke `documentation-audit` skill
2. Update Swagger/OpenAPI documentation
3. Resume current work after sync complete
---
*api-documentation skill paused work*
Then invoke documentation-audit:
Use Skill tool: documentation-audit
Documentation Requirements
When updating API documentation, include:
Required Fields
| Field | Description |
|---|---|
summary | Short description of endpoint |
description | Detailed explanation |
parameters | All path/query/header params |
requestBody | Request schema with examples |
responses | All response codes with schemas |
tags | Grouping for organization |
security | Auth requirements |
Required Examples
Every endpoint must have:
- Request example (for POST/PUT/PATCH)
- Success response example
- Error response example
Example OpenAPI Entry
/api/users:
post:
summary: Create a new user
description: |
Creates a new user account with the provided details.
Requires admin authentication.
tags:
- Users
security:
- bearerAuth: []
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/CreateUserRequest'
example:
email: user@example.com
name: John Doe
role: member
responses:
'201':
description: User created successfully
content:
application/json:
schema:
$ref: '#/components/schemas/User'
example:
id: usr_123abc
email: user@example.com
name: John Doe
role: member
createdAt: '2025-01-02T10:30:00Z'
'400':
description: Invalid request body
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
example:
code: VALIDATION_ERROR
message: Email is required
'401':
description: Authentication required
'403':
description: Insufficient permissions
Validation
After updating documentation, validate:
# Validate OpenAPI spec
npx @apidevtools/swagger-cli validate openapi.yaml
# Or with yq for basic structure check
yq 'has("openapi") and has("paths") and has("info")' openapi.yaml
Checklist
Before resuming work:
- API documentation file exists
- All endpoints are documented
- Request/response schemas defined
- Examples provided for all operations
- Security requirements documented
- Documentation validates successfully
- Changes committed to branch
Integration
This skill coordinates with:
| Skill | Purpose |
|---|---|
documentation-audit | Full documentation sync |
issue-driven-development | Triggered during implementation |
comprehensive-review | Validates documentation complete |
When to Skip
This skill can be skipped when:
- Changes are purely internal (no API surface change)
- Changes are to test files only
- Changes are to documentation itself
- Project has no API (CLI tool, library, etc.)
Source
git clone https://github.com/troykelly/claude-skills/blob/main/skills/api-documentation/SKILL.mdView on GitHub Overview
api-documentation ensures API code changes are reflected in Swagger/OpenAPI docs. It treats documentation as a first-class artifact and will pause work if drift is detected, triggering a documentation-audit until alignment is restored.
How This Skill Works
The skill watches for changes to API-related files (routes, controllers, schemas), then locates the OpenAPI/Swagger docs in common locations. It extracts and compares endpoints from code with those in the docs, pausing work on drift and prompting a documentation-audit to fix the mismatch.
When to Use It
- A new route is added or an existing one is changed in routes/**/*.ts
- A controller endpoint is updated in controllers/**/*.ts or **/*.controller.ts
- Schema or DTO definitions change in schema*.ts, dto/**/*.ts, or models/**/*.ts
- OpenAPI/Swagger files are updated or added (openapi.yaml/json, swagger.yaml/json, docs/api.yaml, api/openapi.yaml)
- Code changes drift from current docs, triggering drift detection
Quick Start
- Step 1: Detect API changes in code (routes, controllers, schemas)
- Step 2: Locate a matching OpenAPI/Swagger file (openapi.yaml/json, swagger.yaml/json, docs/api.yaml, api/openapi.yaml)
- Step 3: Compare endpoints; if drift is found, pause work and trigger documentation-audit
Best Practices
- Treat API docs as a source of truth; commit docs changes with code
- Run a local doc-sync check after making API changes
- Update OpenAPI/Swagger in the same PR as code changes
- Use consistent endpoint extraction and comparison between code and docs
- If drift is detected, pause work immediately and run documentation-audit
Example Use Cases
- Added GET /users in routes/users.ts and updated openapi.yaml accordingly
- Changed UserCreate DTO in dto/user.dto.ts and reflected changes in schema and openapi.json
- Updated FastAPI router in api/users.py and added the endpoint to openapi.yaml
- Drift detected after adding a new route; work paused until docs are fixed via documentation-audit
- Documentation file missing for a new API; api-documentation paused and triggered documentation-audit