agent-md-refactor
Refactor bloated AGENTS.md, CLAUDE.md, or similar agent instruction files to follow…
Converts OpenAPI 3.0 JSON/YAML to TypeScript interfaces and type guards. This skill should be used when the user asks to generate types from OpenAPI, convert schema to TS, create API interfaces, or generate TypeScript types from an API specification.
$ npx -y skills add softaworks/agent-toolkit --skill openapi-to-typescript --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/openapi-to-typescriptContext preview
The summary Claude sees to decide when to auto-load this skill.
Converts OpenAPI 3.0 JSON/YAML to TypeScript interfaces and type guards. This skill should be used when the user asks to generate types from OpenAPI, convert schema to TS, create API interfaces, or generate TypeScript types from an API specification.
name: openapi-to-typescript description: Converts OpenAPI 3.0 JSON/YAML to TypeScript interfaces and type guards. This skill should be used when the user asks to generate types from OpenAPI, convert schema to TS, create API interfaces, or generate TypeScript types from an API specification.
Converts OpenAPI 3.0 specifications to TypeScript interfaces and type guards.
**Input:** OpenAPI file (JSON or YAML) **Output:** TypeScript file with interfaces and type guards
1. Request the OpenAPI file path (if not provided) 2. Read and validate the file (must be OpenAPI 3.0.x) 3. Extract schemas from `components/schemas` 4. Extract endpoints from `paths` (request/response types) 5. Generate TypeScript (interfaces + type guards) 6. Ask where to save (default: `types/api.ts` in current directory) 7. Write the file
Check before processing:
- Field "openapi" must exist and start with "3.0" - Field "paths" must exist - Field "components.schemas" must exist (if there are types)
If invalid, report the error and stop.
| OpenAPI | TypeScript | |-------------|--------------| | `string` | `string` | | `number` | `number` | | `integer` | `number` | | `boolean` | `boolean` | | `null` | `null` |
| Format | TypeScript | |---------------|-------------------------| | `uuid` | `string` (comment UUID) | | `date` | `string` (comment date) | | `date-time` | `string` (comment ISO) | | `email` | `string` (comment email)| | `uri` | `string` (comment URI) |
**Object:**
// OpenAPI: type: object, properties: {id, name}, required: [id]
interface Example {
id: string; // required: no ?
name?: string; // optional: with ?
}**Array:**
// OpenAPI: type: array, items: {type: string}
type Names = string[];**Enum:**
// OpenAPI: type: string, enum: [active, draft] type Status = "active" | "draft";
**oneOf (Union):**
// OpenAPI: oneOf: [{$ref: Cat}, {$ref: Dog}]
type Pet = Cat | Dog;**allOf (Intersection/Extends):**
// OpenAPI: allOf: [{$ref: Base}, {type: object, properties: ...}]
interface Extended extends Base {
extraField: string;
}/**
* Auto-generated from: {source_file}
* Generated at: {timestamp}
*
* DO NOT EDIT MANUALLY - Regenerate from OpenAPI schema
*/For each schema in `components/schemas`:
export interface Product {
/** Product unique identifier */
id: string;
/** Product title */
title: string;
/** Product price */
price: number;
/** Created timestamp */
created_at?: string;
}For each endpoint in `paths`:
// GET /products - query params
export interface GetProductsRequest {
page?: number;
limit?: number;
}
// GET /products - response 200
export type GetProductsResponse = ProductList;
// POST /products - request body
export interface CreateProductRequest {
title: string;
price: number;
}
// POST /products - response 201
export type CreateProductResponse = Product;Naming convention:
For each main interface, generate a type guard:
export function isProduct(value: unknown): value is Product {
return (
typeof value === 'object' &&
value !== null &&
'id' in value &&
typeof (value as any).id === 'string' &&
'title' in value &&
typeof (value as any).title === 'string' &&
'price' in value &&
typeof (value as any).price === 'number'
);
}Type guard rules:
export interface ApiError {
status: number;
error: string;
detail?: string;
}
export function isApiError(value: unknown): value is ApiError {
return (
typeof value === 'object' &&
value !== null &&
'status' in value &&
typeof (value as any).status === 'number' &&
'error' in value &&
typeof (value as any).error === 'string'
);
}When encountering `{"$ref": "#/components/schemas/Product"}`: 1. Extract the schema name (`Product`) 2. Use the type directly (don't resolve inline)
// OpenAPI: items: {$ref: "#/components/schemas/Product"}
// TypeScript:
items: Product[] // reference, not inline**Input (OpenAPI):**
{
"openapi": "3.0.0",
"components": {
"schemas": {
"User": {
"type": "object",
"properties": {
"id": {"type": "string", "format": "uuid"},
"email": {"type": "string", "format": "email"},
"role": {"type": "string", "enum": ["admin", "user"]}
},
"required": ["id", "email", "role"]
}
}
},
"paths": {
"/users/{id}": {
"get": {
"parameters": [{"name": "id", "in": "path", "required": true}],
"responses": {
"200": {
"content": {
"application/json": {
"schema": {"$ref": "#/components/schemas/User"}
}
}
}
}
}
}
}
}**Output (TypeScript):**
/** * Auto-generated from: api.openapi.json * Generated at: 2025-01-15T
Opinionated skills shared by @leonardocouy for improving daily work efficiency with Claude Code. Skills are packaged instructions and scripts that extend agent capabilities across development, documentation, planning, and professional workflows.
Repo: softaworks/agent-toolkit
Refactor bloated AGENTS.md, CLAUDE.md, or similar agent instruction files to follow…
Create API handoff documentation for frontend developers. Use when backend work is complete…
Generate architecture documentation using C4 model Mermaid diagrams. Use when asked to create…
Use when the user asks to run Codex CLI (codex exec, codex resume) or references OpenAI Codex…
This skill should be used when creating a Claude Code slash command. Use when users ask to…
Create high-quality git commits: review/stage intended changes, split into logical commits,…