@tpitre/story-ui 2.2.0 → 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 (188) hide show
  1. package/.env.sample +82 -11
  2. package/README.md +89 -0
  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 +26 -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 +120 -2
  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 +8 -1
  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 +160 -76
  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/mcpRemote.d.ts +14 -0
  35. package/dist/mcp-server/routes/mcpRemote.d.ts.map +1 -0
  36. package/dist/mcp-server/routes/mcpRemote.js +489 -0
  37. package/dist/mcp-server/routes/memoryStories.d.ts +26 -0
  38. package/dist/mcp-server/routes/memoryStories.d.ts.map +1 -0
  39. package/dist/mcp-server/routes/providers.d.ts +89 -0
  40. package/dist/mcp-server/routes/providers.d.ts.map +1 -0
  41. package/dist/mcp-server/routes/providers.js +369 -0
  42. package/dist/mcp-server/routes/storySync.d.ts +26 -0
  43. package/dist/mcp-server/routes/storySync.d.ts.map +1 -0
  44. package/dist/mcp-server/routes/streamTypes.d.ts +110 -0
  45. package/dist/mcp-server/routes/streamTypes.d.ts.map +1 -0
  46. package/dist/mcp-server/routes/streamTypes.js +18 -0
  47. package/dist/mcp-server/sessionManager.d.ts +50 -0
  48. package/dist/mcp-server/sessionManager.d.ts.map +1 -0
  49. package/dist/story-generator/componentBlacklist.d.ts +21 -0
  50. package/dist/story-generator/componentBlacklist.d.ts.map +1 -0
  51. package/dist/story-generator/componentDiscovery.d.ts +28 -0
  52. package/dist/story-generator/componentDiscovery.d.ts.map +1 -0
  53. package/dist/story-generator/componentRegistryGenerator.d.ts +49 -0
  54. package/dist/story-generator/componentRegistryGenerator.d.ts.map +1 -0
  55. package/dist/story-generator/componentRegistryGenerator.js +205 -0
  56. package/dist/story-generator/configLoader.d.ts +33 -0
  57. package/dist/story-generator/configLoader.d.ts.map +1 -0
  58. package/dist/story-generator/considerationsLoader.d.ts +32 -0
  59. package/dist/story-generator/considerationsLoader.d.ts.map +1 -0
  60. package/dist/story-generator/documentation-sources.d.ts +28 -0
  61. package/dist/story-generator/documentation-sources.d.ts.map +1 -0
  62. package/dist/story-generator/documentationLoader.d.ts +64 -0
  63. package/dist/story-generator/documentationLoader.d.ts.map +1 -0
  64. package/dist/story-generator/dynamicPackageDiscovery.d.ts +97 -0
  65. package/dist/story-generator/dynamicPackageDiscovery.d.ts.map +1 -0
  66. package/dist/story-generator/enhancedComponentDiscovery.d.ts +125 -0
  67. package/dist/story-generator/enhancedComponentDiscovery.d.ts.map +1 -0
  68. package/dist/story-generator/enhancedComponentDiscovery.js +111 -11
  69. package/dist/story-generator/framework-adapters/angular-adapter.d.ts +40 -0
  70. package/dist/story-generator/framework-adapters/angular-adapter.d.ts.map +1 -0
  71. package/dist/story-generator/framework-adapters/angular-adapter.js +427 -0
  72. package/dist/story-generator/framework-adapters/base-adapter.d.ts +75 -0
  73. package/dist/story-generator/framework-adapters/base-adapter.d.ts.map +1 -0
  74. package/dist/story-generator/framework-adapters/base-adapter.js +147 -0
  75. package/dist/story-generator/framework-adapters/framework-detector.d.ts +55 -0
  76. package/dist/story-generator/framework-adapters/framework-detector.d.ts.map +1 -0
  77. package/dist/story-generator/framework-adapters/framework-detector.js +323 -0
  78. package/dist/story-generator/framework-adapters/index.d.ts +97 -0
  79. package/dist/story-generator/framework-adapters/index.d.ts.map +1 -0
  80. package/dist/story-generator/framework-adapters/index.js +198 -0
  81. package/dist/story-generator/framework-adapters/react-adapter.d.ts +40 -0
  82. package/dist/story-generator/framework-adapters/react-adapter.d.ts.map +1 -0
  83. package/dist/story-generator/framework-adapters/react-adapter.js +316 -0
  84. package/dist/story-generator/framework-adapters/svelte-adapter.d.ts +40 -0
  85. package/dist/story-generator/framework-adapters/svelte-adapter.d.ts.map +1 -0
  86. package/dist/story-generator/framework-adapters/svelte-adapter.js +372 -0
  87. package/dist/story-generator/framework-adapters/types.d.ts +182 -0
  88. package/dist/story-generator/framework-adapters/types.d.ts.map +1 -0
  89. package/dist/story-generator/framework-adapters/types.js +8 -0
  90. package/dist/story-generator/framework-adapters/vue-adapter.d.ts +36 -0
  91. package/dist/story-generator/framework-adapters/vue-adapter.d.ts.map +1 -0
  92. package/dist/story-generator/framework-adapters/vue-adapter.js +336 -0
  93. package/dist/story-generator/framework-adapters/web-components-adapter.d.ts +54 -0
  94. package/dist/story-generator/framework-adapters/web-components-adapter.d.ts.map +1 -0
  95. package/dist/story-generator/framework-adapters/web-components-adapter.js +387 -0
  96. package/dist/story-generator/generateStory.d.ts +7 -0
  97. package/dist/story-generator/generateStory.d.ts.map +1 -0
  98. package/dist/story-generator/gitignoreManager.d.ts +50 -0
  99. package/dist/story-generator/gitignoreManager.d.ts.map +1 -0
  100. package/dist/story-generator/imageProcessor.d.ts +80 -0
  101. package/dist/story-generator/imageProcessor.d.ts.map +1 -0
  102. package/dist/story-generator/imageProcessor.js +391 -0
  103. package/dist/story-generator/inMemoryStoryService.d.ts +89 -0
  104. package/dist/story-generator/inMemoryStoryService.d.ts.map +1 -0
  105. package/dist/story-generator/llm-providers/base-provider.d.ts +36 -0
  106. package/dist/story-generator/llm-providers/base-provider.d.ts.map +1 -0
  107. package/dist/story-generator/llm-providers/base-provider.js +135 -0
  108. package/dist/story-generator/llm-providers/claude-provider.d.ts +23 -0
  109. package/dist/story-generator/llm-providers/claude-provider.d.ts.map +1 -0
  110. package/dist/story-generator/llm-providers/claude-provider.js +414 -0
  111. package/dist/story-generator/llm-providers/gemini-provider.d.ts +24 -0
  112. package/dist/story-generator/llm-providers/gemini-provider.d.ts.map +1 -0
  113. package/dist/story-generator/llm-providers/gemini-provider.js +406 -0
  114. package/dist/story-generator/llm-providers/index.d.ts +63 -0
  115. package/dist/story-generator/llm-providers/index.d.ts.map +1 -0
  116. package/dist/story-generator/llm-providers/index.js +169 -0
  117. package/dist/story-generator/llm-providers/openai-provider.d.ts +24 -0
  118. package/dist/story-generator/llm-providers/openai-provider.d.ts.map +1 -0
  119. package/dist/story-generator/llm-providers/openai-provider.js +458 -0
  120. package/dist/story-generator/llm-providers/settings-manager.d.ts +75 -0
  121. package/dist/story-generator/llm-providers/settings-manager.d.ts.map +1 -0
  122. package/dist/story-generator/llm-providers/settings-manager.js +173 -0
  123. package/dist/story-generator/llm-providers/story-llm-service.d.ts +79 -0
  124. package/dist/story-generator/llm-providers/story-llm-service.d.ts.map +1 -0
  125. package/dist/story-generator/llm-providers/story-llm-service.js +240 -0
  126. package/dist/story-generator/llm-providers/types.d.ts +153 -0
  127. package/dist/story-generator/llm-providers/types.d.ts.map +1 -0
  128. package/dist/story-generator/llm-providers/types.js +8 -0
  129. package/dist/story-generator/logger.d.ts +14 -0
  130. package/dist/story-generator/logger.d.ts.map +1 -0
  131. package/dist/story-generator/logger.js +96 -29
  132. package/dist/story-generator/postProcessStory.d.ts +6 -0
  133. package/dist/story-generator/postProcessStory.d.ts.map +1 -0
  134. package/dist/story-generator/productionGitignoreManager.d.ts +91 -0
  135. package/dist/story-generator/productionGitignoreManager.d.ts.map +1 -0
  136. package/dist/story-generator/promptGenerator.d.ts +48 -0
  137. package/dist/story-generator/promptGenerator.d.ts.map +1 -0
  138. package/dist/story-generator/promptGenerator.js +186 -1
  139. package/dist/story-generator/storyHistory.d.ts +44 -0
  140. package/dist/story-generator/storyHistory.d.ts.map +1 -0
  141. package/dist/story-generator/storySync.d.ts +68 -0
  142. package/dist/story-generator/storySync.d.ts.map +1 -0
  143. package/dist/story-generator/storyTracker.d.ts +48 -0
  144. package/dist/story-generator/storyTracker.d.ts.map +1 -0
  145. package/dist/story-generator/storyValidator.d.ts +6 -0
  146. package/dist/story-generator/storyValidator.d.ts.map +1 -0
  147. package/dist/story-generator/universalDesignSystemAdapter.d.ts +68 -0
  148. package/dist/story-generator/universalDesignSystemAdapter.d.ts.map +1 -0
  149. package/dist/story-generator/universalDesignSystemAdapter.js +138 -1
  150. package/dist/story-generator/urlRedirectService.d.ts +21 -0
  151. package/dist/story-generator/urlRedirectService.d.ts.map +1 -0
  152. package/dist/story-generator/validateStory.d.ts +19 -0
  153. package/dist/story-generator/validateStory.d.ts.map +1 -0
  154. package/dist/story-generator/validateStory.js +6 -2
  155. package/dist/story-generator/visionPrompts.d.ts +88 -0
  156. package/dist/story-generator/visionPrompts.d.ts.map +1 -0
  157. package/dist/story-generator/visionPrompts.js +462 -0
  158. package/dist/story-ui.config.d.ts +78 -0
  159. package/dist/story-ui.config.d.ts.map +1 -0
  160. package/dist/templates/StoryUI/StoryUIPanel.d.ts +4 -0
  161. package/dist/templates/StoryUI/StoryUIPanel.d.ts.map +1 -0
  162. package/dist/templates/StoryUI/StoryUIPanel.js +1874 -0
  163. package/dist/templates/StoryUI/StoryUIPanel.stories.d.ts +18 -0
  164. package/dist/templates/StoryUI/StoryUIPanel.stories.d.ts.map +1 -0
  165. package/dist/templates/StoryUI/StoryUIPanel.stories.js +37 -0
  166. package/dist/templates/StoryUI/index.d.ts +3 -0
  167. package/dist/templates/StoryUI/index.d.ts.map +1 -0
  168. package/dist/templates/StoryUI/index.js +2 -0
  169. package/package.json +17 -3
  170. package/templates/StoryUI/StoryUIPanel.tsx +1960 -384
  171. package/templates/StoryUI/index.tsx +1 -1
  172. package/templates/StoryUI/manager.tsx +264 -0
  173. package/templates/production-app/.env.example +11 -0
  174. package/templates/production-app/index.html +66 -0
  175. package/templates/production-app/package.json +30 -0
  176. package/templates/production-app/public/favicon.svg +5 -0
  177. package/templates/production-app/src/App.tsx +1157 -0
  178. package/templates/production-app/src/LivePreviewRenderer.tsx +420 -0
  179. package/templates/production-app/src/componentRegistry.ts +315 -0
  180. package/templates/production-app/src/considerations.ts +16 -0
  181. package/templates/production-app/src/index.css +284 -0
  182. package/templates/production-app/src/main.tsx +25 -0
  183. package/templates/production-app/tsconfig.json +32 -0
  184. package/templates/production-app/tsconfig.node.json +11 -0
  185. package/templates/production-app/vite.config.ts +83 -0
  186. package/templates/react-import-rule.json +2 -2
  187. package/dist/index.js +0 -12
  188. package/dist/story-ui.config.loader.js +0 -205
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-adapter.d.ts","sourceRoot":"","sources":["../../../story-generator/framework-adapters/base-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,aAAa,EACb,cAAc,EACd,gBAAgB,EAChB,sBAAsB,EACvB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAG/D;;GAEG;AACH,8BAAsB,oBAAqB,YAAW,gBAAgB;IACpE,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IACtC,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,QAAQ,CAAC,wBAAwB,EAAE,cAAc,EAAE,CAAC;IAC7D,QAAQ,CAAC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAE3C;;OAEG;IACH,QAAQ,CAAC,oBAAoB,CAC3B,MAAM,EAAE,aAAa,EACrB,OAAO,CAAC,EAAE,sBAAsB,GAC/B,MAAM;IAET;;OAEG;IACH,0BAA0B,CACxB,UAAU,EAAE,mBAAmB,EAAE,EACjC,MAAM,EAAE,aAAa,GACpB,MAAM;IAmBT;;OAEG;IACH,SAAS,CAAC,oBAAoB,CAC5B,SAAS,EAAE,mBAAmB,EAC9B,MAAM,EAAE,aAAa,GACpB,MAAM;IAkBT;;OAEG;IACH,SAAS,CAAC,aAAa,CACrB,SAAS,EAAE,mBAAmB,EAC9B,MAAM,EAAE,aAAa,GACpB,MAAM;IAUT;;OAEG;IACH,SAAS,CAAC,wBAAwB,CAChC,UAAU,EAAE,mBAAmB,EAAE,GAChC,MAAM,CAAC,MAAM,EAAE,mBAAmB,EAAE,CAAC;IAcxC;;OAEG;IACH,QAAQ,CAAC,gBAAgB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM;IAExD;;OAEG;IACH,QAAQ,CAAC,mBAAmB,CAC1B,MAAM,EAAE,aAAa,EACrB,UAAU,EAAE,mBAAmB,EAAE,GAChC,MAAM;IAET;;OAEG;IACH,eAAe,CACb,UAAU,EAAE,mBAAmB,EAAE,EACjC,MAAM,EAAE,aAAa,GACpB,MAAM;IAoBT;;OAEG;IACH,WAAW,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM;IAQzC;;OAEG;IACH,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE;IAkBpE;;OAEG;IACH,QAAQ,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,sBAAsB,GAAG,MAAM;IAEnE;;OAEG;IACH,SAAS,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAIpE;;OAEG;IACH,SAAS,CAAC,cAAc,IAAI,MAAM;CAoBnC"}
@@ -0,0 +1,147 @@
1
+ /**
2
+ * Base Framework Adapter
3
+ *
4
+ * Abstract base class that provides common functionality for all
5
+ * framework-specific adapters. Subclasses implement framework-specific
6
+ * prompt generation and story templates.
7
+ */
8
+ import { logger } from '../logger.js';
9
+ /**
10
+ * Abstract Base Framework Adapter
11
+ */
12
+ export class BaseFrameworkAdapter {
13
+ /**
14
+ * Generate component reference documentation
15
+ */
16
+ generateComponentReference(components, config) {
17
+ if (components.length === 0) {
18
+ return 'No components discovered.';
19
+ }
20
+ const groupedComponents = this.groupComponentsByPackage(components);
21
+ const sections = [];
22
+ for (const [packageName, pkgComponents] of Object.entries(groupedComponents)) {
23
+ const componentList = pkgComponents
24
+ .map(comp => this.formatComponentEntry(comp, config))
25
+ .join('\n');
26
+ sections.push(`## ${packageName}\n${componentList}`);
27
+ }
28
+ return `# Available Components\n\n${sections.join('\n\n')}`;
29
+ }
30
+ /**
31
+ * Format a single component entry
32
+ */
33
+ formatComponentEntry(component, config) {
34
+ const importPath = this.getImportPath(component, config);
35
+ let entry = `- **${component.name}** (import from '${importPath}')`;
36
+ if (component.props && component.props.length > 0) {
37
+ const propsList = component.props
38
+ .slice(0, 5) // Limit to first 5 props
39
+ .join(', ');
40
+ entry += `\n Props: ${propsList}${component.props.length > 5 ? '...' : ''}`;
41
+ }
42
+ if (component.description) {
43
+ entry += `\n ${component.description}`;
44
+ }
45
+ return entry;
46
+ }
47
+ /**
48
+ * Get the import path for a component
49
+ */
50
+ getImportPath(component, config) {
51
+ // Use component's __componentPath if available
52
+ if (component.__componentPath) {
53
+ return component.__componentPath;
54
+ }
55
+ // Fall back to import path from config
56
+ return config.importPath || 'unknown';
57
+ }
58
+ /**
59
+ * Group components by their category
60
+ */
61
+ groupComponentsByPackage(components) {
62
+ const grouped = {};
63
+ for (const component of components) {
64
+ const category = component.category || 'other';
65
+ if (!grouped[category]) {
66
+ grouped[category] = [];
67
+ }
68
+ grouped[category].push(component);
69
+ }
70
+ return grouped;
71
+ }
72
+ /**
73
+ * Generate import statements for components
74
+ */
75
+ generateImports(components, config) {
76
+ const importsByPath = new Map();
77
+ for (const component of components) {
78
+ const importPath = this.getImportPath(component, config);
79
+ if (!importsByPath.has(importPath)) {
80
+ importsByPath.set(importPath, new Set());
81
+ }
82
+ importsByPath.get(importPath).add(component.name);
83
+ }
84
+ const imports = [];
85
+ for (const [path, names] of importsByPath) {
86
+ const namedImports = Array.from(names).sort().join(', ');
87
+ imports.push(`import { ${namedImports} } from '${path}';`);
88
+ }
89
+ return imports.join('\n');
90
+ }
91
+ /**
92
+ * Post-process generated story content
93
+ */
94
+ postProcess(storyContent) {
95
+ // Default implementation - can be overridden by subclasses
96
+ return storyContent
97
+ .trim()
98
+ .replace(/\r\n/g, '\n')
99
+ .replace(/\n{3,}/g, '\n\n');
100
+ }
101
+ /**
102
+ * Validate generated story syntax
103
+ */
104
+ validate(storyContent) {
105
+ const errors = [];
106
+ if (!storyContent || storyContent.trim().length === 0) {
107
+ errors.push('Story content is empty');
108
+ }
109
+ // Check for common issues
110
+ if (!storyContent.includes('export')) {
111
+ errors.push('Story missing exports');
112
+ }
113
+ return {
114
+ valid: errors.length === 0,
115
+ errors,
116
+ };
117
+ }
118
+ /**
119
+ * Log adapter activity
120
+ */
121
+ log(message, data) {
122
+ logger.debug(`[${this.name}Adapter] ${message}`, data);
123
+ }
124
+ /**
125
+ * Get common story structure rules
126
+ */
127
+ getCommonRules() {
128
+ return `
129
+ GENERAL RULES:
130
+ - Follow the component library's design patterns
131
+ - Use meaningful story names that describe the variant
132
+ - Include multiple stories showing different states/variants
133
+ - Ensure accessibility by using proper ARIA attributes
134
+ - Use realistic placeholder content
135
+
136
+ IMAGE RULES:
137
+ - Use Lorem Picsum for placeholder images: https://picsum.photos/[width]/[height]
138
+ - Always include alt text for images
139
+ - Example: https://picsum.photos/400/300?random=1
140
+
141
+ SPACING RULES:
142
+ - Use the design system's spacing tokens when available
143
+ - Maintain consistent margins and padding
144
+ - Follow the layout grid system if present
145
+ `;
146
+ }
147
+ }
@@ -0,0 +1,55 @@
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 { FrameworkType, FrameworkDetectionResult } from './types.js';
9
+ /**
10
+ * Framework Detector Class
11
+ */
12
+ export declare class FrameworkDetector {
13
+ private projectRoot;
14
+ private packageJson;
15
+ private dependencies;
16
+ private detectedConfigFiles;
17
+ constructor(projectRoot?: string);
18
+ /**
19
+ * Detect frameworks used in the project
20
+ */
21
+ detect(): Promise<FrameworkDetectionResult>;
22
+ /**
23
+ * Load and parse package.json
24
+ */
25
+ private loadPackageJson;
26
+ /**
27
+ * Scan for framework configuration files
28
+ */
29
+ private scanConfigFiles;
30
+ /**
31
+ * Score each framework pattern based on evidence
32
+ */
33
+ private scoreFrameworks;
34
+ /**
35
+ * Get framework version from dependencies
36
+ */
37
+ private getFrameworkVersion;
38
+ /**
39
+ * Get framework-specific configuration
40
+ */
41
+ private getFrameworkConfig;
42
+ /**
43
+ * Quick check for a specific framework
44
+ */
45
+ hasFramework(framework: FrameworkType): boolean;
46
+ }
47
+ /**
48
+ * Factory function for framework detection
49
+ */
50
+ export declare function detectFramework(projectRoot?: string): Promise<FrameworkDetectionResult>;
51
+ /**
52
+ * Get framework detector instance
53
+ */
54
+ export declare function getFrameworkDetector(projectRoot?: string): FrameworkDetector;
55
+ //# sourceMappingURL=framework-detector.d.ts.map
@@ -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"}