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,371 @@
1
+ ---
2
+ name: tailwindcss
3
+ description: TailwindCSS utility-first styling for Rails
4
+ version: 1.0.0
5
+ rails_version: ">= 7.0"
6
+ tags:
7
+ - css
8
+ - tailwind
9
+ - styling
10
+ - frontend
11
+ ---
12
+
13
+ # TailwindCSS in Rails
14
+
15
+ ## Quick Reference
16
+
17
+ | Category | Classes |
18
+ |----------|---------|
19
+ | **Layout** | `flex`, `grid`, `container`, `mx-auto` |
20
+ | **Spacing** | `p-4`, `m-2`, `px-6`, `py-3`, `space-x-4` |
21
+ | **Typography** | `text-lg`, `font-bold`, `text-center`, `text-gray-700` |
22
+ | **Colors** | `bg-blue-500`, `text-white`, `border-gray-300` |
23
+ | **Sizing** | `w-full`, `h-64`, `max-w-md`, `min-h-screen` |
24
+ | **Flexbox** | `flex`, `items-center`, `justify-between` |
25
+ | **Grid** | `grid`, `grid-cols-3`, `gap-4` |
26
+ | **Responsive** | `md:flex`, `lg:grid-cols-4`, `sm:text-sm` |
27
+
28
+ ## Installation
29
+
30
+ ```bash
31
+ # Rails 7+ with Tailwind
32
+ ./bin/bundle add tailwindcss-rails
33
+ ./bin/rails tailwindcss:install
34
+ ```
35
+
36
+ ## Common Patterns
37
+
38
+ ### Container & Layout
39
+
40
+ ```erb
41
+ <%# Max-width container %>
42
+ <div class="container mx-auto px-4">
43
+ Content
44
+ </div>
45
+
46
+ <%# Full-width section with max-width content %>
47
+ <section class="w-full bg-gray-100">
48
+ <div class="max-w-7xl mx-auto px-4 py-8">
49
+ Content
50
+ </div>
51
+ </section>
52
+ ```
53
+
54
+ ### Flexbox Layouts
55
+
56
+ ```erb
57
+ <%# Horizontal flex %>
58
+ <div class="flex items-center space-x-4">
59
+ <div>Item 1</div>
60
+ <div>Item 2</div>
61
+ </div>
62
+
63
+ <%# Space between %>
64
+ <div class="flex justify-between items-center">
65
+ <div>Left</div>
66
+ <div>Right</div>
67
+ </div>
68
+
69
+ <%# Centered content %>
70
+ <div class="flex items-center justify-center min-h-screen">
71
+ <div>Centered</div>
72
+ </div>
73
+
74
+ <%# Vertical flex %>
75
+ <div class="flex flex-col space-y-4">
76
+ <div>Item 1</div>
77
+ <div>Item 2</div>
78
+ </div>
79
+ ```
80
+
81
+ ### Grid Layouts
82
+
83
+ ```erb
84
+ <%# Basic grid %>
85
+ <div class="grid grid-cols-3 gap-4">
86
+ <div>Column 1</div>
87
+ <div>Column 2</div>
88
+ <div>Column 3</div>
89
+ </div>
90
+
91
+ <%# Responsive grid %>
92
+ <div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
93
+ <% @posts.each do |post| %>
94
+ <%= render post %>
95
+ <% end %>
96
+ </div>
97
+
98
+ <%# Grid with different column spans %>
99
+ <div class="grid grid-cols-12 gap-4">
100
+ <div class="col-span-8">Main content</div>
101
+ <div class="col-span-4">Sidebar</div>
102
+ </div>
103
+ ```
104
+
105
+ ### Cards
106
+
107
+ ```erb
108
+ <div class="bg-white rounded-lg shadow-md p-6">
109
+ <h3 class="text-xl font-bold mb-2"><%= @post.title %></h3>
110
+ <p class="text-gray-600"><%= @post.excerpt %></p>
111
+ <div class="mt-4">
112
+ <%= link_to "Read More", @post, class: "text-blue-500 hover:text-blue-700" %>
113
+ </div>
114
+ </div>
115
+
116
+ <%# Card with hover effect %>
117
+ <div class="bg-white rounded-lg shadow hover:shadow-xl transition-shadow duration-300 p-6">
118
+ Content
119
+ </div>
120
+ ```
121
+
122
+ ### Buttons
123
+
124
+ ```erb
125
+ <%# Primary button %>
126
+ <%= link_to "Submit", path, class: "bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded" %>
127
+
128
+ <%# Secondary button %>
129
+ <%= link_to "Cancel", path, class: "bg-gray-300 hover:bg-gray-400 text-gray-800 font-bold py-2 px-4 rounded" %>
130
+
131
+ <%# Outline button %>
132
+ <%= link_to "Edit", path, class: "border border-blue-500 text-blue-500 hover:bg-blue-500 hover:text-white font-bold py-2 px-4 rounded" %>
133
+
134
+ <%# Icon button %>
135
+ <button class="bg-blue-500 hover:bg-blue-700 text-white p-2 rounded-full">
136
+ <svg class="w-6 h-6">...</svg>
137
+ </button>
138
+ ```
139
+
140
+ ### Forms
141
+
142
+ ```erb
143
+ <%= form_with model: @post, class: "space-y-6" do |f| %>
144
+ <div>
145
+ <%= f.label :title, class: "block text-sm font-medium text-gray-700 mb-1" %>
146
+ <%= f.text_field :title, class: "w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500" %>
147
+ </div>
148
+
149
+ <div>
150
+ <%= f.label :body, class: "block text-sm font-medium text-gray-700 mb-1" %>
151
+ <%= f.text_area :body, rows: 6, class: "w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500" %>
152
+ </div>
153
+
154
+ <div class="flex items-center">
155
+ <%= f.check_box :published, class: "h-4 w-4 text-blue-600 focus:ring-blue-500 border-gray-300 rounded" %>
156
+ <%= f.label :published, class: "ml-2 block text-sm text-gray-900" %>
157
+ </div>
158
+
159
+ <div class="flex space-x-4">
160
+ <%= f.submit "Save", class: "bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-6 rounded" %>
161
+ <%= link_to "Cancel", posts_path, class: "bg-gray-300 hover:bg-gray-400 text-gray-800 font-bold py-2 px-6 rounded" %>
162
+ </div>
163
+ <% end %>
164
+ ```
165
+
166
+ ### Navigation
167
+
168
+ ```erb
169
+ <nav class="bg-white shadow-lg">
170
+ <div class="max-w-7xl mx-auto px-4">
171
+ <div class="flex justify-between items-center h-16">
172
+ <%= link_to "Logo", root_path, class: "text-xl font-bold text-gray-800" %>
173
+
174
+ <div class="hidden md:flex space-x-8">
175
+ <%= link_to "Home", root_path, class: "text-gray-700 hover:text-blue-500" %>
176
+ <%= link_to "Posts", posts_path, class: "text-gray-700 hover:text-blue-500" %>
177
+ <%= link_to "About", about_path, class: "text-gray-700 hover:text-blue-500" %>
178
+ </div>
179
+
180
+ <button class="md:hidden">
181
+ <svg class="w-6 h-6">...</svg>
182
+ </button>
183
+ </div>
184
+ </div>
185
+ </nav>
186
+ ```
187
+
188
+ ### Tables
189
+
190
+ ```erb
191
+ <div class="overflow-x-auto">
192
+ <table class="min-w-full bg-white border">
193
+ <thead class="bg-gray-100">
194
+ <tr>
195
+ <th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
196
+ Title
197
+ </th>
198
+ <th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
199
+ Author
200
+ </th>
201
+ <th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
202
+ Actions
203
+ </th>
204
+ </tr>
205
+ </thead>
206
+ <tbody class="divide-y divide-gray-200">
207
+ <% @posts.each do |post| %>
208
+ <tr class="hover:bg-gray-50">
209
+ <td class="px-6 py-4 whitespace-nowrap">
210
+ <%= post.title %>
211
+ </td>
212
+ <td class="px-6 py-4 whitespace-nowrap">
213
+ <%= post.author.name %>
214
+ </td>
215
+ <td class="px-6 py-4 whitespace-nowrap text-sm">
216
+ <%= link_to "Edit", edit_post_path(post), class: "text-blue-500 hover:text-blue-700 mr-4" %>
217
+ <%= link_to "Delete", post, method: :delete, class: "text-red-500 hover:text-red-700" %>
218
+ </td>
219
+ </tr>
220
+ <% end %>
221
+ </tbody>
222
+ </table>
223
+ </div>
224
+ ```
225
+
226
+ ### Alerts/Flash Messages
227
+
228
+ ```erb
229
+ <% flash.each do |type, message| %>
230
+ <div class="<%= alert_class(type) %> p-4 rounded-md mb-4">
231
+ <div class="flex">
232
+ <div class="flex-shrink-0">
233
+ <%# Icon %>
234
+ </div>
235
+ <div class="ml-3">
236
+ <p class="text-sm font-medium">
237
+ <%= message %>
238
+ </p>
239
+ </div>
240
+ </div>
241
+ </div>
242
+ <% end %>
243
+
244
+ <%# Helper method %>
245
+ def alert_class(type)
246
+ case type.to_sym
247
+ when :notice, :success
248
+ "bg-green-100 border border-green-400 text-green-700"
249
+ when :alert, :error
250
+ "bg-red-100 border border-red-400 text-red-700"
251
+ when :warning
252
+ "bg-yellow-100 border border-yellow-400 text-yellow-700"
253
+ else
254
+ "bg-blue-100 border border-blue-400 text-blue-700"
255
+ end
256
+ end
257
+ ```
258
+
259
+ ### Modal
260
+
261
+ ```erb
262
+ <div class="fixed inset-0 bg-gray-600 bg-opacity-50 overflow-y-auto h-full w-full" id="my-modal">
263
+ <div class="relative top-20 mx-auto p-5 border w-96 shadow-lg rounded-md bg-white">
264
+ <div class="mt-3">
265
+ <h3 class="text-lg font-medium text-gray-900 mb-4">Modal Title</h3>
266
+ <div class="mt-2">
267
+ <p class="text-sm text-gray-500">Modal content goes here.</p>
268
+ </div>
269
+ <div class="mt-4 flex justify-end space-x-3">
270
+ <button class="px-4 py-2 bg-gray-300 text-gray-800 rounded hover:bg-gray-400">
271
+ Cancel
272
+ </button>
273
+ <button class="px-4 py-2 bg-blue-500 text-white rounded hover:bg-blue-600">
274
+ Confirm
275
+ </button>
276
+ </div>
277
+ </div>
278
+ </div>
279
+ </div>
280
+ ```
281
+
282
+ ### Badges
283
+
284
+ ```erb
285
+ <span class="inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium bg-blue-100 text-blue-800">
286
+ New
287
+ </span>
288
+
289
+ <span class="inline-flex items-center px-3 py-1 rounded-md text-sm font-medium bg-green-100 text-green-800">
290
+ Published
291
+ </span>
292
+ ```
293
+
294
+ ### Responsive Design
295
+
296
+ ```erb
297
+ <%# Hide on mobile, show on desktop %>
298
+ <div class="hidden md:block">
299
+ Desktop only
300
+ </div>
301
+
302
+ <%# Show on mobile, hide on desktop %>
303
+ <div class="block md:hidden">
304
+ Mobile only
305
+ </div>
306
+
307
+ <%# Responsive text sizes %>
308
+ <h1 class="text-2xl md:text-4xl lg:text-6xl font-bold">
309
+ Title
310
+ </h1>
311
+
312
+ <%# Responsive padding %>
313
+ <div class="p-4 md:p-8 lg:p-12">
314
+ Content
315
+ </div>
316
+ ```
317
+
318
+ ## Customization
319
+
320
+ ```javascript
321
+ // config/tailwind.config.js
322
+ module.exports = {
323
+ content: [
324
+ './app/views/**/*.html.erb',
325
+ './app/helpers/**/*.rb',
326
+ './app/assets/stylesheets/**/*.css',
327
+ './app/javascript/**/*.js'
328
+ ],
329
+ theme: {
330
+ extend: {
331
+ colors: {
332
+ 'brand': {
333
+ light: '#3fbaeb',
334
+ DEFAULT: '#0fa9e6',
335
+ dark: '#0c87b8',
336
+ }
337
+ },
338
+ fontFamily: {
339
+ sans: ['Inter', 'sans-serif'],
340
+ },
341
+ },
342
+ },
343
+ plugins: [
344
+ require('@tailwindcss/forms'),
345
+ require('@tailwindcss/typography'),
346
+ ],
347
+ }
348
+ ```
349
+
350
+ ## Best Practices
351
+
352
+ 1. **Use @apply sparingly** - Prefer utility classes in templates
353
+ 2. **Create components** for repeated patterns
354
+ 3. **Use responsive prefixes** - mobile-first approach
355
+ 4. **Leverage Tailwind plugins** - forms, typography, etc.
356
+ 5. **Keep custom CSS minimal** - use Tailwind's configuration
357
+ 6. **Use consistent spacing scale** - stick to theme spacing
358
+ 7. **Optimize for production** - PurgeCSS removes unused styles automatically
359
+
360
+ ## Common Pitfalls
361
+
362
+ - **Too many utilities** - Extract to components or use @apply
363
+ - **Not purging** - Make sure content paths are configured correctly
364
+ - **Fighting the framework** - Use Tailwind's patterns, don't fight them
365
+ - **Forgetting responsive** - Always test mobile-first
366
+
367
+ ## References
368
+
369
+ - [Tailwind CSS Documentation](https://tailwindcss.com/docs)
370
+ - [Tailwind CSS Rails](https://github.com/rails/tailwindcss-rails)
371
+ - [Tailwind UI Components](https://tailwindui.com/)
@@ -0,0 +1,113 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails/generators"
4
+ require "fileutils"
5
+
6
+ module Claude
7
+ module Generators
8
+ class ViewsGenerator < Rails::Generators::NamedBase
9
+ source_root File.expand_path("..", __dir__)
10
+
11
+ class_option :type, type: :string, default: "skill",
12
+ desc: "Type of resource to copy (skill, command, rule)"
13
+
14
+ def copy_resource_to_project
15
+ case options[:type]
16
+ when "command"
17
+ copy_command
18
+ when "rule"
19
+ copy_rule
20
+ else
21
+ copy_skill
22
+ end
23
+ end
24
+
25
+ private
26
+
27
+ def copy_skill
28
+ skill_source = "#{self.class.source_root}/skills_library/#{file_name}"
29
+ skill_dest = ".claude/skills/#{file_name}"
30
+
31
+ if File.directory?(skill_source)
32
+ directory skill_source, skill_dest
33
+ say "Copied skill '#{file_name}' to your project for customization", :green
34
+ say "\nYou can now edit:", :blue
35
+ say " #{skill_dest}/SKILL.md"
36
+ say " #{skill_dest}/references/*" if File.directory?("#{skill_source}/references")
37
+ say "\nChanges will override the gem's default version.\n", :yellow
38
+ else
39
+ say "Skill '#{file_name}' not found in skills library", :red
40
+ say "\nAvailable skills:", :blue
41
+ list_available_skills
42
+ end
43
+ end
44
+
45
+ def copy_command
46
+ command_source = "#{self.class.source_root}/commands_library/#{file_name}.md"
47
+ command_dest = ".claude/commands/#{file_name}.md"
48
+
49
+ if File.exist?(command_source)
50
+ copy_file command_source, command_dest
51
+ say "Copied command '#{file_name}' to your project for customization", :green
52
+ say "\nYou can now edit:", :blue
53
+ say " #{command_dest}"
54
+ say "\nChanges will override the gem's default version.\n", :yellow
55
+ else
56
+ say "Command '#{file_name}' not found in commands library", :red
57
+ say "\nAvailable commands:", :blue
58
+ list_available_commands
59
+ end
60
+ end
61
+
62
+ def copy_rule
63
+ rule_source = "#{self.class.source_root}/rules_library/#{file_name}.md"
64
+ rule_dest = ".claude/rules/#{file_name}.md"
65
+
66
+ if File.exist?(rule_source)
67
+ copy_file rule_source, rule_dest
68
+ say "Copied rule '#{file_name}' to your project for customization", :green
69
+ say "\nYou can now edit:", :blue
70
+ say " #{rule_dest}"
71
+ say "\nChanges will override the gem's default version.\n", :yellow
72
+ else
73
+ say "Rule '#{file_name}' not found in rules library", :red
74
+ say "\nAvailable rules:", :blue
75
+ list_available_rules
76
+ end
77
+ end
78
+
79
+ def list_available_skills
80
+ skills_dir = "#{self.class.source_root}/skills_library"
81
+ if File.directory?(skills_dir)
82
+ Dir.entries(skills_dir).reject { |d| d.start_with?(".") }.each do |skill|
83
+ say " - #{skill}"
84
+ end
85
+ else
86
+ say " No pre-built skills found"
87
+ end
88
+ end
89
+
90
+ def list_available_commands
91
+ commands_dir = "#{self.class.source_root}/commands_library"
92
+ if File.directory?(commands_dir)
93
+ Dir.entries(commands_dir).reject { |f| f.start_with?(".") }.each do |command|
94
+ say " - #{File.basename(command, ".md")}"
95
+ end
96
+ else
97
+ say " No pre-built commands found"
98
+ end
99
+ end
100
+
101
+ def list_available_rules
102
+ rules_dir = "#{self.class.source_root}/rules_library"
103
+ if File.directory?(rules_dir)
104
+ Dir.entries(rules_dir).reject { |f| f.start_with?(".") }.each do |rule|
105
+ say " - #{File.basename(rule, ".md")}"
106
+ end
107
+ else
108
+ say " No pre-built rules found"
109
+ end
110
+ end
111
+ end
112
+ end
113
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RailsClaudeSkills
4
+ class Railtie < Rails::Railtie
5
+ railtie_name :rails_claude_skills
6
+
7
+ generators do
8
+ require "generators/claude/install/install_generator"
9
+ require "generators/claude/skill/skill_generator"
10
+ require "generators/claude/agent/agent_generator"
11
+ require "generators/claude/command/command_generator"
12
+ require "generators/claude/rule/rule_generator"
13
+ require "generators/claude/views/views_generator"
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RailsClaudeSkills
4
+ VERSION = "0.1.0"
5
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "rails_claude_skills/version"
4
+ require_relative "rails_claude_skills/railtie" if defined?(Rails::Railtie)
5
+
6
+ module RailsClaudeSkills
7
+ class Error < StandardError; end
8
+
9
+ class << self
10
+ attr_accessor :configuration
11
+ end
12
+
13
+ def self.configure
14
+ self.configuration ||= Configuration.new
15
+ yield(configuration)
16
+ end
17
+
18
+ class Configuration
19
+ attr_accessor :skills_path, :agents_path, :default_model
20
+
21
+ def initialize
22
+ @skills_path = ".claude/skills"
23
+ @agents_path = ".claude/agents"
24
+ @default_model = "sonnet"
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,4 @@
1
+ module RailsClaudeSkills
2
+ VERSION: String
3
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
4
+ end