codemeld 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (243) hide show
  1. package/README.md +514 -0
  2. package/bin/cli.js +2 -0
  3. package/dist/ai/agent.d.ts +124 -0
  4. package/dist/ai/agent.d.ts.map +1 -0
  5. package/dist/ai/agent.js +289 -0
  6. package/dist/ai/agent.js.map +1 -0
  7. package/dist/ai/index.d.ts +10 -0
  8. package/dist/ai/index.d.ts.map +1 -0
  9. package/dist/ai/index.js +10 -0
  10. package/dist/ai/index.js.map +1 -0
  11. package/dist/ai/prompts.d.ts +35 -0
  12. package/dist/ai/prompts.d.ts.map +1 -0
  13. package/dist/ai/prompts.js +166 -0
  14. package/dist/ai/prompts.js.map +1 -0
  15. package/dist/ai/refinement-loop.d.ts +29 -0
  16. package/dist/ai/refinement-loop.d.ts.map +1 -0
  17. package/dist/ai/refinement-loop.js +180 -0
  18. package/dist/ai/refinement-loop.js.map +1 -0
  19. package/dist/ai/tools.d.ts +17 -0
  20. package/dist/ai/tools.d.ts.map +1 -0
  21. package/dist/ai/tools.js +353 -0
  22. package/dist/ai/tools.js.map +1 -0
  23. package/dist/ai/visual-compare.d.ts +43 -0
  24. package/dist/ai/visual-compare.d.ts.map +1 -0
  25. package/dist/ai/visual-compare.js +176 -0
  26. package/dist/ai/visual-compare.js.map +1 -0
  27. package/dist/cli.d.ts +3 -0
  28. package/dist/cli.d.ts.map +1 -0
  29. package/dist/cli.js +179 -0
  30. package/dist/cli.js.map +1 -0
  31. package/dist/converter.d.ts +10 -0
  32. package/dist/converter.d.ts.map +1 -0
  33. package/dist/converter.js +836 -0
  34. package/dist/converter.js.map +1 -0
  35. package/dist/deconverter.d.ts +19 -0
  36. package/dist/deconverter.d.ts.map +1 -0
  37. package/dist/deconverter.js +188 -0
  38. package/dist/deconverter.js.map +1 -0
  39. package/dist/frameworks/angular-adapter.d.ts +27 -0
  40. package/dist/frameworks/angular-adapter.d.ts.map +1 -0
  41. package/dist/frameworks/angular-adapter.js +617 -0
  42. package/dist/frameworks/angular-adapter.js.map +1 -0
  43. package/dist/frameworks/index.d.ts +10 -0
  44. package/dist/frameworks/index.d.ts.map +1 -0
  45. package/dist/frameworks/index.js +21 -0
  46. package/dist/frameworks/index.js.map +1 -0
  47. package/dist/frameworks/nextjs-adapter.d.ts +22 -0
  48. package/dist/frameworks/nextjs-adapter.d.ts.map +1 -0
  49. package/dist/frameworks/nextjs-adapter.js +392 -0
  50. package/dist/frameworks/nextjs-adapter.js.map +1 -0
  51. package/dist/frameworks/react-adapter.d.ts +21 -0
  52. package/dist/frameworks/react-adapter.d.ts.map +1 -0
  53. package/dist/frameworks/react-adapter.js +71 -0
  54. package/dist/frameworks/react-adapter.js.map +1 -0
  55. package/dist/frameworks/svelte-adapter.d.ts +27 -0
  56. package/dist/frameworks/svelte-adapter.d.ts.map +1 -0
  57. package/dist/frameworks/svelte-adapter.js +519 -0
  58. package/dist/frameworks/svelte-adapter.js.map +1 -0
  59. package/dist/frameworks/types.d.ts +78 -0
  60. package/dist/frameworks/types.d.ts.map +1 -0
  61. package/dist/frameworks/types.js +2 -0
  62. package/dist/frameworks/types.js.map +1 -0
  63. package/dist/frameworks/vue-adapter.d.ts +34 -0
  64. package/dist/frameworks/vue-adapter.d.ts.map +1 -0
  65. package/dist/frameworks/vue-adapter.js +632 -0
  66. package/dist/frameworks/vue-adapter.js.map +1 -0
  67. package/dist/generators/accessibility-generator.d.ts +43 -0
  68. package/dist/generators/accessibility-generator.d.ts.map +1 -0
  69. package/dist/generators/accessibility-generator.js +507 -0
  70. package/dist/generators/accessibility-generator.js.map +1 -0
  71. package/dist/generators/asset-handler.d.ts +14 -0
  72. package/dist/generators/asset-handler.d.ts.map +1 -0
  73. package/dist/generators/asset-handler.js +79 -0
  74. package/dist/generators/asset-handler.js.map +1 -0
  75. package/dist/generators/build-verifier.d.ts +8 -0
  76. package/dist/generators/build-verifier.d.ts.map +1 -0
  77. package/dist/generators/build-verifier.js +64 -0
  78. package/dist/generators/build-verifier.js.map +1 -0
  79. package/dist/generators/component-extractor.d.ts +25 -0
  80. package/dist/generators/component-extractor.d.ts.map +1 -0
  81. package/dist/generators/component-extractor.js +146 -0
  82. package/dist/generators/component-extractor.js.map +1 -0
  83. package/dist/generators/component-generator.d.ts +12 -0
  84. package/dist/generators/component-generator.d.ts.map +1 -0
  85. package/dist/generators/component-generator.js +724 -0
  86. package/dist/generators/component-generator.js.map +1 -0
  87. package/dist/generators/deploy-generator.d.ts +9 -0
  88. package/dist/generators/deploy-generator.d.ts.map +1 -0
  89. package/dist/generators/deploy-generator.js +409 -0
  90. package/dist/generators/deploy-generator.js.map +1 -0
  91. package/dist/generators/error-boundary.d.ts +5 -0
  92. package/dist/generators/error-boundary.d.ts.map +1 -0
  93. package/dist/generators/error-boundary.js +59 -0
  94. package/dist/generators/error-boundary.js.map +1 -0
  95. package/dist/generators/form-generator.d.ts +42 -0
  96. package/dist/generators/form-generator.d.ts.map +1 -0
  97. package/dist/generators/form-generator.js +662 -0
  98. package/dist/generators/form-generator.js.map +1 -0
  99. package/dist/generators/hooks-generator.d.ts +40 -0
  100. package/dist/generators/hooks-generator.d.ts.map +1 -0
  101. package/dist/generators/hooks-generator.js +297 -0
  102. package/dist/generators/hooks-generator.js.map +1 -0
  103. package/dist/generators/html-generator.d.ts +27 -0
  104. package/dist/generators/html-generator.d.ts.map +1 -0
  105. package/dist/generators/html-generator.js +772 -0
  106. package/dist/generators/html-generator.js.map +1 -0
  107. package/dist/generators/jquery-converter.d.ts +41 -0
  108. package/dist/generators/jquery-converter.d.ts.map +1 -0
  109. package/dist/generators/jquery-converter.js +594 -0
  110. package/dist/generators/jquery-converter.js.map +1 -0
  111. package/dist/generators/pattern-implementer.d.ts +26 -0
  112. package/dist/generators/pattern-implementer.d.ts.map +1 -0
  113. package/dist/generators/pattern-implementer.js +336 -0
  114. package/dist/generators/pattern-implementer.js.map +1 -0
  115. package/dist/generators/performance-generator.d.ts +51 -0
  116. package/dist/generators/performance-generator.d.ts.map +1 -0
  117. package/dist/generators/performance-generator.js +428 -0
  118. package/dist/generators/performance-generator.js.map +1 -0
  119. package/dist/generators/router-generator.d.ts +21 -0
  120. package/dist/generators/router-generator.d.ts.map +1 -0
  121. package/dist/generators/router-generator.js +178 -0
  122. package/dist/generators/router-generator.js.map +1 -0
  123. package/dist/generators/scaffolder.d.ts +28 -0
  124. package/dist/generators/scaffolder.d.ts.map +1 -0
  125. package/dist/generators/scaffolder.js +266 -0
  126. package/dist/generators/scaffolder.js.map +1 -0
  127. package/dist/generators/seo-generator.d.ts +29 -0
  128. package/dist/generators/seo-generator.d.ts.map +1 -0
  129. package/dist/generators/seo-generator.js +223 -0
  130. package/dist/generators/seo-generator.js.map +1 -0
  131. package/dist/generators/test-generator.d.ts +19 -0
  132. package/dist/generators/test-generator.d.ts.map +1 -0
  133. package/dist/generators/test-generator.js +398 -0
  134. package/dist/generators/test-generator.js.map +1 -0
  135. package/dist/generators/type-generator.d.ts +33 -0
  136. package/dist/generators/type-generator.d.ts.map +1 -0
  137. package/dist/generators/type-generator.js +663 -0
  138. package/dist/generators/type-generator.js.map +1 -0
  139. package/dist/index.d.ts +23 -0
  140. package/dist/index.d.ts.map +1 -0
  141. package/dist/index.js +12 -0
  142. package/dist/index.js.map +1 -0
  143. package/dist/parsers/css-processor.d.ts +23 -0
  144. package/dist/parsers/css-processor.d.ts.map +1 -0
  145. package/dist/parsers/css-processor.js +129 -0
  146. package/dist/parsers/css-processor.js.map +1 -0
  147. package/dist/parsers/framework-parser.d.ts +48 -0
  148. package/dist/parsers/framework-parser.d.ts.map +1 -0
  149. package/dist/parsers/framework-parser.js +770 -0
  150. package/dist/parsers/framework-parser.js.map +1 -0
  151. package/dist/parsers/html-parser.d.ts +12 -0
  152. package/dist/parsers/html-parser.d.ts.map +1 -0
  153. package/dist/parsers/html-parser.js +444 -0
  154. package/dist/parsers/html-parser.js.map +1 -0
  155. package/dist/parsers/js-analyzer.d.ts +199 -0
  156. package/dist/parsers/js-analyzer.d.ts.map +1 -0
  157. package/dist/parsers/js-analyzer.js +680 -0
  158. package/dist/parsers/js-analyzer.js.map +1 -0
  159. package/dist/parsers/js-resolver.d.ts +8 -0
  160. package/dist/parsers/js-resolver.d.ts.map +1 -0
  161. package/dist/parsers/js-resolver.js +45 -0
  162. package/dist/parsers/js-resolver.js.map +1 -0
  163. package/dist/parsers/tailwind-detector.d.ts +23 -0
  164. package/dist/parsers/tailwind-detector.d.ts.map +1 -0
  165. package/dist/parsers/tailwind-detector.js +104 -0
  166. package/dist/parsers/tailwind-detector.js.map +1 -0
  167. package/dist/tests/advanced-features.test.d.ts +2 -0
  168. package/dist/tests/advanced-features.test.d.ts.map +1 -0
  169. package/dist/tests/advanced-features.test.js +235 -0
  170. package/dist/tests/advanced-features.test.js.map +1 -0
  171. package/dist/tests/css-modules.test.d.ts +2 -0
  172. package/dist/tests/css-modules.test.d.ts.map +1 -0
  173. package/dist/tests/css-modules.test.js +61 -0
  174. package/dist/tests/css-modules.test.js.map +1 -0
  175. package/dist/tests/css-processor.test.d.ts +2 -0
  176. package/dist/tests/css-processor.test.d.ts.map +1 -0
  177. package/dist/tests/css-processor.test.js +48 -0
  178. package/dist/tests/css-processor.test.js.map +1 -0
  179. package/dist/tests/html-parser.test.d.ts +2 -0
  180. package/dist/tests/html-parser.test.d.ts.map +1 -0
  181. package/dist/tests/html-parser.test.js +78 -0
  182. package/dist/tests/html-parser.test.js.map +1 -0
  183. package/dist/tests/integration.test.d.ts +2 -0
  184. package/dist/tests/integration.test.d.ts.map +1 -0
  185. package/dist/tests/integration.test.js +65 -0
  186. package/dist/tests/integration.test.js.map +1 -0
  187. package/dist/tests/js-analyzer.test.d.ts +2 -0
  188. package/dist/tests/js-analyzer.test.d.ts.map +1 -0
  189. package/dist/tests/js-analyzer.test.js +58 -0
  190. package/dist/tests/js-analyzer.test.js.map +1 -0
  191. package/dist/tests/naming.test.d.ts +2 -0
  192. package/dist/tests/naming.test.d.ts.map +1 -0
  193. package/dist/tests/naming.test.js +43 -0
  194. package/dist/tests/naming.test.js.map +1 -0
  195. package/dist/tests/router-generator.test.d.ts +2 -0
  196. package/dist/tests/router-generator.test.d.ts.map +1 -0
  197. package/dist/tests/router-generator.test.js +60 -0
  198. package/dist/tests/router-generator.test.js.map +1 -0
  199. package/dist/tui/chat.d.ts +13 -0
  200. package/dist/tui/chat.d.ts.map +1 -0
  201. package/dist/tui/chat.js +499 -0
  202. package/dist/tui/chat.js.map +1 -0
  203. package/dist/tui/design-guide.d.ts +41 -0
  204. package/dist/tui/design-guide.d.ts.map +1 -0
  205. package/dist/tui/design-guide.js +184 -0
  206. package/dist/tui/design-guide.js.map +1 -0
  207. package/dist/tui/input.d.ts +30 -0
  208. package/dist/tui/input.d.ts.map +1 -0
  209. package/dist/tui/input.js +239 -0
  210. package/dist/tui/input.js.map +1 -0
  211. package/dist/tui/renderer.d.ts +48 -0
  212. package/dist/tui/renderer.d.ts.map +1 -0
  213. package/dist/tui/renderer.js +212 -0
  214. package/dist/tui/renderer.js.map +1 -0
  215. package/dist/tui/tools.d.ts +14 -0
  216. package/dist/tui/tools.d.ts.map +1 -0
  217. package/dist/tui/tools.js +1370 -0
  218. package/dist/tui/tools.js.map +1 -0
  219. package/dist/types.d.ts +93 -0
  220. package/dist/types.d.ts.map +1 -0
  221. package/dist/types.js +2 -0
  222. package/dist/types.js.map +1 -0
  223. package/dist/utils/config.d.ts +20 -0
  224. package/dist/utils/config.d.ts.map +1 -0
  225. package/dist/utils/config.js +33 -0
  226. package/dist/utils/config.js.map +1 -0
  227. package/dist/utils/formatter.d.ts +5 -0
  228. package/dist/utils/formatter.d.ts.map +1 -0
  229. package/dist/utils/formatter.js +68 -0
  230. package/dist/utils/formatter.js.map +1 -0
  231. package/dist/utils/logger.d.ts +8 -0
  232. package/dist/utils/logger.d.ts.map +1 -0
  233. package/dist/utils/logger.js +19 -0
  234. package/dist/utils/logger.js.map +1 -0
  235. package/dist/utils/naming.d.ts +17 -0
  236. package/dist/utils/naming.d.ts.map +1 -0
  237. package/dist/utils/naming.js +48 -0
  238. package/dist/utils/naming.js.map +1 -0
  239. package/dist/utils/report.d.ts +56 -0
  240. package/dist/utils/report.d.ts.map +1 -0
  241. package/dist/utils/report.js +339 -0
  242. package/dist/utils/report.js.map +1 -0
  243. package/package.json +61 -0
package/README.md ADDED
@@ -0,0 +1,514 @@
1
+ # CodeMeld
2
+
3
+ Bidirectional converter between HTML/CSS/JS and modern frameworks (React, Next.js, Vue, Svelte, Angular).
4
+
5
+ ## Features
6
+
7
+ - **Bidirectional Conversion** — Convert HTML/CSS/JS to React *and* reverse-convert React/Vue/Svelte/Angular back to static HTML
8
+ - **HTML Parsing** — Extracts structure, inline styles, inline scripts, linked resources using Cheerio
9
+ - **HTML to JSX Conversion** — Converts `class` to `className`, `for` to `htmlFor`, self-closes void elements, converts inline styles to object syntax, escapes literal braces in text content
10
+ - **CSS Processing** — Supports global CSS and CSS Modules mode, rewrites asset URLs, merges stylesheets
11
+ - **JavaScript Analysis** — Detects mutable variables to `useState`, DOM event listeners to event handlers, `DOMContentLoaded` to `useEffect`, form handlers with proper event typing, DOM mutations to React state
12
+ - **Smart Component Extraction** — Automatically splits large HTML files into smaller, reusable React components based on semantic sections (`<nav>`, `<header>`, `<section>`, `<footer>`, etc.)
13
+ - **Custom React Hooks** — Generates `useFetch`, `useLocalStorage`, `useInterval`, `useTimeout` hooks when patterns are detected
14
+ - **Tailwind CSS Detection** — Automatically detects and configures Tailwind CSS (or force/disable with flags)
15
+ - **Multi-Framework Support** — Target React, Next.js, Vue, Svelte, or Angular
16
+ - **Project Scaffolding** — Generates complete Vite + React + TypeScript project with proper config files
17
+ - **Multi-page Support** — Converts multiple HTML pages into separate React components with React Router
18
+ - **Hash-based Routing** — Automatically detects and preserves hash-based SPA routing
19
+ - **Asset Handling** — Discovers and copies images, fonts, and other assets to the correct directories
20
+ - **Build Verification** — Optional `--verify` flag installs deps and runs `vite build` to validate output
21
+ - **AI-Powered Refinement** — Optional `--ai` flag uses Claude to fix build errors, enhance components, and improve code quality
22
+ - **Visual Comparison** — Optional `--visual-compare` flag takes Playwright screenshots of original vs converted sites
23
+ - **Interactive AI Chat** — Claude Code-style TUI for iterating on your project with AI assistance
24
+ - **SEO Generation** — Sitemap, robots.txt, web manifest, and meta tag components
25
+ - **Accessibility Enhancement** — ARIA labels, semantic HTML, skip navigation
26
+ - **Performance Optimizations** — React.memo, lazy loading, code splitting
27
+ - **Interactive Pattern Detection** — Auto-detects scroll animations, tabs, accordions, hamburger menus and generates vanilla JS for deconverted output
28
+
29
+ ## Installation
30
+
31
+ ```bash
32
+ npm install -g codemeld
33
+ ```
34
+
35
+ Or use directly with npx:
36
+
37
+ ```bash
38
+ npx codemeld <input-dir> <output-dir>
39
+ ```
40
+
41
+ Or clone and build from source:
42
+
43
+ ```bash
44
+ git clone https://github.com/hansade2005/html-to-vite-react.git
45
+ cd html-to-vite-react
46
+ npm install
47
+ npm run build
48
+ ```
49
+
50
+ Then run with:
51
+
52
+ ```bash
53
+ node dist/cli.js convert <input-dir> <output-dir>
54
+ ```
55
+
56
+ ## Quick Start
57
+
58
+ ### 1. Convert a single-page HTML site
59
+
60
+ ```bash
61
+ codemeld ./my-website ./my-react-app
62
+ ```
63
+
64
+ This reads all `.html`, `.css`, and `.js` files from `./my-website`, converts them into React components, and outputs a complete Vite project in `./my-react-app`.
65
+
66
+ ### 2. Reverse-convert a React app back to HTML
67
+
68
+ ```bash
69
+ codemeld deconvert ./my-react-app ./my-html-site
70
+ ```
71
+
72
+ ### 3. Install dependencies and run
73
+
74
+ ```bash
75
+ cd my-react-app
76
+ npm install
77
+ npm run dev
78
+ ```
79
+
80
+ Your converted site is now running as a React app at `http://localhost:5173`.
81
+
82
+ ### 4. Build for production
83
+
84
+ ```bash
85
+ npm run build
86
+ ```
87
+
88
+ ## CLI Reference
89
+
90
+ ### `convert` (default command)
91
+
92
+ ```bash
93
+ codemeld convert <input> <output> [options]
94
+ ```
95
+
96
+ Since `convert` is the default command, you can omit it:
97
+
98
+ ```bash
99
+ codemeld ./site ./app
100
+ ```
101
+
102
+ **Arguments:**
103
+
104
+ | Argument | Description |
105
+ |----------|-------------|
106
+ | `<input>` | Path to the HTML/CSS/JS source directory |
107
+ | `<output>` | Path for the generated Vite + React project |
108
+
109
+ **Options:**
110
+
111
+ | Option | Description | Default |
112
+ |--------|-------------|---------|
113
+ | `-n, --name <name>` | Project/component name | Directory name |
114
+ | `-m, --css-modules` | Use CSS Modules instead of global CSS | `false` |
115
+ | `-p, --preserve-structure` | Preserve original file/folder structure | `false` |
116
+ | `-f, --framework <fw>` | Target framework: `react`, `nextjs`, `vue`, `svelte`, `angular` | `react` |
117
+ | `--verify` | Run `npm install && vite build` after conversion to verify output | `false` |
118
+ | `--no-verify` | Skip build verification | — |
119
+ | `--no-extract` | Disable smart component extraction (keep everything in one component) | — |
120
+ | `--no-prettier` | Disable Prettier formatting on generated code | — |
121
+ | `--tailwind <mode>` | Tailwind CSS handling: `auto`, `force`, `disable` | `auto` |
122
+ | `--ai` | Enable AI-powered refinement after conversion (requires API key) | `false` |
123
+ | `--ai-max-steps <n>` | Maximum AI agent iterations | `50` |
124
+ | `--ai-mode <mode>` | AI mode: `full`, `build-fix`, `enhance`, `visual` | `full` |
125
+ | `--ai-verbose` | Show AI agent reasoning in real-time | `false` |
126
+ | `--visual-compare` | Take screenshots comparing original vs converted (requires Playwright) | `false` |
127
+ | `--tests` | Generate Vitest test files for components | `false` |
128
+ | `--deploy` | Generate deployment configs (Docker, CI/CD, Vercel, Netlify) | `false` |
129
+ | `--seo` | Generate SEO files (sitemap, robots.txt, manifest, meta tags) | `false` |
130
+ | `--seo-url <url>` | Base URL for SEO files | `https://example.com` |
131
+ | `--a11y` | Enhance accessibility (ARIA labels, semantic HTML, skip nav) | `false` |
132
+ | `--perf` | Add performance optimizations (React.memo, lazy loading, code splitting) | `false` |
133
+ | `--forms` | Generate form handling with validation | `false` |
134
+ | `--types` | Generate TypeScript type definitions | `false` |
135
+ | `--all-extras` | Enable all extras: `--tests --deploy --seo --a11y --perf --forms --types` | `false` |
136
+
137
+ ### `deconvert`
138
+
139
+ Reverse-convert a framework project back to static HTML/CSS/JS:
140
+
141
+ ```bash
142
+ codemeld deconvert <input> <output> [options]
143
+ ```
144
+
145
+ | Option | Description |
146
+ |--------|-------------|
147
+ | `-f, --framework <fw>` | Force framework detection: `react`, `nextjs`, `vue`, `svelte`, `angular` |
148
+ | `--no-prettier` | Disable Prettier formatting |
149
+
150
+ ### `chat`
151
+
152
+ Start an interactive AI chat session for your project:
153
+
154
+ ```bash
155
+ codemeld chat [directory]
156
+ ```
157
+
158
+ This opens a Claude Code-style terminal UI where you can ask the AI to read files, edit code, run commands, and fix build errors interactively.
159
+
160
+ | Argument | Description | Default |
161
+ |----------|-------------|---------|
162
+ | `[directory]` | Project directory to work in | Current directory |
163
+
164
+ ## Usage Examples
165
+
166
+ ### Basic conversion
167
+
168
+ ```bash
169
+ codemeld ./my-html-site ./my-react-app
170
+ ```
171
+
172
+ ### Convert with CSS Modules
173
+
174
+ ```bash
175
+ codemeld ./site ./app --css-modules
176
+ ```
177
+
178
+ Each component gets its own `.module.css` file with scoped class names.
179
+
180
+ ### Convert with build verification
181
+
182
+ ```bash
183
+ codemeld ./site ./app --verify
184
+ ```
185
+
186
+ After conversion, automatically runs `npm install` and `vite build` to confirm the output compiles without errors.
187
+
188
+ ### Convert with AI refinement
189
+
190
+ ```bash
191
+ codemeld ./site ./app --ai --verify
192
+ ```
193
+
194
+ After the initial conversion, an AI agent analyzes build errors and TypeScript issues, then iteratively fixes them. Modes:
195
+
196
+ - `full` — Fix build errors, then enhance component quality
197
+ - `build-fix` — Only fix build/TypeScript errors
198
+ - `enhance` — Only improve code quality (assumes it already builds)
199
+ - `visual` — Focus on visual fidelity with the original
200
+
201
+ ```bash
202
+ # Only fix build errors, up to 20 iterations
203
+ codemeld ./site ./app --ai --ai-mode build-fix --ai-max-steps 20
204
+
205
+ # Full refinement with verbose logging
206
+ codemeld ./site ./app --ai --ai-verbose
207
+ ```
208
+
209
+ ### Convert and compare visually
210
+
211
+ ```bash
212
+ codemeld ./site ./app --verify --visual-compare
213
+ ```
214
+
215
+ Takes Playwright screenshots of the original HTML site and the converted Vite app side by side.
216
+
217
+ ### Keep everything in one component
218
+
219
+ ```bash
220
+ codemeld ./site ./app --no-extract
221
+ ```
222
+
223
+ Disables smart component extraction — the entire page is kept as a single React component.
224
+
225
+ ### Custom project name
226
+
227
+ ```bash
228
+ codemeld ./site ./app --name "My Dashboard"
229
+ ```
230
+
231
+ ### Target a different framework
232
+
233
+ ```bash
234
+ codemeld ./site ./app --framework vue
235
+ codemeld ./site ./app --framework nextjs
236
+ codemeld ./site ./app --framework svelte
237
+ codemeld ./site ./app --framework angular
238
+ ```
239
+
240
+ ### Disable Tailwind detection
241
+
242
+ ```bash
243
+ codemeld ./site ./app --tailwind disable
244
+ ```
245
+
246
+ ### Convert a multi-page site
247
+
248
+ If your input directory contains multiple `.html` files:
249
+
250
+ ```bash
251
+ my-site/
252
+ ├── index.html
253
+ ├── about.html
254
+ ├── contact.html
255
+ ├── styles.css
256
+ └── script.js
257
+ ```
258
+
259
+ ```bash
260
+ codemeld ./my-site ./my-app
261
+ ```
262
+
263
+ Each HTML file becomes a React component, and React Router is configured automatically:
264
+
265
+ - `index.html` → `/`
266
+ - `about.html` → `/about`
267
+ - `contact.html` → `/contact`
268
+
269
+ ### Enable all extras
270
+
271
+ ```bash
272
+ codemeld ./site ./app --all-extras --verify
273
+ ```
274
+
275
+ Generates tests, deployment configs, SEO files, accessibility enhancements, performance optimizations, form handling, and TypeScript types.
276
+
277
+ ## What Gets Converted
278
+
279
+ ### HTML to React Components
280
+
281
+ | HTML | React/JSX |
282
+ |------|-----------|
283
+ | `class="foo"` | `className="foo"` |
284
+ | `for="input"` | `htmlFor="input"` |
285
+ | `tabindex="0"` | `tabIndex="0"` |
286
+ | `readonly` | `readOnly` |
287
+ | `<img src="x">` | `<img src="x" />` |
288
+ | `<br>` | `<br />` |
289
+ | `style="color: red; font-size: 14px"` | `style={{color: 'red', fontSize: '14px'}}` |
290
+ | `onclick="fn()"` | `onClick={() => { fn() }}` |
291
+ | `onsubmit="handleSubmit(event)"` | `onSubmit={(e) => { handleSubmit(e) }}` |
292
+ | `<!-- comment -->` | `{/* comment */}` |
293
+ | `checked` (boolean) | `defaultChecked` |
294
+ | `<option selected>` | `<select defaultValue="...">` |
295
+ | Text with `{ braces }` | Text with `&#123; braces &#125;` |
296
+
297
+ ### JavaScript to React Patterns
298
+
299
+ | Vanilla JS | React |
300
+ |-----------|-------|
301
+ | `let count = 0; count = 1;` | `const [count, setCount] = useState(0)` |
302
+ | `DOMContentLoaded` handler | `useEffect(() => {...}, [])` |
303
+ | `addEventListener('click', ...)` | `onClick={handler}` |
304
+ | `element.classList.toggle('active')` | `const [isActive, setIsActive] = useState(false)` |
305
+ | `element.style.display = 'none'` | State-driven conditional rendering |
306
+ | `element.textContent = 'Hello'` | State-driven text content |
307
+ | `document.getElementById('x').value` | `new FormData(e.currentTarget).get('x')` |
308
+ | `this.reset()` | `(e.target as HTMLFormElement).reset()` |
309
+ | `setInterval(fn, 1000)` | `useInterval(fn, 1000)` custom hook |
310
+ | `setTimeout(fn, 500)` | `useTimeout(fn, 500)` custom hook |
311
+ | `fetch('/api/data')` | `useFetch('/api/data')` custom hook |
312
+ | `localStorage.getItem('key')` | `useLocalStorage('key', default)` custom hook |
313
+
314
+ ### SVG Attributes
315
+
316
+ All hyphenated SVG attributes are converted to their camelCase JSX equivalents:
317
+
318
+ `stroke-width` → `strokeWidth`, `fill-opacity` → `fillOpacity`, `clip-path` → `clipPath`, etc.
319
+
320
+ ### Event Handler Types
321
+
322
+ Generated handlers include proper TypeScript event types:
323
+
324
+ | Event | Type |
325
+ |-------|------|
326
+ | `onSubmit` | `React.FormEvent<HTMLFormElement>` |
327
+ | `onChange` | `React.ChangeEvent<HTMLInputElement>` |
328
+ | `onClick` | `React.MouseEvent<HTMLElement>` |
329
+ | `onKeyDown` | `React.KeyboardEvent<HTMLElement>` |
330
+ | `onFocus` | `React.FocusEvent<HTMLElement>` |
331
+ | `onBlur` | `React.FocusEvent<HTMLElement>` |
332
+ | `onInput` | `React.FormEvent<HTMLInputElement>` |
333
+
334
+ ## Output Project Structure
335
+
336
+ ### Single-page site
337
+
338
+ ```
339
+ output/
340
+ ├── index.html
341
+ ├── package.json
342
+ ├── tsconfig.json
343
+ ├── tsconfig.node.json
344
+ ├── vite.config.ts
345
+ ├── .gitignore
346
+ ├── public/
347
+ │ └── (fonts, other assets)
348
+ └── src/
349
+ ├── main.tsx
350
+ ├── App.tsx
351
+ ├── vite-env.d.ts
352
+ ├── assets/
353
+ │ └── (images)
354
+ ├── components/
355
+ │ ├── index.tsx # Main page component
356
+ │ ├── index.css # Page styles
357
+ │ ├── nav.tsx # Extracted <nav> component
358
+ │ ├── footer.tsx # Extracted <footer> component
359
+ │ ├── hero-section.tsx # Extracted <section> components
360
+ │ └── ...
361
+ ├── hooks/
362
+ │ ├── useInterval.ts # Generated if setInterval detected
363
+ │ ├── useTimeout.ts # Generated if setTimeout detected
364
+ │ ├── useFetch.ts # Generated if fetch() detected
365
+ │ └── useLocalStorage.ts # Generated if localStorage detected
366
+ └── styles/
367
+ └── global.css
368
+ ```
369
+
370
+ ### Multi-page site
371
+
372
+ ```
373
+ output/
374
+ └── src/
375
+ ├── main.tsx
376
+ ├── App.tsx # React Router setup
377
+ └── components/
378
+ ├── index.tsx # Home page (/)
379
+ ├── index.css
380
+ ├── about.tsx # About page (/about)
381
+ ├── about.css
382
+ ├── contact.tsx # Contact page (/contact)
383
+ └── contact.css
384
+ ```
385
+
386
+ ## Programmatic API
387
+
388
+ ```typescript
389
+ import { convert } from 'codemeld';
390
+
391
+ const result = await convert({
392
+ input: './my-html-site',
393
+ output: './my-react-app',
394
+ cssModules: false,
395
+ verify: true,
396
+ extractComponents: true,
397
+ prettier: true,
398
+ tailwind: 'auto',
399
+ framework: 'react',
400
+ });
401
+
402
+ console.log(result.components); // ['Index', 'Nav', 'Footer', 'HeroSection']
403
+ console.log(result.buildSuccess); // true
404
+ console.log(result.errors); // []
405
+ console.log(result.warnings); // ['Some CSS property not supported...']
406
+ ```
407
+
408
+ ### Options
409
+
410
+ ```typescript
411
+ interface ConversionOptions {
412
+ input: string; // Source directory path
413
+ output: string; // Output directory path
414
+ componentName?: string; // Custom component name
415
+ cssModules?: boolean; // Use CSS Modules (default: false)
416
+ preserveStructure?: boolean; // Keep original file structure (default: false)
417
+ verify?: boolean; // Run build verification (default: false)
418
+ extractComponents?: boolean; // Smart component extraction (default: true)
419
+ prettier?: boolean; // Format with Prettier (default: true)
420
+ tailwind?: 'auto' | 'force' | 'disable'; // Tailwind handling (default: 'auto')
421
+ framework?: 'react' | 'nextjs' | 'vue' | 'svelte' | 'angular'; // Target framework
422
+ }
423
+ ```
424
+
425
+ ### Result
426
+
427
+ ```typescript
428
+ interface ConversionResult {
429
+ outputDir: string; // Path to generated project
430
+ components: string[]; // List of generated component names
431
+ assets: string[]; // List of copied asset files
432
+ buildSuccess: boolean; // Whether build verification passed
433
+ errors: string[]; // Any errors encountered
434
+ warnings: string[]; // Non-fatal warnings
435
+ }
436
+ ```
437
+
438
+ ## Testing
439
+
440
+ ```bash
441
+ # Run unit tests
442
+ npm test
443
+
444
+ # Run visual comparison tests (requires Playwright)
445
+ npx playwright install chromium
446
+ npm run test:visual
447
+ ```
448
+
449
+ ## Development
450
+
451
+ ```bash
452
+ git clone https://github.com/hansade2005/html-to-vite-react.git
453
+ cd html-to-vite-react
454
+ npm install
455
+ npm run build
456
+ npm run dev # watch mode
457
+ ```
458
+
459
+ ## Architecture
460
+
461
+ ```
462
+ src/
463
+ ├── cli.ts # CLI entry point (Commander)
464
+ ├── converter.ts # Main conversion pipeline orchestrator
465
+ ├── deconverter.ts # Reverse conversion pipeline
466
+ ├── index.ts # Public API exports
467
+ ├── types.ts # TypeScript interfaces
468
+ ├── parsers/
469
+ │ ├── html-parser.ts # HTML parsing & JSX conversion (Cheerio)
470
+ │ ├── css-processor.ts # CSS processing & modules (css-tree)
471
+ │ ├── js-analyzer.ts # JavaScript analysis & React conversion
472
+ │ ├── js-resolver.ts # JS file resolution & bundling
473
+ │ ├── framework-parser.ts # Reverse: parse React/Vue/Svelte/Angular back to data
474
+ │ └── tailwind-detector.ts # Tailwind CSS detection & config
475
+ ├── generators/
476
+ │ ├── component-generator.ts # React component code generation
477
+ │ ├── component-extractor.ts # Smart component extraction by section
478
+ │ ├── scaffolder.ts # Vite project scaffolding
479
+ │ ├── router-generator.ts # React Router setup for multi-page
480
+ │ ├── hooks-generator.ts # Custom React hooks generation
481
+ │ ├── html-generator.ts # Reverse: generate static HTML/CSS/JS
482
+ │ ├── asset-handler.ts # Asset discovery & copying
483
+ │ ├── seo-generator.ts # SEO file generation
484
+ │ ├── error-boundary.ts # Error boundary component
485
+ │ └── build-verifier.ts # Build verification runner
486
+ ├── ai/
487
+ │ ├── agent.ts # AI API client (native fetch, retry)
488
+ │ ├── refinement-loop.ts # AI-powered build fix & enhancement loop
489
+ │ ├── visual-compare.ts # Playwright screenshot comparison
490
+ │ ├── prompts.ts # AI system prompts
491
+ │ └── index.ts # AI module exports
492
+ ├── tui/
493
+ │ ├── chat.ts # Interactive AI chat TUI
494
+ │ ├── input.ts # Terminal input handling & clipboard
495
+ │ ├── renderer.ts # Terminal UI rendering
496
+ │ ├── design-guide.ts # Design guide generator
497
+ │ └── tools.ts # Chat tool definitions
498
+ └── utils/
499
+ ├── naming.ts # Name conversion utilities (kebab, pascal)
500
+ ├── config.ts # Configuration file loader
501
+ ├── formatter.ts # Prettier formatting
502
+ ├── report.ts # Conversion report generator
503
+ └── logger.ts # Colored console output
504
+ ```
505
+
506
+ ## Requirements
507
+
508
+ - Node.js >= 18.0.0
509
+ - For `--visual-compare`: Playwright (`npx playwright install chromium`)
510
+ - For `--ai`: API key configured for AI refinement
511
+
512
+ ## License
513
+
514
+ MIT
package/bin/cli.js ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ import '../dist/cli.js';
@@ -0,0 +1,124 @@
1
+ /**
2
+ * AI Agent Client — OpenAI-compatible chat completions wrapper
3
+ * Uses the3rdacademy.com/api/chat/completions (no API key required)
4
+ * Uses native Node.js fetch — no curl dependency, no timeouts from external processes.
5
+ */
6
+ export interface ChatMessage {
7
+ role: 'system' | 'user' | 'assistant' | 'tool';
8
+ content: string | null;
9
+ tool_calls?: ToolCall[];
10
+ tool_call_id?: string;
11
+ name?: string;
12
+ }
13
+ export interface ToolCall {
14
+ id: string;
15
+ type: 'function';
16
+ function: {
17
+ name: string;
18
+ arguments: string;
19
+ };
20
+ }
21
+ export interface ToolDefinition {
22
+ type: 'function';
23
+ function: {
24
+ name: string;
25
+ description: string;
26
+ parameters: Record<string, unknown>;
27
+ };
28
+ }
29
+ export interface ChatCompletionRequest {
30
+ messages: ChatMessage[];
31
+ model?: string;
32
+ max_tokens?: number;
33
+ temperature?: number;
34
+ stream?: boolean;
35
+ tools?: ToolDefinition[];
36
+ tool_choice?: unknown;
37
+ multistep?: boolean;
38
+ max_steps?: number;
39
+ direct_kilo?: boolean;
40
+ }
41
+ export interface ChatCompletionChoice {
42
+ index: number;
43
+ message: ChatMessage;
44
+ finish_reason: 'stop' | 'tool_calls';
45
+ }
46
+ export interface ChatCompletionResponse {
47
+ id: string;
48
+ object: string;
49
+ created: number;
50
+ model: string;
51
+ choices: ChatCompletionChoice[];
52
+ usage: {
53
+ prompt_tokens: number;
54
+ completion_tokens: number;
55
+ total_tokens: number;
56
+ };
57
+ _meta?: {
58
+ internal_tool_calls: number;
59
+ tools_used: string[];
60
+ };
61
+ }
62
+ export interface StreamDelta {
63
+ content?: string;
64
+ tool_calls?: Array<{
65
+ index: number;
66
+ id?: string;
67
+ type?: string;
68
+ function?: {
69
+ name?: string;
70
+ arguments?: string;
71
+ };
72
+ }>;
73
+ custom_status?: {
74
+ type: 'tool_start' | 'tool_done';
75
+ name: string;
76
+ arguments?: Record<string, unknown>;
77
+ };
78
+ }
79
+ export interface StreamChunk {
80
+ id: string;
81
+ object: string;
82
+ created: number;
83
+ model: string;
84
+ choices: Array<{
85
+ index: number;
86
+ delta: StreamDelta;
87
+ finish_reason: string | null;
88
+ }>;
89
+ }
90
+ export type StreamCallback = (event: {
91
+ type: 'token' | 'tool_start' | 'tool_done' | 'tool_calls' | 'done' | 'error';
92
+ content?: string;
93
+ toolName?: string;
94
+ toolCalls?: ToolCall[];
95
+ error?: string;
96
+ }) => void;
97
+ /**
98
+ * Truncate a tool result to prevent bloating the conversation payload.
99
+ */
100
+ export declare function truncateToolResult(result: string, maxLen?: number): string;
101
+ /**
102
+ * Send a non-streaming chat completion request.
103
+ * Retries up to 3 times on server-side gateway errors with exponential backoff.
104
+ */
105
+ export declare function chatCompletion(request: ChatCompletionRequest): Promise<ChatCompletionResponse>;
106
+ /**
107
+ * Send a streaming chat completion request.
108
+ * Returns accumulated content and any tool calls.
109
+ */
110
+ export declare function chatCompletionStream(request: ChatCompletionRequest, onEvent?: StreamCallback): Promise<{
111
+ content: string;
112
+ toolCalls: ToolCall[];
113
+ finishReason: string;
114
+ }>;
115
+ /**
116
+ * Run a full agent loop: send messages, execute tool calls, repeat until done.
117
+ */
118
+ export declare function agentLoop(systemPrompt: string, userMessage: string, tools: ToolDefinition[], toolExecutor: (name: string, args: Record<string, unknown>) => Promise<string>, options?: {
119
+ maxSteps?: number;
120
+ temperature?: number;
121
+ onEvent?: StreamCallback;
122
+ onStep?: (step: number, maxSteps: number, action: string) => void;
123
+ }): Promise<string>;
124
+ //# sourceMappingURL=agent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/ai/agent.ts"],"names":[],"mappings":"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"}