@sn4p.dev/mucv 0.5.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 +126 -0
- package/dist/core/elementor-parser.d.ts +22 -0
- package/dist/core/elementor-parser.d.ts.map +1 -0
- package/dist/core/elementor-parser.js +186 -0
- package/dist/core/elementor-parser.js.map +1 -0
- package/dist/core/html-parser.d.ts +27 -0
- package/dist/core/html-parser.d.ts.map +1 -0
- package/dist/core/html-parser.js +247 -0
- package/dist/core/html-parser.js.map +1 -0
- package/dist/core/jsx-parser.d.ts +22 -0
- package/dist/core/jsx-parser.d.ts.map +1 -0
- package/dist/core/jsx-parser.js +261 -0
- package/dist/core/jsx-parser.js.map +1 -0
- package/dist/core/mapper.d.ts +52 -0
- package/dist/core/mapper.d.ts.map +1 -0
- package/dist/core/mapper.js +141 -0
- package/dist/core/mapper.js.map +1 -0
- package/dist/core/normalizer.d.ts +57 -0
- package/dist/core/normalizer.d.ts.map +1 -0
- package/dist/core/normalizer.js +285 -0
- package/dist/core/normalizer.js.map +1 -0
- package/dist/core/optimizer.d.ts +21 -0
- package/dist/core/optimizer.d.ts.map +1 -0
- package/dist/core/optimizer.js +75 -0
- package/dist/core/optimizer.js.map +1 -0
- package/dist/core/parse-result.d.ts +10 -0
- package/dist/core/parse-result.d.ts.map +1 -0
- package/dist/core/parse-result.js +6 -0
- package/dist/core/parse-result.js.map +1 -0
- package/dist/core/vir.d.ts +136 -0
- package/dist/core/vir.d.ts.map +1 -0
- package/dist/core/vir.js +9 -0
- package/dist/core/vir.js.map +1 -0
- package/dist/generators/style-serializer.d.ts +25 -0
- package/dist/generators/style-serializer.d.ts.map +1 -0
- package/dist/generators/style-serializer.js +129 -0
- package/dist/generators/style-serializer.js.map +1 -0
- package/dist/generators/to-elementor.d.ts +13 -0
- package/dist/generators/to-elementor.d.ts.map +1 -0
- package/dist/generators/to-elementor.js +150 -0
- package/dist/generators/to-elementor.js.map +1 -0
- package/dist/generators/to-html-css.d.ts +22 -0
- package/dist/generators/to-html-css.d.ts.map +1 -0
- package/dist/generators/to-html-css.js +127 -0
- package/dist/generators/to-html-css.js.map +1 -0
- package/dist/generators/to-react.d.ts +22 -0
- package/dist/generators/to-react.d.ts.map +1 -0
- package/dist/generators/to-react.js +123 -0
- package/dist/generators/to-react.js.map +1 -0
- package/dist/generators/to-svelte.d.ts +15 -0
- package/dist/generators/to-svelte.d.ts.map +1 -0
- package/dist/generators/to-svelte.js +105 -0
- package/dist/generators/to-svelte.js.map +1 -0
- package/dist/generators/to-vue.d.ts +17 -0
- package/dist/generators/to-vue.d.ts.map +1 -0
- package/dist/generators/to-vue.js +108 -0
- package/dist/generators/to-vue.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +228 -0
- package/dist/index.js.map +1 -0
- package/dist/schemas/input.schema.d.ts +245 -0
- package/dist/schemas/input.schema.d.ts.map +1 -0
- package/dist/schemas/input.schema.js +66 -0
- package/dist/schemas/input.schema.js.map +1 -0
- package/dist/schemas/vir.schema.d.ts +1786 -0
- package/dist/schemas/vir.schema.d.ts.map +1 -0
- package/dist/schemas/vir.schema.js +201 -0
- package/dist/schemas/vir.schema.js.map +1 -0
- package/dist/tools/convert-design.d.ts +40 -0
- package/dist/tools/convert-design.d.ts.map +1 -0
- package/dist/tools/convert-design.js +106 -0
- package/dist/tools/convert-design.js.map +1 -0
- package/dist/tools/validate-vir.d.ts +18 -0
- package/dist/tools/validate-vir.d.ts.map +1 -0
- package/dist/tools/validate-vir.js +32 -0
- package/dist/tools/validate-vir.js.map +1 -0
- package/dist/tools/wp-connector.d.ts +55 -0
- package/dist/tools/wp-connector.d.ts.map +1 -0
- package/dist/tools/wp-connector.js +146 -0
- package/dist/tools/wp-connector.js.map +1 -0
- package/dist/tools/wp-tools.d.ts +51 -0
- package/dist/tools/wp-tools.d.ts.map +1 -0
- package/dist/tools/wp-tools.js +126 -0
- package/dist/tools/wp-tools.js.map +1 -0
- package/dist/utils/errors.d.ts +35 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +67 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/id-generator.d.ts +27 -0
- package/dist/utils/id-generator.d.ts.map +1 -0
- package/dist/utils/id-generator.js +43 -0
- package/dist/utils/id-generator.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/metrics.d.ts +30 -0
- package/dist/utils/metrics.d.ts.map +1 -0
- package/dist/utils/metrics.js +50 -0
- package/dist/utils/metrics.js.map +1 -0
- package/dist/utils/rate-limiter.d.ts +25 -0
- package/dist/utils/rate-limiter.d.ts.map +1 -0
- package/dist/utils/rate-limiter.js +41 -0
- package/dist/utils/rate-limiter.js.map +1 -0
- package/dist/utils/url-validator.d.ts +14 -0
- package/dist/utils/url-validator.d.ts.map +1 -0
- package/dist/utils/url-validator.js +37 -0
- package/dist/utils/url-validator.js.map +1 -0
- package/package.json +73 -0
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MUCV — Generator: VIR → Svelte Component
|
|
3
|
+
* Produce un componente Svelte con <script>, template y <style>.
|
|
4
|
+
*
|
|
5
|
+
* @see docs/VIR-SPEC.md §6
|
|
6
|
+
*/
|
|
7
|
+
import type { VisualIR } from '../core/vir.js';
|
|
8
|
+
export interface SvelteOptions {
|
|
9
|
+
/** Prefijo de clase CSS (default: 'mucv') */
|
|
10
|
+
cssPrefix?: string;
|
|
11
|
+
}
|
|
12
|
+
export declare const svelteGenerator: {
|
|
13
|
+
generate(vir: VisualIR, options?: SvelteOptions): string;
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=to-svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"to-svelte.d.ts","sourceRoot":"","sources":["../../src/generators/to-svelte.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAc,MAAM,gBAAgB,CAAA;AAO1D,MAAM,WAAW,aAAa;IAC5B,6CAA6C;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAID,eAAO,MAAM,eAAe;kBACZ,QAAQ,YAAW,aAAa,GAAQ,MAAM;CAsB7D,CAAA"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MUCV — Generator: VIR → Svelte Component
|
|
3
|
+
* Produce un componente Svelte con <script>, template y <style>.
|
|
4
|
+
*
|
|
5
|
+
* @see docs/VIR-SPEC.md §6
|
|
6
|
+
*/
|
|
7
|
+
import { styleToDeclarations, declsToBlock } from './style-serializer.js';
|
|
8
|
+
import { logger } from '../utils/logger.js';
|
|
9
|
+
import { GenerateError } from '../utils/errors.js';
|
|
10
|
+
// ─── Generator principal ──────────────────────────────────────────────────────
|
|
11
|
+
export const svelteGenerator = {
|
|
12
|
+
generate(vir, options = {}) {
|
|
13
|
+
const prefix = options.cssPrefix ?? 'mucv';
|
|
14
|
+
const cssRules = [];
|
|
15
|
+
try {
|
|
16
|
+
const templateLines = vir.root
|
|
17
|
+
.map((node) => renderNode(node, 0, prefix, cssRules))
|
|
18
|
+
.filter(Boolean);
|
|
19
|
+
const template = templateLines.join('\n');
|
|
20
|
+
const script = `<script lang="ts">\n // Component generated by MUCV\n</script>`;
|
|
21
|
+
const style = `<style>\n${cssRules.filter(Boolean).join('\n\n')}\n</style>`;
|
|
22
|
+
logger.debug({ nodeCount: vir.root.length }, 'Svelte component generated');
|
|
23
|
+
return [script, template, style].join('\n\n');
|
|
24
|
+
}
|
|
25
|
+
catch (err) {
|
|
26
|
+
throw new GenerateError('Error generating Svelte component from VIR', {
|
|
27
|
+
error: err instanceof Error ? err.message : String(err),
|
|
28
|
+
virId: vir.id,
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
// ─── Renderizado recursivo ────────────────────────────────────────────────────
|
|
34
|
+
function renderNode(node, depth, prefix, cssRules) {
|
|
35
|
+
const pad = ' '.repeat(depth);
|
|
36
|
+
const nodeClass = `${prefix}-node-${node.id}`;
|
|
37
|
+
const typeClass = `${prefix}-${node.type}`;
|
|
38
|
+
const extraClasses = node.meta?.cssClasses?.join(' ') ?? '';
|
|
39
|
+
const classes = [typeClass, nodeClass, extraClasses].filter(Boolean).join(' ');
|
|
40
|
+
if (node.styles) {
|
|
41
|
+
const block = declsToBlock(`.${nodeClass}`, styleToDeclarations(node.styles));
|
|
42
|
+
if (block)
|
|
43
|
+
cssRules.push(block);
|
|
44
|
+
}
|
|
45
|
+
const children = node.children
|
|
46
|
+
?.map((c) => renderNode(c, depth + 1, prefix, cssRules))
|
|
47
|
+
.filter(Boolean)
|
|
48
|
+
.join('\n') ?? '';
|
|
49
|
+
const inner = children ? `\n${children}\n${pad}` : '';
|
|
50
|
+
return renderSvelteTag(node, classes, pad, inner);
|
|
51
|
+
}
|
|
52
|
+
// ─── Renderizado de cada tipo de nodo ─────────────────────────────────────────
|
|
53
|
+
function renderSvelteTag(node, classes, pad, inner) {
|
|
54
|
+
const cls = `class="${classes}"`;
|
|
55
|
+
switch (node.type) {
|
|
56
|
+
case 'section':
|
|
57
|
+
return `${pad}<section ${cls}>${inner}</section>`;
|
|
58
|
+
case 'container':
|
|
59
|
+
case 'custom':
|
|
60
|
+
return inner ? `${pad}<div ${cls}>${inner}</div>` : '';
|
|
61
|
+
case 'flex':
|
|
62
|
+
case 'grid':
|
|
63
|
+
return `${pad}<div ${cls}>${inner}</div>`;
|
|
64
|
+
case 'heading': {
|
|
65
|
+
const h = node.content?.level ?? 2;
|
|
66
|
+
return `${pad}<h${h} ${cls}>${esc(node.content?.text ?? '')}</h${h}>`;
|
|
67
|
+
}
|
|
68
|
+
case 'text': {
|
|
69
|
+
const content = node.content?.richText
|
|
70
|
+
? `{@html ${JSON.stringify(node.content.richText)}}`
|
|
71
|
+
: esc(node.content?.text ?? '');
|
|
72
|
+
return content ? `${pad}<p ${cls}>${content}</p>` : '';
|
|
73
|
+
}
|
|
74
|
+
case 'image': {
|
|
75
|
+
const src = node.content?.src;
|
|
76
|
+
const alt = esc(node.content?.alt ?? '');
|
|
77
|
+
return src ? `${pad}<img ${cls} src="${src}" alt="${alt}" />` : '';
|
|
78
|
+
}
|
|
79
|
+
case 'button': {
|
|
80
|
+
const label = esc(node.content?.label ?? '');
|
|
81
|
+
const href = node.content?.href;
|
|
82
|
+
const target = node.content?.target === '_blank' ? ' target="_blank" rel="noopener noreferrer"' : '';
|
|
83
|
+
return href
|
|
84
|
+
? `${pad}<a ${cls} href="${href}"${target}>${label}</a>`
|
|
85
|
+
: `${pad}<button ${cls}>${label}</button>`;
|
|
86
|
+
}
|
|
87
|
+
case 'list': {
|
|
88
|
+
const items = (node.content?.items ?? [])
|
|
89
|
+
.map((item) => {
|
|
90
|
+
const text = esc(item.text ?? '');
|
|
91
|
+
return item.href
|
|
92
|
+
? `${pad} <li><a href="${item.href}">${text}</a></li>`
|
|
93
|
+
: `${pad} <li>${text}</li>`;
|
|
94
|
+
})
|
|
95
|
+
.join('\n');
|
|
96
|
+
return items ? `${pad}<ul ${cls}>\n${items}\n${pad}</ul>` : '';
|
|
97
|
+
}
|
|
98
|
+
default:
|
|
99
|
+
return inner ? `${pad}<div ${cls}>${inner}</div>` : '';
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
function esc(text) {
|
|
103
|
+
return text.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"');
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=to-svelte.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"to-svelte.js","sourceRoot":"","sources":["../../src/generators/to-svelte.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MUCV — Generator: VIR → Vue 3 SFC
|
|
3
|
+
* Produce un Single File Component Vue 3 con <template>, <script setup> y <style scoped>.
|
|
4
|
+
*
|
|
5
|
+
* @see docs/VIR-SPEC.md §6
|
|
6
|
+
*/
|
|
7
|
+
import type { VisualIR } from '../core/vir.js';
|
|
8
|
+
export interface VueOptions {
|
|
9
|
+
/** Nombre del componente (default: 'GeneratedComponent') */
|
|
10
|
+
componentName?: string;
|
|
11
|
+
/** Prefijo de clase CSS (default: 'mucv') */
|
|
12
|
+
cssPrefix?: string;
|
|
13
|
+
}
|
|
14
|
+
export declare const vueGenerator: {
|
|
15
|
+
generate(vir: VisualIR, options?: VueOptions): string;
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=to-vue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"to-vue.d.ts","sourceRoot":"","sources":["../../src/generators/to-vue.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAc,MAAM,gBAAgB,CAAA;AAO1D,MAAM,WAAW,UAAU;IACzB,4DAA4D;IAC5D,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,6CAA6C;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAID,eAAO,MAAM,YAAY;kBACT,QAAQ,YAAW,UAAU,GAAQ,MAAM;CA0B1D,CAAA"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MUCV — Generator: VIR → Vue 3 SFC
|
|
3
|
+
* Produce un Single File Component Vue 3 con <template>, <script setup> y <style scoped>.
|
|
4
|
+
*
|
|
5
|
+
* @see docs/VIR-SPEC.md §6
|
|
6
|
+
*/
|
|
7
|
+
import { styleToDeclarations, declsToBlock } from './style-serializer.js';
|
|
8
|
+
import { logger } from '../utils/logger.js';
|
|
9
|
+
import { GenerateError } from '../utils/errors.js';
|
|
10
|
+
// ─── Generator principal ──────────────────────────────────────────────────────
|
|
11
|
+
export const vueGenerator = {
|
|
12
|
+
generate(vir, options = {}) {
|
|
13
|
+
const name = options.componentName ?? 'GeneratedComponent';
|
|
14
|
+
const prefix = options.cssPrefix ?? 'mucv';
|
|
15
|
+
const cssRules = [];
|
|
16
|
+
try {
|
|
17
|
+
const templateLines = vir.root
|
|
18
|
+
.map((node) => renderNode(node, 1, prefix, cssRules))
|
|
19
|
+
.filter(Boolean);
|
|
20
|
+
const template = templateLines.length === 1
|
|
21
|
+
? `<template>\n${templateLines[0]}\n</template>`
|
|
22
|
+
: `<template>\n <div class="${prefix}-root">\n${templateLines.join('\n')}\n </div>\n</template>`;
|
|
23
|
+
const script = `<script setup lang="ts">\n// ${name}\n</script>`;
|
|
24
|
+
const style = `<style scoped>\n${cssRules.filter(Boolean).join('\n\n')}\n</style>`;
|
|
25
|
+
logger.debug({ componentName: name, nodeCount: vir.root.length }, 'Vue SFC generated');
|
|
26
|
+
return [template, script, style].join('\n\n');
|
|
27
|
+
}
|
|
28
|
+
catch (err) {
|
|
29
|
+
throw new GenerateError('Error generating Vue SFC from VIR', {
|
|
30
|
+
error: err instanceof Error ? err.message : String(err),
|
|
31
|
+
virId: vir.id,
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
// ─── Renderizado recursivo ────────────────────────────────────────────────────
|
|
37
|
+
function renderNode(node, depth, prefix, cssRules) {
|
|
38
|
+
const pad = ' '.repeat(depth);
|
|
39
|
+
const nodeClass = `${prefix}-node-${node.id}`;
|
|
40
|
+
const typeClass = `${prefix}-${node.type}`;
|
|
41
|
+
const extraClasses = node.meta?.cssClasses?.join(' ') ?? '';
|
|
42
|
+
const classes = [typeClass, nodeClass, extraClasses].filter(Boolean).join(' ');
|
|
43
|
+
if (node.styles) {
|
|
44
|
+
const block = declsToBlock(`.${nodeClass}`, styleToDeclarations(node.styles));
|
|
45
|
+
if (block)
|
|
46
|
+
cssRules.push(block);
|
|
47
|
+
}
|
|
48
|
+
const children = node.children
|
|
49
|
+
?.map((c) => renderNode(c, depth + 1, prefix, cssRules))
|
|
50
|
+
.filter(Boolean)
|
|
51
|
+
.join('\n') ?? '';
|
|
52
|
+
const inner = children ? `\n${children}\n${pad}` : '';
|
|
53
|
+
return renderVueTag(node, classes, pad, inner);
|
|
54
|
+
}
|
|
55
|
+
// ─── Renderizado de cada tipo de nodo ─────────────────────────────────────────
|
|
56
|
+
function renderVueTag(node, classes, pad, inner) {
|
|
57
|
+
const cls = `class="${classes}"`;
|
|
58
|
+
switch (node.type) {
|
|
59
|
+
case 'section':
|
|
60
|
+
return `${pad}<section ${cls}>${inner}</section>`;
|
|
61
|
+
case 'container':
|
|
62
|
+
case 'custom':
|
|
63
|
+
return inner ? `${pad}<div ${cls}>${inner}</div>` : '';
|
|
64
|
+
case 'flex':
|
|
65
|
+
case 'grid':
|
|
66
|
+
return `${pad}<div ${cls}>${inner}</div>`;
|
|
67
|
+
case 'heading': {
|
|
68
|
+
const h = node.content?.level ?? 2;
|
|
69
|
+
return `${pad}<h${h} ${cls}>${esc(node.content?.text ?? '')}</h${h}>`;
|
|
70
|
+
}
|
|
71
|
+
case 'text': {
|
|
72
|
+
const content = node.content?.richText
|
|
73
|
+
? `<span v-html="${JSON.stringify(node.content.richText)}" />`
|
|
74
|
+
: esc(node.content?.text ?? '');
|
|
75
|
+
return content ? `${pad}<p ${cls}>${content}</p>` : '';
|
|
76
|
+
}
|
|
77
|
+
case 'image': {
|
|
78
|
+
const src = node.content?.src;
|
|
79
|
+
const alt = esc(node.content?.alt ?? '');
|
|
80
|
+
return src ? `${pad}<img ${cls} src="${src}" alt="${alt}" />` : '';
|
|
81
|
+
}
|
|
82
|
+
case 'button': {
|
|
83
|
+
const label = esc(node.content?.label ?? '');
|
|
84
|
+
const href = node.content?.href;
|
|
85
|
+
const target = node.content?.target === '_blank' ? ' target="_blank" rel="noopener noreferrer"' : '';
|
|
86
|
+
return href
|
|
87
|
+
? `${pad}<a ${cls} href="${href}"${target}>${label}</a>`
|
|
88
|
+
: `${pad}<button ${cls}>${label}</button>`;
|
|
89
|
+
}
|
|
90
|
+
case 'list': {
|
|
91
|
+
const items = (node.content?.items ?? [])
|
|
92
|
+
.map((item) => {
|
|
93
|
+
const text = esc(item.text ?? '');
|
|
94
|
+
return item.href
|
|
95
|
+
? `${pad} <li><a href="${item.href}">${text}</a></li>`
|
|
96
|
+
: `${pad} <li>${text}</li>`;
|
|
97
|
+
})
|
|
98
|
+
.join('\n');
|
|
99
|
+
return items ? `${pad}<ul ${cls}>\n${items}\n${pad}</ul>` : '';
|
|
100
|
+
}
|
|
101
|
+
default:
|
|
102
|
+
return inner ? `${pad}<div ${cls}>${inner}</div>` : '';
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
function esc(text) {
|
|
106
|
+
return text.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"');
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=to-vue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"to-vue.js","sourceRoot":"","sources":["../../src/generators/to-vue.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;GAIG"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* MUCV — Motor Universal de Conversión Visual
|
|
4
|
+
* Servidor MCP que expone herramientas de conversión visual
|
|
5
|
+
* y gestión de diseños en WordPress.
|
|
6
|
+
*/
|
|
7
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
8
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
9
|
+
import { z } from 'zod';
|
|
10
|
+
import { SourceTypeInputSchema, TargetTypeInputSchema, PostTypeSchema, } from './schemas/input.schema.js';
|
|
11
|
+
import { convertDesign } from './tools/convert-design.js';
|
|
12
|
+
import { validateVir } from './tools/validate-vir.js';
|
|
13
|
+
import { WordPressConnector } from './tools/wp-connector.js';
|
|
14
|
+
import { getPageDesign, publishDesign, listPages } from './tools/wp-tools.js';
|
|
15
|
+
import { isMUCVError } from './utils/errors.js';
|
|
16
|
+
import { logger } from './utils/logger.js';
|
|
17
|
+
import { RateLimiter } from './utils/rate-limiter.js';
|
|
18
|
+
import { metrics } from './utils/metrics.js';
|
|
19
|
+
const VERSION = '0.5.0';
|
|
20
|
+
// ─── Rate limiter global ──────────────────────────────────────────────────
|
|
21
|
+
const rateLimiter = new RateLimiter({ maxRequestsPerMinute: 60 });
|
|
22
|
+
const startTime = Date.now();
|
|
23
|
+
// ─── Lazy WordPress connector ───────────────────────────────────────────────
|
|
24
|
+
let wpConnector = null;
|
|
25
|
+
function getWPConnector() {
|
|
26
|
+
if (!wpConnector) {
|
|
27
|
+
wpConnector = new WordPressConnector();
|
|
28
|
+
}
|
|
29
|
+
return wpConnector;
|
|
30
|
+
}
|
|
31
|
+
// ─── Helper para formatear errores MCP ──────────────────────────────────────
|
|
32
|
+
function errorResult(error) {
|
|
33
|
+
const message = isMUCVError(error)
|
|
34
|
+
? `[${error.code}] ${error.message}`
|
|
35
|
+
: error instanceof Error
|
|
36
|
+
? error.message
|
|
37
|
+
: 'Unknown error';
|
|
38
|
+
return {
|
|
39
|
+
content: [{ type: 'text', text: message }],
|
|
40
|
+
isError: true,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
// ─── Servidor MCP ───────────────────────────────────────────────────────────
|
|
44
|
+
const server = new McpServer({ name: 'mucv', version: VERSION }, { capabilities: { logging: {} } });
|
|
45
|
+
// ─── Tool: convert_design ───────────────────────────────────────────────────
|
|
46
|
+
server.registerTool('convert_design', {
|
|
47
|
+
title: 'Convert Visual Design',
|
|
48
|
+
description: 'Convert designs between Elementor, HTML, React, Vue, and Svelte formats via VIR intermediate representation.',
|
|
49
|
+
inputSchema: z.object({
|
|
50
|
+
sourceType: SourceTypeInputSchema.describe('Source format'),
|
|
51
|
+
targetType: TargetTypeInputSchema.describe('Target format'),
|
|
52
|
+
content: z.string().min(1).describe('Design content (JSON string for Elementor, HTML string, or JSX/TSX code)'),
|
|
53
|
+
options: z.object({
|
|
54
|
+
optimize: z.boolean().default(true).describe('Apply VIR optimizer before generation'),
|
|
55
|
+
cssNaming: z.enum(['bem', 'utility']).default('bem').describe('CSS naming convention for HTML output'),
|
|
56
|
+
includeVIR: z.boolean().default(false).describe('Include intermediate VIR in response'),
|
|
57
|
+
preserveMeta: z.boolean().default(true).describe('Preserve source metadata for round-trip'),
|
|
58
|
+
}).optional().describe('Conversion options'),
|
|
59
|
+
}),
|
|
60
|
+
}, async (input) => {
|
|
61
|
+
try {
|
|
62
|
+
rateLimiter.check();
|
|
63
|
+
const output = convertDesign(input);
|
|
64
|
+
metrics.record(input.sourceType, input.targetType, output.meta.durationMs, true);
|
|
65
|
+
return {
|
|
66
|
+
content: [{ type: 'text', text: JSON.stringify(output, null, 2) }],
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
metrics.record(input.sourceType, input.targetType, 0, false);
|
|
71
|
+
return errorResult(error);
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
// ─── Tool: validate_vir ─────────────────────────────────────────────────────
|
|
75
|
+
server.registerTool('validate_vir', {
|
|
76
|
+
title: 'Validate VIR',
|
|
77
|
+
description: 'Validate a Visual Intermediate Representation object against the current VIR schema.',
|
|
78
|
+
inputSchema: z.object({
|
|
79
|
+
vir: z.record(z.string(), z.unknown()).describe('VIR object to validate'),
|
|
80
|
+
}),
|
|
81
|
+
}, async ({ vir }) => {
|
|
82
|
+
try {
|
|
83
|
+
rateLimiter.check();
|
|
84
|
+
const output = validateVir(vir);
|
|
85
|
+
return {
|
|
86
|
+
content: [{ type: 'text', text: JSON.stringify(output, null, 2) }],
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
return errorResult(error);
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
// ─── Tool: get_page_design ──────────────────────────────────────────────────
|
|
94
|
+
server.registerTool('get_page_design', {
|
|
95
|
+
title: 'Get Page Design',
|
|
96
|
+
description: 'Fetch a page/post/template design from WordPress and return its VIR representation.',
|
|
97
|
+
inputSchema: z.object({
|
|
98
|
+
pageId: z.number().int().positive().describe('WordPress post/page ID'),
|
|
99
|
+
postType: PostTypeSchema.default('page').describe('WordPress post type'),
|
|
100
|
+
targetType: TargetTypeInputSchema.default('elementor').describe('Optional target format for conversion'),
|
|
101
|
+
}),
|
|
102
|
+
}, async (input) => {
|
|
103
|
+
try {
|
|
104
|
+
rateLimiter.check();
|
|
105
|
+
const connector = getWPConnector();
|
|
106
|
+
const output = await getPageDesign(input, connector);
|
|
107
|
+
return {
|
|
108
|
+
content: [{ type: 'text', text: JSON.stringify(output, null, 2) }],
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
return errorResult(error);
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
// ─── Tool: publish_design ───────────────────────────────────────────────────
|
|
116
|
+
server.registerTool('publish_design', {
|
|
117
|
+
title: 'Publish Design',
|
|
118
|
+
description: 'Publish a design to WordPress. Converts to Elementor format if needed, then creates or updates a page/post.',
|
|
119
|
+
inputSchema: z.object({
|
|
120
|
+
content: z.string().min(1).describe('Design content to publish'),
|
|
121
|
+
sourceType: SourceTypeInputSchema.describe('Format of the content'),
|
|
122
|
+
postType: z.enum(['page', 'post']).default('page').describe('WordPress post type to create/update'),
|
|
123
|
+
pageId: z.number().int().positive().optional().describe('Existing page/post ID to update (omit to create new)'),
|
|
124
|
+
title: z.string().min(1).optional().describe('Page/post title'),
|
|
125
|
+
status: z.enum(['publish', 'draft', 'private']).default('draft').describe('Publication status'),
|
|
126
|
+
}),
|
|
127
|
+
}, async (input) => {
|
|
128
|
+
try {
|
|
129
|
+
rateLimiter.check();
|
|
130
|
+
const connector = getWPConnector();
|
|
131
|
+
const output = await publishDesign(input, connector);
|
|
132
|
+
return {
|
|
133
|
+
content: [{ type: 'text', text: JSON.stringify(output, null, 2) }],
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
catch (error) {
|
|
137
|
+
return errorResult(error);
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
// ─── Tool: list_pages ───────────────────────────────────────────────────────
|
|
141
|
+
server.registerTool('list_pages', {
|
|
142
|
+
title: 'List Pages',
|
|
143
|
+
description: 'List pages, posts, or Elementor templates from WordPress with their Elementor status.',
|
|
144
|
+
inputSchema: z.object({
|
|
145
|
+
postType: PostTypeSchema.default('page').describe('WordPress post type to list'),
|
|
146
|
+
limit: z.number().int().min(1).max(100).default(20).describe('Number of results per page'),
|
|
147
|
+
offset: z.number().int().min(0).default(0).describe('Offset for pagination'),
|
|
148
|
+
status: z.enum(['publish', 'draft', 'private', 'any']).default('any').describe('Filter by post status'),
|
|
149
|
+
search: z.string().optional().describe('Search by title'),
|
|
150
|
+
}),
|
|
151
|
+
}, async (input) => {
|
|
152
|
+
try {
|
|
153
|
+
rateLimiter.check();
|
|
154
|
+
const connector = getWPConnector();
|
|
155
|
+
const output = await listPages(input, connector);
|
|
156
|
+
return {
|
|
157
|
+
content: [{ type: 'text', text: JSON.stringify(output, null, 2) }],
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
catch (error) {
|
|
161
|
+
return errorResult(error);
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
// ─── Tool: health_check ──────────────────────────────────────────────────
|
|
165
|
+
server.registerTool('health_check', {
|
|
166
|
+
title: 'Health Check',
|
|
167
|
+
description: 'Returns the health status of the MUCV MCP server including uptime, memory usage, and rate limiter stats.',
|
|
168
|
+
inputSchema: z.object({}),
|
|
169
|
+
}, async () => {
|
|
170
|
+
const uptimeMs = Date.now() - startTime;
|
|
171
|
+
const memoryUsage = process.memoryUsage();
|
|
172
|
+
const health = {
|
|
173
|
+
status: 'healthy',
|
|
174
|
+
version: VERSION,
|
|
175
|
+
uptimeMs,
|
|
176
|
+
uptimeFormatted: formatUptime(uptimeMs),
|
|
177
|
+
memory: {
|
|
178
|
+
rss: formatBytes(memoryUsage.rss),
|
|
179
|
+
heapUsed: formatBytes(memoryUsage.heapUsed),
|
|
180
|
+
heapTotal: formatBytes(memoryUsage.heapTotal),
|
|
181
|
+
},
|
|
182
|
+
rateLimiter: rateLimiter.getStats(),
|
|
183
|
+
};
|
|
184
|
+
return {
|
|
185
|
+
content: [{ type: 'text', text: JSON.stringify(health, null, 2) }],
|
|
186
|
+
};
|
|
187
|
+
});
|
|
188
|
+
// ─── Tool: get_metrics ───────────────────────────────────────────────────
|
|
189
|
+
server.registerTool('get_metrics', {
|
|
190
|
+
title: 'Get Metrics',
|
|
191
|
+
description: 'Returns conversion metrics including totals, success/failure rates, and recent conversions.',
|
|
192
|
+
inputSchema: z.object({}),
|
|
193
|
+
}, async () => {
|
|
194
|
+
const metricsData = metrics.getMetrics();
|
|
195
|
+
return {
|
|
196
|
+
content: [{ type: 'text', text: JSON.stringify(metricsData, null, 2) }],
|
|
197
|
+
};
|
|
198
|
+
});
|
|
199
|
+
// ─── Helpers de formato ──────────────────────────────────────────────────
|
|
200
|
+
function formatUptime(ms) {
|
|
201
|
+
const seconds = Math.floor(ms / 1000) % 60;
|
|
202
|
+
const minutes = Math.floor(ms / 60_000) % 60;
|
|
203
|
+
const hours = Math.floor(ms / 3_600_000);
|
|
204
|
+
return `${hours}h ${minutes}m ${seconds}s`;
|
|
205
|
+
}
|
|
206
|
+
function formatBytes(bytes) {
|
|
207
|
+
const mb = (bytes / 1_048_576).toFixed(1);
|
|
208
|
+
return `${mb} MB`;
|
|
209
|
+
}
|
|
210
|
+
// ─── Startup ────────────────────────────────────────────────────────────────
|
|
211
|
+
async function main() {
|
|
212
|
+
const transport = new StdioServerTransport();
|
|
213
|
+
await server.connect(transport);
|
|
214
|
+
logger.info({ version: VERSION }, 'MUCV MCP Server started');
|
|
215
|
+
}
|
|
216
|
+
main().catch((error) => {
|
|
217
|
+
logger.error({ error }, 'Fatal error starting MUCV MCP Server');
|
|
218
|
+
process.exit(1);
|
|
219
|
+
});
|
|
220
|
+
// ─── Graceful shutdown ──────────────────────────────────────────────────────
|
|
221
|
+
function shutdown() {
|
|
222
|
+
logger.info('Shutting down MUCV MCP Server');
|
|
223
|
+
server.close().catch(() => { });
|
|
224
|
+
process.exit(0);
|
|
225
|
+
}
|
|
226
|
+
process.on('SIGINT', shutdown);
|
|
227
|
+
process.on('SIGTERM', shutdown);
|
|
228
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|