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.
- package/README.md +514 -0
- package/bin/cli.js +2 -0
- package/dist/ai/agent.d.ts +124 -0
- package/dist/ai/agent.d.ts.map +1 -0
- package/dist/ai/agent.js +289 -0
- package/dist/ai/agent.js.map +1 -0
- package/dist/ai/index.d.ts +10 -0
- package/dist/ai/index.d.ts.map +1 -0
- package/dist/ai/index.js +10 -0
- package/dist/ai/index.js.map +1 -0
- package/dist/ai/prompts.d.ts +35 -0
- package/dist/ai/prompts.d.ts.map +1 -0
- package/dist/ai/prompts.js +166 -0
- package/dist/ai/prompts.js.map +1 -0
- package/dist/ai/refinement-loop.d.ts +29 -0
- package/dist/ai/refinement-loop.d.ts.map +1 -0
- package/dist/ai/refinement-loop.js +180 -0
- package/dist/ai/refinement-loop.js.map +1 -0
- package/dist/ai/tools.d.ts +17 -0
- package/dist/ai/tools.d.ts.map +1 -0
- package/dist/ai/tools.js +353 -0
- package/dist/ai/tools.js.map +1 -0
- package/dist/ai/visual-compare.d.ts +43 -0
- package/dist/ai/visual-compare.d.ts.map +1 -0
- package/dist/ai/visual-compare.js +176 -0
- package/dist/ai/visual-compare.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +179 -0
- package/dist/cli.js.map +1 -0
- package/dist/converter.d.ts +10 -0
- package/dist/converter.d.ts.map +1 -0
- package/dist/converter.js +836 -0
- package/dist/converter.js.map +1 -0
- package/dist/deconverter.d.ts +19 -0
- package/dist/deconverter.d.ts.map +1 -0
- package/dist/deconverter.js +188 -0
- package/dist/deconverter.js.map +1 -0
- package/dist/frameworks/angular-adapter.d.ts +27 -0
- package/dist/frameworks/angular-adapter.d.ts.map +1 -0
- package/dist/frameworks/angular-adapter.js +617 -0
- package/dist/frameworks/angular-adapter.js.map +1 -0
- package/dist/frameworks/index.d.ts +10 -0
- package/dist/frameworks/index.d.ts.map +1 -0
- package/dist/frameworks/index.js +21 -0
- package/dist/frameworks/index.js.map +1 -0
- package/dist/frameworks/nextjs-adapter.d.ts +22 -0
- package/dist/frameworks/nextjs-adapter.d.ts.map +1 -0
- package/dist/frameworks/nextjs-adapter.js +392 -0
- package/dist/frameworks/nextjs-adapter.js.map +1 -0
- package/dist/frameworks/react-adapter.d.ts +21 -0
- package/dist/frameworks/react-adapter.d.ts.map +1 -0
- package/dist/frameworks/react-adapter.js +71 -0
- package/dist/frameworks/react-adapter.js.map +1 -0
- package/dist/frameworks/svelte-adapter.d.ts +27 -0
- package/dist/frameworks/svelte-adapter.d.ts.map +1 -0
- package/dist/frameworks/svelte-adapter.js +519 -0
- package/dist/frameworks/svelte-adapter.js.map +1 -0
- package/dist/frameworks/types.d.ts +78 -0
- package/dist/frameworks/types.d.ts.map +1 -0
- package/dist/frameworks/types.js +2 -0
- package/dist/frameworks/types.js.map +1 -0
- package/dist/frameworks/vue-adapter.d.ts +34 -0
- package/dist/frameworks/vue-adapter.d.ts.map +1 -0
- package/dist/frameworks/vue-adapter.js +632 -0
- package/dist/frameworks/vue-adapter.js.map +1 -0
- package/dist/generators/accessibility-generator.d.ts +43 -0
- package/dist/generators/accessibility-generator.d.ts.map +1 -0
- package/dist/generators/accessibility-generator.js +507 -0
- package/dist/generators/accessibility-generator.js.map +1 -0
- package/dist/generators/asset-handler.d.ts +14 -0
- package/dist/generators/asset-handler.d.ts.map +1 -0
- package/dist/generators/asset-handler.js +79 -0
- package/dist/generators/asset-handler.js.map +1 -0
- package/dist/generators/build-verifier.d.ts +8 -0
- package/dist/generators/build-verifier.d.ts.map +1 -0
- package/dist/generators/build-verifier.js +64 -0
- package/dist/generators/build-verifier.js.map +1 -0
- package/dist/generators/component-extractor.d.ts +25 -0
- package/dist/generators/component-extractor.d.ts.map +1 -0
- package/dist/generators/component-extractor.js +146 -0
- package/dist/generators/component-extractor.js.map +1 -0
- package/dist/generators/component-generator.d.ts +12 -0
- package/dist/generators/component-generator.d.ts.map +1 -0
- package/dist/generators/component-generator.js +724 -0
- package/dist/generators/component-generator.js.map +1 -0
- package/dist/generators/deploy-generator.d.ts +9 -0
- package/dist/generators/deploy-generator.d.ts.map +1 -0
- package/dist/generators/deploy-generator.js +409 -0
- package/dist/generators/deploy-generator.js.map +1 -0
- package/dist/generators/error-boundary.d.ts +5 -0
- package/dist/generators/error-boundary.d.ts.map +1 -0
- package/dist/generators/error-boundary.js +59 -0
- package/dist/generators/error-boundary.js.map +1 -0
- package/dist/generators/form-generator.d.ts +42 -0
- package/dist/generators/form-generator.d.ts.map +1 -0
- package/dist/generators/form-generator.js +662 -0
- package/dist/generators/form-generator.js.map +1 -0
- package/dist/generators/hooks-generator.d.ts +40 -0
- package/dist/generators/hooks-generator.d.ts.map +1 -0
- package/dist/generators/hooks-generator.js +297 -0
- package/dist/generators/hooks-generator.js.map +1 -0
- package/dist/generators/html-generator.d.ts +27 -0
- package/dist/generators/html-generator.d.ts.map +1 -0
- package/dist/generators/html-generator.js +772 -0
- package/dist/generators/html-generator.js.map +1 -0
- package/dist/generators/jquery-converter.d.ts +41 -0
- package/dist/generators/jquery-converter.d.ts.map +1 -0
- package/dist/generators/jquery-converter.js +594 -0
- package/dist/generators/jquery-converter.js.map +1 -0
- package/dist/generators/pattern-implementer.d.ts +26 -0
- package/dist/generators/pattern-implementer.d.ts.map +1 -0
- package/dist/generators/pattern-implementer.js +336 -0
- package/dist/generators/pattern-implementer.js.map +1 -0
- package/dist/generators/performance-generator.d.ts +51 -0
- package/dist/generators/performance-generator.d.ts.map +1 -0
- package/dist/generators/performance-generator.js +428 -0
- package/dist/generators/performance-generator.js.map +1 -0
- package/dist/generators/router-generator.d.ts +21 -0
- package/dist/generators/router-generator.d.ts.map +1 -0
- package/dist/generators/router-generator.js +178 -0
- package/dist/generators/router-generator.js.map +1 -0
- package/dist/generators/scaffolder.d.ts +28 -0
- package/dist/generators/scaffolder.d.ts.map +1 -0
- package/dist/generators/scaffolder.js +266 -0
- package/dist/generators/scaffolder.js.map +1 -0
- package/dist/generators/seo-generator.d.ts +29 -0
- package/dist/generators/seo-generator.d.ts.map +1 -0
- package/dist/generators/seo-generator.js +223 -0
- package/dist/generators/seo-generator.js.map +1 -0
- package/dist/generators/test-generator.d.ts +19 -0
- package/dist/generators/test-generator.d.ts.map +1 -0
- package/dist/generators/test-generator.js +398 -0
- package/dist/generators/test-generator.js.map +1 -0
- package/dist/generators/type-generator.d.ts +33 -0
- package/dist/generators/type-generator.d.ts.map +1 -0
- package/dist/generators/type-generator.js +663 -0
- package/dist/generators/type-generator.js.map +1 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/parsers/css-processor.d.ts +23 -0
- package/dist/parsers/css-processor.d.ts.map +1 -0
- package/dist/parsers/css-processor.js +129 -0
- package/dist/parsers/css-processor.js.map +1 -0
- package/dist/parsers/framework-parser.d.ts +48 -0
- package/dist/parsers/framework-parser.d.ts.map +1 -0
- package/dist/parsers/framework-parser.js +770 -0
- package/dist/parsers/framework-parser.js.map +1 -0
- package/dist/parsers/html-parser.d.ts +12 -0
- package/dist/parsers/html-parser.d.ts.map +1 -0
- package/dist/parsers/html-parser.js +444 -0
- package/dist/parsers/html-parser.js.map +1 -0
- package/dist/parsers/js-analyzer.d.ts +199 -0
- package/dist/parsers/js-analyzer.d.ts.map +1 -0
- package/dist/parsers/js-analyzer.js +680 -0
- package/dist/parsers/js-analyzer.js.map +1 -0
- package/dist/parsers/js-resolver.d.ts +8 -0
- package/dist/parsers/js-resolver.d.ts.map +1 -0
- package/dist/parsers/js-resolver.js +45 -0
- package/dist/parsers/js-resolver.js.map +1 -0
- package/dist/parsers/tailwind-detector.d.ts +23 -0
- package/dist/parsers/tailwind-detector.d.ts.map +1 -0
- package/dist/parsers/tailwind-detector.js +104 -0
- package/dist/parsers/tailwind-detector.js.map +1 -0
- package/dist/tests/advanced-features.test.d.ts +2 -0
- package/dist/tests/advanced-features.test.d.ts.map +1 -0
- package/dist/tests/advanced-features.test.js +235 -0
- package/dist/tests/advanced-features.test.js.map +1 -0
- package/dist/tests/css-modules.test.d.ts +2 -0
- package/dist/tests/css-modules.test.d.ts.map +1 -0
- package/dist/tests/css-modules.test.js +61 -0
- package/dist/tests/css-modules.test.js.map +1 -0
- package/dist/tests/css-processor.test.d.ts +2 -0
- package/dist/tests/css-processor.test.d.ts.map +1 -0
- package/dist/tests/css-processor.test.js +48 -0
- package/dist/tests/css-processor.test.js.map +1 -0
- package/dist/tests/html-parser.test.d.ts +2 -0
- package/dist/tests/html-parser.test.d.ts.map +1 -0
- package/dist/tests/html-parser.test.js +78 -0
- package/dist/tests/html-parser.test.js.map +1 -0
- package/dist/tests/integration.test.d.ts +2 -0
- package/dist/tests/integration.test.d.ts.map +1 -0
- package/dist/tests/integration.test.js +65 -0
- package/dist/tests/integration.test.js.map +1 -0
- package/dist/tests/js-analyzer.test.d.ts +2 -0
- package/dist/tests/js-analyzer.test.d.ts.map +1 -0
- package/dist/tests/js-analyzer.test.js +58 -0
- package/dist/tests/js-analyzer.test.js.map +1 -0
- package/dist/tests/naming.test.d.ts +2 -0
- package/dist/tests/naming.test.d.ts.map +1 -0
- package/dist/tests/naming.test.js +43 -0
- package/dist/tests/naming.test.js.map +1 -0
- package/dist/tests/router-generator.test.d.ts +2 -0
- package/dist/tests/router-generator.test.d.ts.map +1 -0
- package/dist/tests/router-generator.test.js +60 -0
- package/dist/tests/router-generator.test.js.map +1 -0
- package/dist/tui/chat.d.ts +13 -0
- package/dist/tui/chat.d.ts.map +1 -0
- package/dist/tui/chat.js +499 -0
- package/dist/tui/chat.js.map +1 -0
- package/dist/tui/design-guide.d.ts +41 -0
- package/dist/tui/design-guide.d.ts.map +1 -0
- package/dist/tui/design-guide.js +184 -0
- package/dist/tui/design-guide.js.map +1 -0
- package/dist/tui/input.d.ts +30 -0
- package/dist/tui/input.d.ts.map +1 -0
- package/dist/tui/input.js +239 -0
- package/dist/tui/input.js.map +1 -0
- package/dist/tui/renderer.d.ts +48 -0
- package/dist/tui/renderer.d.ts.map +1 -0
- package/dist/tui/renderer.js +212 -0
- package/dist/tui/renderer.js.map +1 -0
- package/dist/tui/tools.d.ts +14 -0
- package/dist/tui/tools.d.ts.map +1 -0
- package/dist/tui/tools.js +1370 -0
- package/dist/tui/tools.js.map +1 -0
- package/dist/types.d.ts +93 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/config.d.ts +20 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +33 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/formatter.d.ts +5 -0
- package/dist/utils/formatter.d.ts.map +1 -0
- package/dist/utils/formatter.js +68 -0
- package/dist/utils/formatter.js.map +1 -0
- package/dist/utils/logger.d.ts +8 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +19 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/naming.d.ts +17 -0
- package/dist/utils/naming.d.ts.map +1 -0
- package/dist/utils/naming.js +48 -0
- package/dist/utils/naming.js.map +1 -0
- package/dist/utils/report.d.ts +56 -0
- package/dist/utils/report.d.ts.map +1 -0
- package/dist/utils/report.js +339 -0
- package/dist/utils/report.js.map +1 -0
- 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"}
|
package/dist/ai/tools.js
ADDED
|
@@ -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":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAY,MAAM,MAAM,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAGjC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAE1C,+DAA+D;AAC/D,MAAM,UAAU,GAAG,EAAE,KAAK,EAAE,IAAI,EAAW,CAAC;AAE5C,wEAAwE;AAExE,MAAM,CAAC,MAAM,eAAe,GAAqB;IAC/C;QACE,IAAI,EAAE,UAAU;QAChB,QAAQ,EAAE;YACR,IAAI,EAAE,WAAW;YACjB,WAAW,EAAE,gIAAgI;YAC7I,UAAU,EAAE;gBACV,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,IAAI,EAAE;wBACJ,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,yFAAyF;qBACvG;iBACF;gBACD,QAAQ,EAAE,CAAC,MAAM,CAAC;aACnB;SACF;KACF;IACD;QACE,IAAI,EAAE,UAAU;QAChB,QAAQ,EAAE;YACR,IAAI,EAAE,YAAY;YAClB,WAAW,EAAE,2IAA2I;YACxJ,UAAU,EAAE;gBACV,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,IAAI,EAAE;wBACJ,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,wEAAwE;qBACtF;oBACD,OAAO,EAAE;wBACP,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,gCAAgC;qBAC9C;iBACF;gBACD,QAAQ,EAAE,CAAC,MAAM,EAAE,SAAS,CAAC;aAC9B;SACF;KACF;IACD;QACE,IAAI,EAAE,UAAU;QAChB,QAAQ,EAAE;YACR,IAAI,EAAE,YAAY;YAClB,WAAW,EAAE,yGAAyG;YACtH,UAAU,EAAE;gBACV,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,IAAI,EAAE;wBACJ,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,+EAA+E;qBAC7F;iBACF;gBACD,QAAQ,EAAE,CAAC,MAAM,CAAC;aACnB;SACF;KACF;IACD;QACE,IAAI,EAAE,UAAU;QAChB,QAAQ,EAAE;YACR,IAAI,EAAE,WAAW;YACjB,WAAW,EAAE,6JAA6J;YAC1K,UAAU,EAAE;gBACV,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE,EAAE;aACf;SACF;KACF;IACD;QACE,IAAI,EAAE,UAAU;QAChB,QAAQ,EAAE;YACR,IAAI,EAAE,eAAe;YACrB,WAAW,EAAE,qJAAqJ;YAClK,UAAU,EAAE;gBACV,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE,EAAE;aACf;SACF;KACF;IACD;QACE,IAAI,EAAE,UAAU;QAChB,QAAQ,EAAE;YACR,IAAI,EAAE,oBAAoB;YAC1B,WAAW,EAAE,yIAAyI;YACtJ,UAAU,EAAE;gBACV,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,IAAI,EAAE;wBACJ,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,6FAA6F;qBAC3G;iBACF;gBACD,QAAQ,EAAE,CAAC,MAAM,CAAC;aACnB;SACF;KACF;IACD;QACE,IAAI,EAAE,UAAU;QAChB,QAAQ,EAAE;YACR,IAAI,EAAE,iBAAiB;YACvB,WAAW,EAAE,mJAAmJ;YAChK,UAAU,EAAE;gBACV,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,GAAG,EAAE;wBACH,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,uDAAuD;qBACrE;oBACD,WAAW,EAAE;wBACX,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,4DAA4D;qBAC1E;oBACD,SAAS,EAAE;wBACT,IAAI,EAAE,SAAS;wBACf,WAAW,EAAE,+DAA+D;qBAC7E;iBACF;gBACD,QAAQ,EAAE,CAAC,KAAK,EAAE,aAAa,CAAC;aACjC;SACF;KACF;IACD;QACE,IAAI,EAAE,UAAU;QAChB,QAAQ,EAAE;YACR,IAAI,EAAE,sBAAsB;YAC5B,WAAW,EAAE,yKAAyK;YACtL,UAAU,EAAE;gBACV,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,SAAS,EAAE;wBACT,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,kIAAkI;qBAChJ;oBACD,WAAW,EAAE;wBACX,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,qEAAqE;qBACnF;oBACD,SAAS,EAAE;wBACT,IAAI,EAAE,SAAS;wBACf,WAAW,EAAE,8CAA8C;qBAC5D;iBACF;gBACD,QAAQ,EAAE,CAAC,WAAW,EAAE,aAAa,CAAC;aACvC;SACF;KACF;IACD;QACE,IAAI,EAAE,UAAU;QAChB,QAAQ,EAAE;YACR,IAAI,EAAE,eAAe;YACrB,WAAW,EAAE,2JAA2J;YACxK,UAAU,EAAE;gBACV,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,MAAM,EAAE;wBACN,IAAI,EAAE,QAAQ;wBACd,IAAI,EAAE,CAAC,aAAa,EAAE,SAAS,EAAE,iBAAiB,EAAE,QAAQ,CAAC;wBAC7D,WAAW,EAAE,kCAAkC;qBAChD;oBACD,OAAO,EAAE;wBACP,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,gFAAgF;qBAC9F;oBACD,aAAa,EAAE;wBACb,IAAI,EAAE,OAAO;wBACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wBACzB,WAAW,EAAE,8BAA8B;qBAC5C;oBACD,gBAAgB,EAAE;wBAChB,IAAI,EAAE,OAAO;wBACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wBACzB,WAAW,EAAE,uDAAuD;qBACrE;iBACF;gBACD,QAAQ,EAAE,CAAC,QAAQ,EAAE,SAAS,CAAC;aAChC;SACF;KACF;CACF,CAAC;AAUF;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAAgB;IACjD,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC;IAE9C,OAAO,KAAK,UAAU,WAAW,CAAC,IAAY,EAAE,IAA6B;QAC3E,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,WAAW,CAAC,CAAC,CAAC;gBACjB,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,IAAc,CAAC,CAAC;gBACtD,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;oBAClD,OAAO,OAAO,CAAC;gBACjB,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,OAAO,0BAA0B,IAAI,CAAC,IAAI,EAAE,CAAC;gBAC/C,CAAC;YACH,CAAC;YAED,KAAK,YAAY,CAAC,CAAC,CAAC;gBAClB,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,IAAc,CAAC,CAAC;gBACtD,IAAI,CAAC;oBACH,MAAM,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAiB,EAAE,OAAO,CAAC,CAAC;oBAC3D,QAAQ,EAAE,CAAC,YAAY,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;oBACpC,OAAO,sBAAsB,IAAI,CAAC,IAAI,EAAE,CAAC;gBAC3C,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,OAAO,uBAAuB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;gBACnF,CAAC;YACH,CAAC;YAED,KAAK,YAAY,CAAC,CAAC,CAAC;gBAClB,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAG,IAAI,CAAC,IAAe,IAAI,EAAE,CAAC,CAAC;gBAC7D,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;oBAChE,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAC3F,OAAO,OAAO,IAAI,mBAAmB,CAAC;gBACxC,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,OAAO,4BAA4B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;gBACxF,CAAC;YACH,CAAC;YAED,KAAK,WAAW,CAAC,CAAC,CAAC;gBACjB,QAAQ,EAAE,CAAC,yBAAyB,CAAC,CAAC;gBACtC,IAAI,CAAC;oBACH,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE;wBACvE,GAAG,EAAE,SAAS;wBACd,OAAO,EAAE,MAAM;wBACf,GAAG,UAAU;qBACd,CAAC,CAAC;oBACH,OAAO,6BAA6B,MAAM,gBAAgB,MAAM,EAAE,CAAC;gBACrE,CAAC;gBAAC,OAAO,GAAY,EAAE,CAAC;oBACtB,MAAM,MAAM,GAAG,GAA6D,CAAC;oBAC7E,OAAO,4BAA4B,MAAM,CAAC,MAAM,IAAI,EAAE,gBAAgB,MAAM,CAAC,MAAM,IAAI,EAAE,iBAAiB,MAAM,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;gBACnI,CAAC;YACH,CAAC;YAED,KAAK,eAAe,CAAC,CAAC,CAAC;gBACrB,QAAQ,EAAE,CAAC,2BAA2B,CAAC,CAAC;gBACxC,IAAI,CAAC;oBACH,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,UAAU,CAAC,EAAE;wBACzE,GAAG,EAAE,SAAS;wBACd,OAAO,EAAE,MAAM;wBACf,GAAG,UAAU;qBACd,CAAC,CAAC;oBACH,OAAO,uBAAuB,MAAM,KAAK,MAAM,EAAE,CAAC;gBACpD,CAAC;gBAAC,OAAO,GAAY,EAAE,CAAC;oBACtB,MAAM,MAAM,GAAG,GAA6D,CAAC;oBAC7E,OAAO,uBAAuB,MAAM,CAAC,MAAM,IAAI,EAAE,KAAK,MAAM,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;gBAC9E,CAAC;YACH,CAAC;YAED,KAAK,oBAAoB,CAAC,CAAC,CAAC;gBAC1B,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAc,CAAC,CAAC;gBACrD,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;oBAClD,OAAO,OAAO,CAAC;gBACjB,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,OAAO,mCAAmC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACxD,CAAC;YACH,CAAC;YAED,KAAK,iBAAiB,CAAC,CAAC,CAAC;gBACvB,OAAO,MAAM,cAAc,CACzB,IAAI,CAAC,GAAa,EAClB,IAAI,CAAC,WAAqB,EAC1B,IAAI,CAAC,SAAoB,IAAI,IAAI,CAClC,CAAC;YACJ,CAAC;YAED,KAAK,sBAAsB,CAAC,CAAC,CAAC;gBAC5B,OAAO,MAAM,kBAAkB,CAC7B,IAAI,CAAC,SAAmB,EACxB,IAAI,CAAC,WAAqB,EAC1B,IAAI,CAAC,SAAoB,IAAI,IAAI,CAClC,CAAC;YACJ,CAAC;YAED,KAAK,eAAe,CAAC,CAAC,CAAC;gBACrB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAgB,CAAC;gBACrC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAiB,CAAC;gBACvC,MAAM,KAAK,GAAI,IAAI,CAAC,aAA0B,IAAI,EAAE,CAAC;gBACrD,MAAM,SAAS,GAAI,IAAI,CAAC,gBAA6B,IAAI,EAAE,CAAC;gBAE5D,IAAI,MAAM,GAAG,IAAI,MAAM,CAAC,WAAW,EAAE,KAAK,OAAO,EAAE,CAAC;gBACpD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACrB,MAAM,IAAI,uBAAuB,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC3E,CAAC;gBACD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACzB,MAAM,IAAI,0BAA0B,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBAClF,CAAC;gBACD,QAAQ,EAAE,CAAC,MAAM,CAAC,CAAC;gBACnB,OAAO,kBAAkB,CAAC;YAC5B,CAAC;YAED;gBACE,OAAO,wBAAwB,IAAI,GAAG,CAAC;QAC3C,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED,wEAAwE;AAExE,KAAK,UAAU,cAAc,CAAC,GAAW,EAAE,UAAkB,EAAE,WAAoB,IAAI;IACrF,IAAI,CAAC;QACH,0EAA0E;QAC1E,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;QAChD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;QACrF,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QAErC,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,aAAa,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACnF,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QAChC,MAAM,IAAI,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,CAAC;QAEtD,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;QACtB,OAAO,uBAAuB,UAAU,EAAE,CAAC;IAC7C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,sBAAsB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;IAClF,CAAC;AACH,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,SAAiB,EAAE,UAAkB,EAAE,WAAoB,IAAI;IAC/F,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC;IAClC,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;IAC9B,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC;IAErC,MAAM,UAAU,GAA2B;QACzC,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,wBAAwB;QACzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY;QACtE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,cAAc,EAAE,QAAQ,EAAE,YAAY;KACxE,CAAC;IAEF,mBAAmB;IACnB,MAAM,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC;IAErD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,GAAQ,EAAE,GAAQ,EAAE,EAAE;YACtD,IAAI,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACjF,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC7B,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC,eAAe;YACnE,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;gBAC1C,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;gBACtC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,UAAU,CAAC,GAAG,CAAC,IAAI,0BAA0B,EAAE,CAAC,CAAC;gBACtF,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACnB,CAAC;YAAC,MAAM,CAAC;gBACP,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;gBACnB,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YACvB,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE;YAC7B,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,oBAAoB,IAAI,EAAE,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;YACtF,MAAM,CAAC,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,MAAM,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACtB,OAAO,CAAC,yCAAyC,IAAI,EAAE,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -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"}
|