@birdapi/velinstyle 1.1.0 → 1.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.de.md +89 -161
- package/README.md +187 -119
- package/cli/blueprint.js +98 -5
- package/cli/blueprints/app-chrome.html +18 -0
- package/cli/blueprints/benefits-grid.html +9 -0
- package/cli/blueprints/bottom-nav-mobile.html +2 -1
- package/cli/blueprints/cookie-consent.html +1 -1
- package/cli/blueprints/cta-band.html +6 -0
- package/cli/blueprints/faq-section.html +18 -0
- package/cli/blueprints/filter-bar.html +4 -4
- package/cli/blueprints/form-contact.html +6 -5
- package/cli/blueprints/hero-section.html +3 -3
- package/cli/blueprints/notification-center.html +1 -1
- package/cli/blueprints/onboarding.html +2 -1
- package/cli/blueprints/ops-console.html +29 -0
- package/cli/blueprints/pricing-band.html +37 -0
- package/cli/blueprints/process-steps.html +10 -0
- package/cli/blueprints/services-grid.html +9 -0
- package/cli/blueprints/settings-panel.html +8 -6
- package/cli/blueprints/split-hero.html +25 -0
- package/cli/blueprints/testimonials.html +8 -0
- package/cli/blueprints/trust-bar.html +10 -0
- package/cli/cli-manifest.json +81 -17
- package/cli/contrast-utils.js +97 -0
- package/cli/create.js +370 -0
- package/cli/docgen/extract-attributes.js +128 -10
- package/cli/docgen/extract-cli.js +3 -2
- package/cli/docgen/extract-components.js +61 -2
- package/cli/docgen/extract-utilities.js +10 -10
- package/cli/doctor.js +119 -0
- package/cli/index.js +560 -44
- package/cli/meta.js +84 -1
- package/cli/perf-audit.js +15 -2
- package/cli/prompt-engine.js +243 -0
- package/cli/review.js +268 -0
- package/cli/scaffold.js +119 -4
- package/cli/scanner-rules-data.js +7 -0
- package/cli/scanner.js +357 -4
- package/cli/serve.js +81 -0
- package/cli/skills.js +223 -0
- package/cli/transparency.js +221 -0
- package/cli/wc-api.js +89 -0
- package/cli/workflow.js +42 -0
- package/components/index.js +2 -0
- package/components/runtime/component-loaders.js +2 -0
- package/components/velin-accordion.js +62 -13
- package/components/velin-bottom-nav.js +10 -0
- package/components/velin-calendar.js +212 -0
- package/components/velin-command.js +18 -2
- package/components/velin-data-table.js +78 -1
- package/components/velin-dialog.js +4 -1
- package/components/velin-drawer.js +2 -4
- package/components/velin-file-dropzone.js +162 -0
- package/components/velin-icon.js +22 -1
- package/components/velin-lightbox.js +5 -3
- package/components/velin-modal.js +2 -4
- package/components/velin-search.js +1 -1
- package/components/velin-sheet.js +2 -4
- package/core/a11y/component-contracts.json +20 -3
- package/core/attributes/registry.js +14 -0
- package/core/meta/build.js +125 -5
- package/core/meta/design-constraints/contact.json +9 -0
- package/core/meta/design-constraints/faq.json +9 -0
- package/core/meta/design-constraints/hero.json +13 -0
- package/core/meta/knowledge/components.json +622 -0
- package/core/meta/knowledge/tokens.json +282 -0
- package/core/meta/pages/registry.json +294 -0
- package/core/meta/schema.js +13 -1
- package/core/meta/sections/registry.json +185 -0
- package/core/transparency/attach.js +74 -0
- package/core/transparency/claims.js +97 -0
- package/core/transparency/doctor.js +142 -0
- package/core/transparency/engine.js +75 -0
- package/core/transparency/export.js +98 -0
- package/core/transparency/index.js +30 -0
- package/core/transparency/migrate.js +130 -0
- package/core/transparency/normalize.js +125 -0
- package/core/transparency/policy.js +105 -0
- package/core/transparency/providers.js +235 -0
- package/core/transparency/registry.js +104 -0
- package/core/transparency/renderer.js +111 -0
- package/core/transparency/reporter.js +113 -0
- package/core/transparency/validator.js +112 -0
- package/dist/chunks/attach-H2ZSEAE6.js +365 -0
- package/dist/chunks/{attributes-STYCS3O5.js → attributes-A423NX5J.js} +3 -3
- package/dist/chunks/attributes-DZCXX2RZ.js +404 -0
- package/dist/chunks/{attributes-353XDOAX.js → attributes-F6UPIEVP.js} +1 -1
- package/dist/chunks/{attributes-ADOKLKA7.js → attributes-GLYXGGAL.js} +3 -3
- package/dist/chunks/{attributes-TPANLMLF.js → attributes-UFTYOSAU.js} +3 -3
- package/dist/chunks/attributes-XGLXLR2T.js +391 -0
- package/dist/chunks/attributes-YF4NI2QS.js +391 -0
- package/dist/chunks/browser-AUABBYUK.js +1544 -0
- package/dist/chunks/{chunk-RSMRR27R.js → chunk-2LSKX57P.js} +12 -10
- package/dist/chunks/{chunk-IEHKRARD.js → chunk-2TGCVDUL.js} +11 -9
- package/dist/chunks/{chunk-SRL6EWHP.js → chunk-5JWGUAPC.js} +17 -13
- package/dist/chunks/chunk-7YSO2OQ2.js +113 -0
- package/dist/chunks/{chunk-QVHYL3R4.js → chunk-BHR3ZG6U.js} +6 -6
- package/dist/chunks/chunk-CQMTCEI6.js +113 -0
- package/dist/chunks/{chunk-J472ERN2.js → chunk-JMSIHEYX.js} +15 -4
- package/dist/chunks/{chunk-MKZP2TBH.js → chunk-L7ZGUU4D.js} +2 -2
- package/dist/chunks/chunk-TUGIPKW5.js +113 -0
- package/dist/chunks/{highlight-GJHHV4KM.js → highlight-M2ELQNYK.js} +1 -1
- package/dist/chunks/runtime-entry.js +1 -1
- package/dist/chunks/{velin-accordion-FBIPAEXG.js → velin-accordion-WSY6BMLA.js} +64 -10
- package/dist/chunks/{velin-bottom-nav-7GEMPIM6.js → velin-bottom-nav-5RVRNGIP.js} +25 -0
- package/dist/chunks/{velin-bottom-nav-N3DFQR66.js → velin-bottom-nav-N5F4UO2I.js} +26 -1
- package/dist/chunks/velin-calendar-OFE6THUD.js +210 -0
- package/dist/chunks/velin-calendar-PGVNJTXK.js +217 -0
- package/dist/chunks/velin-calendar-XC7JRDSH.js +217 -0
- package/dist/chunks/{velin-code-block-CIAURDRJ.js → velin-code-block-ZGWG7JI5.js} +1 -1
- package/dist/chunks/{velin-combobox-NXS4QB4R.js → velin-combobox-56V2ZWT5.js} +1 -1
- package/dist/chunks/{velin-command-ONKO2A3J.js → velin-command-2HO2EKR6.js} +29 -2
- package/dist/chunks/{velin-command-TMLSRGIU.js → velin-command-ZJSLPK7B.js} +30 -3
- package/dist/chunks/{velin-copy-NYDBOKXT.js → velin-copy-XDQSV2XU.js} +1 -1
- package/dist/chunks/{velin-countdown-4ZVDGK4R.js → velin-countdown-V4Z5MA63.js} +1 -1
- package/dist/chunks/velin-data-table-UVR42UUM.js +372 -0
- package/dist/chunks/{velin-dialog-GTTZI564.js → velin-dialog-3YK2RPRV.js} +9 -2
- package/dist/chunks/{velin-dialog-ELFOZIXZ.js → velin-dialog-S24KAP4S.js} +3 -1
- package/dist/chunks/{velin-drawer-BE6TYN3H.js → velin-drawer-5PNU624J.js} +2 -4
- package/dist/chunks/{velin-drawer-DLL2GLT6.js → velin-drawer-CCM6S25D.js} +3 -5
- package/dist/chunks/{velin-email-RBX6ZR4S.js → velin-email-TNFONXPW.js} +1 -1
- package/dist/chunks/velin-file-dropzone-QRGF2JNA.js +154 -0
- package/dist/chunks/velin-file-dropzone-XIZMJ3NB.js +154 -0
- package/dist/chunks/{velin-icon-7M76DOPB.js → velin-icon-A6NCXGUK.js} +59 -17
- package/dist/chunks/{velin-icon-ZTSKUOVN.js → velin-icon-EC4B5XCM.js} +18 -5
- package/dist/chunks/{velin-lightbox-6E7CAATP.js → velin-lightbox-FFK4TUUP.js} +7 -6
- package/dist/chunks/{velin-lightbox-NXA3U2FM.js → velin-lightbox-P725FLTY.js} +5 -4
- package/dist/chunks/{velin-menubar-J66JXRWW.js → velin-menubar-6I2LM5HL.js} +1 -1
- package/dist/chunks/{velin-modal-5HYNNNUI.js → velin-modal-ICTMGRSU.js} +7 -8
- package/dist/chunks/{velin-modal-AEOTZ67O.js → velin-modal-JBNODH7D.js} +2 -4
- package/dist/chunks/{velin-popover-T72HK3DF.js → velin-popover-WZG2GHBL.js} +25 -4
- package/dist/chunks/{velin-rating-N4DI2XNL.js → velin-rating-QBBYRRBU.js} +1 -1
- package/dist/chunks/{velin-search-7B4KJ6TX.js → velin-search-B3L6J2RP.js} +2 -2
- package/dist/chunks/{velin-search-2XRQFBCS.js → velin-search-L3UG6NDQ.js} +5 -4
- package/dist/chunks/{velin-secure-field-6PV7RZDJ.js → velin-secure-field-DGYMP7OK.js} +1 -1
- package/dist/chunks/{velin-segmented-control-GYD5BIXQ.js → velin-segmented-control-P74GJPAR.js} +1 -1
- package/dist/chunks/{velin-sheet-R2Y67X6H.js → velin-sheet-M5GZZD7G.js} +2 -4
- package/dist/chunks/{velin-sheet-OUK6572T.js → velin-sheet-X7RXIWKV.js} +3 -5
- package/dist/chunks/{velin-stepper-X54WGHDG.js → velin-stepper-4YQJUHPC.js} +12 -5
- package/dist/chunks/{velin-toast-OMMOA2DK.js → velin-toast-UG5LWTG2.js} +5 -1
- package/dist/chunks/{velin-tooltip-BDHGRTQB.js → velin-tooltip-ZDH5SDLU.js} +1 -1
- package/dist/llms.txt +31 -8
- package/dist/search-index.json +182 -10
- package/dist/velin-agent.json +3980 -31
- package/dist/velinstyle-components.iife.js +1622 -286
- package/dist/velinstyle-components.js +1624 -286
- package/dist/velinstyle-components.min.js +262 -114
- package/dist/velinstyle.css +412 -67
- package/dist/velinstyle.d.ts +2 -0
- package/dist/velinstyle.min.css +1 -1
- package/package.json +21 -6
- package/packages/skill-engine/README.md +24 -0
- package/packages/skill-engine/package.json +7 -0
- package/packages/skill-engine/src/catalog.js +29 -0
- package/packages/skill-engine/src/index.js +5 -0
- package/packages/skill-engine/src/install.js +69 -0
- package/packages/skill-engine/src/registry.js +27 -0
- package/packages/skill-engine/src/resolve.js +68 -0
- package/packages/skill-engine/src/validate.js +40 -0
- package/packages/velinstyle-skills/README.md +6 -0
- package/packages/velinstyle-skills/adapter.json +8 -0
- package/packages/velinstyle-skills/bundles/landing-starter.bundle.yaml +12 -0
- package/packages/velinstyle-skills/bundles/review-suite.bundle.yaml +11 -0
- package/packages/velinstyle-skills/catalog.json +1004 -0
- package/packages/velinstyle-skills/graphs/component-ship.graph.yaml +14 -0
- package/packages/velinstyle-skills/graphs/landingpage.graph.yaml +21 -0
- package/packages/velinstyle-skills/graphs/release-gate.graph.yaml +15 -0
- package/packages/velinstyle-skills/index.js +22 -0
- package/packages/velinstyle-skills/package.json +7 -0
- package/packages/velinstyle-skills/packs/accessibility.pack.yaml +9 -0
- package/packages/velinstyle-skills/packs/design.pack.yaml +10 -0
- package/packages/velinstyle-skills/packs/documentation.pack.yaml +8 -0
- package/packages/velinstyle-skills/packs/enterprise.pack.yaml +10 -0
- package/packages/velinstyle-skills/packs/frontend.pack.yaml +10 -0
- package/packages/velinstyle-skills/packs/review.pack.yaml +9 -0
- package/packages/velinstyle-skills/projects/admin-panel.project.yaml +12 -0
- package/packages/velinstyle-skills/projects/blog.project.yaml +11 -0
- package/packages/velinstyle-skills/projects/documentation-portal.project.yaml +13 -0
- package/packages/velinstyle-skills/projects/ecommerce-shop.project.yaml +12 -0
- package/packages/velinstyle-skills/projects/landing-page.project.yaml +12 -0
- package/packages/velinstyle-skills/projects/laravel-dashboard.project.yaml +12 -0
- package/packages/velinstyle-skills/projects/marketing-website.project.yaml +14 -0
- package/packages/velinstyle-skills/projects/portfolio.project.yaml +12 -0
- package/packages/velinstyle-skills/registry.json +142 -0
- package/packages/velinstyle-skills/scripts/generate-assets.mjs +163 -0
- package/packages/velinstyle-skills/skills/velin-a11y-focus-keyboard/SKILL.md +57 -0
- package/packages/velinstyle-skills/skills/velin-a11y-page-checklist/SKILL.md +57 -0
- package/packages/velinstyle-skills/skills/velin-a11y-scan-fix/SKILL.md +57 -0
- package/packages/velinstyle-skills/skills/velin-ai-agent-briefing/SKILL.md +57 -0
- package/packages/velinstyle-skills/skills/velin-ai-plan-scaffold-review/SKILL.md +57 -0
- package/packages/velinstyle-skills/skills/velin-ai-skill-authoring/SKILL.md +57 -0
- package/packages/velinstyle-skills/skills/velin-components-accessibility-map/SKILL.md +57 -0
- package/packages/velinstyle-skills/skills/velin-components-api-contract/SKILL.md +57 -0
- package/packages/velinstyle-skills/skills/velin-components-recipe/SKILL.md +57 -0
- package/packages/velinstyle-skills/skills/velin-components-select-compose/SKILL.md +57 -0
- package/packages/velinstyle-skills/skills/velin-design-hero-compose/SKILL.md +57 -0
- package/packages/velinstyle-skills/skills/velin-design-section-rhythm/SKILL.md +57 -0
- package/packages/velinstyle-skills/skills/velin-design-surface-roles/SKILL.md +57 -0
- package/packages/velinstyle-skills/skills/velin-dev-component-wire/SKILL.md +57 -0
- package/packages/velinstyle-skills/skills/velin-dev-page-scaffold/SKILL.md +57 -0
- package/packages/velinstyle-skills/skills/velin-dev-plan-first/SKILL.md +57 -0
- package/packages/velinstyle-skills/skills/velin-docs-component-guide/SKILL.md +57 -0
- package/packages/velinstyle-skills/skills/velin-docs-generate-api/SKILL.md +57 -0
- package/packages/velinstyle-skills/skills/velin-dx-doctor-setup/SKILL.md +57 -0
- package/packages/velinstyle-skills/skills/velin-dx-project-init/SKILL.md +57 -0
- package/packages/velinstyle-skills/skills/velin-migration-legacy-wc/SKILL.md +57 -0
- package/packages/velinstyle-skills/skills/velin-migration-prefix-classes/SKILL.md +57 -0
- package/packages/velinstyle-skills/skills/velin-motion-reduced-safe/SKILL.md +57 -0
- package/packages/velinstyle-skills/skills/velin-motion-reveal-feedback/SKILL.md +57 -0
- package/packages/velinstyle-skills/skills/velin-perf-audit-fix/SKILL.md +57 -0
- package/packages/velinstyle-skills/skills/velin-perf-runtime-tree-shake/SKILL.md +57 -0
- package/packages/velinstyle-skills/skills/velin-release-changelog-sync/SKILL.md +57 -0
- package/packages/velinstyle-skills/skills/velin-release-meta-rebuild/SKILL.md +57 -0
- package/packages/velinstyle-skills/skills/velin-review-conversion-hero/SKILL.md +57 -0
- package/packages/velinstyle-skills/skills/velin-review-page-gate/SKILL.md +57 -0
- package/packages/velinstyle-skills/skills/velin-review-seo-meta/SKILL.md +57 -0
- package/packages/velinstyle-skills/skills/velin-security-sanitize-html/SKILL.md +57 -0
- package/packages/velinstyle-skills/skills/velin-security-scan-pii/SKILL.md +57 -0
- package/packages/velinstyle-skills/skills/velin-testing-a11y-suite/SKILL.md +57 -0
- package/packages/velinstyle-skills/skills/velin-testing-visual-smoke/SKILL.md +57 -0
- package/packages/velinstyle-skills/skills/velin-themes-apply-token/SKILL.md +57 -0
- package/packages/velinstyle-skills/skills/velin-themes-contrast-check/SKILL.md +57 -0
- package/packages/velinstyle-skills/skills/velin-utilities-layout-apply/SKILL.md +57 -0
- package/packages/velinstyle-skills/skills/velin-utilities-prefix-fix/SKILL.md +57 -0
- package/packages/velinstyle-skills/skills/velin-utilities-token-map/SKILL.md +57 -0
- package/packages/velinstyle-skills/templates/admin-panel.template.yaml +12 -0
- package/packages/velinstyle-skills/templates/blog.template.yaml +12 -0
- package/packages/velinstyle-skills/templates/documentation-portal.template.yaml +12 -0
- package/packages/velinstyle-skills/templates/ecommerce-shop.template.yaml +13 -0
- package/packages/velinstyle-skills/templates/landing-page.template.yaml +12 -0
- package/packages/velinstyle-skills/templates/laravel-dashboard.template.yaml +11 -0
- package/packages/velinstyle-skills/templates/marketing-website.template.yaml +13 -0
- package/packages/velinstyle-skills/templates/portfolio.template.yaml +12 -0
- package/schemas/component-knowledge.schema.json +33 -0
- package/schemas/design-constraint.schema.json +15 -0
- package/schemas/design-intelligence.schema.json +19 -0
- package/schemas/design-rule.schema.json +19 -0
- package/schemas/page-template.schema.json +24 -0
- package/schemas/review-report.schema.json +36 -0
- package/schemas/section.schema.json +22 -0
- package/schemas/skill-bundle.schema.json +15 -0
- package/schemas/skill-graph.schema.json +25 -0
- package/schemas/skill-pack.schema.json +14 -0
- package/schemas/skill-project.schema.json +16 -0
- package/schemas/skill-record.schema.json +27 -0
- package/schemas/skill-registry.schema.json +17 -0
- package/schemas/skill-template.schema.json +17 -0
- package/schemas/token-graph.schema.json +27 -0
- package/schemas/utility.schema.json +166 -0
- package/src/components/alert.css +22 -1
- package/src/components/calendar-dropzone.css +5 -0
- package/src/components/transparency.css +138 -0
- package/src/layout/app-shell.css +33 -0
- package/src/tokens/shadow.css +13 -0
- package/src/utilities/border.css +2 -0
- package/src/utilities/display.css +1 -24
- package/src/utilities/responsive.css +16 -1
- package/src/utilities/spacing.css +32 -0
- package/src/velinstyle.css +3 -0
- package/dist/chunks/attributes-3BZLI7XF.js +0 -364
- package/dist/chunks/attributes-4N5JP4CG.js +0 -364
- package/dist/chunks/attributes-5Q2WXGRC.js +0 -374
- package/dist/chunks/attributes-AIR7SVLK.js +0 -364
- package/dist/chunks/attributes-BGRN5XZO.js +0 -364
- package/dist/chunks/attributes-BVSQAYLR.js +0 -364
- package/dist/chunks/attributes-CDYFUY7Y.js +0 -364
- package/dist/chunks/attributes-JMYJZBPE.js +0 -364
- package/dist/chunks/attributes-R5JY3X4O.js +0 -374
- package/dist/chunks/attributes-TNSPQTHX.js +0 -374
- package/dist/chunks/chunk-2354NEBP.js +0 -109
- package/dist/chunks/chunk-2VNA7G7S.js +0 -109
- package/dist/chunks/chunk-AQLRJSGG.js +0 -109
- package/dist/chunks/chunk-EWPSDMQT.js +0 -109
- package/dist/chunks/chunk-LA7264K4.js +0 -85
- package/dist/chunks/chunk-QTJJ3DPO.js +0 -109
- package/dist/chunks/chunk-RZQVWFHW.js +0 -109
- package/dist/chunks/chunk-U4XHMZ7D.js +0 -109
- package/dist/chunks/chunk-V5YIUA6G.js +0 -109
- package/dist/chunks/chunk-XIET2VSZ.js +0 -109
- package/dist/chunks/chunk-XYLJ2GCB.js +0 -205
- package/dist/chunks/chunk-ZPSPKUYD.js +0 -109
- package/dist/chunks/highlight-XTHRKBA3.js +0 -37
- package/dist/chunks/velin-bottom-nav-2N2TYWOF.js +0 -86
- package/dist/chunks/velin-carousel-Y5VCOABZ.js +0 -213
- package/dist/chunks/velin-code-block-ASUBTAQV.js +0 -119
- package/dist/chunks/velin-code-block-TSUKPY4C.js +0 -123
- package/dist/chunks/velin-code-block-Y6CM726Q.js +0 -119
- package/dist/chunks/velin-combobox-2KDTCQ7N.js +0 -155
- package/dist/chunks/velin-command-M7RNHUPR.js +0 -136
- package/dist/chunks/velin-copy-T5KDTDXP.js +0 -81
- package/dist/chunks/velin-countdown-5XSTN3BH.js +0 -101
- package/dist/chunks/velin-counter-ISCTEAHI.js +0 -118
- package/dist/chunks/velin-dialog-D2GUHSCD.js +0 -144
- package/dist/chunks/velin-dialog-IJLFDXAJ.js +0 -144
- package/dist/chunks/velin-dialog-TNS3WXMB.js +0 -144
- package/dist/chunks/velin-drawer-MJS6WCF7.js +0 -130
- package/dist/chunks/velin-email-N5B5ZYTE.js +0 -90
- package/dist/chunks/velin-icon-KZO3IEHG.js +0 -164
- package/dist/chunks/velin-lightbox-I75U6JF4.js +0 -140
- package/dist/chunks/velin-lightbox-QOTB4PRL.js +0 -140
- package/dist/chunks/velin-lightbox-UCD6N7HF.js +0 -140
- package/dist/chunks/velin-live-dot-XHUZCIDZ.js +0 -67
- package/dist/chunks/velin-menubar-SFEXJE56.js +0 -86
- package/dist/chunks/velin-modal-2HOBXE6F.js +0 -176
- package/dist/chunks/velin-modal-GLI2XZZB.js +0 -176
- package/dist/chunks/velin-popover-EXINRIGJ.js +0 -145
- package/dist/chunks/velin-popover-OXX7MRZ6.js +0 -145
- package/dist/chunks/velin-popover-YKCCROJG.js +0 -145
- package/dist/chunks/velin-rating-XRQJV4LO.js +0 -91
- package/dist/chunks/velin-scroll-top-F2FCZNYD.js +0 -58
- package/dist/chunks/velin-search-4YHJWYSS.js +0 -556
- package/dist/chunks/velin-search-LWHY23Q5.js +0 -474
- package/dist/chunks/velin-secure-field-H7FSBUJW.js +0 -95
- package/dist/chunks/velin-segmented-control-PQX6LKOJ.js +0 -109
- package/dist/chunks/velin-sheet-3OGI4HD7.js +0 -119
- package/dist/chunks/velin-sparkline-GVEANJVW.js +0 -184
- package/dist/chunks/velin-sparkline-KDA3GQAN.js +0 -162
- package/dist/chunks/velin-stepper-2ZIHLKGM.js +0 -141
- package/dist/chunks/velin-stepper-FYEUEWE6.js +0 -141
- package/dist/chunks/velin-stepper-wc-QU3KRVQR.js +0 -133
- package/dist/chunks/velin-theme-toggle-BNNS7WLV.js +0 -285
- package/dist/chunks/velin-theme-toggle-NO7V4TWI.js +0 -285
- package/dist/chunks/velin-theme-toggle-QELCJM2Q.js +0 -291
- package/dist/chunks/velin-toast-RCZ4CSUC.js +0 -109
- package/dist/chunks/velin-toast-WEUBTJG6.js +0 -109
- package/dist/chunks/velin-tooltip-664IOHZA.js +0 -112
- package/dist/chunks/velin-tooltip-wc-LXDVT6DE.js +0 -103
- package/dist/chunks/worker-client-R6DBYPFT.js +0 -46
package/cli/index.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
import { existsSync, readFileSync, writeFileSync, mkdirSync, readdirSync, unlinkSync, rmSync, statSync } from 'fs';
|
|
4
4
|
import { join, resolve, basename, dirname } from 'path';
|
|
5
5
|
import { execSync } from 'child_process';
|
|
6
|
-
import { fileURLToPath } from 'url';
|
|
6
|
+
import { fileURLToPath, pathToFileURL } from 'url';
|
|
7
7
|
import { listProviders, getProviderUrl, PROVIDERS } from './icon-providers.js';
|
|
8
8
|
|
|
9
9
|
const __dirname = fileURLToPath(new URL('.', import.meta.url));
|
|
@@ -33,7 +33,7 @@ const LAYER_FILES = {
|
|
|
33
33
|
security: ['a11y/security.css'],
|
|
34
34
|
layout: [
|
|
35
35
|
'layout/breakpoints.css', 'layout/container.css', 'layout/grid.css',
|
|
36
|
-
'layout/flex.css', 'layout/patterns.css',
|
|
36
|
+
'layout/flex.css', 'layout/patterns.css', 'layout/app-shell.css',
|
|
37
37
|
],
|
|
38
38
|
components: [
|
|
39
39
|
'components/button.css', 'components/card.css', 'components/input.css',
|
|
@@ -44,6 +44,8 @@ const LAYER_FILES = {
|
|
|
44
44
|
'components/switch.css', 'components/divider.css', 'components/chip.css',
|
|
45
45
|
'components/timeline.css', 'components/stepper.css', 'components/stat.css',
|
|
46
46
|
'components/drawer.css', 'components/input-group.css', 'components/form-validation.css', 'components/collapse.css',
|
|
47
|
+
'components/calendar-dropzone.css',
|
|
48
|
+
'components/transparency.css',
|
|
47
49
|
],
|
|
48
50
|
utilities: [
|
|
49
51
|
'utilities/color.css', 'utilities/spacing.css', 'utilities/display.css',
|
|
@@ -93,10 +95,19 @@ function help() {
|
|
|
93
95
|
velinstyle themes List available themes
|
|
94
96
|
velinstyle add <name> Add a single component CSS
|
|
95
97
|
velinstyle icons <subcommand> Manage icon providers
|
|
96
|
-
velinstyle scan [path]
|
|
98
|
+
velinstyle scan [path|file] Security & accessibility scanner (dir or .html/.css/.js)
|
|
97
99
|
velinstyle prefix [path] Add missing velin- prefix (dry-run; use --write)
|
|
98
100
|
velinstyle blueprint [name] Print HTML blueprint (run: velinstyle blueprint list)
|
|
99
|
-
velinstyle
|
|
101
|
+
velinstyle blueprint <name> --strict Fail if emitted classes ∉ CSS
|
|
102
|
+
velinstyle create <kind> [dir] Scaffold: landing|dashboard|docs|auth
|
|
103
|
+
velinstyle serve [dir] Static preview server (default port 4173)
|
|
104
|
+
velinstyle doctor Check dist, icons, config, Windows ESM paths
|
|
105
|
+
velinstyle transparency <sub> Transparency Framework: doctor|validate|report|export|migrate
|
|
106
|
+
velinstyle check [path] doctor + blueprint --strict + scan + review + transparency
|
|
107
|
+
velinstyle scaffold "<prompt>" Plan-first page HTML or recipe fragment
|
|
108
|
+
velinstyle plan "<prompt>" Emit page plan JSON (no HTML)
|
|
109
|
+
velinstyle review [file|html] Design / a11y / SEO / conversion review gate
|
|
110
|
+
velinstyle wc api <tag> Human-readable Web Component API from source
|
|
100
111
|
velinstyle layout <sub> Responsive layout audit and fixes
|
|
101
112
|
velinstyle perf <sub> Performance audit (images, scripts) with --fix
|
|
102
113
|
velinstyle tokens build Generate CSS variables from tokens.json
|
|
@@ -104,6 +115,8 @@ function help() {
|
|
|
104
115
|
velinstyle docs generate Auto-generate Markdown API reference
|
|
105
116
|
velinstyle meta Build agent context (velin-agent.json, llms.txt)
|
|
106
117
|
velinstyle search index Build JSON search index for VelinSearch
|
|
118
|
+
velinstyle skills <subcommand> Registry-first AI skills commands
|
|
119
|
+
velinstyle workflow <id> Resolve workflow graph / project workflow
|
|
107
120
|
|
|
108
121
|
${C.bold('Icons subcommands:')}
|
|
109
122
|
icons list Show available icon providers
|
|
@@ -117,23 +130,45 @@ function help() {
|
|
|
117
130
|
velinstyle icons build
|
|
118
131
|
|
|
119
132
|
${C.bold('Blueprint:')}
|
|
120
|
-
velinstyle blueprint list
|
|
121
|
-
velinstyle blueprint <name> [--output, -o <file>]
|
|
122
|
-
|
|
123
|
-
${C.bold('
|
|
124
|
-
velinstyle
|
|
125
|
-
velinstyle
|
|
133
|
+
velinstyle blueprint list [--strict] Print ids (strict validates all)
|
|
134
|
+
velinstyle blueprint <name> [--output, -o <file>] [--strict]
|
|
135
|
+
|
|
136
|
+
${C.bold('Create / serve / doctor / check:')}
|
|
137
|
+
velinstyle create landing|dashboard|docs|auth [dir] [--theme earth] [--no-copy]
|
|
138
|
+
velinstyle serve [dir] [--port 4173]
|
|
139
|
+
velinstyle doctor
|
|
140
|
+
velinstyle check [path] [--json|--sarif] [--profile marketing|app|docs|fragment|ecommerce]
|
|
141
|
+
Alias: validate → check · documentation → docs generate help
|
|
142
|
+
|
|
143
|
+
${C.bold('Web Components:')}
|
|
144
|
+
velinstyle wc api <tag> e.g. velinstyle wc api velin-toast
|
|
145
|
+
|
|
146
|
+
${C.bold('Scaffold (1.2.0):')}
|
|
147
|
+
velinstyle scaffold "<prompt>" Plan → render → review for pages; recipes for fragments
|
|
148
|
+
velinstyle scaffold list-intents Show recipe intent keywords
|
|
126
149
|
velinstyle scaffold "<prompt>" -o out.html [--json]
|
|
127
150
|
|
|
151
|
+
${C.bold('Plan / Review (1.2.x):')}
|
|
152
|
+
velinstyle plan "<prompt>" [--json] [-o plan.json]
|
|
153
|
+
velinstyle review <file.html> [--json] [--prompt "..."]
|
|
154
|
+
|
|
155
|
+
${C.bold('Transparency (1.2.1):')}
|
|
156
|
+
velinstyle transparency doctor [path|file] [--policy file] [--json]
|
|
157
|
+
velinstyle transparency validate [path|file] [--policy file] [--json]
|
|
158
|
+
velinstyle transparency report [path|file] [--out dir] [--policy file]
|
|
159
|
+
velinstyle transparency export [path|file] [--format json|json-ld|csv|html] [-o file]
|
|
160
|
+
velinstyle transparency migrate [path|file] [--apply] [--write] [--policy file]
|
|
161
|
+
Alias: transparency scan → doctor
|
|
162
|
+
|
|
128
163
|
${C.bold('Layout (0.8.0):')}
|
|
129
164
|
velinstyle layout audit [path] Report flex/grid/responsive issues
|
|
130
165
|
velinstyle layout suggest [path] Audit with fix suggestions
|
|
131
166
|
velinstyle layout fix [path] Apply safe fixes (--dry-run default, --write)
|
|
132
167
|
|
|
133
168
|
${C.bold('Performance (0.9.0):')}
|
|
134
|
-
velinstyle perf audit [path]
|
|
135
|
-
velinstyle perf suggest [path]
|
|
136
|
-
velinstyle perf fix [path]
|
|
169
|
+
velinstyle perf audit [path|file] Report CLS, lazy-load, script defer issues
|
|
170
|
+
velinstyle perf suggest [path|file] Same as audit with fix hints
|
|
171
|
+
velinstyle perf fix [path|file] Apply safe fixes (--write)
|
|
137
172
|
|
|
138
173
|
${C.bold('Tokens:')}
|
|
139
174
|
velinstyle tokens build [--input <path>] [--output, -o <file>]
|
|
@@ -142,17 +177,28 @@ function help() {
|
|
|
142
177
|
${C.bold('Docs (0.9.0):')}
|
|
143
178
|
velinstyle docs generate [--scope all|components|tokens|utilities|cli|rules|a11y|meta] [--out docs/generated]
|
|
144
179
|
velinstyle meta [--out dist/velin-agent.json] [--llms-out dist/llms.txt] [--base-url URL]
|
|
145
|
-
velinstyle meta page <file.html> [--write]
|
|
180
|
+
velinstyle meta page <file.html> [--write] Merge curated meta (goals/intent) on --write
|
|
146
181
|
|
|
147
182
|
${C.bold('Search:')}
|
|
148
183
|
velinstyle search index [--out dist/search-index.json] [--extra-html dir1,dir2]
|
|
149
184
|
|
|
185
|
+
${C.bold('Skills:')}
|
|
186
|
+
velinstyle skills list [--capability review] [--status beta] [--json]
|
|
187
|
+
velinstyle skills show <skill-id> [--human]
|
|
188
|
+
velinstyle skills install <skill-id|pack|bundle:id|project:id> [--target .cursor/skills]
|
|
189
|
+
velinstyle skills run <skill-id> [--json]
|
|
190
|
+
velinstyle skills validate
|
|
191
|
+
velinstyle skills packs|bundles|templates|projects|graphs
|
|
192
|
+
|
|
193
|
+
${C.bold('Workflow:')}
|
|
194
|
+
velinstyle workflow <graph-id|project:id> [--json]
|
|
195
|
+
|
|
150
196
|
${C.bold('Scan options:')}
|
|
151
197
|
--fix Auto-fix safe issues (writes files)
|
|
152
198
|
--fix-dry-run Show files that would be auto-fixed; no write
|
|
153
199
|
--fix-lang <code> Default lang for a11y/html-lang fix (default: de)
|
|
154
200
|
--severity <level> Minimum severity: error, warning, info
|
|
155
|
-
--only <category> Filter: security, pii, a11y, css, perf
|
|
201
|
+
--only <category> Filter: security, pii, a11y, css, wc, perf
|
|
156
202
|
|
|
157
203
|
${C.bold('Prefix options (velinstyle prefix):')}
|
|
158
204
|
--write Write files (default is dry-run)
|
|
@@ -166,6 +212,7 @@ function help() {
|
|
|
166
212
|
${C.bold('Build options:')}
|
|
167
213
|
--output, -o <path> Output file path (default: ./velinstyle-custom.css)
|
|
168
214
|
--minify Minify output
|
|
215
|
+
--preset lite Marketing subset layers (tokens+reset+base+layout+components+utilities)
|
|
169
216
|
|
|
170
217
|
${C.bold('General:')}
|
|
171
218
|
--help, -h Show this help
|
|
@@ -178,36 +225,86 @@ function init() {
|
|
|
178
225
|
const configPath = resolve('velinstyle.config.js');
|
|
179
226
|
if (existsSync(configPath)) {
|
|
180
227
|
console.log('velinstyle.config.js already exists.');
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
const config = `// VelinStyle Configuration
|
|
228
|
+
} else {
|
|
229
|
+
const config = `// VelinStyle Configuration
|
|
185
230
|
export default {
|
|
231
|
+
// Marketing lite: layers: ['tokens','reset','base','layout','components','utilities'] + theme
|
|
232
|
+
// See docs/guides/marketing-lite-css.html
|
|
186
233
|
layers: [
|
|
187
|
-
'tokens',
|
|
188
|
-
'reset',
|
|
189
|
-
'base',
|
|
190
|
-
'a11y',
|
|
191
|
-
'layout',
|
|
192
|
-
'components',
|
|
193
|
-
'utilities',
|
|
194
|
-
'helpers',
|
|
234
|
+
'tokens',
|
|
235
|
+
'reset',
|
|
236
|
+
'base',
|
|
237
|
+
'a11y',
|
|
238
|
+
'layout',
|
|
239
|
+
'components',
|
|
240
|
+
'utilities',
|
|
241
|
+
'helpers',
|
|
195
242
|
],
|
|
196
|
-
theme: null, // e.g. '
|
|
243
|
+
theme: null, // e.g. 'earth', 'nordic', 'ocean'
|
|
197
244
|
output: './velinstyle-custom.css',
|
|
198
245
|
minify: true,
|
|
199
246
|
scan: {
|
|
200
|
-
enabled: false,
|
|
247
|
+
enabled: false,
|
|
201
248
|
severity: 'warning',
|
|
202
249
|
fix: false,
|
|
203
250
|
ignore: ['node_modules', 'dist', '.git'],
|
|
204
251
|
},
|
|
205
252
|
};
|
|
206
253
|
`;
|
|
254
|
+
writeFileSync(configPath, config);
|
|
255
|
+
console.log(C.green('Created velinstyle.config.js'));
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
const vendorDir = resolve('vendor', 'velinstyle');
|
|
259
|
+
const distCss = join(PKG_ROOT, 'dist', 'velinstyle.min.css');
|
|
260
|
+
if (existsSync(distCss)) {
|
|
261
|
+
mkdirSync(vendorDir, { recursive: true });
|
|
262
|
+
for (const f of ['velinstyle.min.css', 'velinstyle-components.min.js', 'velin-icons.svg']) {
|
|
263
|
+
const src = join(PKG_ROOT, 'dist', f);
|
|
264
|
+
if (existsSync(src)) writeFileSync(join(vendorDir, f), readFileSync(src));
|
|
265
|
+
}
|
|
266
|
+
const themesSrc = join(PKG_ROOT, 'dist', 'themes');
|
|
267
|
+
if (existsSync(themesSrc)) {
|
|
268
|
+
mkdirSync(join(vendorDir, 'themes'), { recursive: true });
|
|
269
|
+
for (const name of readdirSync(themesSrc)) {
|
|
270
|
+
const src = join(themesSrc, name);
|
|
271
|
+
if (statSync(src).isFile()) writeFileSync(join(vendorDir, 'themes', name), readFileSync(src));
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
console.log(C.green(`Copied dist assets → ${vendorDir}`));
|
|
275
|
+
} else {
|
|
276
|
+
console.log(C.yellow('Framework dist/ not found — skip vendor copy. Build the framework or copy dist manually into vendor/velinstyle.'));
|
|
277
|
+
}
|
|
207
278
|
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
279
|
+
const starter = resolve('index.velin-starter.html');
|
|
280
|
+
if (!existsSync(starter) && !existsSync(resolve('index.html'))) {
|
|
281
|
+
writeFileSync(
|
|
282
|
+
starter,
|
|
283
|
+
`<!DOCTYPE html>
|
|
284
|
+
<html lang="en" data-velin-reveal-auto>
|
|
285
|
+
<head>
|
|
286
|
+
<meta charset="UTF-8">
|
|
287
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
288
|
+
<meta name="velin-icon-sprite" content="vendor/velinstyle/velin-icons.svg">
|
|
289
|
+
<title>VelinStyle starter</title>
|
|
290
|
+
<link rel="stylesheet" href="vendor/velinstyle/velinstyle.min.css">
|
|
291
|
+
</head>
|
|
292
|
+
<body>
|
|
293
|
+
<a class="velin-skip-link" href="#main">Skip to main</a>
|
|
294
|
+
<main id="main" class="velin-container velin-py-8">
|
|
295
|
+
<h1 class="velin-text-3xl velin-font-bold">VelinStyle starter</h1>
|
|
296
|
+
<p class="velin-text-muted">Run <code>velinstyle serve</code> or <code>velinstyle create landing</code>.</p>
|
|
297
|
+
</main>
|
|
298
|
+
<script type="module" src="vendor/velinstyle/velinstyle-components.min.js"></script>
|
|
299
|
+
</body>
|
|
300
|
+
</html>
|
|
301
|
+
`,
|
|
302
|
+
'utf-8',
|
|
303
|
+
);
|
|
304
|
+
console.log(C.green('Created index.velin-starter.html'));
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
console.log('Next: velinstyle build · velinstyle serve · velinstyle doctor');
|
|
211
308
|
}
|
|
212
309
|
|
|
213
310
|
// ── Build ────────────────────────────────────────────────────────────────────
|
|
@@ -217,12 +314,18 @@ async function build() {
|
|
|
217
314
|
let config;
|
|
218
315
|
|
|
219
316
|
if (existsSync(configPath)) {
|
|
220
|
-
config = (await import(configPath)).default;
|
|
317
|
+
config = (await import(pathToFileURL(configPath).href)).default;
|
|
221
318
|
} else {
|
|
222
319
|
config = { layers: LAYERS, theme: null, output: './velinstyle-custom.css', minify: true };
|
|
223
320
|
}
|
|
224
321
|
|
|
225
|
-
const
|
|
322
|
+
const LITE_LAYERS = ['tokens', 'reset', 'base', 'layout', 'components', 'utilities'];
|
|
323
|
+
const preset = getArg('--preset') || config.preset;
|
|
324
|
+
if (preset === 'lite') {
|
|
325
|
+
config = { ...config, layers: LITE_LAYERS };
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
const output = getArg('--output', '-o') || getArg('--out') || config.output || './velinstyle-custom.css';
|
|
226
329
|
const minify = hasFlag('--minify') || config.minify;
|
|
227
330
|
const selectedLayers = config.layers || LAYERS;
|
|
228
331
|
|
|
@@ -254,19 +357,42 @@ async function build() {
|
|
|
254
357
|
const tmpPath = resolve('.velinstyle-tmp.css');
|
|
255
358
|
writeFileSync(tmpPath, css);
|
|
256
359
|
|
|
360
|
+
const outAbs = resolve(output);
|
|
361
|
+
let bundled = false;
|
|
257
362
|
try {
|
|
363
|
+
const binName = process.platform === 'win32' ? 'lightningcss.cmd' : 'lightningcss';
|
|
364
|
+
const localBin = join(PKG_ROOT, 'node_modules', '.bin', binName);
|
|
365
|
+
const cli = existsSync(localBin) ? `"${localBin}"` : 'npx lightningcss';
|
|
258
366
|
const minifyFlag = minify ? '--minify' : '';
|
|
259
|
-
execSync(
|
|
367
|
+
execSync(`${cli} --bundle ${minifyFlag} "${tmpPath}" -o "${outAbs}"`, {
|
|
260
368
|
stdio: 'inherit',
|
|
369
|
+
cwd: PKG_ROOT,
|
|
370
|
+
shell: true,
|
|
261
371
|
});
|
|
372
|
+
bundled = true;
|
|
262
373
|
console.log(C.green(`Built: ${output}`) + ` (layers: ${selectedLayers.join(', ')}${config.theme ? ', theme: ' + config.theme : ''})`);
|
|
263
374
|
} catch {
|
|
264
|
-
writeFileSync(
|
|
375
|
+
writeFileSync(outAbs, css);
|
|
265
376
|
console.log(C.yellow(`Built (unbundled): ${output}`));
|
|
377
|
+
console.log(C.yellow(' Install lightningcss-cli in the VelinStyle package (or run build from the framework repo) for minified output.'));
|
|
266
378
|
} finally {
|
|
267
379
|
try { unlinkSync(tmpPath); } catch { /* ignore */ }
|
|
268
380
|
}
|
|
269
381
|
|
|
382
|
+
if (preset === 'lite' && existsSync(outAbs)) {
|
|
383
|
+
const liteBytes = statSync(outAbs).size;
|
|
384
|
+
const fullMin = join(PKG_ROOT, 'dist', 'velinstyle.min.css');
|
|
385
|
+
if (existsSync(fullMin)) {
|
|
386
|
+
const fullBytes = statSync(fullMin).size;
|
|
387
|
+
const liteKb = (liteBytes / 1024).toFixed(1);
|
|
388
|
+
const fullKb = (fullBytes / 1024).toFixed(1);
|
|
389
|
+
console.log(` Size: lite ${liteKb} KB vs dist/velinstyle.min.css ${fullKb} KB`);
|
|
390
|
+
if (!bundled || liteBytes >= fullBytes) {
|
|
391
|
+
console.log(C.yellow(` Warning: lite output is not smaller than the full min CSS${bundled ? '' : ' (unbundled)'}.`));
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
|
|
270
396
|
if (config.scan?.enabled) {
|
|
271
397
|
console.log(C.dim('\nRunning post-build scan...'));
|
|
272
398
|
const { scan } = await import('./scanner.js');
|
|
@@ -458,18 +584,41 @@ function iconsBuildCmd() {
|
|
|
458
584
|
|
|
459
585
|
async function blueprintCmd() {
|
|
460
586
|
const sub = args[1];
|
|
461
|
-
const
|
|
587
|
+
const strict = hasFlag('--strict');
|
|
588
|
+
const { listBlueprints, emitBlueprint, validateAllBlueprints } = await import('./blueprint.js');
|
|
589
|
+
if (sub === '--help' || sub === '-h') {
|
|
590
|
+
console.log(`Usage: velinstyle blueprint [list|<name>] [--output|-o <file>] [--strict]
|
|
591
|
+
|
|
592
|
+
list List blueprint ids
|
|
593
|
+
list --strict Validate all blueprints against CSS
|
|
594
|
+
<name> Emit HTML (stdout or -o file)
|
|
595
|
+
<name> --strict Fail if classes missing from CSS
|
|
596
|
+
`);
|
|
597
|
+
return;
|
|
598
|
+
}
|
|
462
599
|
if (!sub || sub === 'list') {
|
|
600
|
+
if (strict) {
|
|
601
|
+
const results = validateAllBlueprints();
|
|
602
|
+
const bad = results.filter((r) => !r.ok);
|
|
603
|
+
if (bad.length) {
|
|
604
|
+
for (const r of bad) {
|
|
605
|
+
console.log(C.red(`${r.id}: ${r.missing?.join(', ') || r.error}`));
|
|
606
|
+
}
|
|
607
|
+
process.exit(1);
|
|
608
|
+
}
|
|
609
|
+
console.log(C.green(`All ${results.length} blueprints pass --strict`));
|
|
610
|
+
return;
|
|
611
|
+
}
|
|
463
612
|
console.log(`\n ${C.bold('Available blueprints:')}\n`);
|
|
464
613
|
listBlueprints().forEach((b) => console.log(` - ${b}`));
|
|
465
|
-
console.log(`\n ${C.dim('Example: velinstyle blueprint modal -o snippet.html')}\n`);
|
|
614
|
+
console.log(`\n ${C.dim('Example: velinstyle blueprint modal -o snippet.html --strict')}\n`);
|
|
466
615
|
return;
|
|
467
616
|
}
|
|
468
617
|
const out = getArg('--output', '-o');
|
|
469
|
-
const r = emitBlueprint(sub, { output: out || null });
|
|
618
|
+
const r = emitBlueprint(sub, { output: out || null, strict });
|
|
470
619
|
if (!r.ok) {
|
|
471
620
|
console.log(C.red(r.error));
|
|
472
|
-
|
|
621
|
+
process.exit(1);
|
|
473
622
|
}
|
|
474
623
|
if (r.text) {
|
|
475
624
|
console.log(r.text);
|
|
@@ -478,6 +627,58 @@ async function blueprintCmd() {
|
|
|
478
627
|
}
|
|
479
628
|
}
|
|
480
629
|
|
|
630
|
+
async function serveCmd() {
|
|
631
|
+
const raw = args[1] && !args[1].startsWith('-') ? args[1] : '.';
|
|
632
|
+
const port = Number(getArg('--port')) || 4173;
|
|
633
|
+
const { serveStatic } = await import('./serve.js');
|
|
634
|
+
const result = await serveStatic({ dir: resolve(raw), port });
|
|
635
|
+
if (!result.ok) {
|
|
636
|
+
console.log(C.red(result.error));
|
|
637
|
+
process.exit(1);
|
|
638
|
+
}
|
|
639
|
+
console.log(C.green(`Serving ${result.dir}`));
|
|
640
|
+
console.log(` ${result.url}`);
|
|
641
|
+
console.log(C.dim('Press Ctrl+C to stop'));
|
|
642
|
+
}
|
|
643
|
+
|
|
644
|
+
async function doctorCmd() {
|
|
645
|
+
const { runDoctor, formatDoctorReport } = await import('./doctor.js');
|
|
646
|
+
const raw = args[1] && !args[1].startsWith('-') ? resolve(args[1]) : process.cwd();
|
|
647
|
+
let cwd = raw;
|
|
648
|
+
try {
|
|
649
|
+
if (existsSync(raw) && statSync(raw).isFile()) cwd = dirname(raw);
|
|
650
|
+
} catch { /* use raw */ }
|
|
651
|
+
const report = await runDoctor({ cwd, pkgRoot: PKG_ROOT });
|
|
652
|
+
console.log(formatDoctorReport(report));
|
|
653
|
+
process.exit(report.ok ? 0 : 1);
|
|
654
|
+
}
|
|
655
|
+
|
|
656
|
+
async function createCmd() {
|
|
657
|
+
const kind = args[1];
|
|
658
|
+
if (!kind || kind === '--help' || kind === '-h') {
|
|
659
|
+
console.log(`Usage: velinstyle create <landing|dashboard|docs|auth> [dir] [--theme earth] [--no-copy]`);
|
|
660
|
+
process.exit(kind ? 0 : 1);
|
|
661
|
+
}
|
|
662
|
+
const { CREATE_KINDS, createProject } = await import('./create.js');
|
|
663
|
+
if (!CREATE_KINDS.includes(kind)) {
|
|
664
|
+
console.log(C.red(`Unknown kind "${kind}". Use: ${CREATE_KINDS.join('|')}`));
|
|
665
|
+
process.exit(1);
|
|
666
|
+
}
|
|
667
|
+
const dir = args[2] && !args[2].startsWith('-') ? args[2] : kind;
|
|
668
|
+
const theme = getArg('--theme') || undefined;
|
|
669
|
+
const copyAssets = !hasFlag('--no-copy');
|
|
670
|
+
const r = createProject({ kind, dir: resolve(dir), pkgRoot: PKG_ROOT, theme, copyAssets });
|
|
671
|
+
if (!r.ok) {
|
|
672
|
+
console.log(C.red(r.error));
|
|
673
|
+
process.exit(1);
|
|
674
|
+
}
|
|
675
|
+
console.log(C.green(`Created ${kind} at ${r.dir}`));
|
|
676
|
+
console.log(C.dim(` index: ${r.indexPath}`));
|
|
677
|
+
if (r.vendorRel) console.log(C.dim(` vendor: ${r.vendorRel}/`));
|
|
678
|
+
if (r.vendorCopied?.length) console.log(C.dim(` copied: ${r.vendorCopied.join(', ')}`));
|
|
679
|
+
console.log(C.dim(` Next: velinstyle serve ${dir} · velinstyle check ${dir}`));
|
|
680
|
+
}
|
|
681
|
+
|
|
481
682
|
async function tokensBuildCmd() {
|
|
482
683
|
const inputPath = resolve(getArg('--input') || 'tokens.json');
|
|
483
684
|
const outPath = getArg('--output', '-o');
|
|
@@ -622,7 +823,10 @@ async function scaffoldCmd() {
|
|
|
622
823
|
console.log(JSON.stringify(r, null, 2));
|
|
623
824
|
} else if (out) {
|
|
624
825
|
writeFileSync(resolve(out), r.html, 'utf-8');
|
|
625
|
-
console.log(C.green(`Wrote ${resolve(out)} (intent: ${r.intent}, ${r.confidence})`));
|
|
826
|
+
console.log(C.green(`Wrote ${resolve(out)} (intent: ${r.intent}, ${r.confidence}${r.mode ? `, mode: ${r.mode}` : ''})`));
|
|
827
|
+
if (r.review?.gate) {
|
|
828
|
+
console.log(C.dim(` review gate: ${r.review.gate} (promptScore ${r.review.promptScore})`));
|
|
829
|
+
}
|
|
626
830
|
if (r.responsiveHints?.length) {
|
|
627
831
|
console.log(C.yellow(` ${r.responsiveHints.length} layout hint(s) — run: velinstyle layout suggest ${out}`));
|
|
628
832
|
}
|
|
@@ -631,6 +835,74 @@ async function scaffoldCmd() {
|
|
|
631
835
|
}
|
|
632
836
|
}
|
|
633
837
|
|
|
838
|
+
async function planCmd() {
|
|
839
|
+
const promptParts = [];
|
|
840
|
+
let i = 1;
|
|
841
|
+
while (i < args.length) {
|
|
842
|
+
const a = args[i];
|
|
843
|
+
if (a.startsWith('-')) break;
|
|
844
|
+
promptParts.push(a);
|
|
845
|
+
i += 1;
|
|
846
|
+
}
|
|
847
|
+
const prompt = promptParts.join(' ').trim();
|
|
848
|
+
if (!prompt) {
|
|
849
|
+
console.log('Usage: velinstyle plan "<description>" [--json] [-o plan.json]');
|
|
850
|
+
return;
|
|
851
|
+
}
|
|
852
|
+
const { analyzePrompt, buildPlan } = await import('./prompt-engine.js');
|
|
853
|
+
const analysis = analyzePrompt(prompt);
|
|
854
|
+
const plan = buildPlan(analysis, prompt);
|
|
855
|
+
const payload = { analysis, plan };
|
|
856
|
+
const out = getArg('--output', '-o');
|
|
857
|
+
if (out) {
|
|
858
|
+
writeFileSync(resolve(out), JSON.stringify(payload, null, 2), 'utf-8');
|
|
859
|
+
console.log(C.green(`Wrote plan ${resolve(out)} (page: ${plan.page?.id}, sections: ${plan.sections.length})`));
|
|
860
|
+
return;
|
|
861
|
+
}
|
|
862
|
+
console.log(JSON.stringify(payload, null, 2));
|
|
863
|
+
}
|
|
864
|
+
|
|
865
|
+
async function reviewCmd() {
|
|
866
|
+
const target = args[1] && !args[1].startsWith('-') ? args[1] : null;
|
|
867
|
+
if (!target) {
|
|
868
|
+
console.log('Usage: velinstyle review <file.html> [--json] [--prompt "..."] [--profile marketing|app|docs|fragment]');
|
|
869
|
+
return;
|
|
870
|
+
}
|
|
871
|
+
const full = resolve(target);
|
|
872
|
+
if (!existsSync(full)) {
|
|
873
|
+
console.log(C.red(`File not found: ${full}`));
|
|
874
|
+
process.exit(1);
|
|
875
|
+
}
|
|
876
|
+
const html = readFileSync(full, 'utf-8');
|
|
877
|
+
const prompt = getArg('--prompt') || '';
|
|
878
|
+
const profile = getArg('--profile');
|
|
879
|
+
let plan;
|
|
880
|
+
if (prompt) {
|
|
881
|
+
const { analyzePrompt, buildPlan } = await import('./prompt-engine.js');
|
|
882
|
+
plan = buildPlan(analyzePrompt(prompt), prompt);
|
|
883
|
+
}
|
|
884
|
+
const { reviewHtml } = await import('./review.js');
|
|
885
|
+
const report = reviewHtml(html, { plan, prompt, profile: profile || undefined });
|
|
886
|
+
if (hasFlag('--json')) {
|
|
887
|
+
console.log(JSON.stringify(report, null, 2));
|
|
888
|
+
} else {
|
|
889
|
+
console.log(`\n ${C.bold('Review gate:')} ${report.gate} ${C.dim(`profile ${report.profile} · promptScore ${report.promptScore}`)}`);
|
|
890
|
+
console.log(C.dim(` design ${report.scores.design} · a11y ${report.scores.accessibility} · seo ${report.scores.seo} · perf ${report.scores.performance} · conversion ${report.scores.conversion}`));
|
|
891
|
+
if (report.issues.length) {
|
|
892
|
+
console.log(`\n ${C.bold('Issues:')}`);
|
|
893
|
+
for (const issue of report.issues) {
|
|
894
|
+
const color = issue.severity === 'error' ? C.red : C.yellow;
|
|
895
|
+
console.log(color(` [${issue.severity}] ${issue.code}: ${issue.message}`));
|
|
896
|
+
console.log(C.dim(` fix: ${issue.fix}`));
|
|
897
|
+
}
|
|
898
|
+
} else {
|
|
899
|
+
console.log(C.green('\n No issues.'));
|
|
900
|
+
}
|
|
901
|
+
console.log('');
|
|
902
|
+
}
|
|
903
|
+
process.exit(report.gate === 'fail' ? 1 : 0);
|
|
904
|
+
}
|
|
905
|
+
|
|
634
906
|
async function layoutCmd() {
|
|
635
907
|
const sub = args[1] || 'audit';
|
|
636
908
|
const rawTarget = args[2] && !args[2].startsWith('-') ? args[2] : '.';
|
|
@@ -722,6 +994,38 @@ async function searchCmd() {
|
|
|
722
994
|
console.log('Usage: velinstyle search index [--out <file>] [--extra-html dir1,dir2]');
|
|
723
995
|
}
|
|
724
996
|
|
|
997
|
+
async function skillsCmd() {
|
|
998
|
+
const { skillsCommand } = await import('./skills.js');
|
|
999
|
+
await skillsCommand(args.slice(1));
|
|
1000
|
+
}
|
|
1001
|
+
|
|
1002
|
+
async function workflowCmd() {
|
|
1003
|
+
const { workflowCommand } = await import('./workflow.js');
|
|
1004
|
+
await workflowCommand(args.slice(1));
|
|
1005
|
+
}
|
|
1006
|
+
|
|
1007
|
+
async function wcCmd() {
|
|
1008
|
+
const sub = args[1];
|
|
1009
|
+
if (sub === 'api' || sub === '--help' || sub === '-h' || !sub) {
|
|
1010
|
+
if (sub !== 'api') {
|
|
1011
|
+
console.log(`Usage: velinstyle wc api <tag>\nExample: velinstyle wc api velin-toast`);
|
|
1012
|
+
if (sub === '--help' || sub === '-h' || !sub) process.exit(0);
|
|
1013
|
+
}
|
|
1014
|
+
const tag = args[2];
|
|
1015
|
+
const { describeWcApi, formatWcApi } = await import('./wc-api.js');
|
|
1016
|
+
const report = describeWcApi(PKG_ROOT, tag);
|
|
1017
|
+
if (!report.ok) {
|
|
1018
|
+
console.error(report.error);
|
|
1019
|
+
process.exit(1);
|
|
1020
|
+
}
|
|
1021
|
+
if (hasFlag('--json')) console.log(JSON.stringify(report, null, 2));
|
|
1022
|
+
else console.log(formatWcApi(report));
|
|
1023
|
+
return;
|
|
1024
|
+
}
|
|
1025
|
+
console.error(`Unknown wc subcommand: ${sub}. Use: velinstyle wc api <tag>`);
|
|
1026
|
+
process.exit(1);
|
|
1027
|
+
}
|
|
1028
|
+
|
|
725
1029
|
async function scanCmd() {
|
|
726
1030
|
const targetPath = args[1] && !args[1].startsWith('-') ? resolve(args[1]) : resolve('.');
|
|
727
1031
|
const format = getArg('--format') || 'text';
|
|
@@ -747,24 +1051,236 @@ async function scanCmd() {
|
|
|
747
1051
|
process.exit(exitCode);
|
|
748
1052
|
}
|
|
749
1053
|
|
|
1054
|
+
async function checkCmd() {
|
|
1055
|
+
const raw = args[1] && !args[1].startsWith('-') ? args[1] : '.';
|
|
1056
|
+
const target = resolve(raw);
|
|
1057
|
+
const asJson = hasFlag('--json');
|
|
1058
|
+
const asSarif = hasFlag('--sarif');
|
|
1059
|
+
const profile = getArg('--profile');
|
|
1060
|
+
let failed = 0;
|
|
1061
|
+
const steps = [];
|
|
1062
|
+
|
|
1063
|
+
const quiet = asJson || asSarif;
|
|
1064
|
+
|
|
1065
|
+
if (!quiet) console.log(C.bold('\n── doctor ──'));
|
|
1066
|
+
const { runDoctor, formatDoctorReport } = await import('./doctor.js');
|
|
1067
|
+
let doctorCwd = target;
|
|
1068
|
+
try {
|
|
1069
|
+
if (existsSync(target) && statSync(target).isFile()) doctorCwd = dirname(target);
|
|
1070
|
+
} catch { /* keep target */ }
|
|
1071
|
+
const doc = await runDoctor({ cwd: doctorCwd, pkgRoot: PKG_ROOT });
|
|
1072
|
+
if (!quiet) console.log(formatDoctorReport(doc));
|
|
1073
|
+
if (!doc.ok) failed += 1;
|
|
1074
|
+
steps.push({ step: 'doctor', ok: doc.ok, detail: { checks: doc.checks?.length, warnings: doc.warnings?.length } });
|
|
1075
|
+
|
|
1076
|
+
if (!quiet) console.log(C.bold('\n── blueprint --strict ──'));
|
|
1077
|
+
const { validateAllBlueprints } = await import('./blueprint.js');
|
|
1078
|
+
const bp = validateAllBlueprints();
|
|
1079
|
+
const badBp = bp.filter((r) => !r.ok);
|
|
1080
|
+
if (badBp.length) {
|
|
1081
|
+
if (!quiet) {
|
|
1082
|
+
for (const r of badBp) console.log(C.red(`${r.id}: ${r.missing?.join(', ') || r.error}`));
|
|
1083
|
+
}
|
|
1084
|
+
failed += 1;
|
|
1085
|
+
} else if (!quiet) {
|
|
1086
|
+
console.log(C.green(`All ${bp.length} blueprints pass --strict`));
|
|
1087
|
+
}
|
|
1088
|
+
steps.push({ step: 'blueprint', ok: badBp.length === 0, total: bp.length, failed: badBp.length });
|
|
1089
|
+
|
|
1090
|
+
if (!quiet) console.log(C.bold('\n── scan ──'));
|
|
1091
|
+
const { scan } = await import('./scanner.js');
|
|
1092
|
+
const scanResult = scan(target, { severity: 'warning', format: 'json', returnData: true });
|
|
1093
|
+
if (!quiet && scanResult.issues?.length) {
|
|
1094
|
+
for (const i of scanResult.issues.slice(0, 40)) {
|
|
1095
|
+
console.log(` ${i.severity} ${i.rule} L${i.line}: ${i.message}`);
|
|
1096
|
+
}
|
|
1097
|
+
if (scanResult.issues.length > 40) console.log(C.dim(` … ${scanResult.issues.length - 40} more`));
|
|
1098
|
+
} else if (!quiet) {
|
|
1099
|
+
console.log(C.green('No scan issues at warning+'));
|
|
1100
|
+
}
|
|
1101
|
+
if (scanResult.exitCode) failed += 1;
|
|
1102
|
+
steps.push({
|
|
1103
|
+
step: 'scan',
|
|
1104
|
+
ok: !scanResult.exitCode,
|
|
1105
|
+
errors: scanResult.errors,
|
|
1106
|
+
warnings: scanResult.warnings,
|
|
1107
|
+
issues: scanResult.issues,
|
|
1108
|
+
});
|
|
1109
|
+
|
|
1110
|
+
let htmlFile = null;
|
|
1111
|
+
let reviewReport = null;
|
|
1112
|
+
try {
|
|
1113
|
+
const st = statSync(target);
|
|
1114
|
+
if (st.isFile() && /\.html?$/i.test(target)) htmlFile = target;
|
|
1115
|
+
else if (st.isDirectory()) {
|
|
1116
|
+
const idx = join(target, 'index.html');
|
|
1117
|
+
if (existsSync(idx)) htmlFile = idx;
|
|
1118
|
+
}
|
|
1119
|
+
} catch { /* skip review */ }
|
|
1120
|
+
|
|
1121
|
+
if (htmlFile) {
|
|
1122
|
+
if (!quiet) console.log(C.bold('\n── review ──'));
|
|
1123
|
+
const { reviewHtml } = await import('./review.js');
|
|
1124
|
+
const html = readFileSync(htmlFile, 'utf-8');
|
|
1125
|
+
reviewReport = reviewHtml(html, { prompt: '', profile: profile || undefined });
|
|
1126
|
+
if (!quiet) {
|
|
1127
|
+
console.log(`Gate: ${reviewReport.gate} (profile ${reviewReport.profile}, promptScore ${reviewReport.promptScore ?? '—'})`);
|
|
1128
|
+
}
|
|
1129
|
+
if (reviewReport.gate === 'fail') failed += 1;
|
|
1130
|
+
steps.push({ step: 'review', ok: reviewReport.gate !== 'fail', gate: reviewReport.gate, report: reviewReport });
|
|
1131
|
+
} else {
|
|
1132
|
+
if (!quiet) console.log(C.dim('\n── review skipped (no index.html / HTML file) ──'));
|
|
1133
|
+
steps.push({ step: 'review', ok: true, skipped: true });
|
|
1134
|
+
}
|
|
1135
|
+
|
|
1136
|
+
if (!quiet) console.log(C.bold('\n── transparency ──'));
|
|
1137
|
+
try {
|
|
1138
|
+
const { transparencyCheckStep } = await import('./transparency.js');
|
|
1139
|
+
const tx = await transparencyCheckStep(htmlFile || target, { quiet, C });
|
|
1140
|
+
if (!tx.ok && !tx.skipped) failed += 1;
|
|
1141
|
+
if (!quiet && tx.scores) {
|
|
1142
|
+
console.log(`Transparency ${tx.scores.transparency}% · AI ${tx.scores.ai}% · Trust ${tx.scores.trust}% · Provenance ${tx.scores.provenance}%`);
|
|
1143
|
+
}
|
|
1144
|
+
steps.push({ step: 'transparency', ok: tx.ok || !!tx.skipped, scores: tx.scores, skipped: tx.skipped });
|
|
1145
|
+
} catch (err) {
|
|
1146
|
+
if (!quiet) console.log(C.yellow(`transparency skipped: ${err.message}`));
|
|
1147
|
+
steps.push({ step: 'transparency', ok: true, skipped: true, error: String(err.message || err) });
|
|
1148
|
+
}
|
|
1149
|
+
|
|
1150
|
+
const payload = {
|
|
1151
|
+
ok: failed === 0,
|
|
1152
|
+
failedSteps: failed,
|
|
1153
|
+
target,
|
|
1154
|
+
steps,
|
|
1155
|
+
};
|
|
1156
|
+
|
|
1157
|
+
if (asSarif) {
|
|
1158
|
+
const results = [];
|
|
1159
|
+
for (const issue of scanResult.issues || []) {
|
|
1160
|
+
results.push({
|
|
1161
|
+
ruleId: issue.rule,
|
|
1162
|
+
level: issue.severity === 'ERROR' ? 'error' : issue.severity === 'WARNING' ? 'warning' : 'note',
|
|
1163
|
+
message: { text: issue.message },
|
|
1164
|
+
locations: [{
|
|
1165
|
+
physicalLocation: {
|
|
1166
|
+
artifactLocation: { uri: issue.file || htmlFile || target },
|
|
1167
|
+
region: { startLine: issue.line || 1 },
|
|
1168
|
+
},
|
|
1169
|
+
}],
|
|
1170
|
+
});
|
|
1171
|
+
}
|
|
1172
|
+
for (const issue of reviewReport?.issues || []) {
|
|
1173
|
+
results.push({
|
|
1174
|
+
ruleId: issue.code,
|
|
1175
|
+
level: issue.severity === 'error' ? 'error' : 'warning',
|
|
1176
|
+
message: { text: issue.message },
|
|
1177
|
+
locations: [{
|
|
1178
|
+
physicalLocation: {
|
|
1179
|
+
artifactLocation: { uri: htmlFile || target },
|
|
1180
|
+
region: { startLine: 1 },
|
|
1181
|
+
},
|
|
1182
|
+
}],
|
|
1183
|
+
});
|
|
1184
|
+
}
|
|
1185
|
+
const sarif = {
|
|
1186
|
+
$schema: 'https://json.schemastore.org/sarif-2.1.0.json',
|
|
1187
|
+
version: '2.1.0',
|
|
1188
|
+
runs: [{
|
|
1189
|
+
tool: { driver: { name: 'velinstyle-check', informationUri: 'https://github.com/SkyliteDesign/velinstyle', version: CLI_VERSION } },
|
|
1190
|
+
results,
|
|
1191
|
+
}],
|
|
1192
|
+
};
|
|
1193
|
+
console.log(JSON.stringify(sarif, null, 2));
|
|
1194
|
+
} else if (asJson) {
|
|
1195
|
+
console.log(JSON.stringify(payload, null, 2));
|
|
1196
|
+
} else if (failed) {
|
|
1197
|
+
console.log(C.red(`\ncheck failed (${failed} step(s))`));
|
|
1198
|
+
} else {
|
|
1199
|
+
console.log(C.green('\ncheck passed'));
|
|
1200
|
+
}
|
|
1201
|
+
|
|
1202
|
+
process.exit(failed ? 1 : 0);
|
|
1203
|
+
}
|
|
1204
|
+
|
|
1205
|
+
function suggestCommand(unknown) {
|
|
1206
|
+
const names = [
|
|
1207
|
+
'init', 'build', 'themes', 'add', 'icons', 'blueprint', 'create', 'serve', 'doctor', 'check',
|
|
1208
|
+
'validate', 'tokens', 'scan', 'prefix', 'scaffold', 'plan', 'review', 'transparency', 'layout', 'perf',
|
|
1209
|
+
'docs', 'documentation', 'meta', 'search', 'skills', 'workflow', 'wc',
|
|
1210
|
+
];
|
|
1211
|
+
const q = String(unknown || '').toLowerCase();
|
|
1212
|
+
function editDistance(a, b) {
|
|
1213
|
+
const m = a.length;
|
|
1214
|
+
const n = b.length;
|
|
1215
|
+
const dp = Array.from({ length: m + 1 }, () => new Array(n + 1).fill(0));
|
|
1216
|
+
for (let i = 0; i <= m; i += 1) dp[i][0] = i;
|
|
1217
|
+
for (let j = 0; j <= n; j += 1) dp[0][j] = j;
|
|
1218
|
+
for (let i = 1; i <= m; i += 1) {
|
|
1219
|
+
for (let j = 1; j <= n; j += 1) {
|
|
1220
|
+
dp[i][j] = a[i - 1] === b[j - 1]
|
|
1221
|
+
? dp[i - 1][j - 1]
|
|
1222
|
+
: 1 + Math.min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]);
|
|
1223
|
+
}
|
|
1224
|
+
}
|
|
1225
|
+
return dp[m][n];
|
|
1226
|
+
}
|
|
1227
|
+
return names
|
|
1228
|
+
.map((name) => ({ name, dist: editDistance(q, name) }))
|
|
1229
|
+
.sort((a, b) => a.dist - b.dist || a.name.localeCompare(b.name))
|
|
1230
|
+
.slice(0, 3)
|
|
1231
|
+
.filter((s) => s.dist <= Math.max(4, Math.ceil(q.length / 2)))
|
|
1232
|
+
.map((s) => s.name);
|
|
1233
|
+
}
|
|
1234
|
+
|
|
1235
|
+
function unknownCommand(cmd) {
|
|
1236
|
+
console.log(C.red(`Unknown command '${cmd}'.`));
|
|
1237
|
+
const suggestions = suggestCommand(cmd);
|
|
1238
|
+
if (suggestions.length) {
|
|
1239
|
+
console.log(`Did you mean ${suggestions.map((s) => C.cyan(s)).join(', ')}?`);
|
|
1240
|
+
}
|
|
1241
|
+
console.log(C.dim('Run velinstyle --help for the command list.'));
|
|
1242
|
+
process.exit(1);
|
|
1243
|
+
}
|
|
1244
|
+
|
|
750
1245
|
// ── Router ───────────────────────────────────────────────────────────────────
|
|
751
1246
|
|
|
752
|
-
|
|
1247
|
+
const ALIASES = {
|
|
1248
|
+
validate: 'check',
|
|
1249
|
+
documentation: 'docs',
|
|
1250
|
+
};
|
|
1251
|
+
|
|
1252
|
+
const resolvedCommand = ALIASES[command] || command;
|
|
1253
|
+
|
|
1254
|
+
switch (resolvedCommand) {
|
|
753
1255
|
case 'init': init(); break;
|
|
754
1256
|
case 'build': build(); break;
|
|
755
1257
|
case 'themes': themes(); break;
|
|
756
1258
|
case 'add': add(); break;
|
|
757
1259
|
case 'icons': icons(); break;
|
|
758
1260
|
case 'blueprint': await blueprintCmd(); break;
|
|
1261
|
+
case 'create': await createCmd(); break;
|
|
1262
|
+
case 'serve': await serveCmd(); break;
|
|
1263
|
+
case 'doctor': await doctorCmd(); break;
|
|
1264
|
+
case 'check': await checkCmd(); break;
|
|
759
1265
|
case 'tokens': await tokensCmd(); break;
|
|
760
1266
|
case 'scan': scanCmd(); break;
|
|
761
1267
|
case 'prefix': await prefixCmd(); break;
|
|
762
1268
|
case 'scaffold': await scaffoldCmd(); break;
|
|
1269
|
+
case 'plan': await planCmd(); break;
|
|
1270
|
+
case 'review': await reviewCmd(); break;
|
|
1271
|
+
case 'transparency': {
|
|
1272
|
+
const { transparencyCmd } = await import('./transparency.js');
|
|
1273
|
+
await transparencyCmd(args.slice(1), { C, getArg, hasFlag });
|
|
1274
|
+
break;
|
|
1275
|
+
}
|
|
763
1276
|
case 'layout': await layoutCmd(); break;
|
|
764
1277
|
case 'perf': await perfCmd(); break;
|
|
765
1278
|
case 'docs': await docsCmd(); break;
|
|
766
1279
|
case 'meta': await metaCmd(); break;
|
|
767
1280
|
case 'search': await searchCmd(); break;
|
|
768
|
-
case '
|
|
769
|
-
|
|
1281
|
+
case 'skills': await skillsCmd(); break;
|
|
1282
|
+
case 'workflow': await workflowCmd(); break;
|
|
1283
|
+
case 'wc': await wcCmd(); break;
|
|
1284
|
+
case '--help': case '-h': case undefined: help(); break;
|
|
1285
|
+
default: unknownCommand(command); break;
|
|
770
1286
|
}
|