@mr.dj2u/knowledge 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.
- package/dist/content/checklists/ship-test-loop.md +16 -0
- package/dist/content/checklists/unified-agent-bundle-validation.md +8 -0
- package/dist/content/examples/ship-test-loop.md +13 -0
- package/dist/content/examples/unified-agent-bundle-bootstrap.md +8 -0
- package/dist/content/guides/animation-performance.md +30 -0
- package/dist/content/guides/post-create-onboarding.md +113 -0
- package/dist/content/patterns/api/api-routes.md +314 -0
- package/dist/content/patterns/api/error-handling.md +311 -0
- package/dist/content/patterns/database/drizzle-schema.md +280 -0
- package/dist/content/patterns/database/migrations.md +365 -0
- package/dist/content/patterns/database/query-organization.md +537 -0
- package/dist/content/patterns/database/relations.md +450 -0
- package/dist/content/patterns/deployment/build-configuration.md +452 -0
- package/dist/content/patterns/deployment/ci-cd-patterns.md +448 -0
- package/dist/content/patterns/deployment/environment-config.md +380 -0
- package/dist/content/patterns/deployment/hosting-setup.md +425 -0
- package/dist/content/patterns/project/configuration-patterns.md +459 -0
- package/dist/content/patterns/project/documentation-org.md +506 -0
- package/dist/content/patterns/project/folder-structure.md +398 -0
- package/dist/content/patterns/project/library-exports.md +465 -0
- package/dist/content/patterns/project/monorepo-structure.md +500 -0
- package/dist/content/patterns/routing/dynamic-routes.md +221 -0
- package/dist/content/patterns/routing/file-based-routing.md +186 -0
- package/dist/content/patterns/routing/route-groups.md +429 -0
- package/dist/content/patterns/state/persistence-middleware.md +521 -0
- package/dist/content/patterns/state/selector-hooks.md +538 -0
- package/dist/content/patterns/state/store-organization.md +539 -0
- package/dist/content/patterns/state/zustand-patterns.md +348 -0
- package/dist/content/patterns/styling/component-styling.md +468 -0
- package/dist/content/patterns/styling/responsive-patterns.md +398 -0
- package/dist/content/patterns/styling/theme-configuration.md +426 -0
- package/dist/content/patterns/styling/uniwind-setup.md +412 -0
- package/dist/content/prompts/continue-development.md +27 -0
- package/dist/content/prompts/create-expo-super-stack.md +29 -0
- package/dist/content/prompts/fix-seo.md +29 -0
- package/dist/content/prompts/onboard-new-expo-app.md +11 -0
- package/dist/content/prompts/prepare-deploy.md +29 -0
- package/dist/content/prompts/project-research-plan.md +29 -0
- package/dist/content/prompts/review-expo-project.md +29 -0
- package/dist/content/prompts/run-doctor.md +30 -0
- package/dist/content/prompts/ship-test-loop.md +24 -0
- package/dist/content/reference/create-expo-stack-uniwind.md +29 -0
- package/dist/content/reference/doctor-dogfood.md +42 -0
- package/dist/content/reference/mcp-sdk-transport.md +30 -0
- package/dist/content/reference/package-ci-patterns.md +24 -0
- package/dist/content/reference/reference-repo-evacuation.md +31 -0
- package/dist/content/resource-index.json +67 -0
- package/dist/content/rules/app-folder-architecture.md +13 -0
- package/dist/content/rules/env-hygiene.md +9 -0
- package/dist/content/rules/seo-metadata.md +7 -0
- package/dist/content/rules/ssr-safety.md +9 -0
- package/dist/content/skills/api-routes.md +33 -0
- package/dist/content/skills/continue-development.md +31 -0
- package/dist/content/skills/debugging.md +31 -0
- package/dist/content/skills/deployment.md +32 -0
- package/dist/content/skills/dev-server-management.md +31 -0
- package/dist/content/skills/env-vars.md +32 -0
- package/dist/content/skills/expo-router-architecture.md +33 -0
- package/dist/content/skills/expo-ssr-safety.md +32 -0
- package/dist/content/skills/plugin-creation.md +41 -0
- package/dist/content/skills/production-server-patterns.md +31 -0
- package/dist/content/skills/project-onboarding.md +31 -0
- package/dist/content/skills/research-plan-intake.md +31 -0
- package/dist/content/skills/seo-metadata.md +31 -0
- package/dist/content/skills/super-stack-startup.md +31 -0
- package/dist/content/skills/uniwind-theming.md +32 -0
- package/dist/index.d.ts +46 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +369 -0
- package/dist/index.js.map +1 -0
- package/dist/patterns/index.d.ts +78 -0
- package/dist/patterns/index.d.ts.map +1 -0
- package/dist/patterns/index.js +264 -0
- package/dist/patterns/index.js.map +1 -0
- package/dist/prompts/index.d.ts +35 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +270 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/skills/index.d.ts +3 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +2 -0
- package/dist/skills/index.js.map +1 -0
- package/package.json +50 -0
|
@@ -0,0 +1,412 @@
|
|
|
1
|
+
# Uniwind & Tailwind v4 Setup
|
|
2
|
+
|
|
3
|
+
## Description
|
|
4
|
+
|
|
5
|
+
Uniwind provides Tailwind v4 CSS integration for React Native with build-time style computation and Metro bundler configuration. Design tokens (colors, spacing, typography) live in CSS using `@layer theme` with `@variant` for light/dark modes, enabling cross-platform responsive styling without separate theme providers.
|
|
6
|
+
|
|
7
|
+
## When to Use
|
|
8
|
+
|
|
9
|
+
**Use Uniwind** for:
|
|
10
|
+
- ✅ React Native projects (iOS, Android, Web)
|
|
11
|
+
- ✅ Responsive design with breakpoints
|
|
12
|
+
- ✅ Dark mode support with CSS variables
|
|
13
|
+
- ✅ Tailwind utility-first styling approach
|
|
14
|
+
- ✅ Projects using Tailwind v4+
|
|
15
|
+
|
|
16
|
+
## Installation
|
|
17
|
+
|
|
18
|
+
### 1. Install Dependencies
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
npm install uniwind
|
|
22
|
+
npm install --save-dev tailwindcss@^4 @tailwindcss/postcss
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
### 2. Configure Metro Bundler
|
|
26
|
+
|
|
27
|
+
```javascript
|
|
28
|
+
// File: metro.config.js
|
|
29
|
+
const { getDefaultConfig } = require('@react-native/metro-config');
|
|
30
|
+
const { withUniwindConfig } = require('uniwind/metro');
|
|
31
|
+
|
|
32
|
+
const config = getDefaultConfig(__dirname);
|
|
33
|
+
|
|
34
|
+
module.exports = withUniwindConfig(config, {
|
|
35
|
+
cssEntryFile: './src/global.css',
|
|
36
|
+
// Optional: set rem polyfill if needed (default 16px)
|
|
37
|
+
// polyfills: { rem: 16 }
|
|
38
|
+
});
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### 3. Add PostCSS Configuration
|
|
42
|
+
|
|
43
|
+
```javascript
|
|
44
|
+
// File: postcss.config.js
|
|
45
|
+
module.exports = {
|
|
46
|
+
plugins: {
|
|
47
|
+
'postcss-import': {},
|
|
48
|
+
'tailwindcss/nesting': {},
|
|
49
|
+
tailwindcss: {},
|
|
50
|
+
autoprefixer: {},
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## Code Example
|
|
56
|
+
|
|
57
|
+
### Global CSS with Theme Tokens
|
|
58
|
+
|
|
59
|
+
```css
|
|
60
|
+
/* File: src/global.css */
|
|
61
|
+
@import 'tailwindcss';
|
|
62
|
+
@import 'uniwind';
|
|
63
|
+
|
|
64
|
+
/* Define theme tokens as CSS variables */
|
|
65
|
+
@layer theme {
|
|
66
|
+
:root {
|
|
67
|
+
/* Light mode (default) */
|
|
68
|
+
@variant light {
|
|
69
|
+
/* Primary colors */
|
|
70
|
+
--color-primary: #ef5350;
|
|
71
|
+
--color-primary-50: #ffebee;
|
|
72
|
+
--color-primary-100: #ffcdd2;
|
|
73
|
+
--color-primary-500: #ef5350;
|
|
74
|
+
--color-primary-700: #c62828;
|
|
75
|
+
--color-primary-900: #b71c1c;
|
|
76
|
+
|
|
77
|
+
/* Secondary colors */
|
|
78
|
+
--color-secondary: #29b6f6;
|
|
79
|
+
--color-secondary-500: #29b6f6;
|
|
80
|
+
--color-secondary-700: #0277bd;
|
|
81
|
+
|
|
82
|
+
/* Neutral colors */
|
|
83
|
+
--color-background: #fafafa;
|
|
84
|
+
--color-surface: #ffffff;
|
|
85
|
+
--color-typography: #212121;
|
|
86
|
+
--color-border: #e0e0e0;
|
|
87
|
+
--color-divider: #bdbdbd;
|
|
88
|
+
|
|
89
|
+
/* Status colors */
|
|
90
|
+
--color-success: #4caf50;
|
|
91
|
+
--color-warning: #ff9800;
|
|
92
|
+
--color-error: #f44336;
|
|
93
|
+
--color-info: #2196f3;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/* Dark mode */
|
|
97
|
+
@variant dark {
|
|
98
|
+
--color-primary: #ef5350;
|
|
99
|
+
--color-primary-50: #ffebee;
|
|
100
|
+
--color-primary-100: #ffcdd2;
|
|
101
|
+
--color-primary-500: #ef5350;
|
|
102
|
+
--color-primary-700: #d32f2f;
|
|
103
|
+
--color-primary-900: #b71c1c;
|
|
104
|
+
|
|
105
|
+
--color-secondary: #29b6f6;
|
|
106
|
+
--color-secondary-500: #29b6f6;
|
|
107
|
+
--color-secondary-700: #0288d1;
|
|
108
|
+
|
|
109
|
+
--color-background: #121212;
|
|
110
|
+
--color-surface: #1e1e1e;
|
|
111
|
+
--color-typography: #ffffff;
|
|
112
|
+
--color-border: #424242;
|
|
113
|
+
--color-divider: #616161;
|
|
114
|
+
|
|
115
|
+
--color-success: #66bb6a;
|
|
116
|
+
--color-warning: #ffb74d;
|
|
117
|
+
--color-error: #ef5350;
|
|
118
|
+
--color-info: #64b5f6;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/* Spacing scale */
|
|
122
|
+
--spacing-0: 0;
|
|
123
|
+
--spacing-1: 4px;
|
|
124
|
+
--spacing-2: 8px;
|
|
125
|
+
--spacing-3: 12px;
|
|
126
|
+
--spacing-4: 16px;
|
|
127
|
+
--spacing-6: 24px;
|
|
128
|
+
--spacing-8: 32px;
|
|
129
|
+
|
|
130
|
+
/* Typography */
|
|
131
|
+
--font-sans: 'Roboto', sans-serif;
|
|
132
|
+
--font-mono: 'RobotoMono', monospace;
|
|
133
|
+
--font-display: 'Modak', serif;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/* Define typography utilities */
|
|
138
|
+
@layer utilities {
|
|
139
|
+
.typography-header {
|
|
140
|
+
@apply text-4xl font-bold tracking-tight;
|
|
141
|
+
font-family: var(--font-display);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
.typography-subheader {
|
|
145
|
+
@apply text-2xl font-bold;
|
|
146
|
+
font-family: var(--font-sans);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
.typography-body {
|
|
150
|
+
@apply text-base leading-6;
|
|
151
|
+
font-family: var(--font-sans);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
.typography-caption {
|
|
155
|
+
@apply text-sm text-gray-500;
|
|
156
|
+
font-family: var(--font-sans);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/* Global style reset */
|
|
161
|
+
@layer base {
|
|
162
|
+
* {
|
|
163
|
+
@apply margin-0 padding-0;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
body {
|
|
167
|
+
@apply bg-[var(--color-background)] text-[var(--color-typography)];
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
**From:** expo-super-template/global.css, DJsPortfolio/global.css
|
|
173
|
+
|
|
174
|
+
### Component Styling with Uniwind
|
|
175
|
+
|
|
176
|
+
```typescript
|
|
177
|
+
// File: src/components/Button.tsx
|
|
178
|
+
import { Pressable, Text } from 'react-native';
|
|
179
|
+
import { cn } from '@/utils/cn'; // tailwind-merge helper
|
|
180
|
+
|
|
181
|
+
interface ButtonProps {
|
|
182
|
+
title: string;
|
|
183
|
+
onPress: () => void;
|
|
184
|
+
variant?: 'primary' | 'secondary' | 'ghost';
|
|
185
|
+
disabled?: boolean;
|
|
186
|
+
fullWidth?: boolean;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
export function Button({
|
|
190
|
+
title,
|
|
191
|
+
onPress,
|
|
192
|
+
variant = 'primary',
|
|
193
|
+
disabled = false,
|
|
194
|
+
fullWidth = false,
|
|
195
|
+
}: ButtonProps) {
|
|
196
|
+
const baseStyles = 'px-4 py-3 rounded-lg active:opacity-80 disabled:opacity-50';
|
|
197
|
+
|
|
198
|
+
const variantStyles = {
|
|
199
|
+
primary: 'bg-[var(--color-primary)] text-white',
|
|
200
|
+
secondary: 'bg-[var(--color-secondary)] text-white',
|
|
201
|
+
ghost: 'bg-transparent border border-[var(--color-border)]',
|
|
202
|
+
};
|
|
203
|
+
|
|
204
|
+
const containerStyles = cn(
|
|
205
|
+
baseStyles,
|
|
206
|
+
variantStyles[variant],
|
|
207
|
+
fullWidth && 'w-full'
|
|
208
|
+
);
|
|
209
|
+
|
|
210
|
+
return (
|
|
211
|
+
<Pressable
|
|
212
|
+
className={containerStyles}
|
|
213
|
+
onPress={onPress}
|
|
214
|
+
disabled={disabled}
|
|
215
|
+
>
|
|
216
|
+
<Text className="text-center font-semibold">
|
|
217
|
+
{title}
|
|
218
|
+
</Text>
|
|
219
|
+
</Pressable>
|
|
220
|
+
);
|
|
221
|
+
}
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
### Dark Mode Support
|
|
225
|
+
|
|
226
|
+
```typescript
|
|
227
|
+
// File: src/hooks/useColorScheme.ts
|
|
228
|
+
import { useColorScheme as useNativeColorScheme } from 'react-native';
|
|
229
|
+
|
|
230
|
+
export function useColorScheme() {
|
|
231
|
+
const scheme = useNativeColorScheme();
|
|
232
|
+
return scheme || 'light';
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
// File: src/components/ThemedView.tsx
|
|
236
|
+
import { View, ViewProps } from 'react-native';
|
|
237
|
+
import { useColorScheme } from '@/hooks/useColorScheme';
|
|
238
|
+
|
|
239
|
+
interface ThemedViewProps extends ViewProps {
|
|
240
|
+
lightBg?: string;
|
|
241
|
+
darkBg?: string;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
export function ThemedView({
|
|
245
|
+
lightBg = 'bg-white',
|
|
246
|
+
darkBg = 'dark:bg-black',
|
|
247
|
+
className,
|
|
248
|
+
...props
|
|
249
|
+
}: ThemedViewProps) {
|
|
250
|
+
const colorScheme = useColorScheme();
|
|
251
|
+
|
|
252
|
+
return (
|
|
253
|
+
<View
|
|
254
|
+
className={`${lightBg} ${darkBg} ${className || ''}`}
|
|
255
|
+
{...props}
|
|
256
|
+
/>
|
|
257
|
+
);
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
// Usage
|
|
261
|
+
function Screen() {
|
|
262
|
+
return (
|
|
263
|
+
<ThemedView
|
|
264
|
+
lightBg="bg-white"
|
|
265
|
+
darkBg="dark:bg-gray-900"
|
|
266
|
+
className="flex-1"
|
|
267
|
+
>
|
|
268
|
+
{/* Content */}
|
|
269
|
+
</ThemedView>
|
|
270
|
+
);
|
|
271
|
+
}
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
### Responsive Breakpoints
|
|
275
|
+
|
|
276
|
+
```typescript
|
|
277
|
+
// File: src/components/ResponsiveGrid.tsx
|
|
278
|
+
import { View } from 'react-native';
|
|
279
|
+
|
|
280
|
+
export function ResponsiveGrid({ children }) {
|
|
281
|
+
return (
|
|
282
|
+
<View className="flex-row flex-wrap gap-4 w-full">
|
|
283
|
+
{/*
|
|
284
|
+
Mobile (default): 1 column
|
|
285
|
+
md (768px): 2 columns
|
|
286
|
+
lg (1024px): 3 columns
|
|
287
|
+
*/}
|
|
288
|
+
<View className="w-full md:w-1/2 lg:w-1/3">
|
|
289
|
+
{children}
|
|
290
|
+
</View>
|
|
291
|
+
</View>
|
|
292
|
+
);
|
|
293
|
+
}
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
## Configuration
|
|
297
|
+
|
|
298
|
+
### Tailwind Config
|
|
299
|
+
|
|
300
|
+
```javascript
|
|
301
|
+
// File: tailwind.config.js
|
|
302
|
+
/** @type {import('tailwindcss').Config} */
|
|
303
|
+
module.exports = {
|
|
304
|
+
content: [
|
|
305
|
+
'./src/**/*.{js,jsx,ts,tsx}',
|
|
306
|
+
'./App.{js,jsx,ts,tsx}',
|
|
307
|
+
],
|
|
308
|
+
theme: {
|
|
309
|
+
extend: {
|
|
310
|
+
fontFamily: {
|
|
311
|
+
sans: ['Roboto', 'system-ui', 'sans-serif'],
|
|
312
|
+
mono: ['RobotoMono', 'monospace'],
|
|
313
|
+
display: ['Modak', 'serif'],
|
|
314
|
+
},
|
|
315
|
+
spacing: {
|
|
316
|
+
safe: 'env(safe-area-inset-bottom)',
|
|
317
|
+
},
|
|
318
|
+
},
|
|
319
|
+
},
|
|
320
|
+
plugins: [],
|
|
321
|
+
};
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
## Best Practices
|
|
325
|
+
|
|
326
|
+
### ✅ DO
|
|
327
|
+
|
|
328
|
+
1. **Define all tokens in CSS** using `@layer theme`
|
|
329
|
+
```css
|
|
330
|
+
@layer theme {
|
|
331
|
+
:root {
|
|
332
|
+
--color-primary: #ef5350;
|
|
333
|
+
--color-surface: #ffffff;
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
2. **Use CSS variables** in components
|
|
339
|
+
```tsx
|
|
340
|
+
<View className="bg-[var(--color-primary)]" />
|
|
341
|
+
```
|
|
342
|
+
|
|
343
|
+
3. **Support dark mode** with `@variant dark`
|
|
344
|
+
```css
|
|
345
|
+
@variant dark {
|
|
346
|
+
--color-background: #121212;
|
|
347
|
+
}
|
|
348
|
+
```
|
|
349
|
+
|
|
350
|
+
4. **Use `cn()` with tailwind-merge** for conditional classes
|
|
351
|
+
```tsx
|
|
352
|
+
className={cn('bg-red-500', isActive && 'bg-blue-500')}
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
5. **Keep Tailwind config minimal** — use CSS variables instead
|
|
356
|
+
```javascript
|
|
357
|
+
// ✅ MINIMAL config
|
|
358
|
+
module.exports = {
|
|
359
|
+
content: ['./src/**/*.tsx'],
|
|
360
|
+
theme: { extend: { fontFamily: { ... } } }
|
|
361
|
+
};
|
|
362
|
+
```
|
|
363
|
+
|
|
364
|
+
### ❌ DON'T
|
|
365
|
+
|
|
366
|
+
1. **Don't define colors in tailwind.config.js**
|
|
367
|
+
```javascript
|
|
368
|
+
// ❌ BAD - hard to theme dynamically
|
|
369
|
+
colors: { primary: '#ef5350' }
|
|
370
|
+
|
|
371
|
+
// ✅ GOOD - use CSS variables
|
|
372
|
+
// In global.css: --color-primary: #ef5350
|
|
373
|
+
```
|
|
374
|
+
|
|
375
|
+
2. **Don't forget `prepare: false`** in Metro config
|
|
376
|
+
```javascript
|
|
377
|
+
// ❌ BAD - required for Uniwind + Metro
|
|
378
|
+
// No withUniwindConfig
|
|
379
|
+
|
|
380
|
+
// ✅ GOOD
|
|
381
|
+
module.exports = withUniwindConfig(config, {
|
|
382
|
+
cssEntryFile: './src/global.css',
|
|
383
|
+
});
|
|
384
|
+
```
|
|
385
|
+
|
|
386
|
+
3. **Don't use `StyleSheet.create()`** for layout/spacing
|
|
387
|
+
```typescript
|
|
388
|
+
// ❌ BAD - verbose and hard to maintain
|
|
389
|
+
const styles = StyleSheet.create({
|
|
390
|
+
container: { flex: 1, padding: 16, backgroundColor: '#fff' }
|
|
391
|
+
});
|
|
392
|
+
|
|
393
|
+
// ✅ GOOD - use Tailwind classes
|
|
394
|
+
<View className="flex-1 p-4 bg-white" />
|
|
395
|
+
```
|
|
396
|
+
|
|
397
|
+
4. **Don't forget to import global.css** in app root
|
|
398
|
+
```typescript
|
|
399
|
+
// File: src/app/_layout.tsx
|
|
400
|
+
import '@/global.css'; // ← Required for Uniwind to work
|
|
401
|
+
```
|
|
402
|
+
|
|
403
|
+
## Related Patterns
|
|
404
|
+
|
|
405
|
+
- [Theme Configuration](./theme-configuration.md) — Advanced theming patterns
|
|
406
|
+
- [Responsive Patterns](./responsive-patterns.md) — Mobile-first responsive design
|
|
407
|
+
- [Component Styling](./component-styling.md) — Component-specific styling
|
|
408
|
+
|
|
409
|
+
---
|
|
410
|
+
|
|
411
|
+
*Pattern extracted from production repositories: expo-super-template, DJsPortfolio, not-hot-dog*
|
|
412
|
+
*Files: expo-super-template/global.css, metro.config.js*
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# /continue-development
|
|
2
|
+
|
|
3
|
+
Resume work on an onboarded project by following MDS phase order from `project/todo.md`.
|
|
4
|
+
|
|
5
|
+
## Arguments
|
|
6
|
+
|
|
7
|
+
- `projectPath`: onboarded app path (default: current directory).
|
|
8
|
+
|
|
9
|
+
## MCP-First Workflow
|
|
10
|
+
|
|
11
|
+
1. Confirm the `mds-dev-suite` MCP server is available.
|
|
12
|
+
2. Call `continue_project` first to get the active-phase brief.
|
|
13
|
+
3. Pull `get_skill` for `continue-development` to enforce phase-first sequencing.
|
|
14
|
+
4. If blockers appear, use `doctor_scan_project` and `doctor_explain_result` for targeted remediation before feature work.
|
|
15
|
+
|
|
16
|
+
## CLI / Manual Fallback
|
|
17
|
+
|
|
18
|
+
1. If MCP is not configured, install it manually:
|
|
19
|
+
- `mds mcp install --client codex --scope project`
|
|
20
|
+
2. Direct CLI flow:
|
|
21
|
+
- `mds continue <projectPath>`
|
|
22
|
+
- `mds doctor <projectPath>` when blockers are unclear.
|
|
23
|
+
|
|
24
|
+
## Verification And Output
|
|
25
|
+
|
|
26
|
+
- Confirm the chosen task belongs to the active phase or has an explicit deferral note.
|
|
27
|
+
- Output: selected next task, blockers, and validation commands to run after implementation.
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# /create-expo-super-stack
|
|
2
|
+
|
|
3
|
+
Create a new Expo app with the MDS Super Stack flow, then hand off to phase-based continuation.
|
|
4
|
+
|
|
5
|
+
## Arguments
|
|
6
|
+
|
|
7
|
+
- `parentDir`: folder where the new app directory should be created.
|
|
8
|
+
- `appName`: app folder name.
|
|
9
|
+
|
|
10
|
+
## MCP-First Workflow
|
|
11
|
+
|
|
12
|
+
1. Confirm the `mds-dev-suite` MCP server is available.
|
|
13
|
+
2. Invoke the MCP prompt `create_expo_super_stack` from a parent directory.
|
|
14
|
+
3. Follow the prompt intake flow and keep one question per turn until generation completes.
|
|
15
|
+
4. After generation, move into the new app folder and invoke `continue_project` (or prompt `continue_mds_project`) for the first implementation session.
|
|
16
|
+
|
|
17
|
+
## CLI / Manual Fallback
|
|
18
|
+
|
|
19
|
+
1. If MCP is not configured, install it manually:
|
|
20
|
+
- `mds mcp install --client codex --scope project`
|
|
21
|
+
2. Direct CLI generation:
|
|
22
|
+
- `npx -y create-expo-super-stack <appName>`
|
|
23
|
+
3. Then onboard/continue from inside the generated app:
|
|
24
|
+
- `mds continue <new-app-path>`
|
|
25
|
+
|
|
26
|
+
## Verification And Output
|
|
27
|
+
|
|
28
|
+
- Confirm generated app has `project/info.md`, `project/todo.md`, `project/style.md`, and `project/guidelines.md`.
|
|
29
|
+
- Output: generated app path, onboarding status, and immediate next command.
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# /fix-seo
|
|
2
|
+
|
|
3
|
+
Apply SEO metadata fixes for Expo web routes with MCP guidance and post-fix verification.
|
|
4
|
+
|
|
5
|
+
## Arguments
|
|
6
|
+
|
|
7
|
+
- `projectPath`: Expo project path (default: current directory).
|
|
8
|
+
- `routeOrFile`: optional route/file focus for targeted checks.
|
|
9
|
+
|
|
10
|
+
## MCP-First Workflow
|
|
11
|
+
|
|
12
|
+
1. Confirm the `mds-dev-suite` MCP server is available.
|
|
13
|
+
2. Pull `get_skill` for `seo-metadata`.
|
|
14
|
+
3. Optionally run `doctor_scan_file` for focused route files, then `doctor_scan_project` for full checks.
|
|
15
|
+
4. Use `knowledge_list_resources` (`kind: "rule"`) to ensure canonical/indexing strategy is complete.
|
|
16
|
+
5. Implement metadata, canonical, robots, and sitemap corrections in route ownership boundaries.
|
|
17
|
+
|
|
18
|
+
## CLI / Manual Fallback
|
|
19
|
+
|
|
20
|
+
1. If MCP is not configured, install it manually:
|
|
21
|
+
- `mds mcp install --client codex --scope project`
|
|
22
|
+
2. Direct CLI checks:
|
|
23
|
+
- `mds doctor <projectPath> --ci`
|
|
24
|
+
- Run project-specific web build/preview commands to verify metadata output.
|
|
25
|
+
|
|
26
|
+
## Verification And Output
|
|
27
|
+
|
|
28
|
+
- Confirm canonical tags, social metadata, and sitemap/robots behavior on affected routes.
|
|
29
|
+
- Output: changed files, resolved SEO gaps, and any remaining manual verification steps.
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# /onboard-new-expo-app
|
|
2
|
+
|
|
3
|
+
Run onboarding intake for an existing Expo app folder.
|
|
4
|
+
|
|
5
|
+
## Arguments
|
|
6
|
+
|
|
7
|
+
- `projectPath`: existing Expo app path (default: current directory).
|
|
8
|
+
|
|
9
|
+
## MCP Prompt Notes
|
|
10
|
+
|
|
11
|
+
This canonical spec backs the `onboard_new_expo_app` MCP prompt metadata. The runtime onboarding prompt text is generated from the server-side onboarding template so it can include current context and path-dependent instructions.
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# /prepare-deploy
|
|
2
|
+
|
|
3
|
+
Prepare an Expo project for release using deployment-focused skills plus Doctor parity checks.
|
|
4
|
+
|
|
5
|
+
## Arguments
|
|
6
|
+
|
|
7
|
+
- `projectPath`: release candidate project path (default: current directory).
|
|
8
|
+
- `includeSeo`: whether to include web metadata/indexing checks (default: `true` when web is targeted).
|
|
9
|
+
|
|
10
|
+
## MCP-First Workflow
|
|
11
|
+
|
|
12
|
+
1. Confirm the `mds-dev-suite` MCP server is available.
|
|
13
|
+
2. Run `doctor_scan_project` in `ci` mode for release parity.
|
|
14
|
+
3. Pull `get_skill` for `deployment`; if web is involved also pull `seo-metadata`.
|
|
15
|
+
4. Use `knowledge_list_resources` (`kind: "rule"`) to confirm env hygiene, SSR safety, and metadata requirements.
|
|
16
|
+
5. Produce a release checklist mapped to current failing checks.
|
|
17
|
+
|
|
18
|
+
## CLI / Manual Fallback
|
|
19
|
+
|
|
20
|
+
1. If MCP is not configured, install it manually:
|
|
21
|
+
- `mds mcp install --client codex --scope project`
|
|
22
|
+
2. Direct CLI path:
|
|
23
|
+
- `mds doctor <projectPath> --ci`
|
|
24
|
+
- Run project scripts: `lint`, `type-check`, `test`, and production build/profile scripts.
|
|
25
|
+
|
|
26
|
+
## Verification And Output
|
|
27
|
+
|
|
28
|
+
- Re-run `doctor_scan_project` (or CLI equivalent) until blockers are cleared.
|
|
29
|
+
- Output: release readiness status, unresolved blockers, and rollback/readiness notes.
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# /project-research-plan
|
|
2
|
+
|
|
3
|
+
Turn rough product notes/research into actionable MDS project memory and next-phase plan.
|
|
4
|
+
|
|
5
|
+
## Arguments
|
|
6
|
+
|
|
7
|
+
- `projectPath`: target project path (default: current directory).
|
|
8
|
+
- `inputs`: attached notes/docs to normalize into canonical memory files.
|
|
9
|
+
|
|
10
|
+
## MCP-First Workflow
|
|
11
|
+
|
|
12
|
+
1. Confirm the `mds-dev-suite` MCP server is available.
|
|
13
|
+
2. Pull `get_skill` for `research-plan-intake` (and `project-onboarding` when onboarding context is mixed in).
|
|
14
|
+
3. Call `knowledge_list_resources` for `guide` and `reference` resources as needed for structure and validation.
|
|
15
|
+
4. Normalize clear context directly; ask focused follow-up only where ambiguity changes implementation direction.
|
|
16
|
+
5. Update project memory files and produce an implementation-ready next-phase plan.
|
|
17
|
+
|
|
18
|
+
## CLI / Manual Fallback
|
|
19
|
+
|
|
20
|
+
1. If MCP is not configured, install it manually:
|
|
21
|
+
- `mds mcp install --client codex --scope project`
|
|
22
|
+
2. Direct CLI fallback:
|
|
23
|
+
- Use `mds onboard <projectPath>` for structured intake when memory files are missing.
|
|
24
|
+
- Use `mds continue <projectPath>` after memory normalization to select the next task.
|
|
25
|
+
|
|
26
|
+
## Verification And Output
|
|
27
|
+
|
|
28
|
+
- Confirm `project/info.md`, `project/style.md`, and `project/todo.md` align with extracted research context.
|
|
29
|
+
- Output: resolved unknowns, outstanding questions, and the recommended next implementation slice.
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# /review-expo-project
|
|
2
|
+
|
|
3
|
+
Review an Expo project with MCP-first diagnostics and skill-guided remediation.
|
|
4
|
+
|
|
5
|
+
## Arguments
|
|
6
|
+
|
|
7
|
+
- `projectPath`: absolute or relative project path (default: current directory).
|
|
8
|
+
- `mode`: Doctor mode (`fast`, `ci`, or `full`; default: `ci`).
|
|
9
|
+
|
|
10
|
+
## MCP-First Workflow
|
|
11
|
+
|
|
12
|
+
1. Confirm the `mds-dev-suite` MCP server is available.
|
|
13
|
+
2. Call `continue_project` to summarize current project state and blockers.
|
|
14
|
+
3. Call `doctor_scan_project` with `projectPath` and `mode`.
|
|
15
|
+
4. For each warning/error, call `doctor_explain_result`, then pull targeted guidance with `get_skill` (for example: `project-onboarding`, `debugging`, `deployment`).
|
|
16
|
+
5. Call `knowledge_list_resources` with `kind: "guide"` if extra reference context is needed.
|
|
17
|
+
|
|
18
|
+
## CLI / Manual Fallback
|
|
19
|
+
|
|
20
|
+
1. If MCP is not configured, install it manually:
|
|
21
|
+
- `mds mcp install --client codex --scope project`
|
|
22
|
+
2. If MCP still cannot run, use direct CLI flows:
|
|
23
|
+
- `mds continue <projectPath>`
|
|
24
|
+
- `mds doctor <projectPath> --ci`
|
|
25
|
+
|
|
26
|
+
## Verification And Output
|
|
27
|
+
|
|
28
|
+
- Re-run `doctor_scan_project` (or `mds doctor --ci`) after fixes.
|
|
29
|
+
- Output: blocker summary, failing checks, recommended next task, and concrete follow-up commands.
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# /run-doctor
|
|
2
|
+
|
|
3
|
+
Run MDS Doctor as the primary health check for an Expo project.
|
|
4
|
+
|
|
5
|
+
## Arguments
|
|
6
|
+
|
|
7
|
+
- `projectPath`: project root path (default: current directory).
|
|
8
|
+
- `mode`: `fast`, `ci`, or `full` (default: `ci`).
|
|
9
|
+
- `runScripts`: whether Doctor should execute project scripts (default: `true` for `ci` mode).
|
|
10
|
+
|
|
11
|
+
## MCP-First Workflow
|
|
12
|
+
|
|
13
|
+
1. Confirm the `mds-dev-suite` MCP server is available.
|
|
14
|
+
2. Call `doctor_scan_project` with selected arguments.
|
|
15
|
+
3. For each non-pass result, call `doctor_explain_result`.
|
|
16
|
+
4. Pull targeted implementation guidance with `get_skill` (typically `deployment`, `debugging`, or `dev-server-management`).
|
|
17
|
+
|
|
18
|
+
## CLI / Manual Fallback
|
|
19
|
+
|
|
20
|
+
1. If MCP is not configured, install it manually:
|
|
21
|
+
- `mds mcp install --client codex --scope project`
|
|
22
|
+
2. Direct CLI alternatives:
|
|
23
|
+
- `mds doctor <projectPath>`
|
|
24
|
+
- `mds doctor <projectPath> --ci`
|
|
25
|
+
- `mds doctor <projectPath> --json`
|
|
26
|
+
|
|
27
|
+
## Verification And Output
|
|
28
|
+
|
|
29
|
+
- Re-run Doctor after each fix batch.
|
|
30
|
+
- Output: check summary, blocking errors first, and the exact command used for re-check.
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# /ship-test-loop
|
|
2
|
+
|
|
3
|
+
Execute the short PR iteration loop for the test branch with strict quality gates.
|
|
4
|
+
|
|
5
|
+
## Goal
|
|
6
|
+
|
|
7
|
+
Push intentional changes with a meaningful commit message, open/update a PR to `test`, poll for feedback and failed checks, fix issues, and merge to `test` once all checks are green.
|
|
8
|
+
|
|
9
|
+
## Loop Rules
|
|
10
|
+
|
|
11
|
+
1. Run `mds doctor --ci` before any git mutation.
|
|
12
|
+
2. Stage only intentional files and create a meaningful commit message.
|
|
13
|
+
3. Push branch and open or update a PR targeting `test`.
|
|
14
|
+
4. Wait about 2 minutes, then poll PR comments, review threads, and failed checks.
|
|
15
|
+
5. Fix issues locally, rerun Doctor, push updates, and poll again.
|
|
16
|
+
6. Repeat polling/fix cycles up to 5 total iterations.
|
|
17
|
+
7. Merge to `test` only when all required checks are green and no unresolved blocking feedback remains.
|
|
18
|
+
|
|
19
|
+
## Guardrails
|
|
20
|
+
|
|
21
|
+
- Do not merge when required checks are failing.
|
|
22
|
+
- Do not skip Doctor between fix cycles.
|
|
23
|
+
- Keep a concise changelog per iteration: what failed, what was changed, what passed.
|
|
24
|
+
- If still failing after 5 cycles, stop and summarize remaining blockers with concrete next actions.
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# create-expo-stack Uniwind Exploration
|
|
2
|
+
|
|
3
|
+
Source: https://github.com/roninoss/create-expo-stack
|
|
4
|
+
|
|
5
|
+
## Findings
|
|
6
|
+
|
|
7
|
+
- The project describes itself as an interactive CLI for `rn-new`.
|
|
8
|
+
- It already supports multiple styling choices, including NativeWind,
|
|
9
|
+
Unistyles, StyleSheets, and Tamagui.
|
|
10
|
+
- The README describes a per-file template model: base files live in a base
|
|
11
|
+
template folder, while optional package features live in package template
|
|
12
|
+
folders and use EJS to patch shared files.
|
|
13
|
+
|
|
14
|
+
## Phase 1 Decision
|
|
15
|
+
|
|
16
|
+
A friendly upstream Uniwind contribution should stay small:
|
|
17
|
+
|
|
18
|
+
- add Uniwind as another styling option,
|
|
19
|
+
- follow the existing package-slice template convention,
|
|
20
|
+
- include `web` in Expo Router generated `app.json` platforms when web config
|
|
21
|
+
and dependencies are generated,
|
|
22
|
+
- add focused Software Mansion core package options where they are not already
|
|
23
|
+
covered,
|
|
24
|
+
- avoid MDS project memory files, MCP config, agent prompts, or richer
|
|
25
|
+
boilerplate,
|
|
26
|
+
- keep the deeper post-create setup in `mds onboard` and
|
|
27
|
+
`create-expo-super-stack`.
|
|
28
|
+
|
|
29
|
+
No local Phase 1 code should depend on the upstream fork or PR existing.
|