@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.
- package/AGENTS.md +49 -0
- package/CHANGELOG.md +22 -0
- package/LICENSE +21 -0
- package/README.md +108 -0
- package/dist/bin/commands/audit.d.ts +2 -0
- package/dist/bin/commands/audit.d.ts.map +1 -0
- package/dist/bin/commands/audit.js +24 -0
- package/dist/bin/commands/audit.js.map +1 -0
- package/dist/bin/commands/catalog.d.ts +2 -0
- package/dist/bin/commands/catalog.d.ts.map +1 -0
- package/dist/bin/commands/catalog.js +21 -0
- package/dist/bin/commands/catalog.js.map +1 -0
- package/dist/bin/commands/contrast.d.ts +2 -0
- package/dist/bin/commands/contrast.d.ts.map +1 -0
- package/dist/bin/commands/contrast.js +22 -0
- package/dist/bin/commands/contrast.js.map +1 -0
- package/dist/bin/commands/guardrails.d.ts +2 -0
- package/dist/bin/commands/guardrails.d.ts.map +1 -0
- package/dist/bin/commands/guardrails.js +18 -0
- package/dist/bin/commands/guardrails.js.map +1 -0
- package/dist/bin/commands/manifest.d.ts +2 -0
- package/dist/bin/commands/manifest.d.ts.map +1 -0
- package/dist/bin/commands/manifest.js +21 -0
- package/dist/bin/commands/manifest.js.map +1 -0
- package/dist/bin/commands/probe.d.ts +2 -0
- package/dist/bin/commands/probe.d.ts.map +1 -0
- package/dist/bin/commands/probe.js +59 -0
- package/dist/bin/commands/probe.js.map +1 -0
- package/dist/bin/commands/validate.d.ts +2 -0
- package/dist/bin/commands/validate.d.ts.map +1 -0
- package/dist/bin/commands/validate.js +19 -0
- package/dist/bin/commands/validate.js.map +1 -0
- package/dist/bin/valentino.d.ts +7 -0
- package/dist/bin/valentino.d.ts.map +1 -0
- package/dist/bin/valentino.js +62 -0
- package/dist/bin/valentino.js.map +1 -0
- package/dist/core/catalog.d.ts +13 -0
- package/dist/core/catalog.d.ts.map +1 -0
- package/dist/core/catalog.js +63 -0
- package/dist/core/catalog.js.map +1 -0
- package/dist/core/catalog.test.d.ts +2 -0
- package/dist/core/catalog.test.d.ts.map +1 -0
- package/dist/core/catalog.test.js +115 -0
- package/dist/core/catalog.test.js.map +1 -0
- package/dist/core/contrast.d.ts +42 -0
- package/dist/core/contrast.d.ts.map +1 -0
- package/dist/core/contrast.js +98 -0
- package/dist/core/contrast.js.map +1 -0
- package/dist/core/contrast.test.d.ts +2 -0
- package/dist/core/contrast.test.d.ts.map +1 -0
- package/dist/core/contrast.test.js +82 -0
- package/dist/core/contrast.test.js.map +1 -0
- package/dist/core/css-named-colors.d.ts +7 -0
- package/dist/core/css-named-colors.d.ts.map +1 -0
- package/dist/core/css-named-colors.js +45 -0
- package/dist/core/css-named-colors.js.map +1 -0
- package/dist/core/guardrails.d.ts +16 -0
- package/dist/core/guardrails.d.ts.map +1 -0
- package/dist/core/guardrails.js +55 -0
- package/dist/core/guardrails.js.map +1 -0
- package/dist/core/guardrails.test.d.ts +2 -0
- package/dist/core/guardrails.test.d.ts.map +1 -0
- package/dist/core/guardrails.test.js +88 -0
- package/dist/core/guardrails.test.js.map +1 -0
- package/dist/core/hero-contract.d.ts +21 -0
- package/dist/core/hero-contract.d.ts.map +1 -0
- package/dist/core/hero-contract.js +70 -0
- package/dist/core/hero-contract.js.map +1 -0
- package/dist/core/hero-contract.test.d.ts +2 -0
- package/dist/core/hero-contract.test.d.ts.map +1 -0
- package/dist/core/hero-contract.test.js +71 -0
- package/dist/core/hero-contract.test.js.map +1 -0
- package/dist/core/manifest.d.ts +8 -0
- package/dist/core/manifest.d.ts.map +1 -0
- package/dist/core/manifest.js +17 -0
- package/dist/core/manifest.js.map +1 -0
- package/dist/core/manifest.test.d.ts +2 -0
- package/dist/core/manifest.test.d.ts.map +1 -0
- package/dist/core/manifest.test.js +45 -0
- package/dist/core/manifest.test.js.map +1 -0
- package/dist/core/page-spec.d.ts +14 -0
- package/dist/core/page-spec.d.ts.map +1 -0
- package/dist/core/page-spec.js +20 -0
- package/dist/core/page-spec.js.map +1 -0
- package/dist/core/page-spec.test.d.ts +2 -0
- package/dist/core/page-spec.test.d.ts.map +1 -0
- package/dist/core/page-spec.test.js +38 -0
- package/dist/core/page-spec.test.js.map +1 -0
- package/dist/core/presentation.d.ts +9 -0
- package/dist/core/presentation.d.ts.map +1 -0
- package/dist/core/presentation.js +65 -0
- package/dist/core/presentation.js.map +1 -0
- package/dist/core/presentation.test.d.ts +2 -0
- package/dist/core/presentation.test.d.ts.map +1 -0
- package/dist/core/presentation.test.js +63 -0
- package/dist/core/presentation.test.js.map +1 -0
- package/dist/core/rhythm.d.ts +25 -0
- package/dist/core/rhythm.d.ts.map +1 -0
- package/dist/core/rhythm.js +67 -0
- package/dist/core/rhythm.js.map +1 -0
- package/dist/core/rhythm.test.d.ts +2 -0
- package/dist/core/rhythm.test.d.ts.map +1 -0
- package/dist/core/rhythm.test.js +69 -0
- package/dist/core/rhythm.test.js.map +1 -0
- package/dist/core/section-integrity.d.ts +30 -0
- package/dist/core/section-integrity.d.ts.map +1 -0
- package/dist/core/section-integrity.js +72 -0
- package/dist/core/section-integrity.js.map +1 -0
- package/dist/core/section-integrity.test.d.ts +2 -0
- package/dist/core/section-integrity.test.d.ts.map +1 -0
- package/dist/core/section-integrity.test.js +83 -0
- package/dist/core/section-integrity.test.js.map +1 -0
- package/dist/core/types.d.ts +456 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +7 -0
- package/dist/core/types.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/index.d.ts +2 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +126 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/skills/design-guidelines.d.ts +6 -0
- package/dist/skills/design-guidelines.d.ts.map +1 -0
- package/dist/skills/design-guidelines.js +11 -0
- package/dist/skills/design-guidelines.js.map +1 -0
- package/dist/skills/index.d.ts +7 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +7 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/skills/premium-design.d.ts +6 -0
- package/dist/skills/premium-design.d.ts.map +1 -0
- package/dist/skills/premium-design.js +11 -0
- package/dist/skills/premium-design.js.map +1 -0
- package/dist/skills/web-guardrails.d.ts +6 -0
- package/dist/skills/web-guardrails.d.ts.map +1 -0
- package/dist/skills/web-guardrails.js +11 -0
- package/dist/skills/web-guardrails.js.map +1 -0
- package/package.json +69 -0
- package/skills/valentino-premium-design.md +10 -0
- package/skills/valentino-web-guardrails.md +9 -0
- package/skills/web-design-guidelines.md +9 -0
package/AGENTS.md
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# Agents that use Valentino Engine
|
|
2
|
+
|
|
3
|
+
## Direct MCP Integration
|
|
4
|
+
|
|
5
|
+
| Agent | Level | How it uses Valentino Engine |
|
|
6
|
+
|-------|-------|-----------------------------|
|
|
7
|
+
| **Agent Valentino** | L3 | Primary consumer — validates page specs, audits CSS, runs probes |
|
|
8
|
+
| **Agent Valentino Design** | L1 | CRO review — uses contrast checker, hero contract validation |
|
|
9
|
+
| **Agent Scrummaster** | L2 | Sprint QA — runs `probe all` on changed page specs |
|
|
10
|
+
| **Agent GEDI** | L1 | Architectural review — consulted by probes via escalation |
|
|
11
|
+
|
|
12
|
+
## CLI Usage
|
|
13
|
+
|
|
14
|
+
Any agent with shell access can invoke:
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
npx @hale-bopp/valentino audit <file.css>
|
|
18
|
+
npx @hale-bopp/valentino probe all <spec.json>
|
|
19
|
+
npx @hale-bopp/valentino contrast "#000" "#fff" AA
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## MCP Configuration
|
|
23
|
+
|
|
24
|
+
```json
|
|
25
|
+
{
|
|
26
|
+
"mcp_servers": {
|
|
27
|
+
"valentino-engine": {
|
|
28
|
+
"command": "npx",
|
|
29
|
+
"args": ["@hale-bopp/valentino-engine", "mcp"]
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## 13 MCP Tools
|
|
36
|
+
|
|
37
|
+
| Tool | Description |
|
|
38
|
+
|------|-------------|
|
|
39
|
+
| `valentino_audit_css` | Audit CSS for hardcoded px, hex/rgba, and named colors |
|
|
40
|
+
| `valentino_validate_pagespec` | Validate PageSpecV1 contract |
|
|
41
|
+
| `valentino_check_contrast` | WCAG 2.1 contrast ratio check |
|
|
42
|
+
| `valentino_probe_rhythm` | Section sequence rhythm validation |
|
|
43
|
+
| `valentino_probe_hero` | Hero contract enforcement |
|
|
44
|
+
| `valentino_probe_integrity` | Per-type structural validation |
|
|
45
|
+
| `valentino_probe_all` | All probes combined |
|
|
46
|
+
| `valentino_resolve_catalog` | Resolve spec with catalog |
|
|
47
|
+
| `valentino_resolve_route` | Resolve URL route to page ID |
|
|
48
|
+
| `valentino_get_skill` | Get design skill rules |
|
|
49
|
+
| `valentino_list_guardrails` | List 10 Sovereign Guardrails |
|
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## [1.0.0] — 2026-03-23
|
|
4
|
+
|
|
5
|
+
### Added
|
|
6
|
+
- **Core Type System**: Full PageSpecV1 type system (18 section types, catalog, manifest, navigation)
|
|
7
|
+
- **Catalog Resolver**: `resolvePageSpecWithCatalog` with blueprint, template, and preset resolution + governance checks
|
|
8
|
+
- **Presentation Resolver**: `resolvePresentation`, `inferRhythmProfile`, `DEFAULT_PRESENTATION`
|
|
9
|
+
- **Manifest Resolver**: `normalizePathname`, `resolvePageIdByRoute`
|
|
10
|
+
- **CSS Guardrails**: `checkNoHardcodedPx`, `checkNoHardcodedColor`, `checkNoNamedColor` (148 CSS colors)
|
|
11
|
+
- **WCAG Contrast**: `checkWcagContrast` with AA/AAA levels
|
|
12
|
+
- **Rhythm Probe**: hero-first, no consecutive same rhythm, spacer rules
|
|
13
|
+
- **Hero Contract**: CTA discipline, single decorative source, copy density, action rail geometry
|
|
14
|
+
- **Section Integrity**: per-type structural validation for 8 section types
|
|
15
|
+
- **CLI**: 7 commands (`audit`, `validate`, `guardrails`, `probe`, `contrast`, `catalog resolve`, `manifest resolve`)
|
|
16
|
+
- **MCP Server**: 13 tools covering all engine capabilities
|
|
17
|
+
- **Test Suite**: 109 tests across 9 suites
|
|
18
|
+
|
|
19
|
+
### Architecture
|
|
20
|
+
- Zero DOM, zero fetch — pure functions only
|
|
21
|
+
- Framework-agnostic: consumers load data, engine resolves/validates/probes
|
|
22
|
+
- Type system extracted from easyway-portal (single source of truth)
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 EasyWay Platform Team
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
# Valentino Engine
|
|
2
|
+
|
|
3
|
+
> **Antifragile Open Source UI Design Engine** — part of the [HALE-BOPP](https://dev.azure.com/EasyWayData/EasyWay-DataPortal/_git/hale-bopp-valentino-engine) family.
|
|
4
|
+
|
|
5
|
+
[](./LICENSE)
|
|
6
|
+
[](https://www.npmjs.com/package/@hale-bopp/valentino-engine)
|
|
7
|
+
|
|
8
|
+
## What is Valentino Engine?
|
|
9
|
+
|
|
10
|
+
Valentino Engine validates, resolves, and probes **Runtime PageSpec JSON** — the contract that drives UI rendering. It enforces Design Tokens, checks WCAG accessibility, validates page structure, and resolves catalog blueprints — all without framework lock-in.
|
|
11
|
+
|
|
12
|
+
**Zero DOM. Zero fetch. Pure functions only.** You load data, the engine validates and resolves it.
|
|
13
|
+
|
|
14
|
+
## Quickstart
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
# Audit CSS for guardrail violations (px, hex, named colors)
|
|
18
|
+
npx @hale-bopp/valentino audit ./styles/theme.css
|
|
19
|
+
|
|
20
|
+
# Validate a PageSpec JSON
|
|
21
|
+
npx @hale-bopp/valentino validate ./pages/home.json
|
|
22
|
+
|
|
23
|
+
# Run all structural probes on a page
|
|
24
|
+
npx @hale-bopp/valentino probe all ./pages/home.json
|
|
25
|
+
|
|
26
|
+
# Check WCAG contrast ratio
|
|
27
|
+
npx @hale-bopp/valentino contrast "#333333" "#ffffff" AA
|
|
28
|
+
|
|
29
|
+
# Resolve a spec with a catalog
|
|
30
|
+
npx @hale-bopp/valentino catalog resolve ./pages/home.json --catalog ./catalog.json
|
|
31
|
+
|
|
32
|
+
# List the 10 Sovereign Guardrails
|
|
33
|
+
npx @hale-bopp/valentino guardrails
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## Library API
|
|
37
|
+
|
|
38
|
+
```typescript
|
|
39
|
+
import {
|
|
40
|
+
// Types (18 section types, full PageSpecV1)
|
|
41
|
+
type PageSpecV1, type SectionSpec, type ValentinoCatalogV1,
|
|
42
|
+
|
|
43
|
+
// Validation
|
|
44
|
+
validatePageSpec, checkWcagContrast,
|
|
45
|
+
|
|
46
|
+
// CSS Guardrails
|
|
47
|
+
checkNoHardcodedPx, checkNoHardcodedColor, checkNoNamedColor,
|
|
48
|
+
|
|
49
|
+
// Probes
|
|
50
|
+
probeRhythm, probeHeroContract, probeSectionIntegrity,
|
|
51
|
+
|
|
52
|
+
// Catalog & Presentation
|
|
53
|
+
resolvePageSpecWithCatalog, resolvePresentation, inferRhythmProfile,
|
|
54
|
+
|
|
55
|
+
// Manifest
|
|
56
|
+
resolvePageIdByRoute,
|
|
57
|
+
} from '@hale-bopp/valentino-engine';
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## MCP Server (13 Tools)
|
|
61
|
+
|
|
62
|
+
Any MCP-compatible AI agent can connect to Valentino Engine:
|
|
63
|
+
|
|
64
|
+
```json
|
|
65
|
+
{
|
|
66
|
+
"mcp_servers": {
|
|
67
|
+
"valentino-engine": {
|
|
68
|
+
"command": "npx",
|
|
69
|
+
"args": ["@hale-bopp/valentino-engine", "mcp"]
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
| Tool | Description |
|
|
76
|
+
|------|-------------|
|
|
77
|
+
| `valentino_audit_css` | Audit CSS for hardcoded px, hex/rgba, and named colors |
|
|
78
|
+
| `valentino_validate_pagespec` | Validate PageSpecV1 contract |
|
|
79
|
+
| `valentino_check_contrast` | WCAG 2.1 contrast ratio (AA/AAA) |
|
|
80
|
+
| `valentino_probe_rhythm` | Section sequence rhythm validation |
|
|
81
|
+
| `valentino_probe_hero` | Hero contract (CTA discipline, copy density) |
|
|
82
|
+
| `valentino_probe_integrity` | Per-type structural validation |
|
|
83
|
+
| `valentino_probe_all` | All probes combined |
|
|
84
|
+
| `valentino_resolve_catalog` | Resolve spec with catalog (blueprints, presets) |
|
|
85
|
+
| `valentino_resolve_route` | Resolve URL route to page ID |
|
|
86
|
+
| `valentino_get_skill` | Get design skill rules |
|
|
87
|
+
| `valentino_list_guardrails` | List 10 Sovereign Guardrails |
|
|
88
|
+
|
|
89
|
+
## The 10 Sovereign Guardrails
|
|
90
|
+
|
|
91
|
+
1. **WhatIf di Layout** — Wireframe first, code second
|
|
92
|
+
2. **Component Boundary & Fallbacks** — Error Boundaries on all API bridges
|
|
93
|
+
3. **Design Token System** — No hardcoded colors or px values
|
|
94
|
+
4. **L3 Audit before Commit** — ARIA, performance, and dependency check
|
|
95
|
+
5. **Escalation to GEDI** — Consult GEDI on architectural trade-offs
|
|
96
|
+
6. **Zero UI-Debt** — Reuse before creating
|
|
97
|
+
7. **Electrical Socket Pattern** — CSS root variables for all colors
|
|
98
|
+
8. **Testudo Formation** — No inline padding/margin overrides on containers
|
|
99
|
+
9. **Tangible Legacy** — No redundant CSS blocks
|
|
100
|
+
10. **Visual Live Audit** — Playwright MCP or `npm run test:e2e:valentino`
|
|
101
|
+
|
|
102
|
+
## Contributing
|
|
103
|
+
|
|
104
|
+
PRs welcome! Please link your PR to an ADO Work Item under [Epic #480](https://dev.azure.com/EasyWayData/EasyWay-DataPortal/_workitems/edit/480).
|
|
105
|
+
|
|
106
|
+
## License
|
|
107
|
+
|
|
108
|
+
[MIT](./LICENSE) — EasyWay Platform Team
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../../src/bin/commands/audit.ts"],"names":[],"mappings":"AAGA,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAmB7C"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { readFileSync } from 'fs';
|
|
2
|
+
import { checkNoHardcodedPx, checkNoHardcodedColor, checkNoNamedColor } from '../../core/guardrails.js';
|
|
3
|
+
export function runAudit(args) {
|
|
4
|
+
const file = args[0];
|
|
5
|
+
if (!file) {
|
|
6
|
+
console.error('Usage: valentino audit <path-to-css-file>');
|
|
7
|
+
process.exit(1);
|
|
8
|
+
}
|
|
9
|
+
const css = readFileSync(file, 'utf-8');
|
|
10
|
+
const all = [
|
|
11
|
+
...checkNoHardcodedPx(css),
|
|
12
|
+
...checkNoHardcodedColor(css),
|
|
13
|
+
...checkNoNamedColor(css),
|
|
14
|
+
];
|
|
15
|
+
if (all.length === 0) {
|
|
16
|
+
console.log('✅ No guardrail violations found.');
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
console.log(`❌ ${all.length} violation(s) found:\n`);
|
|
20
|
+
all.forEach(v => console.log(' •', v));
|
|
21
|
+
process.exit(1);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=audit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../../../src/bin/commands/audit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAExG,MAAM,UAAU,QAAQ,CAAC,IAAc;IACnC,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACrB,IAAI,CAAC,IAAI,EAAE,CAAC;QACR,OAAO,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IACD,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACxC,MAAM,GAAG,GAAG;QACR,GAAG,kBAAkB,CAAC,GAAG,CAAC;QAC1B,GAAG,qBAAqB,CAAC,GAAG,CAAC;QAC7B,GAAG,iBAAiB,CAAC,GAAG,CAAC;KAC5B,CAAC;IACF,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnB,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;IACpD,CAAC;SAAM,CAAC;QACJ,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,MAAM,wBAAwB,CAAC,CAAC;QACrD,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;QACxC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../../src/bin/commands/catalog.ts"],"names":[],"mappings":"AAKA,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAoBtD"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { readFileSync } from 'fs';
|
|
2
|
+
import { validatePageSpec } from '../../core/page-spec.js';
|
|
3
|
+
import { resolvePageSpecWithCatalog } from '../../core/catalog.js';
|
|
4
|
+
export function runCatalogResolve(args) {
|
|
5
|
+
const specFile = args[0];
|
|
6
|
+
const catalogIdx = args.indexOf('--catalog');
|
|
7
|
+
const catalogFile = catalogIdx >= 0 ? args[catalogIdx + 1] : undefined;
|
|
8
|
+
if (!specFile || !catalogFile) {
|
|
9
|
+
console.error('Usage: valentino catalog resolve <spec.json> --catalog <catalog.json>');
|
|
10
|
+
process.exit(1);
|
|
11
|
+
}
|
|
12
|
+
const specJson = JSON.parse(readFileSync(specFile, 'utf-8'));
|
|
13
|
+
if (!validatePageSpec(specJson)) {
|
|
14
|
+
console.error('❌ spec file is not a valid PageSpecV1.');
|
|
15
|
+
process.exit(1);
|
|
16
|
+
}
|
|
17
|
+
const catalog = JSON.parse(readFileSync(catalogFile, 'utf-8'));
|
|
18
|
+
const resolved = resolvePageSpecWithCatalog(specJson, catalog);
|
|
19
|
+
console.log(JSON.stringify(resolved, null, 2));
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=catalog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../../src/bin/commands/catalog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AAGnE,MAAM,UAAU,iBAAiB,CAAC,IAAc;IAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACzB,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC7C,MAAM,WAAW,GAAG,UAAU,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAEvE,IAAI,CAAC,QAAQ,IAAI,CAAC,WAAW,EAAE,CAAC;QAC5B,OAAO,CAAC,KAAK,CAAC,uEAAuE,CAAC,CAAC;QACvF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;IAC7D,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC9B,OAAO,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;QACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,MAAM,OAAO,GAAuB,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;IACnF,MAAM,QAAQ,GAAG,0BAA0B,CAAC,QAAsB,EAAE,OAAO,CAAC,CAAC;IAE7E,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACnD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contrast.d.ts","sourceRoot":"","sources":["../../../src/bin/commands/contrast.ts"],"names":[],"mappings":"AAGA,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAuBhD"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { checkWcagContrast } from '../../core/contrast.js';
|
|
2
|
+
export function runContrast(args) {
|
|
3
|
+
const fg = args[0];
|
|
4
|
+
const bg = args[1];
|
|
5
|
+
const level = args[2] || 'AA';
|
|
6
|
+
if (!fg || !bg) {
|
|
7
|
+
console.error('Usage: valentino contrast <foreground> <background> [AA|AAA]');
|
|
8
|
+
process.exit(1);
|
|
9
|
+
}
|
|
10
|
+
const result = checkWcagContrast(fg, bg, level);
|
|
11
|
+
if (result.ratio === 0) {
|
|
12
|
+
console.error('❌ Could not parse colors. Use #hex or rgb(r,g,b) format.');
|
|
13
|
+
process.exit(1);
|
|
14
|
+
}
|
|
15
|
+
const status = result.passes ? '✅ PASS' : '❌ FAIL';
|
|
16
|
+
console.log(`${status} — ${result.ratio}:1 (${level} requires ${level === 'AAA' ? '7.0' : '4.5'}:1)`);
|
|
17
|
+
console.log(` Foreground: ${fg}`);
|
|
18
|
+
console.log(` Background: ${bg}`);
|
|
19
|
+
if (!result.passes)
|
|
20
|
+
process.exit(1);
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=contrast.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contrast.js","sourceRoot":"","sources":["../../../src/bin/commands/contrast.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAG3D,MAAM,UAAU,WAAW,CAAC,IAAc;IACtC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACnB,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACnB,MAAM,KAAK,GAAI,IAAI,CAAC,CAAC,CAAmB,IAAI,IAAI,CAAC;IAEjD,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,8DAA8D,CAAC,CAAC;QAC9E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,MAAM,MAAM,GAAG,iBAAiB,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;IAEhD,IAAI,MAAM,CAAC,KAAK,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO,CAAC,KAAK,CAAC,0DAA0D,CAAC,CAAC;QAC1E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;IACnD,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,MAAM,MAAM,CAAC,KAAK,OAAO,KAAK,aAAa,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC;IACtG,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;IACnC,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;IAEnC,IAAI,CAAC,MAAM,CAAC,MAAM;QAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACxC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guardrails.d.ts","sourceRoot":"","sources":["../../../src/bin/commands/guardrails.ts"],"names":[],"mappings":"AAAA,wBAAgB,aAAa,IAAI,IAAI,CAgBpC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export function runGuardrails() {
|
|
2
|
+
const guardrails = [
|
|
3
|
+
'1. WhatIf di Layout — Wireframe first, code second',
|
|
4
|
+
'2. Component Boundary & Fallbacks — Error Boundaries on all API bridges',
|
|
5
|
+
'3. Design Token System — No hardcoded colors or px values',
|
|
6
|
+
'4. L3 Audit before Commit — ARIA, performance, and dependency check',
|
|
7
|
+
'5. Escalation to GEDI — Consult GEDI on architectural trade-offs',
|
|
8
|
+
'6. Zero UI-Debt — Reuse before creating',
|
|
9
|
+
'7. Electrical Socket Pattern — CSS root variables for all colors',
|
|
10
|
+
'8. Testudo Formation — No inline padding/margin overrides on containers',
|
|
11
|
+
'9. Tangible Legacy — No redundant CSS blocks',
|
|
12
|
+
'10. Visual Live Audit — Use MCP browser_screenshot or npm run test:e2e:valentino',
|
|
13
|
+
];
|
|
14
|
+
console.log('\n🛡️ Valentino Engine — 10 Sovereign Guardrails\n');
|
|
15
|
+
guardrails.forEach(g => console.log(' ', g));
|
|
16
|
+
console.log();
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=guardrails.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guardrails.js","sourceRoot":"","sources":["../../../src/bin/commands/guardrails.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,aAAa;IACzB,MAAM,UAAU,GAAG;QACf,oDAAoD;QACpD,yEAAyE;QACzE,2DAA2D;QAC3D,qEAAqE;QACrE,kEAAkE;QAClE,yCAAyC;QACzC,kEAAkE;QAClE,yEAAyE;QACzE,8CAA8C;QAC9C,kFAAkF;KACrF,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;IACnE,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;IAC7C,OAAO,CAAC,GAAG,EAAE,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../../src/bin/commands/manifest.ts"],"names":[],"mappings":"AAIA,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAmBvD"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { readFileSync } from 'fs';
|
|
2
|
+
import { resolvePageIdByRoute } from '../../core/manifest.js';
|
|
3
|
+
export function runManifestResolve(args) {
|
|
4
|
+
const manifestFile = args[0];
|
|
5
|
+
const routeIdx = args.indexOf('--route');
|
|
6
|
+
const route = routeIdx >= 0 ? args[routeIdx + 1] : undefined;
|
|
7
|
+
if (!manifestFile || !route) {
|
|
8
|
+
console.error('Usage: valentino manifest resolve <manifest.json> --route /path');
|
|
9
|
+
process.exit(1);
|
|
10
|
+
}
|
|
11
|
+
const manifest = JSON.parse(readFileSync(manifestFile, 'utf-8'));
|
|
12
|
+
const pageId = resolvePageIdByRoute(manifest, route);
|
|
13
|
+
if (pageId) {
|
|
14
|
+
console.log(`✅ Route "${route}" → pageId: "${pageId}"`);
|
|
15
|
+
}
|
|
16
|
+
else {
|
|
17
|
+
console.error(`❌ No page found for route "${route}"`);
|
|
18
|
+
process.exit(1);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=manifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../../src/bin/commands/manifest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAG9D,MAAM,UAAU,kBAAkB,CAAC,IAAc;IAC7C,MAAM,YAAY,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,QAAQ,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAE7D,IAAI,CAAC,YAAY,IAAI,CAAC,KAAK,EAAE,CAAC;QAC1B,OAAO,CAAC,KAAK,CAAC,iEAAiE,CAAC,CAAC;QACjF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,MAAM,QAAQ,GAAoB,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC;IAClF,MAAM,MAAM,GAAG,oBAAoB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAErD,IAAI,MAAM,EAAE,CAAC;QACT,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,gBAAgB,MAAM,GAAG,CAAC,CAAC;IAC5D,CAAC;SAAM,CAAC;QACJ,OAAO,CAAC,KAAK,CAAC,8BAA8B,KAAK,GAAG,CAAC,CAAC;QACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"probe.d.ts","sourceRoot":"","sources":["../../../src/bin/commands/probe.ts"],"names":[],"mappings":"AA0BA,wBAAgB,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAoCjE"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { readFileSync } from 'fs';
|
|
2
|
+
import { validatePageSpec } from '../../core/page-spec.js';
|
|
3
|
+
import { probeRhythm } from '../../core/rhythm.js';
|
|
4
|
+
import { probeHeroContract } from '../../core/hero-contract.js';
|
|
5
|
+
import { probeSectionIntegrity } from '../../core/section-integrity.js';
|
|
6
|
+
function loadSpec(file) {
|
|
7
|
+
const json = JSON.parse(readFileSync(file, 'utf-8'));
|
|
8
|
+
if (!validatePageSpec(json)) {
|
|
9
|
+
console.error('❌ File is not a valid PageSpecV1.');
|
|
10
|
+
process.exit(1);
|
|
11
|
+
}
|
|
12
|
+
return json;
|
|
13
|
+
}
|
|
14
|
+
function printWarnings(label, warnings) {
|
|
15
|
+
if (warnings.length === 0) {
|
|
16
|
+
console.log(` ✅ ${label}: no issues`);
|
|
17
|
+
return true;
|
|
18
|
+
}
|
|
19
|
+
console.log(` ❌ ${label}: ${warnings.length} issue(s)`);
|
|
20
|
+
warnings.forEach(w => console.log(` • [${w.rule}] ${w.message}`));
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
export function runProbe(subcommand, args) {
|
|
24
|
+
const file = args[0];
|
|
25
|
+
if (!file) {
|
|
26
|
+
console.error('Usage: valentino probe <rhythm|hero|integrity|all> <path-to-spec.json>');
|
|
27
|
+
process.exit(1);
|
|
28
|
+
}
|
|
29
|
+
const spec = loadSpec(file);
|
|
30
|
+
let allValid = true;
|
|
31
|
+
console.log(`\n🔍 Valentino Probe — ${file}\n`);
|
|
32
|
+
if (subcommand === 'rhythm' || subcommand === 'all') {
|
|
33
|
+
const result = probeRhythm(spec);
|
|
34
|
+
if (!printWarnings('Rhythm', result.warnings))
|
|
35
|
+
allValid = false;
|
|
36
|
+
}
|
|
37
|
+
if (subcommand === 'hero' || subcommand === 'all') {
|
|
38
|
+
const heroes = spec.sections.filter((s) => s.type === 'hero');
|
|
39
|
+
if (heroes.length === 0) {
|
|
40
|
+
console.log(' ⏭️ Hero: no hero section found');
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
for (const hero of heroes) {
|
|
44
|
+
const result = probeHeroContract(hero);
|
|
45
|
+
if (!printWarnings(`Hero (${hero.titleKey})`, result.warnings))
|
|
46
|
+
allValid = false;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
if (subcommand === 'integrity' || subcommand === 'all') {
|
|
51
|
+
const result = probeSectionIntegrity(spec.sections);
|
|
52
|
+
if (!printWarnings('Section Integrity', result.warnings))
|
|
53
|
+
allValid = false;
|
|
54
|
+
}
|
|
55
|
+
console.log();
|
|
56
|
+
if (!allValid)
|
|
57
|
+
process.exit(1);
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=probe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"probe.js","sourceRoot":"","sources":["../../../src/bin/commands/probe.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../../src/bin/commands/validate.ts"],"names":[],"mappings":"AAGA,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAchD"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { readFileSync } from 'fs';
|
|
2
|
+
import { validatePageSpec } from '../../core/page-spec.js';
|
|
3
|
+
export function runValidate(args) {
|
|
4
|
+
const file = args[0];
|
|
5
|
+
if (!file) {
|
|
6
|
+
console.error('Usage: valentino validate <path-to-pagespec.json>');
|
|
7
|
+
process.exit(1);
|
|
8
|
+
}
|
|
9
|
+
const json = JSON.parse(readFileSync(file, 'utf-8'));
|
|
10
|
+
const valid = validatePageSpec(json);
|
|
11
|
+
if (valid) {
|
|
12
|
+
console.log('✅ PageSpec is valid (V1).');
|
|
13
|
+
}
|
|
14
|
+
else {
|
|
15
|
+
console.error('❌ PageSpec is invalid — requires version: "1", id (string), sections (array).');
|
|
16
|
+
process.exit(1);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../../src/bin/commands/validate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE3D,MAAM,UAAU,WAAW,CAAC,IAAc;IACtC,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACrB,IAAI,CAAC,IAAI,EAAE,CAAC;QACR,OAAO,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC;QACnE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IACrD,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,KAAK,EAAE,CAAC;QACR,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;IAC7C,CAAC;SAAM,CAAC;QACJ,OAAO,CAAC,KAAK,CAAC,+EAA+E,CAAC,CAAC;QAC/F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"valentino.d.ts","sourceRoot":"","sources":["../../src/bin/valentino.ts"],"names":[],"mappings":";AACA;;;GAGG"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Valentino CLI — command router
|
|
4
|
+
* `npx @hale-bopp/valentino <command> [args]`
|
|
5
|
+
*/
|
|
6
|
+
import { runAudit } from './commands/audit.js';
|
|
7
|
+
import { runValidate } from './commands/validate.js';
|
|
8
|
+
import { runGuardrails } from './commands/guardrails.js';
|
|
9
|
+
import { runProbe } from './commands/probe.js';
|
|
10
|
+
import { runCatalogResolve } from './commands/catalog.js';
|
|
11
|
+
import { runManifestResolve } from './commands/manifest.js';
|
|
12
|
+
import { runContrast } from './commands/contrast.js';
|
|
13
|
+
const [, , command, ...args] = process.argv;
|
|
14
|
+
switch (command) {
|
|
15
|
+
case 'audit':
|
|
16
|
+
runAudit(args);
|
|
17
|
+
break;
|
|
18
|
+
case 'validate':
|
|
19
|
+
runValidate(args);
|
|
20
|
+
break;
|
|
21
|
+
case 'guardrails':
|
|
22
|
+
runGuardrails();
|
|
23
|
+
break;
|
|
24
|
+
case 'probe':
|
|
25
|
+
runProbe(args[0] || 'all', args.slice(1));
|
|
26
|
+
break;
|
|
27
|
+
case 'catalog':
|
|
28
|
+
if (args[0] === 'resolve')
|
|
29
|
+
runCatalogResolve(args.slice(1));
|
|
30
|
+
else {
|
|
31
|
+
console.error('Usage: valentino catalog resolve <spec.json> --catalog <catalog.json>');
|
|
32
|
+
process.exit(1);
|
|
33
|
+
}
|
|
34
|
+
break;
|
|
35
|
+
case 'manifest':
|
|
36
|
+
if (args[0] === 'resolve')
|
|
37
|
+
runManifestResolve(args.slice(1));
|
|
38
|
+
else {
|
|
39
|
+
console.error('Usage: valentino manifest resolve <manifest.json> --route /path');
|
|
40
|
+
process.exit(1);
|
|
41
|
+
}
|
|
42
|
+
break;
|
|
43
|
+
case 'contrast':
|
|
44
|
+
runContrast(args);
|
|
45
|
+
break;
|
|
46
|
+
default:
|
|
47
|
+
console.log(`
|
|
48
|
+
🎨 Valentino Engine v0.1.0 — Antifragile Open Source UI Design Engine
|
|
49
|
+
|
|
50
|
+
Usage:
|
|
51
|
+
valentino audit <file.css> Audit CSS for guardrail violations
|
|
52
|
+
valentino validate <spec.json> Validate a Runtime PageSpec JSON (V1)
|
|
53
|
+
valentino guardrails List all 10 Sovereign Guardrails
|
|
54
|
+
valentino probe <rhythm|hero|integrity|all> <spec.json> Run validation probes
|
|
55
|
+
valentino contrast <foreground> <background> [AA|AAA] Check WCAG contrast ratio
|
|
56
|
+
valentino catalog resolve <spec.json> --catalog <catalog.json> Resolve spec with catalog
|
|
57
|
+
valentino manifest resolve <manifest.json> --route /path Resolve route to page ID
|
|
58
|
+
|
|
59
|
+
Epic: https://dev.azure.com/EasyWayData/EasyWay-DataPortal/_workitems/edit/480
|
|
60
|
+
`);
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=valentino.js.map
|
|
@@ -0,0 +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;AAErD,MAAM,CAAC,EAAC,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;AAE3C,QAAQ,OAAO,EAAE,CAAC;IACd,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;QACI,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;CAanB,CAAC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Catalog Resolver — resolves PageSpec against a ValentinoCatalog.
|
|
3
|
+
* Pure functions, no fetch, no DOM. Consumer loads the catalog.
|
|
4
|
+
* Extracted from easyway-portal (src/utils/valentino-catalog.ts).
|
|
5
|
+
*/
|
|
6
|
+
import type { PageSpecV1, SectionPresentationSpec, SectionSpec, ValentinoCatalogV1, PageProfileSpec } from './types.js';
|
|
7
|
+
export declare function mergePresentation(presetPresentation: SectionPresentationSpec | undefined, transitionPresentation: SectionPresentationSpec | undefined, inlinePresentation: SectionPresentationSpec | undefined): SectionPresentationSpec | undefined;
|
|
8
|
+
export declare function isGovernanceAllowed(sectionType: SectionSpec['type'], pageProfile: PageProfileSpec | undefined, governance?: {
|
|
9
|
+
allowedPageProfiles?: PageProfileSpec[];
|
|
10
|
+
allowedSectionTypes?: SectionSpec['type'][];
|
|
11
|
+
}): boolean;
|
|
12
|
+
export declare function resolvePageSpecWithCatalog(pageSpec: PageSpecV1, catalog: ValentinoCatalogV1): PageSpecV1;
|
|
13
|
+
//# sourceMappingURL=catalog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../src/core/catalog.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACR,UAAU,EACV,uBAAuB,EACvB,WAAW,EACX,kBAAkB,EAClB,eAAe,EAClB,MAAM,YAAY,CAAC;AAEpB,wBAAgB,iBAAiB,CAC7B,kBAAkB,EAAE,uBAAuB,GAAG,SAAS,EACvD,sBAAsB,EAAE,uBAAuB,GAAG,SAAS,EAC3D,kBAAkB,EAAE,uBAAuB,GAAG,SAAS,GACxD,uBAAuB,GAAG,SAAS,CAOrC;AAED,wBAAgB,mBAAmB,CAC/B,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,EAChC,WAAW,EAAE,eAAe,GAAG,SAAS,EACxC,UAAU,CAAC,EAAE;IACT,mBAAmB,CAAC,EAAE,eAAe,EAAE,CAAC;IACxC,mBAAmB,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;CAC/C,GACF,OAAO,CAYT;AA+BD,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,kBAAkB,GAAG,UAAU,CAqBxG"}
|