@react-spa-scaffold/mcp 1.2.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (194) hide show
  1. package/README.md +36 -123
  2. package/dist/constants.d.ts +35 -0
  3. package/dist/constants.d.ts.map +1 -0
  4. package/dist/constants.js +35 -0
  5. package/dist/constants.js.map +1 -0
  6. package/dist/features/definitions/api.d.ts.map +1 -1
  7. package/dist/features/definitions/api.js +0 -1
  8. package/dist/features/definitions/api.js.map +1 -1
  9. package/dist/features/definitions/ci.d.ts.map +1 -1
  10. package/dist/features/definitions/ci.js +0 -1
  11. package/dist/features/definitions/ci.js.map +1 -1
  12. package/dist/features/definitions/core.d.ts.map +1 -1
  13. package/dist/features/definitions/core.js +0 -1
  14. package/dist/features/definitions/core.js.map +1 -1
  15. package/dist/features/definitions/devtools.d.ts.map +1 -1
  16. package/dist/features/definitions/devtools.js +0 -1
  17. package/dist/features/definitions/devtools.js.map +1 -1
  18. package/dist/features/definitions/forms.d.ts.map +1 -1
  19. package/dist/features/definitions/forms.js +0 -1
  20. package/dist/features/definitions/forms.js.map +1 -1
  21. package/dist/features/definitions/i18n.d.ts.map +1 -1
  22. package/dist/features/definitions/i18n.js +0 -1
  23. package/dist/features/definitions/i18n.js.map +1 -1
  24. package/dist/features/definitions/mobile.d.ts.map +1 -1
  25. package/dist/features/definitions/mobile.js +0 -1
  26. package/dist/features/definitions/mobile.js.map +1 -1
  27. package/dist/features/definitions/observability.d.ts.map +1 -1
  28. package/dist/features/definitions/observability.js +0 -1
  29. package/dist/features/definitions/observability.js.map +1 -1
  30. package/dist/features/definitions/performance.d.ts.map +1 -1
  31. package/dist/features/definitions/performance.js +0 -1
  32. package/dist/features/definitions/performance.js.map +1 -1
  33. package/dist/features/definitions/routing.d.ts.map +1 -1
  34. package/dist/features/definitions/routing.js +0 -1
  35. package/dist/features/definitions/routing.js.map +1 -1
  36. package/dist/features/definitions/state.d.ts.map +1 -1
  37. package/dist/features/definitions/state.js +0 -1
  38. package/dist/features/definitions/state.js.map +1 -1
  39. package/dist/features/definitions/testing.d.ts.map +1 -1
  40. package/dist/features/definitions/testing.js +0 -3
  41. package/dist/features/definitions/testing.js.map +1 -1
  42. package/dist/features/definitions/theming.js +2 -2
  43. package/dist/features/definitions/theming.js.map +1 -1
  44. package/dist/features/definitions/ui.d.ts.map +1 -1
  45. package/dist/features/definitions/ui.js +0 -1
  46. package/dist/features/definitions/ui.js.map +1 -1
  47. package/dist/features/types.d.ts +14 -20
  48. package/dist/features/types.d.ts.map +1 -1
  49. package/dist/features/types.js +4 -21
  50. package/dist/features/types.js.map +1 -1
  51. package/dist/features/types.test.d.ts +5 -0
  52. package/dist/features/types.test.d.ts.map +1 -0
  53. package/dist/features/types.test.js +32 -0
  54. package/dist/features/types.test.js.map +1 -0
  55. package/dist/resources/docs.d.ts +2 -8
  56. package/dist/resources/docs.d.ts.map +1 -1
  57. package/dist/resources/docs.js +27 -49
  58. package/dist/resources/docs.js.map +1 -1
  59. package/dist/server.d.ts.map +1 -1
  60. package/dist/server.js +9 -8
  61. package/dist/server.js.map +1 -1
  62. package/dist/tools/get-features.d.ts +15 -9
  63. package/dist/tools/get-features.d.ts.map +1 -1
  64. package/dist/tools/get-features.js +12 -0
  65. package/dist/tools/get-features.js.map +1 -1
  66. package/dist/tools/get-file.d.ts +23 -0
  67. package/dist/tools/get-file.d.ts.map +1 -0
  68. package/dist/tools/get-file.js +57 -0
  69. package/dist/tools/get-file.js.map +1 -0
  70. package/dist/tools/get-file.test.d.ts +5 -0
  71. package/dist/tools/get-file.test.d.ts.map +1 -0
  72. package/dist/tools/get-file.test.js +63 -0
  73. package/dist/tools/get-file.test.js.map +1 -0
  74. package/dist/tools/get-scaffold.d.ts +11 -33
  75. package/dist/tools/get-scaffold.d.ts.map +1 -1
  76. package/dist/tools/get-scaffold.js +31 -44
  77. package/dist/tools/get-scaffold.js.map +1 -1
  78. package/dist/tools/get-scaffold.test.js +29 -22
  79. package/dist/tools/get-scaffold.test.js.map +1 -1
  80. package/dist/tools/index.d.ts +2 -2
  81. package/dist/tools/index.d.ts.map +1 -1
  82. package/dist/tools/index.js +1 -1
  83. package/dist/tools/index.js.map +1 -1
  84. package/dist/tools/registry.d.ts +4 -0
  85. package/dist/tools/registry.d.ts.map +1 -1
  86. package/dist/tools/registry.js +26 -16
  87. package/dist/tools/registry.js.map +1 -1
  88. package/dist/tools/types.d.ts +24 -6
  89. package/dist/tools/types.d.ts.map +1 -1
  90. package/dist/tools/types.js +3 -0
  91. package/dist/tools/types.js.map +1 -1
  92. package/dist/utils/cache.d.ts +9 -5
  93. package/dist/utils/cache.d.ts.map +1 -1
  94. package/dist/utils/cache.js +21 -5
  95. package/dist/utils/cache.js.map +1 -1
  96. package/dist/utils/docs.d.ts +1 -3
  97. package/dist/utils/docs.d.ts.map +1 -1
  98. package/dist/utils/docs.js +3 -8
  99. package/dist/utils/docs.js.map +1 -1
  100. package/dist/utils/index.d.ts +0 -1
  101. package/dist/utils/index.d.ts.map +1 -1
  102. package/dist/utils/index.js +0 -1
  103. package/dist/utils/index.js.map +1 -1
  104. package/dist/utils/paths.d.ts +9 -0
  105. package/dist/utils/paths.d.ts.map +1 -1
  106. package/dist/utils/paths.js +19 -1
  107. package/dist/utils/paths.js.map +1 -1
  108. package/dist/utils/paths.test.js +22 -1
  109. package/dist/utils/paths.test.js.map +1 -1
  110. package/dist/utils/scaffold/claude-md/index.d.ts +7 -0
  111. package/dist/utils/scaffold/claude-md/index.d.ts.map +1 -0
  112. package/dist/utils/scaffold/claude-md/index.js +23 -0
  113. package/dist/utils/scaffold/claude-md/index.js.map +1 -0
  114. package/dist/utils/scaffold/claude-md/sections.d.ts +16 -0
  115. package/dist/utils/scaffold/claude-md/sections.d.ts.map +1 -0
  116. package/dist/utils/scaffold/claude-md/sections.js +269 -0
  117. package/dist/utils/scaffold/claude-md/sections.js.map +1 -0
  118. package/dist/utils/scaffold/commands.d.ts +2 -6
  119. package/dist/utils/scaffold/commands.d.ts.map +1 -1
  120. package/dist/utils/scaffold/commands.js +9 -12
  121. package/dist/utils/scaffold/commands.js.map +1 -1
  122. package/dist/utils/scaffold/compute.d.ts +5 -8
  123. package/dist/utils/scaffold/compute.d.ts.map +1 -1
  124. package/dist/utils/scaffold/compute.js +26 -41
  125. package/dist/utils/scaffold/compute.js.map +1 -1
  126. package/dist/utils/scaffold/dependencies.d.ts +10 -17
  127. package/dist/utils/scaffold/dependencies.d.ts.map +1 -1
  128. package/dist/utils/scaffold/dependencies.js +28 -34
  129. package/dist/utils/scaffold/dependencies.js.map +1 -1
  130. package/dist/utils/scaffold/generators.d.ts +3 -11
  131. package/dist/utils/scaffold/generators.d.ts.map +1 -1
  132. package/dist/utils/scaffold/generators.js +20 -288
  133. package/dist/utils/scaffold/generators.js.map +1 -1
  134. package/dist/utils/scaffold/index.d.ts +2 -3
  135. package/dist/utils/scaffold/index.d.ts.map +1 -1
  136. package/dist/utils/scaffold/index.js +1 -3
  137. package/dist/utils/scaffold/index.js.map +1 -1
  138. package/package.json +2 -2
  139. package/dist/tools/get-example.d.ts +0 -49
  140. package/dist/tools/get-example.d.ts.map +0 -1
  141. package/dist/tools/get-example.js +0 -91
  142. package/dist/tools/get-example.js.map +0 -1
  143. package/dist/tools/get-example.test.d.ts +0 -5
  144. package/dist/tools/get-example.test.d.ts.map +0 -1
  145. package/dist/tools/get-example.test.js +0 -63
  146. package/dist/tools/get-example.test.js.map +0 -1
  147. package/dist/utils/examples/api-patterns.d.ts +0 -3
  148. package/dist/utils/examples/api-patterns.d.ts.map +0 -1
  149. package/dist/utils/examples/api-patterns.js +0 -19
  150. package/dist/utils/examples/api-patterns.js.map +0 -1
  151. package/dist/utils/examples/component-patterns.d.ts +0 -3
  152. package/dist/utils/examples/component-patterns.d.ts.map +0 -1
  153. package/dist/utils/examples/component-patterns.js +0 -71
  154. package/dist/utils/examples/component-patterns.js.map +0 -1
  155. package/dist/utils/examples/context-patterns.d.ts +0 -3
  156. package/dist/utils/examples/context-patterns.d.ts.map +0 -1
  157. package/dist/utils/examples/context-patterns.js +0 -32
  158. package/dist/utils/examples/context-patterns.js.map +0 -1
  159. package/dist/utils/examples/hook-patterns.d.ts +0 -3
  160. package/dist/utils/examples/hook-patterns.d.ts.map +0 -1
  161. package/dist/utils/examples/hook-patterns.js +0 -55
  162. package/dist/utils/examples/hook-patterns.js.map +0 -1
  163. package/dist/utils/examples/i18n-patterns.d.ts +0 -3
  164. package/dist/utils/examples/i18n-patterns.d.ts.map +0 -1
  165. package/dist/utils/examples/i18n-patterns.js +0 -43
  166. package/dist/utils/examples/i18n-patterns.js.map +0 -1
  167. package/dist/utils/examples/index.d.ts +0 -12
  168. package/dist/utils/examples/index.d.ts.map +0 -1
  169. package/dist/utils/examples/index.js +0 -69
  170. package/dist/utils/examples/index.js.map +0 -1
  171. package/dist/utils/examples/mobile-patterns.d.ts +0 -3
  172. package/dist/utils/examples/mobile-patterns.d.ts.map +0 -1
  173. package/dist/utils/examples/mobile-patterns.js +0 -38
  174. package/dist/utils/examples/mobile-patterns.js.map +0 -1
  175. package/dist/utils/examples/page-patterns.d.ts +0 -3
  176. package/dist/utils/examples/page-patterns.d.ts.map +0 -1
  177. package/dist/utils/examples/page-patterns.js +0 -34
  178. package/dist/utils/examples/page-patterns.js.map +0 -1
  179. package/dist/utils/examples/store-patterns.d.ts +0 -3
  180. package/dist/utils/examples/store-patterns.d.ts.map +0 -1
  181. package/dist/utils/examples/store-patterns.js +0 -40
  182. package/dist/utils/examples/store-patterns.js.map +0 -1
  183. package/dist/utils/examples/test-patterns.d.ts +0 -3
  184. package/dist/utils/examples/test-patterns.d.ts.map +0 -1
  185. package/dist/utils/examples/test-patterns.js +0 -58
  186. package/dist/utils/examples/test-patterns.js.map +0 -1
  187. package/dist/utils/examples/types.d.ts +0 -17
  188. package/dist/utils/examples/types.d.ts.map +0 -1
  189. package/dist/utils/examples/types.js +0 -2
  190. package/dist/utils/examples/types.js.map +0 -1
  191. package/dist/utils/examples/utility-patterns.d.ts +0 -3
  192. package/dist/utils/examples/utility-patterns.d.ts.map +0 -1
  193. package/dist/utils/examples/utility-patterns.js +0 -77
  194. package/dist/utils/examples/utility-patterns.js.map +0 -1
@@ -1,289 +1,24 @@
1
1
  // noinspection JSUnresolvedReference
2
- /** Generates CLAUDE.md content based on selected features. */
3
- export function generateClaudeMd(featureIds, projectName, scripts) {
4
- const sections = [];
5
- // Header
6
- sections.push(`# CLAUDE.md
7
-
8
- AI assistant guidance for **${projectName}** - a React 19 + TypeScript + Vite 7 codebase.`);
9
- // Commands section - based on actual scripts
10
- const commandLines = [];
11
- const scriptDescriptions = {
12
- dev: 'Dev server at localhost:5173',
13
- build: 'Production build (typecheck + bundle)',
14
- preview: 'Preview production build',
15
- typecheck: 'TypeScript only',
16
- lint: 'ESLint check',
17
- 'lint:fix': 'ESLint auto-fix',
18
- format: 'Prettier format',
19
- 'format:check': 'Prettier check',
20
- test: 'Vitest once',
21
- 'test:watch': 'Vitest watch mode',
22
- 'test:coverage': 'Coverage (80% threshold)',
23
- e2e: 'Playwright E2E',
24
- 'e2e:ui': 'Playwright UI mode',
25
- 'i18n:extract': 'Extract translations to .po',
26
- prepare: 'Initialize Husky hooks',
27
- };
28
- for (const script of Object.keys(scripts).sort()) {
29
- const desc = scriptDescriptions[script] || '';
30
- const padding = ' '.repeat(Math.max(1, 20 - script.length));
31
- commandLines.push(`npm run ${script}${padding}# ${desc}`);
32
- }
33
- sections.push(`
34
- ## Commands
35
-
36
- \`\`\`bash
37
- ${commandLines.join('\n')}
38
- \`\`\``);
39
- // Project Structure - dynamic based on features
40
- const structureParts = ['src/', '├── components/ # ui/ (primitives), layout/, shared/ (features)'];
41
- if (featureIds.includes('api') || featureIds.includes('i18n') || featureIds.includes('mobile')) {
42
- structureParts.push('├── contexts/ # React Context providers');
43
- }
44
- structureParts.push('├── hooks/ # Custom hooks');
45
- structureParts.push('├── lib/ # config, utils, format' +
46
- (featureIds.includes('api') ? ', api' : '') +
47
- (featureIds.includes('routing') ? ', routes' : '') +
48
- (featureIds.includes('state') ? ', storage' : ''));
49
- if (featureIds.includes('routing')) {
50
- structureParts.push('├── pages/ # Lazy-loaded route components');
51
- }
52
- if (featureIds.includes('state')) {
53
- structureParts.push('├── stores/ # Zustand stores');
54
- }
55
- if (featureIds.includes('i18n')) {
56
- structureParts.push('├── i18n/ # LinguiJS config and catalogs');
57
- structureParts.push('├── locales/ # Translation files (.po)');
58
- }
59
- structureParts.push('└── types/ # TypeScript definitions');
60
- if (featureIds.includes('testing')) {
61
- structureParts.push('');
62
- structureParts.push('# Unit tests co-located: *.test.ts/tsx next to source');
63
- structureParts.push('e2e/tests/ # Playwright functional E2E tests');
64
- if (featureIds.includes('performance')) {
65
- structureParts.push('e2e/performance/ # Performance regression tests');
66
- }
67
- }
68
- sections.push(`
69
- ## Project Structure
70
-
71
- See [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) for full structure and data flow.
72
-
73
- \`\`\`
74
- ${structureParts.join('\n')}
75
- \`\`\``);
76
- // Code Patterns - always included
77
- const stateHierarchy = [];
78
- if (featureIds.includes('state'))
79
- stateHierarchy.push('Zustand (persisted)');
80
- if (featureIds.includes('api'))
81
- stateHierarchy.push('TanStack Query (server)');
82
- stateHierarchy.push('Context (UI)', 'useState (local)');
83
- sections.push(`
84
- ## Code Patterns
85
-
86
- **Imports**: Always use \`@/\` path alias
87
-
88
- **Components**: Named exports + \`Props\` interface. Pages use default exports for lazy loading.
89
-
90
- **TypeScript**: \`type\` for unions, \`interface\` for objects
91
-
92
- **State hierarchy**: ${stateHierarchy.join(' → ')}
93
-
94
- See [docs/CODING_STANDARDS.md](docs/CODING_STANDARDS.md) and [docs/COMPONENT_GUIDELINES.md](docs/COMPONENT_GUIDELINES.md).`);
95
- // UI Components section - only if ui feature
96
- if (featureIds.includes('ui')) {
97
- sections.push(`
98
- ## UI Components (Shadcn/UI)
99
-
100
- This project uses **Shadcn/UI** with radix-nova style. Components live in \`src/components/ui/\`.
101
-
102
- ### Adding New Components
103
-
104
- \`\`\`bash
105
- npx shadcn@latest add button # Single component
106
- npx shadcn@latest add dialog card input # Multiple components
107
- \`\`\`
108
-
109
- **Pattern**: Import directly (no barrel exports for UI):
110
-
111
- \`\`\`tsx
112
- import { Button } from '@/components/ui/button';
113
- import { cn } from '@/lib/utils';
114
- \`\`\``);
115
- }
116
- // Mobile section - only if mobile feature
117
- if (featureIds.includes('mobile')) {
118
- sections.push(`
119
- ## Mobile & Responsive Design
120
-
121
- This project includes mobile-first responsive utilities.
122
-
123
- ### Viewport Detection
124
-
125
- \`\`\`tsx
126
- import { MobileProvider, useMobileContext } from '@/contexts/mobileContext';
127
-
128
- // Wrap app with MobileProvider
129
- <MobileProvider>{children}</MobileProvider>
130
-
131
- // Use in components
132
- const { isMobile, isTablet, isDesktop, width } = useMobileContext();
133
- \`\`\`
134
-
135
- ### Breakpoints
136
-
137
- \`\`\`tsx
138
- import { BREAKPOINTS, useIsMobile, useIsDesktop } from '@/hooks/useMediaQuery';
139
-
140
- // BREAKPOINTS: sm (640), md (768), lg (1024), xl (1280)
141
- const isMobile = useIsMobile(); // width < 768px
142
- const isDesktop = useIsDesktop(); // width >= 1024px
143
- \`\`\`
144
-
145
- ### Touch-Aware Sizing
146
-
147
- \`\`\`tsx
148
- import { useTouchSizes } from '@/hooks/useTouchSizes';
149
-
150
- const sizes = useTouchSizes();
151
- <Button size={sizes.button}>Click</Button> // 'touch' on mobile, 'default' on desktop
152
- \`\`\``);
153
- }
154
- // Theming section - only if theming feature
155
- if (featureIds.includes('theming')) {
156
- sections.push(`
157
- ## Theming
158
-
159
- Light/dark/system theme support with Zustand persistence.
160
-
161
- ### Usage
162
-
163
- \`\`\`tsx
164
- import { usePreferencesStore } from '@/stores/preferencesStore';
165
-
166
- // Get current theme
167
- const theme = usePreferencesStore((s) => s.theme);
168
-
169
- // Toggle theme
170
- const toggleTheme = usePreferencesStore((s) => s.toggleTheme);
171
-
172
- // Get resolved theme (actual light/dark value when 'system')
173
- const getResolvedTheme = usePreferencesStore((s) => s.getResolvedTheme);
174
- \`\`\`
175
-
176
- The \`useThemeEffect\` hook automatically applies the \`.dark\` class to the document.
177
- The ThemeToggle component provides a UI for switching between light, dark, and system themes.`);
178
- }
179
- // MCP Servers section - always helpful
180
- sections.push(`
181
- ## MCP Servers (PREFER OVER WebSearch)
182
-
183
- Use MCP servers for documentation lookup. They provide **structured, version-accurate data** directly from source.`);
184
- if (featureIds.includes('ui')) {
185
- sections.push(`
186
- ### Shadcn MCP (UI Components)
187
-
188
- | Need | Tool |
189
- | ------------------- | ------------------------------------------------ |
190
- | Find component | \`mcp__shadcn__search_items_in_registries\` |
191
- | View component code | \`mcp__shadcn__view_items_in_registries\` |
192
- | Usage examples | \`mcp__shadcn__get_item_examples_from_registries\` |
193
- | CLI add command | \`mcp__shadcn__get_add_command_for_items\` |`);
194
- }
195
- sections.push(`
196
- ### Context7 MCP (All Libraries)
197
-
198
- Use for **any npm package** documentation:
199
-
200
- \`\`\`
201
- resolve-library-id → get-library-docs
202
- \`\`\`
203
-
204
- **Examples**: react-hook-form, @tanstack/react-query, zustand, zod, date-fns
205
-
206
- ### Decision Flow
207
-
208
- \`\`\`
209
- Need UI component? → Shadcn MCP
210
- Need library docs? → Context7 MCP (any npm package)
211
- Need general info? → WebSearch (fallback only)
212
- \`\`\``);
213
- // Translations section - only if i18n feature
214
- if (featureIds.includes('i18n')) {
215
- sections.push(`
216
- ## Translations (CRITICAL)
217
-
218
- All user-facing text MUST have translator comments. ESLint enforces this.
219
-
220
- \`\`\`tsx
221
- <Trans comment="Dashboard heading">Welcome back</Trans>
222
- t({ message: 'Close', comment: 'Close button' })
223
- \`\`\`
224
-
225
- See [docs/INTERNATIONALIZATION.md](docs/INTERNATIONALIZATION.md).`);
226
- }
227
- // Testing section - only if testing feature
228
- if (featureIds.includes('testing')) {
229
- sections.push(`
230
- ## Testing
231
-
232
- See [docs/TESTING.md](docs/TESTING.md) and [docs/E2E_TESTING.md](docs/E2E_TESTING.md).
233
-
234
- Unit tests are **co-located** with source files (\`*.test.ts/tsx\`). 80% coverage required.
235
-
236
- \`\`\`typescript
237
- import { describe, it, expect, vi } from 'vitest';
238
- import { screen, renderHook } from '@testing-library/react';
239
- import { render, mockMatchMedia, server } from '@/test';
240
- \`\`\`
241
-
242
- MSW handlers auto-reset after each test.`);
243
- }
244
- // Common Gotchas - filtered by features
245
- const gotchas = [];
246
- if (featureIds.includes('devtools')) {
247
- gotchas.push('**Node.js >= 22.0.0** required (check `.nvmrc`)');
248
- gotchas.push('**Conventional commits** enforced by commitlint');
249
- }
250
- if (featureIds.includes('mobile')) {
251
- gotchas.push('**Context hooks throw** outside provider (e.g., `useMobileContext()`)');
252
- }
253
- gotchas.push('**Barrel exports** in each directory via `index.ts`');
254
- if (featureIds.includes('ui')) {
255
- gotchas.push('**UI components** import directly: `@/components/ui/button` (no barrel)');
256
- }
257
- sections.push(`
258
- ## Common Gotchas
259
-
260
- ${gotchas.map((g, i) => `${i + 1}. ${g}`).join('\n')}
261
- `);
262
- return sections.join('\n');
263
- }
264
2
  /**
265
- * Generate vite-env.d.ts content based on selected features
3
+ * Content generators for env.ts, routes.ts, vite-env.d.ts.
4
+ * CLAUDE.md generation moved to ./claude-md/
266
5
  */
6
+ import { FEATURE } from '../../constants.js';
7
+ export { generateClaudeMd } from './claude-md/index.js';
8
+ /** Generate vite-env.d.ts content based on selected features. */
267
9
  export function generateViteEnvDts(featureIds) {
268
10
  const sections = [];
269
- // Add .po module declaration if i18n feature is selected (LinguiJS uses .po files)
270
- if (featureIds.includes('i18n')) {
11
+ if (featureIds.includes(FEATURE.I18N)) {
271
12
  sections.push(`declare module '*.po' {
272
13
  import type { Messages } from '@lingui/core';
273
14
  export const messages: Messages;
274
15
  }`);
275
16
  }
276
- // Build env vars section
277
- const envVars = [];
278
- // Core env vars (always included)
279
- envVars.push(' readonly VITE_APP_NAME: string;');
280
- envVars.push(' readonly VITE_APP_URL: string;');
281
- // API feature env vars
282
- if (featureIds.includes('api')) {
17
+ const envVars = [' readonly VITE_APP_NAME: string;', ' readonly VITE_APP_URL: string;'];
18
+ if (featureIds.includes(FEATURE.API)) {
283
19
  envVars.push(' readonly VITE_API_URL: string;');
284
20
  }
285
- // Observability feature env vars
286
- if (featureIds.includes('observability')) {
21
+ if (featureIds.includes(FEATURE.OBSERVABILITY)) {
287
22
  envVars.push(' readonly VITE_SENTRY_DSN: string;');
288
23
  envVars.push(' readonly VITE_SENTRY_ENABLED: string;');
289
24
  }
@@ -298,24 +33,21 @@ interface ImportMeta {
298
33
  }`);
299
34
  return sections.join('\n\n') + '\n';
300
35
  }
301
- /**
302
- * Generate env.ts content based on selected features
303
- */
36
+ /** Generate env.ts content based on selected features. */
304
37
  export function generateEnvTs(featureIds) {
305
- const schemaFields = [];
306
- const envFields = [];
307
- // Core env vars (always included)
308
- schemaFields.push(' VITE_APP_NAME: z.string().min(1).optional(),');
309
- schemaFields.push(' VITE_APP_URL: z.string().url().optional(),');
310
- envFields.push(' VITE_APP_NAME: import.meta.env.VITE_APP_NAME,');
311
- envFields.push(' VITE_APP_URL: import.meta.env.VITE_APP_URL,');
312
- // API feature env vars
313
- if (featureIds.includes('api')) {
38
+ const schemaFields = [
39
+ ' VITE_APP_NAME: z.string().min(1).optional(),',
40
+ ' VITE_APP_URL: z.string().url().optional(),',
41
+ ];
42
+ const envFields = [
43
+ ' VITE_APP_NAME: import.meta.env.VITE_APP_NAME,',
44
+ ' VITE_APP_URL: import.meta.env.VITE_APP_URL,',
45
+ ];
46
+ if (featureIds.includes(FEATURE.API)) {
314
47
  schemaFields.push(' VITE_API_URL: z.string().url().optional(),');
315
48
  envFields.push(' VITE_API_URL: import.meta.env.VITE_API_URL,');
316
49
  }
317
- // Observability feature env vars
318
- if (featureIds.includes('observability')) {
50
+ if (featureIds.includes(FEATURE.OBSERVABILITY)) {
319
51
  schemaFields.push(' VITE_SENTRY_DSN: z.string().url().optional(),');
320
52
  schemaFields.push(' VITE_SENTRY_ENABLED: z.string().optional(),');
321
53
  envFields.push(' VITE_SENTRY_DSN: import.meta.env.VITE_SENTRY_DSN,');
@@ -1 +1 @@
1
- {"version":3,"file":"generators.js","sourceRoot":"","sources":["../../../src/utils/scaffold/generators.ts"],"names":[],"mappings":"AAAA,qCAAqC;AAQrC,8DAA8D;AAC9D,MAAM,UAAU,gBAAgB,CAC9B,UAAuB,EACvB,WAAmB,EACnB,OAA+B;IAE/B,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,SAAS;IACT,QAAQ,CAAC,IAAI,CAAC;;8BAEc,WAAW,iDAAiD,CAAC,CAAC;IAE1F,6CAA6C;IAC7C,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,MAAM,kBAAkB,GAA2B;QACjD,GAAG,EAAE,8BAA8B;QACnC,KAAK,EAAE,uCAAuC;QAC9C,OAAO,EAAE,0BAA0B;QACnC,SAAS,EAAE,iBAAiB;QAC5B,IAAI,EAAE,cAAc;QACpB,UAAU,EAAE,iBAAiB;QAC7B,MAAM,EAAE,iBAAiB;QACzB,cAAc,EAAE,gBAAgB;QAChC,IAAI,EAAE,aAAa;QACnB,YAAY,EAAE,mBAAmB;QACjC,eAAe,EAAE,0BAA0B;QAC3C,GAAG,EAAE,gBAAgB;QACrB,QAAQ,EAAE,oBAAoB;QAC9B,cAAc,EAAE,6BAA6B;QAC7C,OAAO,EAAE,wBAAwB;KAClC,CAAC;IAEF,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QACjD,MAAM,IAAI,GAAG,kBAAkB,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAC9C,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QAC5D,YAAY,CAAC,IAAI,CAAC,WAAW,MAAM,GAAG,OAAO,KAAK,IAAI,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED,QAAQ,CAAC,IAAI,CAAC;;;;EAId,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;OAClB,CAAC,CAAC;IAEP,gDAAgD;IAChD,MAAM,cAAc,GAAa,CAAC,MAAM,EAAE,oEAAoE,CAAC,CAAC;IAEhH,IAAI,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC/F,cAAc,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;IACtE,CAAC;IACD,cAAc,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;IACzD,cAAc,CAAC,IAAI,CACjB,4CAA4C;QAC1C,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3C,CAAC,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;QAClD,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CACpD,CAAC;IAEF,IAAI,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACnC,cAAc,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;IAC3E,CAAC;IACD,IAAI,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QACjC,cAAc,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;IAC7D,CAAC;IACD,IAAI,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAChC,cAAc,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;QACzE,cAAc,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;IACtE,CAAC;IACD,cAAc,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;IAEnE,IAAI,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACnC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACxB,cAAc,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;QAC7E,cAAc,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAC;QAC5E,IAAI,UAAU,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;YACvC,cAAc,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC;IAED,QAAQ,CAAC,IAAI,CAAC;;;;;;EAMd,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;OACpB,CAAC,CAAC;IAEP,kCAAkC;IAClC,MAAM,cAAc,GAAa,EAAE,CAAC;IACpC,IAAI,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,cAAc,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IAC7E,IAAI,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,cAAc,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;IAC/E,cAAc,CAAC,IAAI,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;IAExD,QAAQ,CAAC,IAAI,CAAC;;;;;;;;;uBASO,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC;;2HAE0E,CAAC,CAAC;IAE3H,6CAA6C;IAC7C,IAAI,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9B,QAAQ,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;OAiBX,CAAC,CAAC;IACP,CAAC;IAED,0CAA0C;IAC1C,IAAI,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAClC,QAAQ,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAkCX,CAAC,CAAC;IACP,CAAC;IAED,4CAA4C;IAC5C,IAAI,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACnC,QAAQ,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;8FAqB4E,CAAC,CAAC;IAC9F,CAAC;IAED,uCAAuC;IACvC,QAAQ,CAAC,IAAI,CAAC;;;mHAGmG,CAAC,CAAC;IAEnH,IAAI,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9B,QAAQ,CAAC,IAAI,CAAC;;;;;;;;6EAQ2D,CAAC,CAAC;IAC7E,CAAC;IAED,QAAQ,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;OAiBT,CAAC,CAAC;IAEP,8CAA8C;IAC9C,IAAI,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAChC,QAAQ,CAAC,IAAI,CAAC;;;;;;;;;;kEAUgD,CAAC,CAAC;IAClE,CAAC;IAED,4CAA4C;IAC5C,IAAI,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACnC,QAAQ,CAAC,IAAI,CAAC;;;;;;;;;;;;;yCAauB,CAAC,CAAC;IACzC,CAAC;IAED,wCAAwC;IACxC,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,IAAI,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QACpC,OAAO,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;QAChE,OAAO,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;IAClE,CAAC;IACD,IAAI,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAClC,OAAO,CAAC,IAAI,CAAC,uEAAuE,CAAC,CAAC;IACxF,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;IACpE,IAAI,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9B,OAAO,CAAC,IAAI,CAAC,yEAAyE,CAAC,CAAC;IAC1F,CAAC;IAED,QAAQ,CAAC,IAAI,CAAC;;;EAGd,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;CACnD,CAAC,CAAC;IAED,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,UAAuB;IACxD,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,mFAAmF;IACnF,IAAI,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAChC,QAAQ,CAAC,IAAI,CAAC;;;EAGhB,CAAC,CAAC;IACF,CAAC;IAED,yBAAyB;IACzB,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,kCAAkC;IAClC,OAAO,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;IAClD,OAAO,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;IAEjD,uBAAuB;IACvB,IAAI,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;IACnD,CAAC;IAED,iCAAiC;IACjC,IAAI,UAAU,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;QACzC,OAAO,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;QACpD,OAAO,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;IAC1D,CAAC;IAED,QAAQ,CAAC,IAAI,CAAC;;;EAGd,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;;;;;EAKlB,CAAC,CAAC;IAEF,OAAO,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;AACtC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,UAAuB;IACnD,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,MAAM,SAAS,GAAa,EAAE,CAAC;IAE/B,kCAAkC;IAClC,YAAY,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;IACpE,YAAY,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;IAClE,SAAS,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;IACpE,SAAS,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;IAElE,uBAAuB;IACvB,IAAI,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/B,YAAY,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;QAClE,SAAS,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;IACpE,CAAC;IAED,iCAAiC;IACjC,IAAI,UAAU,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;QACzC,YAAY,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;QACrE,YAAY,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;QACnE,SAAS,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;QACxE,SAAS,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC;IAClF,CAAC;IAED,2CAA2C;IAC3C,YAAY,CAAC,IAAI,CAAC,+EAA+E,CAAC,CAAC;IACnG,YAAY,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;IACxD,YAAY,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;IACzD,SAAS,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;IAClD,SAAS,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;IAChD,SAAS,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;IAElD,OAAO;;;;;;;;EAQP,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;;;;;;;;;;;EAWvB,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;CAsBrB,CAAC;AACF,CAAC;AAED,mCAAmC;AACnC,MAAM,UAAU,gBAAgB;IAC9B,OAAO;;;;;;;;;;;CAWR,CAAC;AACF,CAAC"}
1
+ {"version":3,"file":"generators.js","sourceRoot":"","sources":["../../../src/utils/scaffold/generators.ts"],"names":[],"mappings":"AAAA,qCAAqC;AAErC;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAG7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAExD,iEAAiE;AACjE,MAAM,UAAU,kBAAkB,CAAC,UAAuB;IACxD,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,IAAI,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACtC,QAAQ,CAAC,IAAI,CAAC;;;EAGhB,CAAC,CAAC;IACF,CAAC;IAED,MAAM,OAAO,GAAa,CAAC,mCAAmC,EAAE,kCAAkC,CAAC,CAAC;IAEpG,IAAI,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACrC,OAAO,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;IACnD,CAAC;IAED,IAAI,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;QAC/C,OAAO,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;QACpD,OAAO,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;IAC1D,CAAC;IAED,QAAQ,CAAC,IAAI,CAAC;;;EAGd,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;;;;;EAKlB,CAAC,CAAC;IAEF,OAAO,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;AACtC,CAAC;AAED,0DAA0D;AAC1D,MAAM,UAAU,aAAa,CAAC,UAAuB;IACnD,MAAM,YAAY,GAAa;QAC7B,gDAAgD;QAChD,8CAA8C;KAC/C,CAAC;IACF,MAAM,SAAS,GAAa;QAC1B,mDAAmD;QACnD,iDAAiD;KAClD,CAAC;IAEF,IAAI,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACrC,YAAY,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;QAClE,SAAS,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;IACpE,CAAC;IAED,IAAI,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;QAC/C,YAAY,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;QACrE,YAAY,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;QACnE,SAAS,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;QACxE,SAAS,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC;IAClF,CAAC;IAED,2CAA2C;IAC3C,YAAY,CAAC,IAAI,CAAC,+EAA+E,CAAC,CAAC;IACnG,YAAY,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;IACxD,YAAY,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;IACzD,SAAS,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;IAClD,SAAS,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;IAChD,SAAS,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;IAElD,OAAO;;;;;;;;EAQP,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;;;;;;;;;;;EAWvB,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;CAsBrB,CAAC;AACF,CAAC;AAED,mCAAmC;AACnC,MAAM,UAAU,gBAAgB;IAC9B,OAAO;;;;;;;;;;;CAWR,CAAC;AACF,CAAC"}
@@ -1,9 +1,8 @@
1
1
  /**
2
- * Scaffold utilities
3
- *
4
- * Re-exports all scaffold-related functions for convenient importing.
2
+ * Scaffold utilities - re-exports for convenient importing.
5
3
  */
6
4
  export { resolveFeatureDependencies, mergeDependencies, mergeScripts } from './dependencies.js';
5
+ export type { MergeDependenciesResult } from './dependencies.js';
7
6
  export { computeFileStructure, getConfigFiles, readConfigFileContent } from './file-structure.js';
8
7
  export { getSetupCommands } from './commands.js';
9
8
  export { generateClaudeMd, generateViteEnvDts, generateEnvTs, generateRoutesTs } from './generators.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utils/scaffold/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,0BAA0B,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAChG,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAClG,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACxG,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utils/scaffold/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,0BAA0B,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAChG,YAAY,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAClG,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACxG,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC"}
@@ -1,7 +1,5 @@
1
1
  /**
2
- * Scaffold utilities
3
- *
4
- * Re-exports all scaffold-related functions for convenient importing.
2
+ * Scaffold utilities - re-exports for convenient importing.
5
3
  */
6
4
  export { resolveFeatureDependencies, mergeDependencies, mergeScripts } from './dependencies.js';
7
5
  export { computeFileStructure, getConfigFiles, readConfigFileContent } from './file-structure.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/utils/scaffold/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,0BAA0B,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAChG,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAClG,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACxG,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/utils/scaffold/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,0BAA0B,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEhG,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAClG,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACxG,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@react-spa-scaffold/mcp",
3
- "version": "1.2.0",
3
+ "version": "2.0.0",
4
4
  "description": "MCP server for scaffolding projects based on react-spa-scaffold template",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -43,8 +43,8 @@
43
43
  "zod": "^4.2.1"
44
44
  },
45
45
  "devDependencies": {
46
- "@types/node": "^22.15.0",
47
46
  "@react-spa-scaffold/tsconfig": "*",
47
+ "@types/node": "^22.15.0",
48
48
  "typescript": "~5.9.0",
49
49
  "vitest": "^4.0.16"
50
50
  },
@@ -1,49 +0,0 @@
1
- /**
2
- * get_example tool
3
- *
4
- * Returns real code examples for specific pattern types.
5
- * AI agents use this to understand how to generate code
6
- * that matches react-spa-scaffold conventions.
7
- */
8
- import { z } from 'zod';
9
- export declare const getExampleSchema: z.ZodObject<{
10
- pattern: z.ZodEnum<{
11
- [x: string]: string;
12
- }>;
13
- }, z.core.$strip>;
14
- export type GetExampleInput = z.infer<typeof getExampleSchema>;
15
- export declare function getExample(input: GetExampleInput): Promise<{
16
- error: string;
17
- hint: string;
18
- pattern?: undefined;
19
- description?: undefined;
20
- filePath?: undefined;
21
- keyPoints?: undefined;
22
- code?: undefined;
23
- usage?: undefined;
24
- } | {
25
- pattern: string;
26
- description: string;
27
- filePath: string;
28
- keyPoints: string[];
29
- code: string;
30
- usage: string;
31
- error?: undefined;
32
- hint?: undefined;
33
- }>;
34
- export declare const getExampleToolDefinition: {
35
- name: string;
36
- description: string;
37
- inputSchema: {
38
- type: "object";
39
- properties: {
40
- pattern: {
41
- type: "string";
42
- description: string;
43
- enum: [string, ...string[]];
44
- };
45
- };
46
- required: string[];
47
- };
48
- };
49
- //# sourceMappingURL=get-example.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"get-example.d.ts","sourceRoot":"","sources":["../../src/tools/get-example.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,eAAO,MAAM,gBAAgB;;;;iBAI3B,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE/D,wBAAsB,UAAU,CAAC,KAAK,EAAE,eAAe;;;;;;;;;;;;;;;;;;GAoBtD;AAwBD,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;CAoCpC,CAAC"}
@@ -1,91 +0,0 @@
1
- /**
2
- * get_example tool
3
- *
4
- * Returns real code examples for specific pattern types.
5
- * AI agents use this to understand how to generate code
6
- * that matches react-spa-scaffold conventions.
7
- */
8
- import { z } from 'zod';
9
- import { getCodeExample, getAvailablePatterns } from '../utils/index.js';
10
- const AVAILABLE_PATTERNS = getAvailablePatterns();
11
- export const getExampleSchema = z.object({
12
- pattern: z.enum(AVAILABLE_PATTERNS, {
13
- error: `Invalid pattern. Available: ${AVAILABLE_PATTERNS.join(', ')}`,
14
- }),
15
- });
16
- export async function getExample(input) {
17
- const { pattern } = input;
18
- const example = await getCodeExample(pattern);
19
- if (!example) {
20
- return {
21
- error: `Could not load example for pattern: ${pattern}`,
22
- hint: 'Ensure MCP server is running from react-spa-scaffold directory',
23
- };
24
- }
25
- return {
26
- pattern: example.pattern,
27
- description: example.description,
28
- filePath: example.filePath,
29
- keyPoints: example.keyPoints,
30
- code: example.code,
31
- usage: generateUsageHint(pattern),
32
- };
33
- }
34
- function generateUsageHint(pattern) {
35
- const hints = {
36
- 'component-ui': 'Place in src/components/ui/ with kebab-case filename',
37
- 'component-shared': 'Create subdirectory in src/components/shared/ with index.ts barrel',
38
- 'component-layout': 'Place in src/components/layout/',
39
- 'hook-state': 'Place in src/hooks/ with useXxx.ts naming',
40
- 'hook-query': 'Place in src/hooks/ - define fetchFn outside hook',
41
- 'hook-form': 'Place in src/hooks/ - import schema from lib/validations',
42
- 'hook-effect': 'Place in src/hooks/ - no return value',
43
- 'zustand-store': 'Place in src/stores/ with xxxStore.ts naming',
44
- 'page-component': 'Place in src/pages/ with XxxPage named export',
45
- 'context-provider': 'Place in src/contexts/ - export both Provider and hook',
46
- 'test-component': 'Co-locate with component: ComponentName.test.tsx next to ComponentName.tsx',
47
- 'test-hook': 'Co-locate with hook: useXxx.test.ts next to useXxx.ts',
48
- 'test-store': 'Co-locate with store: xxxStore.test.ts next to xxxStore.ts',
49
- 'msw-handler': 'Place in src/mocks/handlers/',
50
- 'zod-schema': 'Add to src/lib/validations.ts',
51
- };
52
- return hints[pattern] || 'Follow the file path shown in the example';
53
- }
54
- export const getExampleToolDefinition = {
55
- name: 'get_example',
56
- description: `Get real code example for a specific pattern type.
57
-
58
- Returns actual code from the react-spa-scaffold repository, not templates.
59
- Use this to understand exact patterns when generating new files.
60
-
61
- Available patterns:
62
- - Components: component-ui, component-shared, component-layout
63
- - Hooks: hook-state, hook-query, hook-form, hook-effect, use-language-hook
64
- - Store: zustand-store
65
- - Pages: page-component, lazy-page
66
- - Context: context-provider, query-provider
67
- - API: api-client
68
- - Tests: test-component, test-hook, test-store, msw-handler
69
- - Validation: zod-schema, form-error-component
70
- - i18n: trans-component, t-function, language-switcher
71
- - Utils: storage-utility
72
- - Theme: theme-toggle
73
- - SEO: seo-component
74
-
75
- Each example includes:
76
- - Actual working code
77
- - Key points explaining the pattern
78
- - File path where it should be placed`,
79
- inputSchema: {
80
- type: 'object',
81
- properties: {
82
- pattern: {
83
- type: 'string',
84
- description: 'Pattern type to get example for',
85
- enum: AVAILABLE_PATTERNS,
86
- },
87
- },
88
- required: ['pattern'],
89
- },
90
- };
91
- //# sourceMappingURL=get-example.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"get-example.js","sourceRoot":"","sources":["../../src/tools/get-example.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAEzE,MAAM,kBAAkB,GAAG,oBAAoB,EAA2B,CAAC;AAE3E,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,kBAAkB,EAAE;QAClC,KAAK,EAAE,+BAA+B,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;KACtE,CAAC;CACH,CAAC,CAAC;AAIH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,KAAsB;IACrD,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;IAE1B,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC;IAE9C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO;YACL,KAAK,EAAE,uCAAuC,OAAO,EAAE;YACvD,IAAI,EAAE,gEAAgE;SACvE,CAAC;IACJ,CAAC;IAED,OAAO;QACL,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,KAAK,EAAE,iBAAiB,CAAC,OAAO,CAAC;KAClC,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,OAAe;IACxC,MAAM,KAAK,GAA2B;QACpC,cAAc,EAAE,sDAAsD;QACtE,kBAAkB,EAAE,oEAAoE;QACxF,kBAAkB,EAAE,iCAAiC;QACrD,YAAY,EAAE,2CAA2C;QACzD,YAAY,EAAE,mDAAmD;QACjE,WAAW,EAAE,0DAA0D;QACvE,aAAa,EAAE,uCAAuC;QACtD,eAAe,EAAE,8CAA8C;QAC/D,gBAAgB,EAAE,+CAA+C;QACjE,kBAAkB,EAAE,wDAAwD;QAC5E,gBAAgB,EAAE,4EAA4E;QAC9F,WAAW,EAAE,uDAAuD;QACpE,YAAY,EAAE,4DAA4D;QAC1E,aAAa,EAAE,8BAA8B;QAC7C,YAAY,EAAE,+BAA+B;KAC9C,CAAC;IAEF,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,2CAA2C,CAAC;AACvE,CAAC;AAED,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,IAAI,EAAE,aAAa;IACnB,WAAW,EAAE;;;;;;;;;;;;;;;;;;;;;;sCAsBuB;IACpC,WAAW,EAAE;QACX,IAAI,EAAE,QAAiB;QACvB,UAAU,EAAE;YACV,OAAO,EAAE;gBACP,IAAI,EAAE,QAAiB;gBACvB,WAAW,EAAE,iCAAiC;gBAC9C,IAAI,EAAE,kBAAkB;aACzB;SACF;QACD,QAAQ,EAAE,CAAC,SAAS,CAAC;KACtB;CACF,CAAC"}
@@ -1,5 +0,0 @@
1
- /**
2
- * Tests for get_example tool
3
- */
4
- export {};
5
- //# sourceMappingURL=get-example.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"get-example.test.d.ts","sourceRoot":"","sources":["../../src/tools/get-example.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -1,63 +0,0 @@
1
- /**
2
- * Tests for get_example tool
3
- */
4
- import { describe, it, expect } from 'vitest';
5
- import { getExample, getExampleSchema } from './get-example.js';
6
- describe('get_example tool', () => {
7
- it('rejects unknown pattern via schema', () => {
8
- const result = getExampleSchema.safeParse({ pattern: 'unknown-pattern' });
9
- expect(result.success).toBe(false);
10
- if (!result.success) {
11
- expect(result.error.message).toContain('Invalid pattern');
12
- }
13
- });
14
- it('returns code for valid pattern', async () => {
15
- const result = await getExample({ pattern: 'zustand-store' });
16
- expect(result).not.toHaveProperty('error');
17
- expect(result).toHaveProperty('code');
18
- expect(result).toHaveProperty('filePath');
19
- expect(result).toHaveProperty('description');
20
- expect(result).toHaveProperty('keyPoints');
21
- });
22
- it('returns usage hint', async () => {
23
- const result = await getExample({ pattern: 'zustand-store' });
24
- expect(result).toHaveProperty('usage');
25
- expect(typeof result.usage).toBe('string');
26
- });
27
- it('returns actual code content', async () => {
28
- const result = await getExample({ pattern: 'hook-state' });
29
- expect(result.code).toBeTruthy();
30
- expect(result.code?.length).toBeGreaterThan(50);
31
- });
32
- it('works for component patterns', async () => {
33
- const result = await getExample({ pattern: 'component-ui' });
34
- expect(result).not.toHaveProperty('error');
35
- expect(result.code).toContain('export');
36
- });
37
- it('works for test patterns', async () => {
38
- const result = await getExample({ pattern: 'test-component' });
39
- expect(result).not.toHaveProperty('error');
40
- expect(result.code).toContain('describe');
41
- });
42
- it('works for mobile-context pattern', async () => {
43
- const result = await getExample({ pattern: 'mobile-context' });
44
- expect(result).not.toHaveProperty('error');
45
- expect(result.code).toContain('MobileProvider');
46
- expect(result.code).toContain('useMobileContext');
47
- expect(result.filePath).toBe('src/contexts/mobileContext.tsx');
48
- });
49
- it('works for use-media-query pattern', async () => {
50
- const result = await getExample({ pattern: 'use-media-query' });
51
- expect(result).not.toHaveProperty('error');
52
- expect(result.code).toContain('BREAKPOINTS');
53
- expect(result.code).toContain('useMediaQuery');
54
- expect(result.filePath).toBe('src/hooks/useMediaQuery.ts');
55
- });
56
- it('works for use-touch-sizes pattern', async () => {
57
- const result = await getExample({ pattern: 'use-touch-sizes' });
58
- expect(result).not.toHaveProperty('error');
59
- expect(result.code).toContain('useTouchSizes');
60
- expect(result.filePath).toBe('src/hooks/useTouchSizes.ts');
61
- });
62
- });
63
- //# sourceMappingURL=get-example.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"get-example.test.js","sourceRoot":"","sources":["../../src/tools/get-example.test.ts"],"names":[],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- import type { PatternMap } from './types.js';
2
- export declare const apiPatterns: PatternMap;
3
- //# sourceMappingURL=api-patterns.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"api-patterns.d.ts","sourceRoot":"","sources":["../../../src/utils/examples/api-patterns.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,eAAO,MAAM,WAAW,EAAE,UAiBzB,CAAC"}