@hale-bopp/valentino-engine 2.1.0 → 2.3.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 +63 -2
- package/dist/bin/commands/cockpit.d.ts +16 -0
- package/dist/bin/commands/cockpit.d.ts.map +1 -0
- package/dist/bin/commands/cockpit.js +205 -0
- package/dist/bin/commands/cockpit.js.map +1 -0
- package/dist/bin/commands/theme-audit.d.ts +7 -0
- package/dist/bin/commands/theme-audit.d.ts.map +1 -0
- package/dist/bin/commands/theme-audit.js +70 -0
- package/dist/bin/commands/theme-audit.js.map +1 -0
- package/dist/bin/commands/validate.d.ts.map +1 -1
- package/dist/bin/commands/validate.js +94 -1
- package/dist/bin/commands/validate.js.map +1 -1
- package/dist/bin/valentino.js +15 -1
- package/dist/bin/valentino.js.map +1 -1
- package/dist/cockpit-server.d.ts +17 -0
- package/dist/cockpit-server.d.ts.map +1 -0
- package/dist/cockpit-server.js +505 -0
- package/dist/cockpit-server.js.map +1 -0
- package/dist/cockpit-web/index.html +979 -0
- package/dist/core/cockpit-api.d.ts +99 -0
- package/dist/core/cockpit-api.d.ts.map +1 -0
- package/dist/core/cockpit-api.js +269 -0
- package/dist/core/cockpit-api.js.map +1 -0
- package/dist/core/cockpit-repl.d.ts +51 -0
- package/dist/core/cockpit-repl.d.ts.map +1 -0
- package/dist/core/cockpit-repl.js +217 -0
- package/dist/core/cockpit-repl.js.map +1 -0
- package/dist/core/contrast-usage-probe.d.ts +84 -0
- package/dist/core/contrast-usage-probe.d.ts.map +1 -0
- package/dist/core/contrast-usage-probe.js +244 -0
- package/dist/core/contrast-usage-probe.js.map +1 -0
- package/dist/core/contrast-usage-probe.test.d.ts +2 -0
- package/dist/core/contrast-usage-probe.test.d.ts.map +1 -0
- package/dist/core/contrast-usage-probe.test.js +186 -0
- package/dist/core/contrast-usage-probe.test.js.map +1 -0
- package/dist/core/editor.d.ts +80 -0
- package/dist/core/editor.d.ts.map +1 -0
- package/dist/core/editor.js +421 -0
- package/dist/core/editor.js.map +1 -0
- package/dist/core/gallery.d.ts +53 -0
- package/dist/core/gallery.d.ts.map +1 -0
- package/dist/core/gallery.js +123 -0
- package/dist/core/gallery.js.map +1 -0
- package/dist/core/gallery.test.d.ts +2 -0
- package/dist/core/gallery.test.d.ts.map +1 -0
- package/dist/core/gallery.test.js +127 -0
- package/dist/core/gallery.test.js.map +1 -0
- package/dist/core/intent-parser.d.ts +67 -0
- package/dist/core/intent-parser.d.ts.map +1 -0
- package/dist/core/intent-parser.js +485 -0
- package/dist/core/intent-parser.js.map +1 -0
- package/dist/core/openrouter-client.d.ts +38 -0
- package/dist/core/openrouter-client.d.ts.map +1 -0
- package/dist/core/openrouter-client.js +123 -0
- package/dist/core/openrouter-client.js.map +1 -0
- package/dist/core/page-generator.d.ts +85 -0
- package/dist/core/page-generator.d.ts.map +1 -0
- package/dist/core/page-generator.js +353 -0
- package/dist/core/page-generator.js.map +1 -0
- package/dist/core/page-generator.test.d.ts +2 -0
- package/dist/core/page-generator.test.d.ts.map +1 -0
- package/dist/core/page-generator.test.js +138 -0
- package/dist/core/page-generator.test.js.map +1 -0
- package/dist/core/page-status.d.ts +15 -1
- package/dist/core/page-status.d.ts.map +1 -1
- package/dist/core/page-status.js +21 -0
- package/dist/core/page-status.js.map +1 -1
- package/dist/core/project-adapter.d.ts +73 -0
- package/dist/core/project-adapter.d.ts.map +1 -0
- package/dist/core/project-adapter.js +364 -0
- package/dist/core/project-adapter.js.map +1 -0
- package/dist/core/schema-export.d.ts +32 -0
- package/dist/core/schema-export.d.ts.map +1 -0
- package/dist/core/schema-export.js +493 -0
- package/dist/core/schema-export.js.map +1 -0
- package/dist/core/theme-audit.d.ts +104 -0
- package/dist/core/theme-audit.d.ts.map +1 -0
- package/dist/core/theme-audit.js +127 -0
- package/dist/core/theme-audit.js.map +1 -0
- package/dist/core/theme-audit.test.d.ts +2 -0
- package/dist/core/theme-audit.test.d.ts.map +1 -0
- package/dist/core/theme-audit.test.js +198 -0
- package/dist/core/theme-audit.test.js.map +1 -0
- package/dist/core/url-import.d.ts +41 -0
- package/dist/core/url-import.d.ts.map +1 -0
- package/dist/core/url-import.js +207 -0
- package/dist/core/url-import.js.map +1 -0
- package/dist/core/video-import.d.ts +46 -0
- package/dist/core/video-import.d.ts.map +1 -0
- package/dist/core/video-import.js +192 -0
- package/dist/core/video-import.js.map +1 -0
- package/dist/core/visual-import.d.ts +42 -0
- package/dist/core/visual-import.d.ts.map +1 -0
- package/dist/core/visual-import.js +227 -0
- package/dist/core/visual-import.js.map +1 -0
- package/dist/index.d.ts +31 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +31 -1
- package/dist/index.js.map +1 -1
- package/dist/mcp/index.js +32 -0
- package/dist/mcp/index.js.map +1 -1
- package/package.json +10 -4
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Valentino Engine
|
|
2
2
|
|
|
3
|
-
> **Antifragile Open Source UI Design Engine** — part of the [HALE-BOPP](https://
|
|
3
|
+
> **Antifragile Open Source UI Design Engine** — part of the [HALE-BOPP](https://github.com/hale-bopp-data) family.
|
|
4
4
|
|
|
5
5
|
[](./LICENSE)
|
|
6
6
|
[](https://www.npmjs.com/package/@hale-bopp/valentino-engine)
|
|
@@ -86,6 +86,67 @@ Any MCP-compatible AI agent can connect to Valentino Engine:
|
|
|
86
86
|
| `valentino_get_skill` | Get design skill rules |
|
|
87
87
|
| `valentino_list_guardrails` | List 10 Sovereign Guardrails |
|
|
88
88
|
|
|
89
|
+
## Valentino Cockpit — Il Sarto Parla
|
|
90
|
+
|
|
91
|
+
Interactive conversational cockpit for building and editing pages. Speak naturally (IT/EN), import from screenshots, URLs, videos, or existing projects.
|
|
92
|
+
|
|
93
|
+
### Quick Launch
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
# Windows
|
|
97
|
+
cockpit.bat
|
|
98
|
+
|
|
99
|
+
# Mac / Linux
|
|
100
|
+
./cockpit.sh
|
|
101
|
+
|
|
102
|
+
# Any OS
|
|
103
|
+
npx tsx src/cockpit-server.ts examples/minimal-site/pages/home.json
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
Then open **http://localhost:3781** in your browser.
|
|
107
|
+
|
|
108
|
+
### With LLM (smart parsing)
|
|
109
|
+
|
|
110
|
+
```bash
|
|
111
|
+
# Windows
|
|
112
|
+
set OPENROUTER_API_KEY=sk-or-v1-your-key
|
|
113
|
+
cockpit.bat
|
|
114
|
+
|
|
115
|
+
# Mac / Linux
|
|
116
|
+
OPENROUTER_API_KEY=sk-or-v1-your-key ./cockpit.sh
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
Or configure the API key from the **Settings** button in the browser UI.
|
|
120
|
+
|
|
121
|
+
### Custom page spec & port
|
|
122
|
+
|
|
123
|
+
```bash
|
|
124
|
+
# Windows
|
|
125
|
+
cockpit.bat path\to\my-page.json 4000
|
|
126
|
+
|
|
127
|
+
# Mac / Linux
|
|
128
|
+
./cockpit.sh path/to/my-page.json 4000
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### CLI REPL (no browser)
|
|
132
|
+
|
|
133
|
+
```bash
|
|
134
|
+
npx tsx src/bin/valentino.ts cockpit examples/minimal-site/pages/home.json
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
### Features
|
|
138
|
+
|
|
139
|
+
| Feature | What it does |
|
|
140
|
+
|---------|-------------|
|
|
141
|
+
| **Chat** | Speak naturally: "mostrami le sezioni", "aggiungi stats", "rimuovi la cta" |
|
|
142
|
+
| **Import Screenshot** | Upload a screenshot, LLM vision generates a page spec |
|
|
143
|
+
| **Import URL** | Paste a URL, system fetches and analyzes the page |
|
|
144
|
+
| **Import Video** | Upload a video, browser extracts frames, LLM composes a page |
|
|
145
|
+
| **Import Project** | Point to a local HTML/CSS folder, generates governed specs |
|
|
146
|
+
| **Undo / Save** | Full undo history, save to disk |
|
|
147
|
+
| **Settings** | Configure OpenRouter API key and model from the UI |
|
|
148
|
+
| **Live Preview** | See page sections update in real-time as you work |
|
|
149
|
+
|
|
89
150
|
## The 10 Sovereign Guardrails
|
|
90
151
|
|
|
91
152
|
1. **WhatIf di Layout** — Wireframe first, code second
|
|
@@ -101,7 +162,7 @@ Any MCP-compatible AI agent can connect to Valentino Engine:
|
|
|
101
162
|
|
|
102
163
|
## Contributing
|
|
103
164
|
|
|
104
|
-
PRs welcome!
|
|
165
|
+
PRs welcome! See [CONTRIBUTING.md](./CONTRIBUTING.md) for guidelines.
|
|
105
166
|
|
|
106
167
|
## License
|
|
107
168
|
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI command: valentino cockpit
|
|
3
|
+
* Interactive cockpit for page spec manipulation.
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* valentino cockpit <spec.json> Interactive REPL (Phase 1)
|
|
7
|
+
* valentino cockpit <spec.json> <action.json> Execute action on spec
|
|
8
|
+
* valentino cockpit <spec.json> --describe Describe page structure
|
|
9
|
+
* valentino cockpit <spec.json> --validate Validate page spec
|
|
10
|
+
* valentino cockpit <spec.json> --parse "text" Parse intent (dry run)
|
|
11
|
+
* valentino cockpit --schema page Print PageSpecV1 JSON Schema
|
|
12
|
+
* valentino cockpit --schema action Print CockpitAction JSON Schema
|
|
13
|
+
* valentino cockpit --schema section <type> Print section JSON Schema
|
|
14
|
+
*/
|
|
15
|
+
export declare function runCockpit(args: string[]): Promise<void>;
|
|
16
|
+
//# sourceMappingURL=cockpit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cockpit.d.ts","sourceRoot":"","sources":["../../../src/bin/commands/cockpit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AA0BH,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAyL9D"}
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI command: valentino cockpit
|
|
3
|
+
* Interactive cockpit for page spec manipulation.
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* valentino cockpit <spec.json> Interactive REPL (Phase 1)
|
|
7
|
+
* valentino cockpit <spec.json> <action.json> Execute action on spec
|
|
8
|
+
* valentino cockpit <spec.json> --describe Describe page structure
|
|
9
|
+
* valentino cockpit <spec.json> --validate Validate page spec
|
|
10
|
+
* valentino cockpit <spec.json> --parse "text" Parse intent (dry run)
|
|
11
|
+
* valentino cockpit --schema page Print PageSpecV1 JSON Schema
|
|
12
|
+
* valentino cockpit --schema action Print CockpitAction JSON Schema
|
|
13
|
+
* valentino cockpit --schema section <type> Print section JSON Schema
|
|
14
|
+
*/
|
|
15
|
+
import { readFileSync, existsSync, writeFileSync } from 'fs';
|
|
16
|
+
import { resolve } from 'path';
|
|
17
|
+
import { executeCockpitAction, validateCockpitAction, describeCockpitAction, } from '../../core/cockpit-api.js';
|
|
18
|
+
import { getPageSpecSchema, getCockpitActionSchema, getSectionSchema, getSchemaDefinedSectionTypes, } from '../../core/schema-export.js';
|
|
19
|
+
import { parseIntentLocal } from '../../core/intent-parser.js';
|
|
20
|
+
import { startRepl } from '../../core/cockpit-repl.js';
|
|
21
|
+
import { startCockpitServer } from '../../cockpit-server.js';
|
|
22
|
+
function loadJSON(filePath) {
|
|
23
|
+
if (!existsSync(filePath))
|
|
24
|
+
return null;
|
|
25
|
+
try {
|
|
26
|
+
return JSON.parse(readFileSync(filePath, 'utf-8'));
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
export async function runCockpit(args) {
|
|
33
|
+
// Schema mode
|
|
34
|
+
if (args.includes('--schema')) {
|
|
35
|
+
const schemaIdx = args.indexOf('--schema');
|
|
36
|
+
const schemaType = args[schemaIdx + 1];
|
|
37
|
+
switch (schemaType) {
|
|
38
|
+
case 'page':
|
|
39
|
+
console.log(JSON.stringify(getPageSpecSchema(), null, 2));
|
|
40
|
+
return;
|
|
41
|
+
case 'action':
|
|
42
|
+
console.log(JSON.stringify(getCockpitActionSchema(), null, 2));
|
|
43
|
+
return;
|
|
44
|
+
case 'section': {
|
|
45
|
+
const sectionType = args[schemaIdx + 2];
|
|
46
|
+
if (!sectionType) {
|
|
47
|
+
console.log('Available section types:', getSchemaDefinedSectionTypes().join(', '));
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
const schema = getSectionSchema(sectionType);
|
|
51
|
+
if (!schema) {
|
|
52
|
+
console.error(`Unknown section type: ${sectionType}`);
|
|
53
|
+
console.log('Available:', getSchemaDefinedSectionTypes().join(', '));
|
|
54
|
+
process.exit(1);
|
|
55
|
+
}
|
|
56
|
+
console.log(JSON.stringify(schema, null, 2));
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
default:
|
|
60
|
+
console.error('Usage: valentino cockpit --schema <page|action|section [type]>');
|
|
61
|
+
process.exit(1);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// Need a spec file for all other operations
|
|
65
|
+
const files = args.filter(a => !a.startsWith('-'));
|
|
66
|
+
if (!files.length) {
|
|
67
|
+
console.log(`
|
|
68
|
+
valentino cockpit — Conversational Cockpit for page spec manipulation
|
|
69
|
+
|
|
70
|
+
Usage:
|
|
71
|
+
valentino cockpit <spec.json> Interactive REPL
|
|
72
|
+
valentino cockpit <spec.json> --serve [--port N] Web cockpit (default: 3781)
|
|
73
|
+
valentino cockpit <spec.json> <action.json> Execute action on spec
|
|
74
|
+
valentino cockpit <spec.json> --describe Describe page structure
|
|
75
|
+
valentino cockpit <spec.json> --validate Validate page spec
|
|
76
|
+
valentino cockpit <spec.json> --parse "text" Parse intent (dry run)
|
|
77
|
+
valentino cockpit --schema page Print PageSpecV1 JSON Schema
|
|
78
|
+
valentino cockpit --schema action Print CockpitAction JSON Schema
|
|
79
|
+
valentino cockpit --schema section <type> Print section JSON Schema
|
|
80
|
+
`);
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
const specPath = resolve(files[0]);
|
|
84
|
+
const spec = loadJSON(specPath);
|
|
85
|
+
if (!spec) {
|
|
86
|
+
console.error(`Cannot read spec: ${specPath}`);
|
|
87
|
+
process.exit(1);
|
|
88
|
+
}
|
|
89
|
+
// Describe mode
|
|
90
|
+
if (args.includes('--describe')) {
|
|
91
|
+
const result = executeCockpitAction(spec, {
|
|
92
|
+
action: 'query',
|
|
93
|
+
query: { type: 'describe-page' },
|
|
94
|
+
});
|
|
95
|
+
console.log(JSON.stringify(result.data, null, 2));
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
// Validate mode
|
|
99
|
+
if (args.includes('--validate')) {
|
|
100
|
+
const result = executeCockpitAction(spec, {
|
|
101
|
+
action: 'query',
|
|
102
|
+
query: { type: 'validate' },
|
|
103
|
+
});
|
|
104
|
+
if (result.warnings.length === 0) {
|
|
105
|
+
console.log(' ✅ Page spec is valid');
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
for (const w of result.warnings) {
|
|
109
|
+
console.log(` ⚠ [${w.source}] ${w.message}`);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
// Serve mode: start web cockpit server
|
|
115
|
+
if (args.includes('--serve')) {
|
|
116
|
+
const portIdx = args.indexOf('--port');
|
|
117
|
+
const port = portIdx !== -1 ? parseInt(args[portIdx + 1], 10) : undefined;
|
|
118
|
+
startCockpitServer({ specPath, port });
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
// Parse mode: dry-run intent parsing
|
|
122
|
+
if (args.includes('--parse')) {
|
|
123
|
+
const parseIdx = args.indexOf('--parse');
|
|
124
|
+
const text = args[parseIdx + 1];
|
|
125
|
+
if (!text) {
|
|
126
|
+
console.error('Usage: valentino cockpit <spec.json> --parse "your request"');
|
|
127
|
+
process.exit(1);
|
|
128
|
+
}
|
|
129
|
+
const result = parseIntentLocal(text, spec);
|
|
130
|
+
if (result.intent) {
|
|
131
|
+
console.log(` Intent: ${result.intent.description}`);
|
|
132
|
+
console.log(` Confidence: ${result.intent.confidence}`);
|
|
133
|
+
console.log(` Action: ${JSON.stringify(result.intent.action, null, 2)}`);
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
console.log(' Could not parse intent from input.');
|
|
137
|
+
}
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
// Interactive REPL mode: only spec file, no action file, no flags
|
|
141
|
+
if (files.length === 1 && !args.some(a => a.startsWith('--'))) {
|
|
142
|
+
const { writeFileSync: writeFs } = await import('fs');
|
|
143
|
+
const savedPath = specPath;
|
|
144
|
+
await startRepl({
|
|
145
|
+
spec,
|
|
146
|
+
onSpecChange: (updatedSpec) => {
|
|
147
|
+
writeFs(savedPath, JSON.stringify(updatedSpec, null, 2) + '\n');
|
|
148
|
+
console.log(` Saved to ${savedPath}`);
|
|
149
|
+
},
|
|
150
|
+
});
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
// Action mode: need action file
|
|
154
|
+
if (files.length < 2) {
|
|
155
|
+
console.error('Usage: valentino cockpit <spec.json> <action.json>');
|
|
156
|
+
process.exit(1);
|
|
157
|
+
}
|
|
158
|
+
const actionPath = resolve(files[1]);
|
|
159
|
+
const action = loadJSON(actionPath);
|
|
160
|
+
if (!action) {
|
|
161
|
+
console.error(`Cannot read action: ${actionPath}`);
|
|
162
|
+
process.exit(1);
|
|
163
|
+
}
|
|
164
|
+
// Pre-flight validation
|
|
165
|
+
const preErrors = validateCockpitAction(action, spec);
|
|
166
|
+
if (preErrors.length > 0) {
|
|
167
|
+
console.error(' ❌ Action validation failed:');
|
|
168
|
+
for (const e of preErrors) {
|
|
169
|
+
console.error(` ${e}`);
|
|
170
|
+
}
|
|
171
|
+
process.exit(1);
|
|
172
|
+
}
|
|
173
|
+
// Show what will happen
|
|
174
|
+
console.log(` → ${describeCockpitAction(action)}`);
|
|
175
|
+
// Execute
|
|
176
|
+
const result = executeCockpitAction(spec, action);
|
|
177
|
+
// Show warnings
|
|
178
|
+
for (const w of result.warnings) {
|
|
179
|
+
const icon = w.source === 'validation' ? '❌' : '⚠ ';
|
|
180
|
+
console.log(` ${icon} [${w.source}] ${w.message}`);
|
|
181
|
+
}
|
|
182
|
+
if (result.success) {
|
|
183
|
+
// Write output
|
|
184
|
+
const outPath = args.includes('--out')
|
|
185
|
+
? resolve(args[args.indexOf('--out') + 1])
|
|
186
|
+
: specPath;
|
|
187
|
+
if (args.includes('--out') || args.includes('--in-place')) {
|
|
188
|
+
writeFileSync(outPath, JSON.stringify(result.spec, null, 2) + '\n');
|
|
189
|
+
console.log(` ✅ Written to ${outPath}`);
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
// Dry run — print to stdout
|
|
193
|
+
console.log(JSON.stringify(result.spec, null, 2));
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
else {
|
|
197
|
+
console.error(' ❌ Action failed');
|
|
198
|
+
process.exit(1);
|
|
199
|
+
}
|
|
200
|
+
// Query data
|
|
201
|
+
if (result.data) {
|
|
202
|
+
console.log(JSON.stringify(result.data, null, 2));
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
//# sourceMappingURL=cockpit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cockpit.js","sourceRoot":"","sources":["../../../src/bin/commands/cockpit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI command: valentino theme-audit <theme-pack.json> [--surfaces surfaces.json] [--registry registry.json] [--level AA|AAA]
|
|
3
|
+
*
|
|
4
|
+
* Static contrast analysis: crosses theme-pack text tokens with Valentino surfaces.
|
|
5
|
+
*/
|
|
6
|
+
export declare function runThemeAudit(args: string[]): void;
|
|
7
|
+
//# sourceMappingURL=theme-audit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme-audit.d.ts","sourceRoot":"","sources":["../../../src/bin/commands/theme-audit.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAwBH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAwDlD"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI command: valentino theme-audit <theme-pack.json> [--surfaces surfaces.json] [--registry registry.json] [--level AA|AAA]
|
|
3
|
+
*
|
|
4
|
+
* Static contrast analysis: crosses theme-pack text tokens with Valentino surfaces.
|
|
5
|
+
*/
|
|
6
|
+
import { readFileSync } from 'node:fs';
|
|
7
|
+
import { auditThemePack, validateThemePackAgainstRegistry, VALENTINO_SURFACES, } from '../../core/theme-audit.js';
|
|
8
|
+
function loadJson(path) {
|
|
9
|
+
return JSON.parse(readFileSync(path, 'utf-8'));
|
|
10
|
+
}
|
|
11
|
+
function parseThemePack(raw) {
|
|
12
|
+
const obj = raw;
|
|
13
|
+
return {
|
|
14
|
+
id: obj.id ?? 'unknown',
|
|
15
|
+
cssVars: obj.cssVars ?? {},
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
export function runThemeAudit(args) {
|
|
19
|
+
if (args.length === 0) {
|
|
20
|
+
console.error('Usage: valentino theme-audit <theme-pack.json> [--surfaces surfaces.json] [--registry registry.json] [--level AA|AAA]');
|
|
21
|
+
process.exit(1);
|
|
22
|
+
}
|
|
23
|
+
const themePackPath = args[0];
|
|
24
|
+
let surfacesPath = null;
|
|
25
|
+
let registryPath = null;
|
|
26
|
+
let level = 'AA';
|
|
27
|
+
for (let i = 1; i < args.length; i++) {
|
|
28
|
+
if (args[i] === '--surfaces' && args[i + 1]) {
|
|
29
|
+
surfacesPath = args[++i];
|
|
30
|
+
}
|
|
31
|
+
else if (args[i] === '--registry' && args[i + 1]) {
|
|
32
|
+
registryPath = args[++i];
|
|
33
|
+
}
|
|
34
|
+
else if (args[i] === '--level' && args[i + 1]) {
|
|
35
|
+
level = args[++i];
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
const themePack = parseThemePack(loadJson(themePackPath));
|
|
39
|
+
const surfaces = surfacesPath
|
|
40
|
+
? loadJson(surfacesPath)
|
|
41
|
+
: VALENTINO_SURFACES;
|
|
42
|
+
// Contrast audit
|
|
43
|
+
const result = auditThemePack(themePack, { surfaces, level });
|
|
44
|
+
// Registry validation (if provided)
|
|
45
|
+
const registryViolations = registryPath
|
|
46
|
+
? validateThemePackAgainstRegistry(themePack, loadJson(registryPath).themePacks)
|
|
47
|
+
: [];
|
|
48
|
+
// Output
|
|
49
|
+
console.log(`\nTheme-pack: ${result.themePackId}`);
|
|
50
|
+
console.log(`Level: ${level} | Checks: ${result.checked} | Surfaces: ${surfaces.length}`);
|
|
51
|
+
console.log('─'.repeat(70));
|
|
52
|
+
if (registryViolations.length > 0) {
|
|
53
|
+
console.log(`\n⚠ Registry violations (${registryViolations.length}):\n`);
|
|
54
|
+
for (const v of registryViolations) {
|
|
55
|
+
console.log(` ${v.token} — ${v.reason}`);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
if (result.violations.length > 0) {
|
|
59
|
+
console.log(`\n✗ Contrast violations (${result.violations.length}):\n`);
|
|
60
|
+
for (const v of result.violations) {
|
|
61
|
+
console.log(` ${v.token}: ${v.value} on ${v.surface} (${v.surfaceBackground})`);
|
|
62
|
+
console.log(` ratio ${v.ratio}:1 — needs ${v.required}:1\n`);
|
|
63
|
+
}
|
|
64
|
+
process.exit(1);
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
console.log(`\n✓ All ${result.checked} token×surface pairs pass ${level} contrast.\n`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=theme-audit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme-audit.js","sourceRoot":"","sources":["../../../src/bin/commands/theme-audit.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../../src/bin/commands/validate.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../../src/bin/commands/validate.ts"],"names":[],"mappings":"AA0EA,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAmMhD"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
import { readFileSync, existsSync } from 'fs';
|
|
1
|
+
import { readFileSync, existsSync, readdirSync } from 'fs';
|
|
2
2
|
import { resolve, dirname } from 'path';
|
|
3
3
|
import { validatePageSpec } from '../../core/page-spec.js';
|
|
4
4
|
import { collectPureCmsWarnings } from '../../core/guardrails-cms.js';
|
|
5
|
+
import { auditThemePack, VALENTINO_SURFACES } from '../../core/theme-audit.js';
|
|
6
|
+
import { probeContrastUsageMulti, extractShadowDomStyles } from '../../core/contrast-usage-probe.js';
|
|
5
7
|
function findProjectRoot(startDir) {
|
|
6
8
|
let dir = resolve(startDir);
|
|
7
9
|
for (let i = 0; i < 10; i++) {
|
|
@@ -144,6 +146,97 @@ export function runValidate(args) {
|
|
|
144
146
|
}
|
|
145
147
|
}
|
|
146
148
|
}
|
|
149
|
+
// 3. Theme-pack contrast audit (if --all)
|
|
150
|
+
if (args.includes('--all') && projectRoot) {
|
|
151
|
+
const themePackDir = resolve(projectRoot, 'public/theme-packs');
|
|
152
|
+
const registryPath = resolve(themePackDir, 'valentino-palette.registry.json');
|
|
153
|
+
const brandingPath = resolve(projectRoot, 'public/branding.json');
|
|
154
|
+
// Load foundation tokens from branding.json (or registry foundationTokens)
|
|
155
|
+
let foundationTokens = {};
|
|
156
|
+
const registry = loadJSON(registryPath);
|
|
157
|
+
if (registry?.foundationTokens) {
|
|
158
|
+
for (const [k, v] of Object.entries(registry.foundationTokens)) {
|
|
159
|
+
foundationTokens[k] = v.value;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
// Discover and audit theme-packs
|
|
163
|
+
if (existsSync(themePackDir)) {
|
|
164
|
+
const packFiles = readdirSync(themePackDir).filter(f => f.startsWith('theme-pack.') && f.endsWith('.json'));
|
|
165
|
+
// Also audit foundation tokens as a "base" theme (no theme-pack active)
|
|
166
|
+
if (Object.keys(foundationTokens).length > 0) {
|
|
167
|
+
const baseResult = auditThemePack({ id: '_foundation', cssVars: foundationTokens }, { surfaces: VALENTINO_SURFACES, level: 'AA' });
|
|
168
|
+
for (const v of baseResult.violations) {
|
|
169
|
+
console.error(` ❌ [theme-contrast] Foundation "${v.token}" (${v.value}) fails on ${v.surface}: ${v.ratio}:1 < ${v.required}:1`);
|
|
170
|
+
totalErrors++;
|
|
171
|
+
hasErrors = true;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
for (const file of packFiles) {
|
|
175
|
+
const raw = loadJSON(resolve(themePackDir, file));
|
|
176
|
+
if (!raw?.cssVars)
|
|
177
|
+
continue;
|
|
178
|
+
const tp = { id: raw.id ?? file, cssVars: raw.cssVars };
|
|
179
|
+
const result = auditThemePack(tp, {
|
|
180
|
+
surfaces: VALENTINO_SURFACES,
|
|
181
|
+
level: 'AA',
|
|
182
|
+
foundationTokens,
|
|
183
|
+
});
|
|
184
|
+
for (const v of result.violations) {
|
|
185
|
+
console.error(` ❌ [theme-contrast] ${tp.id}: "${v.token}" (${v.value}) fails on ${v.surface}: ${v.ratio}:1 < ${v.required}:1`);
|
|
186
|
+
totalErrors++;
|
|
187
|
+
hasErrors = true;
|
|
188
|
+
}
|
|
189
|
+
if (!quietMode && result.passed) {
|
|
190
|
+
console.log(` ✅ theme-pack ${tp.id}: all contrast checks pass`);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
// 4. CSS usage probe — find text variables without surface remaps
|
|
195
|
+
// Scans framework.css + Shadow DOM component styles
|
|
196
|
+
const frameworkCssPath = resolve(projectRoot, 'src/framework.css');
|
|
197
|
+
if (existsSync(frameworkCssPath)) {
|
|
198
|
+
const primaryCss = readFileSync(frameworkCssPath, 'utf-8');
|
|
199
|
+
// Discover Shadow DOM component styles
|
|
200
|
+
const componentSources = [];
|
|
201
|
+
const componentsDir = resolve(projectRoot, 'src/components');
|
|
202
|
+
if (existsSync(componentsDir)) {
|
|
203
|
+
const scanDirs = [componentsDir, resolve(componentsDir, 'lib')];
|
|
204
|
+
for (const dir of scanDirs) {
|
|
205
|
+
if (!existsSync(dir))
|
|
206
|
+
continue;
|
|
207
|
+
const tsFiles = readdirSync(dir).filter(f => f.endsWith('.ts'));
|
|
208
|
+
for (const file of tsFiles) {
|
|
209
|
+
const content = readFileSync(resolve(dir, file), 'utf-8');
|
|
210
|
+
const styles = extractShadowDomStyles(content, file);
|
|
211
|
+
for (const s of styles) {
|
|
212
|
+
componentSources.push({ name: s.componentName, css: s.css });
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
const usageResult = probeContrastUsageMulti(primaryCss, componentSources);
|
|
218
|
+
for (const w of usageResult.warnings) {
|
|
219
|
+
if (w.severity === 'error') {
|
|
220
|
+
console.error(` ❌ [contrast-usage] ${w.message}`);
|
|
221
|
+
totalErrors++;
|
|
222
|
+
hasErrors = true;
|
|
223
|
+
}
|
|
224
|
+
else {
|
|
225
|
+
console.log(` ⚠ [contrast-usage] ${w.message}`);
|
|
226
|
+
totalWarnings++;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
if (!quietMode) {
|
|
230
|
+
const srcCount = usageResult.sources.filter(s => s.warningCount > 0).length;
|
|
231
|
+
if (usageResult.valid) {
|
|
232
|
+
console.log(` ✅ CSS usage probe: all text tokens remapped (${usageResult.sources.length} sources scanned)`);
|
|
233
|
+
}
|
|
234
|
+
else {
|
|
235
|
+
console.log(` ⚠ ${usageResult.warnings.length} unremediated token(s) across ${srcCount} source(s)`);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
}
|
|
147
240
|
// Summary
|
|
148
241
|
if (!quietMode) {
|
|
149
242
|
const profileLabel = profile ? ` (profile: ${profile.template})` : '';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../../src/bin/commands/validate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../../src/bin/commands/validate.ts"],"names":[],"mappings":"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"}
|
package/dist/bin/valentino.js
CHANGED
|
@@ -12,6 +12,8 @@ import { runManifestResolve } from './commands/manifest.js';
|
|
|
12
12
|
import { runContrast } from './commands/contrast.js';
|
|
13
13
|
import { runInit } from './commands/init.js';
|
|
14
14
|
import { runLlms } from './commands/llms.js';
|
|
15
|
+
import { runCockpit } from './commands/cockpit.js';
|
|
16
|
+
import { runThemeAudit } from './commands/theme-audit.js';
|
|
15
17
|
const [, , command, ...args] = process.argv;
|
|
16
18
|
switch (command) {
|
|
17
19
|
case 'init':
|
|
@@ -51,6 +53,12 @@ switch (command) {
|
|
|
51
53
|
case 'llms':
|
|
52
54
|
runLlms(args);
|
|
53
55
|
break;
|
|
56
|
+
case 'cockpit':
|
|
57
|
+
runCockpit(args);
|
|
58
|
+
break;
|
|
59
|
+
case 'theme-audit':
|
|
60
|
+
runThemeAudit(args);
|
|
61
|
+
break;
|
|
54
62
|
default:
|
|
55
63
|
console.log(`
|
|
56
64
|
🎨 Valentino Engine v0.1.0 — Antifragile Open Source UI Design Engine
|
|
@@ -65,8 +73,14 @@ Usage:
|
|
|
65
73
|
valentino catalog resolve <spec.json> --catalog <catalog.json> Resolve spec with catalog
|
|
66
74
|
valentino manifest resolve <manifest.json> --route /path Resolve route to page ID
|
|
67
75
|
valentino llms <manifest.json> [--content c.json] [--site N] Generate llms.txt + llms-full.txt
|
|
76
|
+
valentino cockpit <spec.json> Interactive conversational REPL
|
|
77
|
+
valentino cockpit <spec.json> --serve [--port N] Web cockpit (browser UI)
|
|
78
|
+
valentino cockpit <spec.json> <action.json> Execute cockpit action on page spec
|
|
79
|
+
valentino cockpit <spec.json> --parse "text" Parse intent (dry run)
|
|
80
|
+
valentino cockpit --schema <page|action|section [type]> Print JSON Schema
|
|
81
|
+
valentino theme-audit <pack.json> [--registry r.json] [--level AA|AAA] Audit theme-pack contrast on surfaces
|
|
68
82
|
|
|
69
|
-
|
|
83
|
+
GitHub: https://github.com/hale-bopp-data/valentino-engine
|
|
70
84
|
`);
|
|
71
85
|
}
|
|
72
86
|
//# sourceMappingURL=valentino.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"valentino.js","sourceRoot":"","sources":["../../src/bin/valentino.ts"],"names":[],"mappings":";AACA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"valentino.js","sourceRoot":"","sources":["../../src/bin/valentino.ts"],"names":[],"mappings":";AACA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE1D,MAAM,CAAC,EAAC,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;AAE3C,QAAQ,OAAO,EAAE,CAAC;IACd,KAAK,MAAM;QACP,OAAO,CAAC,IAAI,CAAC,CAAC;QACd,MAAM;IAEV,KAAK,OAAO;QACR,QAAQ,CAAC,IAAI,CAAC,CAAC;QACf,MAAM;IAEV,KAAK,UAAU;QACX,WAAW,CAAC,IAAI,CAAC,CAAC;QAClB,MAAM;IAEV,KAAK,YAAY;QACb,aAAa,EAAE,CAAC;QAChB,MAAM;IAEV,KAAK,OAAO;QACR,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1C,MAAM;IAEV,KAAK,SAAS;QACV,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS;YAAE,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;aACvD,CAAC;YACF,OAAO,CAAC,KAAK,CAAC,uEAAuE,CAAC,CAAC;YACvF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;QACD,MAAM;IAEV,KAAK,UAAU;QACX,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS;YAAE,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;aACxD,CAAC;YACF,OAAO,CAAC,KAAK,CAAC,iEAAiE,CAAC,CAAC;YACjF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;QACD,MAAM;IAEV,KAAK,UAAU;QACX,WAAW,CAAC,IAAI,CAAC,CAAC;QAClB,MAAM;IAEV,KAAK,MAAM;QACP,OAAO,CAAC,IAAI,CAAC,CAAC;QACd,MAAM;IAEV,KAAK,SAAS;QACV,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,MAAM;IAEV,KAAK,aAAa;QACd,aAAa,CAAC,IAAI,CAAC,CAAC;QACpB,MAAM;IAEV;QACI,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;CAqBnB,CAAC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cockpit Server — HTTP API + Web UI for the Valentino Conversational Cockpit.
|
|
3
|
+
* Feature #778 (Il Sarto Parla), PBI #781 (Phase 2).
|
|
4
|
+
*
|
|
5
|
+
* Wraps cockpit-api over HTTP. Serves a built-in web UI.
|
|
6
|
+
* Zero external dependencies — uses Node built-in http module.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* npx tsx src/cockpit-server.ts <spec.json> [--port 3781]
|
|
10
|
+
* valentino cockpit <spec.json> --serve [--port 3781]
|
|
11
|
+
*/
|
|
12
|
+
export type CockpitServerOptions = {
|
|
13
|
+
specPath: string;
|
|
14
|
+
port?: number;
|
|
15
|
+
};
|
|
16
|
+
export declare function startCockpitServer(options: CockpitServerOptions): void;
|
|
17
|
+
//# sourceMappingURL=cockpit-server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cockpit-server.d.ts","sourceRoot":"","sources":["../src/cockpit-server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AA0hBH,MAAM,MAAM,oBAAoB,GAAG;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,oBAAoB,GAAG,IAAI,CAmDtE"}
|