@mallardbay/cursor-rules 1.0.29 → 1.0.31
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.
- package/.cursor/frontend-mobile/rules/ui.mdc +124 -0
- package/.cursor/rules/code-quality.mdc +1 -7
- package/.cursor/rules/general-best-practices.mdc +16 -0
- package/.cursor/rules/testing.mdc +2 -3
- package/.cursor/rules/typescript.mdc +1 -7
- package/.cursor/shared/rules/general-best-practices.mdc +11 -3
- package/README.md +19 -1
- package/bin/setup-cursor.sh +29 -3
- package/package.json +10 -1
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Defines best practices for building consistent, maintainable, and library-agnostic UI in Mallard Bay React Native projects
|
|
3
|
+
globs:
|
|
4
|
+
alwaysApply: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# UI Development Standards (React Native)
|
|
8
|
+
|
|
9
|
+
## Component Abstraction Layer
|
|
10
|
+
|
|
11
|
+
The mobile app uses NativeBase under the hood, but **all UI primitives must be accessed through custom wrapper components**. This abstraction enables switching to a different component library (e.g., Gluestack, Tamagui) with minimal churn.
|
|
12
|
+
|
|
13
|
+
### Import Rules
|
|
14
|
+
|
|
15
|
+
- **Never import directly from `native-base`** in feature code — always use the project's custom wrapper components
|
|
16
|
+
- **Never import from `~components/shared/ui`** — use the abstraction layer instead
|
|
17
|
+
- Wrapper components live in a dedicated directory (e.g., `src/components/primitives/` or the project's established equivalent)
|
|
18
|
+
- Only the wrapper component files themselves may import from `native-base`
|
|
19
|
+
|
|
20
|
+
### Wrapper Component Guidelines
|
|
21
|
+
|
|
22
|
+
- Each wrapper should expose a **stable, minimal API** — only pass through props the project actually uses
|
|
23
|
+
- Use TypeScript interfaces for wrapper props rather than re-exporting the library's prop types
|
|
24
|
+
- Keep wrappers thin — they should delegate to the underlying library, not add business logic
|
|
25
|
+
- Name wrappers after their semantic purpose (e.g., `AppText`, `AppButton`, `AppBox`) or match the library's naming if there's no ambiguity
|
|
26
|
+
- Document any NativeBase-specific behavior the wrapper intentionally hides or transforms
|
|
27
|
+
|
|
28
|
+
### Example Pattern
|
|
29
|
+
|
|
30
|
+
```tsx
|
|
31
|
+
// src/components/primitives/AppButton.tsx — ✅ Correct
|
|
32
|
+
import { Button as NativeBaseButton } from "native-base"
|
|
33
|
+
|
|
34
|
+
export default function AppButton(props: AppButtonProps) {
|
|
35
|
+
return <NativeBaseButton {...props} />
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// src/features/booking/BookingCard.tsx — ✅ Correct
|
|
39
|
+
import AppButton from "~components/primitives/AppButton"
|
|
40
|
+
|
|
41
|
+
// src/features/booking/BookingCard.tsx — ❌ Wrong
|
|
42
|
+
import { Button } from "native-base"
|
|
43
|
+
import { Button } from "~components/shared/ui"
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Theme Usage
|
|
47
|
+
|
|
48
|
+
Use theme values consistently across all components:
|
|
49
|
+
|
|
50
|
+
### Colors
|
|
51
|
+
|
|
52
|
+
- Use theme colors instead of hardcoded values
|
|
53
|
+
- Example: `theme.colors.primary[500]` instead of `'#3B82F6'`
|
|
54
|
+
|
|
55
|
+
### Spacing
|
|
56
|
+
|
|
57
|
+
- Use theme spacing values for margins and padding
|
|
58
|
+
- Example: `theme.space[4]` instead of numeric literals
|
|
59
|
+
|
|
60
|
+
### Typography
|
|
61
|
+
|
|
62
|
+
- Use theme typography settings for text styles
|
|
63
|
+
- Example: `theme.fontSizes.md` instead of hardcoded numbers
|
|
64
|
+
|
|
65
|
+
## Component Structure
|
|
66
|
+
|
|
67
|
+
Maintain clean and consistent component structure:
|
|
68
|
+
|
|
69
|
+
### Nesting
|
|
70
|
+
|
|
71
|
+
- Limit component nesting to maximum depth of 3
|
|
72
|
+
- Keep component hierarchy readable and maintainable
|
|
73
|
+
|
|
74
|
+
### Inline Styles
|
|
75
|
+
|
|
76
|
+
- Limit inline styles to maximum of 2 per component
|
|
77
|
+
- Prefer theme-based styling and style props
|
|
78
|
+
|
|
79
|
+
### Component Library
|
|
80
|
+
|
|
81
|
+
- Use the project's custom wrapper components (abstraction layer) for all UI primitives
|
|
82
|
+
- If a wrapper doesn't exist yet for a NativeBase component you need, create one in the primitives directory following the established pattern
|
|
83
|
+
- Keep wrapper components minimal and focused on API stability
|
|
84
|
+
|
|
85
|
+
## Platform Considerations
|
|
86
|
+
|
|
87
|
+
### React Native Specifics
|
|
88
|
+
|
|
89
|
+
- Use `StyleSheet.create` or NativeBase style props — avoid inline object styles
|
|
90
|
+
- Prefer `FlatList` / `SectionList` over mapping arrays for long lists
|
|
91
|
+
- Use platform-specific extensions (`.ios.tsx`, `.android.tsx`) only when behavior genuinely diverges
|
|
92
|
+
- Test on both iOS and Android
|
|
93
|
+
|
|
94
|
+
### Navigation
|
|
95
|
+
|
|
96
|
+
- Follow the project's established navigation patterns (React Navigation or equivalent)
|
|
97
|
+
- Keep screen components thin — delegate to feature components
|
|
98
|
+
|
|
99
|
+
### Performance
|
|
100
|
+
|
|
101
|
+
- Use `React.memo` for pure list item components
|
|
102
|
+
- Use `useCallback` for handlers passed to list items
|
|
103
|
+
- Use `useMemo` for expensive computations and filtered/sorted data
|
|
104
|
+
- Avoid anonymous functions in `renderItem` and event handlers
|
|
105
|
+
- Minimize bridge crossings by batching state updates
|
|
106
|
+
|
|
107
|
+
## Rendering Optimization
|
|
108
|
+
|
|
109
|
+
- Optimize component rendering
|
|
110
|
+
- Avoid unnecessary re-renders
|
|
111
|
+
- Move function definitions outside components or use `useCallback` for event handlers
|
|
112
|
+
- Use `useCallback` for functions passed as props to child components
|
|
113
|
+
- Use `useMemo` for expensive computations and complex data transformations
|
|
114
|
+
- Memoize filtered, sorted, or mapped arrays to avoid recalculation on every render
|
|
115
|
+
|
|
116
|
+
## File Patterns
|
|
117
|
+
|
|
118
|
+
These rules apply to all TypeScript and TSX files in the project.
|
|
119
|
+
|
|
120
|
+
## Components
|
|
121
|
+
|
|
122
|
+
- Keep components small and focused on a single responsibility
|
|
123
|
+
- Use functional components with hooks instead of class components
|
|
124
|
+
- Prefer `export default function BookingCard() {` over `function BookingCard(): React.ReactElement | null {` when defining components
|
|
@@ -14,13 +14,7 @@ alwaysApply: false
|
|
|
14
14
|
- Functions: camelCase
|
|
15
15
|
- Constants: UPPER_SNAKE_CASE
|
|
16
16
|
- Types: PascalCase
|
|
17
|
-
-
|
|
18
|
-
1. Imports
|
|
19
|
-
2. Constants
|
|
20
|
-
3. Exported functions / components
|
|
21
|
-
4. Helpers and other non-exported definitions
|
|
22
|
-
5. Types (when not imported)
|
|
23
|
-
- Exported members always come before non-exported members
|
|
17
|
+
- Types should be defined at the bottom of files
|
|
24
18
|
- PropTypes should be defined before component definitions
|
|
25
19
|
- Prefer using alias for importing components. Only use relative for tests or when there's a direct sibling
|
|
26
20
|
|
|
@@ -69,6 +69,12 @@ These principles apply to all code changes and should guide every implementation
|
|
|
69
69
|
### Testing and Linting
|
|
70
70
|
- **Lint and test files related to your changes** before completing work
|
|
71
71
|
- Run linters on modified files and fix issues
|
|
72
|
+
- Use `yarn lint:quiet` for quick iterations
|
|
73
|
+
- Use `yarn lint:quiet:slow` for deeper checks but slower when wrapping up
|
|
74
|
+
- **Never disable eslint rules** to make lint errors go away—fix the underlying issues instead
|
|
75
|
+
- Do not add `eslint-disable` comments unless there's a legitimate, documented reason
|
|
76
|
+
- Do not modify eslint config files to disable rules that are flagging real problems
|
|
77
|
+
- If a rule seems incorrect, investigate why it exists and fix the code properly
|
|
72
78
|
- Run tests for affected modules, not the entire test suite unnecessarily
|
|
73
79
|
- For large changes: **use test sharding**—split tests across multiple runs
|
|
74
80
|
- **Do not run all tests in parallel** when dealing with many changes
|
|
@@ -108,11 +114,18 @@ These principles apply to all code changes and should guide every implementation
|
|
|
108
114
|
4. **Check git history** to understand why code exists as it does
|
|
109
115
|
5. **Identify related files** that might be affected
|
|
110
116
|
6. **Ask clarifying questions** if requirements are unclear
|
|
117
|
+
7. **Use MCP servers when available**—leverage Model Context Protocol servers for enhanced capabilities
|
|
118
|
+
- **Context7 MCP**: Use the context7 MCP server when available to retrieve up-to-date documentation and code examples for libraries
|
|
119
|
+
- If context7 MCP is not available, suggest adding it to improve access to library documentation
|
|
120
|
+
- **Suggest useful MCP servers**: When appropriate, suggest popular and useful MCP servers that could enhance development workflow based on the task at hand
|
|
121
|
+
- Consider MCP servers for documentation, testing, debugging, and other development tasks
|
|
111
122
|
|
|
112
123
|
### During Implementation
|
|
113
124
|
1. Make **small, incremental changes**
|
|
114
125
|
2. **Test as you go**—verify each change works before moving on
|
|
115
126
|
3. **Lint frequently**—don't accumulate lint errors
|
|
127
|
+
- Use `yarn lint:quiet` for quick iterations
|
|
128
|
+
- Use `yarn lint:quiet:slow` for deeper checks when wrapping up
|
|
116
129
|
4. **Follow existing patterns**—don't reinvent the wheel
|
|
117
130
|
5. **Use semantic names**—code should be self-documenting
|
|
118
131
|
6. **Keep functions focused**—one responsibility per function
|
|
@@ -122,6 +135,8 @@ These principles apply to all code changes and should guide every implementation
|
|
|
122
135
|
1. **Clean up failed attempts**—remove experimental code
|
|
123
136
|
2. **Remove unused code**—imports, variables, functions
|
|
124
137
|
3. **Run linters** on modified files
|
|
138
|
+
- Use `yarn lint:quiet` for quick iterations
|
|
139
|
+
- Use `yarn lint:quiet:slow` for deeper checks when wrapping up
|
|
125
140
|
4. **Run relevant tests**—not the entire suite unless necessary
|
|
126
141
|
5. **Verify the change works** end-to-end
|
|
127
142
|
6. **Check for side effects**—ensure changes don't break unrelated code
|
|
@@ -143,6 +158,7 @@ These principles apply to all code changes and should guide every implementation
|
|
|
143
158
|
- ❌ Functions that do multiple unrelated things
|
|
144
159
|
- ❌ Leaving commented-out code or debugging statements
|
|
145
160
|
- ❌ Skipping tests or linting "to save time"
|
|
161
|
+
- ❌ Disabling eslint rules instead of fixing the underlying issues
|
|
146
162
|
- ❌ Running entire test suite for small changes
|
|
147
163
|
- ❌ Leaving experimental code after failed attempts
|
|
148
164
|
- ❌ Premature optimization without profiling
|
|
@@ -53,14 +53,13 @@ We do not chase 100% coverage for its own sake. If a test doesn’t meaningfully
|
|
|
53
53
|
|
|
54
54
|
### Mocking Guidelines
|
|
55
55
|
|
|
56
|
-
-
|
|
56
|
+
- Use mock helpers instead of inline mocks
|
|
57
|
+
- Follow existing patterns for:
|
|
57
58
|
- Entity mocks
|
|
58
59
|
- Apollo mocks
|
|
59
60
|
- Provider mocks
|
|
60
|
-
- **Mock data through Apollo mocks, not module mocks**—use Apollo mock providers to control query/mutation responses instead of mocking modules or components directly
|
|
61
61
|
- Keep mocks simple and maintainable
|
|
62
62
|
- **Do not use variable matchers for Apollo mocks**—match exact variables (e.g. avoid `expect.anything()` or `variables: {}`) so tests fail when the component passes incorrect variables to queries or mutations
|
|
63
|
-
- **Never mock `@mallardbay/lib-react-components`**—if truly unavoidable, stop and ask for approval first
|
|
64
63
|
|
|
65
64
|
### Test Utilities
|
|
66
65
|
|
|
@@ -14,13 +14,7 @@ Be as strictly as possible where it delivers clear value—specifically in preve
|
|
|
14
14
|
|
|
15
15
|
### File Organization
|
|
16
16
|
|
|
17
|
-
-
|
|
18
|
-
1. Imports
|
|
19
|
-
2. Constants
|
|
20
|
-
3. Exported functions / components
|
|
21
|
-
4. Helpers and other non-exported definitions
|
|
22
|
-
5. Types (when not imported)
|
|
23
|
-
- Exported members always come before non-exported members
|
|
17
|
+
- Place types at the bottom of files
|
|
24
18
|
- Define PropTypes before component definitions
|
|
25
19
|
|
|
26
20
|
## Best Practices
|
|
@@ -7,6 +7,14 @@ alwaysApply: true
|
|
|
7
7
|
|
|
8
8
|
These principles apply to all code changes and should guide every implementation decision.
|
|
9
9
|
|
|
10
|
+
## Project Setup
|
|
11
|
+
|
|
12
|
+
- Install dependencies with `yarn`
|
|
13
|
+
- Run the project locally with `yarn start`
|
|
14
|
+
- Run tests with `yarn test`
|
|
15
|
+
- For large test suites, use sharding: `JEST_SHARD=1/n yarn test` where `n` is the total number of shards (never more than 10)
|
|
16
|
+
- Example: `JEST_SHARD=1/3 yarn test`, `JEST_SHARD=2/3 yarn test`, `JEST_SHARD=3/3 yarn test`
|
|
17
|
+
|
|
10
18
|
## Core Principles
|
|
11
19
|
|
|
12
20
|
### DRY (Don't Repeat Yourself)
|
|
@@ -75,8 +83,8 @@ These principles apply to all code changes and should guide every implementation
|
|
|
75
83
|
- Do not add `eslint-disable` comments unless there's a legitimate, documented reason
|
|
76
84
|
- Do not modify eslint config files to disable rules that are flagging real problems
|
|
77
85
|
- If a rule seems incorrect, investigate why it exists and fix the code properly
|
|
78
|
-
- Run tests for affected modules, not the entire test suite unnecessarily
|
|
79
|
-
- For large changes: **use test sharding
|
|
86
|
+
- Run tests with `yarn test` for affected modules, not the entire test suite unnecessarily
|
|
87
|
+
- For large changes: **use test sharding** via `JEST_SHARD=1/n yarn test`—split tests across multiple shards (never more than 10)
|
|
80
88
|
- **Do not run all tests in parallel** when dealing with many changes
|
|
81
89
|
- Tests should be **clear, fast, and minimize setup duplication**
|
|
82
90
|
- Use shared test utilities and fixtures to reduce boilerplate
|
|
@@ -143,7 +151,7 @@ These principles apply to all code changes and should guide every implementation
|
|
|
143
151
|
|
|
144
152
|
### When Changes Are Large
|
|
145
153
|
1. **Consider splitting** into multiple smaller PRs
|
|
146
|
-
2. **Use test sharding
|
|
154
|
+
2. **Use test sharding** (`JEST_SHARD=1/n yarn test`)—run tests in batches, not all at once (max 10 shards)
|
|
147
155
|
3. **Review incrementally**—make sure each part works before moving on
|
|
148
156
|
4. **Document the approach**—explain why changes are structured this way
|
|
149
157
|
5. **Check impact** on related systems and files
|
package/README.md
CHANGED
|
@@ -112,10 +112,28 @@ your-project/
|
|
|
112
112
|
└── AGENTS.md # Codex IDE configuration (combined rules)
|
|
113
113
|
```
|
|
114
114
|
|
|
115
|
-
Both `CLAUDE.md` and `AGENTS.md` combine all applicable rules into single files, with YAML frontmatter stripped for compatibility. Each file
|
|
115
|
+
Both `CLAUDE.md` and `AGENTS.md` combine all applicable rules into single files, with YAML frontmatter stripped for compatibility. Each file opens with a header comment that states the file is **auto-generated** (do not edit by hand) and that **project-specific rules** belong in `AGENTS_LOCAL.md`, plus which tool consumes the file.
|
|
116
116
|
|
|
117
117
|
Skills are automatically discovered by Cursor, Claude Code, and Codex, and can be invoked with `/skill-name` in chat. The setup script copies skills to all three platform directories for cross-platform compatibility.
|
|
118
118
|
|
|
119
|
+
### Project-Local Rules (`AGENTS_LOCAL.md`)
|
|
120
|
+
|
|
121
|
+
If your project needs additional rules beyond what the shared configuration provides, create an `AGENTS_LOCAL.md` file in your project root. Its content will be automatically appended to both `CLAUDE.md` and `AGENTS.md` when the setup script runs.
|
|
122
|
+
|
|
123
|
+
This is useful for:
|
|
124
|
+
- Project-specific conventions or architectural decisions
|
|
125
|
+
- Team-level overrides or additions
|
|
126
|
+
- Context that only applies to a single repository
|
|
127
|
+
|
|
128
|
+
```
|
|
129
|
+
your-project/
|
|
130
|
+
├── AGENTS_LOCAL.md # Your project-specific rules (checked into version control)
|
|
131
|
+
├── CLAUDE.md # Generated (includes AGENTS_LOCAL.md content)
|
|
132
|
+
└── AGENTS.md # Generated (includes AGENTS_LOCAL.md content)
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
`AGENTS_LOCAL.md` is meant to be checked into version control, while `CLAUDE.md` and `AGENTS.md` are generated and should be gitignored.
|
|
136
|
+
|
|
119
137
|
## Development
|
|
120
138
|
|
|
121
139
|
### Adding New Rules
|
package/bin/setup-cursor.sh
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
|
-
# setup-cursor.sh — frontend
|
|
2
|
+
# setup-cursor.sh — frontend, frontend-lib, frontend-mobile & backend layering with shared base
|
|
3
3
|
# Also generates CLAUDE.md for Claude Code and AGENTS.md for Codex
|
|
4
4
|
|
|
5
5
|
set -e
|
|
@@ -65,6 +65,7 @@ fi
|
|
|
65
65
|
SHARED_DIR="$SRC_DIR/.cursor/shared/rules"
|
|
66
66
|
FRONTEND_DIR="$SRC_DIR/.cursor/frontend/rules"
|
|
67
67
|
FRONTEND_LIB_DIR="$SRC_DIR/.cursor/frontend-lib/rules"
|
|
68
|
+
FRONTEND_MOBILE_DIR="$SRC_DIR/.cursor/frontend-mobile/rules"
|
|
68
69
|
BACKEND_DIR="$SRC_DIR/.cursor/backend/rules"
|
|
69
70
|
SHARED_SKILLS_DIR="$SRC_DIR/.cursor/shared/skills"
|
|
70
71
|
|
|
@@ -91,8 +92,16 @@ This file provides custom instructions and project context for $tool_name.
|
|
|
91
92
|
|
|
92
93
|
$description
|
|
93
94
|
|
|
94
|
-
|
|
95
|
-
|
|
95
|
+
AUTO-GENERATED — DO NOT EDIT THIS FILE BY HAND. It is produced by
|
|
96
|
+
@mallardbay/cursor-rules when you run the setup script (e.g. npx @mallardbay/cursor-rules <env-type>).
|
|
97
|
+
Any manual changes will be overwritten on the next run.
|
|
98
|
+
|
|
99
|
+
Content sources: shared and environment-specific rules copied into .cursor/rules/ as *.mdc files,
|
|
100
|
+
combined here with YAML frontmatter stripped.
|
|
101
|
+
|
|
102
|
+
PROJECT-SPECIFIC RULES: Add or edit AGENTS_LOCAL.md in the project root (commit that file).
|
|
103
|
+
On the next setup run, its contents are appended to both CLAUDE.md and AGENTS.md. Do not put
|
|
104
|
+
long-lived project-only guidance only in this file — use AGENTS_LOCAL.md instead.
|
|
96
105
|
|
|
97
106
|
For more information:
|
|
98
107
|
- $tool_name: See official documentation
|
|
@@ -215,12 +224,29 @@ case "$ENV_TYPE" in
|
|
|
215
224
|
append_to_md_files "$FRONTEND_DIR"
|
|
216
225
|
append_to_md_files "$FRONTEND_LIB_DIR"
|
|
217
226
|
;;
|
|
227
|
+
frontend-mobile)
|
|
228
|
+
copy_rules "$FRONTEND_MOBILE_DIR"
|
|
229
|
+
append_to_md_files "$FRONTEND_MOBILE_DIR"
|
|
230
|
+
;;
|
|
218
231
|
*)
|
|
219
232
|
echo "Unknown environment type: $ENV_TYPE"
|
|
220
233
|
exit 1
|
|
221
234
|
;;
|
|
222
235
|
esac
|
|
223
236
|
|
|
237
|
+
# Append project-local AGENTS_LOCAL.md if it exists
|
|
238
|
+
if [ -f "$PROJECT_DIR/AGENTS_LOCAL.md" ]; then
|
|
239
|
+
echo "Found AGENTS_LOCAL.md — appending project-local rules"
|
|
240
|
+
echo "" >> "$CLAUDE_MD_TEMP"
|
|
241
|
+
echo "---" >> "$CLAUDE_MD_TEMP"
|
|
242
|
+
echo "" >> "$CLAUDE_MD_TEMP"
|
|
243
|
+
cat "$PROJECT_DIR/AGENTS_LOCAL.md" >> "$CLAUDE_MD_TEMP"
|
|
244
|
+
echo "" >> "$AGENTS_MD_TEMP"
|
|
245
|
+
echo "---" >> "$AGENTS_MD_TEMP"
|
|
246
|
+
echo "" >> "$AGENTS_MD_TEMP"
|
|
247
|
+
cat "$PROJECT_DIR/AGENTS_LOCAL.md" >> "$AGENTS_MD_TEMP"
|
|
248
|
+
fi
|
|
249
|
+
|
|
224
250
|
# Generate both CLAUDE.md and AGENTS.md
|
|
225
251
|
mv "$CLAUDE_MD_TEMP" "$PROJECT_DIR/CLAUDE.md"
|
|
226
252
|
mv "$AGENTS_MD_TEMP" "$PROJECT_DIR/AGENTS.md"
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mallardbay/cursor-rules",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.31",
|
|
4
4
|
"description": "Mallard Bay shared cursor rules",
|
|
5
5
|
"main": "bin/setup-cursor.sh",
|
|
6
6
|
"repository": "git@github.com:mallardbay/cursor-rules.git",
|
|
@@ -18,6 +18,15 @@
|
|
|
18
18
|
"publishConfig": {
|
|
19
19
|
"access": "public"
|
|
20
20
|
},
|
|
21
|
+
"scripts": {
|
|
22
|
+
"test": "echo 'No tests yet'",
|
|
23
|
+
"test:ci": "echo 'No tests yet'",
|
|
24
|
+
"lint:quiet": "echo 'No linting configured yet'",
|
|
25
|
+
"release": "semantic-release"
|
|
26
|
+
},
|
|
27
|
+
"devDependencies": {
|
|
28
|
+
"semantic-release": "^24.0.0"
|
|
29
|
+
},
|
|
21
30
|
"bin": {
|
|
22
31
|
"cursor-rules": "bin/setup-cursor.sh"
|
|
23
32
|
}
|