@tmorrow/cre8-wc 2.3.5 → 2.3.9
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/a2ui/catalog-embeddings.json +45686 -0
- package/a2ui/catalog-kg.json +1 -1
- package/a2ui/catalog.compact.json +2 -2
- package/a2ui/catalog.json +2 -2
- package/a2ui/check-layer-parity.mjs +51 -0
- package/a2ui/check-skill-fidelity.mjs +207 -0
- package/a2ui/embedding-text.mjs +58 -0
- package/a2ui/generate-embeddings.mjs +164 -0
- package/a2ui/inert-props.json +1 -1
- package/cdn/cre8-wc.esm.js +10262 -10137
- package/cdn/cre8-wc.esm.js.map +1 -1
- package/cdn/cre8-wc.min.js +5632 -5507
- package/cdn/cre8-wc.min.js.map +1 -1
- package/dist/assets/{Changelog-Documentation-Csl1aBwJ.js → Changelog-Documentation-CnXUTdpx.js} +1 -1
- package/dist/assets/{Code-Guidelines-BqNlRUKt.js → Code-Guidelines-DynOD8d9.js} +1 -1
- package/dist/assets/{Color-6AOWCN3U-CsLUzVsR.js → Color-6AOWCN3U-C3FLOpHM.js} +1 -1
- package/dist/assets/{Contributing-Guidelines-CT2DvWzd.js → Contributing-Guidelines-C6vCiV7s.js} +1 -1
- package/dist/assets/{DocsRenderer-JROSPFPF-CgiQjbt2.js → DocsRenderer-JROSPFPF-Df8r78I7.js} +1 -1
- package/dist/assets/{Tokens-Documentation-BWG2nA5m.js → Tokens-Documentation-B32BuaI2.js} +1 -1
- package/dist/assets/{WithTooltip-7X4HQR7L-C2C_AfmQ.js → WithTooltip-7X4HQR7L-BJDfLL1-.js} +1 -1
- package/dist/assets/{accordion-item.stories-DjU_NhMM.js → accordion-item.stories-CS1jSsPT.js} +76 -77
- package/dist/assets/{accordion.stories-C9wojd-w.js → accordion.stories-CEFbhqvt.js} +64 -65
- package/dist/assets/{address-form.stories-xLNhHwxT.js → address-form.stories-6caLIute.js} +1 -1
- package/dist/assets/{alert.stories-D7NEdqQa.js → alert.stories-BRhMhPrF.js} +63 -64
- package/dist/assets/{badge-DoPOxLq7.js → badge-Dou6d_Tv.js} +59 -60
- package/dist/assets/{badge.stories-BREvHNTR.js → badge.stories-CX5HfvTS.js} +1 -1
- package/dist/assets/{band.stories-B0nnSzoO.js → band.stories-QrG3CLSi.js} +70 -61
- package/dist/assets/{blocks-B6atpvtm.js → blocks-CDGRFHUM.js} +5 -5
- package/dist/assets/{breadcrumbs.stories-D05EgMNz.js → breadcrumbs.stories-CzN_mB97.js} +115 -117
- package/dist/assets/{button-BKkXnzpg.js → button-8X2Dk9iy.js} +62 -63
- package/dist/assets/{button-group-Cz-4Ghaw.js → button-group-A_PXJVGQ.js} +59 -60
- package/dist/assets/{button-group.stories-BtmH6cty.js → button-group.stories-CSN3tuGe.js} +1 -1
- package/dist/assets/{button.stories-Cwum3yAS.js → button.stories-DYT9SVO9.js} +1 -1
- package/dist/assets/{card-Ba9UBp6t.js → card-Do-wbM0m.js} +89 -64
- package/dist/assets/{card.stories-2rhA29TT.js → card.stories-CNreiXuc.js} +1 -1
- package/dist/assets/{chart.stories-CdNIg3Kb.js → chart.stories-BBRYbhIj.js} +71 -62
- package/dist/assets/{checkbox-field-item-clQWVWNS.js → checkbox-field-item-CtyT3byL.js} +60 -61
- package/dist/assets/{checkbox-field-item.stories-ifRhfwg_.js → checkbox-field-item.stories-yTrNvGTe.js} +1 -1
- package/dist/assets/{checkbox-field.stories-mYaz8FX-.js → checkbox-field.stories-BYdclwAT.js} +62 -63
- package/dist/assets/{container-grid.stories-Dnnlrhpk.js → container-grid.stories-CwUxGVIS.js} +63 -64
- package/dist/assets/{container.stories-FTn4HUQs.js → container.stories-mFk4rPUO.js} +59 -60
- package/dist/assets/{cre8-element-D4jUl3yv.js → cre8-element-D6gzFubi.js} +1 -1
- package/dist/assets/{cre8-form-element-B-sJI1kh.js → cre8-form-element-vpi8SSNA.js} +1 -1
- package/dist/assets/{danger-button.stories-vZTPor76.js → danger-button.stories-BH__J78g.js} +78 -79
- package/dist/assets/{date-picker.stories-CJp0GJ1q.js → date-picker.stories-Fylp_UTS.js} +287 -292
- package/dist/assets/{divider-5XyBGf_n.js → divider-DrXVYE-L.js} +60 -61
- package/dist/assets/{divider.stories-OhHD6KYr.js → divider.stories-CoszgvfH.js} +1 -1
- package/dist/assets/{dropdown-B2Cu1mWc.js → dropdown-CA5ix44-.js} +117 -119
- package/dist/assets/{dropdown-item.stories-BqVCNqv9.js → dropdown-item.stories-e6dApLPz.js} +1 -1
- package/dist/assets/{dropdown.stories-BlKLrvbC.js → dropdown.stories-B1h1SPwB.js} +1 -1
- package/dist/assets/{f-po-CDPxLfff.js → f-po-B5bw1GSj.js} +1 -1
- package/dist/assets/{feature.stories-Dg8guwWZ.js → feature.stories-DrhTI47W.js} +64 -65
- package/dist/assets/{field-XAdoSKiw.js → field-D0FcR6uM.js} +1 -1
- package/dist/assets/{field-note-CSSkQ5DK.js → field-note-B5lzFPnT.js} +62 -63
- package/dist/assets/{field-note.stories-DLqWQ2ML.js → field-note.stories-Br6Xgztl.js} +1 -1
- package/dist/assets/{field.stories-DV_Y25cv.js → field.stories-HfvJtP6h.js} +1 -1
- package/dist/assets/{field.styles-DE4j2yDn.js → field.styles-CYEWQMFp.js} +137 -59
- package/dist/assets/{footer.stories-C8rqIk6m.js → footer.stories-BK3EvFy8.js} +61 -62
- package/dist/assets/{form-q2KoR5mC.js → form-Dbh-V7vb.js} +1 -1
- package/dist/assets/{form.stories-CHyQ4N3Y.js → form.stories-fewQpnSP.js} +1 -1
- package/dist/assets/{formatter-L2YTDE3Q-DiDkQfYj.js → formatter-L2YTDE3Q-T6LgtDy0.js} +1 -1
- package/dist/assets/{global-nav-item-Bpmc-nWW.js → global-nav-item-B5o04IO7.js} +60 -61
- package/dist/assets/{global-nav-item.stories-eSo9-Nsj.js → global-nav-item.stories-COpdgZmH.js} +1 -1
- package/dist/assets/{global-nav.stories-D5t_BBVD.js → global-nav.stories-CQ6gFgqn.js} +57 -58
- package/dist/assets/{grid-CKI7ODmO.js → grid-C9c58hKa.js} +69 -60
- package/dist/assets/{grid-item-DdpNu2ee.js → grid-item-4qoiHhwu.js} +67 -58
- package/dist/assets/{grid.stories-Q2GWLP0H.js → grid.stories-Dq7eL7uT.js} +1 -1
- package/dist/assets/{header.stories-7ESEi8hW.js → header.stories-BLEMPDXq.js} +64 -65
- package/dist/assets/{heading-TaL9d36K.js → heading-zzuz3Lhl.js} +56 -57
- package/dist/assets/{heading.stories-D7u6BUor.js → heading.stories-CEK-s9V_.js} +1 -1
- package/dist/assets/{hero.stories-CveUmpyH.js → hero.stories-CyzfGIa8.js} +87 -78
- package/dist/assets/{icon-BmyJ3psE.js → icon-CxPUuckL.js} +63 -64
- package/dist/assets/{icon.stories-BfZHRx4U.js → icon.stories-BH5JoFtm.js} +1 -1
- package/dist/assets/if-defined-D9Db4BBK.js +1 -0
- package/dist/assets/iframe-DDPT8KPE.js +9148 -0
- package/dist/assets/{inline-alert.stories-DTpI_GL6.js → inline-alert.stories-DiqyFWQm.js} +79 -80
- package/dist/assets/{layout-container.stories-DEICn4RI.js → layout-container.stories-D4mrsYEV.js} +71 -62
- package/dist/assets/{layout.stories-R1vAqdU8.js → layout.stories-a4-Bl_nZ.js} +131 -123
- package/dist/assets/{linelength-container.stories-Di18W93a.js → linelength-container.stories-CAUkmL8C.js} +67 -58
- package/dist/assets/{link-BCInFTin.js → link-CH6OehK-.js} +60 -61
- package/dist/assets/{link-list.stories-Bql9RJvh.js → link-list.stories-CBCMLNW1.js} +131 -123
- package/dist/assets/{link.stories-ovdak_Fx.js → link.stories-DoJJdJ4x.js} +1 -1
- package/dist/assets/{list.stories-Cu1AE1n9.js → list.stories-C7q_i4Gb.js} +137 -129
- package/dist/assets/{loading-spinner-BcPlxdFy.js → loading-spinner-Cr5nQQHU.js} +57 -58
- package/dist/assets/{loading-spinner.stories-2dFxevUc.js → loading-spinner.stories-CNFn0la-.js} +1 -1
- package/dist/assets/{logo.stories-DkfS0j9Q.js → logo.stories-CKqxRnMT.js} +58 -59
- package/dist/assets/{main.stories-_hQ8dB5R.js → main.stories-TczfQD5P.js} +56 -57
- package/dist/assets/{modal-DFswd6Pm.js → modal-5_C5K3k1.js} +1 -1
- package/dist/assets/{modal-DSuDhgP2.js → modal-CyHr0GaN.js} +69 -70
- package/dist/assets/{modal.stories-ND5Zz9lK.js → modal.stories-BIP87Tby.js} +1 -1
- package/dist/assets/{multi-select.stories-B1QqT-2X.js → multi-select.stories-DL7YLeC0.js} +67 -68
- package/dist/assets/{nav-container.stories-Bdaj6gPh.js → nav-container.stories-CRERUQRI.js} +58 -59
- package/dist/assets/{page-header.stories-BjP7uTak.js → page-header.stories-C8qVaZ1l.js} +61 -62
- package/dist/assets/{pagination.stories-Crg_Ak31.js → pagination.stories-DKHKMQRE.js} +121 -123
- package/dist/assets/{percent-bar.stories-CI8_yiCS.js → percent-bar.stories-DPKZ73zG.js} +62 -63
- package/dist/assets/{popover.stories-DYYRKxPn.js → popover.stories-BAP5fYpV.js} +63 -64
- package/dist/assets/{primary-nav.stories--d9sFv8Q.js → primary-nav.stories-BEQISTOI.js} +130 -132
- package/dist/assets/{progress-meter-24cbQ0M2.js → progress-meter-H44nihjX.js} +56 -57
- package/dist/assets/{progress-meter.stories-Bbs-4zrX.js → progress-meter.stories-CzosQ496.js} +1 -1
- package/dist/assets/{progress-steps-item-l1Yd6Qdn.js → progress-steps-item-CzcDWkvG.js} +58 -59
- package/dist/assets/{progress-steps-item.stories-4SLP6kUe.js → progress-steps-item.stories-DmKL_LsD.js} +1 -1
- package/dist/assets/{progress-steps.stories-f-QSfx25.js → progress-steps.stories-DriY_K1-.js} +78 -79
- package/dist/assets/{radio-field-item-C-qx8w2n.js → radio-field-item-D9J7yI50.js} +127 -129
- package/dist/assets/{radio-field-item.stories-DC2D6bGM.js → radio-field-item.stories-OhybdUHY.js} +1 -1
- package/dist/assets/{radio-field.stories-CrmSXKzO.js → radio-field.stories-CFO_T4L1.js} +1 -1
- package/dist/assets/{remove-tag-DSYCfP_p.js → remove-tag-BTcYXFfg.js} +58 -59
- package/dist/assets/{remove-tag.stories-CAgobRMm.js → remove-tag.stories-BR8qDc1-.js} +1 -1
- package/dist/assets/{sample-modal.stories-CluEtIyu.js → sample-modal.stories-C0XIFujz.js} +1 -1
- package/dist/assets/{section.stories-BDwfRSMK.js → section.stories-B7yBNtOq.js} +75 -63
- package/dist/assets/{select-tile-BQUic7vl.js → select-tile-iL180t7s.js} +59 -60
- package/dist/assets/{select-tile-list.stories-DUs9OX63.js → select-tile-list.stories-CZ0W8QuX.js} +65 -66
- package/dist/assets/{select-tile.stories-BEgsWkBL.js → select-tile.stories-BTOWiDZU.js} +1 -1
- package/dist/assets/{select.stories-Dl5Tj-xh.js → select.stories-B7ZOGmyx.js} +67 -68
- package/dist/assets/{sign-in.stories-oi60nA8L.js → sign-in.stories-wUx1NQ0E.js} +1 -1
- package/dist/assets/{skeleton-loader.stories-B-YaW3gk.js → skeleton-loader.stories-BuH6a4ES.js} +62 -63
- package/dist/assets/{split-button.stories-DKwZFY3q.js → split-button.stories-DKUfRwS2.js} +55 -56
- package/dist/assets/{spread-Cc0YLoqh.js → spread-B6c5bbZ0.js} +1 -1
- package/dist/assets/state-Ds0pqCS8.js +1 -0
- package/dist/assets/{submenu.stories-aFr-X6I6.js → submenu.stories-BB01JzOh.js} +115 -117
- package/dist/assets/{syntaxhighlighter-T5IQBZDB-CLnYzOAY.js → syntaxhighlighter-T5IQBZDB-CBAzJdj9.js} +1 -1
- package/dist/assets/{table-header-HVutPQ-P.js → table-header-D48sSHtK.js} +333 -339
- package/dist/assets/{table-object.stories-Bd_L6N6-.js → table-object.stories-CaJqNcrT.js} +58 -59
- package/dist/assets/{table.stories-BtOYInmB.js → table.stories-JC8ylfy9.js} +1 -1
- package/dist/assets/{tabs.stories-B5gNqx2F.js → tabs.stories-BOJ0lZgg.js} +171 -174
- package/dist/assets/{tag-CwIHolYS.js → tag-CE4HJbZH.js} +58 -59
- package/dist/assets/{tag-list.stories-oK500v7-.js → tag-list.stories-Dig9LDQ4.js} +62 -63
- package/dist/assets/{tag.stories-BA5SqUtI.js → tag.stories-C3UKXVtV.js} +1 -1
- package/dist/assets/{tertiary-nav.stories-DUkar1nu.js → tertiary-nav.stories-DVoKTcz3.js} +125 -127
- package/dist/assets/{text-link-DI4QMUOR.js → text-link-COng-gu_.js} +60 -61
- package/dist/assets/{text-link.stories-DRSy-lWJ.js → text-link.stories-DVRc917C.js} +1 -1
- package/dist/assets/{text-passage-D_pRCxLR.js → text-passage-CXhgRa33.js} +125 -127
- package/dist/assets/{text-passage.stories-BnD2hBJy.js → text-passage.stories-NTGzgDSD.js} +1 -1
- package/dist/assets/{tooltip.stories-DJ8XD6C1.js → tooltip.stories-DmjF7lgI.js} +70 -71
- package/dist/assets/{utility-nav.stories-CD5W8Fh7.js → utility-nav.stories-CS-pU-eS.js} +121 -123
- package/dist/design-tokens/brands/cre8-a2ui/css/tokens_brand.css +29 -5
- package/dist/design-tokens/brands/cre8-vivid/css/tokens_brand.css +3 -3
- package/dist/design-tokens/brands/whitelabel/css/fonts.css +7 -0
- package/dist/design-tokens/brands/whitelabel/css/tokens_brand.css +1144 -0
- package/dist/design-tokens/brands/whitelabel/css/tokens_whitelabel.css +248 -0
- package/dist/design-tokens/core/scss/theming/body.scss +1 -1
- package/dist/design-tokens/core/scss/theming/colors.scss +1 -1
- package/dist/design-tokens/core/scss/theming/component.scss +2 -4
- package/dist/design-tokens/core/scss/theming/head.css +1 -1
- package/dist/design-tokens/core/scss/theming/head.scss +1 -1
- package/dist/iframe.html +1 -1
- package/dist/project.json +1 -1
- package/dist/sb-addons/storybook-5/manager-bundle.js +1 -1
- package/lib/components/accordion/accordion.styles.d.ts.map +1 -1
- package/lib/components/accordion/accordion.styles.js +54 -55
- package/lib/components/accordion/accordion.styles.js.map +1 -1
- package/lib/components/accordion-item/accordion-item.styles.d.ts.map +1 -1
- package/lib/components/accordion-item/accordion-item.styles.js +65 -66
- package/lib/components/accordion-item/accordion-item.styles.js.map +1 -1
- package/lib/components/alert/alert.styles.d.ts.map +1 -1
- package/lib/components/alert/alert.styles.js +54 -55
- package/lib/components/alert/alert.styles.js.map +1 -1
- package/lib/components/badge/badge.styles.d.ts.map +1 -1
- package/lib/components/badge/badge.styles.js +55 -56
- package/lib/components/badge/badge.styles.js.map +1 -1
- package/lib/components/band/band.styles.d.ts.map +1 -1
- package/lib/components/band/band.styles.js +66 -57
- package/lib/components/band/band.styles.js.map +1 -1
- package/lib/components/breadcrumbs/breadcrumbs.styles.d.ts.map +1 -1
- package/lib/components/breadcrumbs/breadcrumbs.styles.js +55 -56
- package/lib/components/breadcrumbs/breadcrumbs.styles.js.map +1 -1
- package/lib/components/breadcrumbs-item/breadcrumbs-item.styles.d.ts.map +1 -1
- package/lib/components/breadcrumbs-item/breadcrumbs-item.styles.js +55 -56
- package/lib/components/breadcrumbs-item/breadcrumbs-item.styles.js.map +1 -1
- package/lib/components/button/button.styles.d.ts.map +1 -1
- package/lib/components/button/button.styles.js +59 -60
- package/lib/components/button/button.styles.js.map +1 -1
- package/lib/components/button-group/button-group.styles.d.ts.map +1 -1
- package/lib/components/button-group/button-group.styles.js +56 -57
- package/lib/components/button-group/button-group.styles.js.map +1 -1
- package/lib/components/card/card.styles.d.ts.map +1 -1
- package/lib/components/card/card.styles.js +84 -59
- package/lib/components/card/card.styles.js.map +1 -1
- package/lib/components/chart/chart.styles.d.ts.map +1 -1
- package/lib/components/chart/chart.styles.js +64 -55
- package/lib/components/chart/chart.styles.js.map +1 -1
- package/lib/components/checkbox-field/checkbox-field.styles.d.ts.map +1 -1
- package/lib/components/checkbox-field/checkbox-field.styles.js +55 -56
- package/lib/components/checkbox-field/checkbox-field.styles.js.map +1 -1
- package/lib/components/checkbox-field-item/checkbox-field-item.styles.d.ts.map +1 -1
- package/lib/components/checkbox-field-item/checkbox-field-item.styles.js +56 -57
- package/lib/components/checkbox-field-item/checkbox-field-item.styles.js.map +1 -1
- package/lib/components/container/container.styles.d.ts.map +1 -1
- package/lib/components/container/container.styles.js +54 -55
- package/lib/components/container/container.styles.js.map +1 -1
- package/lib/components/container-grid/container-grid.styles.d.ts.map +1 -1
- package/lib/components/container-grid/container-grid.styles.js +57 -58
- package/lib/components/container-grid/container-grid.styles.js.map +1 -1
- package/lib/components/danger-button/danger-button.styles.d.ts.map +1 -1
- package/lib/components/danger-button/danger-button.styles.js +57 -58
- package/lib/components/danger-button/danger-button.styles.js.map +1 -1
- package/lib/components/date-picker/calendar/calendar.styles.d.ts.map +1 -1
- package/lib/components/date-picker/calendar/calendar.styles.js +54 -55
- package/lib/components/date-picker/calendar/calendar.styles.js.map +1 -1
- package/lib/components/date-picker/calendar-month-modal/calendar-month-modal.styles.d.ts.map +1 -1
- package/lib/components/date-picker/calendar-month-modal/calendar-month-modal.styles.js +54 -55
- package/lib/components/date-picker/calendar-month-modal/calendar-month-modal.styles.js.map +1 -1
- package/lib/components/date-picker/calendar-navigation/calendar-navigation.styles.d.ts.map +1 -1
- package/lib/components/date-picker/calendar-navigation/calendar-navigation.styles.js +54 -55
- package/lib/components/date-picker/calendar-navigation/calendar-navigation.styles.js.map +1 -1
- package/lib/components/date-picker/calendar-year-modal/calendar-year-modal.styles.d.ts.map +1 -1
- package/lib/components/date-picker/calendar-year-modal/calendar-year-modal.styles.js +54 -55
- package/lib/components/date-picker/calendar-year-modal/calendar-year-modal.styles.js.map +1 -1
- package/lib/components/date-picker/date-picker.styles.d.ts.map +1 -1
- package/lib/components/date-picker/date-picker.styles.js +56 -57
- package/lib/components/date-picker/date-picker.styles.js.map +1 -1
- package/lib/components/divider/divider.styles.d.ts.map +1 -1
- package/lib/components/divider/divider.styles.js +58 -59
- package/lib/components/divider/divider.styles.js.map +1 -1
- package/lib/components/dropdown/dropdown.styles.d.ts.map +1 -1
- package/lib/components/dropdown/dropdown.styles.js +56 -57
- package/lib/components/dropdown/dropdown.styles.js.map +1 -1
- package/lib/components/dropdown-item/dropdown-item.styles.d.ts.map +1 -1
- package/lib/components/dropdown-item/dropdown-item.styles.js +54 -55
- package/lib/components/dropdown-item/dropdown-item.styles.js.map +1 -1
- package/lib/components/feature/feature.styles.d.ts.map +1 -1
- package/lib/components/feature/feature.styles.js +56 -57
- package/lib/components/feature/feature.styles.js.map +1 -1
- package/lib/components/field/field.styles.d.ts.map +1 -1
- package/lib/components/field/field.styles.js +137 -59
- package/lib/components/field/field.styles.js.map +1 -1
- package/lib/components/field-note/field-note.styles.d.ts.map +1 -1
- package/lib/components/field-note/field-note.styles.js +57 -58
- package/lib/components/field-note/field-note.styles.js.map +1 -1
- package/lib/components/footer/footer.styles.d.ts.map +1 -1
- package/lib/components/footer/footer.styles.js +57 -58
- package/lib/components/footer/footer.styles.js.map +1 -1
- package/lib/components/global-nav/global-nav.styles.d.ts.map +1 -1
- package/lib/components/global-nav/global-nav.styles.js +54 -55
- package/lib/components/global-nav/global-nav.styles.js.map +1 -1
- package/lib/components/global-nav-item/global-nav-item.styles.d.ts.map +1 -1
- package/lib/components/global-nav-item/global-nav-item.styles.js +57 -58
- package/lib/components/global-nav-item/global-nav-item.styles.js.map +1 -1
- package/lib/components/grid/grid.styles.d.ts.map +1 -1
- package/lib/components/grid/grid.styles.js +67 -58
- package/lib/components/grid/grid.styles.js.map +1 -1
- package/lib/components/grid-item/grid-item.styles.d.ts.map +1 -1
- package/lib/components/grid-item/grid-item.styles.js +64 -55
- package/lib/components/grid-item/grid-item.styles.js.map +1 -1
- package/lib/components/header/header.styles.d.ts.map +1 -1
- package/lib/components/header/header.styles.js +56 -57
- package/lib/components/header/header.styles.js.map +1 -1
- package/lib/components/heading/heading.styles.d.ts.map +1 -1
- package/lib/components/heading/heading.styles.js +54 -55
- package/lib/components/heading/heading.styles.js.map +1 -1
- package/lib/components/hero/hero.styles.d.ts.map +1 -1
- package/lib/components/hero/hero.styles.js +71 -62
- package/lib/components/hero/hero.styles.js.map +1 -1
- package/lib/components/icon/icon.styles.d.ts.map +1 -1
- package/lib/components/icon/icon.styles.js +54 -55
- package/lib/components/icon/icon.styles.js.map +1 -1
- package/lib/components/inline-alert/inline-alert.styles.d.ts.map +1 -1
- package/lib/components/inline-alert/inline-alert.styles.js +59 -60
- package/lib/components/inline-alert/inline-alert.styles.js.map +1 -1
- package/lib/components/layout/layout.styles.d.ts.map +1 -1
- package/lib/components/layout/layout.styles.js +66 -57
- package/lib/components/layout/layout.styles.js.map +1 -1
- package/lib/components/layout-container/layout-container.styles.d.ts.map +1 -1
- package/lib/components/layout-container/layout-container.styles.js +66 -57
- package/lib/components/layout-container/layout-container.styles.js.map +1 -1
- package/lib/components/layout-section/layout-section.styles.d.ts.map +1 -1
- package/lib/components/layout-section/layout-section.styles.js +54 -55
- package/lib/components/layout-section/layout-section.styles.js.map +1 -1
- package/lib/components/linelength-container/linelength-container.styles.d.ts.map +1 -1
- package/lib/components/linelength-container/linelength-container.styles.js +64 -55
- package/lib/components/linelength-container/linelength-container.styles.js.map +1 -1
- package/lib/components/link/link.styles.d.ts.map +1 -1
- package/lib/components/link/link.styles.js +58 -59
- package/lib/components/link/link.styles.js.map +1 -1
- package/lib/components/link-list/link-list.styles.d.ts.map +1 -1
- package/lib/components/link-list/link-list.styles.js +70 -61
- package/lib/components/link-list/link-list.styles.js.map +1 -1
- package/lib/components/link-list-item/link-list-item.styles.d.ts.map +1 -1
- package/lib/components/link-list-item/link-list-item.styles.js +56 -57
- package/lib/components/link-list-item/link-list-item.styles.js.map +1 -1
- package/lib/components/list/list.styles.d.ts.map +1 -1
- package/lib/components/list/list.styles.js +71 -62
- package/lib/components/list/list.styles.js.map +1 -1
- package/lib/components/list-item/list-item.styles.d.ts.map +1 -1
- package/lib/components/list-item/list-item.styles.js +54 -55
- package/lib/components/list-item/list-item.styles.js.map +1 -1
- package/lib/components/loading-spinner/loading-spinner.styles.d.ts.map +1 -1
- package/lib/components/loading-spinner/loading-spinner.styles.js +54 -55
- package/lib/components/loading-spinner/loading-spinner.styles.js.map +1 -1
- package/lib/components/logo/logo.styles.d.ts.map +1 -1
- package/lib/components/logo/logo.styles.js +54 -55
- package/lib/components/logo/logo.styles.js.map +1 -1
- package/lib/components/main/main.styles.d.ts.map +1 -1
- package/lib/components/main/main.styles.js +54 -55
- package/lib/components/main/main.styles.js.map +1 -1
- package/lib/components/modal/modal.styles.d.ts.map +1 -1
- package/lib/components/modal/modal.styles.js +58 -59
- package/lib/components/modal/modal.styles.js.map +1 -1
- package/lib/components/multi-select/multi-select.styles.d.ts.map +1 -1
- package/lib/components/multi-select/multi-select.styles.js +57 -58
- package/lib/components/multi-select/multi-select.styles.js.map +1 -1
- package/lib/components/nav-container/nav-container.styles.d.ts.map +1 -1
- package/lib/components/nav-container/nav-container.styles.js +54 -55
- package/lib/components/nav-container/nav-container.styles.js.map +1 -1
- package/lib/components/page-header/page-header.styles.d.ts.map +1 -1
- package/lib/components/page-header/page-header.styles.js +56 -57
- package/lib/components/page-header/page-header.styles.js.map +1 -1
- package/lib/components/pagination/page-counter/page-counter.styles.d.ts.map +1 -1
- package/lib/components/pagination/page-counter/page-counter.styles.js +54 -55
- package/lib/components/pagination/page-counter/page-counter.styles.js.map +1 -1
- package/lib/components/pagination/pagination.styles.d.ts.map +1 -1
- package/lib/components/pagination/pagination.styles.js +54 -55
- package/lib/components/pagination/pagination.styles.js.map +1 -1
- package/lib/components/percent-bar/percent-bar.styles.d.ts.map +1 -1
- package/lib/components/percent-bar/percent-bar.styles.js +54 -55
- package/lib/components/percent-bar/percent-bar.styles.js.map +1 -1
- package/lib/components/popover/popover.styles.d.ts.map +1 -1
- package/lib/components/popover/popover.styles.js +57 -58
- package/lib/components/popover/popover.styles.js.map +1 -1
- package/lib/components/primary-nav/primary-nav.styles.d.ts.map +1 -1
- package/lib/components/primary-nav/primary-nav.styles.js +54 -55
- package/lib/components/primary-nav/primary-nav.styles.js.map +1 -1
- package/lib/components/primary-nav-item/primary-nav-item.styles.d.ts.map +1 -1
- package/lib/components/primary-nav-item/primary-nav-item.styles.js +64 -65
- package/lib/components/primary-nav-item/primary-nav-item.styles.js.map +1 -1
- package/lib/components/progress-meter/progress-meter.styles.d.ts.map +1 -1
- package/lib/components/progress-meter/progress-meter.styles.js +54 -55
- package/lib/components/progress-meter/progress-meter.styles.js.map +1 -1
- package/lib/components/progress-steps/progress-steps.styles.d.ts.map +1 -1
- package/lib/components/progress-steps/progress-steps.styles.js +54 -55
- package/lib/components/progress-steps/progress-steps.styles.js.map +1 -1
- package/lib/components/progress-steps-item/progress-steps-item.styles.d.ts.map +1 -1
- package/lib/components/progress-steps-item/progress-steps-item.styles.js +54 -55
- package/lib/components/progress-steps-item/progress-steps-item.styles.js.map +1 -1
- package/lib/components/radio-field/radio-field.styles.d.ts.map +1 -1
- package/lib/components/radio-field/radio-field.styles.js +55 -56
- package/lib/components/radio-field/radio-field.styles.js.map +1 -1
- package/lib/components/radio-field-item/radio-field-item.styles.d.ts.map +1 -1
- package/lib/components/radio-field-item/radio-field-item.styles.js +56 -57
- package/lib/components/radio-field-item/radio-field-item.styles.js.map +1 -1
- package/lib/components/remove-tag/remove-tag.styles.d.ts.map +1 -1
- package/lib/components/remove-tag/remove-tag.styles.js +54 -55
- package/lib/components/remove-tag/remove-tag.styles.js.map +1 -1
- package/lib/components/section/section.styles.d.ts.map +1 -1
- package/lib/components/section/section.styles.js +71 -59
- package/lib/components/section/section.styles.js.map +1 -1
- package/lib/components/select/select.styles.d.ts.map +1 -1
- package/lib/components/select/select.styles.js +56 -57
- package/lib/components/select/select.styles.js.map +1 -1
- package/lib/components/select-tile/select-tile.styles.d.ts.map +1 -1
- package/lib/components/select-tile/select-tile.styles.js +55 -56
- package/lib/components/select-tile/select-tile.styles.js.map +1 -1
- package/lib/components/select-tile-list/select-tile-list.styles.d.ts.map +1 -1
- package/lib/components/select-tile-list/select-tile-list.styles.js +56 -57
- package/lib/components/select-tile-list/select-tile-list.styles.js.map +1 -1
- package/lib/components/skeleton-loader/skeleton-loader.styles.d.ts.map +1 -1
- package/lib/components/skeleton-loader/skeleton-loader.styles.js +54 -55
- package/lib/components/skeleton-loader/skeleton-loader.styles.js.map +1 -1
- package/lib/components/split-button/split-button.styles.d.ts.map +1 -1
- package/lib/components/split-button/split-button.styles.js +54 -55
- package/lib/components/split-button/split-button.styles.js.map +1 -1
- package/lib/components/submenu/submenu.styles.d.ts.map +1 -1
- package/lib/components/submenu/submenu.styles.js +54 -55
- package/lib/components/submenu/submenu.styles.js.map +1 -1
- package/lib/components/submenu-item/submenu-item.styles.d.ts.map +1 -1
- package/lib/components/submenu-item/submenu-item.styles.js +54 -55
- package/lib/components/submenu-item/submenu-item.styles.js.map +1 -1
- package/lib/components/tab/tab.styles.d.ts.map +1 -1
- package/lib/components/tab/tab.styles.js +55 -56
- package/lib/components/tab/tab.styles.js.map +1 -1
- package/lib/components/tab-panel/tab-panel.styles.d.ts.map +1 -1
- package/lib/components/tab-panel/tab-panel.styles.js +54 -55
- package/lib/components/tab-panel/tab-panel.styles.js.map +1 -1
- package/lib/components/table/table.styles.d.ts.map +1 -1
- package/lib/components/table/table.styles.js +54 -55
- package/lib/components/table/table.styles.js.map +1 -1
- package/lib/components/table-body/table-body.styles.d.ts.map +1 -1
- package/lib/components/table-body/table-body.styles.js +54 -55
- package/lib/components/table-body/table-body.styles.js.map +1 -1
- package/lib/components/table-cell/table-cell.styles.d.ts.map +1 -1
- package/lib/components/table-cell/table-cell.styles.js +54 -55
- package/lib/components/table-cell/table-cell.styles.js.map +1 -1
- package/lib/components/table-header/table-header.styles.d.ts.map +1 -1
- package/lib/components/table-header/table-header.styles.js +54 -55
- package/lib/components/table-header/table-header.styles.js.map +1 -1
- package/lib/components/table-header-cell/table-header-cell.styles.d.ts.map +1 -1
- package/lib/components/table-header-cell/table-header-cell.styles.js +54 -55
- package/lib/components/table-header-cell/table-header-cell.styles.js.map +1 -1
- package/lib/components/table-object/table-object.styles.d.ts.map +1 -1
- package/lib/components/table-object/table-object.styles.js +54 -55
- package/lib/components/table-object/table-object.styles.js.map +1 -1
- package/lib/components/table-row/table-row.styles.d.ts.map +1 -1
- package/lib/components/table-row/table-row.styles.js +54 -55
- package/lib/components/table-row/table-row.styles.js.map +1 -1
- package/lib/components/tabs/tabs.styles.d.ts.map +1 -1
- package/lib/components/tabs/tabs.styles.js +54 -55
- package/lib/components/tabs/tabs.styles.js.map +1 -1
- package/lib/components/tag/tag.styles.d.ts.map +1 -1
- package/lib/components/tag/tag.styles.js +54 -55
- package/lib/components/tag/tag.styles.js.map +1 -1
- package/lib/components/tag-list/tag-list.styles.d.ts.map +1 -1
- package/lib/components/tag-list/tag-list.styles.js +54 -55
- package/lib/components/tag-list/tag-list.styles.js.map +1 -1
- package/lib/components/tertiary-nav/tertiary-nav.styles.d.ts.map +1 -1
- package/lib/components/tertiary-nav/tertiary-nav.styles.js +54 -55
- package/lib/components/tertiary-nav/tertiary-nav.styles.js.map +1 -1
- package/lib/components/tertiary-nav-item/tertiary-nav-item.styles.d.ts.map +1 -1
- package/lib/components/tertiary-nav-item/tertiary-nav-item.styles.js +56 -57
- package/lib/components/tertiary-nav-item/tertiary-nav-item.styles.js.map +1 -1
- package/lib/components/text-link/text-link.styles.d.ts.map +1 -1
- package/lib/components/text-link/text-link.styles.js +55 -56
- package/lib/components/text-link/text-link.styles.js.map +1 -1
- package/lib/components/text-passage/text-passage-light-dom.styles.d.ts.map +1 -1
- package/lib/components/text-passage/text-passage-light-dom.styles.js +66 -67
- package/lib/components/text-passage/text-passage-light-dom.styles.js.map +1 -1
- package/lib/components/text-passage/text-passage.styles.d.ts.map +1 -1
- package/lib/components/text-passage/text-passage.styles.js +55 -56
- package/lib/components/text-passage/text-passage.styles.js.map +1 -1
- package/lib/components/tooltip/tooltip.styles.d.ts.map +1 -1
- package/lib/components/tooltip/tooltip.styles.js +57 -58
- package/lib/components/tooltip/tooltip.styles.js.map +1 -1
- package/lib/components/utility-nav/utility-nav.styles.d.ts.map +1 -1
- package/lib/components/utility-nav/utility-nav.styles.js +56 -57
- package/lib/components/utility-nav/utility-nav.styles.js.map +1 -1
- package/lib/components/utility-nav-item/utility-nav-item.styles.d.ts.map +1 -1
- package/lib/components/utility-nav-item/utility-nav-item.styles.js +56 -57
- package/lib/components/utility-nav-item/utility-nav-item.styles.js.map +1 -1
- package/lib/design-tokens/brands/cre8-a2ui/css/tokens_brand.css +29 -5
- package/lib/design-tokens/brands/cre8-a2ui/css/tokens_cre8-a2ui.module.d.ts +1 -1
- package/lib/design-tokens/brands/cre8-a2ui/css/tokens_cre8-a2ui.module.d.ts.map +1 -1
- package/lib/design-tokens/brands/cre8-a2ui/css/tokens_cre8-a2ui.module.js +29 -5
- package/lib/design-tokens/brands/cre8-a2ui/css/tokens_cre8-a2ui.module.js.map +1 -1
- package/lib/design-tokens/brands/cre8-vivid/css/tokens_brand.css +3 -3
- package/lib/design-tokens/brands/cre8-vivid/css/tokens_cre8-vivid.module.d.ts +1 -1
- package/lib/design-tokens/brands/cre8-vivid/css/tokens_cre8-vivid.module.js +3 -3
- package/lib/design-tokens/brands/cre8-vivid/css/tokens_cre8-vivid.module.js.map +1 -1
- package/lib/design-tokens/brands/whitelabel/css/fonts.css +7 -0
- package/lib/design-tokens/brands/whitelabel/css/tokens_brand.css +1144 -0
- package/lib/design-tokens/brands/whitelabel/css/tokens_whitelabel.css +248 -0
- package/lib/design-tokens/brands/whitelabel/css/tokens_whitelabel.module.d.ts +3 -0
- package/lib/design-tokens/brands/whitelabel/css/tokens_whitelabel.module.d.ts.map +1 -0
- package/lib/design-tokens/brands/whitelabel/css/tokens_whitelabel.module.js +1402 -0
- package/lib/design-tokens/brands/whitelabel/css/tokens_whitelabel.module.js.map +1 -0
- package/lib/design-tokens/core/scss/theming/body.scss +1 -1
- package/lib/design-tokens/core/scss/theming/colors.scss +1 -1
- package/lib/design-tokens/core/scss/theming/component.scss +2 -4
- package/lib/design-tokens/core/scss/theming/head.css +1 -1
- package/lib/design-tokens/core/scss/theming/head.module.js +1 -1
- package/lib/design-tokens/core/scss/theming/head.module.js.map +1 -1
- package/lib/design-tokens/core/scss/theming/head.scss +1 -1
- package/lib/scripts/convert-scss-to-ts.js +58 -25
- package/lib/scripts/convert-scss-to-ts.js.map +1 -1
- package/mcp-manifest.json +1 -1
- package/package.json +47 -46
- package/react-manifest.json +2 -2
- package/dist/assets/if-defined-Bh0SnORx.js +0 -1
- package/dist/assets/iframe-DgoqrgRr.js +0 -7725
- package/dist/assets/state-ClQJCb1N.js +0 -1
package/a2ui/catalog-kg.json
CHANGED
package/a2ui/catalog.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
-
"$id": "https://cre8.dev/a2ui/catalogs/cre8-wc/2.3.
|
|
3
|
+
"$id": "https://cre8.dev/a2ui/catalogs/cre8-wc/2.3.9",
|
|
4
4
|
"title": "cre8-wc A2UI Catalog",
|
|
5
5
|
"description": "cre8 Web Components is a library of presentational UI web components to be consumed by # web applications.",
|
|
6
6
|
"x-native-events": [
|
|
@@ -54,7 +54,7 @@
|
|
|
54
54
|
"x-a2ui": {
|
|
55
55
|
"catalogId": "cre8-wc",
|
|
56
56
|
"library": "@tmorrow/cre8-wc",
|
|
57
|
-
"libraryVersion": "2.3.
|
|
57
|
+
"libraryVersion": "2.3.9",
|
|
58
58
|
"tagPrefix": "cre8",
|
|
59
59
|
"framework": "Lit 3.3.1"
|
|
60
60
|
},
|
|
@@ -23,6 +23,8 @@ import { readFileSync, existsSync } from 'node:fs';
|
|
|
23
23
|
import { execSync } from 'node:child_process';
|
|
24
24
|
import { fileURLToPath } from 'node:url';
|
|
25
25
|
import { dirname, join } from 'node:path';
|
|
26
|
+
import { buildEmbeddingText, textHash } from './embedding-text.mjs';
|
|
27
|
+
import { MODEL as EMBEDDING_MODEL, DIMENSIONS as EMBEDDING_DIMENSIONS } from './generate-embeddings.mjs';
|
|
26
28
|
|
|
27
29
|
const HERE = dirname(fileURLToPath(import.meta.url));
|
|
28
30
|
const WC = join(HERE, '..');
|
|
@@ -266,6 +268,55 @@ check('the catalog matches the manifest it was generated from', () => {
|
|
|
266
268
|
return `all at ${manifest.version}`;
|
|
267
269
|
});
|
|
268
270
|
|
|
271
|
+
check('semantic search vectors match current component text', () => {
|
|
272
|
+
const embeddingsPath = join(WC, 'a2ui', 'catalog-embeddings.json');
|
|
273
|
+
if (!existsSync(embeddingsPath)) {
|
|
274
|
+
return 'no catalog-embeddings.json yet — search_components falls back to lexical matching; ' +
|
|
275
|
+
'run `OPENAI_API_KEY=... node a2ui/generate-embeddings.mjs` to enable semantic search';
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
const kgPath = join(WC, 'a2ui', 'catalog-kg.json');
|
|
279
|
+
const kg = read(kgPath);
|
|
280
|
+
const embeddings = read(embeddingsPath);
|
|
281
|
+
const components = kg.nodes.filter((n) => n.type === 'component');
|
|
282
|
+
|
|
283
|
+
if (embeddings.meta?.library_version !== manifest.version) {
|
|
284
|
+
throw new Error(
|
|
285
|
+
`catalog-embeddings.json was built from version ${embeddings.meta?.library_version}, ` +
|
|
286
|
+
`manifest is ${manifest.version} — regenerate with generate-embeddings.mjs`
|
|
287
|
+
);
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
const missing = [];
|
|
291
|
+
const stale = [];
|
|
292
|
+
for (const c of components) {
|
|
293
|
+
const vector = embeddings.vectors?.[c.id];
|
|
294
|
+
if (!vector) {
|
|
295
|
+
missing.push(c.id);
|
|
296
|
+
continue;
|
|
297
|
+
}
|
|
298
|
+
const expectedHash = textHash(buildEmbeddingText(kg, c));
|
|
299
|
+
if (vector.text_hash !== expectedHash) stale.push(c.id);
|
|
300
|
+
else if (vector.model !== EMBEDDING_MODEL || vector.dims !== EMBEDDING_DIMENSIONS) stale.push(c.id);
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
const orphaned = Object.keys(embeddings.vectors ?? {}).filter(
|
|
304
|
+
(id) => !components.some((c) => c.id === id)
|
|
305
|
+
);
|
|
306
|
+
|
|
307
|
+
if (missing.length || stale.length || orphaned.length) {
|
|
308
|
+
const parts = [];
|
|
309
|
+
if (missing.length) parts.push(`missing vector(s): ${missing.join(', ')}`);
|
|
310
|
+
if (stale.length) parts.push(`stale vector(s) (component text changed): ${stale.join(', ')}`);
|
|
311
|
+
if (orphaned.length) parts.push(`orphaned vector(s) (component no longer in catalog): ${orphaned.join(', ')}`);
|
|
312
|
+
throw new Error(
|
|
313
|
+
`catalog-embeddings.json is out of sync with catalog-kg.json\n ${parts.join('\n ')}\n` +
|
|
314
|
+
' Regenerate with: OPENAI_API_KEY=... node a2ui/generate-embeddings.mjs'
|
|
315
|
+
);
|
|
316
|
+
}
|
|
317
|
+
return `${components.length} vectors, all current`;
|
|
318
|
+
});
|
|
319
|
+
|
|
269
320
|
// ── Report ───────────────────────────────────────────────────────────
|
|
270
321
|
|
|
271
322
|
for (const note of notes) console.log(note);
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Audits agent skills against the shipped catalog.
|
|
4
|
+
*
|
|
5
|
+
* node a2ui/check-skill-fidelity.mjs [--json] [path ...]
|
|
6
|
+
*
|
|
7
|
+
* Skills are documentation that agents act on directly, so a skill that names
|
|
8
|
+
* a component the library no longer ships doesn't degrade gracefully - the
|
|
9
|
+
* agent writes it, and it renders nothing. Nothing regenerates skills at
|
|
10
|
+
* release, and nothing checked them, so drift accumulated invisibly across
|
|
11
|
+
* releases: by 2.3.6 the cre8-a2ui skill documented 83 components of which 38
|
|
12
|
+
* (46%) did not exist, plus 27 undeclared props and 16 out-of-range enum
|
|
13
|
+
* values, every one of them written out with a confident-looking example.
|
|
14
|
+
*
|
|
15
|
+
* A three-arm eval measured agents carrying that skill as *worse* than agents
|
|
16
|
+
* given no CRE8 knowledge at all (component_validity 0.865 against 0.922),
|
|
17
|
+
* because it taught them to reach for cre8-toast, cre8-toggle, cre8-avatar and
|
|
18
|
+
* 35 others that had been removed or never shipped.
|
|
19
|
+
*
|
|
20
|
+
* This does not fix skills; it makes the drift visible on every release, and
|
|
21
|
+
* exits non-zero when a skill claims something the catalog contradicts.
|
|
22
|
+
*
|
|
23
|
+
* Both syntaxes are read, since skills exist for the web components and for
|
|
24
|
+
* the React wrappers:
|
|
25
|
+
*
|
|
26
|
+
* <cre8-button variant="primary"> web component, kebab tag
|
|
27
|
+
* <Cre8Button variant="primary"> React wrapper, PascalCase
|
|
28
|
+
*
|
|
29
|
+
* Only claims that can be checked are checked. Prose is left alone; a skill
|
|
30
|
+
* that carries judgment rather than API tables is expected to report zero of
|
|
31
|
+
* everything here, and that is the intended end state - the catalog is the
|
|
32
|
+
* catalog's job, and restating it anywhere else guarantees exactly this drift.
|
|
33
|
+
*/
|
|
34
|
+
|
|
35
|
+
import fs from 'node:fs';
|
|
36
|
+
import path from 'node:path';
|
|
37
|
+
import process from 'node:process';
|
|
38
|
+
|
|
39
|
+
const HERE = path.dirname(new URL(import.meta.url).pathname);
|
|
40
|
+
const CATALOG = path.join(HERE, 'catalog.compact.json');
|
|
41
|
+
|
|
42
|
+
// Attributes that belong to HTML/JSX rather than to a component's own API.
|
|
43
|
+
const NOT_PROPS = new Set([
|
|
44
|
+
'slot', 'class', 'className', 'id', 'style', 'key', 'ref', 'children',
|
|
45
|
+
'hidden', 'title', 'role', 'tabindex', 'tabIndex', 'draggable', 'dir', 'lang',
|
|
46
|
+
]);
|
|
47
|
+
|
|
48
|
+
const pascalToKebab = (name) =>
|
|
49
|
+
'cre8-' + name.slice(4).replace(/(?<!^)(?=[A-Z])/g, '-').toLowerCase();
|
|
50
|
+
|
|
51
|
+
function collectMarkdown(target) {
|
|
52
|
+
const stat = fs.statSync(target);
|
|
53
|
+
if (stat.isFile()) return [target];
|
|
54
|
+
const out = [];
|
|
55
|
+
for (const entry of fs.readdirSync(target, { withFileTypes: true })) {
|
|
56
|
+
const full = path.join(target, entry.name);
|
|
57
|
+
if (entry.isDirectory()) out.push(...collectMarkdown(full));
|
|
58
|
+
else if (entry.name.endsWith('.md')) out.push(full);
|
|
59
|
+
}
|
|
60
|
+
return out.sort();
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function auditSkill(target, catalog) {
|
|
64
|
+
const components = new Map(catalog.components.map((c) => [c.name, c]));
|
|
65
|
+
const files = collectMarkdown(target);
|
|
66
|
+
const text = files.map((f) => fs.readFileSync(f, 'utf8')).join('\n');
|
|
67
|
+
|
|
68
|
+
const unknownComponents = new Set();
|
|
69
|
+
const knownUsed = new Set();
|
|
70
|
+
const undeclaredProps = new Map(); // "component.prop" -> count
|
|
71
|
+
const invalidEnums = new Map(); // "component.prop=value" -> {allowed, count}
|
|
72
|
+
|
|
73
|
+
// One pass over every opening tag in either syntax, capturing its attributes.
|
|
74
|
+
const tag = /<(cre8-[a-z0-9-]+|Cre8[A-Za-z0-9]*)((?:\s+[a-zA-Z][\w-]*(?:=(?:"[^"]*"|'[^']*'|\{[^}]*\}))?)*)\s*\/?>/g;
|
|
75
|
+
for (const match of text.matchAll(tag)) {
|
|
76
|
+
const raw = match[1];
|
|
77
|
+
const name = raw.startsWith('Cre8') ? pascalToKebab(raw) : raw;
|
|
78
|
+
const component = components.get(name);
|
|
79
|
+
if (!component) {
|
|
80
|
+
unknownComponents.add(name);
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
knownUsed.add(name);
|
|
84
|
+
|
|
85
|
+
const declared = component.props || {};
|
|
86
|
+
// Match declared props case-insensitively: the same prop is `fullHeight`
|
|
87
|
+
// in JSX and `fullheight` once the browser lowercases the attribute.
|
|
88
|
+
const byLower = new Map(Object.keys(declared).map((p) => [p.toLowerCase(), p]));
|
|
89
|
+
|
|
90
|
+
const attr = /\s([a-zA-Z][\w-]*)(?:="([^"]*)")?/g;
|
|
91
|
+
for (const a of match[2].matchAll(attr)) {
|
|
92
|
+
const [, prop, value] = a;
|
|
93
|
+
if (NOT_PROPS.has(prop) || prop.startsWith('data-') || prop.startsWith('aria-') || prop.startsWith('on')) continue;
|
|
94
|
+
const real = byLower.get(prop.toLowerCase());
|
|
95
|
+
if (!real) {
|
|
96
|
+
const key = `${name}.${prop}`;
|
|
97
|
+
undeclaredProps.set(key, (undeclaredProps.get(key) || 0) + 1);
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
const allowed = (declared[real] || {}).enum;
|
|
101
|
+
if (allowed && value !== undefined && !allowed.includes(value)) {
|
|
102
|
+
const key = `${name}.${real}="${value}"`;
|
|
103
|
+
const prev = invalidEnums.get(key);
|
|
104
|
+
invalidEnums.set(key, { allowed, count: (prev?.count || 0) + 1 });
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
const taught = unknownComponents.size + knownUsed.size;
|
|
110
|
+
return {
|
|
111
|
+
skill: path.basename(target),
|
|
112
|
+
path: target,
|
|
113
|
+
files: files.length,
|
|
114
|
+
componentsTaught: taught,
|
|
115
|
+
unknownComponents: [...unknownComponents].sort(),
|
|
116
|
+
undeclaredProps: [...undeclaredProps.entries()].sort(),
|
|
117
|
+
invalidEnums: [...invalidEnums.entries()].sort(),
|
|
118
|
+
neverMentioned: catalog.components.map((c) => c.name).filter((n) => !knownUsed.has(n)).length,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
function report(result, catalog) {
|
|
123
|
+
const { unknownComponents: unknown, undeclaredProps: props, invalidEnums: enums } = result;
|
|
124
|
+
const defects = unknown.length + props.length + enums.length;
|
|
125
|
+
const pct = result.componentsTaught
|
|
126
|
+
? Math.round((unknown.length / result.componentsTaught) * 100)
|
|
127
|
+
: 0;
|
|
128
|
+
|
|
129
|
+
console.log(`\n${result.skill} (${result.files} file${result.files === 1 ? '' : 's'})`);
|
|
130
|
+
if (!result.componentsTaught) {
|
|
131
|
+
console.log(' no component API claims - nothing to contradict');
|
|
132
|
+
return 0;
|
|
133
|
+
}
|
|
134
|
+
console.log(` components named: ${result.componentsTaught} not in catalog: ${unknown.length} (${pct}%)`);
|
|
135
|
+
if (unknown.length) console.log(` ${unknown.join(', ')}`);
|
|
136
|
+
if (props.length) {
|
|
137
|
+
console.log(` props no component declares: ${props.length}`);
|
|
138
|
+
for (const [key, count] of props) console.log(` ${key}${count > 1 ? ` (×${count})` : ''}`);
|
|
139
|
+
}
|
|
140
|
+
if (enums.length) {
|
|
141
|
+
console.log(` values outside the declared enum: ${enums.length}`);
|
|
142
|
+
for (const [key, { allowed }] of enums) console.log(` ${key} allowed: ${allowed.join(', ')}`);
|
|
143
|
+
}
|
|
144
|
+
console.log(` catalog components it never mentions: ${result.neverMentioned} of ${catalog.components.length}`);
|
|
145
|
+
return defects;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
function main() {
|
|
149
|
+
const args = process.argv.slice(2);
|
|
150
|
+
const asJson = args.includes('--json');
|
|
151
|
+
const targets = args.filter((a) => !a.startsWith('--'));
|
|
152
|
+
|
|
153
|
+
if (!fs.existsSync(CATALOG)) {
|
|
154
|
+
console.error(`catalog not found at ${CATALOG} - run \`pnpm run build:a2ui\` first`);
|
|
155
|
+
return 1;
|
|
156
|
+
}
|
|
157
|
+
const catalog = JSON.parse(fs.readFileSync(CATALOG, 'utf8'));
|
|
158
|
+
|
|
159
|
+
// Default to wherever skills actually live on this machine. Account-synced
|
|
160
|
+
// skills are included deliberately: they are the ones that drifted, and the
|
|
161
|
+
// ones no build step here can regenerate.
|
|
162
|
+
const candidates = targets.length ? targets : [
|
|
163
|
+
path.join(HERE, '..', '..', '..', '.claude', 'skills'),
|
|
164
|
+
path.join(process.env.HOME || '', '.claude', 'skills', 'synced'),
|
|
165
|
+
];
|
|
166
|
+
|
|
167
|
+
const skillDirs = [];
|
|
168
|
+
for (const c of candidates) {
|
|
169
|
+
if (!fs.existsSync(c)) continue;
|
|
170
|
+
if (fs.existsSync(path.join(c, 'SKILL.md'))) { skillDirs.push(c); continue; }
|
|
171
|
+
for (const entry of fs.readdirSync(c, { withFileTypes: true })) {
|
|
172
|
+
if (entry.isDirectory() && fs.existsSync(path.join(c, entry.name, 'SKILL.md'))) {
|
|
173
|
+
skillDirs.push(path.join(c, entry.name));
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
if (!skillDirs.length) {
|
|
178
|
+
console.log('no skills found to audit');
|
|
179
|
+
return 0;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
const results = skillDirs.map((d) => auditSkill(d, catalog));
|
|
183
|
+
// Only skills that make catalog claims are interesting either way.
|
|
184
|
+
const claiming = results.filter((r) => r.componentsTaught > 0);
|
|
185
|
+
|
|
186
|
+
if (asJson) {
|
|
187
|
+
console.log(JSON.stringify({ libraryVersion: catalog.libraryVersion, results: claiming }, null, 2));
|
|
188
|
+
} else {
|
|
189
|
+
console.log(`skill fidelity vs @tmorrow/cre8-wc ${catalog.libraryVersion} (${catalog.components.length} components)`);
|
|
190
|
+
if (!claiming.length) console.log('\nno skill makes checkable component API claims');
|
|
191
|
+
for (const r of claiming) report(r, catalog);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
const total = claiming.reduce(
|
|
195
|
+
(sum, r) => sum + r.unknownComponents.length + r.undeclaredProps.length + r.invalidEnums.length,
|
|
196
|
+
0,
|
|
197
|
+
);
|
|
198
|
+
if (total && !asJson) {
|
|
199
|
+
console.log(`\n${total} claim${total === 1 ? '' : 's'} the catalog contradicts.`);
|
|
200
|
+
console.log('Skills are acted on verbatim: an agent writes what they say, and a component that');
|
|
201
|
+
console.log('does not exist fails silently at runtime. Either correct the claims, or move the');
|
|
202
|
+
console.log('API surface out of the skill and let the MCP answer it.');
|
|
203
|
+
}
|
|
204
|
+
return total ? 1 : 0;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
process.exit(main());
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Builds the text embedded for semantic component search (search_components).
|
|
3
|
+
*
|
|
4
|
+
* Component descriptions in the catalog are thin (mean ~70 chars) — not enough
|
|
5
|
+
* on their own to separate "shows a running count" from "confirms a
|
|
6
|
+
* destructive action" in embedding space. This fattens each component's text
|
|
7
|
+
* with its category, prop names/enums/descriptions, and slot descriptions
|
|
8
|
+
* pulled from the knowledge graph, so retrieval has real signal to match on.
|
|
9
|
+
*
|
|
10
|
+
* Shared by generate-embeddings.mjs (which calls the embedding API) and
|
|
11
|
+
* check-layer-parity.mjs (which re-derives this text with NO network call, to
|
|
12
|
+
* detect when committed vectors have gone stale against catalog-kg.json).
|
|
13
|
+
* Both must build byte-identical text for the same component, or the parity
|
|
14
|
+
* check's hash comparison is meaningless — that's why this lives in one file.
|
|
15
|
+
*/
|
|
16
|
+
import { createHash } from 'node:crypto';
|
|
17
|
+
|
|
18
|
+
const clip = (text, max) => {
|
|
19
|
+
if (!text) return '';
|
|
20
|
+
const flat = String(text).replace(/\s+/g, ' ').trim();
|
|
21
|
+
return flat.length > max ? `${flat.slice(0, max - 1)}…` : flat;
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* @param {{nodes: Array<Record<string, unknown>>}} kg - parsed catalog-kg.json
|
|
26
|
+
* @param {Record<string, unknown>} component - a KG node with type 'component'
|
|
27
|
+
* @returns {string}
|
|
28
|
+
*/
|
|
29
|
+
export function buildEmbeddingText(kg, component) {
|
|
30
|
+
const slotNodeById = new Map(
|
|
31
|
+
kg.nodes.filter((n) => n.type === 'slot').map((n) => [n.id, n])
|
|
32
|
+
);
|
|
33
|
+
|
|
34
|
+
const propLines = Object.entries(component.props ?? {}).map(([name, spec]) => {
|
|
35
|
+
const enumPart = spec?.enum ? ` (${spec.enum.join('/')})` : '';
|
|
36
|
+
const descPart = spec?.description ? ` — ${clip(spec.description, 90)}` : '';
|
|
37
|
+
return `${name}${enumPart}${descPart}`;
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
const slotLines = (component.slots ?? []).map((name) => {
|
|
41
|
+
const node = slotNodeById.get(`slot:${component.id}:${name}`);
|
|
42
|
+
const descPart = node?.description ? ` — ${clip(node.description, 90)}` : '';
|
|
43
|
+
return `${name}${descPart}`;
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
const parts = [
|
|
47
|
+
`${component.id} (${component.category ?? 'Uncategorized'})`,
|
|
48
|
+
clip(component.description, 300),
|
|
49
|
+
];
|
|
50
|
+
if (propLines.length) parts.push(`Props: ${propLines.join('; ')}`);
|
|
51
|
+
if (slotLines.length) parts.push(`Slots: ${slotLines.join('; ')}`);
|
|
52
|
+
|
|
53
|
+
return parts.filter(Boolean).join('. ');
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export function textHash(text) {
|
|
57
|
+
return createHash('sha256').update(text, 'utf8').digest('hex');
|
|
58
|
+
}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Generates catalog-embeddings.json — the vectors search_components ranks
|
|
4
|
+
* against for semantic (query-time) search in cre8-mcp.
|
|
5
|
+
*
|
|
6
|
+
* Unlike the other a2ui/generate-*.mjs scripts, this one is NOT free or
|
|
7
|
+
* deterministic-by-recompute: it calls OpenAI's embeddings API and spends
|
|
8
|
+
* real (if tiny) money per changed component. It is therefore deliberately
|
|
9
|
+
* NOT wired into `build:a2ui` or CI — run it by hand, with OPENAI_API_KEY
|
|
10
|
+
* set, whenever catalog-kg.json's component text changes:
|
|
11
|
+
*
|
|
12
|
+
* OPENAI_API_KEY=sk-... node a2ui/generate-embeddings.mjs
|
|
13
|
+
*
|
|
14
|
+
* Incremental: a component whose embedding text is unchanged since the last
|
|
15
|
+
* run (by hash) is reused rather than re-embedded, so editing one
|
|
16
|
+
* description costs one API call, not eighty-eight.
|
|
17
|
+
*
|
|
18
|
+
* check-layer-parity.mjs re-derives the same text hashes with no network
|
|
19
|
+
* call and fails the build if a committed vector has gone stale against
|
|
20
|
+
* catalog-kg.json — but only once this file exists at all. Until the first
|
|
21
|
+
* run, search_components just falls back to lexical matching; there is
|
|
22
|
+
* nothing to go stale.
|
|
23
|
+
*/
|
|
24
|
+
import { readFileSync, writeFileSync, existsSync } from 'node:fs';
|
|
25
|
+
import { fileURLToPath } from 'node:url';
|
|
26
|
+
import { dirname, resolve } from 'node:path';
|
|
27
|
+
import { buildEmbeddingText, textHash } from './embedding-text.mjs';
|
|
28
|
+
|
|
29
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
30
|
+
const kgPath = resolve(__dirname, 'catalog-kg.json');
|
|
31
|
+
const outPath = resolve(__dirname, 'catalog-embeddings.json');
|
|
32
|
+
const pkgPath = resolve(__dirname, '..', 'package.json');
|
|
33
|
+
|
|
34
|
+
export const MODEL = 'text-embedding-3-small';
|
|
35
|
+
// Matryoshka-truncated from the model's native 1536 dims: keeps the committed
|
|
36
|
+
// artifact ~180KB for 88 components instead of ~540KB, at a small recall cost
|
|
37
|
+
// that doesn't matter for an 88-item catalog. OpenAI supports this via the
|
|
38
|
+
// `dimensions` request param on text-embedding-3-* models.
|
|
39
|
+
export const DIMENSIONS = 512;
|
|
40
|
+
const BATCH_SIZE = 50;
|
|
41
|
+
|
|
42
|
+
async function main() {
|
|
43
|
+
if (!existsSync(kgPath)) {
|
|
44
|
+
console.error('catalog-kg.json is missing — run `pnpm build:a2ui:kg` first.');
|
|
45
|
+
process.exit(1);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const kg = JSON.parse(readFileSync(kgPath, 'utf8'));
|
|
49
|
+
const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'));
|
|
50
|
+
const components = kg.nodes.filter((n) => n.type === 'component');
|
|
51
|
+
|
|
52
|
+
if (!components.length) {
|
|
53
|
+
console.error('catalog-kg.json has no component nodes — run `pnpm build:a2ui:kg` first.');
|
|
54
|
+
process.exit(1);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const existing = existsSync(outPath) ? JSON.parse(readFileSync(outPath, 'utf8')) : { vectors: {} };
|
|
58
|
+
|
|
59
|
+
const wanted = components.map((c) => {
|
|
60
|
+
const text = buildEmbeddingText(kg, c);
|
|
61
|
+
return { id: c.id, text, hash: textHash(text) };
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
const reused = [];
|
|
65
|
+
const toEmbed = [];
|
|
66
|
+
for (const w of wanted) {
|
|
67
|
+
const prior = existing.vectors[w.id];
|
|
68
|
+
if (prior && prior.text_hash === w.hash && prior.model === MODEL && prior.dims === DIMENSIONS) {
|
|
69
|
+
reused.push(w.id);
|
|
70
|
+
} else {
|
|
71
|
+
toEmbed.push(w);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
console.log(`${wanted.length} components: ${reused.length} unchanged (reused), ${toEmbed.length} to embed`);
|
|
76
|
+
|
|
77
|
+
const vectors = { ...existing.vectors };
|
|
78
|
+
const wantedIds = new Set(wanted.map((w) => w.id));
|
|
79
|
+
for (const id of Object.keys(vectors)) {
|
|
80
|
+
if (!wantedIds.has(id)) {
|
|
81
|
+
delete vectors[id]; // component removed from the catalog since the last run
|
|
82
|
+
console.log(` dropped stale vector for removed component: ${id}`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
if (toEmbed.length) {
|
|
87
|
+
const apiKey = process.env.OPENAI_API_KEY;
|
|
88
|
+
if (!apiKey) {
|
|
89
|
+
console.error(
|
|
90
|
+
`OPENAI_API_KEY is not set. Cannot embed ${toEmbed.length} component(s).\n` +
|
|
91
|
+
'Set it and re-run: OPENAI_API_KEY=sk-... node a2ui/generate-embeddings.mjs'
|
|
92
|
+
);
|
|
93
|
+
process.exit(1);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
for (let i = 0; i < toEmbed.length; i += BATCH_SIZE) {
|
|
97
|
+
const batch = toEmbed.slice(i, i + BATCH_SIZE);
|
|
98
|
+
console.log(` embedding ${i + 1}-${i + batch.length} of ${toEmbed.length}...`);
|
|
99
|
+
const res = await fetch('https://api.openai.com/v1/embeddings', {
|
|
100
|
+
method: 'POST',
|
|
101
|
+
headers: {
|
|
102
|
+
'Content-Type': 'application/json',
|
|
103
|
+
Authorization: `Bearer ${apiKey}`,
|
|
104
|
+
},
|
|
105
|
+
body: JSON.stringify({
|
|
106
|
+
model: MODEL,
|
|
107
|
+
dimensions: DIMENSIONS,
|
|
108
|
+
input: batch.map((b) => b.text),
|
|
109
|
+
}),
|
|
110
|
+
});
|
|
111
|
+
if (!res.ok) {
|
|
112
|
+
const body = await res.text();
|
|
113
|
+
console.error(`OpenAI embeddings request failed: ${res.status} ${res.statusText}\n${body}`);
|
|
114
|
+
process.exit(1);
|
|
115
|
+
}
|
|
116
|
+
const json = await res.json();
|
|
117
|
+
json.data.forEach((row, idx) => {
|
|
118
|
+
const w = batch[idx];
|
|
119
|
+
vectors[w.id] = {
|
|
120
|
+
text_hash: w.hash,
|
|
121
|
+
model: MODEL,
|
|
122
|
+
dims: DIMENSIONS,
|
|
123
|
+
vector: row.embedding,
|
|
124
|
+
};
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
const sortedVectors = Object.fromEntries(Object.keys(vectors).sort().map((id) => [id, vectors[id]]));
|
|
130
|
+
|
|
131
|
+
writeFileSync(
|
|
132
|
+
outPath,
|
|
133
|
+
JSON.stringify(
|
|
134
|
+
{
|
|
135
|
+
meta: {
|
|
136
|
+
generated_from: ['catalog-kg.json'],
|
|
137
|
+
library: pkg.name,
|
|
138
|
+
library_version: pkg.version,
|
|
139
|
+
model: MODEL,
|
|
140
|
+
dims: DIMENSIONS,
|
|
141
|
+
component_count: wanted.length,
|
|
142
|
+
},
|
|
143
|
+
vectors: sortedVectors,
|
|
144
|
+
},
|
|
145
|
+
null,
|
|
146
|
+
2
|
|
147
|
+
) + '\n'
|
|
148
|
+
);
|
|
149
|
+
|
|
150
|
+
console.log(
|
|
151
|
+
`wrote ${outPath} (${wanted.length} vectors: ${reused.length} reused, ${toEmbed.length} newly embedded)`
|
|
152
|
+
);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// Only run when executed directly (`node generate-embeddings.mjs`) — this
|
|
156
|
+
// module is also imported by check-layer-parity.mjs for MODEL/DIMENSIONS,
|
|
157
|
+
// and that import must not trigger a live embedding run as a side effect.
|
|
158
|
+
const isMain = import.meta.url === `file://${process.argv[1]}`;
|
|
159
|
+
if (isMain) {
|
|
160
|
+
main().catch((err) => {
|
|
161
|
+
console.error(err);
|
|
162
|
+
process.exit(1);
|
|
163
|
+
});
|
|
164
|
+
}
|
package/a2ui/inert-props.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$comment": "Generated by a2ui/render-audit.mjs. Props that are declared in the catalog but never reach the DOM — confirmed twice, by rendering under jsdom and by reading the component source. Setting one validates cleanly and does nothing.",
|
|
3
|
-
"libraryVersion": "2.3.
|
|
3
|
+
"libraryVersion": "2.3.5",
|
|
4
4
|
"components": {
|
|
5
5
|
"cre8-link-list-item": {
|
|
6
6
|
"text": {
|