@tpitre/story-ui 2.1.5 → 2.3.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 (203) hide show
  1. package/.env.sample +82 -11
  2. package/README.md +130 -4
  3. package/dist/cli/deploy.d.ts +17 -0
  4. package/dist/cli/deploy.d.ts.map +1 -0
  5. package/dist/cli/deploy.js +696 -0
  6. package/dist/cli/index.d.ts +3 -0
  7. package/dist/cli/index.d.ts.map +1 -0
  8. package/dist/cli/index.js +55 -2
  9. package/dist/cli/setup.d.ts +11 -0
  10. package/dist/cli/setup.d.ts.map +1 -0
  11. package/dist/cli/setup.js +437 -110
  12. package/dist/mcp-server/index.d.ts +2 -0
  13. package/dist/mcp-server/index.d.ts.map +1 -0
  14. package/dist/mcp-server/index.js +138 -6
  15. package/dist/mcp-server/mcp-stdio-server.d.ts +3 -0
  16. package/dist/mcp-server/mcp-stdio-server.d.ts.map +1 -0
  17. package/dist/mcp-server/mcp-stdio-server.js +638 -0
  18. package/dist/mcp-server/routes/claude.d.ts +3 -0
  19. package/dist/mcp-server/routes/claude.d.ts.map +1 -0
  20. package/dist/mcp-server/routes/claude.js +60 -23
  21. package/dist/mcp-server/routes/components.d.ts +4 -0
  22. package/dist/mcp-server/routes/components.d.ts.map +1 -0
  23. package/dist/mcp-server/routes/frameworks.d.ts +38 -0
  24. package/dist/mcp-server/routes/frameworks.d.ts.map +1 -0
  25. package/dist/mcp-server/routes/frameworks.js +183 -0
  26. package/dist/mcp-server/routes/generateStory.d.ts +3 -0
  27. package/dist/mcp-server/routes/generateStory.d.ts.map +1 -0
  28. package/dist/mcp-server/routes/generateStory.js +274 -115
  29. package/dist/mcp-server/routes/generateStoryStream.d.ts +12 -0
  30. package/dist/mcp-server/routes/generateStoryStream.d.ts.map +1 -0
  31. package/dist/mcp-server/routes/generateStoryStream.js +947 -0
  32. package/dist/mcp-server/routes/hybridStories.d.ts +18 -0
  33. package/dist/mcp-server/routes/hybridStories.d.ts.map +1 -0
  34. package/dist/mcp-server/routes/hybridStories.js +214 -0
  35. package/dist/mcp-server/routes/mcpRemote.d.ts +14 -0
  36. package/dist/mcp-server/routes/mcpRemote.d.ts.map +1 -0
  37. package/dist/mcp-server/routes/mcpRemote.js +489 -0
  38. package/dist/mcp-server/routes/memoryStories.d.ts +26 -0
  39. package/dist/mcp-server/routes/memoryStories.d.ts.map +1 -0
  40. package/dist/mcp-server/routes/memoryStories.js +13 -7
  41. package/dist/mcp-server/routes/providers.d.ts +89 -0
  42. package/dist/mcp-server/routes/providers.d.ts.map +1 -0
  43. package/dist/mcp-server/routes/providers.js +369 -0
  44. package/dist/mcp-server/routes/storySync.d.ts +26 -0
  45. package/dist/mcp-server/routes/storySync.d.ts.map +1 -0
  46. package/dist/mcp-server/routes/streamTypes.d.ts +110 -0
  47. package/dist/mcp-server/routes/streamTypes.d.ts.map +1 -0
  48. package/dist/mcp-server/routes/streamTypes.js +18 -0
  49. package/dist/mcp-server/sessionManager.d.ts +50 -0
  50. package/dist/mcp-server/sessionManager.d.ts.map +1 -0
  51. package/dist/mcp-server/sessionManager.js +125 -0
  52. package/dist/story-generator/componentBlacklist.d.ts +21 -0
  53. package/dist/story-generator/componentBlacklist.d.ts.map +1 -0
  54. package/dist/story-generator/componentBlacklist.js +4 -0
  55. package/dist/story-generator/componentDiscovery.d.ts +28 -0
  56. package/dist/story-generator/componentDiscovery.d.ts.map +1 -0
  57. package/dist/story-generator/componentRegistryGenerator.d.ts +49 -0
  58. package/dist/story-generator/componentRegistryGenerator.d.ts.map +1 -0
  59. package/dist/story-generator/componentRegistryGenerator.js +205 -0
  60. package/dist/story-generator/configLoader.d.ts +33 -0
  61. package/dist/story-generator/configLoader.d.ts.map +1 -0
  62. package/dist/story-generator/configLoader.js +8 -1
  63. package/dist/story-generator/considerationsLoader.d.ts +32 -0
  64. package/dist/story-generator/considerationsLoader.d.ts.map +1 -0
  65. package/dist/story-generator/considerationsLoader.js +2 -1
  66. package/dist/story-generator/documentation-sources.d.ts +28 -0
  67. package/dist/story-generator/documentation-sources.d.ts.map +1 -0
  68. package/dist/story-generator/documentationLoader.d.ts +64 -0
  69. package/dist/story-generator/documentationLoader.d.ts.map +1 -0
  70. package/dist/story-generator/documentationLoader.js +4 -3
  71. package/dist/story-generator/dynamicPackageDiscovery.d.ts +97 -0
  72. package/dist/story-generator/dynamicPackageDiscovery.d.ts.map +1 -0
  73. package/dist/story-generator/dynamicPackageDiscovery.js +31 -22
  74. package/dist/story-generator/enhancedComponentDiscovery.d.ts +125 -0
  75. package/dist/story-generator/enhancedComponentDiscovery.d.ts.map +1 -0
  76. package/dist/story-generator/enhancedComponentDiscovery.js +162 -21
  77. package/dist/story-generator/framework-adapters/angular-adapter.d.ts +40 -0
  78. package/dist/story-generator/framework-adapters/angular-adapter.d.ts.map +1 -0
  79. package/dist/story-generator/framework-adapters/angular-adapter.js +427 -0
  80. package/dist/story-generator/framework-adapters/base-adapter.d.ts +75 -0
  81. package/dist/story-generator/framework-adapters/base-adapter.d.ts.map +1 -0
  82. package/dist/story-generator/framework-adapters/base-adapter.js +147 -0
  83. package/dist/story-generator/framework-adapters/framework-detector.d.ts +55 -0
  84. package/dist/story-generator/framework-adapters/framework-detector.d.ts.map +1 -0
  85. package/dist/story-generator/framework-adapters/framework-detector.js +323 -0
  86. package/dist/story-generator/framework-adapters/index.d.ts +97 -0
  87. package/dist/story-generator/framework-adapters/index.d.ts.map +1 -0
  88. package/dist/story-generator/framework-adapters/index.js +198 -0
  89. package/dist/story-generator/framework-adapters/react-adapter.d.ts +40 -0
  90. package/dist/story-generator/framework-adapters/react-adapter.d.ts.map +1 -0
  91. package/dist/story-generator/framework-adapters/react-adapter.js +316 -0
  92. package/dist/story-generator/framework-adapters/svelte-adapter.d.ts +40 -0
  93. package/dist/story-generator/framework-adapters/svelte-adapter.d.ts.map +1 -0
  94. package/dist/story-generator/framework-adapters/svelte-adapter.js +372 -0
  95. package/dist/story-generator/framework-adapters/types.d.ts +182 -0
  96. package/dist/story-generator/framework-adapters/types.d.ts.map +1 -0
  97. package/dist/story-generator/framework-adapters/types.js +8 -0
  98. package/dist/story-generator/framework-adapters/vue-adapter.d.ts +36 -0
  99. package/dist/story-generator/framework-adapters/vue-adapter.d.ts.map +1 -0
  100. package/dist/story-generator/framework-adapters/vue-adapter.js +336 -0
  101. package/dist/story-generator/framework-adapters/web-components-adapter.d.ts +54 -0
  102. package/dist/story-generator/framework-adapters/web-components-adapter.d.ts.map +1 -0
  103. package/dist/story-generator/framework-adapters/web-components-adapter.js +387 -0
  104. package/dist/story-generator/generateStory.d.ts +7 -0
  105. package/dist/story-generator/generateStory.d.ts.map +1 -0
  106. package/dist/story-generator/gitignoreManager.d.ts +50 -0
  107. package/dist/story-generator/gitignoreManager.d.ts.map +1 -0
  108. package/dist/story-generator/gitignoreManager.js +7 -6
  109. package/dist/story-generator/imageProcessor.d.ts +80 -0
  110. package/dist/story-generator/imageProcessor.d.ts.map +1 -0
  111. package/dist/story-generator/imageProcessor.js +391 -0
  112. package/dist/story-generator/inMemoryStoryService.d.ts +89 -0
  113. package/dist/story-generator/inMemoryStoryService.d.ts.map +1 -0
  114. package/dist/story-generator/llm-providers/base-provider.d.ts +36 -0
  115. package/dist/story-generator/llm-providers/base-provider.d.ts.map +1 -0
  116. package/dist/story-generator/llm-providers/base-provider.js +135 -0
  117. package/dist/story-generator/llm-providers/claude-provider.d.ts +23 -0
  118. package/dist/story-generator/llm-providers/claude-provider.d.ts.map +1 -0
  119. package/dist/story-generator/llm-providers/claude-provider.js +414 -0
  120. package/dist/story-generator/llm-providers/gemini-provider.d.ts +24 -0
  121. package/dist/story-generator/llm-providers/gemini-provider.d.ts.map +1 -0
  122. package/dist/story-generator/llm-providers/gemini-provider.js +406 -0
  123. package/dist/story-generator/llm-providers/index.d.ts +63 -0
  124. package/dist/story-generator/llm-providers/index.d.ts.map +1 -0
  125. package/dist/story-generator/llm-providers/index.js +169 -0
  126. package/dist/story-generator/llm-providers/openai-provider.d.ts +24 -0
  127. package/dist/story-generator/llm-providers/openai-provider.d.ts.map +1 -0
  128. package/dist/story-generator/llm-providers/openai-provider.js +458 -0
  129. package/dist/story-generator/llm-providers/settings-manager.d.ts +75 -0
  130. package/dist/story-generator/llm-providers/settings-manager.d.ts.map +1 -0
  131. package/dist/story-generator/llm-providers/settings-manager.js +173 -0
  132. package/dist/story-generator/llm-providers/story-llm-service.d.ts +79 -0
  133. package/dist/story-generator/llm-providers/story-llm-service.d.ts.map +1 -0
  134. package/dist/story-generator/llm-providers/story-llm-service.js +240 -0
  135. package/dist/story-generator/llm-providers/types.d.ts +153 -0
  136. package/dist/story-generator/llm-providers/types.d.ts.map +1 -0
  137. package/dist/story-generator/llm-providers/types.js +8 -0
  138. package/dist/story-generator/logger.d.ts +14 -0
  139. package/dist/story-generator/logger.d.ts.map +1 -0
  140. package/dist/story-generator/logger.js +119 -0
  141. package/dist/story-generator/postProcessStory.d.ts +6 -0
  142. package/dist/story-generator/postProcessStory.d.ts.map +1 -0
  143. package/dist/story-generator/postProcessStory.js +8 -7
  144. package/dist/story-generator/productionGitignoreManager.d.ts +91 -0
  145. package/dist/story-generator/productionGitignoreManager.d.ts.map +1 -0
  146. package/dist/story-generator/productionGitignoreManager.js +11 -10
  147. package/dist/story-generator/promptGenerator.d.ts +48 -0
  148. package/dist/story-generator/promptGenerator.d.ts.map +1 -0
  149. package/dist/story-generator/promptGenerator.js +186 -1
  150. package/dist/story-generator/storyHistory.d.ts +44 -0
  151. package/dist/story-generator/storyHistory.d.ts.map +1 -0
  152. package/dist/story-generator/storySync.d.ts +68 -0
  153. package/dist/story-generator/storySync.d.ts.map +1 -0
  154. package/dist/story-generator/storyTracker.d.ts +48 -0
  155. package/dist/story-generator/storyTracker.d.ts.map +1 -0
  156. package/dist/story-generator/storyTracker.js +2 -1
  157. package/dist/story-generator/storyValidator.d.ts +6 -0
  158. package/dist/story-generator/storyValidator.d.ts.map +1 -0
  159. package/dist/story-generator/universalDesignSystemAdapter.d.ts +68 -0
  160. package/dist/story-generator/universalDesignSystemAdapter.d.ts.map +1 -0
  161. package/dist/story-generator/universalDesignSystemAdapter.js +141 -3
  162. package/dist/story-generator/urlRedirectService.d.ts +21 -0
  163. package/dist/story-generator/urlRedirectService.d.ts.map +1 -0
  164. package/dist/story-generator/urlRedirectService.js +140 -0
  165. package/dist/story-generator/validateStory.d.ts +19 -0
  166. package/dist/story-generator/validateStory.d.ts.map +1 -0
  167. package/dist/story-generator/validateStory.js +6 -2
  168. package/dist/story-generator/visionPrompts.d.ts +88 -0
  169. package/dist/story-generator/visionPrompts.d.ts.map +1 -0
  170. package/dist/story-generator/visionPrompts.js +462 -0
  171. package/dist/story-ui.config.d.ts +78 -0
  172. package/dist/story-ui.config.d.ts.map +1 -0
  173. package/dist/templates/StoryUI/StoryUIPanel.d.ts +4 -0
  174. package/dist/templates/StoryUI/StoryUIPanel.d.ts.map +1 -0
  175. package/dist/templates/StoryUI/StoryUIPanel.js +1874 -0
  176. package/dist/templates/StoryUI/StoryUIPanel.stories.d.ts +18 -0
  177. package/dist/templates/StoryUI/StoryUIPanel.stories.d.ts.map +1 -0
  178. package/dist/templates/StoryUI/StoryUIPanel.stories.js +37 -0
  179. package/dist/templates/StoryUI/index.d.ts +3 -0
  180. package/dist/templates/StoryUI/index.d.ts.map +1 -0
  181. package/dist/templates/StoryUI/index.js +2 -0
  182. package/package.json +35 -4
  183. package/templates/StoryUI/StoryUIPanel.tsx +1973 -388
  184. package/templates/StoryUI/index.tsx +1 -1
  185. package/templates/StoryUI/manager.tsx +264 -0
  186. package/templates/mcp-config-claude.json +11 -0
  187. package/templates/mcp-example.md +76 -0
  188. package/templates/production-app/.env.example +11 -0
  189. package/templates/production-app/index.html +66 -0
  190. package/templates/production-app/package.json +30 -0
  191. package/templates/production-app/public/favicon.svg +5 -0
  192. package/templates/production-app/src/App.tsx +1157 -0
  193. package/templates/production-app/src/LivePreviewRenderer.tsx +420 -0
  194. package/templates/production-app/src/componentRegistry.ts +315 -0
  195. package/templates/production-app/src/considerations.ts +16 -0
  196. package/templates/production-app/src/index.css +284 -0
  197. package/templates/production-app/src/main.tsx +25 -0
  198. package/templates/production-app/tsconfig.json +32 -0
  199. package/templates/production-app/tsconfig.node.json +11 -0
  200. package/templates/production-app/vite.config.ts +83 -0
  201. package/templates/react-import-rule.json +2 -2
  202. package/dist/index.js +0 -12
  203. package/dist/story-ui.config.loader.js +0 -205
@@ -0,0 +1 @@
1
+ {"version":3,"file":"framework-detector.d.ts","sourceRoot":"","sources":["../../../story-generator/framework-adapters/framework-detector.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,EACL,aAAa,EAGb,wBAAwB,EAEzB,MAAM,YAAY,CAAC;AAmGpB;;GAEG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,WAAW,CAAwC;IAC3D,OAAO,CAAC,YAAY,CAA8B;IAClD,OAAO,CAAC,mBAAmB,CAAgB;gBAE/B,WAAW,GAAE,MAAsB;IAI/C;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,wBAAwB,CAAC;IAkDjD;;OAEG;YACW,eAAe;IAwB7B;;OAEG;IACH,OAAO,CAAC,eAAe;IAqBvB;;OAEG;IACH,OAAO,CAAC,eAAe;IA2BvB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAoB3B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAwD1B;;OAEG;IACH,YAAY,CAAC,SAAS,EAAE,aAAa,GAAG,OAAO;CAchD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAGvF;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,iBAAiB,CAE5E"}
@@ -0,0 +1,323 @@
1
+ /**
2
+ * Framework Detection System
3
+ *
4
+ * Automatically detects the component framework and story framework
5
+ * used in a project by analyzing package.json, config files, and
6
+ * file patterns.
7
+ */
8
+ import fs from 'fs';
9
+ import path from 'path';
10
+ import { logger } from '../logger.js';
11
+ const FRAMEWORK_PATTERNS = [
12
+ // React
13
+ {
14
+ framework: 'react',
15
+ storyFramework: 'storybook-react',
16
+ packageIndicators: ['react', 'react-dom', '@storybook/react', '@storybook/react-vite', '@storybook/react-webpack5'],
17
+ configFiles: ['.storybook/main.js', '.storybook/main.ts', '.storybook/preview.js'],
18
+ filePatterns: ['*.jsx', '*.tsx', '*.stories.tsx', '*.stories.jsx'],
19
+ weight: 10,
20
+ },
21
+ // Vue 3
22
+ {
23
+ framework: 'vue',
24
+ storyFramework: 'storybook-vue3',
25
+ packageIndicators: ['vue', '@vue/runtime-core', '@storybook/vue3', '@storybook/vue3-vite'],
26
+ configFiles: ['vite.config.ts', 'vue.config.js', 'nuxt.config.ts'],
27
+ filePatterns: ['*.vue', '*.stories.ts'],
28
+ weight: 10,
29
+ },
30
+ // Angular
31
+ {
32
+ framework: 'angular',
33
+ storyFramework: 'storybook-angular',
34
+ packageIndicators: ['@angular/core', '@angular/common', '@storybook/angular'],
35
+ configFiles: ['angular.json', 'ng-package.json'],
36
+ filePatterns: ['*.component.ts', '*.stories.ts'],
37
+ weight: 10,
38
+ },
39
+ // Svelte
40
+ {
41
+ framework: 'svelte',
42
+ storyFramework: 'storybook-svelte',
43
+ packageIndicators: ['svelte', '@sveltejs/kit', '@storybook/svelte', '@storybook/svelte-vite'],
44
+ configFiles: ['svelte.config.js', 'svelte.config.ts'],
45
+ filePatterns: ['*.svelte', '*.stories.svelte'],
46
+ weight: 10,
47
+ },
48
+ // Web Components
49
+ {
50
+ framework: 'web-components',
51
+ storyFramework: 'storybook-web-components',
52
+ packageIndicators: ['lit', 'lit-element', 'lit-html', '@storybook/web-components', '@open-wc/testing'],
53
+ configFiles: ['web-dev-server.config.js', 'custom-elements.json'],
54
+ filePatterns: ['*.element.ts', '*.element.js'],
55
+ weight: 10,
56
+ },
57
+ // Solid
58
+ {
59
+ framework: 'solid',
60
+ storyFramework: 'storybook-react', // Uses React adapter with solid-js
61
+ packageIndicators: ['solid-js', '@solidjs/router'],
62
+ configFiles: ['vite.config.ts'],
63
+ filePatterns: ['*.tsx', '*.jsx'],
64
+ weight: 8,
65
+ },
66
+ // Qwik
67
+ {
68
+ framework: 'qwik',
69
+ storyFramework: 'custom',
70
+ packageIndicators: ['@builder.io/qwik', '@builder.io/qwik-city'],
71
+ configFiles: ['qwik.config.ts'],
72
+ filePatterns: ['*.tsx'],
73
+ weight: 8,
74
+ },
75
+ // Histoire (Vue alternative)
76
+ {
77
+ framework: 'vue',
78
+ storyFramework: 'histoire',
79
+ packageIndicators: ['histoire', '@histoire/plugin-vue'],
80
+ configFiles: ['histoire.config.ts', 'histoire.config.js'],
81
+ filePatterns: ['*.story.vue'],
82
+ weight: 12,
83
+ },
84
+ // Ladle (React alternative)
85
+ {
86
+ framework: 'react',
87
+ storyFramework: 'ladle',
88
+ packageIndicators: ['@ladle/react'],
89
+ configFiles: ['.ladle/config.mjs'],
90
+ filePatterns: ['*.stories.tsx'],
91
+ weight: 12,
92
+ },
93
+ ];
94
+ /**
95
+ * Framework Detector Class
96
+ */
97
+ export class FrameworkDetector {
98
+ constructor(projectRoot = process.cwd()) {
99
+ this.packageJson = null;
100
+ this.dependencies = {};
101
+ this.detectedConfigFiles = [];
102
+ this.projectRoot = projectRoot;
103
+ }
104
+ /**
105
+ * Detect frameworks used in the project
106
+ */
107
+ async detect() {
108
+ logger.debug('Starting framework detection', { projectRoot: this.projectRoot });
109
+ // Load package.json
110
+ await this.loadPackageJson();
111
+ // Scan for config files
112
+ this.scanConfigFiles();
113
+ // Score each framework pattern
114
+ const frameworkScores = this.scoreFrameworks();
115
+ // Sort by score descending
116
+ const sortedFrameworks = frameworkScores
117
+ .filter(f => f.score > 0)
118
+ .sort((a, b) => b.score - a.score);
119
+ // Convert to DetectedFramework objects
120
+ const detectedFrameworks = sortedFrameworks.map(f => ({
121
+ componentFramework: f.pattern.framework,
122
+ storyFramework: f.pattern.storyFramework,
123
+ version: this.getFrameworkVersion(f.pattern.framework),
124
+ config: this.getFrameworkConfig(f.pattern.framework),
125
+ confidence: Math.min(f.score / 30, 1), // Normalize to 0-1
126
+ }));
127
+ // Default to React if nothing detected
128
+ const defaultFramework = {
129
+ componentFramework: 'react',
130
+ storyFramework: 'storybook-react',
131
+ config: this.getFrameworkConfig('react'),
132
+ confidence: 0.5,
133
+ };
134
+ const primary = detectedFrameworks[0] || defaultFramework;
135
+ logger.info('Framework detection complete', {
136
+ primary: primary.componentFramework,
137
+ storyFramework: primary.storyFramework,
138
+ confidence: primary.confidence,
139
+ });
140
+ return {
141
+ frameworks: detectedFrameworks.length > 0 ? detectedFrameworks : [defaultFramework],
142
+ primary,
143
+ dependencies: this.dependencies,
144
+ configFiles: this.detectedConfigFiles,
145
+ };
146
+ }
147
+ /**
148
+ * Load and parse package.json
149
+ */
150
+ async loadPackageJson() {
151
+ const packagePath = path.join(this.projectRoot, 'package.json');
152
+ try {
153
+ if (fs.existsSync(packagePath)) {
154
+ const content = fs.readFileSync(packagePath, 'utf-8');
155
+ this.packageJson = JSON.parse(content);
156
+ // Merge all dependencies
157
+ this.dependencies = {
158
+ ...(this.packageJson?.dependencies || {}),
159
+ ...(this.packageJson?.devDependencies || {}),
160
+ ...(this.packageJson?.peerDependencies || {}),
161
+ };
162
+ logger.debug('Loaded package.json', {
163
+ dependencyCount: Object.keys(this.dependencies).length,
164
+ });
165
+ }
166
+ }
167
+ catch (error) {
168
+ logger.warn('Failed to load package.json', { error });
169
+ }
170
+ }
171
+ /**
172
+ * Scan for framework configuration files
173
+ */
174
+ scanConfigFiles() {
175
+ const allConfigFiles = new Set();
176
+ for (const pattern of FRAMEWORK_PATTERNS) {
177
+ for (const configFile of pattern.configFiles) {
178
+ allConfigFiles.add(configFile);
179
+ }
180
+ }
181
+ for (const configFile of allConfigFiles) {
182
+ const fullPath = path.join(this.projectRoot, configFile);
183
+ if (fs.existsSync(fullPath)) {
184
+ this.detectedConfigFiles.push(configFile);
185
+ }
186
+ }
187
+ logger.debug('Config files detected', {
188
+ configFiles: this.detectedConfigFiles,
189
+ });
190
+ }
191
+ /**
192
+ * Score each framework pattern based on evidence
193
+ */
194
+ scoreFrameworks() {
195
+ return FRAMEWORK_PATTERNS.map(pattern => {
196
+ let score = 0;
197
+ // Check package indicators
198
+ for (const pkg of pattern.packageIndicators) {
199
+ if (this.dependencies[pkg]) {
200
+ score += pattern.weight;
201
+ // Extra weight for Storybook packages
202
+ if (pkg.startsWith('@storybook/')) {
203
+ score += 5;
204
+ }
205
+ }
206
+ }
207
+ // Check config files
208
+ for (const configFile of pattern.configFiles) {
209
+ if (this.detectedConfigFiles.includes(configFile)) {
210
+ score += pattern.weight / 2;
211
+ }
212
+ }
213
+ return { pattern, score };
214
+ });
215
+ }
216
+ /**
217
+ * Get framework version from dependencies
218
+ */
219
+ getFrameworkVersion(framework) {
220
+ const versionMap = {
221
+ 'react': ['react'],
222
+ 'vue': ['vue'],
223
+ 'angular': ['@angular/core'],
224
+ 'svelte': ['svelte'],
225
+ 'web-components': ['lit', 'lit-element'],
226
+ 'solid': ['solid-js'],
227
+ 'qwik': ['@builder.io/qwik'],
228
+ };
229
+ const packages = versionMap[framework] || [];
230
+ for (const pkg of packages) {
231
+ if (this.dependencies[pkg]) {
232
+ return this.dependencies[pkg].replace(/[\^~]/, '');
233
+ }
234
+ }
235
+ return undefined;
236
+ }
237
+ /**
238
+ * Get framework-specific configuration
239
+ */
240
+ getFrameworkConfig(framework) {
241
+ const configs = {
242
+ 'react': {
243
+ importStyle: 'named',
244
+ storyExtension: '.stories.tsx',
245
+ typescript: true,
246
+ jsx: true,
247
+ componentExtension: '.tsx',
248
+ },
249
+ 'vue': {
250
+ importStyle: 'default',
251
+ storyExtension: '.stories.ts',
252
+ typescript: true,
253
+ jsx: false,
254
+ componentExtension: '.vue',
255
+ },
256
+ 'angular': {
257
+ importStyle: 'named',
258
+ storyExtension: '.stories.ts',
259
+ typescript: true,
260
+ jsx: false,
261
+ componentExtension: '.component.ts',
262
+ },
263
+ 'svelte': {
264
+ importStyle: 'default',
265
+ storyExtension: '.stories.svelte',
266
+ typescript: true,
267
+ jsx: false,
268
+ componentExtension: '.svelte',
269
+ },
270
+ 'web-components': {
271
+ importStyle: 'named',
272
+ storyExtension: '.stories.ts',
273
+ typescript: true,
274
+ jsx: false,
275
+ componentExtension: '.ts',
276
+ },
277
+ 'solid': {
278
+ importStyle: 'named',
279
+ storyExtension: '.stories.tsx',
280
+ typescript: true,
281
+ jsx: true,
282
+ componentExtension: '.tsx',
283
+ },
284
+ 'qwik': {
285
+ importStyle: 'named',
286
+ storyExtension: '.stories.tsx',
287
+ typescript: true,
288
+ jsx: true,
289
+ componentExtension: '.tsx',
290
+ },
291
+ };
292
+ return configs[framework] || configs['react'];
293
+ }
294
+ /**
295
+ * Quick check for a specific framework
296
+ */
297
+ hasFramework(framework) {
298
+ const packageMap = {
299
+ 'react': ['react', 'react-dom'],
300
+ 'vue': ['vue'],
301
+ 'angular': ['@angular/core'],
302
+ 'svelte': ['svelte'],
303
+ 'web-components': ['lit', 'lit-element', '@open-wc/testing'],
304
+ 'solid': ['solid-js'],
305
+ 'qwik': ['@builder.io/qwik'],
306
+ };
307
+ const packages = packageMap[framework] || [];
308
+ return packages.some(pkg => !!this.dependencies[pkg]);
309
+ }
310
+ }
311
+ /**
312
+ * Factory function for framework detection
313
+ */
314
+ export function detectFramework(projectRoot) {
315
+ const detector = new FrameworkDetector(projectRoot);
316
+ return detector.detect();
317
+ }
318
+ /**
319
+ * Get framework detector instance
320
+ */
321
+ export function getFrameworkDetector(projectRoot) {
322
+ return new FrameworkDetector(projectRoot);
323
+ }
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Framework Adapters Module
3
+ *
4
+ * Exports framework detection, adapters, and the adapter registry.
5
+ */
6
+ export * from './types.js';
7
+ export { FrameworkDetector, detectFramework, getFrameworkDetector, } from './framework-detector.js';
8
+ export { BaseFrameworkAdapter } from './base-adapter.js';
9
+ export { ReactAdapter, createReactAdapter } from './react-adapter.js';
10
+ export { WebComponentsAdapter, createWebComponentsAdapter } from './web-components-adapter.js';
11
+ export { VueAdapter, createVueAdapter } from './vue-adapter.js';
12
+ export { AngularAdapter, createAngularAdapter } from './angular-adapter.js';
13
+ export { SvelteAdapter, createSvelteAdapter } from './svelte-adapter.js';
14
+ import { FrameworkType, FrameworkAdapter, DetectedFramework, FrameworkPrompt, StoryGenerationOptions } from './types.js';
15
+ import { StoryUIConfig } from '../../story-ui.config.js';
16
+ import { DiscoveredComponent } from '../componentDiscovery.js';
17
+ /**
18
+ * Framework Adapter Registry
19
+ *
20
+ * Manages available framework adapters and provides
21
+ * automatic framework detection and adapter selection.
22
+ */
23
+ declare class AdapterRegistry {
24
+ private adapters;
25
+ private defaultAdapter;
26
+ private detectedFramework;
27
+ constructor();
28
+ /**
29
+ * Register built-in framework adapters
30
+ */
31
+ private registerBuiltInAdapters;
32
+ /**
33
+ * Register a framework adapter
34
+ */
35
+ register(adapter: FrameworkAdapter): void;
36
+ /**
37
+ * Get adapter by framework type
38
+ */
39
+ get(type: FrameworkType): FrameworkAdapter | undefined;
40
+ /**
41
+ * Get all registered adapters
42
+ */
43
+ getAll(): FrameworkAdapter[];
44
+ /**
45
+ * Get available framework types
46
+ */
47
+ getAvailableTypes(): FrameworkType[];
48
+ /**
49
+ * Get available framework types (alias for getAvailableTypes)
50
+ */
51
+ getAvailableFrameworks(): FrameworkType[];
52
+ /**
53
+ * Get adapter by framework type (alias for get with default fallback)
54
+ */
55
+ getAdapter(type: FrameworkType): FrameworkAdapter;
56
+ /**
57
+ * Get the default adapter
58
+ */
59
+ getDefault(): FrameworkAdapter;
60
+ /**
61
+ * Set the default adapter
62
+ */
63
+ setDefault(type: FrameworkType): void;
64
+ /**
65
+ * Auto-detect framework and return appropriate adapter
66
+ */
67
+ autoDetect(projectRoot?: string): Promise<FrameworkAdapter>;
68
+ /**
69
+ * Get the last detected framework info
70
+ */
71
+ getDetectedFramework(): DetectedFramework | null;
72
+ /**
73
+ * Generate prompt using the appropriate adapter
74
+ */
75
+ generatePrompt(config: StoryUIConfig, components: DiscoveredComponent[], options?: StoryGenerationOptions): Promise<FrameworkPrompt>;
76
+ }
77
+ /**
78
+ * Get the global adapter registry instance
79
+ */
80
+ export declare function getAdapterRegistry(): AdapterRegistry;
81
+ /**
82
+ * Get adapter for a specific framework
83
+ */
84
+ export declare function getAdapter(type: FrameworkType): FrameworkAdapter | undefined;
85
+ /**
86
+ * Get the default adapter
87
+ */
88
+ export declare function getDefaultAdapter(): FrameworkAdapter;
89
+ /**
90
+ * Auto-detect framework and get appropriate adapter
91
+ */
92
+ export declare function autoDetectAdapter(projectRoot?: string): Promise<FrameworkAdapter>;
93
+ /**
94
+ * Generate framework-specific prompt
95
+ */
96
+ export declare function generateFrameworkPrompt(config: StoryUIConfig, components: DiscoveredComponent[], options?: StoryGenerationOptions): Promise<FrameworkPrompt>;
97
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../story-generator/framework-adapters/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,cAAc,YAAY,CAAC;AAG3B,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,oBAAoB,GACrB,MAAM,yBAAyB,CAAC;AAGjC,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAGzD,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACtE,OAAO,EAAE,oBAAoB,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AAC/F,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5E,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAGzE,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EACf,sBAAsB,EACvB,MAAM,YAAY,CAAC;AAOpB,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAG/D;;;;;GAKG;AACH,cAAM,eAAe;IACnB,OAAO,CAAC,QAAQ,CAAmD;IACnE,OAAO,CAAC,cAAc,CAAmB;IACzC,OAAO,CAAC,iBAAiB,CAAkC;;IAU3D;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAY/B;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI;IAIzC;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,aAAa,GAAG,gBAAgB,GAAG,SAAS;IAItD;;OAEG;IACH,MAAM,IAAI,gBAAgB,EAAE;IAI5B;;OAEG;IACH,iBAAiB,IAAI,aAAa,EAAE;IAIpC;;OAEG;IACH,sBAAsB,IAAI,aAAa,EAAE;IAIzC;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,aAAa,GAAG,gBAAgB;IAIjD;;OAEG;IACH,UAAU,IAAI,gBAAgB;IAI9B;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;IAQrC;;OAEG;IACG,UAAU,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAoBjE;;OAEG;IACH,oBAAoB,IAAI,iBAAiB,GAAG,IAAI;IAIhD;;OAEG;IACG,cAAc,CAClB,MAAM,EAAE,aAAa,EACrB,UAAU,EAAE,mBAAmB,EAAE,EACjC,OAAO,CAAC,EAAE,sBAAsB,GAC/B,OAAO,CAAC,eAAe,CAAC;CA8B5B;AAKD;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,eAAe,CAKpD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,aAAa,GAAG,gBAAgB,GAAG,SAAS,CAE5E;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,gBAAgB,CAEpD;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAEvF;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,aAAa,EACrB,UAAU,EAAE,mBAAmB,EAAE,EACjC,OAAO,CAAC,EAAE,sBAAsB,GAC/B,OAAO,CAAC,eAAe,CAAC,CAE1B"}
@@ -0,0 +1,198 @@
1
+ /**
2
+ * Framework Adapters Module
3
+ *
4
+ * Exports framework detection, adapters, and the adapter registry.
5
+ */
6
+ // Types
7
+ export * from './types.js';
8
+ // Framework Detection
9
+ export { FrameworkDetector, detectFramework, getFrameworkDetector, } from './framework-detector.js';
10
+ // Base Adapter
11
+ export { BaseFrameworkAdapter } from './base-adapter.js';
12
+ // Framework Adapters
13
+ export { ReactAdapter, createReactAdapter } from './react-adapter.js';
14
+ export { WebComponentsAdapter, createWebComponentsAdapter } from './web-components-adapter.js';
15
+ export { VueAdapter, createVueAdapter } from './vue-adapter.js';
16
+ export { AngularAdapter, createAngularAdapter } from './angular-adapter.js';
17
+ export { SvelteAdapter, createSvelteAdapter } from './svelte-adapter.js';
18
+ import { ReactAdapter } from './react-adapter.js';
19
+ import { WebComponentsAdapter } from './web-components-adapter.js';
20
+ import { VueAdapter } from './vue-adapter.js';
21
+ import { AngularAdapter } from './angular-adapter.js';
22
+ import { SvelteAdapter } from './svelte-adapter.js';
23
+ import { detectFramework } from './framework-detector.js';
24
+ import { logger } from '../logger.js';
25
+ /**
26
+ * Framework Adapter Registry
27
+ *
28
+ * Manages available framework adapters and provides
29
+ * automatic framework detection and adapter selection.
30
+ */
31
+ class AdapterRegistry {
32
+ constructor() {
33
+ this.adapters = new Map();
34
+ this.detectedFramework = null;
35
+ // Register built-in adapters
36
+ this.registerBuiltInAdapters();
37
+ // Default to React
38
+ this.defaultAdapter = this.adapters.get('react');
39
+ }
40
+ /**
41
+ * Register built-in framework adapters
42
+ */
43
+ registerBuiltInAdapters() {
44
+ this.register(new ReactAdapter());
45
+ this.register(new WebComponentsAdapter());
46
+ this.register(new VueAdapter());
47
+ this.register(new AngularAdapter());
48
+ this.register(new SvelteAdapter());
49
+ logger.debug('Registered framework adapters', {
50
+ adapters: Array.from(this.adapters.keys()),
51
+ });
52
+ }
53
+ /**
54
+ * Register a framework adapter
55
+ */
56
+ register(adapter) {
57
+ this.adapters.set(adapter.type, adapter);
58
+ }
59
+ /**
60
+ * Get adapter by framework type
61
+ */
62
+ get(type) {
63
+ return this.adapters.get(type);
64
+ }
65
+ /**
66
+ * Get all registered adapters
67
+ */
68
+ getAll() {
69
+ return Array.from(this.adapters.values());
70
+ }
71
+ /**
72
+ * Get available framework types
73
+ */
74
+ getAvailableTypes() {
75
+ return Array.from(this.adapters.keys());
76
+ }
77
+ /**
78
+ * Get available framework types (alias for getAvailableTypes)
79
+ */
80
+ getAvailableFrameworks() {
81
+ return this.getAvailableTypes();
82
+ }
83
+ /**
84
+ * Get adapter by framework type (alias for get with default fallback)
85
+ */
86
+ getAdapter(type) {
87
+ return this.adapters.get(type) || this.defaultAdapter;
88
+ }
89
+ /**
90
+ * Get the default adapter
91
+ */
92
+ getDefault() {
93
+ return this.defaultAdapter;
94
+ }
95
+ /**
96
+ * Set the default adapter
97
+ */
98
+ setDefault(type) {
99
+ const adapter = this.adapters.get(type);
100
+ if (adapter) {
101
+ this.defaultAdapter = adapter;
102
+ logger.debug('Set default framework adapter', { type });
103
+ }
104
+ }
105
+ /**
106
+ * Auto-detect framework and return appropriate adapter
107
+ */
108
+ async autoDetect(projectRoot) {
109
+ const result = await detectFramework(projectRoot);
110
+ this.detectedFramework = result.primary;
111
+ const adapter = this.adapters.get(result.primary.componentFramework);
112
+ if (adapter) {
113
+ logger.info('Auto-detected framework', {
114
+ framework: result.primary.componentFramework,
115
+ confidence: result.primary.confidence,
116
+ });
117
+ return adapter;
118
+ }
119
+ logger.warn('No adapter for detected framework, using default', {
120
+ detected: result.primary.componentFramework,
121
+ using: this.defaultAdapter.type,
122
+ });
123
+ return this.defaultAdapter;
124
+ }
125
+ /**
126
+ * Get the last detected framework info
127
+ */
128
+ getDetectedFramework() {
129
+ return this.detectedFramework;
130
+ }
131
+ /**
132
+ * Generate prompt using the appropriate adapter
133
+ */
134
+ async generatePrompt(config, components, options) {
135
+ // Determine which adapter to use
136
+ let adapter;
137
+ if (options?.framework) {
138
+ // Explicit framework specified
139
+ adapter = this.adapters.get(options.framework) || this.defaultAdapter;
140
+ }
141
+ else if (this.detectedFramework) {
142
+ // Use previously detected framework
143
+ adapter = this.adapters.get(this.detectedFramework.componentFramework) || this.defaultAdapter;
144
+ }
145
+ else {
146
+ // Auto-detect
147
+ adapter = await this.autoDetect();
148
+ }
149
+ logger.debug('Generating prompt with adapter', { adapter: adapter.type });
150
+ return {
151
+ systemPrompt: adapter.generateSystemPrompt(config, options),
152
+ componentReference: adapter.generateComponentReference(components, config),
153
+ layoutInstructions: '', // TODO: Implement layout instructions
154
+ examples: adapter.generateExamples(config),
155
+ sampleStory: adapter.generateSampleStory(config, components),
156
+ framework: this.detectedFramework || {
157
+ componentFramework: adapter.type,
158
+ storyFramework: adapter.supportedStoryFrameworks[0],
159
+ confidence: 1,
160
+ },
161
+ };
162
+ }
163
+ }
164
+ // Singleton registry instance
165
+ let registryInstance = null;
166
+ /**
167
+ * Get the global adapter registry instance
168
+ */
169
+ export function getAdapterRegistry() {
170
+ if (!registryInstance) {
171
+ registryInstance = new AdapterRegistry();
172
+ }
173
+ return registryInstance;
174
+ }
175
+ /**
176
+ * Get adapter for a specific framework
177
+ */
178
+ export function getAdapter(type) {
179
+ return getAdapterRegistry().get(type);
180
+ }
181
+ /**
182
+ * Get the default adapter
183
+ */
184
+ export function getDefaultAdapter() {
185
+ return getAdapterRegistry().getDefault();
186
+ }
187
+ /**
188
+ * Auto-detect framework and get appropriate adapter
189
+ */
190
+ export async function autoDetectAdapter(projectRoot) {
191
+ return getAdapterRegistry().autoDetect(projectRoot);
192
+ }
193
+ /**
194
+ * Generate framework-specific prompt
195
+ */
196
+ export async function generateFrameworkPrompt(config, components, options) {
197
+ return getAdapterRegistry().generatePrompt(config, components, options);
198
+ }
@@ -0,0 +1,40 @@
1
+ /**
2
+ * React Framework Adapter
3
+ *
4
+ * Generates Storybook stories for React components.
5
+ * Supports CSF 3.0 format with TypeScript.
6
+ */
7
+ import { FrameworkType, StoryFramework, StoryGenerationOptions } from './types.js';
8
+ import { BaseFrameworkAdapter } from './base-adapter.js';
9
+ import { StoryUIConfig } from '../../story-ui.config.js';
10
+ import { DiscoveredComponent } from '../componentDiscovery.js';
11
+ export declare class ReactAdapter extends BaseFrameworkAdapter {
12
+ readonly type: FrameworkType;
13
+ readonly name = "React";
14
+ readonly supportedStoryFrameworks: StoryFramework[];
15
+ readonly defaultExtension = ".stories.tsx";
16
+ generateSystemPrompt(config: StoryUIConfig, options?: StoryGenerationOptions): string;
17
+ /**
18
+ * FIX #2: Detect if the project uses Chakra UI v3
19
+ */
20
+ private isChakraUIProject;
21
+ generateExamples(config: StoryUIConfig): string;
22
+ generateSampleStory(config: StoryUIConfig, components: DiscoveredComponent[]): string;
23
+ getStoryTemplate(options?: StoryGenerationOptions): string;
24
+ /**
25
+ * Post-process React stories
26
+ */
27
+ postProcess(storyContent: string): string;
28
+ /**
29
+ * Validate React story
30
+ */
31
+ validate(storyContent: string): {
32
+ valid: boolean;
33
+ errors: string[];
34
+ };
35
+ }
36
+ /**
37
+ * Factory function
38
+ */
39
+ export declare function createReactAdapter(): ReactAdapter;
40
+ //# sourceMappingURL=react-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"react-adapter.d.ts","sourceRoot":"","sources":["../../../story-generator/framework-adapters/react-adapter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,aAAa,EACb,cAAc,EACd,sBAAsB,EACvB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAE/D,qBAAa,YAAa,SAAQ,oBAAoB;IACpD,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAW;IACvC,QAAQ,CAAC,IAAI,WAAW;IACxB,QAAQ,CAAC,wBAAwB,EAAE,cAAc,EAAE,CAIjD;IACF,QAAQ,CAAC,gBAAgB,kBAAkB;IAE3C,oBAAoB,CAClB,MAAM,EAAE,aAAa,EACrB,OAAO,CAAC,EAAE,sBAAsB,GAC/B,MAAM;IA+GT;;OAEG;IACH,OAAO,CAAC,iBAAiB;IASzB,gBAAgB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM;IAgE/C,mBAAmB,CACjB,MAAM,EAAE,aAAa,EACrB,UAAU,EAAE,mBAAmB,EAAE,GAChC,MAAM;IA4CT,gBAAgB,CAAC,OAAO,CAAC,EAAE,sBAAsB,GAAG,MAAM;IA0B1D;;OAEG;IACH,WAAW,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM;IA4BzC;;OAEG;IACH,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE;CA2BrE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,YAAY,CAEjD"}