rails_claude_skills 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.github/ISSUE_TEMPLATE/bug_report.yml +134 -0
- data/.github/ISSUE_TEMPLATE/config.yml +11 -0
- data/.github/ISSUE_TEMPLATE/feature_request.yml +129 -0
- data/.github/ISSUE_TEMPLATE/question.yml +90 -0
- data/.github/dependabot.yml +19 -0
- data/.github/workflows/ci.yml +77 -0
- data/.github/workflows/release.yml +66 -0
- data/.rubocop.yml +52 -0
- data/CHANGELOG.md +94 -0
- data/CLAUDE.md +332 -0
- data/CODE_OF_CONDUCT.md +134 -0
- data/CONTRIBUTING.md +580 -0
- data/LICENSE.txt +21 -0
- data/README.md +544 -0
- data/Rakefile +8 -0
- data/lib/generators/claude/agent/agent_generator.rb +71 -0
- data/lib/generators/claude/agent/templates/agent.md.tt +62 -0
- data/lib/generators/claude/command/command_generator.rb +50 -0
- data/lib/generators/claude/command/templates/command.md.tt +28 -0
- data/lib/generators/claude/commands_library/create-pr.md +27 -0
- data/lib/generators/claude/commands_library/dbchange.md +19 -0
- data/lib/generators/claude/commands_library/quality.md +20 -0
- data/lib/generators/claude/commands_library/stimulus.md +19 -0
- data/lib/generators/claude/commands_library/turbo-feature.md +17 -0
- data/lib/generators/claude/install/install_generator.rb +211 -0
- data/lib/generators/claude/install/templates/README.md.tt +59 -0
- data/lib/generators/claude/install/templates/USAGE +28 -0
- data/lib/generators/claude/install/templates/agents/api-dev.md.tt +46 -0
- data/lib/generators/claude/install/templates/agents/fullstack-dev.md.tt +48 -0
- data/lib/generators/claude/install/templates/agents/rails-developer.md.tt +40 -0
- data/lib/generators/claude/install/templates/settings.local.json.tt +13 -0
- data/lib/generators/claude/rule/rule_generator.rb +175 -0
- data/lib/generators/claude/rule/templates/rule.md.tt +7 -0
- data/lib/generators/claude/rules_library/code-style.md +37 -0
- data/lib/generators/claude/rules_library/database.md +47 -0
- data/lib/generators/claude/rules_library/hotwire.md +56 -0
- data/lib/generators/claude/rules_library/security.md +54 -0
- data/lib/generators/claude/rules_library/testing.md +47 -0
- data/lib/generators/claude/skill/skill_generator.rb +196 -0
- data/lib/generators/claude/skill/templates/SKILL.md.tt +27 -0
- data/lib/generators/claude/skills_library/create-task-files/SKILL.md +311 -0
- data/lib/generators/claude/skills_library/create-task-files/templates/bug.md +60 -0
- data/lib/generators/claude/skills_library/create-task-files/templates/epic.md +47 -0
- data/lib/generators/claude/skills_library/create-task-files/templates/issue.md +45 -0
- data/lib/generators/claude/skills_library/create-task-files/templates/user-story.md +57 -0
- data/lib/generators/claude/skills_library/minitest-testing/SKILL.md +398 -0
- data/lib/generators/claude/skills_library/minitest-testing/references/examples.md +889 -0
- data/lib/generators/claude/skills_library/plan-feature/SKILL.md +253 -0
- data/lib/generators/claude/skills_library/rails-api-controllers/SKILL.md +1041 -0
- data/lib/generators/claude/skills_library/rails-api-controllers/references/api-documentation.md +422 -0
- data/lib/generators/claude/skills_library/rails-api-controllers/references/serialization.md +456 -0
- data/lib/generators/claude/skills_library/rails-auth-with-devise/SKILL.md +191 -0
- data/lib/generators/claude/skills_library/rails-auth-with-devise/references/advanced.md +331 -0
- data/lib/generators/claude/skills_library/rails-auth-with-devise/references/api-auth.md +266 -0
- data/lib/generators/claude/skills_library/rails-auth-with-devise/references/omniauth.md +194 -0
- data/lib/generators/claude/skills_library/rails-authorization-cancancan/SKILL.md +603 -0
- data/lib/generators/claude/skills_library/rails-authorization-cancancan/references/api-authorization.md +543 -0
- data/lib/generators/claude/skills_library/rails-authorization-cancancan/references/complex-permissions.md +572 -0
- data/lib/generators/claude/skills_library/rails-authorization-cancancan/references/multi-tenancy.md +373 -0
- data/lib/generators/claude/skills_library/rails-controllers/SKILL.md +514 -0
- data/lib/generators/claude/skills_library/rails-debugging/SKILL.md +260 -0
- data/lib/generators/claude/skills_library/rails-deployment/SKILL.md +437 -0
- data/lib/generators/claude/skills_library/rails-deployment/references/examples.md +901 -0
- data/lib/generators/claude/skills_library/rails-hotwire/SKILL.md +367 -0
- data/lib/generators/claude/skills_library/rails-jobs/MISSION_CONTROL_SETUP.md +639 -0
- data/lib/generators/claude/skills_library/rails-jobs/SKILL.md +704 -0
- data/lib/generators/claude/skills_library/rails-mailers/SKILL.md +549 -0
- data/lib/generators/claude/skills_library/rails-models/SKILL.md +379 -0
- data/lib/generators/claude/skills_library/rails-pagination-kaminari/SKILL.md +622 -0
- data/lib/generators/claude/skills_library/rails-pagination-kaminari/references/api-pagination.md +523 -0
- data/lib/generators/claude/skills_library/rails-pagination-kaminari/references/custom-themes.md +498 -0
- data/lib/generators/claude/skills_library/rails-pagination-kaminari/references/performance.md +478 -0
- data/lib/generators/claude/skills_library/rails-views/SKILL.md +508 -0
- data/lib/generators/claude/skills_library/refine-requirements/SKILL.md +226 -0
- data/lib/generators/claude/skills_library/refine-requirements/references/examples.md +344 -0
- data/lib/generators/claude/skills_library/refine-requirements/references/reference.md +298 -0
- data/lib/generators/claude/skills_library/rspec-testing/SKILL.md +572 -0
- data/lib/generators/claude/skills_library/rspec-testing/references/better_specs_guide.md +273 -0
- data/lib/generators/claude/skills_library/rspec-testing/references/thoughtbot_patterns.md +407 -0
- data/lib/generators/claude/skills_library/tailwindcss/SKILL.md +371 -0
- data/lib/generators/claude/views/views_generator.rb +113 -0
- data/lib/rails_claude_skills/railtie.rb +16 -0
- data/lib/rails_claude_skills/version.rb +5 -0
- data/lib/rails_claude_skills.rb +27 -0
- data/sig/rails_claude_skills.rbs +4 -0
- metadata +199 -0
data/lib/generators/claude/skills_library/rails-api-controllers/references/api-documentation.md
ADDED
|
@@ -0,0 +1,422 @@
|
|
|
1
|
+
# API Documentation with OpenAPI/Swagger
|
|
2
|
+
|
|
3
|
+
Generate interactive API documentation automatically using Rswag or other OpenAPI tools.
|
|
4
|
+
|
|
5
|
+
## Rswag Setup
|
|
6
|
+
|
|
7
|
+
Rswag integrates OpenAPI (Swagger) documentation with RSpec tests, keeping docs in sync with implementation.
|
|
8
|
+
|
|
9
|
+
### Installation
|
|
10
|
+
|
|
11
|
+
```ruby
|
|
12
|
+
# Gemfile
|
|
13
|
+
group :development, :test do
|
|
14
|
+
gem 'rswag'
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# Install
|
|
18
|
+
bundle install
|
|
19
|
+
rails g rswag:install
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
This creates:
|
|
23
|
+
- `spec/swagger_helper.rb` - OpenAPI configuration
|
|
24
|
+
- `swagger/v1/swagger.yaml` - Generated API spec
|
|
25
|
+
- Swagger UI at `/api-docs`
|
|
26
|
+
|
|
27
|
+
### Configuration
|
|
28
|
+
|
|
29
|
+
```ruby
|
|
30
|
+
# spec/swagger_helper.rb
|
|
31
|
+
RSpec.configure do |config|
|
|
32
|
+
config.swagger_root = Rails.root.join('swagger').to_s
|
|
33
|
+
|
|
34
|
+
config.swagger_docs = {
|
|
35
|
+
'v1/swagger.yaml' => {
|
|
36
|
+
openapi: '3.0.1',
|
|
37
|
+
info: {
|
|
38
|
+
title: 'My API V1',
|
|
39
|
+
version: 'v1',
|
|
40
|
+
description: 'RESTful API for MyApp'
|
|
41
|
+
},
|
|
42
|
+
paths: {},
|
|
43
|
+
servers: [
|
|
44
|
+
{
|
|
45
|
+
url: 'https://api.example.com',
|
|
46
|
+
description: 'Production'
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
url: 'http://localhost:3000',
|
|
50
|
+
description: 'Development'
|
|
51
|
+
}
|
|
52
|
+
],
|
|
53
|
+
components: {
|
|
54
|
+
securitySchemes: {
|
|
55
|
+
bearer_auth: {
|
|
56
|
+
type: :http,
|
|
57
|
+
scheme: :bearer,
|
|
58
|
+
bearerFormat: 'JWT'
|
|
59
|
+
},
|
|
60
|
+
api_token: {
|
|
61
|
+
type: :apiKey,
|
|
62
|
+
name: 'Authorization',
|
|
63
|
+
in: :header
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
config.swagger_format = :yaml
|
|
71
|
+
end
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
## Writing API Specs with Rswag
|
|
75
|
+
|
|
76
|
+
Document endpoints using RSpec integration tests:
|
|
77
|
+
|
|
78
|
+
### Basic Endpoint Documentation
|
|
79
|
+
|
|
80
|
+
```ruby
|
|
81
|
+
# spec/requests/api/v1/articles_spec.rb
|
|
82
|
+
require 'swagger_helper'
|
|
83
|
+
|
|
84
|
+
RSpec.describe 'Api::V1::Articles', type: :request do
|
|
85
|
+
path '/api/v1/articles' do
|
|
86
|
+
get 'List all articles' do
|
|
87
|
+
tags 'Articles'
|
|
88
|
+
produces 'application/json'
|
|
89
|
+
security [{ bearer_auth: [] }]
|
|
90
|
+
|
|
91
|
+
parameter name: :page, in: :query, type: :integer, required: false,
|
|
92
|
+
description: 'Page number'
|
|
93
|
+
parameter name: :per_page, in: :query, type: :integer, required: false,
|
|
94
|
+
description: 'Items per page'
|
|
95
|
+
parameter name: :status, in: :query, type: :string, required: false,
|
|
96
|
+
description: 'Filter by status', enum: ['draft', 'published', 'archived']
|
|
97
|
+
|
|
98
|
+
response '200', 'articles found' do
|
|
99
|
+
schema type: :object,
|
|
100
|
+
properties: {
|
|
101
|
+
data: {
|
|
102
|
+
type: :array,
|
|
103
|
+
items: {
|
|
104
|
+
type: :object,
|
|
105
|
+
properties: {
|
|
106
|
+
id: { type: :integer },
|
|
107
|
+
title: { type: :string },
|
|
108
|
+
body: { type: :string },
|
|
109
|
+
status: { type: :string },
|
|
110
|
+
created_at: { type: :string, format: :datetime }
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
},
|
|
114
|
+
meta: {
|
|
115
|
+
type: :object,
|
|
116
|
+
properties: {
|
|
117
|
+
current_page: { type: :integer },
|
|
118
|
+
total_pages: { type: :integer },
|
|
119
|
+
total_count: { type: :integer }
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
let(:Authorization) { "Bearer #{user.api_token}" }
|
|
125
|
+
|
|
126
|
+
run_test! do |response|
|
|
127
|
+
data = JSON.parse(response.body)
|
|
128
|
+
expect(data['data']).to be_an(Array)
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
response '401', 'unauthorized' do
|
|
133
|
+
schema type: :object,
|
|
134
|
+
properties: {
|
|
135
|
+
error: { type: :string }
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
let(:Authorization) { 'Bearer invalid_token' }
|
|
139
|
+
run_test!
|
|
140
|
+
end
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
post 'Create an article' do
|
|
144
|
+
tags 'Articles'
|
|
145
|
+
consumes 'application/json'
|
|
146
|
+
produces 'application/json'
|
|
147
|
+
security [{ bearer_auth: [] }]
|
|
148
|
+
|
|
149
|
+
parameter name: :article, in: :body, schema: {
|
|
150
|
+
type: :object,
|
|
151
|
+
properties: {
|
|
152
|
+
article: {
|
|
153
|
+
type: :object,
|
|
154
|
+
properties: {
|
|
155
|
+
title: { type: :string },
|
|
156
|
+
body: { type: :string },
|
|
157
|
+
status: { type: :string, enum: ['draft', 'published'] }
|
|
158
|
+
},
|
|
159
|
+
required: ['title', 'body']
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
response '201', 'article created' do
|
|
165
|
+
schema type: :object,
|
|
166
|
+
properties: {
|
|
167
|
+
id: { type: :integer },
|
|
168
|
+
title: { type: :string },
|
|
169
|
+
body: { type: :string },
|
|
170
|
+
status: { type: :string }
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
let(:Authorization) { "Bearer #{user.api_token}" }
|
|
174
|
+
let(:article) { { article: { title: 'Test', body: 'Content' } } }
|
|
175
|
+
|
|
176
|
+
run_test!
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
response '422', 'invalid request' do
|
|
180
|
+
schema type: :object,
|
|
181
|
+
properties: {
|
|
182
|
+
error: { type: :string },
|
|
183
|
+
details: { type: :array, items: { type: :string } }
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
let(:Authorization) { "Bearer #{user.api_token}" }
|
|
187
|
+
let(:article) { { article: { title: '' } } }
|
|
188
|
+
|
|
189
|
+
run_test!
|
|
190
|
+
end
|
|
191
|
+
end
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
path '/api/v1/articles/{id}' do
|
|
195
|
+
parameter name: :id, in: :path, type: :integer, description: 'Article ID'
|
|
196
|
+
|
|
197
|
+
get 'Show an article' do
|
|
198
|
+
tags 'Articles'
|
|
199
|
+
produces 'application/json'
|
|
200
|
+
security [{ bearer_auth: [] }]
|
|
201
|
+
|
|
202
|
+
response '200', 'article found' do
|
|
203
|
+
schema type: :object,
|
|
204
|
+
properties: {
|
|
205
|
+
id: { type: :integer },
|
|
206
|
+
title: { type: :string },
|
|
207
|
+
body: { type: :string },
|
|
208
|
+
status: { type: :string },
|
|
209
|
+
author: {
|
|
210
|
+
type: :object,
|
|
211
|
+
properties: {
|
|
212
|
+
id: { type: :integer },
|
|
213
|
+
name: { type: :string }
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
let(:id) { article.id }
|
|
219
|
+
let(:Authorization) { "Bearer #{user.api_token}" }
|
|
220
|
+
|
|
221
|
+
run_test!
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
response '404', 'article not found' do
|
|
225
|
+
let(:id) { 'invalid' }
|
|
226
|
+
let(:Authorization) { "Bearer #{user.api_token}" }
|
|
227
|
+
|
|
228
|
+
run_test!
|
|
229
|
+
end
|
|
230
|
+
end
|
|
231
|
+
|
|
232
|
+
delete 'Delete an article' do
|
|
233
|
+
tags 'Articles'
|
|
234
|
+
security [{ bearer_auth: [] }]
|
|
235
|
+
|
|
236
|
+
response '204', 'article deleted' do
|
|
237
|
+
let(:id) { article.id }
|
|
238
|
+
let(:Authorization) { "Bearer #{user.api_token}" }
|
|
239
|
+
|
|
240
|
+
run_test!
|
|
241
|
+
end
|
|
242
|
+
end
|
|
243
|
+
end
|
|
244
|
+
end
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
## Generating Documentation
|
|
248
|
+
|
|
249
|
+
```bash
|
|
250
|
+
# Generate OpenAPI spec from tests
|
|
251
|
+
rake rswag:specs:swaggerize
|
|
252
|
+
|
|
253
|
+
# This generates swagger/v1/swagger.yaml
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
## Accessing Documentation
|
|
257
|
+
|
|
258
|
+
**Swagger UI:**
|
|
259
|
+
- Development: `http://localhost:3000/api-docs`
|
|
260
|
+
- Production: `https://api.example.com/api-docs`
|
|
261
|
+
|
|
262
|
+
Interactive UI allows:
|
|
263
|
+
- Browsing all endpoints
|
|
264
|
+
- Trying out requests
|
|
265
|
+
- Viewing request/response schemas
|
|
266
|
+
- Testing authentication
|
|
267
|
+
|
|
268
|
+
## Shared Schemas
|
|
269
|
+
|
|
270
|
+
Define reusable schemas:
|
|
271
|
+
|
|
272
|
+
```ruby
|
|
273
|
+
# spec/swagger_helper.rb
|
|
274
|
+
config.swagger_docs = {
|
|
275
|
+
'v1/swagger.yaml' => {
|
|
276
|
+
# ... other config ...
|
|
277
|
+
components: {
|
|
278
|
+
schemas: {
|
|
279
|
+
Article: {
|
|
280
|
+
type: :object,
|
|
281
|
+
properties: {
|
|
282
|
+
id: { type: :integer },
|
|
283
|
+
title: { type: :string },
|
|
284
|
+
body: { type: :string },
|
|
285
|
+
status: { type: :string, enum: ['draft', 'published', 'archived'] },
|
|
286
|
+
created_at: { type: :string, format: :datetime },
|
|
287
|
+
updated_at: { type: :string, format: :datetime }
|
|
288
|
+
},
|
|
289
|
+
required: ['title', 'body']
|
|
290
|
+
},
|
|
291
|
+
Error: {
|
|
292
|
+
type: :object,
|
|
293
|
+
properties: {
|
|
294
|
+
error: { type: :string },
|
|
295
|
+
details: { type: :array, items: { type: :string } }
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
# Use in specs
|
|
304
|
+
response '200', 'success' do
|
|
305
|
+
schema '$ref' => '#/components/schemas/Article'
|
|
306
|
+
run_test!
|
|
307
|
+
end
|
|
308
|
+
|
|
309
|
+
response '422', 'validation error' do
|
|
310
|
+
schema '$ref' => '#/components/schemas/Error'
|
|
311
|
+
run_test!
|
|
312
|
+
end
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
## Best Practices
|
|
316
|
+
|
|
317
|
+
1. **Keep Tests as Documentation**
|
|
318
|
+
- Rswag tests serve dual purpose: testing and documentation
|
|
319
|
+
- Every endpoint should have at least one documented test
|
|
320
|
+
|
|
321
|
+
2. **Document All Responses**
|
|
322
|
+
- Include success (200, 201, 204)
|
|
323
|
+
- Include errors (400, 401, 403, 404, 422, 500)
|
|
324
|
+
- Define response schemas
|
|
325
|
+
|
|
326
|
+
3. **Use Examples**
|
|
327
|
+
```ruby
|
|
328
|
+
response '200', 'success' do
|
|
329
|
+
schema type: :object,
|
|
330
|
+
properties: { name: { type: :string } },
|
|
331
|
+
example: { name: 'John Doe' }
|
|
332
|
+
run_test!
|
|
333
|
+
end
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
4. **Tag Endpoints**
|
|
337
|
+
- Group related endpoints with tags
|
|
338
|
+
- Tags become sections in Swagger UI
|
|
339
|
+
|
|
340
|
+
5. **Security Schemes**
|
|
341
|
+
- Document authentication requirements
|
|
342
|
+
- Show how to authenticate in Swagger UI
|
|
343
|
+
|
|
344
|
+
## Alternative: Blueprint/OpenAPI Generator
|
|
345
|
+
|
|
346
|
+
For non-test-based documentation:
|
|
347
|
+
|
|
348
|
+
```ruby
|
|
349
|
+
# Gemfile
|
|
350
|
+
gem 'rspec-openapi'
|
|
351
|
+
|
|
352
|
+
# Generate OpenAPI from request specs
|
|
353
|
+
OPENAPI=1 rspec spec/requests
|
|
354
|
+
```
|
|
355
|
+
|
|
356
|
+
## Publishing Documentation
|
|
357
|
+
|
|
358
|
+
### Static Site
|
|
359
|
+
|
|
360
|
+
```bash
|
|
361
|
+
# Generate static HTML
|
|
362
|
+
docker run -v $(pwd)/swagger:/swagger \
|
|
363
|
+
swaggerapi/swagger-ui \
|
|
364
|
+
swagger-ui-cli bundle /swagger/v1/swagger.yaml
|
|
365
|
+
|
|
366
|
+
# Serve static files
|
|
367
|
+
```
|
|
368
|
+
|
|
369
|
+
### Documentation Hosting
|
|
370
|
+
|
|
371
|
+
- **SwaggerHub**: Upload OpenAPI spec
|
|
372
|
+
- **Readme.io**: Import OpenAPI spec
|
|
373
|
+
- **Postman**: Import for collection testing
|
|
374
|
+
|
|
375
|
+
## Example Output
|
|
376
|
+
|
|
377
|
+
After running `rake rswag:specs:swaggerize`, you get:
|
|
378
|
+
|
|
379
|
+
```yaml
|
|
380
|
+
# swagger/v1/swagger.yaml
|
|
381
|
+
openapi: 3.0.1
|
|
382
|
+
info:
|
|
383
|
+
title: My API V1
|
|
384
|
+
version: v1
|
|
385
|
+
paths:
|
|
386
|
+
/api/v1/articles:
|
|
387
|
+
get:
|
|
388
|
+
summary: List all articles
|
|
389
|
+
tags:
|
|
390
|
+
- Articles
|
|
391
|
+
security:
|
|
392
|
+
- bearer_auth: []
|
|
393
|
+
parameters:
|
|
394
|
+
- name: page
|
|
395
|
+
in: query
|
|
396
|
+
required: false
|
|
397
|
+
schema:
|
|
398
|
+
type: integer
|
|
399
|
+
responses:
|
|
400
|
+
'200':
|
|
401
|
+
description: articles found
|
|
402
|
+
content:
|
|
403
|
+
application/json:
|
|
404
|
+
schema:
|
|
405
|
+
type: object
|
|
406
|
+
properties:
|
|
407
|
+
data:
|
|
408
|
+
type: array
|
|
409
|
+
items:
|
|
410
|
+
type: object
|
|
411
|
+
properties:
|
|
412
|
+
id:
|
|
413
|
+
type: integer
|
|
414
|
+
title:
|
|
415
|
+
type: string
|
|
416
|
+
```
|
|
417
|
+
|
|
418
|
+
This YAML can be:
|
|
419
|
+
- Viewed in Swagger UI
|
|
420
|
+
- Imported into Postman
|
|
421
|
+
- Used by API clients for code generation
|
|
422
|
+
- Shared with frontend developers
|