@react-spa-scaffold/mcp 1.1.3 → 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (261) hide show
  1. package/README.md +19 -15
  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 +3 -0
  7. package/dist/features/definitions/api.d.ts.map +1 -0
  8. package/dist/features/definitions/api.js +20 -0
  9. package/dist/features/definitions/api.js.map +1 -0
  10. package/dist/features/definitions/ci.d.ts +3 -0
  11. package/dist/features/definitions/ci.d.ts.map +1 -0
  12. package/dist/features/definitions/ci.js +25 -0
  13. package/dist/features/definitions/ci.js.map +1 -0
  14. package/dist/features/definitions/core.d.ts +3 -0
  15. package/dist/features/definitions/core.d.ts.map +1 -0
  16. package/dist/features/definitions/core.js +76 -0
  17. package/dist/features/definitions/core.js.map +1 -0
  18. package/dist/features/definitions/devtools.d.ts +3 -0
  19. package/dist/features/definitions/devtools.d.ts.map +1 -0
  20. package/dist/features/definitions/devtools.js +53 -0
  21. package/dist/features/definitions/devtools.js.map +1 -0
  22. package/dist/features/definitions/forms.d.ts +3 -0
  23. package/dist/features/definitions/forms.d.ts.map +1 -0
  24. package/dist/features/definitions/forms.js +32 -0
  25. package/dist/features/definitions/forms.js.map +1 -0
  26. package/dist/features/definitions/i18n.d.ts +3 -0
  27. package/dist/features/definitions/i18n.d.ts.map +1 -0
  28. package/dist/features/definitions/i18n.js +50 -0
  29. package/dist/features/definitions/i18n.js.map +1 -0
  30. package/dist/features/definitions/index.d.ts +15 -0
  31. package/dist/features/definitions/index.d.ts.map +1 -0
  32. package/dist/features/definitions/index.js +15 -0
  33. package/dist/features/definitions/index.js.map +1 -0
  34. package/dist/features/definitions/mobile.d.ts +3 -0
  35. package/dist/features/definitions/mobile.d.ts.map +1 -0
  36. package/dist/features/definitions/mobile.js +19 -0
  37. package/dist/features/definitions/mobile.js.map +1 -0
  38. package/dist/features/definitions/observability.d.ts +3 -0
  39. package/dist/features/definitions/observability.d.ts.map +1 -0
  40. package/dist/features/definitions/observability.js +21 -0
  41. package/dist/features/definitions/observability.js.map +1 -0
  42. package/dist/features/definitions/performance.d.ts +3 -0
  43. package/dist/features/definitions/performance.d.ts.map +1 -0
  44. package/dist/features/definitions/performance.js +28 -0
  45. package/dist/features/definitions/performance.js.map +1 -0
  46. package/dist/features/definitions/routing.d.ts +3 -0
  47. package/dist/features/definitions/routing.d.ts.map +1 -0
  48. package/dist/features/definitions/routing.js +25 -0
  49. package/dist/features/definitions/routing.js.map +1 -0
  50. package/dist/features/definitions/state.d.ts +3 -0
  51. package/dist/features/definitions/state.d.ts.map +1 -0
  52. package/dist/features/definitions/state.js +27 -0
  53. package/dist/features/definitions/state.js.map +1 -0
  54. package/dist/features/definitions/testing.d.ts +3 -0
  55. package/dist/features/definitions/testing.d.ts.map +1 -0
  56. package/dist/features/definitions/testing.js +56 -0
  57. package/dist/features/definitions/testing.js.map +1 -0
  58. package/dist/features/definitions/theming.d.ts +3 -0
  59. package/dist/features/definitions/theming.d.ts.map +1 -0
  60. package/dist/features/definitions/theming.js +27 -0
  61. package/dist/features/definitions/theming.js.map +1 -0
  62. package/dist/features/definitions/ui.d.ts +3 -0
  63. package/dist/features/definitions/ui.d.ts.map +1 -0
  64. package/dist/features/definitions/ui.js +44 -0
  65. package/dist/features/definitions/ui.js.map +1 -0
  66. package/dist/features/index.d.ts +3 -2
  67. package/dist/features/index.d.ts.map +1 -1
  68. package/dist/features/index.js +2 -1
  69. package/dist/features/index.js.map +1 -1
  70. package/dist/features/registry.d.ts +3 -9
  71. package/dist/features/registry.d.ts.map +1 -1
  72. package/dist/features/registry.js +3 -554
  73. package/dist/features/registry.js.map +1 -1
  74. package/dist/features/types.d.ts +17 -20
  75. package/dist/features/types.d.ts.map +1 -1
  76. package/dist/features/types.js +7 -1
  77. package/dist/features/types.js.map +1 -1
  78. package/dist/features/types.test.d.ts +5 -0
  79. package/dist/features/types.test.d.ts.map +1 -0
  80. package/dist/features/types.test.js +32 -0
  81. package/dist/features/types.test.js.map +1 -0
  82. package/dist/resources/docs.d.ts +2 -8
  83. package/dist/resources/docs.d.ts.map +1 -1
  84. package/dist/resources/docs.js +27 -49
  85. package/dist/resources/docs.js.map +1 -1
  86. package/dist/server.d.ts +2 -7
  87. package/dist/server.d.ts.map +1 -1
  88. package/dist/server.js +24 -57
  89. package/dist/server.js.map +1 -1
  90. package/dist/server.test.d.ts +2 -0
  91. package/dist/server.test.d.ts.map +1 -0
  92. package/dist/server.test.js +14 -0
  93. package/dist/server.test.js.map +1 -0
  94. package/dist/tools/get-example.d.ts +4 -15
  95. package/dist/tools/get-example.d.ts.map +1 -1
  96. package/dist/tools/get-example.js +3 -11
  97. package/dist/tools/get-example.js.map +1 -1
  98. package/dist/tools/get-example.test.d.ts +5 -0
  99. package/dist/tools/get-example.test.d.ts.map +1 -0
  100. package/dist/tools/get-example.test.js +63 -0
  101. package/dist/tools/get-example.test.js.map +1 -0
  102. package/dist/tools/get-features.d.ts +15 -14
  103. package/dist/tools/get-features.d.ts.map +1 -1
  104. package/dist/tools/get-features.js +12 -2
  105. package/dist/tools/get-features.js.map +1 -1
  106. package/dist/tools/get-features.test.d.ts +5 -0
  107. package/dist/tools/get-features.test.d.ts.map +1 -0
  108. package/dist/tools/get-features.test.js +45 -0
  109. package/dist/tools/get-features.test.js.map +1 -0
  110. package/dist/tools/get-file.d.ts +23 -0
  111. package/dist/tools/get-file.d.ts.map +1 -0
  112. package/dist/tools/get-file.js +53 -0
  113. package/dist/tools/get-file.js.map +1 -0
  114. package/dist/tools/get-file.test.d.ts +5 -0
  115. package/dist/tools/get-file.test.d.ts.map +1 -0
  116. package/dist/tools/get-file.test.js +63 -0
  117. package/dist/tools/get-file.test.js.map +1 -0
  118. package/dist/tools/get-scaffold.d.ts +8 -29
  119. package/dist/tools/get-scaffold.d.ts.map +1 -1
  120. package/dist/tools/get-scaffold.js +18 -24
  121. package/dist/tools/get-scaffold.js.map +1 -1
  122. package/dist/tools/get-scaffold.test.d.ts +5 -0
  123. package/dist/tools/get-scaffold.test.d.ts.map +1 -0
  124. package/dist/tools/get-scaffold.test.js +197 -0
  125. package/dist/tools/get-scaffold.test.js.map +1 -0
  126. package/dist/tools/index.d.ts +2 -0
  127. package/dist/tools/index.d.ts.map +1 -1
  128. package/dist/tools/index.js +1 -0
  129. package/dist/tools/index.js.map +1 -1
  130. package/dist/tools/registry.d.ts +13 -0
  131. package/dist/tools/registry.d.ts.map +1 -0
  132. package/dist/tools/registry.js +47 -0
  133. package/dist/tools/registry.js.map +1 -0
  134. package/dist/tools/types.d.ts +41 -0
  135. package/dist/tools/types.d.ts.map +1 -0
  136. package/dist/tools/types.js +8 -0
  137. package/dist/tools/types.js.map +1 -0
  138. package/dist/utils/cache.d.ts +25 -0
  139. package/dist/utils/cache.d.ts.map +1 -0
  140. package/dist/utils/cache.js +61 -0
  141. package/dist/utils/cache.js.map +1 -0
  142. package/dist/utils/docs.d.ts +1 -3
  143. package/dist/utils/docs.d.ts.map +1 -1
  144. package/dist/utils/docs.js +3 -8
  145. package/dist/utils/docs.js.map +1 -1
  146. package/dist/utils/docs.test.d.ts +5 -0
  147. package/dist/utils/docs.test.d.ts.map +1 -0
  148. package/dist/utils/docs.test.js +37 -0
  149. package/dist/utils/docs.test.js.map +1 -0
  150. package/dist/utils/errors.d.ts +8 -0
  151. package/dist/utils/errors.d.ts.map +1 -0
  152. package/dist/utils/errors.js +19 -0
  153. package/dist/utils/errors.js.map +1 -0
  154. package/dist/utils/examples/api-patterns.d.ts +3 -0
  155. package/dist/utils/examples/api-patterns.d.ts.map +1 -0
  156. package/dist/utils/examples/api-patterns.js +19 -0
  157. package/dist/utils/examples/api-patterns.js.map +1 -0
  158. package/dist/utils/examples/component-patterns.d.ts +3 -0
  159. package/dist/utils/examples/component-patterns.d.ts.map +1 -0
  160. package/dist/utils/examples/component-patterns.js +71 -0
  161. package/dist/utils/examples/component-patterns.js.map +1 -0
  162. package/dist/utils/examples/context-patterns.d.ts +3 -0
  163. package/dist/utils/examples/context-patterns.d.ts.map +1 -0
  164. package/dist/utils/examples/context-patterns.js +32 -0
  165. package/dist/utils/examples/context-patterns.js.map +1 -0
  166. package/dist/utils/examples/hook-patterns.d.ts +3 -0
  167. package/dist/utils/examples/hook-patterns.d.ts.map +1 -0
  168. package/dist/utils/examples/hook-patterns.js +55 -0
  169. package/dist/utils/examples/hook-patterns.js.map +1 -0
  170. package/dist/utils/examples/i18n-patterns.d.ts +3 -0
  171. package/dist/utils/examples/i18n-patterns.d.ts.map +1 -0
  172. package/dist/utils/examples/i18n-patterns.js +43 -0
  173. package/dist/utils/examples/i18n-patterns.js.map +1 -0
  174. package/dist/utils/examples/index.d.ts +12 -0
  175. package/dist/utils/examples/index.d.ts.map +1 -0
  176. package/dist/utils/examples/index.js +65 -0
  177. package/dist/utils/examples/index.js.map +1 -0
  178. package/dist/utils/examples/mobile-patterns.d.ts +3 -0
  179. package/dist/utils/examples/mobile-patterns.d.ts.map +1 -0
  180. package/dist/utils/examples/mobile-patterns.js +38 -0
  181. package/dist/utils/examples/mobile-patterns.js.map +1 -0
  182. package/dist/utils/examples/page-patterns.d.ts +3 -0
  183. package/dist/utils/examples/page-patterns.d.ts.map +1 -0
  184. package/dist/utils/examples/page-patterns.js +34 -0
  185. package/dist/utils/examples/page-patterns.js.map +1 -0
  186. package/dist/utils/examples/patterns.test.d.ts +6 -0
  187. package/dist/utils/examples/patterns.test.d.ts.map +1 -0
  188. package/dist/utils/examples/patterns.test.js +75 -0
  189. package/dist/utils/examples/patterns.test.js.map +1 -0
  190. package/dist/utils/examples/store-patterns.d.ts +3 -0
  191. package/dist/utils/examples/store-patterns.d.ts.map +1 -0
  192. package/dist/utils/examples/store-patterns.js +40 -0
  193. package/dist/utils/examples/store-patterns.js.map +1 -0
  194. package/dist/utils/examples/test-patterns.d.ts +3 -0
  195. package/dist/utils/examples/test-patterns.d.ts.map +1 -0
  196. package/dist/utils/examples/test-patterns.js +58 -0
  197. package/dist/utils/examples/test-patterns.js.map +1 -0
  198. package/dist/utils/examples/types.d.ts +17 -0
  199. package/dist/utils/examples/types.d.ts.map +1 -0
  200. package/dist/utils/examples/types.js +2 -0
  201. package/dist/utils/examples/types.js.map +1 -0
  202. package/dist/utils/examples/utility-patterns.d.ts +3 -0
  203. package/dist/utils/examples/utility-patterns.d.ts.map +1 -0
  204. package/dist/utils/examples/utility-patterns.js +77 -0
  205. package/dist/utils/examples/utility-patterns.js.map +1 -0
  206. package/dist/utils/index.d.ts +5 -3
  207. package/dist/utils/index.d.ts.map +1 -1
  208. package/dist/utils/index.js +5 -3
  209. package/dist/utils/index.js.map +1 -1
  210. package/dist/utils/paths.d.ts +13 -23
  211. package/dist/utils/paths.d.ts.map +1 -1
  212. package/dist/utils/paths.js +28 -39
  213. package/dist/utils/paths.js.map +1 -1
  214. package/dist/utils/paths.test.d.ts +2 -0
  215. package/dist/utils/paths.test.d.ts.map +1 -0
  216. package/dist/utils/paths.test.js +38 -0
  217. package/dist/utils/paths.test.js.map +1 -0
  218. package/dist/utils/scaffold/claude-md/index.d.ts +7 -0
  219. package/dist/utils/scaffold/claude-md/index.d.ts.map +1 -0
  220. package/dist/utils/scaffold/claude-md/index.js +23 -0
  221. package/dist/utils/scaffold/claude-md/index.js.map +1 -0
  222. package/dist/utils/scaffold/claude-md/sections.d.ts +16 -0
  223. package/dist/utils/scaffold/claude-md/sections.d.ts.map +1 -0
  224. package/dist/utils/scaffold/claude-md/sections.js +269 -0
  225. package/dist/utils/scaffold/claude-md/sections.js.map +1 -0
  226. package/dist/utils/scaffold/commands.d.ts +7 -0
  227. package/dist/utils/scaffold/commands.d.ts.map +1 -0
  228. package/dist/utils/scaffold/commands.js +19 -0
  229. package/dist/utils/scaffold/commands.js.map +1 -0
  230. package/dist/utils/scaffold/compute.d.ts +15 -0
  231. package/dist/utils/scaffold/compute.d.ts.map +1 -0
  232. package/dist/utils/scaffold/compute.js +63 -0
  233. package/dist/utils/scaffold/compute.js.map +1 -0
  234. package/dist/utils/scaffold/dependencies.d.ts +25 -0
  235. package/dist/utils/scaffold/dependencies.d.ts.map +1 -0
  236. package/dist/utils/scaffold/dependencies.js +101 -0
  237. package/dist/utils/scaffold/dependencies.js.map +1 -0
  238. package/dist/utils/scaffold/file-structure.d.ts +23 -0
  239. package/dist/utils/scaffold/file-structure.d.ts.map +1 -0
  240. package/dist/utils/scaffold/file-structure.js +62 -0
  241. package/dist/utils/scaffold/file-structure.js.map +1 -0
  242. package/dist/utils/scaffold/generators.d.ts +9 -0
  243. package/dist/utils/scaffold/generators.d.ts.map +1 -0
  244. package/dist/utils/scaffold/generators.js +121 -0
  245. package/dist/utils/scaffold/generators.js.map +1 -0
  246. package/dist/utils/scaffold/index.d.ts +10 -0
  247. package/dist/utils/scaffold/index.d.ts.map +1 -0
  248. package/dist/utils/scaffold/index.js +9 -0
  249. package/dist/utils/scaffold/index.js.map +1 -0
  250. package/package.json +2 -2
  251. package/templates/.github/workflows/release.yml +1 -1
  252. package/templates/e2e/tests/home.spec.ts +2 -2
  253. package/templates/e2e/tests/language.spec.ts +7 -3
  254. package/dist/utils/examples.d.ts +0 -27
  255. package/dist/utils/examples.d.ts.map +0 -1
  256. package/dist/utils/examples.js +0 -438
  257. package/dist/utils/examples.js.map +0 -1
  258. package/dist/utils/scaffold.d.ts +0 -59
  259. package/dist/utils/scaffold.d.ts.map +0 -1
  260. package/dist/utils/scaffold.js +0 -637
  261. package/dist/utils/scaffold.js.map +0 -1
@@ -1,637 +0,0 @@
1
- // noinspection JSUnresolvedReference
2
- /**
3
- * Scaffold computation utilities
4
- */
5
- import { readFile } from 'fs/promises';
6
- import { FEATURES } from '../features/index.js';
7
- import { computeDocsContent, computeDocsForFeatures } from './docs.js';
8
- import { resolveTemplatePath } from './paths.js';
9
- /**
10
- * Resolve selected features (always includes core)
11
- *
12
- * Features are mostly independent, with one exception:
13
- * - theming requires state feature (for Zustand persistence)
14
- */
15
- export function resolveFeatureDependencies(selectedFeatures) {
16
- const resolved = new Set();
17
- // Always include core
18
- resolved.add('core');
19
- // Add all selected features (no recursive dependency resolution)
20
- for (const featureId of selectedFeatures) {
21
- const feature = FEATURES[featureId];
22
- if (feature) {
23
- resolved.add(featureId);
24
- }
25
- }
26
- // Theming requires state feature for Zustand persistence
27
- if (resolved.has('theming') && !resolved.has('state')) {
28
- resolved.add('state');
29
- }
30
- return Array.from(resolved);
31
- }
32
- // Cache for source package.json to avoid repeated file reads
33
- let cachedSourcePackageJson = null;
34
- /**
35
- * Read and cache the source package.json dependencies
36
- */
37
- async function getSourceDependencies() {
38
- if (!cachedSourcePackageJson) {
39
- const path = resolveTemplatePath('package.json');
40
- const content = await readFile(path, 'utf-8');
41
- const pkg = JSON.parse(content);
42
- cachedSourcePackageJson = {
43
- dependencies: (pkg.dependencies || {}),
44
- devDependencies: (pkg.devDependencies || {}),
45
- };
46
- }
47
- return cachedSourcePackageJson;
48
- }
49
- /**
50
- * Merge dependencies from multiple features
51
- *
52
- * Resolves package versions from the source package.json at runtime.
53
- * This ensures scaffolded projects always use up-to-date dependency versions.
54
- */
55
- export async function mergeDependencies(featureIds) {
56
- const dependencies = {};
57
- const devDependencies = {};
58
- // Get source package.json for version lookup
59
- const sourcePkg = await getSourceDependencies();
60
- for (const featureId of featureIds) {
61
- const feature = FEATURES[featureId];
62
- if (!feature)
63
- continue;
64
- // Look up dependency versions from source package.json
65
- if (feature.dependencyNames) {
66
- for (const name of feature.dependencyNames) {
67
- if (sourcePkg.dependencies[name]) {
68
- dependencies[name] = sourcePkg.dependencies[name];
69
- }
70
- else {
71
- console.warn(`Dependency "${name}" not found in source package.json`);
72
- }
73
- }
74
- }
75
- if (feature.devDependencyNames) {
76
- for (const name of feature.devDependencyNames) {
77
- if (sourcePkg.devDependencies[name]) {
78
- devDependencies[name] = sourcePkg.devDependencies[name];
79
- }
80
- else {
81
- console.warn(`DevDependency "${name}" not found in source package.json`);
82
- }
83
- }
84
- }
85
- }
86
- // Sort alphabetically
87
- const sortObject = (obj) => Object.fromEntries(Object.entries(obj).sort(([a], [b]) => a.localeCompare(b)));
88
- return {
89
- dependencies: sortObject(dependencies),
90
- devDependencies: sortObject(devDependencies),
91
- };
92
- }
93
- /**
94
- * Merge scripts from multiple features
95
- */
96
- export function mergeScripts(featureIds) {
97
- const scripts = {};
98
- for (const featureId of featureIds) {
99
- const feature = FEATURES[featureId];
100
- if (!feature?.scripts)
101
- continue;
102
- Object.assign(scripts, feature.scripts);
103
- }
104
- return scripts;
105
- }
106
- /**
107
- * Compute file structure for selected features
108
- *
109
- * When the 'testing' feature is selected, testFiles from all selected features
110
- * are also included. This ensures scaffolded projects get tests that match
111
- * their source files.
112
- */
113
- export function computeFileStructure(featureIds) {
114
- const files = new Set();
115
- const includeTests = featureIds.includes('testing');
116
- for (const featureId of featureIds) {
117
- const feature = FEATURES[featureId];
118
- if (!feature)
119
- continue;
120
- // Always include source files
121
- if (feature.files) {
122
- for (const file of feature.files) {
123
- files.add(file);
124
- }
125
- }
126
- // Include test files only when testing feature is selected
127
- if (includeTests && feature.testFiles) {
128
- for (const file of feature.testFiles) {
129
- files.add(file);
130
- }
131
- }
132
- }
133
- return Array.from(files).sort();
134
- }
135
- /**
136
- * Get config files needed for selected features
137
- */
138
- export function getConfigFiles(featureIds) {
139
- const configs = new Set();
140
- for (const featureId of featureIds) {
141
- const feature = FEATURES[featureId];
142
- if (!feature?.configFiles)
143
- continue;
144
- for (const config of feature.configFiles) {
145
- configs.add(config);
146
- }
147
- }
148
- return Array.from(configs).sort();
149
- }
150
- /**
151
- * Read config file content from template
152
- */
153
- async function readConfigFileContent(configPath) {
154
- const fullPath = resolveTemplatePath(configPath);
155
- try {
156
- return await readFile(fullPath, 'utf-8');
157
- }
158
- catch {
159
- // File might not exist if running outside react-spa-scaffold
160
- return `// File not found: ${configPath}\n// Run MCP server from within react-spa-scaffold repository`;
161
- }
162
- }
163
- /**
164
- * Generate setup commands based on selected features
165
- */
166
- export function getSetupCommands(featureIds) {
167
- const commands = ['npm install'];
168
- if (featureIds.includes('devtools')) {
169
- commands.push('npm run prepare'); // Initialize husky
170
- }
171
- if (featureIds.includes('testing')) {
172
- commands.push('npx playwright install chromium'); // Install Playwright browser
173
- }
174
- if (featureIds.includes('i18n')) {
175
- commands.push('npm run i18n:extract'); // Extract initial translations
176
- }
177
- return commands;
178
- }
179
- /**
180
- * Generate CLAUDE.md content based on selected features
181
- */
182
- export function generateClaudeMd(featureIds, projectName, scripts) {
183
- const sections = [];
184
- // Header
185
- sections.push(`# CLAUDE.md
186
-
187
- AI assistant guidance for **${projectName}** - a React 19 + TypeScript + Vite 7 codebase.`);
188
- // Commands section - based on actual scripts
189
- const commandLines = [];
190
- const scriptDescriptions = {
191
- dev: 'Dev server at localhost:5173',
192
- build: 'Production build (typecheck + bundle)',
193
- preview: 'Preview production build',
194
- typecheck: 'TypeScript only',
195
- lint: 'ESLint check',
196
- 'lint:fix': 'ESLint auto-fix',
197
- format: 'Prettier format',
198
- 'format:check': 'Prettier check',
199
- test: 'Vitest once',
200
- 'test:watch': 'Vitest watch mode',
201
- 'test:coverage': 'Coverage (80% threshold)',
202
- e2e: 'Playwright E2E',
203
- 'e2e:ui': 'Playwright UI mode',
204
- 'i18n:extract': 'Extract translations to .po',
205
- prepare: 'Initialize Husky hooks',
206
- };
207
- for (const script of Object.keys(scripts).sort()) {
208
- const desc = scriptDescriptions[script] || '';
209
- const padding = ' '.repeat(Math.max(1, 20 - script.length));
210
- commandLines.push(`npm run ${script}${padding}# ${desc}`);
211
- }
212
- sections.push(`
213
- ## Commands
214
-
215
- \`\`\`bash
216
- ${commandLines.join('\n')}
217
- \`\`\``);
218
- // Project Structure - dynamic based on features
219
- const structureParts = ['src/', '├── components/ # ui/ (primitives), layout/, shared/ (features)'];
220
- if (featureIds.includes('api') || featureIds.includes('i18n') || featureIds.includes('mobile')) {
221
- structureParts.push('├── contexts/ # React Context providers');
222
- }
223
- structureParts.push('├── hooks/ # Custom hooks');
224
- structureParts.push('├── lib/ # config, utils, format' +
225
- (featureIds.includes('api') ? ', api' : '') +
226
- (featureIds.includes('routing') ? ', routes' : '') +
227
- (featureIds.includes('state') ? ', storage' : ''));
228
- if (featureIds.includes('routing')) {
229
- structureParts.push('├── pages/ # Lazy-loaded route components');
230
- }
231
- if (featureIds.includes('state')) {
232
- structureParts.push('├── stores/ # Zustand stores');
233
- }
234
- if (featureIds.includes('i18n')) {
235
- structureParts.push('├── i18n/ # LinguiJS config and catalogs');
236
- structureParts.push('├── locales/ # Translation files (.po)');
237
- }
238
- structureParts.push('└── types/ # TypeScript definitions');
239
- if (featureIds.includes('testing')) {
240
- structureParts.push('');
241
- structureParts.push('# Unit tests co-located: *.test.ts/tsx next to source');
242
- structureParts.push('e2e/tests/ # Playwright functional E2E tests');
243
- if (featureIds.includes('performance')) {
244
- structureParts.push('e2e/performance/ # Performance regression tests');
245
- }
246
- }
247
- sections.push(`
248
- ## Project Structure
249
-
250
- See [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) for full structure and data flow.
251
-
252
- \`\`\`
253
- ${structureParts.join('\n')}
254
- \`\`\``);
255
- // Code Patterns - always included
256
- const stateHierarchy = [];
257
- if (featureIds.includes('state'))
258
- stateHierarchy.push('Zustand (persisted)');
259
- if (featureIds.includes('api'))
260
- stateHierarchy.push('TanStack Query (server)');
261
- stateHierarchy.push('Context (UI)', 'useState (local)');
262
- sections.push(`
263
- ## Code Patterns
264
-
265
- **Imports**: Always use \`@/\` path alias
266
-
267
- **Components**: Named exports + \`Props\` interface. Pages use default exports for lazy loading.
268
-
269
- **TypeScript**: \`type\` for unions, \`interface\` for objects
270
-
271
- **State hierarchy**: ${stateHierarchy.join(' → ')}
272
-
273
- See [docs/CODING_STANDARDS.md](docs/CODING_STANDARDS.md) and [docs/COMPONENT_GUIDELINES.md](docs/COMPONENT_GUIDELINES.md).`);
274
- // UI Components section - only if ui feature
275
- if (featureIds.includes('ui')) {
276
- sections.push(`
277
- ## UI Components (Shadcn/UI)
278
-
279
- This project uses **Shadcn/UI** with radix-nova style. Components live in \`src/components/ui/\`.
280
-
281
- ### Adding New Components
282
-
283
- \`\`\`bash
284
- npx shadcn@latest add button # Single component
285
- npx shadcn@latest add dialog card input # Multiple components
286
- \`\`\`
287
-
288
- **Pattern**: Import directly (no barrel exports for UI):
289
-
290
- \`\`\`tsx
291
- import { Button } from '@/components/ui/button';
292
- import { cn } from '@/lib/utils';
293
- \`\`\``);
294
- }
295
- // Mobile section - only if mobile feature
296
- if (featureIds.includes('mobile')) {
297
- sections.push(`
298
- ## Mobile & Responsive Design
299
-
300
- This project includes mobile-first responsive utilities.
301
-
302
- ### Viewport Detection
303
-
304
- \`\`\`tsx
305
- import { MobileProvider, useMobileContext } from '@/contexts/mobileContext';
306
-
307
- // Wrap app with MobileProvider
308
- <MobileProvider>{children}</MobileProvider>
309
-
310
- // Use in components
311
- const { isMobile, isTablet, isDesktop, width } = useMobileContext();
312
- \`\`\`
313
-
314
- ### Breakpoints
315
-
316
- \`\`\`tsx
317
- import { BREAKPOINTS, useIsMobile, useIsDesktop } from '@/hooks/useMediaQuery';
318
-
319
- // BREAKPOINTS: sm (640), md (768), lg (1024), xl (1280)
320
- const isMobile = useIsMobile(); // width < 768px
321
- const isDesktop = useIsDesktop(); // width >= 1024px
322
- \`\`\`
323
-
324
- ### Touch-Aware Sizing
325
-
326
- \`\`\`tsx
327
- import { useTouchSizes } from '@/hooks/useTouchSizes';
328
-
329
- const sizes = useTouchSizes();
330
- <Button size={sizes.button}>Click</Button> // 'touch' on mobile, 'default' on desktop
331
- \`\`\``);
332
- }
333
- // Theming section - only if theming feature
334
- if (featureIds.includes('theming')) {
335
- sections.push(`
336
- ## Theming
337
-
338
- Light/dark/system theme support with Zustand persistence.
339
-
340
- ### Usage
341
-
342
- \`\`\`tsx
343
- import { usePreferencesStore } from '@/stores/preferencesStore';
344
-
345
- // Get current theme
346
- const theme = usePreferencesStore((s) => s.theme);
347
-
348
- // Toggle theme
349
- const toggleTheme = usePreferencesStore((s) => s.toggleTheme);
350
-
351
- // Get resolved theme (actual light/dark value when 'system')
352
- const getResolvedTheme = usePreferencesStore((s) => s.getResolvedTheme);
353
- \`\`\`
354
-
355
- The \`useThemeEffect\` hook automatically applies the \`.dark\` class to the document.
356
- The ThemeToggle component provides a UI for switching between light, dark, and system themes.`);
357
- }
358
- // MCP Servers section - always helpful
359
- sections.push(`
360
- ## MCP Servers (PREFER OVER WebSearch)
361
-
362
- Use MCP servers for documentation lookup. They provide **structured, version-accurate data** directly from source.`);
363
- if (featureIds.includes('ui')) {
364
- sections.push(`
365
- ### Shadcn MCP (UI Components)
366
-
367
- | Need | Tool |
368
- | ------------------- | ------------------------------------------------ |
369
- | Find component | \`mcp__shadcn__search_items_in_registries\` |
370
- | View component code | \`mcp__shadcn__view_items_in_registries\` |
371
- | Usage examples | \`mcp__shadcn__get_item_examples_from_registries\` |
372
- | CLI add command | \`mcp__shadcn__get_add_command_for_items\` |`);
373
- }
374
- sections.push(`
375
- ### Context7 MCP (All Libraries)
376
-
377
- Use for **any npm package** documentation:
378
-
379
- \`\`\`
380
- resolve-library-id → get-library-docs
381
- \`\`\`
382
-
383
- **Examples**: react-hook-form, @tanstack/react-query, zustand, zod, date-fns
384
-
385
- ### Decision Flow
386
-
387
- \`\`\`
388
- Need UI component? → Shadcn MCP
389
- Need library docs? → Context7 MCP (any npm package)
390
- Need general info? → WebSearch (fallback only)
391
- \`\`\``);
392
- // Translations section - only if i18n feature
393
- if (featureIds.includes('i18n')) {
394
- sections.push(`
395
- ## Translations (CRITICAL)
396
-
397
- All user-facing text MUST have translator comments. ESLint enforces this.
398
-
399
- \`\`\`tsx
400
- <Trans comment="Dashboard heading">Welcome back</Trans>
401
- t({ message: 'Close', comment: 'Close button' })
402
- \`\`\`
403
-
404
- See [docs/INTERNATIONALIZATION.md](docs/INTERNATIONALIZATION.md).`);
405
- }
406
- // Testing section - only if testing feature
407
- if (featureIds.includes('testing')) {
408
- sections.push(`
409
- ## Testing
410
-
411
- See [docs/TESTING.md](docs/TESTING.md) and [docs/E2E_TESTING.md](docs/E2E_TESTING.md).
412
-
413
- Unit tests are **co-located** with source files (\`*.test.ts/tsx\`). 80% coverage required.
414
-
415
- \`\`\`typescript
416
- import { describe, it, expect, vi } from 'vitest';
417
- import { screen, renderHook } from '@testing-library/react';
418
- import { render, mockMatchMedia, server } from '@/test';
419
- \`\`\`
420
-
421
- MSW handlers auto-reset after each test.`);
422
- }
423
- // Common Gotchas - filtered by features
424
- const gotchas = [];
425
- if (featureIds.includes('devtools')) {
426
- gotchas.push('**Node.js >= 22.0.0** required (check `.nvmrc`)');
427
- gotchas.push('**Conventional commits** enforced by commitlint');
428
- }
429
- if (featureIds.includes('mobile')) {
430
- gotchas.push('**Context hooks throw** outside provider (e.g., `useMobileContext()`)');
431
- }
432
- gotchas.push('**Barrel exports** in each directory via `index.ts`');
433
- if (featureIds.includes('ui')) {
434
- gotchas.push('**UI components** import directly: `@/components/ui/button` (no barrel)');
435
- }
436
- sections.push(`
437
- ## Common Gotchas
438
-
439
- ${gotchas.map((g, i) => `${i + 1}. ${g}`).join('\n')}
440
- `);
441
- return sections.join('\n');
442
- }
443
- /**
444
- * Generate vite-env.d.ts content based on selected features
445
- */
446
- export function generateViteEnvDts(featureIds) {
447
- const sections = [];
448
- // Add .po module declaration if i18n feature is selected (LinguiJS uses .po files)
449
- if (featureIds.includes('i18n')) {
450
- sections.push(`declare module '*.po' {
451
- import type { Messages } from '@lingui/core';
452
- export const messages: Messages;
453
- }`);
454
- }
455
- // Build env vars section
456
- const envVars = [];
457
- // Core env vars (always included)
458
- envVars.push(' readonly VITE_APP_NAME: string;');
459
- envVars.push(' readonly VITE_APP_URL: string;');
460
- // API feature env vars
461
- if (featureIds.includes('api')) {
462
- envVars.push(' readonly VITE_API_URL: string;');
463
- }
464
- // Observability feature env vars
465
- if (featureIds.includes('observability')) {
466
- envVars.push(' readonly VITE_SENTRY_DSN: string;');
467
- envVars.push(' readonly VITE_SENTRY_ENABLED: string;');
468
- }
469
- sections.push(`/// <reference types="vite/client" />
470
-
471
- interface ImportMetaEnv {
472
- ${envVars.join('\n')}
473
- }
474
-
475
- interface ImportMeta {
476
- readonly env: ImportMetaEnv;
477
- }`);
478
- return sections.join('\n\n') + '\n';
479
- }
480
- /**
481
- * Generate env.ts content based on selected features
482
- */
483
- export function generateEnvTs(featureIds) {
484
- const schemaFields = [];
485
- const envFields = [];
486
- // Core env vars (always included)
487
- schemaFields.push(' VITE_APP_NAME: z.string().min(1).optional(),');
488
- schemaFields.push(' VITE_APP_URL: z.string().url().optional(),');
489
- envFields.push(' VITE_APP_NAME: import.meta.env.VITE_APP_NAME,');
490
- envFields.push(' VITE_APP_URL: import.meta.env.VITE_APP_URL,');
491
- // API feature env vars
492
- if (featureIds.includes('api')) {
493
- schemaFields.push(' VITE_API_URL: z.string().url().optional(),');
494
- envFields.push(' VITE_API_URL: import.meta.env.VITE_API_URL,');
495
- }
496
- // Observability feature env vars
497
- if (featureIds.includes('observability')) {
498
- schemaFields.push(' VITE_SENTRY_DSN: z.string().url().optional(),');
499
- schemaFields.push(' VITE_SENTRY_ENABLED: z.string().optional(),');
500
- envFields.push(' VITE_SENTRY_DSN: import.meta.env.VITE_SENTRY_DSN,');
501
- envFields.push(' VITE_SENTRY_ENABLED: import.meta.env.VITE_SENTRY_ENABLED,');
502
- }
503
- // Vite built-in env vars (always included)
504
- schemaFields.push(" MODE: z.enum(['development', 'production', 'test']).default('development'),");
505
- schemaFields.push(' DEV: z.boolean().default(false),');
506
- schemaFields.push(' PROD: z.boolean().default(false),');
507
- envFields.push(' MODE: import.meta.env.MODE,');
508
- envFields.push(' DEV: import.meta.env.DEV,');
509
- envFields.push(' PROD: import.meta.env.PROD,');
510
- return `/**
511
- * Environment variable validation using Zod.
512
- * Validates at runtime to catch missing/invalid env vars early.
513
- */
514
-
515
- import { z } from 'zod';
516
-
517
- const envSchema = z.object({
518
- ${schemaFields.join('\n')}
519
- });
520
-
521
- export type Env = z.infer<typeof envSchema>;
522
-
523
- /**
524
- * Validate environment variables and return typed env object.
525
- * Throws if validation fails in production.
526
- */
527
- export function validateEnv(): Env {
528
- const env = {
529
- ${envFields.join('\n')}
530
- };
531
-
532
- const result = envSchema.safeParse(env);
533
-
534
- if (!result.success) {
535
- const errors = result.error.format();
536
- console.error('Environment validation failed:', errors);
537
-
538
- if (import.meta.env.PROD) {
539
- throw new Error('Invalid environment configuration');
540
- }
541
- }
542
-
543
- return result.data
544
- }
545
-
546
- /**
547
- * Validated environment variables.
548
- * Access this instead of import.meta.env for type safety.
549
- */
550
- export const env = validateEnv();
551
- `;
552
- }
553
- /**
554
- * Generate routes.ts content based on selected features
555
- */
556
- export function generateRoutesTs(_featureIds) {
557
- const routes = [];
558
- // Core routes (always included when routing feature is selected)
559
- routes.push(" HOME: '/',");
560
- // Not found route (always last)
561
- routes.push(" NOT_FOUND: '*',");
562
- // Note: Additional routes can be added here based on features
563
- // For now, all demo content displays on HomePage directly
564
- return `/**
565
- * Typed route constants.
566
- * Use these instead of hardcoded strings for type-safe navigation.
567
- */
568
-
569
- export const ROUTES = {
570
- ${routes.join('\n')}
571
- } as const;
572
-
573
- export type AppRoute = (typeof ROUTES)[keyof typeof ROUTES];
574
- `;
575
- }
576
- /**
577
- * Read and parse the source package.json
578
- */
579
- async function readSourcePackageJson() {
580
- const path = resolveTemplatePath('package.json');
581
- const content = await readFile(path, 'utf-8');
582
- return JSON.parse(content);
583
- }
584
- /**
585
- * Compute complete scaffold for selected features
586
- */
587
- export async function computeScaffold(selectedFeatures, projectName = 'my-app') {
588
- // Resolve all dependencies
589
- const resolvedFeatures = resolveFeatureDependencies(selectedFeatures);
590
- // Read engines from source package.json
591
- const sourcePackageJson = await readSourcePackageJson();
592
- const engines = sourcePackageJson.engines || {};
593
- // Merge all dependencies (async to read versions from source package.json)
594
- const { dependencies, devDependencies } = await mergeDependencies(resolvedFeatures);
595
- // Merge all scripts
596
- const scripts = mergeScripts(resolvedFeatures);
597
- // Get file structure (add CLAUDE.md which is generated, not from patterns)
598
- // Also add docs based on selected features
599
- const docPaths = computeDocsForFeatures(resolvedFeatures);
600
- const structure = [...computeFileStructure(resolvedFeatures), 'CLAUDE.md', ...docPaths];
601
- // Get config files with actual content read from templates
602
- const configFiles = {};
603
- const configPaths = getConfigFiles(resolvedFeatures);
604
- for (const config of configPaths) {
605
- configFiles[config] = await readConfigFileContent(config);
606
- }
607
- // Get setup commands
608
- const setupCommands = getSetupCommands(resolvedFeatures);
609
- // Generate CLAUDE.md content
610
- const claudeMd = generateClaudeMd(resolvedFeatures, projectName, scripts);
611
- // Generate vite-env.d.ts content
612
- const viteEnvDts = generateViteEnvDts(resolvedFeatures);
613
- // Generate env.ts content
614
- const envTs = generateEnvTs(resolvedFeatures);
615
- // Generate routes.ts content (only if routing feature is selected)
616
- const routesTs = resolvedFeatures.includes('routing') ? generateRoutesTs(resolvedFeatures) : undefined;
617
- // Get docs with content filtered by features
618
- const docs = await computeDocsContent(resolvedFeatures);
619
- return {
620
- packageJson: {
621
- name: projectName,
622
- dependencies,
623
- devDependencies,
624
- scripts,
625
- engines,
626
- },
627
- structure,
628
- configFiles,
629
- setupCommands,
630
- claudeMd,
631
- viteEnvDts,
632
- envTs,
633
- routesTs,
634
- docs,
635
- };
636
- }
637
- //# sourceMappingURL=scaffold.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../../src/utils/scaffold.ts"],"names":[],"mappings":"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"}