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.
Files changed (87) hide show
  1. checksums.yaml +7 -0
  2. data/.github/ISSUE_TEMPLATE/bug_report.yml +134 -0
  3. data/.github/ISSUE_TEMPLATE/config.yml +11 -0
  4. data/.github/ISSUE_TEMPLATE/feature_request.yml +129 -0
  5. data/.github/ISSUE_TEMPLATE/question.yml +90 -0
  6. data/.github/dependabot.yml +19 -0
  7. data/.github/workflows/ci.yml +77 -0
  8. data/.github/workflows/release.yml +66 -0
  9. data/.rubocop.yml +52 -0
  10. data/CHANGELOG.md +94 -0
  11. data/CLAUDE.md +332 -0
  12. data/CODE_OF_CONDUCT.md +134 -0
  13. data/CONTRIBUTING.md +580 -0
  14. data/LICENSE.txt +21 -0
  15. data/README.md +544 -0
  16. data/Rakefile +8 -0
  17. data/lib/generators/claude/agent/agent_generator.rb +71 -0
  18. data/lib/generators/claude/agent/templates/agent.md.tt +62 -0
  19. data/lib/generators/claude/command/command_generator.rb +50 -0
  20. data/lib/generators/claude/command/templates/command.md.tt +28 -0
  21. data/lib/generators/claude/commands_library/create-pr.md +27 -0
  22. data/lib/generators/claude/commands_library/dbchange.md +19 -0
  23. data/lib/generators/claude/commands_library/quality.md +20 -0
  24. data/lib/generators/claude/commands_library/stimulus.md +19 -0
  25. data/lib/generators/claude/commands_library/turbo-feature.md +17 -0
  26. data/lib/generators/claude/install/install_generator.rb +211 -0
  27. data/lib/generators/claude/install/templates/README.md.tt +59 -0
  28. data/lib/generators/claude/install/templates/USAGE +28 -0
  29. data/lib/generators/claude/install/templates/agents/api-dev.md.tt +46 -0
  30. data/lib/generators/claude/install/templates/agents/fullstack-dev.md.tt +48 -0
  31. data/lib/generators/claude/install/templates/agents/rails-developer.md.tt +40 -0
  32. data/lib/generators/claude/install/templates/settings.local.json.tt +13 -0
  33. data/lib/generators/claude/rule/rule_generator.rb +175 -0
  34. data/lib/generators/claude/rule/templates/rule.md.tt +7 -0
  35. data/lib/generators/claude/rules_library/code-style.md +37 -0
  36. data/lib/generators/claude/rules_library/database.md +47 -0
  37. data/lib/generators/claude/rules_library/hotwire.md +56 -0
  38. data/lib/generators/claude/rules_library/security.md +54 -0
  39. data/lib/generators/claude/rules_library/testing.md +47 -0
  40. data/lib/generators/claude/skill/skill_generator.rb +196 -0
  41. data/lib/generators/claude/skill/templates/SKILL.md.tt +27 -0
  42. data/lib/generators/claude/skills_library/create-task-files/SKILL.md +311 -0
  43. data/lib/generators/claude/skills_library/create-task-files/templates/bug.md +60 -0
  44. data/lib/generators/claude/skills_library/create-task-files/templates/epic.md +47 -0
  45. data/lib/generators/claude/skills_library/create-task-files/templates/issue.md +45 -0
  46. data/lib/generators/claude/skills_library/create-task-files/templates/user-story.md +57 -0
  47. data/lib/generators/claude/skills_library/minitest-testing/SKILL.md +398 -0
  48. data/lib/generators/claude/skills_library/minitest-testing/references/examples.md +889 -0
  49. data/lib/generators/claude/skills_library/plan-feature/SKILL.md +253 -0
  50. data/lib/generators/claude/skills_library/rails-api-controllers/SKILL.md +1041 -0
  51. data/lib/generators/claude/skills_library/rails-api-controllers/references/api-documentation.md +422 -0
  52. data/lib/generators/claude/skills_library/rails-api-controllers/references/serialization.md +456 -0
  53. data/lib/generators/claude/skills_library/rails-auth-with-devise/SKILL.md +191 -0
  54. data/lib/generators/claude/skills_library/rails-auth-with-devise/references/advanced.md +331 -0
  55. data/lib/generators/claude/skills_library/rails-auth-with-devise/references/api-auth.md +266 -0
  56. data/lib/generators/claude/skills_library/rails-auth-with-devise/references/omniauth.md +194 -0
  57. data/lib/generators/claude/skills_library/rails-authorization-cancancan/SKILL.md +603 -0
  58. data/lib/generators/claude/skills_library/rails-authorization-cancancan/references/api-authorization.md +543 -0
  59. data/lib/generators/claude/skills_library/rails-authorization-cancancan/references/complex-permissions.md +572 -0
  60. data/lib/generators/claude/skills_library/rails-authorization-cancancan/references/multi-tenancy.md +373 -0
  61. data/lib/generators/claude/skills_library/rails-controllers/SKILL.md +514 -0
  62. data/lib/generators/claude/skills_library/rails-debugging/SKILL.md +260 -0
  63. data/lib/generators/claude/skills_library/rails-deployment/SKILL.md +437 -0
  64. data/lib/generators/claude/skills_library/rails-deployment/references/examples.md +901 -0
  65. data/lib/generators/claude/skills_library/rails-hotwire/SKILL.md +367 -0
  66. data/lib/generators/claude/skills_library/rails-jobs/MISSION_CONTROL_SETUP.md +639 -0
  67. data/lib/generators/claude/skills_library/rails-jobs/SKILL.md +704 -0
  68. data/lib/generators/claude/skills_library/rails-mailers/SKILL.md +549 -0
  69. data/lib/generators/claude/skills_library/rails-models/SKILL.md +379 -0
  70. data/lib/generators/claude/skills_library/rails-pagination-kaminari/SKILL.md +622 -0
  71. data/lib/generators/claude/skills_library/rails-pagination-kaminari/references/api-pagination.md +523 -0
  72. data/lib/generators/claude/skills_library/rails-pagination-kaminari/references/custom-themes.md +498 -0
  73. data/lib/generators/claude/skills_library/rails-pagination-kaminari/references/performance.md +478 -0
  74. data/lib/generators/claude/skills_library/rails-views/SKILL.md +508 -0
  75. data/lib/generators/claude/skills_library/refine-requirements/SKILL.md +226 -0
  76. data/lib/generators/claude/skills_library/refine-requirements/references/examples.md +344 -0
  77. data/lib/generators/claude/skills_library/refine-requirements/references/reference.md +298 -0
  78. data/lib/generators/claude/skills_library/rspec-testing/SKILL.md +572 -0
  79. data/lib/generators/claude/skills_library/rspec-testing/references/better_specs_guide.md +273 -0
  80. data/lib/generators/claude/skills_library/rspec-testing/references/thoughtbot_patterns.md +407 -0
  81. data/lib/generators/claude/skills_library/tailwindcss/SKILL.md +371 -0
  82. data/lib/generators/claude/views/views_generator.rb +113 -0
  83. data/lib/rails_claude_skills/railtie.rb +16 -0
  84. data/lib/rails_claude_skills/version.rb +5 -0
  85. data/lib/rails_claude_skills.rb +27 -0
  86. data/sig/rails_claude_skills.rbs +4 -0
  87. metadata +199 -0
@@ -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