climaybe 1.7.3 → 1.8.1

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 (40) hide show
  1. package/README.md +8 -6
  2. package/bin/version.txt +1 -1
  3. package/package.json +1 -1
  4. package/src/commands/add-cursor-skill.js +12 -7
  5. package/src/commands/init.js +10 -5
  6. package/src/cursor/rules/00-rule-index.mdc +24 -0
  7. package/src/cursor/rules/accessibility-rules.mdc +527 -0
  8. package/src/cursor/rules/commit-rules.mdc +286 -0
  9. package/src/cursor/rules/cursor-rule-template.mdc +66 -0
  10. package/src/cursor/rules/examples/section-example.liquid +52 -0
  11. package/src/cursor/rules/examples/snippet-example.liquid +83 -0
  12. package/src/cursor/rules/figma-design-system.mdc +182 -0
  13. package/src/cursor/rules/global-rules-reference.mdc +62 -0
  14. package/src/cursor/rules/javascript-standards.mdc +1125 -0
  15. package/src/cursor/rules/js-refactor-tasks.mdc +123 -0
  16. package/src/cursor/rules/linear-task-creation.mdc +105 -0
  17. package/src/cursor/rules/liquid-doc-rules.mdc +595 -0
  18. package/src/cursor/rules/liquid.mdc +228 -0
  19. package/src/cursor/rules/project-overview.mdc +81 -0
  20. package/src/cursor/rules/schemas.mdc +150 -0
  21. package/src/cursor/rules/sections.mdc +25 -0
  22. package/src/cursor/rules/snippets.mdc +134 -0
  23. package/src/cursor/rules/tailwindcss-rules.mdc +410 -0
  24. package/src/cursor/skills/accessibility-pass/SKILL.md +54 -0
  25. package/src/cursor/skills/changelog-release/SKILL.md +50 -0
  26. package/src/cursor/skills/commit/SKILL.md +27 -0
  27. package/src/cursor/skills/commit-in-groups/SKILL.md +55 -0
  28. package/src/cursor/skills/linear-create-task/SKILL.md +81 -0
  29. package/src/cursor/skills/liquid-doc-comments/SKILL.md +37 -0
  30. package/src/cursor/skills/locale-translation-prep/SKILL.md +49 -0
  31. package/src/cursor/skills/schema-section-change/SKILL.md +39 -0
  32. package/src/cursor/skills/section-from-spec/SKILL.md +39 -0
  33. package/src/cursor/skills/theme-check-fix/SKILL.md +47 -0
  34. package/src/index.js +3 -2
  35. package/src/lib/commit-tooling.js +0 -44
  36. package/src/lib/config.js +1 -1
  37. package/src/lib/cursor-bundle.js +47 -0
  38. package/src/lib/prompts.js +3 -2
  39. package/src/workflows/build/reusable-build.yml +1 -1
  40. package/src/workflows/shared/version-bump.yml +5 -2
@@ -0,0 +1,410 @@
1
+ ---
2
+ description: Tailwind CSS and theme token standards for Liquid and theme styles. Static classes only, semantic tokens from _styles/02_base/02.02_colors.css, content sources in _styles/main.css.
3
+ globs:
4
+ - "**/*.liquid"
5
+ - "_styles/**/*.css"
6
+ - "assets/*.css"
7
+ alwaysApply: false
8
+ ---
9
+ # Tailwind CSS Development Rules
10
+
11
+ Apply when editing Liquid templates or theme CSS that use Tailwind classes or theme tokens. Use semantic tokens (surface, subtle, emphasis, accent, text-primary, border-secondary) from this project's `@theme`; see `_styles/02_base/02.02_colors.css`.
12
+
13
+ ## Core Principles
14
+
15
+ ### 1. Static Class Generation
16
+ **CRITICAL**: Never combine Tailwind classes with Liquid variables or dynamic values.
17
+
18
+ **Why this matters:**
19
+ - Tailwind CSS scans unparsed files during build time to generate CSS
20
+ - Liquid parsing happens on Shopify servers, not during local builds
21
+ - Tailwind cannot see the final rendered HTML with dynamic values
22
+ - This means dynamic classes like `duration-{{ animation_duration }}` will NOT work
23
+
24
+ **❌ Bad Examples:**
25
+ ```liquid
26
+ <!-- These will NOT work - Tailwind can't see the dynamic values -->
27
+ <div class="duration-{{ animation_duration }}">
28
+ <div class="w-{{ width }}">
29
+ <div class="text-{{ color }}">
30
+ <div class="bg-{{ background_color }}">
31
+ ```
32
+
33
+ **✅ Good Examples:**
34
+ ```liquid
35
+ <!-- Use static Tailwind classes -->
36
+ <div class="duration-300">
37
+ <div class="w-full">
38
+ <div class="text-blue-600">
39
+ <div class="bg-gray-100">
40
+
41
+ <!-- Or use conditional classes -->
42
+ <div class="{% if show_animation %}duration-300{% else %}duration-0{% endif %}">
43
+ <div class="{% if size == 'sm' %}w-1/2{% else %}w-full{% endif %}">
44
+ ```
45
+
46
+ ### 2. Conditional Class Application
47
+ Use conditional statements to apply different static classes:
48
+
49
+ ```liquid
50
+ <!-- ✅ Good: Conditional static classes -->
51
+ <div class="{% if expanded %}bg-blue-100{% else %}bg-gray-50{% endif %}">
52
+ <div class="{% if size == 'sm' %}text-sm{% else %}text-base{% endif %}">
53
+ <div class="{% if show_animation %}transition-all duration-300{% else %}transition-none{% endif %}">
54
+ ```
55
+
56
+ ### 3. Custom CSS for Dynamic Values
57
+ For truly dynamic values, use custom CSS classes:
58
+
59
+ ```liquid
60
+ <!-- ✅ Good: Custom CSS for dynamic values -->
61
+ <style>
62
+ .duration-custom { transition-duration: var(--custom-duration); }
63
+ .width-custom { width: var(--custom-width); }
64
+ </style>
65
+
66
+ <div class="duration-custom" style="--custom-duration: {{ animation_duration }}ms">
67
+ <div class="width-custom" style="--custom-width: {{ width }}%">
68
+ ```
69
+
70
+ ## Class Organization
71
+
72
+ ### 1. Logical Grouping
73
+ Group related classes together in a logical order:
74
+
75
+ ```liquid
76
+ <!-- ✅ Good: Logical grouping -->
77
+ <div class="
78
+ flex items-center justify-between
79
+ p-4 m-2
80
+ bg-white border border-gray-200 rounded-lg
81
+ hover:bg-gray-50 focus:ring-2 focus:ring-blue-500
82
+ transition-colors duration-200
83
+ ">
84
+ ```
85
+
86
+ ### 2. Responsive Design
87
+ Use responsive prefixes consistently:
88
+
89
+ ```liquid
90
+ <!-- ✅ Good: Responsive design -->
91
+ <div class="
92
+ w-full md:w-1/2 lg:w-1/3
93
+ text-sm md:text-base lg:text-lg
94
+ p-2 md:p-4 lg:p-6
95
+ ">
96
+ ```
97
+
98
+ ### 3. State Classes
99
+ Group state-based classes together:
100
+
101
+ ```liquid
102
+ <!-- ✅ Good: State classes grouped -->
103
+ <button class="
104
+ px-4 py-2 rounded
105
+ bg-blue-600 text-white
106
+ hover:bg-blue-700 focus:bg-blue-700
107
+ focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2
108
+ disabled:opacity-50 disabled:cursor-not-allowed
109
+ transition-colors duration-200
110
+ ">
111
+ ```
112
+
113
+ ## Performance Best Practices
114
+
115
+ ### 1. Content Source Configuration
116
+ Tailwind v4 content sources are in `_styles/main.css`. All template and asset paths are scanned for class names:
117
+
118
+ ```css
119
+ /* _styles/main.css */
120
+ @import "tailwindcss" source(none);
121
+ @plugin "@tailwindcss/typography";
122
+ @source "../assets/*.js";
123
+ @source "../assets/!(style).css";
124
+ @source "../layout/*.liquid";
125
+ @source "../blocks/*.liquid";
126
+ @source "../sections/*.liquid";
127
+ @source "../snippets/*.liquid";
128
+ @source "../templates/*.liquid";
129
+ ```
130
+
131
+ Token imports: `01_theme/01_primitives.css`, `02_base/02.01_sizes.css`, `02_base/02.02_colors.css`, `02_base/02.03_typography.css`. Any file that uses Tailwind classes must be covered by these `@source` paths so classes are not purged.
132
+
133
+ ### 2. Avoid Arbitrary Values
134
+ Prefer predefined Tailwind classes over arbitrary values:
135
+
136
+ ```liquid
137
+ <!-- ❌ Bad: Arbitrary values -->
138
+ <div class="w-[123px] h-[456px]">
139
+
140
+ <!-- ✅ Good: Predefined classes -->
141
+ <div class="w-32 h-40">
142
+ ```
143
+
144
+ ### 3. Use CSS Custom Properties
145
+ For dynamic values, use CSS custom properties defined in `_styles/main.css` and imported token files (`01_primitives.css`, `02.02_colors.css`, etc.).
146
+
147
+ ## Color System (Theme Tokens)
148
+
149
+ ### 1. Primitives and semantic tokens
150
+ - **Primitives**: `_styles/01_theme/01_primitives.css` — raw colors (e.g. `--color-dune-50`, `--color-abbey-950`).
151
+ - **Semantic tokens**: `_styles/02_base/02.02_colors.css` — background, text, border tokens used by Tailwind utilities.
152
+
153
+ ### 2. Semantic token names (this project)
154
+ Background: `--background-color-surface`, `--background-color-subtle`, `--background-color-emphasis`, `--background-color-accent`.
155
+ Text: `--text-color-primary`, `--text-color-secondary`, `--text-color-on-accent`, `--text-color-on-accent-sec`.
156
+ Border: `--border-color-primary`, `--border-color-secondary`, `--border-color-on-accent`, `--border-color-on-accent-sec`.
157
+
158
+ Tailwind generates classes from these (e.g. `bg-surface`, `bg-subtle`, `text-primary`, `text-on-accent`, `border-primary`, `border-secondary`). Gradients: `--background-image-gradient-surface`, `-subtle`, `-emphasis`, `-contrast`.
159
+
160
+ ### 3. Using theme colors in Liquid
161
+ Prefer semantic utility classes; use arbitrary values only when no token exists:
162
+
163
+ ```liquid
164
+ <!-- Prefer: semantic classes from @theme -->
165
+ <div class="bg-surface text-primary border border-secondary">
166
+ <div class="bg-subtle text-secondary">
167
+ <div class="bg-accent text-on-accent">
168
+ <div class="border-primary">
169
+
170
+ <!-- Optional: arbitrary value from a token -->
171
+ <div class="bg-[hsl(var(--background-color-emphasis))]">
172
+ ```
173
+
174
+ ### 4. Color schemas (@utility)
175
+ Sections can switch palette via `@utility` classes: `color-schema-primary`, `color-schema-secondary`, `color-schema-muted`, `color-schema-accent-1`, `color-schema-accent-2`, `color-schema-accent-3`, `color-schema-contrast`. Apply to a wrapper (e.g. section root) so children inherit semantic tokens. See `_styles/02_base/02.02_colors.css`.
176
+
177
+ ## Design-Focused Accessibility
178
+
179
+ ### 1. Contextual Focus States
180
+ Use design-appropriate focus indicators instead of generic rings:
181
+
182
+ ```liquid
183
+ <!-- ✅ Good: Input with border focus -->
184
+ <input class="
185
+ border border-secondary
186
+ focus:border-primary focus:outline-none
187
+ transition-colors duration-200
188
+ ">
189
+
190
+ <!-- ✅ Good: Summary with background focus -->
191
+ <summary class="
192
+ bg-white hover:bg-emphasis
193
+ focus:bg-emphasis focus:outline-none
194
+ transition-colors duration-200
195
+ ">
196
+
197
+ <!-- ✅ Good: Button with ring focus (appropriate for buttons) -->
198
+ <button class="
199
+ bg-subtle text-on-accent
200
+ hover:bg-subtle/90
201
+ focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2
202
+ transition-colors duration-200
203
+ ">
204
+ ```
205
+
206
+ ### 2. Focus State Guidelines
207
+ Choose focus indicators based on component context:
208
+
209
+ - **Inputs/Form Fields**: Use `focus:border-primary` when parent has `border-secondary`
210
+ - **Summary Elements**: Use `focus:bg-emphasis` for subtle background change
211
+ - **Buttons**: Use `focus:ring-2 focus:ring-primary` for clear button focus
212
+ - **Links**: Use `focus:underline` or `focus:text-primary` for text-based focus
213
+ - **Cards/Containers**: Use `focus:border-primary` or `focus:shadow-lg`
214
+
215
+ ### 3. Reduced Motion
216
+ Respect user preferences using the theme's custom properties:
217
+
218
+ ```css
219
+ /* _styles/main.css */
220
+ @media (prefers-reduced-motion: reduce) {
221
+ .transition-all {
222
+ transition: none !important;
223
+ }
224
+ }
225
+ ```
226
+
227
+ ### 4. High Contrast
228
+ Support high contrast mode:
229
+
230
+ ```css
231
+ /* _styles/main.css */
232
+ @media (prefers-contrast: high) {
233
+ .border-gray-200 {
234
+ border-color: #000000 !important;
235
+ }
236
+ }
237
+ ```
238
+
239
+ ## Component Patterns
240
+
241
+ ### 1. Atomic Components
242
+ Use consistent patterns for atomic components:
243
+
244
+ ```liquid
245
+ <!-- Button component pattern -->
246
+ <button class="
247
+ inline-flex items-center justify-center
248
+ px-4 py-2 rounded-md
249
+ text-sm font-medium
250
+ bg-subtle text-on-accent
251
+ hover:bg-subtle/90 focus:bg-subtle/90
252
+ focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2
253
+ disabled:opacity-50 disabled:cursor-not-allowed
254
+ transition-colors duration-200
255
+ {{ class }}
256
+ ">
257
+ {{ content }}
258
+ </button>
259
+ ```
260
+
261
+ ### 2. Layout Components
262
+ Use consistent spacing and layout patterns:
263
+
264
+ ```liquid
265
+ <!-- Container pattern -->
266
+ <div class="
267
+ max-w-7xl mx-auto px-4 sm:px-6 lg:px-8
268
+ {{ class }}
269
+ ">
270
+ {{ content }}
271
+ </div>
272
+ ```
273
+
274
+ ### 3. Form Components
275
+ Use consistent form styling:
276
+
277
+ ```liquid
278
+ <!-- Input pattern -->
279
+ <input class="
280
+ block w-full rounded-md
281
+ border border-secondary
282
+ focus:border-primary focus:outline-none
283
+ disabled:bg-emphasis disabled:cursor-not-allowed
284
+ transition-colors duration-200
285
+ {{ class }}
286
+ ">
287
+ ```
288
+
289
+ ## Common Patterns
290
+
291
+ ### 1. Card Components
292
+ ```liquid
293
+ <div class="
294
+ bg-subtle border border-secondary rounded-lg shadow-sm
295
+ hover:shadow-md transition-shadow duration-200
296
+ {{ class }}
297
+ ">
298
+ {{ content }}
299
+ </div>
300
+ ```
301
+
302
+ ### 2. Navigation Items
303
+ ```liquid
304
+ <a class="
305
+ block px-3 py-2 rounded-md text-sm font-medium
306
+ text-secondary hover:text-primary hover:bg-emphasis
307
+ focus:outline-none focus:bg-emphasis
308
+ transition-colors duration-200
309
+ {{ class }}
310
+ ">
311
+ {{ content }}
312
+ </a>
313
+ ```
314
+
315
+ ### 3. Status Indicators
316
+ ```liquid
317
+ <span class="
318
+ inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium
319
+ {{ status == 'success' ? 'bg-green-100 text-green-800' : '' }}
320
+ {{ status == 'error' ? 'bg-red-100 text-red-800' : '' }}
321
+ {{ status == 'warning' ? 'bg-yellow-100 text-yellow-800' : '' }}
322
+ {{ status == 'info' ? 'bg-blue-100 text-blue-800' : '' }}
323
+ ">
324
+ {{ content }}
325
+ </span>
326
+ ```
327
+
328
+ ## Debugging Tips
329
+
330
+ ### 1. Class Verification
331
+ Use browser dev tools to verify classes are applied correctly:
332
+
333
+ ```javascript
334
+ // Check if classes are present
335
+ console.log(element.className);
336
+ ```
337
+
338
+ ### 2. Purge Verification
339
+ Ensure classes aren't being purged by checking the content sources in `_styles/main.css`:
340
+
341
+ ```bash
342
+ # Check what classes are being purged
343
+ npx tailwindcss --content ./**/*.liquid --output ./temp.css
344
+ ```
345
+
346
+ ### 3. Dynamic Class Debugging
347
+ For conditional classes, add debugging:
348
+
349
+ ```liquid
350
+ <!-- Debug conditional classes -->
351
+ <div class="
352
+ {% if debug %}border-2 border-red-500{% endif %}
353
+ {{ conditional_classes }}
354
+ ">
355
+ <!-- Add debug output -->
356
+ {% if debug %}
357
+ <div class="text-xs text-gray-500">
358
+ Applied classes: {{ conditional_classes }}
359
+ </div>
360
+ {% endif %}
361
+ </div>
362
+ ```
363
+
364
+ ## Theme Integration
365
+
366
+ ### 1. Tokens and custom properties
367
+ Use semantic classes (e.g. `bg-surface`, `text-primary`) so styles stay within the token system. For one-off values, use theme variables from `_styles/01_theme/01_primitives.css` and `_styles/02_base/02.02_colors.css`. Typography and sizes: `_styles/02_base/02.01_sizes.css`, `02.03_typography.css`.
368
+
369
+ ### 2. Responsive breakpoints
370
+ Use Tailwind breakpoints (e.g. `md:`, `lg:`) consistently; theme may define `--breakpoint-*` in `@theme`.
371
+
372
+ ### 3. Custom utilities
373
+ Add custom utilities in `_styles/` (e.g. in a layer file imported by `main.css`):
374
+
375
+ ```css
376
+ /* _styles/main.css */
377
+ @layer utilities {
378
+ .text-balance {
379
+ text-wrap: balance;
380
+ }
381
+
382
+ .hide-scroll-bar {
383
+ -ms-overflow-style: none;
384
+ scrollbar-width: none;
385
+ }
386
+
387
+ .hide-scroll-bar::-webkit-scrollbar {
388
+ display: none;
389
+ }
390
+ }
391
+ ```
392
+
393
+ ## Compliance Checklist
394
+
395
+ Before committing any Tailwind CSS changes, ensure:
396
+
397
+ - [ ] No dynamic Tailwind classes with Liquid variables
398
+ - [ ] All conditional classes use static Tailwind values
399
+ - [ ] Contextual focus states used (not generic rings everywhere)
400
+ - [ ] Responsive design implemented correctly
401
+ - [ ] Performance optimizations applied
402
+ - [ ] Design-appropriate accessibility considerations addressed
403
+ - [ ] Classes are logically grouped and organized
404
+ - [ ] Custom CSS used for truly dynamic values
405
+ - [ ] Content sources in `_styles/main.css` include all template files
406
+ - [ ] No arbitrary values unless absolutely necessary
407
+ - [ ] Theme custom properties used when appropriate
408
+ - [ ] Custom utilities added to `_styles/main.css` when needed
409
+ - [ ] Semantic tokens used (surface, subtle, emphasis, accent, text-primary, border-secondary) from `_styles/02_base/02.02_colors.css`
410
+ - [ ] Focus states match component context and design
@@ -0,0 +1,54 @@
1
+ ---
2
+ name: accessibility-pass
3
+ description: Runs an accessibility audit on a section, snippet, or component. Use when the user says "accessibility pass", "a11y audit", "check accessibility", "WCAG check", or "audit this section/snippet". Follows project accessibility rules.
4
+ ---
5
+
6
+ # Accessibility Pass
7
+
8
+ Runs a structured a11y audit on specified file(s) and reports findings with fix suggestions.
9
+
10
+ ## Rules to Apply
11
+
12
+ Before auditing, read and apply:
13
+
14
+ 1. `.cursor/rules/00-rule-index.mdc` — rule index
15
+ 2. `.cursor/rules/accessibility-rules.mdc` — WCAG 2.1 AA, semantic HTML, ARIA, keyboard, focus, screen readers
16
+
17
+ ## Workflow
18
+
19
+ 1. **Identify scope** — User specifies file(s) or "current file". If unspecified, ask or assume the file they have open.
20
+ 2. **Load rules** — Read `accessibility-rules.mdc` and use it as the checklist basis.
21
+ 3. **Audit** — Go through the file(s) and check:
22
+ - Semantic structure (headings, landmarks, lists)
23
+ - ARIA (only when needed; state sync with JS if applicable)
24
+ - Keyboard (focusable elements, tab order, visible focus, Escape/Enter/Space)
25
+ - Images (alt text; decorative with empty alt or aria-hidden)
26
+ - Forms (labels, errors, required)
27
+ - Links/buttons (descriptive text, no "click here")
28
+ - Dynamic content (live regions if content updates)
29
+ 4. **Report** — For each finding:
30
+ - Location (element or line)
31
+ - Issue (what’s wrong)
32
+ - WCAG criterion if relevant
33
+ - Suggested fix (concrete code or change)
34
+ 5. **Severity** — Label as Critical (blocks access), Suggestion (improvement), or Nice-to-have.
35
+
36
+ ## Output Format
37
+
38
+ ```markdown
39
+ ## Accessibility audit: [file path]
40
+
41
+ ### Critical
42
+ - **[Element/location]** — [issue]. [Fix].
43
+
44
+ ### Suggestions
45
+ - ...
46
+
47
+ ### Nice-to-have
48
+ - ...
49
+ ```
50
+
51
+ ## Example Trigger
52
+
53
+ User: "Run an accessibility pass on this section" (with `sections/product--main.liquid` open).
54
+ → Audit that file against accessibility-rules.mdc and output the structured report.
@@ -0,0 +1,50 @@
1
+ ---
2
+ name: changelog-release
3
+ description: Generates changelog or release notes from git history using project commit conventions. Use when the user says "changelog", "release notes", "what changed since last tag", or "list commits for release". Follows commit-rules types (feat, fix, refactor, etc.).
4
+ ---
5
+
6
+ # Changelog / Release Notes
7
+
8
+ Builds a changelog or release notes from commits since a ref (e.g. last tag), grouped by project commit types.
9
+
10
+ ## Rules to Apply
11
+
12
+ When grouping and labeling commits, read and apply:
13
+
14
+ 1. `.cursor/rules/00-rule-index.mdc` — rule index
15
+ 2. `.cursor/rules/commit-rules.mdc` — commit types (🔨 fix, 🚀 feat, ♻️ refactor, 🎨 style, etc.) and format
16
+
17
+ Use the same type labels and emoji for changelog sections so the output matches how the team writes commits.
18
+
19
+ ## Workflow
20
+
21
+ 1. **Determine range** — Since last tag (e.g. `git describe --tags --abbrev=0` then `git log TAG..HEAD`), or since a branch/commit the user specifies. If unclear, default to "since last tag".
22
+ 2. **Get commits** — Run `git log --oneline [range]` (or with `--pretty=format:...` for message + body). Parse commit messages.
23
+ 3. **Group by type** — Map each commit to a type from commit-rules.mdc (fix, feat, refactor, style, remove, wip, docs, ai, chore, upgrade). Ignore merge commits. Put "unknown" or "other" for non-matching messages.
24
+ 4. **Format** — Output markdown:
25
+ - Optional title (e.g. "Changelog since v1.2.0")
26
+ - Sections by type (e.g. "## 🚀 Features", "## 🔨 Fixes")
27
+ - Under each section: list of commit descriptions (one line each, link to commit if desired). Strip emoji+type prefix for readability if you want, or keep for consistency.
28
+ 5. **Optional** — Add "Breaking changes" subsection if any commit message indicates breaking change (e.g. `!` or "BREAKING CHANGE").
29
+
30
+ ## Output Format
31
+
32
+ ```markdown
33
+ # Changelog (since [ref])
34
+
35
+ ## 🚀 Features
36
+ - add product quick view modal
37
+ - implement infinite scroll for collections
38
+
39
+ ## 🔨 Fixes
40
+ - resolve cart total calculation error
41
+ - modal close button not working
42
+
43
+ ## ♻️ Refactor
44
+ - optimize product card rendering
45
+ ```
46
+
47
+ ## Example Trigger
48
+
49
+ User: "Generate changelog since last tag."
50
+ → Resolve last tag, get `git log` since then, group by commit-rules types, output structured changelog.
@@ -0,0 +1,27 @@
1
+ ---
2
+ name: commit
3
+ description: Groups working-tree changes into logical commits and commits them using conventional commit rules (type, optional scope, subject; commitlint). Use when the user asks to commit, group commits, stage and commit, or write conventional commits.
4
+ ---
5
+
6
+ # Commit (group + conventional)
7
+
8
+ Group changes by purpose, then commit each group. A conventional message is optional; when the user provides or wants one, use the format below so commitlint and semantic-release stay happy.
9
+
10
+ ## Workflow
11
+
12
+ 1. **Inspect** — Get full picture of changes (git status, git diff).
13
+ 2. **Group** — Partition by type: feat, fix, docs, style, refactor, perf, test, build, ci, chore.
14
+ 3. **Commit each group** — If the user wants a message: type(scope): subject, imperative, lowercase, no period, ≤100 chars. If they don't, commit without message or with a minimal one (e.g. chore: wip).
15
+ 4. **Validate** — commit-msg hook may reject invalid messages when a message is used.
16
+
17
+ ## Message rules (commitlint, when a message is used)
18
+
19
+ - **Types:** feat, fix, docs, style, refactor, perf, test, build, ci, chore.
20
+ - **Header:** type(scope): subject — subject optional; max 100 chars when present. Body lines max 200.
21
+ - **Imperative, present tense:** "add feature" not "added feature".
22
+
23
+ ## Examples
24
+
25
+ feat(init): add store alias prompt
26
+ fix(sync): prevent overwrite of unchanged files
27
+ docs: add conventional commit section to CONTRIBUTING
@@ -0,0 +1,55 @@
1
+ ---
2
+ name: commit-in-groups
3
+ description: Groups current working tree changes into logical commits and suggests commit messages per project convention. Use when the user says "/commit-in-groups", "commit in groups", "group my commits", "suggest separate commits", or "split my changes into commits". Follows commit-rules.mdc (emoji + type + description).
4
+ ---
5
+
6
+ # Commit in Groups
7
+
8
+ Analyzes uncommitted changes, groups them into logical commits, and suggests one message per group using the project's commit format.
9
+
10
+ **Preference:** Prefer multiple commits unless changes are closely related. When in doubt, split into separate commits (e.g. tooling vs theme code, different features or areas). Only group into one commit when the changes clearly belong together (e.g. one feature and its snippet, or a single refactor touching several files for the same purpose).
11
+
12
+ ## Rules to Apply
13
+
14
+ Before suggesting any commit messages, read and apply:
15
+
16
+ 1. `.cursor/rules/00-rule-index.mdc` — rule index
17
+ 2. `.cursor/rules/commit-rules.mdc` — commit format (emoji + type + description), types (fix, feat, refactor, style, etc.), imperative mood, optional scope
18
+
19
+ Use the exact format and types from commit-rules; no period at end; lowercase description.
20
+
21
+ ## Workflow
22
+
23
+ 1. **Get change summary** — Run `git status` and `git diff` (and `git diff --staged` if anything is staged). Identify all modified, added, and deleted files.
24
+ 2. **Group logically** — Prefer more, smaller commits when changes are unrelated. Cluster only when clearly the same intent:
25
+ - Unrelated areas (e.g. tooling/skills vs theme snippet, cart fix vs collection style) → separate commits
26
+ - One feature (e.g. new section + its snippet) → one commit
27
+ - Refactor in one area, fix in another → separate commits
28
+ - Locale/schema/docs can be separate if they form a clear unit
29
+ - When in doubt, split rather than combine
30
+ 3. **Assign type** — For each group, pick the best type from commit-rules (🔨 fix, 🚀 feat, ♻️ refactor, 🎨 style, 🗑️ remove, 📝 docs, 🔧 chore, etc.) and optional scope (e.g. `sections`, `cart`, `locales`).
31
+ 4. **Write messages** — One line per commit: `<emoji> <type>(scope): <description>`. Imperative, lowercase, no period. Multi-line body only if the change is complex and warrants bullets.
32
+ 5. **Output and execute** — List the suggested commits (message + files per commit), then **run the commits yourself**: for each group, run `git add` on the listed files and `git commit -m "..."` with the exact message. Do not only suggest commands; execute them so the working tree is left with the changes committed. Summarize what was committed at the end.
33
+
34
+ ## Output Format
35
+
36
+ Show the plan briefly, then run it:
37
+
38
+ ```markdown
39
+ ## Suggested commits
40
+
41
+ **Commit 1:** `🚀 feat(sections): add featured collection section`
42
+ - `sections/s--featured-collection.liquid`
43
+ - `snippets/m--product-card.liquid`
44
+
45
+ **Commit 2:** `🎨 style(cart): adjust drawer spacing`
46
+ - `sections/cart--drawer.liquid`
47
+ - `assets/style.css`
48
+ ```
49
+
50
+ Then execute: `git add` + `git commit` for each group in order. After running, confirm: "Done. Created N commits: …"
51
+
52
+ ## Example Trigger
53
+
54
+ User: "/commit-in-groups" or "group my changes into separate commits."
55
+ → Run git status/diff, group changes, list commits with messages and file lists, then **run** `git add` and `git commit` for each group (do not only suggest commands).
@@ -0,0 +1,81 @@
1
+ ---
2
+ name: linear-create-task
3
+ description: Creates Linear issues in the Voldt Redesign project with PRD-style descriptions. Use when the user says "create Linear task", "add Linear issue", "create task in Linear", "/linear-task", or describes a feature/fix and asks to put it in Linear. Assigns to Berk (coding) or Taha (design). Supports attaching images/videos to the issue and using them to enrich the PRD. Uses user-Linear MCP.
4
+ ---
5
+
6
+ # Linear Create Task
7
+
8
+ Creates a Linear issue in the **Voldt Redesign** project with a PRD-style description, sensible defaults for milestone and labels, and assignee by task type. Uploads user-provided images/videos as attachments and uses them to enhance the description.
9
+
10
+ ## Rules to Apply
11
+
12
+ Before creating a task, read `.cursor/rules/00-rule-index.mdc`. No other rule file is required; mention commit-rules only if the user wants a branch name convention.
13
+
14
+ ## Linear Context
15
+
16
+ - **Project:** `Voldt Redesign — [12.07]` or `voldt redesign`
17
+ - **Team:** `Electric Maybe` (required for `save_issue`)
18
+
19
+ **Milestones (use exact name):**
20
+
21
+ | Name | Description |
22
+ |------|-------------|
23
+ | Core Commerce Design | Product, cart, header, footer templates |
24
+ | Merch Design | Home, collection, search templates |
25
+ | Content Design | The rest of the templates |
26
+ | Core Commerce Dev | Product, cart, header, footer |
27
+ | Merch Dev | Home, collection, search |
28
+ | Content Dev | The rest |
29
+
30
+ **Labels (team Electric Maybe) — use as needed:**
31
+
32
+ - **Type:** `🚀 feat`, `🔨 fix`, `🔁 change`, `🔥 remove`, `🤖 chore`, `✅ QA`, `📣 marketing`, `💫 revision`, `🧱 section`, `📄 template`
33
+ - **Origin:** `project-requirement`, `client-request`, `qa-found`, `bug-discovered`, `internal-decision`
34
+ - **Team:** `dev`, `design`
35
+ - **Risk:** `!`, `!!`, `!!!`
36
+ - **Scope:** `collection template`, `product template`, `cart template`, or section/snippet names (e.g. `s--featured-collection`, `m--filters`)
37
+
38
+ If in doubt, call MCP `user-Linear` **list_milestones** with `project: "Voldt Redesign — [12.07]"` or **list_issue_labels** with `team: "Electric Maybe"` to refresh.
39
+
40
+ ## PRD Description Structure
41
+
42
+ - **Title:** Short, clear (e.g. problem + solution in a few words).
43
+ - **Description (Markdown):**
44
+ - Problem/context (1–2 sentences or bullets).
45
+ - `### Requirements` or `### Structure` — e.g. metaobject fields, API, data model.
46
+ - `### Proposed solution` — numbered steps (1. … 2. …).
47
+ - `### Related files` — bullet list of paths (`snippets/…`, `sections/…`).
48
+ - If user attached media: add `### Screenshots / reference` and describe what they show (do not invent; only what can be inferred).
49
+
50
+ Optional on the issue: **estimate** (points), **dueDate** (ISO), **parentId** (sub-task), **links** `[{url, title}]`, **state** (from **list_issue_statuses** for team).
51
+
52
+ ## Workflow
53
+
54
+ 1. **Gather input** — Title (required; from user or derived). Description/PRD: freeform; if minimal, expand into PRD structure above. Type: coding vs design (for assignee and labels). Milestone: from user or default `Merch Dev`. Labels: from user or defaults. Optional: estimate, due date, parent issue, state, links.
55
+ 2. **Enhance PRD from media** — If the user attached images or videos, describe what they show and add a `### Screenshots / reference` section to the description. Do not invent details.
56
+ 3. **Resolve project and team** — Use project `Voldt Redesign — [12.07]` and team `Electric Maybe`.
57
+ 4. **Create issue** — Call MCP **user-Linear** tool **save_issue** with: `title`, `description` (Markdown), `team`, `project`, `milestone`, `labels`, `assignee` (Berk or Taha per rule below); optional `estimate`, `dueDate`, `state`, `parentId`, `links`. Capture the returned issue identifier (e.g. EM-xxxx).
58
+ 5. **Attach media** — For each user-provided image/video: if you have file content or path, encode to base64 and call **user-Linear** **create_attachment** with the new issue identifier, `base64Content`, `filename`, `contentType` (e.g. `image/png`, `video/mp4`), and optional `title`.
59
+ 6. **Confirm** — Reply with issue identifier (e.g. EM-xxxx), Linear URL, and what was set (title, assignee, milestone, labels, attachments). If assignee by name fails, use **list_users** to resolve by name and retry with the returned user id/email.
60
+
61
+ ## Assignee Rule
62
+
63
+ - **Coding task** (implementation, fix, refactor, backend, Liquid/JS/CSS, “dev”): assignee **Berk** (e.g. `assignee: "Berk"` or email if needed).
64
+ - **Design task** (Figma, UI/UX, visual, layout, “design”): assignee **Taha** (e.g. `assignee: "Taha"` or email if needed).
65
+ - If unclear, ask or default to Berk. Resolve via **list_users** if name resolution fails.
66
+
67
+ ## Defaults (when user does not specify)
68
+
69
+ - **Milestone:** `Merch Dev`
70
+ - **Labels:** at least `project-requirement` + `dev` (coding) or `design` (design) + one type label: `🚀 feat`, `🔨 fix`, or `🤖 chore` as appropriate
71
+ - **State:** leave unset (Linear default) unless the user specifies one; optionally call **list_issue_statuses** with `team: "Electric Maybe"` and pick Backlog/Todo if you want to set state explicitly.
72
+
73
+ ## MCP Tools (user-Linear)
74
+
75
+ - **save_issue** — Create the issue (required: `title`, `team`; use `project`, `milestone`, `labels`, `assignee`, `description`; optional: `estimate`, `dueDate`, `state`, `parentId`, `links`).
76
+ - **create_attachment** — After issue is created: `issue` (identifier from save_issue response), `base64Content`, `filename`, `contentType`, optional `title`, `subtitle`.
77
+ - **list_milestones** — Optional: `project: "Voldt Redesign — [12.07]"` to refresh milestone list.
78
+ - **list_issue_labels** — Optional: `team: "Electric Maybe"` to refresh labels.
79
+ - **list_issue_statuses** — Optional: `team: "Electric Maybe"` to set state.
80
+ - **list_users** — If assignee by name fails, resolve Berk/Taha and retry with id or email.
81
+ - **get_issue** — Optional: confirm issue after creation.