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,176 @@
|
|
|
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 { createServer } from 'http';
|
|
6
|
+
import { readFileSync, existsSync } from 'fs';
|
|
7
|
+
import { join, extname } from 'path';
|
|
8
|
+
const MIME_TYPES = {
|
|
9
|
+
'.html': 'text/html',
|
|
10
|
+
'.css': 'text/css',
|
|
11
|
+
'.js': 'application/javascript',
|
|
12
|
+
'.json': 'application/json',
|
|
13
|
+
'.png': 'image/png',
|
|
14
|
+
'.jpg': 'image/jpeg',
|
|
15
|
+
'.jpeg': 'image/jpeg',
|
|
16
|
+
'.svg': 'image/svg+xml',
|
|
17
|
+
'.ico': 'image/x-icon',
|
|
18
|
+
'.woff': 'font/woff',
|
|
19
|
+
'.woff2': 'font/woff2',
|
|
20
|
+
'.ttf': 'font/ttf',
|
|
21
|
+
'.eot': 'application/vnd.ms-fontobject',
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Serve a directory as a static HTTP server.
|
|
25
|
+
* Returns the server and the port it's listening on.
|
|
26
|
+
*/
|
|
27
|
+
export function serveDirectory(dir, port = 0) {
|
|
28
|
+
return new Promise((resolve, reject) => {
|
|
29
|
+
const server = createServer((req, res) => {
|
|
30
|
+
const urlPath = req.url?.split('?')[0] || '/';
|
|
31
|
+
let filePath = join(dir, urlPath === '/' ? 'index.html' : urlPath);
|
|
32
|
+
if (!existsSync(filePath)) {
|
|
33
|
+
// SPA fallback — serve index.html for non-file routes
|
|
34
|
+
filePath = join(dir, 'index.html');
|
|
35
|
+
}
|
|
36
|
+
try {
|
|
37
|
+
const content = readFileSync(filePath);
|
|
38
|
+
const ext = extname(filePath);
|
|
39
|
+
res.writeHead(200, {
|
|
40
|
+
'Content-Type': MIME_TYPES[ext] || 'application/octet-stream',
|
|
41
|
+
'Access-Control-Allow-Origin': '*',
|
|
42
|
+
});
|
|
43
|
+
res.end(content);
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
res.writeHead(404);
|
|
47
|
+
res.end('Not found');
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
server.on('error', reject);
|
|
51
|
+
server.listen(port, () => {
|
|
52
|
+
const addr = server.address();
|
|
53
|
+
const resolvedPort = typeof addr === 'object' && addr ? addr.port : port;
|
|
54
|
+
resolve({
|
|
55
|
+
server,
|
|
56
|
+
port: resolvedPort,
|
|
57
|
+
url: `http://localhost:${resolvedPort}`,
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Take a screenshot of a URL using Playwright.
|
|
64
|
+
*/
|
|
65
|
+
export async function screenshotUrl(url, outputPath, options = {}) {
|
|
66
|
+
const { fullPage = true, width = 1440, height = 900, waitMs = 2000 } = options;
|
|
67
|
+
const { chromium } = await import('playwright');
|
|
68
|
+
const browser = await chromium.launch({ headless: true });
|
|
69
|
+
const context = await browser.newContext({ viewport: { width, height } });
|
|
70
|
+
const page = await context.newPage();
|
|
71
|
+
await page.goto(url, { waitUntil: 'networkidle', timeout: 15_000 }).catch(() => { });
|
|
72
|
+
await page.waitForTimeout(waitMs);
|
|
73
|
+
await page.screenshot({ path: outputPath, fullPage });
|
|
74
|
+
await browser.close();
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Take screenshots of both the original and converted sites.
|
|
78
|
+
* Returns paths to the screenshot files.
|
|
79
|
+
*/
|
|
80
|
+
export async function compareScreenshots(originalDir, convertedDistDir, outputDir = '/tmp') {
|
|
81
|
+
const originalPath = join(outputDir, 'screenshot-original.png');
|
|
82
|
+
const convertedPath = join(outputDir, 'screenshot-converted.png');
|
|
83
|
+
// Start both servers
|
|
84
|
+
const [originalServer, convertedServer] = await Promise.all([
|
|
85
|
+
serveDirectory(originalDir, 0),
|
|
86
|
+
serveDirectory(convertedDistDir, 0),
|
|
87
|
+
]);
|
|
88
|
+
try {
|
|
89
|
+
// Take screenshots in parallel
|
|
90
|
+
await Promise.all([
|
|
91
|
+
screenshotUrl(originalServer.url, originalPath),
|
|
92
|
+
screenshotUrl(convertedServer.url, convertedPath),
|
|
93
|
+
]);
|
|
94
|
+
}
|
|
95
|
+
finally {
|
|
96
|
+
// Clean up servers
|
|
97
|
+
originalServer.server.close();
|
|
98
|
+
convertedServer.server.close();
|
|
99
|
+
}
|
|
100
|
+
return { originalPath, convertedPath };
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Build a textual description of the HTML structure for AI comparison.
|
|
104
|
+
* Since we can't send images to this API, we extract the DOM structure
|
|
105
|
+
* for text-based comparison.
|
|
106
|
+
*/
|
|
107
|
+
export async function extractPageStructure(dir) {
|
|
108
|
+
const { chromium } = await import('playwright');
|
|
109
|
+
const server = await serveDirectory(dir, 0);
|
|
110
|
+
try {
|
|
111
|
+
const browser = await chromium.launch({ headless: true });
|
|
112
|
+
const context = await browser.newContext({ viewport: { width: 1440, height: 900 } });
|
|
113
|
+
const page = await context.newPage();
|
|
114
|
+
await page.goto(server.url, { waitUntil: 'networkidle', timeout: 15_000 }).catch(() => { });
|
|
115
|
+
await page.waitForTimeout(2000);
|
|
116
|
+
// Extract a structural summary of the rendered page
|
|
117
|
+
// The callback runs in the browser context (Playwright injects it)
|
|
118
|
+
const structure = await page.evaluate(`
|
|
119
|
+
(function() {
|
|
120
|
+
function summarize(el, depth) {
|
|
121
|
+
depth = depth || 0;
|
|
122
|
+
var indent = ' '.repeat(depth);
|
|
123
|
+
var tag = el.tagName.toLowerCase();
|
|
124
|
+
var id = el.id ? '#' + el.id : '';
|
|
125
|
+
var classes = el.className && typeof el.className === 'string'
|
|
126
|
+
? '.' + el.className.split(/\\s+/).slice(0, 3).join('.')
|
|
127
|
+
: '';
|
|
128
|
+
var text = el.childNodes.length === 1 && el.childNodes[0].nodeType === 3
|
|
129
|
+
? ' "' + (el.textContent || '').trim().slice(0, 50) + '"'
|
|
130
|
+
: '';
|
|
131
|
+
var childCount = el.children.length;
|
|
132
|
+
var line = indent + '<' + tag + id + classes + '>' + text;
|
|
133
|
+
if (childCount > 0 && depth < 4) {
|
|
134
|
+
line += '\\n';
|
|
135
|
+
var children = Array.from(el.children).slice(0, 20);
|
|
136
|
+
for (var i = 0; i < children.length; i++) {
|
|
137
|
+
line += summarize(children[i], depth + 1) + '\\n';
|
|
138
|
+
}
|
|
139
|
+
line += indent + '</' + tag + '>';
|
|
140
|
+
} else if (childCount > 0) {
|
|
141
|
+
line += ' (' + childCount + ' children)';
|
|
142
|
+
}
|
|
143
|
+
return line;
|
|
144
|
+
}
|
|
145
|
+
return summarize(document.body);
|
|
146
|
+
})()
|
|
147
|
+
`);
|
|
148
|
+
await browser.close();
|
|
149
|
+
return structure;
|
|
150
|
+
}
|
|
151
|
+
finally {
|
|
152
|
+
server.server.close();
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Compare the DOM structures of original and converted sites.
|
|
157
|
+
* Returns a text summary suitable for sending to the AI agent.
|
|
158
|
+
*/
|
|
159
|
+
export async function buildVisualComparisonContext(originalDir, convertedDistDir) {
|
|
160
|
+
const [originalStructure, convertedStructure] = await Promise.all([
|
|
161
|
+
extractPageStructure(originalDir).catch(() => '(failed to extract)'),
|
|
162
|
+
extractPageStructure(convertedDistDir).catch(() => '(failed to extract)'),
|
|
163
|
+
]);
|
|
164
|
+
return `=== ORIGINAL SITE DOM STRUCTURE ===
|
|
165
|
+
${originalStructure}
|
|
166
|
+
|
|
167
|
+
=== CONVERTED REACT APP DOM STRUCTURE ===
|
|
168
|
+
${convertedStructure}
|
|
169
|
+
|
|
170
|
+
Compare these two structures and identify:
|
|
171
|
+
1. Missing sections (content present in original but absent in converted)
|
|
172
|
+
2. Structural differences (layout, nesting)
|
|
173
|
+
3. Missing text content
|
|
174
|
+
4. Missing interactive elements (buttons, forms, links)`;
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=visual-compare.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"visual-compare.js","sourceRoot":"","sources":["../../src/ai/visual-compare.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command } from 'commander';
|
|
3
|
+
import { resolve } from 'path';
|
|
4
|
+
import { convert } from './converter.js';
|
|
5
|
+
import { renderReport } from './utils/report.js';
|
|
6
|
+
import { logger } from './utils/logger.js';
|
|
7
|
+
const program = new Command();
|
|
8
|
+
program
|
|
9
|
+
.name('codemeld')
|
|
10
|
+
.description('Convert between HTML/CSS/JS and modern frameworks (React, Next.js, Vue, Svelte, Angular) — both directions')
|
|
11
|
+
.version('2.1.0');
|
|
12
|
+
// ─── Convert command (default) ──────────────────────────────────────
|
|
13
|
+
program
|
|
14
|
+
.command('convert', { isDefault: true })
|
|
15
|
+
.description('Convert an HTML/CSS/JS site into a modern framework project (React, Next.js, Vue, Svelte, Angular)')
|
|
16
|
+
.argument('<input>', 'Path to the HTML/CSS/JS source directory')
|
|
17
|
+
.argument('<output>', 'Path for the generated Vite + React project')
|
|
18
|
+
.option('-n, --name <name>', 'Project/component name')
|
|
19
|
+
.option('-m, --css-modules', 'Use CSS modules instead of global CSS', false)
|
|
20
|
+
.option('-p, --preserve-structure', 'Preserve original file structure', false)
|
|
21
|
+
.option('--verify', 'Run build verification after conversion', false)
|
|
22
|
+
.option('--no-verify', 'Skip build verification')
|
|
23
|
+
.option('--no-extract', 'Disable smart component extraction')
|
|
24
|
+
.option('--no-prettier', 'Disable Prettier formatting')
|
|
25
|
+
.option('--tailwind <mode>', 'Tailwind CSS handling: auto, force, disable', 'auto')
|
|
26
|
+
.option('-f, --framework <framework>', 'Target framework: react, nextjs, vue, svelte, angular', 'react')
|
|
27
|
+
.option('--ai', 'Enable AI-powered refinement after conversion', false)
|
|
28
|
+
.option('--ai-max-steps <number>', 'Max AI agent iterations (default: 50)', '50')
|
|
29
|
+
.option('--ai-mode <mode>', 'AI mode: full, build-fix, enhance, visual', 'full')
|
|
30
|
+
.option('--ai-verbose', 'Show AI agent reasoning in real-time', false)
|
|
31
|
+
.option('--visual-compare', 'Take screenshots comparing original vs converted', false)
|
|
32
|
+
.option('--tests', 'Generate Vitest test files for components', false)
|
|
33
|
+
.option('--deploy', 'Generate deployment configs (Docker, CI/CD, Vercel, Netlify)', false)
|
|
34
|
+
.option('--seo', 'Generate SEO files (sitemap, robots.txt, manifest, meta tags)', false)
|
|
35
|
+
.option('--seo-url <url>', 'Base URL for SEO files', 'https://example.com')
|
|
36
|
+
.option('--a11y', 'Enhance accessibility (ARIA labels, semantic HTML, skip nav)', false)
|
|
37
|
+
.option('--perf', 'Add performance optimizations (React.memo, lazy loading, code splitting)', false)
|
|
38
|
+
.option('--forms', 'Generate form handling with validation', false)
|
|
39
|
+
.option('--types', 'Generate TypeScript type definitions', false)
|
|
40
|
+
.option('--all-extras', 'Enable all extras: --tests --deploy --seo --a11y --perf --forms --types', false)
|
|
41
|
+
.action(async (input, output, opts) => {
|
|
42
|
+
try {
|
|
43
|
+
logger.info(`Converting ${resolve(input)} -> ${resolve(output)}`);
|
|
44
|
+
logger.info('');
|
|
45
|
+
const result = await convert({
|
|
46
|
+
input: resolve(input),
|
|
47
|
+
output: resolve(output),
|
|
48
|
+
componentName: opts.name,
|
|
49
|
+
cssModules: opts.cssModules,
|
|
50
|
+
preserveStructure: opts.preserveStructure,
|
|
51
|
+
verify: opts.verify,
|
|
52
|
+
extractComponents: opts.extract !== false,
|
|
53
|
+
prettier: opts.prettier !== false,
|
|
54
|
+
tailwind: opts.tailwind,
|
|
55
|
+
framework: opts.framework,
|
|
56
|
+
generateTests: opts.tests || opts.allExtras,
|
|
57
|
+
generateDeploy: opts.deploy || opts.allExtras,
|
|
58
|
+
generateSeo: opts.seo || opts.allExtras,
|
|
59
|
+
seoBaseUrl: opts.seoUrl,
|
|
60
|
+
enhanceA11y: opts.a11y || opts.allExtras,
|
|
61
|
+
enhancePerf: opts.perf || opts.allExtras,
|
|
62
|
+
generateForms: opts.forms || opts.allExtras,
|
|
63
|
+
generateTypes: opts.types || opts.allExtras,
|
|
64
|
+
});
|
|
65
|
+
// Print the conversion report
|
|
66
|
+
if (result.report) {
|
|
67
|
+
console.log(renderReport(result.report));
|
|
68
|
+
}
|
|
69
|
+
if (result.errors.length > 0) {
|
|
70
|
+
logger.error('Conversion completed with errors:');
|
|
71
|
+
for (const err of result.errors) {
|
|
72
|
+
logger.error(` ${err}`);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
if (result.buildSuccess) {
|
|
76
|
+
logger.success('Build verification passed!');
|
|
77
|
+
}
|
|
78
|
+
// AI Refinement Phase
|
|
79
|
+
if (opts.ai) {
|
|
80
|
+
console.log('');
|
|
81
|
+
logger.info('Starting AI-powered refinement...');
|
|
82
|
+
console.log('');
|
|
83
|
+
const { runRefinement } = await import('./ai/refinement-loop.js');
|
|
84
|
+
const refinementResult = await runRefinement({
|
|
85
|
+
inputDir: resolve(input),
|
|
86
|
+
outputDir: resolve(output),
|
|
87
|
+
maxSteps: parseInt(opts.aiMaxSteps, 10) || 50,
|
|
88
|
+
mode: opts.aiMode,
|
|
89
|
+
verbose: opts.aiVerbose,
|
|
90
|
+
});
|
|
91
|
+
console.log('');
|
|
92
|
+
if (refinementResult.buildPassed) {
|
|
93
|
+
logger.success('AI refinement complete — build passes!');
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
logger.warn('AI refinement complete — some issues may need manual attention');
|
|
97
|
+
}
|
|
98
|
+
if (refinementResult.fixesApplied.length > 0) {
|
|
99
|
+
logger.info(`AI applied ${refinementResult.fixesApplied.length} fix(es)`);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
// Visual Comparison
|
|
103
|
+
if (opts.visualCompare) {
|
|
104
|
+
console.log('');
|
|
105
|
+
logger.info('Taking visual comparison screenshots...');
|
|
106
|
+
try {
|
|
107
|
+
const { compareScreenshots } = await import('./ai/visual-compare.js');
|
|
108
|
+
const distDir = resolve(output, 'dist');
|
|
109
|
+
const { originalPath, convertedPath } = await compareScreenshots(resolve(input), distDir);
|
|
110
|
+
console.log('');
|
|
111
|
+
logger.success('Screenshots saved:');
|
|
112
|
+
logger.info(` Original: ${originalPath}`);
|
|
113
|
+
logger.info(` Converted: ${convertedPath}`);
|
|
114
|
+
}
|
|
115
|
+
catch (err) {
|
|
116
|
+
logger.warn(`Visual comparison failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
console.log('');
|
|
120
|
+
logger.info('Next steps:');
|
|
121
|
+
logger.info(` cd ${output}`);
|
|
122
|
+
if (!opts.ai) {
|
|
123
|
+
logger.info(' npm install');
|
|
124
|
+
}
|
|
125
|
+
logger.info(' npm run dev');
|
|
126
|
+
}
|
|
127
|
+
catch (err) {
|
|
128
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
129
|
+
logger.error(`Conversion failed: ${message}`);
|
|
130
|
+
process.exit(1);
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
// ─── Deconvert command (reverse conversion) ────────────────────────
|
|
134
|
+
program
|
|
135
|
+
.command('deconvert')
|
|
136
|
+
.description('Reverse-convert a React/Next.js/Vue/Svelte/Angular project back into static HTML/CSS/JS')
|
|
137
|
+
.argument('<input>', 'Path to the framework project directory')
|
|
138
|
+
.argument('<output>', 'Path for the generated HTML/CSS/JS output')
|
|
139
|
+
.option('-f, --framework <framework>', 'Force framework detection: react, nextjs, vue, svelte, angular')
|
|
140
|
+
.option('--no-prettier', 'Disable Prettier formatting')
|
|
141
|
+
.action(async (input, output, opts) => {
|
|
142
|
+
try {
|
|
143
|
+
const { deconvert } = await import('./deconverter.js');
|
|
144
|
+
logger.info(`Reverse converting ${resolve(input)} -> ${resolve(output)}`);
|
|
145
|
+
logger.info('');
|
|
146
|
+
const result = await deconvert({
|
|
147
|
+
input: resolve(input),
|
|
148
|
+
output: resolve(output),
|
|
149
|
+
framework: opts.framework,
|
|
150
|
+
prettier: opts.prettier !== false,
|
|
151
|
+
});
|
|
152
|
+
if (result.errors.length > 0) {
|
|
153
|
+
logger.error('Conversion completed with errors:');
|
|
154
|
+
for (const err of result.errors) {
|
|
155
|
+
logger.error(` ${err}`);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
console.log('');
|
|
159
|
+
logger.info('Next steps:');
|
|
160
|
+
logger.info(` Open ${output}/index.html in your browser`);
|
|
161
|
+
logger.info(' Or serve with: npx serve ' + output);
|
|
162
|
+
}
|
|
163
|
+
catch (err) {
|
|
164
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
165
|
+
logger.error(`Reverse conversion failed: ${message}`);
|
|
166
|
+
process.exit(1);
|
|
167
|
+
}
|
|
168
|
+
});
|
|
169
|
+
// ─── Chat command ───────────────────────────────────────────────────
|
|
170
|
+
program
|
|
171
|
+
.command('chat')
|
|
172
|
+
.description('Start an interactive AI chat session for your project (Claude Code-style TUI)')
|
|
173
|
+
.argument('[directory]', 'Project directory to work in (default: current directory)')
|
|
174
|
+
.action(async (directory) => {
|
|
175
|
+
const { startChat } = await import('./tui/chat.js');
|
|
176
|
+
await startChat(directory);
|
|
177
|
+
});
|
|
178
|
+
program.parse();
|
|
179
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ConversionOptions, ConversionResult } from './types.js';
|
|
2
|
+
import { type ConversionReport } from './utils/report.js';
|
|
3
|
+
/**
|
|
4
|
+
* Main conversion pipeline: HTML/CSS/JS site -> modern framework project.
|
|
5
|
+
* Supports React (Vite), Next.js, Vue, Svelte, and Angular.
|
|
6
|
+
*/
|
|
7
|
+
export declare function convert(options: ConversionOptions): Promise<ConversionResult & {
|
|
8
|
+
report?: ConversionReport;
|
|
9
|
+
}>;
|
|
10
|
+
//# sourceMappingURL=converter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"converter.d.ts","sourceRoot":"","sources":["../src/converter.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAc,MAAM,YAAY,CAAC;AAyBlF,OAAO,EAAgC,KAAK,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAIxF;;;GAGG;AACH,wBAAsB,OAAO,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,GAAG;IAAE,MAAM,CAAC,EAAE,gBAAgB,CAAA;CAAE,CAAC,CAkxBnH"}
|