@hale-bopp/valentino-engine 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (144) hide show
  1. package/AGENTS.md +49 -0
  2. package/CHANGELOG.md +22 -0
  3. package/LICENSE +21 -0
  4. package/README.md +108 -0
  5. package/dist/bin/commands/audit.d.ts +2 -0
  6. package/dist/bin/commands/audit.d.ts.map +1 -0
  7. package/dist/bin/commands/audit.js +24 -0
  8. package/dist/bin/commands/audit.js.map +1 -0
  9. package/dist/bin/commands/catalog.d.ts +2 -0
  10. package/dist/bin/commands/catalog.d.ts.map +1 -0
  11. package/dist/bin/commands/catalog.js +21 -0
  12. package/dist/bin/commands/catalog.js.map +1 -0
  13. package/dist/bin/commands/contrast.d.ts +2 -0
  14. package/dist/bin/commands/contrast.d.ts.map +1 -0
  15. package/dist/bin/commands/contrast.js +22 -0
  16. package/dist/bin/commands/contrast.js.map +1 -0
  17. package/dist/bin/commands/guardrails.d.ts +2 -0
  18. package/dist/bin/commands/guardrails.d.ts.map +1 -0
  19. package/dist/bin/commands/guardrails.js +18 -0
  20. package/dist/bin/commands/guardrails.js.map +1 -0
  21. package/dist/bin/commands/manifest.d.ts +2 -0
  22. package/dist/bin/commands/manifest.d.ts.map +1 -0
  23. package/dist/bin/commands/manifest.js +21 -0
  24. package/dist/bin/commands/manifest.js.map +1 -0
  25. package/dist/bin/commands/probe.d.ts +2 -0
  26. package/dist/bin/commands/probe.d.ts.map +1 -0
  27. package/dist/bin/commands/probe.js +59 -0
  28. package/dist/bin/commands/probe.js.map +1 -0
  29. package/dist/bin/commands/validate.d.ts +2 -0
  30. package/dist/bin/commands/validate.d.ts.map +1 -0
  31. package/dist/bin/commands/validate.js +19 -0
  32. package/dist/bin/commands/validate.js.map +1 -0
  33. package/dist/bin/valentino.d.ts +7 -0
  34. package/dist/bin/valentino.d.ts.map +1 -0
  35. package/dist/bin/valentino.js +62 -0
  36. package/dist/bin/valentino.js.map +1 -0
  37. package/dist/core/catalog.d.ts +13 -0
  38. package/dist/core/catalog.d.ts.map +1 -0
  39. package/dist/core/catalog.js +63 -0
  40. package/dist/core/catalog.js.map +1 -0
  41. package/dist/core/catalog.test.d.ts +2 -0
  42. package/dist/core/catalog.test.d.ts.map +1 -0
  43. package/dist/core/catalog.test.js +115 -0
  44. package/dist/core/catalog.test.js.map +1 -0
  45. package/dist/core/contrast.d.ts +42 -0
  46. package/dist/core/contrast.d.ts.map +1 -0
  47. package/dist/core/contrast.js +98 -0
  48. package/dist/core/contrast.js.map +1 -0
  49. package/dist/core/contrast.test.d.ts +2 -0
  50. package/dist/core/contrast.test.d.ts.map +1 -0
  51. package/dist/core/contrast.test.js +82 -0
  52. package/dist/core/contrast.test.js.map +1 -0
  53. package/dist/core/css-named-colors.d.ts +7 -0
  54. package/dist/core/css-named-colors.d.ts.map +1 -0
  55. package/dist/core/css-named-colors.js +45 -0
  56. package/dist/core/css-named-colors.js.map +1 -0
  57. package/dist/core/guardrails.d.ts +16 -0
  58. package/dist/core/guardrails.d.ts.map +1 -0
  59. package/dist/core/guardrails.js +55 -0
  60. package/dist/core/guardrails.js.map +1 -0
  61. package/dist/core/guardrails.test.d.ts +2 -0
  62. package/dist/core/guardrails.test.d.ts.map +1 -0
  63. package/dist/core/guardrails.test.js +88 -0
  64. package/dist/core/guardrails.test.js.map +1 -0
  65. package/dist/core/hero-contract.d.ts +21 -0
  66. package/dist/core/hero-contract.d.ts.map +1 -0
  67. package/dist/core/hero-contract.js +70 -0
  68. package/dist/core/hero-contract.js.map +1 -0
  69. package/dist/core/hero-contract.test.d.ts +2 -0
  70. package/dist/core/hero-contract.test.d.ts.map +1 -0
  71. package/dist/core/hero-contract.test.js +71 -0
  72. package/dist/core/hero-contract.test.js.map +1 -0
  73. package/dist/core/manifest.d.ts +8 -0
  74. package/dist/core/manifest.d.ts.map +1 -0
  75. package/dist/core/manifest.js +17 -0
  76. package/dist/core/manifest.js.map +1 -0
  77. package/dist/core/manifest.test.d.ts +2 -0
  78. package/dist/core/manifest.test.d.ts.map +1 -0
  79. package/dist/core/manifest.test.js +45 -0
  80. package/dist/core/manifest.test.js.map +1 -0
  81. package/dist/core/page-spec.d.ts +14 -0
  82. package/dist/core/page-spec.d.ts.map +1 -0
  83. package/dist/core/page-spec.js +20 -0
  84. package/dist/core/page-spec.js.map +1 -0
  85. package/dist/core/page-spec.test.d.ts +2 -0
  86. package/dist/core/page-spec.test.d.ts.map +1 -0
  87. package/dist/core/page-spec.test.js +38 -0
  88. package/dist/core/page-spec.test.js.map +1 -0
  89. package/dist/core/presentation.d.ts +9 -0
  90. package/dist/core/presentation.d.ts.map +1 -0
  91. package/dist/core/presentation.js +65 -0
  92. package/dist/core/presentation.js.map +1 -0
  93. package/dist/core/presentation.test.d.ts +2 -0
  94. package/dist/core/presentation.test.d.ts.map +1 -0
  95. package/dist/core/presentation.test.js +63 -0
  96. package/dist/core/presentation.test.js.map +1 -0
  97. package/dist/core/rhythm.d.ts +25 -0
  98. package/dist/core/rhythm.d.ts.map +1 -0
  99. package/dist/core/rhythm.js +67 -0
  100. package/dist/core/rhythm.js.map +1 -0
  101. package/dist/core/rhythm.test.d.ts +2 -0
  102. package/dist/core/rhythm.test.d.ts.map +1 -0
  103. package/dist/core/rhythm.test.js +69 -0
  104. package/dist/core/rhythm.test.js.map +1 -0
  105. package/dist/core/section-integrity.d.ts +30 -0
  106. package/dist/core/section-integrity.d.ts.map +1 -0
  107. package/dist/core/section-integrity.js +72 -0
  108. package/dist/core/section-integrity.js.map +1 -0
  109. package/dist/core/section-integrity.test.d.ts +2 -0
  110. package/dist/core/section-integrity.test.d.ts.map +1 -0
  111. package/dist/core/section-integrity.test.js +83 -0
  112. package/dist/core/section-integrity.test.js.map +1 -0
  113. package/dist/core/types.d.ts +456 -0
  114. package/dist/core/types.d.ts.map +1 -0
  115. package/dist/core/types.js +7 -0
  116. package/dist/core/types.js.map +1 -0
  117. package/dist/index.d.ts +21 -0
  118. package/dist/index.d.ts.map +1 -0
  119. package/dist/index.js +23 -0
  120. package/dist/index.js.map +1 -0
  121. package/dist/mcp/index.d.ts +2 -0
  122. package/dist/mcp/index.d.ts.map +1 -0
  123. package/dist/mcp/index.js +126 -0
  124. package/dist/mcp/index.js.map +1 -0
  125. package/dist/skills/design-guidelines.d.ts +6 -0
  126. package/dist/skills/design-guidelines.d.ts.map +1 -0
  127. package/dist/skills/design-guidelines.js +11 -0
  128. package/dist/skills/design-guidelines.js.map +1 -0
  129. package/dist/skills/index.d.ts +7 -0
  130. package/dist/skills/index.d.ts.map +1 -0
  131. package/dist/skills/index.js +7 -0
  132. package/dist/skills/index.js.map +1 -0
  133. package/dist/skills/premium-design.d.ts +6 -0
  134. package/dist/skills/premium-design.d.ts.map +1 -0
  135. package/dist/skills/premium-design.js +11 -0
  136. package/dist/skills/premium-design.js.map +1 -0
  137. package/dist/skills/web-guardrails.d.ts +6 -0
  138. package/dist/skills/web-guardrails.d.ts.map +1 -0
  139. package/dist/skills/web-guardrails.js +11 -0
  140. package/dist/skills/web-guardrails.js.map +1 -0
  141. package/package.json +69 -0
  142. package/skills/valentino-premium-design.md +10 -0
  143. package/skills/valentino-web-guardrails.md +9 -0
  144. package/skills/web-design-guidelines.md +9 -0
@@ -0,0 +1,126 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
3
+ import { z } from 'zod';
4
+ import { checkNoHardcodedPx, checkNoHardcodedColor, checkNoNamedColor } from '../core/guardrails.js';
5
+ import { validatePageSpec } from '../core/page-spec.js';
6
+ import { premiumDesignSkill, webGuardrailsSkill, designGuidelinesSkill } from '../skills/index.js';
7
+ import { checkWcagContrast } from '../core/contrast.js';
8
+ import { probeRhythm } from '../core/rhythm.js';
9
+ import { probeHeroContract } from '../core/hero-contract.js';
10
+ import { probeSectionIntegrity } from '../core/section-integrity.js';
11
+ import { resolvePageSpecWithCatalog } from '../core/catalog.js';
12
+ import { resolvePageIdByRoute } from '../core/manifest.js';
13
+ const server = new McpServer({
14
+ name: 'valentino-engine',
15
+ version: '0.2.0',
16
+ });
17
+ function jsonResult(data) {
18
+ return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
19
+ }
20
+ function parseSpec(spec) {
21
+ const parsed = JSON.parse(spec);
22
+ if (!validatePageSpec(parsed))
23
+ throw new Error('Invalid PageSpecV1: requires version "1", id, sections[]');
24
+ return parsed;
25
+ }
26
+ // ─── Audit ────────────────────────────────────────────────────────────────────
27
+ server.tool('valentino_audit_css', 'Audit a CSS string for hardcoded px values, hex/rgba colors, and named CSS colors.', { css: z.string().describe('CSS content to audit') }, async ({ css }) => {
28
+ const violations = [
29
+ ...checkNoHardcodedPx(css),
30
+ ...checkNoHardcodedColor(css),
31
+ ...checkNoNamedColor(css),
32
+ ];
33
+ return jsonResult(violations.length === 0
34
+ ? { valid: true, message: 'No guardrail violations found.' }
35
+ : { valid: false, violations });
36
+ });
37
+ // ─── Validate ─────────────────────────────────────────────────────────────────
38
+ server.tool('valentino_validate_pagespec', 'Validate a Runtime PageSpec JSON against PageSpecV1 contract (version "1", id, sections[]).', { spec: z.string().describe('PageSpec JSON string') }, async ({ spec }) => {
39
+ try {
40
+ const parsed = JSON.parse(spec);
41
+ const valid = validatePageSpec(parsed);
42
+ return jsonResult({ valid, message: valid ? 'PageSpec is valid (V1).' : 'Invalid: requires version "1", id (string), sections (array).' });
43
+ }
44
+ catch (e) {
45
+ return jsonResult({ valid: false, message: `Invalid JSON: ${String(e)}` });
46
+ }
47
+ });
48
+ // ─── Contrast ─────────────────────────────────────────────────────────────────
49
+ server.tool('valentino_check_contrast', 'Check WCAG 2.1 contrast ratio between two colors. Returns ratio and pass/fail.', {
50
+ foreground: z.string().describe('Foreground color (#hex or rgb())'),
51
+ background: z.string().describe('Background color (#hex or rgb())'),
52
+ level: z.enum(['AA', 'AAA']).optional().describe('WCAG level (default: AA)'),
53
+ }, async ({ foreground, background, level }) => {
54
+ return jsonResult(checkWcagContrast(foreground, background, level || 'AA'));
55
+ });
56
+ // ─── Probes ───────────────────────────────────────────────────────────────────
57
+ server.tool('valentino_probe_rhythm', 'Validate section sequence rhythm: hero-first, no consecutive same rhythm, spacer rules.', { spec: z.string().describe('PageSpec JSON string') }, async ({ spec }) => jsonResult(probeRhythm(parseSpec(spec))));
58
+ server.tool('valentino_probe_hero', 'Validate hero section contract: CTA discipline, single decorative source, copy density.', { spec: z.string().describe('PageSpec JSON string') }, async ({ spec }) => {
59
+ const pageSpec = parseSpec(spec);
60
+ const heroes = pageSpec.sections.filter((s) => s.type === 'hero');
61
+ if (heroes.length === 0)
62
+ return jsonResult({ valid: true, message: 'No hero sections found.' });
63
+ return jsonResult(heroes.map(h => ({ titleKey: h.titleKey, ...probeHeroContract(h) })));
64
+ });
65
+ server.tool('valentino_probe_integrity', 'Validate structural integrity of all sections (cards items, form fields, etc.).', { spec: z.string().describe('PageSpec JSON string') }, async ({ spec }) => jsonResult(probeSectionIntegrity(parseSpec(spec).sections)));
66
+ server.tool('valentino_probe_all', 'Run all validation probes (rhythm + hero + integrity) on a PageSpec.', { spec: z.string().describe('PageSpec JSON string') }, async ({ spec }) => {
67
+ const pageSpec = parseSpec(spec);
68
+ const heroes = pageSpec.sections.filter((s) => s.type === 'hero');
69
+ return jsonResult({
70
+ rhythm: probeRhythm(pageSpec),
71
+ hero: heroes.map(h => ({ titleKey: h.titleKey, ...probeHeroContract(h) })),
72
+ integrity: probeSectionIntegrity(pageSpec.sections),
73
+ });
74
+ });
75
+ // ─── Catalog ──────────────────────────────────────────────────────────────────
76
+ server.tool('valentino_resolve_catalog', 'Resolve a PageSpec against a Valentino catalog (blueprints, presets, templates).', {
77
+ spec: z.string().describe('PageSpec JSON string'),
78
+ catalog: z.string().describe('ValentinoCatalogV1 JSON string'),
79
+ }, async ({ spec, catalog }) => {
80
+ const pageSpec = parseSpec(spec);
81
+ const cat = JSON.parse(catalog);
82
+ return jsonResult(resolvePageSpecWithCatalog(pageSpec, cat));
83
+ });
84
+ // ─── Manifest ─────────────────────────────────────────────────────────────────
85
+ server.tool('valentino_resolve_route', 'Resolve a URL route to a page ID using a pages manifest.', {
86
+ manifest: z.string().describe('PagesManifestV1 JSON string'),
87
+ route: z.string().describe('URL pathname to resolve (e.g., /pricing)'),
88
+ }, async ({ manifest, route }) => {
89
+ const man = JSON.parse(manifest);
90
+ const pageId = resolvePageIdByRoute(man, route);
91
+ return jsonResult(pageId
92
+ ? { found: true, pageId }
93
+ : { found: false, message: `No page found for route "${route}"` });
94
+ });
95
+ // ─── Skills ───────────────────────────────────────────────────────────────────
96
+ server.tool('valentino_get_skill', 'Get the rules for a Valentino Engine design skill.', { skill: z.enum(['premium-design', 'web-guardrails', 'design-guidelines']).describe('Skill name') }, async ({ skill }) => {
97
+ const map = { 'premium-design': premiumDesignSkill, 'web-guardrails': webGuardrailsSkill, 'design-guidelines': designGuidelinesSkill };
98
+ return jsonResult(map[skill]);
99
+ });
100
+ server.tool('valentino_list_guardrails', 'List all 10 Sovereign Guardrails of Valentino Engine.', {}, async () => {
101
+ const guardrails = [
102
+ '1. WhatIf di Layout — Never generate code without a conceptual wireframe first',
103
+ '2. Component Boundary & Fallbacks — All API bridges must include Error Boundaries',
104
+ '3. Design Token System — No magic numbers or hardcoded hex/rgba values',
105
+ '4. L3 Audit before Commit — Check for dependency bloat and ARIA compliance',
106
+ '5. Escalation to GEDI — Consult GEDI on architectural trade-offs',
107
+ '6. Zero UI-Debt — Always scan for reusable components before creating new ones',
108
+ '7. Electrical Socket Pattern — Colors via CSS root variables only',
109
+ '8. Testudo Formation — Respect parent container padding, no inline overrides',
110
+ '9. Tangible Legacy — No redundant CSS blocks; use utility classes',
111
+ '10. Visual Live Audit — Use MCP browser_screenshot or npm run test:e2e:valentino',
112
+ ];
113
+ return { content: [{ type: 'text', text: guardrails.join('\n') }] };
114
+ });
115
+ // ─── Start ────────────────────────────────────────────────────────────────────
116
+ async function main() {
117
+ const transport = new StdioServerTransport();
118
+ await server.connect(transport);
119
+ console.error('valentino-engine MCP server running on stdio (13 tools)');
120
+ process.stdin.resume();
121
+ }
122
+ main().catch((err) => {
123
+ console.error('MCP server error:', err);
124
+ process.exit(1);
125
+ });
126
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export declare const designGuidelinesSkill: {
2
+ readonly name: "web-design-guidelines";
3
+ readonly description: "Provide a unified baseline for web ergonomics, typography, and responsive layouts.";
4
+ readonly rules: readonly ["Mobile-first layout architecture", "Use only CSS token variables for font sizes (--text-step-*)", "No hardcoded container widths — use fluid max-width with clamp()", "Spacing scales must follow the 8-point grid system via CSS variables"];
5
+ };
6
+ //# sourceMappingURL=design-guidelines.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"design-guidelines.d.ts","sourceRoot":"","sources":["../../src/skills/design-guidelines.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,qBAAqB;;;;CASxB,CAAC"}
@@ -0,0 +1,11 @@
1
+ export const designGuidelinesSkill = {
2
+ name: 'web-design-guidelines',
3
+ description: 'Provide a unified baseline for web ergonomics, typography, and responsive layouts.',
4
+ rules: [
5
+ 'Mobile-first layout architecture',
6
+ 'Use only CSS token variables for font sizes (--text-step-*)',
7
+ 'No hardcoded container widths — use fluid max-width with clamp()',
8
+ 'Spacing scales must follow the 8-point grid system via CSS variables',
9
+ ],
10
+ };
11
+ //# sourceMappingURL=design-guidelines.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"design-guidelines.js","sourceRoot":"","sources":["../../src/skills/design-guidelines.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,IAAI,EAAE,uBAAuB;IAC7B,WAAW,EAAE,oFAAoF;IACjG,KAAK,EAAE;QACL,kCAAkC;QAClC,6DAA6D;QAC7D,kEAAkE;QAClE,sEAAsE;KACvE;CACO,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Skills index — re-exports all loadable skill definitions.
3
+ */
4
+ export { premiumDesignSkill } from './premium-design.js';
5
+ export { webGuardrailsSkill } from './web-guardrails.js';
6
+ export { designGuidelinesSkill } from './design-guidelines.js';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/skills/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Skills index — re-exports all loadable skill definitions.
3
+ */
4
+ export { premiumDesignSkill } from './premium-design.js';
5
+ export { webGuardrailsSkill } from './web-guardrails.js';
6
+ export { designGuidelinesSkill } from './design-guidelines.js';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/skills/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,6 @@
1
+ export declare const premiumDesignSkill: {
2
+ readonly name: "valentino-premium-design";
3
+ readonly description: "Enforce premium visual standards: micro-animations, soft gradients, modern typography, generous negative space.";
4
+ readonly rules: readonly ["Use Inter or Outfit as the primary font family", "Prefer subtle gradients over flat solid backgrounds", "Maintain minimum spacing of var(--valentino-rhythm-space-block-md)", "Add transition: all 0.2s ease on all interactive elements"];
5
+ };
6
+ //# sourceMappingURL=premium-design.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"premium-design.d.ts","sourceRoot":"","sources":["../../src/skills/premium-design.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB;;;;CASrB,CAAC"}
@@ -0,0 +1,11 @@
1
+ export const premiumDesignSkill = {
2
+ name: 'valentino-premium-design',
3
+ description: 'Enforce premium visual standards: micro-animations, soft gradients, modern typography, generous negative space.',
4
+ rules: [
5
+ 'Use Inter or Outfit as the primary font family',
6
+ 'Prefer subtle gradients over flat solid backgrounds',
7
+ 'Maintain minimum spacing of var(--valentino-rhythm-space-block-md)',
8
+ 'Add transition: all 0.2s ease on all interactive elements',
9
+ ],
10
+ };
11
+ //# sourceMappingURL=premium-design.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"premium-design.js","sourceRoot":"","sources":["../../src/skills/premium-design.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,IAAI,EAAE,0BAA0B;IAChC,WAAW,EAAE,iHAAiH;IAC9H,KAAK,EAAE;QACL,gDAAgD;QAChD,qDAAqD;QACrD,oEAAoE;QACpE,2DAA2D;KAC5D;CACO,CAAC"}
@@ -0,0 +1,6 @@
1
+ export declare const webGuardrailsSkill: {
2
+ readonly name: "valentino-web-guardrails";
3
+ readonly description: "Enforce ARIA, semantic HTML, and performance compliance on all generated components.";
4
+ readonly rules: readonly ["Every interactive element must have an aria-label or labelKey", "Images must have alt text", "Avoid layout-triggering CSS properties (width, height) in animations", "Respect OPS vs Product UI boundary"];
5
+ };
6
+ //# sourceMappingURL=web-guardrails.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-guardrails.d.ts","sourceRoot":"","sources":["../../src/skills/web-guardrails.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB;;;;CASrB,CAAC"}
@@ -0,0 +1,11 @@
1
+ export const webGuardrailsSkill = {
2
+ name: 'valentino-web-guardrails',
3
+ description: 'Enforce ARIA, semantic HTML, and performance compliance on all generated components.',
4
+ rules: [
5
+ 'Every interactive element must have an aria-label or labelKey',
6
+ 'Images must have alt text',
7
+ 'Avoid layout-triggering CSS properties (width, height) in animations',
8
+ 'Respect OPS vs Product UI boundary',
9
+ ],
10
+ };
11
+ //# sourceMappingURL=web-guardrails.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-guardrails.js","sourceRoot":"","sources":["../../src/skills/web-guardrails.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,IAAI,EAAE,0BAA0B;IAChC,WAAW,EAAE,sFAAsF;IACnG,KAAK,EAAE;QACL,+DAA+D;QAC/D,2BAA2B;QAC3B,sEAAsE;QACtE,oCAAoC;KACrC;CACO,CAAC"}
package/package.json ADDED
@@ -0,0 +1,69 @@
1
+ {
2
+ "name": "@hale-bopp/valentino-engine",
3
+ "version": "1.0.0",
4
+ "description": "Antifragile Open Source UI Design Engine — generates Runtime PageSpec JSON, validates accessibility, enforces Design Tokens, and consults GEDI for architectural decisions.",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ },
13
+ "./mcp": {
14
+ "types": "./dist/mcp/index.d.ts",
15
+ "import": "./dist/mcp/index.js"
16
+ }
17
+ },
18
+ "bin": {
19
+ "valentino": "dist/bin/valentino.js"
20
+ },
21
+ "files": [
22
+ "dist",
23
+ "README.md",
24
+ "LICENSE",
25
+ "CHANGELOG.md",
26
+ "AGENTS.md",
27
+ "skills"
28
+ ],
29
+ "publishConfig": {
30
+ "access": "public"
31
+ },
32
+ "scripts": {
33
+ "build": "tsc",
34
+ "dev": "tsx watch src/index.ts",
35
+ "test": "vitest run",
36
+ "mcp": "tsx src/mcp/index.ts",
37
+ "audit": "tsx src/bin/valentino.ts audit",
38
+ "probe": "tsx src/bin/valentino.ts probe",
39
+ "contrast": "tsx src/bin/valentino.ts contrast"
40
+ },
41
+ "keywords": [
42
+ "ui",
43
+ "design-system",
44
+ "mcp",
45
+ "agent",
46
+ "antifragile",
47
+ "accessibility",
48
+ "open-source"
49
+ ],
50
+ "license": "MIT",
51
+ "author": "EasyWay Platform Team",
52
+ "repository": {
53
+ "type": "git",
54
+ "url": "https://dev.azure.com/EasyWayData/EasyWay-DataPortal/_git/hale-bopp-valentino-engine"
55
+ },
56
+ "dependencies": {
57
+ "@modelcontextprotocol/sdk": "^1.0.0",
58
+ "zod": "^3.24.0"
59
+ },
60
+ "devDependencies": {
61
+ "typescript": "^5.7.0",
62
+ "tsx": "^4.19.0",
63
+ "vitest": "^2.1.0",
64
+ "@types/node": "^22.10.0"
65
+ },
66
+ "engines": {
67
+ "node": ">=20.0.0"
68
+ }
69
+ }
@@ -0,0 +1,10 @@
1
+ # Skill: Valentino Premium Design
2
+
3
+ ## Objective
4
+ Garantisci che ogni implementazione UI rispondi a requisiti estetici "Premium".
5
+
6
+ ## Guidelines
7
+ 1. I contrasti devono essere bilanciati e accessibili.
8
+ 2. Prediligi i gradienti soft o effetti glassmorphism se il contesto lo richiede.
9
+ 3. Lo spazio negativo è fondamentale: usa sempre le variabili `--valentino-rhythm-*` per donare respiro all'interfaccia.
10
+ 4. Non usare mai grigi piatti (es. `#eee`), ma sempre colori semantici root o neural palette scalati.
@@ -0,0 +1,9 @@
1
+ # Skill: Valentino Web Guardrails
2
+
3
+ ## Objective
4
+ Enforce strict performance, accessibility, and platform compliance parameters on all generated frontend code.
5
+
6
+ ## Guidelines
7
+ 1. ARIA labels obbligatori su ogni elemento interattivo.
8
+ 2. Controllare le performance di reflow CSS.
9
+ 3. Applicare rigorosamente la distinzione tra OPS (Operations) e PRODUCT UI.
@@ -0,0 +1,9 @@
1
+ # Skill: Web Design Guidelines
2
+
3
+ ## Objective
4
+ Provide a unified baseline for web ergonomics and typography.
5
+
6
+ ## Guidelines
7
+ 1. Usa solo i token CSS pre-configurati nei framework (es. `--text-step-0`).
8
+ 2. Sostieni i form factor fluidi ed eludi width statiche (no hardcoded px widths per i container).
9
+ 3. Mobile-first design architecture.