Files
gh-epieczko-betty/skills/api.define/SKILL.md
2025-11-29 18:26:08 +08:00

232 lines
5.5 KiB
Markdown

# api.define
## Overview
**api.define** scaffolds OpenAPI and AsyncAPI specifications from enterprise-compliant templates, generating production-ready API contracts with best practices built-in.
## Purpose
Quickly create API specifications that follow enterprise guidelines:
- Generate Zalando-compliant OpenAPI 3.1 specs
- Generate AsyncAPI 3.0 specs for event-driven APIs
- Include proper error handling (RFC 7807 Problem JSON)
- Use correct naming conventions (snake_case)
- Include required metadata and security schemes
## Usage
### Basic Usage
```bash
python skills/api.define/api_define.py <service_name> [spec_type] [options]
```
### Parameters
| Parameter | Required | Description | Default |
|-----------|----------|-------------|---------|
| `service_name` | Yes | Service/API name | - |
| `spec_type` | No | openapi or asyncapi | `openapi` |
| `--template` | No | Template name | `zalando` |
| `--output-dir` | No | Output directory | `specs` |
| `--version` | No | API version | `1.0.0` |
## Examples
### Example 1: Create Zalando-Compliant OpenAPI Spec
```bash
python skills/api.define/api_define.py user-service openapi --template=zalando
```
**Output**: `specs/user-service.openapi.yaml`
Generated spec includes:
- ✅ Required Zalando metadata (`x-api-id`, `x-audience`)
- ✅ CRUD operations for users resource
- ✅ RFC 7807 Problem JSON for errors
- ✅ snake_case property names
- ✅ X-Flow-ID headers for tracing
- ✅ Proper HTTP status codes
- ✅ JWT authentication scheme
### Example 2: Create AsyncAPI Spec
```bash
python skills/api.define/api_define.py user-service asyncapi
```
**Output**: `specs/user-service.asyncapi.yaml`
Generated spec includes:
- ✅ Lifecycle events (created, updated, deleted)
- ✅ Kafka channel definitions
- ✅ Event payload schemas
- ✅ Publish/subscribe operations
### Example 3: Custom Output Directory
```bash
python skills/api.define/api_define.py order-api openapi \
--output-dir=api-specs \
--version=2.0.0
```
## Generated OpenAPI Structure
For a service named `user-service`, the generated OpenAPI spec includes:
**Paths**:
- `GET /users` - List users with pagination
- `POST /users` - Create new user
- `GET /users/{user_id}` - Get user by ID
- `PUT /users/{user_id}` - Update user
- `DELETE /users/{user_id}` - Delete user
**Schemas**:
- `User` - Main resource schema
- `UserCreate` - Creation payload schema
- `UserUpdate` - Update payload schema
- `Pagination` - Pagination metadata
- `Problem` - RFC 7807 error schema
**Responses**:
- `200` - Success (with X-Flow-ID header)
- `201` - Created (with Location and X-Flow-ID headers)
- `204` - No Content (for deletes)
- `400` - Bad Request (application/problem+json)
- `404` - Not Found (application/problem+json)
- `409` - Conflict (application/problem+json)
- `500` - Internal Error (application/problem+json)
**Security**:
- Bearer token authentication (JWT)
**Required Metadata**:
- `x-api-id` - Unique UUID
- `x-audience` - Target audience (company-internal)
- `contact` - Team contact information
## Resource Name Extraction
The skill automatically extracts resource names from service names:
| Service Name | Resource | Plural |
|--------------|----------|--------|
| `user-service` | user | users |
| `order-api` | order | orders |
| `payment-gateway` | payment | payments |
## Naming Conventions
The skill automatically applies proper naming:
| Context | Convention | Example |
|---------|------------|---------|
| Paths | kebab-case | `/user-profiles` |
| Properties | snake_case | `user_id` |
| Schemas | TitleCase | `UserProfile` |
| Operations | camelCase | `getUserById` |
## Integration with api.validate
The generated specs are designed to pass `api.validate` with zero errors:
```bash
# Generate spec
python skills/api.define/api_define.py user-service
# Validate (should pass)
python skills/api.validate/api_validate.py specs/user-service.openapi.yaml zalando
```
## Use in Workflows
```yaml
# workflows/api_first_development.yaml
steps:
- skill: api.define
args:
- "user-service"
- "openapi"
- "--template=zalando"
output: spec_path
- skill: api.validate
args:
- "{spec_path}"
- "zalando"
required: true
```
## Customization
After generation, customize the spec:
1. **Add properties** to schemas:
```yaml
User:
properties:
user_id: ...
email: # Add this
type: string
format: email
```
2. **Add operations**:
```yaml
/users/search: # Add new endpoint
post:
summary: Search users
```
3. **Modify metadata**:
```yaml
info:
contact:
name: Your Team Name # Update this
email: team@company.com
```
## Output
### Success Response
```json
{
"status": "success",
"data": {
"spec_path": "specs/user-service.openapi.yaml",
"spec_content": {...},
"api_id": "d0184f38-b98d-11e7-9c56-68f728c1ba70",
"template_used": "zalando",
"service_name": "user-service"
}
}
```
## Dependencies
- **PyYAML**: Required for YAML handling
```bash
pip install pyyaml
```
## Templates
| Template | Spec Type | Description |
|----------|-----------|-------------|
| `zalando` | OpenAPI | Zalando-compliant with all required fields |
| `basic` | AsyncAPI | Basic event-driven API structure |
## See Also
- [api.validate](../api.validate/SKILL.md) - Validate generated specs
- [hook.define](../hook.define/SKILL.md) - Set up automatic validation
- [Betty Architecture](../../docs/betty-architecture.md) - Five-layer model
- [API-Driven Development](../../docs/api-driven-development.md) - Complete guide
## Version
**0.1.0** - Initial implementation with Zalando template support