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
|
@@ -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,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
|