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
@@ -0,0 +1,180 @@
1
+ /**
2
+ * AI Refinement Loop — Orchestrates the build→fix→verify cycle.
3
+ * This is the main entry point for AI-enhanced conversion.
4
+ */
5
+ import { readdir } from 'fs/promises';
6
+ import { join } from 'path';
7
+ import { execFile } from 'child_process';
8
+ import { promisify } from 'util';
9
+ import chalk from 'chalk';
10
+ import ora from 'ora';
11
+ import { agentLoop } from './agent.js';
12
+ import { toolDefinitions, createToolExecutor } from './tools.js';
13
+ import { FULL_REFINEMENT_PROMPT, BUILD_FIXER_PROMPT, buildUserMessage } from './prompts.js';
14
+ const execFileAsync = promisify(execFile);
15
+ const SHELL_OPTS = { shell: true };
16
+ /**
17
+ * Run the AI refinement loop on a converted project.
18
+ */
19
+ export async function runRefinement(options) {
20
+ const { inputDir, outputDir, maxSteps = 50, mode = 'full', verbose = false, } = options;
21
+ const spinner = ora({ text: 'AI agent starting...', color: 'cyan' }).start();
22
+ const fixesApplied = [];
23
+ const remainingIssues = [];
24
+ // Gather project context
25
+ spinner.text = 'Gathering project context...';
26
+ const originalFiles = await listFilesRecursive(inputDir, ['.html', '.js', '.css', '.json']);
27
+ const componentFiles = await listFilesRecursive(join(outputDir, 'src'), ['.tsx', '.ts', '.css']);
28
+ // Get initial build/type errors
29
+ const typeErrors = await runTypeCheck(outputDir);
30
+ const buildErrors = await runBuild(outputDir);
31
+ // Select system prompt based on mode
32
+ const systemPrompt = mode === 'build-fix' ? BUILD_FIXER_PROMPT : FULL_REFINEMENT_PROMPT;
33
+ // Build user message with context
34
+ const userMessage = buildUserMessage({
35
+ inputDir,
36
+ outputDir,
37
+ originalFiles: originalFiles.map(f => f.replace(inputDir + '/', '')),
38
+ componentFiles: componentFiles.map(f => f.replace(outputDir + '/', '')),
39
+ buildErrors: buildErrors.success ? undefined : buildErrors.output,
40
+ typeErrors: typeErrors.success ? undefined : typeErrors.output,
41
+ });
42
+ // Create tool executor
43
+ const toolCtx = {
44
+ outputDir,
45
+ inputDir,
46
+ onStatus: (msg) => {
47
+ if (verbose) {
48
+ spinner.stop();
49
+ console.log(chalk.dim(msg));
50
+ spinner.start();
51
+ }
52
+ // Track fixes from status reports
53
+ if (msg.includes('Fixes applied:')) {
54
+ const lines = msg.split('\n').filter(l => l.trim().startsWith('- '));
55
+ fixesApplied.push(...lines.map(l => l.trim().replace(/^- /, '')));
56
+ }
57
+ if (msg.includes('Remaining issues:')) {
58
+ const lines = msg.split('\n').filter(l => l.trim().startsWith('- '));
59
+ remainingIssues.push(...lines.map(l => l.trim().replace(/^- /, '')));
60
+ }
61
+ },
62
+ };
63
+ const toolExecutor = createToolExecutor(toolCtx);
64
+ // Run the agent loop
65
+ spinner.text = 'AI agent analyzing and fixing issues...';
66
+ let aiResponse;
67
+ try {
68
+ aiResponse = await agentLoop(systemPrompt, userMessage, toolDefinitions, toolExecutor, {
69
+ maxSteps,
70
+ temperature: 0.3,
71
+ onStep: (step, max, action) => {
72
+ spinner.text = `AI agent [${step}/${max}]: ${action}`;
73
+ },
74
+ onEvent: (event) => {
75
+ if (verbose && event.type === 'token' && event.content) {
76
+ process.stdout.write(chalk.dim(event.content));
77
+ }
78
+ if (event.type === 'tool_start' && event.toolName) {
79
+ spinner.text = `AI using built-in tool: ${event.toolName}...`;
80
+ }
81
+ },
82
+ });
83
+ }
84
+ catch (err) {
85
+ const errorMsg = err instanceof Error ? err.message : String(err);
86
+ spinner.fail(`AI agent encountered an error: ${errorMsg}`);
87
+ if (verbose) {
88
+ console.error(chalk.red(err instanceof Error ? err.stack || errorMsg : errorMsg));
89
+ }
90
+ return {
91
+ success: false,
92
+ buildPassed: false,
93
+ fixesApplied,
94
+ remainingIssues: [errorMsg],
95
+ aiResponse: `Error: ${errorMsg}`,
96
+ };
97
+ }
98
+ // Final build verification
99
+ spinner.text = 'Final build verification...';
100
+ const finalBuild = await runBuild(outputDir);
101
+ if (finalBuild.success) {
102
+ spinner.succeed(chalk.green('AI refinement complete — build passes!'));
103
+ }
104
+ else {
105
+ spinner.warn(chalk.yellow('AI refinement complete — some issues may remain'));
106
+ }
107
+ // Print summary
108
+ if (fixesApplied.length > 0) {
109
+ console.log(chalk.cyan('\n Fixes applied:'));
110
+ for (const fix of fixesApplied) {
111
+ console.log(chalk.green(` ✓ ${fix}`));
112
+ }
113
+ }
114
+ if (remainingIssues.length > 0) {
115
+ console.log(chalk.yellow('\n Remaining issues:'));
116
+ for (const issue of remainingIssues) {
117
+ console.log(chalk.yellow(` ⚠ ${issue}`));
118
+ }
119
+ }
120
+ return {
121
+ success: finalBuild.success,
122
+ buildPassed: finalBuild.success,
123
+ fixesApplied,
124
+ remainingIssues,
125
+ screenshots: {
126
+ original: options.screenshotOriginal,
127
+ converted: options.screenshotConverted,
128
+ },
129
+ aiResponse,
130
+ };
131
+ }
132
+ // ─── Helpers ─────────────────────────────────────────────────────────
133
+ async function listFilesRecursive(dir, extensions) {
134
+ const results = [];
135
+ try {
136
+ const entries = await readdir(dir, { withFileTypes: true });
137
+ for (const entry of entries) {
138
+ const fullPath = join(dir, entry.name);
139
+ if (entry.isDirectory() && !entry.name.startsWith('.') && entry.name !== 'node_modules' && entry.name !== 'dist') {
140
+ results.push(...await listFilesRecursive(fullPath, extensions));
141
+ }
142
+ else if (entry.isFile() && extensions.some(ext => entry.name.endsWith(ext))) {
143
+ results.push(fullPath);
144
+ }
145
+ }
146
+ }
147
+ catch {
148
+ // Directory doesn't exist or isn't readable
149
+ }
150
+ return results;
151
+ }
152
+ async function runTypeCheck(outputDir) {
153
+ try {
154
+ const { stdout, stderr } = await execFileAsync('npx', ['tsc', '--noEmit'], {
155
+ cwd: outputDir,
156
+ timeout: 60_000,
157
+ ...SHELL_OPTS,
158
+ });
159
+ return { success: true, output: `${stdout}\n${stderr}`.trim() };
160
+ }
161
+ catch (err) {
162
+ const errObj = err;
163
+ return { success: false, output: `${errObj.stdout || ''}\n${errObj.stderr || ''}`.trim() };
164
+ }
165
+ }
166
+ async function runBuild(outputDir) {
167
+ try {
168
+ const { stdout, stderr } = await execFileAsync('npx', ['vite', 'build'], {
169
+ cwd: outputDir,
170
+ timeout: 60_000,
171
+ ...SHELL_OPTS,
172
+ });
173
+ return { success: true, output: `${stdout}\n${stderr}`.trim() };
174
+ }
175
+ catch (err) {
176
+ const errObj = err;
177
+ return { success: false, output: `${errObj.stdout || ''}\n${errObj.stderr || ''}`.trim() };
178
+ }
179
+ }
180
+ //# sourceMappingURL=refinement-loop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refinement-loop.js","sourceRoot":"","sources":["../../src/ai/refinement-loop.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * AI Agent Tools — file I/O, build commands, and screenshot capabilities
3
+ * These tools are provided to the AI agent so it can read/modify files,
4
+ * run builds, and take screenshots autonomously.
5
+ */
6
+ import type { ToolDefinition } from './agent.js';
7
+ export declare const toolDefinitions: ToolDefinition[];
8
+ export interface ToolContext {
9
+ outputDir: string;
10
+ inputDir: string;
11
+ onStatus?: (message: string) => void;
12
+ }
13
+ /**
14
+ * Create a tool executor function bound to a specific project context.
15
+ */
16
+ export declare function createToolExecutor(ctx: ToolContext): (name: string, args: Record<string, unknown>) => Promise<string>;
17
+ //# sourceMappingURL=tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/ai/tools.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AASjD,eAAO,MAAM,eAAe,EAAE,cAAc,EAiL3C,CAAC;AAIF,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACtC;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,WAAW,IAGf,MAAM,MAAM,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAG,OAAO,CAAC,MAAM,CAAC,CA+GhG"}
@@ -0,0 +1,353 @@
1
+ /**
2
+ * AI Agent Tools — file I/O, build commands, and screenshot capabilities
3
+ * These tools are provided to the AI agent so it can read/modify files,
4
+ * run builds, and take screenshots autonomously.
5
+ */
6
+ import { readFile, writeFile, readdir } from 'fs/promises';
7
+ import { join } from 'path';
8
+ import { execFile } from 'child_process';
9
+ import { promisify } from 'util';
10
+ const execFileAsync = promisify(execFile);
11
+ // On Windows, npm/npx are .cmd scripts and require shell: true
12
+ const SHELL_OPTS = { shell: true };
13
+ // ─── Tool Definitions (sent to AI API) ───────────────────────────────
14
+ export const toolDefinitions = [
15
+ {
16
+ type: 'function',
17
+ function: {
18
+ name: 'read_file',
19
+ description: 'Read the contents of a file in the converted React project. Use this to examine component code, config files, or build output.',
20
+ parameters: {
21
+ type: 'object',
22
+ properties: {
23
+ path: {
24
+ type: 'string',
25
+ description: 'Relative path from the project root (e.g., "src/components/index.tsx", "tsconfig.json")',
26
+ },
27
+ },
28
+ required: ['path'],
29
+ },
30
+ },
31
+ },
32
+ {
33
+ type: 'function',
34
+ function: {
35
+ name: 'write_file',
36
+ description: 'Write or overwrite a file in the converted React project. Use this to fix TypeScript errors, add missing imports, or refactor components.',
37
+ parameters: {
38
+ type: 'object',
39
+ properties: {
40
+ path: {
41
+ type: 'string',
42
+ description: 'Relative path from the project root (e.g., "src/components/index.tsx")',
43
+ },
44
+ content: {
45
+ type: 'string',
46
+ description: 'The full file content to write',
47
+ },
48
+ },
49
+ required: ['path', 'content'],
50
+ },
51
+ },
52
+ },
53
+ {
54
+ type: 'function',
55
+ function: {
56
+ name: 'list_files',
57
+ description: 'List files in a directory of the converted React project. Use this to understand the project structure.',
58
+ parameters: {
59
+ type: 'object',
60
+ properties: {
61
+ path: {
62
+ type: 'string',
63
+ description: 'Relative directory path from the project root (e.g., "src/components", "src")',
64
+ },
65
+ },
66
+ required: ['path'],
67
+ },
68
+ },
69
+ },
70
+ {
71
+ type: 'function',
72
+ function: {
73
+ name: 'run_build',
74
+ description: 'Run "npx vite build" to check if the project compiles. Returns build output including any errors. This is the primary way to verify the project is working.',
75
+ parameters: {
76
+ type: 'object',
77
+ properties: {},
78
+ },
79
+ },
80
+ },
81
+ {
82
+ type: 'function',
83
+ function: {
84
+ name: 'run_typecheck',
85
+ description: 'Run "npx tsc --noEmit" to check for TypeScript type errors. Returns any type errors found. Use this to identify specific issues before fixing them.',
86
+ parameters: {
87
+ type: 'object',
88
+ properties: {},
89
+ },
90
+ },
91
+ },
92
+ {
93
+ type: 'function',
94
+ function: {
95
+ name: 'read_original_file',
96
+ description: 'Read a file from the ORIGINAL HTML project (before conversion). Use this to understand the original code when fixing conversion issues.',
97
+ parameters: {
98
+ type: 'object',
99
+ properties: {
100
+ path: {
101
+ type: 'string',
102
+ description: 'Relative path from the original project root (e.g., "index.html", "script.js", "style.css")',
103
+ },
104
+ },
105
+ required: ['path'],
106
+ },
107
+ },
108
+ },
109
+ {
110
+ type: 'function',
111
+ function: {
112
+ name: 'take_screenshot',
113
+ description: 'Take a screenshot of a locally served web page using Playwright. Returns the screenshot file path. Use this to visually verify the converted app.',
114
+ parameters: {
115
+ type: 'object',
116
+ properties: {
117
+ url: {
118
+ type: 'string',
119
+ description: 'The URL to screenshot (e.g., "http://localhost:3001")',
120
+ },
121
+ output_path: {
122
+ type: 'string',
123
+ description: 'Where to save the screenshot (e.g., "/tmp/screenshot.png")',
124
+ },
125
+ full_page: {
126
+ type: 'boolean',
127
+ description: 'Whether to capture full page or just viewport (default: true)',
128
+ },
129
+ },
130
+ required: ['url', 'output_path'],
131
+ },
132
+ },
133
+ },
134
+ {
135
+ type: 'function',
136
+ function: {
137
+ name: 'serve_and_screenshot',
138
+ description: 'Serve a directory as a static site and take a screenshot. Handles server lifecycle automatically. Use this to screenshot the original HTML site or the built React app.',
139
+ parameters: {
140
+ type: 'object',
141
+ properties: {
142
+ directory: {
143
+ type: 'string',
144
+ description: 'Absolute path to the directory to serve (e.g., "/tmp/output/dist" for built React app, "/home/user/project/sample" for original)',
145
+ },
146
+ output_path: {
147
+ type: 'string',
148
+ description: 'Where to save the screenshot (e.g., "/tmp/original-screenshot.png")',
149
+ },
150
+ full_page: {
151
+ type: 'boolean',
152
+ description: 'Whether to capture full page (default: true)',
153
+ },
154
+ },
155
+ required: ['directory', 'output_path'],
156
+ },
157
+ },
158
+ },
159
+ {
160
+ type: 'function',
161
+ function: {
162
+ name: 'report_status',
163
+ description: 'Report the current status of the refinement process. Use this to communicate progress, describe what was fixed, or flag issues that need human attention.',
164
+ parameters: {
165
+ type: 'object',
166
+ properties: {
167
+ status: {
168
+ type: 'string',
169
+ enum: ['in_progress', 'success', 'needs_attention', 'failed'],
170
+ description: 'Current status of the refinement',
171
+ },
172
+ message: {
173
+ type: 'string',
174
+ description: 'Human-readable status message describing what was done or what needs attention',
175
+ },
176
+ fixes_applied: {
177
+ type: 'array',
178
+ items: { type: 'string' },
179
+ description: 'List of fixes applied so far',
180
+ },
181
+ remaining_issues: {
182
+ type: 'array',
183
+ items: { type: 'string' },
184
+ description: 'List of remaining issues that could not be auto-fixed',
185
+ },
186
+ },
187
+ required: ['status', 'message'],
188
+ },
189
+ },
190
+ },
191
+ ];
192
+ /**
193
+ * Create a tool executor function bound to a specific project context.
194
+ */
195
+ export function createToolExecutor(ctx) {
196
+ const { outputDir, inputDir, onStatus } = ctx;
197
+ return async function executeTool(name, args) {
198
+ switch (name) {
199
+ case 'read_file': {
200
+ const filePath = join(outputDir, args.path);
201
+ try {
202
+ const content = await readFile(filePath, 'utf-8');
203
+ return content;
204
+ }
205
+ catch (err) {
206
+ return `Error: File not found: ${args.path}`;
207
+ }
208
+ }
209
+ case 'write_file': {
210
+ const filePath = join(outputDir, args.path);
211
+ try {
212
+ await writeFile(filePath, args.content, 'utf-8');
213
+ onStatus?.(` Wrote: ${args.path}`);
214
+ return `Successfully wrote ${args.path}`;
215
+ }
216
+ catch (err) {
217
+ return `Error writing file: ${err instanceof Error ? err.message : String(err)}`;
218
+ }
219
+ }
220
+ case 'list_files': {
221
+ const dirPath = join(outputDir, args.path || '');
222
+ try {
223
+ const entries = await readdir(dirPath, { withFileTypes: true });
224
+ const listing = entries.map(e => `${e.isDirectory() ? '[dir] ' : ''}${e.name}`).join('\n');
225
+ return listing || '(empty directory)';
226
+ }
227
+ catch (err) {
228
+ return `Error listing directory: ${err instanceof Error ? err.message : String(err)}`;
229
+ }
230
+ }
231
+ case 'run_build': {
232
+ onStatus?.(' Running vite build...');
233
+ try {
234
+ const { stdout, stderr } = await execFileAsync('npx', ['vite', 'build'], {
235
+ cwd: outputDir,
236
+ timeout: 60_000,
237
+ ...SHELL_OPTS,
238
+ });
239
+ return `BUILD SUCCESS\n\nstdout:\n${stdout}\n\nstderr:\n${stderr}`;
240
+ }
241
+ catch (err) {
242
+ const errObj = err;
243
+ return `BUILD FAILED\n\nstdout:\n${errObj.stdout || ''}\n\nstderr:\n${errObj.stderr || ''}\n\nmessage:\n${errObj.message || ''}`;
244
+ }
245
+ }
246
+ case 'run_typecheck': {
247
+ onStatus?.(' Running tsc --noEmit...');
248
+ try {
249
+ const { stdout, stderr } = await execFileAsync('npx', ['tsc', '--noEmit'], {
250
+ cwd: outputDir,
251
+ timeout: 60_000,
252
+ ...SHELL_OPTS,
253
+ });
254
+ return `TYPECHECK PASSED\n\n${stdout}\n${stderr}`;
255
+ }
256
+ catch (err) {
257
+ const errObj = err;
258
+ return `TYPECHECK ERRORS\n\n${errObj.stdout || ''}\n${errObj.stderr || ''}`;
259
+ }
260
+ }
261
+ case 'read_original_file': {
262
+ const filePath = join(inputDir, args.path);
263
+ try {
264
+ const content = await readFile(filePath, 'utf-8');
265
+ return content;
266
+ }
267
+ catch (err) {
268
+ return `Error: Original file not found: ${args.path}`;
269
+ }
270
+ }
271
+ case 'take_screenshot': {
272
+ return await takeScreenshot(args.url, args.output_path, args.full_page ?? true);
273
+ }
274
+ case 'serve_and_screenshot': {
275
+ return await serveAndScreenshot(args.directory, args.output_path, args.full_page ?? true);
276
+ }
277
+ case 'report_status': {
278
+ const status = args.status;
279
+ const message = args.message;
280
+ const fixes = args.fixes_applied || [];
281
+ const remaining = args.remaining_issues || [];
282
+ let report = `[${status.toUpperCase()}] ${message}`;
283
+ if (fixes.length > 0) {
284
+ report += `\n\nFixes applied:\n${fixes.map(f => ` - ${f}`).join('\n')}`;
285
+ }
286
+ if (remaining.length > 0) {
287
+ report += `\n\nRemaining issues:\n${remaining.map(r => ` - ${r}`).join('\n')}`;
288
+ }
289
+ onStatus?.(report);
290
+ return 'Status reported.';
291
+ }
292
+ default:
293
+ return `Error: Unknown tool "${name}"`;
294
+ }
295
+ };
296
+ }
297
+ // ─── Screenshot Helpers ──────────────────────────────────────────────
298
+ async function takeScreenshot(url, outputPath, fullPage = true) {
299
+ try {
300
+ // Dynamic import to avoid requiring playwright when not using screenshots
301
+ const { chromium } = await import('playwright');
302
+ const browser = await chromium.launch({ headless: true });
303
+ const context = await browser.newContext({ viewport: { width: 1440, height: 900 } });
304
+ const page = await context.newPage();
305
+ await page.goto(url, { waitUntil: 'networkidle', timeout: 15000 }).catch(() => { });
306
+ await page.waitForTimeout(2000);
307
+ await page.screenshot({ path: outputPath, fullPage });
308
+ await browser.close();
309
+ return `Screenshot saved to ${outputPath}`;
310
+ }
311
+ catch (err) {
312
+ return `Screenshot failed: ${err instanceof Error ? err.message : String(err)}`;
313
+ }
314
+ }
315
+ async function serveAndScreenshot(directory, outputPath, fullPage = true) {
316
+ const http = await import('http');
317
+ const fs = await import('fs');
318
+ const pathMod = await import('path');
319
+ const MIME_TYPES = {
320
+ '.html': 'text/html', '.css': 'text/css', '.js': 'application/javascript',
321
+ '.json': 'application/json', '.png': 'image/png', '.jpg': 'image/jpeg',
322
+ '.svg': 'image/svg+xml', '.ico': 'image/x-icon', '.woff2': 'font/woff2',
323
+ };
324
+ // Find a free port
325
+ const port = 3050 + Math.floor(Math.random() * 1000);
326
+ return new Promise((resolve) => {
327
+ const server = http.createServer((req, res) => {
328
+ let filePath = pathMod.join(directory, req.url === '/' ? 'index.html' : req.url);
329
+ if (!fs.existsSync(filePath)) {
330
+ filePath = pathMod.join(directory, 'index.html'); // SPA fallback
331
+ }
332
+ try {
333
+ const content = fs.readFileSync(filePath);
334
+ const ext = pathMod.extname(filePath);
335
+ res.writeHead(200, { 'Content-Type': MIME_TYPES[ext] || 'application/octet-stream' });
336
+ res.end(content);
337
+ }
338
+ catch {
339
+ res.writeHead(404);
340
+ res.end('Not found');
341
+ }
342
+ });
343
+ server.listen(port, async () => {
344
+ const result = await takeScreenshot(`http://localhost:${port}`, outputPath, fullPage);
345
+ server.close();
346
+ resolve(result);
347
+ });
348
+ server.on('error', () => {
349
+ resolve(`Error: Could not start server on port ${port}`);
350
+ });
351
+ });
352
+ }
353
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/ai/tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Visual Comparison Module — Uses Playwright to screenshot original and
3
+ * converted sites, then provides the comparison to the AI agent.
4
+ */
5
+ import { type Server } from 'http';
6
+ /**
7
+ * Serve a directory as a static HTTP server.
8
+ * Returns the server and the port it's listening on.
9
+ */
10
+ export declare function serveDirectory(dir: string, port?: number): Promise<{
11
+ server: Server;
12
+ port: number;
13
+ url: string;
14
+ }>;
15
+ /**
16
+ * Take a screenshot of a URL using Playwright.
17
+ */
18
+ export declare function screenshotUrl(url: string, outputPath: string, options?: {
19
+ fullPage?: boolean;
20
+ width?: number;
21
+ height?: number;
22
+ waitMs?: number;
23
+ }): Promise<void>;
24
+ /**
25
+ * Take screenshots of both the original and converted sites.
26
+ * Returns paths to the screenshot files.
27
+ */
28
+ export declare function compareScreenshots(originalDir: string, convertedDistDir: string, outputDir?: string): Promise<{
29
+ originalPath: string;
30
+ convertedPath: string;
31
+ }>;
32
+ /**
33
+ * Build a textual description of the HTML structure for AI comparison.
34
+ * Since we can't send images to this API, we extract the DOM structure
35
+ * for text-based comparison.
36
+ */
37
+ export declare function extractPageStructure(dir: string): Promise<string>;
38
+ /**
39
+ * Compare the DOM structures of original and converted sites.
40
+ * Returns a text summary suitable for sending to the AI agent.
41
+ */
42
+ export declare function buildVisualComparisonContext(originalDir: string, convertedDistDir: string): Promise<string>;
43
+ //# sourceMappingURL=visual-compare.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"visual-compare.d.ts","sourceRoot":"","sources":["../../src/ai/visual-compare.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAgB,KAAK,MAAM,EAAE,MAAM,MAAM,CAAC;AAoBjD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE,MAAU,GAAG,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,CAoCpH;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,GACrF,OAAO,CAAC,IAAI,CAAC,CAaf;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,MAAM,EACnB,gBAAgB,EAAE,MAAM,EACxB,SAAS,GAAE,MAAe,GACzB,OAAO,CAAC;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,CAAC,CAuB1D;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,CACxC,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,MAAM,CAAC,CAkDjB;AAED;;;GAGG;AACH,wBAAsB,4BAA4B,CAChD,WAAW,EAAE,MAAM,EACnB,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC,MAAM,CAAC,CAiBjB"}