You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
svelte-kit-vice/scripts/eidos-lint.ts

79 lines
2.8 KiB

eidos: lint a CSS file against its morfo contract Consumes `compileMorfo(morfo).contracts.cssSelectors` to classify every `[data-*]` selector in an eidos CSS file: - morfo-backed: the runtime writes the attr; eidos reacts to it. - eidos-only: the marker is present (`[data-toggle]`) but at least one `data-*` is not declared on the morfo part. Legitimate design tokens (`data-color`, `data-size`, `data-variant`) and drift cases (`data-dialog-header` — a part the morfo no longer declares) both land here; the lint tool reports them so authors can decide. - invalid: the attr IS declared on the morfo, but with a value outside the declared enum. Bug. Also reports `unusedFromContract`: selectors the compiler promises that no eidos rule consumes — the inverse direction of drift. Two CLI entry points: - `scripts/eidos-lint.ts <component>` — single-component report - `scripts/eidos-lint-all.ts` — sweep across every eidos component Initial sweep finds 0 invalid, 134 eidos-only, 82 unused contract selectors across 11 components. Real drift hotspots: dialog/drawer `header`/`footer` (eidos parts the morfos don't declare), popover's `data-side × data-last-action` compounds, tooltip's `data-state='delayed-open'`. Deliberate left as-is for the user to triage — fixes belong in a separate commit. Tests cover toggle (clean baseline), dialog (drift detector for header/footer + dead `data-disabled`), and a synthetic invalid case. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
/**
* Lint an eidos component CSS against its morfo contract.
*
* Usage: npx tsx scripts/eidos-lint.ts <component-kebab>
* e.g. npx tsx scripts/eidos-lint.ts toggle
*
* Reads `src/uix/morfo/components/{name}.ts` +
* `src/uix/eidos/components/{name}/{name}.css` (or legacy flat
* `components/{name}.css`), compiles the morfo, and reports which
* selectors are morfo-backed, eidos-only DOM signals/wrapper attrs, or
* invalid (value not in declared enum).
feat(morfo,sema,eidos): todo evento dice de que familia es, y el cruce por fin se ve El framework llamaba a la misma cosa de dos maneras: `open` pelado en ocho componentes y `emerge-open` en tres. No era estetica — un preset de movimiento engancha el nombre con `^=`, asi que el dialecto pelado no casaba con ninguna firma y simplemente no animaba, sin romper una sola prueba. Los 40 nombres sin prefijo pasan a `{familia}-{verbo}[-{matiz}]`: 256 eventos, 256 con prefijo, 0 ambiguos. El plan decia 36 y decia `handle-drag-start`; eran 40, y el canon (c25) dice que esos verbos son `pick` y `drop` — `handle-pick` y `handle-drop` ya existian en 10 y 4 componentes. `validateMorfo` cierra la puerta: un `events[].name` que no empiece por su familia ahora lanza. Visto fallar antes con un nombre pelado inyectado. Lo que el renombrado destapo, y va aqui tambien: - La receta del splitter enganchaba `commit-resize`, muerto desde `bd2e40366`. No casaba desde mayo y nadie chillo. Reescrita por FAMILIA, como slider y knob, y `eidos-lint` valida ahora el VALOR de `data-event*` contra el catalogo de morfos — el guard que lo habria cazado en su dia. - La familia `shift` era muda en el canal visual, contra su propia doctrina (c27: el cruce debe percibirse; c34 tipifica el «shift invisible»). Su mapa ya describia la firma que le faltaba y su sonido por defecto es `slide`. Ahora tiene firma direccional: sexto atributo del sello (`data-event-direction`, `forward`|`backward`, por emision) y deslizamiento de 320ms RTL-safe por `:dir()`. Medido: LTR -30px/+30px, RTL los invierte. - El sello de `shift-navigate` pasa del BOTON al `grid` en los cuatro calendarios. Medido: el boton recibia `contact-activate` y 8,5 ms despues —media trama— el `shift-navigate` pisaba la misma ranura y el `press-squeeze` moria sin pintar un fotograma. Una superficie, una ranura (A-36). - 101 contradicciones docs<->morfo adjudicadas con evidencia (git log, docs de decision, el componente vivo). Las docs desfasadas, corregidas; los nueve DEFECTOS de codigo obsoleto quedan abiertos y sin tocar. - `SoundDirection` -> `SoundContour`: era un contorno de tono, no un sentido, y habia tres cosas distintas deletreadas «direction». check en su linea base con 0 errores nuevos por diferencia de conjuntos · docs:check 0/0 · eidos-lint invalid 0 · el censo y las escenas de navegador medidas con raton real y rAF vivo. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2 months ago
*
* Also validates the `data-event*` VALUES against the morfo catalogue and
* the sema canon — see `scripts/eidos-event-vocabulary.ts`.
eidos: lint a CSS file against its morfo contract Consumes `compileMorfo(morfo).contracts.cssSelectors` to classify every `[data-*]` selector in an eidos CSS file: - morfo-backed: the runtime writes the attr; eidos reacts to it. - eidos-only: the marker is present (`[data-toggle]`) but at least one `data-*` is not declared on the morfo part. Legitimate design tokens (`data-color`, `data-size`, `data-variant`) and drift cases (`data-dialog-header` — a part the morfo no longer declares) both land here; the lint tool reports them so authors can decide. - invalid: the attr IS declared on the morfo, but with a value outside the declared enum. Bug. Also reports `unusedFromContract`: selectors the compiler promises that no eidos rule consumes — the inverse direction of drift. Two CLI entry points: - `scripts/eidos-lint.ts <component>` — single-component report - `scripts/eidos-lint-all.ts` — sweep across every eidos component Initial sweep finds 0 invalid, 134 eidos-only, 82 unused contract selectors across 11 components. Real drift hotspots: dialog/drawer `header`/`footer` (eidos parts the morfos don't declare), popover's `data-side × data-last-action` compounds, tooltip's `data-state='delayed-open'`. Deliberate left as-is for the user to triage — fixes belong in a separate commit. Tests cover toggle (clean baseline), dialog (drift detector for header/footer + dead `data-disabled`), and a synthetic invalid case. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
*/
import { readFileSync, existsSync } from 'node:fs';
import { resolve } from 'node:path';
eidos: lint a CSS file against its morfo contract Consumes `compileMorfo(morfo).contracts.cssSelectors` to classify every `[data-*]` selector in an eidos CSS file: - morfo-backed: the runtime writes the attr; eidos reacts to it. - eidos-only: the marker is present (`[data-toggle]`) but at least one `data-*` is not declared on the morfo part. Legitimate design tokens (`data-color`, `data-size`, `data-variant`) and drift cases (`data-dialog-header` — a part the morfo no longer declares) both land here; the lint tool reports them so authors can decide. - invalid: the attr IS declared on the morfo, but with a value outside the declared enum. Bug. Also reports `unusedFromContract`: selectors the compiler promises that no eidos rule consumes — the inverse direction of drift. Two CLI entry points: - `scripts/eidos-lint.ts <component>` — single-component report - `scripts/eidos-lint-all.ts` — sweep across every eidos component Initial sweep finds 0 invalid, 134 eidos-only, 82 unused contract selectors across 11 components. Real drift hotspots: dialog/drawer `header`/`footer` (eidos parts the morfos don't declare), popover's `data-side × data-last-action` compounds, tooltip's `data-state='delayed-open'`. Deliberate left as-is for the user to triage — fixes belong in a separate commit. Tests cover toggle (clean baseline), dialog (drift detector for header/footer + dead `data-disabled`), and a synthetic invalid case. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
import { compileMorfo } from '../src/uix/morfo/compile';
import { formatLintReport, lintEidosCss } from '../src/uix/eidos/lint';
import type { Morfo } from '../src/uix/morfo/types';
feat(morfo,sema,eidos): todo evento dice de que familia es, y el cruce por fin se ve El framework llamaba a la misma cosa de dos maneras: `open` pelado en ocho componentes y `emerge-open` en tres. No era estetica — un preset de movimiento engancha el nombre con `^=`, asi que el dialecto pelado no casaba con ninguna firma y simplemente no animaba, sin romper una sola prueba. Los 40 nombres sin prefijo pasan a `{familia}-{verbo}[-{matiz}]`: 256 eventos, 256 con prefijo, 0 ambiguos. El plan decia 36 y decia `handle-drag-start`; eran 40, y el canon (c25) dice que esos verbos son `pick` y `drop` — `handle-pick` y `handle-drop` ya existian en 10 y 4 componentes. `validateMorfo` cierra la puerta: un `events[].name` que no empiece por su familia ahora lanza. Visto fallar antes con un nombre pelado inyectado. Lo que el renombrado destapo, y va aqui tambien: - La receta del splitter enganchaba `commit-resize`, muerto desde `bd2e40366`. No casaba desde mayo y nadie chillo. Reescrita por FAMILIA, como slider y knob, y `eidos-lint` valida ahora el VALOR de `data-event*` contra el catalogo de morfos — el guard que lo habria cazado en su dia. - La familia `shift` era muda en el canal visual, contra su propia doctrina (c27: el cruce debe percibirse; c34 tipifica el «shift invisible»). Su mapa ya describia la firma que le faltaba y su sonido por defecto es `slide`. Ahora tiene firma direccional: sexto atributo del sello (`data-event-direction`, `forward`|`backward`, por emision) y deslizamiento de 320ms RTL-safe por `:dir()`. Medido: LTR -30px/+30px, RTL los invierte. - El sello de `shift-navigate` pasa del BOTON al `grid` en los cuatro calendarios. Medido: el boton recibia `contact-activate` y 8,5 ms despues —media trama— el `shift-navigate` pisaba la misma ranura y el `press-squeeze` moria sin pintar un fotograma. Una superficie, una ranura (A-36). - 101 contradicciones docs<->morfo adjudicadas con evidencia (git log, docs de decision, el componente vivo). Las docs desfasadas, corregidas; los nueve DEFECTOS de codigo obsoleto quedan abiertos y sin tocar. - `SoundDirection` -> `SoundContour`: era un contorno de tono, no un sentido, y habia tres cosas distintas deletreadas «direction». check en su linea base con 0 errores nuevos por diferencia de conjuntos · docs:check 0/0 · eidos-lint invalid 0 · el censo y las escenas de navegador medidas con raton real y rAF vivo. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2 months ago
import {
formatEventFindings,
lintEventValues,
loadEventVocabulary
} from './eidos-event-vocabulary';
eidos: lint a CSS file against its morfo contract Consumes `compileMorfo(morfo).contracts.cssSelectors` to classify every `[data-*]` selector in an eidos CSS file: - morfo-backed: the runtime writes the attr; eidos reacts to it. - eidos-only: the marker is present (`[data-toggle]`) but at least one `data-*` is not declared on the morfo part. Legitimate design tokens (`data-color`, `data-size`, `data-variant`) and drift cases (`data-dialog-header` — a part the morfo no longer declares) both land here; the lint tool reports them so authors can decide. - invalid: the attr IS declared on the morfo, but with a value outside the declared enum. Bug. Also reports `unusedFromContract`: selectors the compiler promises that no eidos rule consumes — the inverse direction of drift. Two CLI entry points: - `scripts/eidos-lint.ts <component>` — single-component report - `scripts/eidos-lint-all.ts` — sweep across every eidos component Initial sweep finds 0 invalid, 134 eidos-only, 82 unused contract selectors across 11 components. Real drift hotspots: dialog/drawer `header`/`footer` (eidos parts the morfos don't declare), popover's `data-side × data-last-action` compounds, tooltip's `data-state='delayed-open'`. Deliberate left as-is for the user to triage — fixes belong in a separate commit. Tests cover toggle (clean baseline), dialog (drift detector for header/footer + dead `data-disabled`), and a synthetic invalid case. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
async function main() {
const name = process.argv[2];
eidos: lint a CSS file against its morfo contract Consumes `compileMorfo(morfo).contracts.cssSelectors` to classify every `[data-*]` selector in an eidos CSS file: - morfo-backed: the runtime writes the attr; eidos reacts to it. - eidos-only: the marker is present (`[data-toggle]`) but at least one `data-*` is not declared on the morfo part. Legitimate design tokens (`data-color`, `data-size`, `data-variant`) and drift cases (`data-dialog-header` — a part the morfo no longer declares) both land here; the lint tool reports them so authors can decide. - invalid: the attr IS declared on the morfo, but with a value outside the declared enum. Bug. Also reports `unusedFromContract`: selectors the compiler promises that no eidos rule consumes — the inverse direction of drift. Two CLI entry points: - `scripts/eidos-lint.ts <component>` — single-component report - `scripts/eidos-lint-all.ts` — sweep across every eidos component Initial sweep finds 0 invalid, 134 eidos-only, 82 unused contract selectors across 11 components. Real drift hotspots: dialog/drawer `header`/`footer` (eidos parts the morfos don't declare), popover's `data-side × data-last-action` compounds, tooltip's `data-state='delayed-open'`. Deliberate left as-is for the user to triage — fixes belong in a separate commit. Tests cover toggle (clean baseline), dialog (drift detector for header/footer + dead `data-disabled`), and a synthetic invalid case. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
if (!name) {
console.error('Usage: tsx scripts/eidos-lint.ts <component-kebab>');
process.exit(2);
eidos: lint a CSS file against its morfo contract Consumes `compileMorfo(morfo).contracts.cssSelectors` to classify every `[data-*]` selector in an eidos CSS file: - morfo-backed: the runtime writes the attr; eidos reacts to it. - eidos-only: the marker is present (`[data-toggle]`) but at least one `data-*` is not declared on the morfo part. Legitimate design tokens (`data-color`, `data-size`, `data-variant`) and drift cases (`data-dialog-header` — a part the morfo no longer declares) both land here; the lint tool reports them so authors can decide. - invalid: the attr IS declared on the morfo, but with a value outside the declared enum. Bug. Also reports `unusedFromContract`: selectors the compiler promises that no eidos rule consumes — the inverse direction of drift. Two CLI entry points: - `scripts/eidos-lint.ts <component>` — single-component report - `scripts/eidos-lint-all.ts` — sweep across every eidos component Initial sweep finds 0 invalid, 134 eidos-only, 82 unused contract selectors across 11 components. Real drift hotspots: dialog/drawer `header`/`footer` (eidos parts the morfos don't declare), popover's `data-side × data-last-action` compounds, tooltip's `data-state='delayed-open'`. Deliberate left as-is for the user to triage — fixes belong in a separate commit. Tests cover toggle (clean baseline), dialog (drift detector for header/footer + dead `data-disabled`), and a synthetic invalid case. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
}
const morfoPath = resolve(`src/uix/morfo/components/${name}.ts`);
const subfolderCssPath = resolve(`src/uix/eidos/components/${name}/${name}.css`);
const flatCssPath = resolve(`src/uix/eidos/components/${name}.css`);
const cssPath = existsSync(subfolderCssPath) ? subfolderCssPath : flatCssPath;
eidos: lint a CSS file against its morfo contract Consumes `compileMorfo(morfo).contracts.cssSelectors` to classify every `[data-*]` selector in an eidos CSS file: - morfo-backed: the runtime writes the attr; eidos reacts to it. - eidos-only: the marker is present (`[data-toggle]`) but at least one `data-*` is not declared on the morfo part. Legitimate design tokens (`data-color`, `data-size`, `data-variant`) and drift cases (`data-dialog-header` — a part the morfo no longer declares) both land here; the lint tool reports them so authors can decide. - invalid: the attr IS declared on the morfo, but with a value outside the declared enum. Bug. Also reports `unusedFromContract`: selectors the compiler promises that no eidos rule consumes — the inverse direction of drift. Two CLI entry points: - `scripts/eidos-lint.ts <component>` — single-component report - `scripts/eidos-lint-all.ts` — sweep across every eidos component Initial sweep finds 0 invalid, 134 eidos-only, 82 unused contract selectors across 11 components. Real drift hotspots: dialog/drawer `header`/`footer` (eidos parts the morfos don't declare), popover's `data-side × data-last-action` compounds, tooltip's `data-state='delayed-open'`. Deliberate left as-is for the user to triage — fixes belong in a separate commit. Tests cover toggle (clean baseline), dialog (drift detector for header/footer + dead `data-disabled`), and a synthetic invalid case. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
if (!existsSync(morfoPath)) {
console.error(`No morfo file at ${morfoPath}`);
process.exit(2);
eidos: lint a CSS file against its morfo contract Consumes `compileMorfo(morfo).contracts.cssSelectors` to classify every `[data-*]` selector in an eidos CSS file: - morfo-backed: the runtime writes the attr; eidos reacts to it. - eidos-only: the marker is present (`[data-toggle]`) but at least one `data-*` is not declared on the morfo part. Legitimate design tokens (`data-color`, `data-size`, `data-variant`) and drift cases (`data-dialog-header` — a part the morfo no longer declares) both land here; the lint tool reports them so authors can decide. - invalid: the attr IS declared on the morfo, but with a value outside the declared enum. Bug. Also reports `unusedFromContract`: selectors the compiler promises that no eidos rule consumes — the inverse direction of drift. Two CLI entry points: - `scripts/eidos-lint.ts <component>` — single-component report - `scripts/eidos-lint-all.ts` — sweep across every eidos component Initial sweep finds 0 invalid, 134 eidos-only, 82 unused contract selectors across 11 components. Real drift hotspots: dialog/drawer `header`/`footer` (eidos parts the morfos don't declare), popover's `data-side × data-last-action` compounds, tooltip's `data-state='delayed-open'`. Deliberate left as-is for the user to triage — fixes belong in a separate commit. Tests cover toggle (clean baseline), dialog (drift detector for header/footer + dead `data-disabled`), and a synthetic invalid case. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
}
if (!existsSync(cssPath)) {
console.error(`No eidos CSS at ${subfolderCssPath} or ${flatCssPath}`);
process.exit(2);
eidos: lint a CSS file against its morfo contract Consumes `compileMorfo(morfo).contracts.cssSelectors` to classify every `[data-*]` selector in an eidos CSS file: - morfo-backed: the runtime writes the attr; eidos reacts to it. - eidos-only: the marker is present (`[data-toggle]`) but at least one `data-*` is not declared on the morfo part. Legitimate design tokens (`data-color`, `data-size`, `data-variant`) and drift cases (`data-dialog-header` — a part the morfo no longer declares) both land here; the lint tool reports them so authors can decide. - invalid: the attr IS declared on the morfo, but with a value outside the declared enum. Bug. Also reports `unusedFromContract`: selectors the compiler promises that no eidos rule consumes — the inverse direction of drift. Two CLI entry points: - `scripts/eidos-lint.ts <component>` — single-component report - `scripts/eidos-lint-all.ts` — sweep across every eidos component Initial sweep finds 0 invalid, 134 eidos-only, 82 unused contract selectors across 11 components. Real drift hotspots: dialog/drawer `header`/`footer` (eidos parts the morfos don't declare), popover's `data-side × data-last-action` compounds, tooltip's `data-state='delayed-open'`. Deliberate left as-is for the user to triage — fixes belong in a separate commit. Tests cover toggle (clean baseline), dialog (drift detector for header/footer + dead `data-disabled`), and a synthetic invalid case. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
}
const mod = (await import(`../src/uix/morfo/components/${name}`)) as Record<string, unknown>;
const morfoExportName = `${name.replace(/-([a-z])/g, (_, c: string) => c.toUpperCase())}Morfo`;
const morfo = mod[morfoExportName] as Morfo | undefined;
eidos: lint a CSS file against its morfo contract Consumes `compileMorfo(morfo).contracts.cssSelectors` to classify every `[data-*]` selector in an eidos CSS file: - morfo-backed: the runtime writes the attr; eidos reacts to it. - eidos-only: the marker is present (`[data-toggle]`) but at least one `data-*` is not declared on the morfo part. Legitimate design tokens (`data-color`, `data-size`, `data-variant`) and drift cases (`data-dialog-header` — a part the morfo no longer declares) both land here; the lint tool reports them so authors can decide. - invalid: the attr IS declared on the morfo, but with a value outside the declared enum. Bug. Also reports `unusedFromContract`: selectors the compiler promises that no eidos rule consumes — the inverse direction of drift. Two CLI entry points: - `scripts/eidos-lint.ts <component>` — single-component report - `scripts/eidos-lint-all.ts` — sweep across every eidos component Initial sweep finds 0 invalid, 134 eidos-only, 82 unused contract selectors across 11 components. Real drift hotspots: dialog/drawer `header`/`footer` (eidos parts the morfos don't declare), popover's `data-side × data-last-action` compounds, tooltip's `data-state='delayed-open'`. Deliberate left as-is for the user to triage — fixes belong in a separate commit. Tests cover toggle (clean baseline), dialog (drift detector for header/footer + dead `data-disabled`), and a synthetic invalid case. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
if (!morfo) {
console.error(`Module exports ${Object.keys(mod).join(', ')}; expected ${morfoExportName}.`);
process.exit(2);
eidos: lint a CSS file against its morfo contract Consumes `compileMorfo(morfo).contracts.cssSelectors` to classify every `[data-*]` selector in an eidos CSS file: - morfo-backed: the runtime writes the attr; eidos reacts to it. - eidos-only: the marker is present (`[data-toggle]`) but at least one `data-*` is not declared on the morfo part. Legitimate design tokens (`data-color`, `data-size`, `data-variant`) and drift cases (`data-dialog-header` — a part the morfo no longer declares) both land here; the lint tool reports them so authors can decide. - invalid: the attr IS declared on the morfo, but with a value outside the declared enum. Bug. Also reports `unusedFromContract`: selectors the compiler promises that no eidos rule consumes — the inverse direction of drift. Two CLI entry points: - `scripts/eidos-lint.ts <component>` — single-component report - `scripts/eidos-lint-all.ts` — sweep across every eidos component Initial sweep finds 0 invalid, 134 eidos-only, 82 unused contract selectors across 11 components. Real drift hotspots: dialog/drawer `header`/`footer` (eidos parts the morfos don't declare), popover's `data-side × data-last-action` compounds, tooltip's `data-state='delayed-open'`. Deliberate left as-is for the user to triage — fixes belong in a separate commit. Tests cover toggle (clean baseline), dialog (drift detector for header/footer + dead `data-disabled`), and a synthetic invalid case. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
}
const compiled = compileMorfo(morfo);
const css = readFileSync(cssPath, 'utf-8');
const report = lintEidosCss(css, compiled);
console.log(formatLintReport(report));
eidos: lint a CSS file against its morfo contract Consumes `compileMorfo(morfo).contracts.cssSelectors` to classify every `[data-*]` selector in an eidos CSS file: - morfo-backed: the runtime writes the attr; eidos reacts to it. - eidos-only: the marker is present (`[data-toggle]`) but at least one `data-*` is not declared on the morfo part. Legitimate design tokens (`data-color`, `data-size`, `data-variant`) and drift cases (`data-dialog-header` — a part the morfo no longer declares) both land here; the lint tool reports them so authors can decide. - invalid: the attr IS declared on the morfo, but with a value outside the declared enum. Bug. Also reports `unusedFromContract`: selectors the compiler promises that no eidos rule consumes — the inverse direction of drift. Two CLI entry points: - `scripts/eidos-lint.ts <component>` — single-component report - `scripts/eidos-lint-all.ts` — sweep across every eidos component Initial sweep finds 0 invalid, 134 eidos-only, 82 unused contract selectors across 11 components. Real drift hotspots: dialog/drawer `header`/`footer` (eidos parts the morfos don't declare), popover's `data-side × data-last-action` compounds, tooltip's `data-state='delayed-open'`. Deliberate left as-is for the user to triage — fixes belong in a separate commit. Tests cover toggle (clean baseline), dialog (drift detector for header/footer + dead `data-disabled`), and a synthetic invalid case. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
feat(morfo,sema,eidos): todo evento dice de que familia es, y el cruce por fin se ve El framework llamaba a la misma cosa de dos maneras: `open` pelado en ocho componentes y `emerge-open` en tres. No era estetica — un preset de movimiento engancha el nombre con `^=`, asi que el dialecto pelado no casaba con ninguna firma y simplemente no animaba, sin romper una sola prueba. Los 40 nombres sin prefijo pasan a `{familia}-{verbo}[-{matiz}]`: 256 eventos, 256 con prefijo, 0 ambiguos. El plan decia 36 y decia `handle-drag-start`; eran 40, y el canon (c25) dice que esos verbos son `pick` y `drop` — `handle-pick` y `handle-drop` ya existian en 10 y 4 componentes. `validateMorfo` cierra la puerta: un `events[].name` que no empiece por su familia ahora lanza. Visto fallar antes con un nombre pelado inyectado. Lo que el renombrado destapo, y va aqui tambien: - La receta del splitter enganchaba `commit-resize`, muerto desde `bd2e40366`. No casaba desde mayo y nadie chillo. Reescrita por FAMILIA, como slider y knob, y `eidos-lint` valida ahora el VALOR de `data-event*` contra el catalogo de morfos — el guard que lo habria cazado en su dia. - La familia `shift` era muda en el canal visual, contra su propia doctrina (c27: el cruce debe percibirse; c34 tipifica el «shift invisible»). Su mapa ya describia la firma que le faltaba y su sonido por defecto es `slide`. Ahora tiene firma direccional: sexto atributo del sello (`data-event-direction`, `forward`|`backward`, por emision) y deslizamiento de 320ms RTL-safe por `:dir()`. Medido: LTR -30px/+30px, RTL los invierte. - El sello de `shift-navigate` pasa del BOTON al `grid` en los cuatro calendarios. Medido: el boton recibia `contact-activate` y 8,5 ms despues —media trama— el `shift-navigate` pisaba la misma ranura y el `press-squeeze` moria sin pintar un fotograma. Una superficie, una ranura (A-36). - 101 contradicciones docs<->morfo adjudicadas con evidencia (git log, docs de decision, el componente vivo). Las docs desfasadas, corregidas; los nueve DEFECTOS de codigo obsoleto quedan abiertos y sin tocar. - `SoundDirection` -> `SoundContour`: era un contorno de tono, no un sentido, y habia tres cosas distintas deletreadas «direction». check en su linea base con 0 errores nuevos por diferencia de conjuntos · docs:check 0/0 · eidos-lint invalid 0 · el censo y las escenas de navegador medidas con raton real y rAF vivo. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2 months ago
// The structural report allowlists `data-event*` as eidos-only and never
// reads its value — the vocabulary is checked separately.
const eventFindings = lintEventValues(css, await loadEventVocabulary(), name);
feat(morfo,sema,eidos): todo evento dice de que familia es, y el cruce por fin se ve El framework llamaba a la misma cosa de dos maneras: `open` pelado en ocho componentes y `emerge-open` en tres. No era estetica — un preset de movimiento engancha el nombre con `^=`, asi que el dialecto pelado no casaba con ninguna firma y simplemente no animaba, sin romper una sola prueba. Los 40 nombres sin prefijo pasan a `{familia}-{verbo}[-{matiz}]`: 256 eventos, 256 con prefijo, 0 ambiguos. El plan decia 36 y decia `handle-drag-start`; eran 40, y el canon (c25) dice que esos verbos son `pick` y `drop` — `handle-pick` y `handle-drop` ya existian en 10 y 4 componentes. `validateMorfo` cierra la puerta: un `events[].name` que no empiece por su familia ahora lanza. Visto fallar antes con un nombre pelado inyectado. Lo que el renombrado destapo, y va aqui tambien: - La receta del splitter enganchaba `commit-resize`, muerto desde `bd2e40366`. No casaba desde mayo y nadie chillo. Reescrita por FAMILIA, como slider y knob, y `eidos-lint` valida ahora el VALOR de `data-event*` contra el catalogo de morfos — el guard que lo habria cazado en su dia. - La familia `shift` era muda en el canal visual, contra su propia doctrina (c27: el cruce debe percibirse; c34 tipifica el «shift invisible»). Su mapa ya describia la firma que le faltaba y su sonido por defecto es `slide`. Ahora tiene firma direccional: sexto atributo del sello (`data-event-direction`, `forward`|`backward`, por emision) y deslizamiento de 320ms RTL-safe por `:dir()`. Medido: LTR -30px/+30px, RTL los invierte. - El sello de `shift-navigate` pasa del BOTON al `grid` en los cuatro calendarios. Medido: el boton recibia `contact-activate` y 8,5 ms despues —media trama— el `shift-navigate` pisaba la misma ranura y el `press-squeeze` moria sin pintar un fotograma. Una superficie, una ranura (A-36). - 101 contradicciones docs<->morfo adjudicadas con evidencia (git log, docs de decision, el componente vivo). Las docs desfasadas, corregidas; los nueve DEFECTOS de codigo obsoleto quedan abiertos y sin tocar. - `SoundDirection` -> `SoundContour`: era un contorno de tono, no un sentido, y habia tres cosas distintas deletreadas «direction». check en su linea base con 0 errores nuevos por diferencia de conjuntos · docs:check 0/0 · eidos-lint invalid 0 · el censo y las escenas de navegador medidas con raton real y rAF vivo. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2 months ago
if (eventFindings.length) {
console.log('');
console.log(' data-event* vocabulary (value must exist in a morfo / the canon):');
console.log(formatEventFindings(eventFindings, ' '));
feat(morfo,sema,eidos): todo evento dice de que familia es, y el cruce por fin se ve El framework llamaba a la misma cosa de dos maneras: `open` pelado en ocho componentes y `emerge-open` en tres. No era estetica — un preset de movimiento engancha el nombre con `^=`, asi que el dialecto pelado no casaba con ninguna firma y simplemente no animaba, sin romper una sola prueba. Los 40 nombres sin prefijo pasan a `{familia}-{verbo}[-{matiz}]`: 256 eventos, 256 con prefijo, 0 ambiguos. El plan decia 36 y decia `handle-drag-start`; eran 40, y el canon (c25) dice que esos verbos son `pick` y `drop` — `handle-pick` y `handle-drop` ya existian en 10 y 4 componentes. `validateMorfo` cierra la puerta: un `events[].name` que no empiece por su familia ahora lanza. Visto fallar antes con un nombre pelado inyectado. Lo que el renombrado destapo, y va aqui tambien: - La receta del splitter enganchaba `commit-resize`, muerto desde `bd2e40366`. No casaba desde mayo y nadie chillo. Reescrita por FAMILIA, como slider y knob, y `eidos-lint` valida ahora el VALOR de `data-event*` contra el catalogo de morfos — el guard que lo habria cazado en su dia. - La familia `shift` era muda en el canal visual, contra su propia doctrina (c27: el cruce debe percibirse; c34 tipifica el «shift invisible»). Su mapa ya describia la firma que le faltaba y su sonido por defecto es `slide`. Ahora tiene firma direccional: sexto atributo del sello (`data-event-direction`, `forward`|`backward`, por emision) y deslizamiento de 320ms RTL-safe por `:dir()`. Medido: LTR -30px/+30px, RTL los invierte. - El sello de `shift-navigate` pasa del BOTON al `grid` en los cuatro calendarios. Medido: el boton recibia `contact-activate` y 8,5 ms despues —media trama— el `shift-navigate` pisaba la misma ranura y el `press-squeeze` moria sin pintar un fotograma. Una superficie, una ranura (A-36). - 101 contradicciones docs<->morfo adjudicadas con evidencia (git log, docs de decision, el componente vivo). Las docs desfasadas, corregidas; los nueve DEFECTOS de codigo obsoleto quedan abiertos y sin tocar. - `SoundDirection` -> `SoundContour`: era un contorno de tono, no un sentido, y habia tres cosas distintas deletreadas «direction». check en su linea base con 0 errores nuevos por diferencia de conjuntos · docs:check 0/0 · eidos-lint invalid 0 · el censo y las escenas de navegador medidas con raton real y rAF vivo. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2 months ago
}
const deadEvents = eventFindings.filter((f) => f.level === 'error').length;
if (report.counts.invalid > 0 || deadEvents > 0) process.exit(1);
eidos: lint a CSS file against its morfo contract Consumes `compileMorfo(morfo).contracts.cssSelectors` to classify every `[data-*]` selector in an eidos CSS file: - morfo-backed: the runtime writes the attr; eidos reacts to it. - eidos-only: the marker is present (`[data-toggle]`) but at least one `data-*` is not declared on the morfo part. Legitimate design tokens (`data-color`, `data-size`, `data-variant`) and drift cases (`data-dialog-header` — a part the morfo no longer declares) both land here; the lint tool reports them so authors can decide. - invalid: the attr IS declared on the morfo, but with a value outside the declared enum. Bug. Also reports `unusedFromContract`: selectors the compiler promises that no eidos rule consumes — the inverse direction of drift. Two CLI entry points: - `scripts/eidos-lint.ts <component>` — single-component report - `scripts/eidos-lint-all.ts` — sweep across every eidos component Initial sweep finds 0 invalid, 134 eidos-only, 82 unused contract selectors across 11 components. Real drift hotspots: dialog/drawer `header`/`footer` (eidos parts the morfos don't declare), popover's `data-side × data-last-action` compounds, tooltip's `data-state='delayed-open'`. Deliberate left as-is for the user to triage — fixes belong in a separate commit. Tests cover toggle (clean baseline), dialog (drift detector for header/footer + dead `data-disabled`), and a synthetic invalid case. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
}
main().catch((err) => {
console.error(err);
process.exit(2);
});

Powered by TurnKey Linux.