@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.
Files changed (328) hide show
  1. package/README.de.md +89 -161
  2. package/README.md +187 -119
  3. package/cli/blueprint.js +98 -5
  4. package/cli/blueprints/app-chrome.html +18 -0
  5. package/cli/blueprints/benefits-grid.html +9 -0
  6. package/cli/blueprints/bottom-nav-mobile.html +2 -1
  7. package/cli/blueprints/cookie-consent.html +1 -1
  8. package/cli/blueprints/cta-band.html +6 -0
  9. package/cli/blueprints/faq-section.html +18 -0
  10. package/cli/blueprints/filter-bar.html +4 -4
  11. package/cli/blueprints/form-contact.html +6 -5
  12. package/cli/blueprints/hero-section.html +3 -3
  13. package/cli/blueprints/notification-center.html +1 -1
  14. package/cli/blueprints/onboarding.html +2 -1
  15. package/cli/blueprints/ops-console.html +29 -0
  16. package/cli/blueprints/pricing-band.html +37 -0
  17. package/cli/blueprints/process-steps.html +10 -0
  18. package/cli/blueprints/services-grid.html +9 -0
  19. package/cli/blueprints/settings-panel.html +8 -6
  20. package/cli/blueprints/split-hero.html +25 -0
  21. package/cli/blueprints/testimonials.html +8 -0
  22. package/cli/blueprints/trust-bar.html +10 -0
  23. package/cli/cli-manifest.json +81 -17
  24. package/cli/contrast-utils.js +97 -0
  25. package/cli/create.js +370 -0
  26. package/cli/docgen/extract-attributes.js +128 -10
  27. package/cli/docgen/extract-cli.js +3 -2
  28. package/cli/docgen/extract-components.js +61 -2
  29. package/cli/docgen/extract-utilities.js +10 -10
  30. package/cli/doctor.js +119 -0
  31. package/cli/index.js +560 -44
  32. package/cli/meta.js +84 -1
  33. package/cli/perf-audit.js +15 -2
  34. package/cli/prompt-engine.js +243 -0
  35. package/cli/review.js +268 -0
  36. package/cli/scaffold.js +119 -4
  37. package/cli/scanner-rules-data.js +7 -0
  38. package/cli/scanner.js +357 -4
  39. package/cli/serve.js +81 -0
  40. package/cli/skills.js +223 -0
  41. package/cli/transparency.js +221 -0
  42. package/cli/wc-api.js +89 -0
  43. package/cli/workflow.js +42 -0
  44. package/components/index.js +2 -0
  45. package/components/runtime/component-loaders.js +2 -0
  46. package/components/velin-accordion.js +62 -13
  47. package/components/velin-bottom-nav.js +10 -0
  48. package/components/velin-calendar.js +212 -0
  49. package/components/velin-command.js +18 -2
  50. package/components/velin-data-table.js +78 -1
  51. package/components/velin-dialog.js +4 -1
  52. package/components/velin-drawer.js +2 -4
  53. package/components/velin-file-dropzone.js +162 -0
  54. package/components/velin-icon.js +22 -1
  55. package/components/velin-lightbox.js +5 -3
  56. package/components/velin-modal.js +2 -4
  57. package/components/velin-search.js +1 -1
  58. package/components/velin-sheet.js +2 -4
  59. package/core/a11y/component-contracts.json +20 -3
  60. package/core/attributes/registry.js +14 -0
  61. package/core/meta/build.js +125 -5
  62. package/core/meta/design-constraints/contact.json +9 -0
  63. package/core/meta/design-constraints/faq.json +9 -0
  64. package/core/meta/design-constraints/hero.json +13 -0
  65. package/core/meta/knowledge/components.json +622 -0
  66. package/core/meta/knowledge/tokens.json +282 -0
  67. package/core/meta/pages/registry.json +294 -0
  68. package/core/meta/schema.js +13 -1
  69. package/core/meta/sections/registry.json +185 -0
  70. package/core/transparency/attach.js +74 -0
  71. package/core/transparency/claims.js +97 -0
  72. package/core/transparency/doctor.js +142 -0
  73. package/core/transparency/engine.js +75 -0
  74. package/core/transparency/export.js +98 -0
  75. package/core/transparency/index.js +30 -0
  76. package/core/transparency/migrate.js +130 -0
  77. package/core/transparency/normalize.js +125 -0
  78. package/core/transparency/policy.js +105 -0
  79. package/core/transparency/providers.js +235 -0
  80. package/core/transparency/registry.js +104 -0
  81. package/core/transparency/renderer.js +111 -0
  82. package/core/transparency/reporter.js +113 -0
  83. package/core/transparency/validator.js +112 -0
  84. package/dist/chunks/attach-H2ZSEAE6.js +365 -0
  85. package/dist/chunks/{attributes-STYCS3O5.js → attributes-A423NX5J.js} +3 -3
  86. package/dist/chunks/attributes-DZCXX2RZ.js +404 -0
  87. package/dist/chunks/{attributes-353XDOAX.js → attributes-F6UPIEVP.js} +1 -1
  88. package/dist/chunks/{attributes-ADOKLKA7.js → attributes-GLYXGGAL.js} +3 -3
  89. package/dist/chunks/{attributes-TPANLMLF.js → attributes-UFTYOSAU.js} +3 -3
  90. package/dist/chunks/attributes-XGLXLR2T.js +391 -0
  91. package/dist/chunks/attributes-YF4NI2QS.js +391 -0
  92. package/dist/chunks/browser-AUABBYUK.js +1544 -0
  93. package/dist/chunks/{chunk-RSMRR27R.js → chunk-2LSKX57P.js} +12 -10
  94. package/dist/chunks/{chunk-IEHKRARD.js → chunk-2TGCVDUL.js} +11 -9
  95. package/dist/chunks/{chunk-SRL6EWHP.js → chunk-5JWGUAPC.js} +17 -13
  96. package/dist/chunks/chunk-7YSO2OQ2.js +113 -0
  97. package/dist/chunks/{chunk-QVHYL3R4.js → chunk-BHR3ZG6U.js} +6 -6
  98. package/dist/chunks/chunk-CQMTCEI6.js +113 -0
  99. package/dist/chunks/{chunk-J472ERN2.js → chunk-JMSIHEYX.js} +15 -4
  100. package/dist/chunks/{chunk-MKZP2TBH.js → chunk-L7ZGUU4D.js} +2 -2
  101. package/dist/chunks/chunk-TUGIPKW5.js +113 -0
  102. package/dist/chunks/{highlight-GJHHV4KM.js → highlight-M2ELQNYK.js} +1 -1
  103. package/dist/chunks/runtime-entry.js +1 -1
  104. package/dist/chunks/{velin-accordion-FBIPAEXG.js → velin-accordion-WSY6BMLA.js} +64 -10
  105. package/dist/chunks/{velin-bottom-nav-7GEMPIM6.js → velin-bottom-nav-5RVRNGIP.js} +25 -0
  106. package/dist/chunks/{velin-bottom-nav-N3DFQR66.js → velin-bottom-nav-N5F4UO2I.js} +26 -1
  107. package/dist/chunks/velin-calendar-OFE6THUD.js +210 -0
  108. package/dist/chunks/velin-calendar-PGVNJTXK.js +217 -0
  109. package/dist/chunks/velin-calendar-XC7JRDSH.js +217 -0
  110. package/dist/chunks/{velin-code-block-CIAURDRJ.js → velin-code-block-ZGWG7JI5.js} +1 -1
  111. package/dist/chunks/{velin-combobox-NXS4QB4R.js → velin-combobox-56V2ZWT5.js} +1 -1
  112. package/dist/chunks/{velin-command-ONKO2A3J.js → velin-command-2HO2EKR6.js} +29 -2
  113. package/dist/chunks/{velin-command-TMLSRGIU.js → velin-command-ZJSLPK7B.js} +30 -3
  114. package/dist/chunks/{velin-copy-NYDBOKXT.js → velin-copy-XDQSV2XU.js} +1 -1
  115. package/dist/chunks/{velin-countdown-4ZVDGK4R.js → velin-countdown-V4Z5MA63.js} +1 -1
  116. package/dist/chunks/velin-data-table-UVR42UUM.js +372 -0
  117. package/dist/chunks/{velin-dialog-GTTZI564.js → velin-dialog-3YK2RPRV.js} +9 -2
  118. package/dist/chunks/{velin-dialog-ELFOZIXZ.js → velin-dialog-S24KAP4S.js} +3 -1
  119. package/dist/chunks/{velin-drawer-BE6TYN3H.js → velin-drawer-5PNU624J.js} +2 -4
  120. package/dist/chunks/{velin-drawer-DLL2GLT6.js → velin-drawer-CCM6S25D.js} +3 -5
  121. package/dist/chunks/{velin-email-RBX6ZR4S.js → velin-email-TNFONXPW.js} +1 -1
  122. package/dist/chunks/velin-file-dropzone-QRGF2JNA.js +154 -0
  123. package/dist/chunks/velin-file-dropzone-XIZMJ3NB.js +154 -0
  124. package/dist/chunks/{velin-icon-7M76DOPB.js → velin-icon-A6NCXGUK.js} +59 -17
  125. package/dist/chunks/{velin-icon-ZTSKUOVN.js → velin-icon-EC4B5XCM.js} +18 -5
  126. package/dist/chunks/{velin-lightbox-6E7CAATP.js → velin-lightbox-FFK4TUUP.js} +7 -6
  127. package/dist/chunks/{velin-lightbox-NXA3U2FM.js → velin-lightbox-P725FLTY.js} +5 -4
  128. package/dist/chunks/{velin-menubar-J66JXRWW.js → velin-menubar-6I2LM5HL.js} +1 -1
  129. package/dist/chunks/{velin-modal-5HYNNNUI.js → velin-modal-ICTMGRSU.js} +7 -8
  130. package/dist/chunks/{velin-modal-AEOTZ67O.js → velin-modal-JBNODH7D.js} +2 -4
  131. package/dist/chunks/{velin-popover-T72HK3DF.js → velin-popover-WZG2GHBL.js} +25 -4
  132. package/dist/chunks/{velin-rating-N4DI2XNL.js → velin-rating-QBBYRRBU.js} +1 -1
  133. package/dist/chunks/{velin-search-7B4KJ6TX.js → velin-search-B3L6J2RP.js} +2 -2
  134. package/dist/chunks/{velin-search-2XRQFBCS.js → velin-search-L3UG6NDQ.js} +5 -4
  135. package/dist/chunks/{velin-secure-field-6PV7RZDJ.js → velin-secure-field-DGYMP7OK.js} +1 -1
  136. package/dist/chunks/{velin-segmented-control-GYD5BIXQ.js → velin-segmented-control-P74GJPAR.js} +1 -1
  137. package/dist/chunks/{velin-sheet-R2Y67X6H.js → velin-sheet-M5GZZD7G.js} +2 -4
  138. package/dist/chunks/{velin-sheet-OUK6572T.js → velin-sheet-X7RXIWKV.js} +3 -5
  139. package/dist/chunks/{velin-stepper-X54WGHDG.js → velin-stepper-4YQJUHPC.js} +12 -5
  140. package/dist/chunks/{velin-toast-OMMOA2DK.js → velin-toast-UG5LWTG2.js} +5 -1
  141. package/dist/chunks/{velin-tooltip-BDHGRTQB.js → velin-tooltip-ZDH5SDLU.js} +1 -1
  142. package/dist/llms.txt +31 -8
  143. package/dist/search-index.json +182 -10
  144. package/dist/velin-agent.json +3980 -31
  145. package/dist/velinstyle-components.iife.js +1622 -286
  146. package/dist/velinstyle-components.js +1624 -286
  147. package/dist/velinstyle-components.min.js +262 -114
  148. package/dist/velinstyle.css +412 -67
  149. package/dist/velinstyle.d.ts +2 -0
  150. package/dist/velinstyle.min.css +1 -1
  151. package/package.json +21 -6
  152. package/packages/skill-engine/README.md +24 -0
  153. package/packages/skill-engine/package.json +7 -0
  154. package/packages/skill-engine/src/catalog.js +29 -0
  155. package/packages/skill-engine/src/index.js +5 -0
  156. package/packages/skill-engine/src/install.js +69 -0
  157. package/packages/skill-engine/src/registry.js +27 -0
  158. package/packages/skill-engine/src/resolve.js +68 -0
  159. package/packages/skill-engine/src/validate.js +40 -0
  160. package/packages/velinstyle-skills/README.md +6 -0
  161. package/packages/velinstyle-skills/adapter.json +8 -0
  162. package/packages/velinstyle-skills/bundles/landing-starter.bundle.yaml +12 -0
  163. package/packages/velinstyle-skills/bundles/review-suite.bundle.yaml +11 -0
  164. package/packages/velinstyle-skills/catalog.json +1004 -0
  165. package/packages/velinstyle-skills/graphs/component-ship.graph.yaml +14 -0
  166. package/packages/velinstyle-skills/graphs/landingpage.graph.yaml +21 -0
  167. package/packages/velinstyle-skills/graphs/release-gate.graph.yaml +15 -0
  168. package/packages/velinstyle-skills/index.js +22 -0
  169. package/packages/velinstyle-skills/package.json +7 -0
  170. package/packages/velinstyle-skills/packs/accessibility.pack.yaml +9 -0
  171. package/packages/velinstyle-skills/packs/design.pack.yaml +10 -0
  172. package/packages/velinstyle-skills/packs/documentation.pack.yaml +8 -0
  173. package/packages/velinstyle-skills/packs/enterprise.pack.yaml +10 -0
  174. package/packages/velinstyle-skills/packs/frontend.pack.yaml +10 -0
  175. package/packages/velinstyle-skills/packs/review.pack.yaml +9 -0
  176. package/packages/velinstyle-skills/projects/admin-panel.project.yaml +12 -0
  177. package/packages/velinstyle-skills/projects/blog.project.yaml +11 -0
  178. package/packages/velinstyle-skills/projects/documentation-portal.project.yaml +13 -0
  179. package/packages/velinstyle-skills/projects/ecommerce-shop.project.yaml +12 -0
  180. package/packages/velinstyle-skills/projects/landing-page.project.yaml +12 -0
  181. package/packages/velinstyle-skills/projects/laravel-dashboard.project.yaml +12 -0
  182. package/packages/velinstyle-skills/projects/marketing-website.project.yaml +14 -0
  183. package/packages/velinstyle-skills/projects/portfolio.project.yaml +12 -0
  184. package/packages/velinstyle-skills/registry.json +142 -0
  185. package/packages/velinstyle-skills/scripts/generate-assets.mjs +163 -0
  186. package/packages/velinstyle-skills/skills/velin-a11y-focus-keyboard/SKILL.md +57 -0
  187. package/packages/velinstyle-skills/skills/velin-a11y-page-checklist/SKILL.md +57 -0
  188. package/packages/velinstyle-skills/skills/velin-a11y-scan-fix/SKILL.md +57 -0
  189. package/packages/velinstyle-skills/skills/velin-ai-agent-briefing/SKILL.md +57 -0
  190. package/packages/velinstyle-skills/skills/velin-ai-plan-scaffold-review/SKILL.md +57 -0
  191. package/packages/velinstyle-skills/skills/velin-ai-skill-authoring/SKILL.md +57 -0
  192. package/packages/velinstyle-skills/skills/velin-components-accessibility-map/SKILL.md +57 -0
  193. package/packages/velinstyle-skills/skills/velin-components-api-contract/SKILL.md +57 -0
  194. package/packages/velinstyle-skills/skills/velin-components-recipe/SKILL.md +57 -0
  195. package/packages/velinstyle-skills/skills/velin-components-select-compose/SKILL.md +57 -0
  196. package/packages/velinstyle-skills/skills/velin-design-hero-compose/SKILL.md +57 -0
  197. package/packages/velinstyle-skills/skills/velin-design-section-rhythm/SKILL.md +57 -0
  198. package/packages/velinstyle-skills/skills/velin-design-surface-roles/SKILL.md +57 -0
  199. package/packages/velinstyle-skills/skills/velin-dev-component-wire/SKILL.md +57 -0
  200. package/packages/velinstyle-skills/skills/velin-dev-page-scaffold/SKILL.md +57 -0
  201. package/packages/velinstyle-skills/skills/velin-dev-plan-first/SKILL.md +57 -0
  202. package/packages/velinstyle-skills/skills/velin-docs-component-guide/SKILL.md +57 -0
  203. package/packages/velinstyle-skills/skills/velin-docs-generate-api/SKILL.md +57 -0
  204. package/packages/velinstyle-skills/skills/velin-dx-doctor-setup/SKILL.md +57 -0
  205. package/packages/velinstyle-skills/skills/velin-dx-project-init/SKILL.md +57 -0
  206. package/packages/velinstyle-skills/skills/velin-migration-legacy-wc/SKILL.md +57 -0
  207. package/packages/velinstyle-skills/skills/velin-migration-prefix-classes/SKILL.md +57 -0
  208. package/packages/velinstyle-skills/skills/velin-motion-reduced-safe/SKILL.md +57 -0
  209. package/packages/velinstyle-skills/skills/velin-motion-reveal-feedback/SKILL.md +57 -0
  210. package/packages/velinstyle-skills/skills/velin-perf-audit-fix/SKILL.md +57 -0
  211. package/packages/velinstyle-skills/skills/velin-perf-runtime-tree-shake/SKILL.md +57 -0
  212. package/packages/velinstyle-skills/skills/velin-release-changelog-sync/SKILL.md +57 -0
  213. package/packages/velinstyle-skills/skills/velin-release-meta-rebuild/SKILL.md +57 -0
  214. package/packages/velinstyle-skills/skills/velin-review-conversion-hero/SKILL.md +57 -0
  215. package/packages/velinstyle-skills/skills/velin-review-page-gate/SKILL.md +57 -0
  216. package/packages/velinstyle-skills/skills/velin-review-seo-meta/SKILL.md +57 -0
  217. package/packages/velinstyle-skills/skills/velin-security-sanitize-html/SKILL.md +57 -0
  218. package/packages/velinstyle-skills/skills/velin-security-scan-pii/SKILL.md +57 -0
  219. package/packages/velinstyle-skills/skills/velin-testing-a11y-suite/SKILL.md +57 -0
  220. package/packages/velinstyle-skills/skills/velin-testing-visual-smoke/SKILL.md +57 -0
  221. package/packages/velinstyle-skills/skills/velin-themes-apply-token/SKILL.md +57 -0
  222. package/packages/velinstyle-skills/skills/velin-themes-contrast-check/SKILL.md +57 -0
  223. package/packages/velinstyle-skills/skills/velin-utilities-layout-apply/SKILL.md +57 -0
  224. package/packages/velinstyle-skills/skills/velin-utilities-prefix-fix/SKILL.md +57 -0
  225. package/packages/velinstyle-skills/skills/velin-utilities-token-map/SKILL.md +57 -0
  226. package/packages/velinstyle-skills/templates/admin-panel.template.yaml +12 -0
  227. package/packages/velinstyle-skills/templates/blog.template.yaml +12 -0
  228. package/packages/velinstyle-skills/templates/documentation-portal.template.yaml +12 -0
  229. package/packages/velinstyle-skills/templates/ecommerce-shop.template.yaml +13 -0
  230. package/packages/velinstyle-skills/templates/landing-page.template.yaml +12 -0
  231. package/packages/velinstyle-skills/templates/laravel-dashboard.template.yaml +11 -0
  232. package/packages/velinstyle-skills/templates/marketing-website.template.yaml +13 -0
  233. package/packages/velinstyle-skills/templates/portfolio.template.yaml +12 -0
  234. package/schemas/component-knowledge.schema.json +33 -0
  235. package/schemas/design-constraint.schema.json +15 -0
  236. package/schemas/design-intelligence.schema.json +19 -0
  237. package/schemas/design-rule.schema.json +19 -0
  238. package/schemas/page-template.schema.json +24 -0
  239. package/schemas/review-report.schema.json +36 -0
  240. package/schemas/section.schema.json +22 -0
  241. package/schemas/skill-bundle.schema.json +15 -0
  242. package/schemas/skill-graph.schema.json +25 -0
  243. package/schemas/skill-pack.schema.json +14 -0
  244. package/schemas/skill-project.schema.json +16 -0
  245. package/schemas/skill-record.schema.json +27 -0
  246. package/schemas/skill-registry.schema.json +17 -0
  247. package/schemas/skill-template.schema.json +17 -0
  248. package/schemas/token-graph.schema.json +27 -0
  249. package/schemas/utility.schema.json +166 -0
  250. package/src/components/alert.css +22 -1
  251. package/src/components/calendar-dropzone.css +5 -0
  252. package/src/components/transparency.css +138 -0
  253. package/src/layout/app-shell.css +33 -0
  254. package/src/tokens/shadow.css +13 -0
  255. package/src/utilities/border.css +2 -0
  256. package/src/utilities/display.css +1 -24
  257. package/src/utilities/responsive.css +16 -1
  258. package/src/utilities/spacing.css +32 -0
  259. package/src/velinstyle.css +3 -0
  260. package/dist/chunks/attributes-3BZLI7XF.js +0 -364
  261. package/dist/chunks/attributes-4N5JP4CG.js +0 -364
  262. package/dist/chunks/attributes-5Q2WXGRC.js +0 -374
  263. package/dist/chunks/attributes-AIR7SVLK.js +0 -364
  264. package/dist/chunks/attributes-BGRN5XZO.js +0 -364
  265. package/dist/chunks/attributes-BVSQAYLR.js +0 -364
  266. package/dist/chunks/attributes-CDYFUY7Y.js +0 -364
  267. package/dist/chunks/attributes-JMYJZBPE.js +0 -364
  268. package/dist/chunks/attributes-R5JY3X4O.js +0 -374
  269. package/dist/chunks/attributes-TNSPQTHX.js +0 -374
  270. package/dist/chunks/chunk-2354NEBP.js +0 -109
  271. package/dist/chunks/chunk-2VNA7G7S.js +0 -109
  272. package/dist/chunks/chunk-AQLRJSGG.js +0 -109
  273. package/dist/chunks/chunk-EWPSDMQT.js +0 -109
  274. package/dist/chunks/chunk-LA7264K4.js +0 -85
  275. package/dist/chunks/chunk-QTJJ3DPO.js +0 -109
  276. package/dist/chunks/chunk-RZQVWFHW.js +0 -109
  277. package/dist/chunks/chunk-U4XHMZ7D.js +0 -109
  278. package/dist/chunks/chunk-V5YIUA6G.js +0 -109
  279. package/dist/chunks/chunk-XIET2VSZ.js +0 -109
  280. package/dist/chunks/chunk-XYLJ2GCB.js +0 -205
  281. package/dist/chunks/chunk-ZPSPKUYD.js +0 -109
  282. package/dist/chunks/highlight-XTHRKBA3.js +0 -37
  283. package/dist/chunks/velin-bottom-nav-2N2TYWOF.js +0 -86
  284. package/dist/chunks/velin-carousel-Y5VCOABZ.js +0 -213
  285. package/dist/chunks/velin-code-block-ASUBTAQV.js +0 -119
  286. package/dist/chunks/velin-code-block-TSUKPY4C.js +0 -123
  287. package/dist/chunks/velin-code-block-Y6CM726Q.js +0 -119
  288. package/dist/chunks/velin-combobox-2KDTCQ7N.js +0 -155
  289. package/dist/chunks/velin-command-M7RNHUPR.js +0 -136
  290. package/dist/chunks/velin-copy-T5KDTDXP.js +0 -81
  291. package/dist/chunks/velin-countdown-5XSTN3BH.js +0 -101
  292. package/dist/chunks/velin-counter-ISCTEAHI.js +0 -118
  293. package/dist/chunks/velin-dialog-D2GUHSCD.js +0 -144
  294. package/dist/chunks/velin-dialog-IJLFDXAJ.js +0 -144
  295. package/dist/chunks/velin-dialog-TNS3WXMB.js +0 -144
  296. package/dist/chunks/velin-drawer-MJS6WCF7.js +0 -130
  297. package/dist/chunks/velin-email-N5B5ZYTE.js +0 -90
  298. package/dist/chunks/velin-icon-KZO3IEHG.js +0 -164
  299. package/dist/chunks/velin-lightbox-I75U6JF4.js +0 -140
  300. package/dist/chunks/velin-lightbox-QOTB4PRL.js +0 -140
  301. package/dist/chunks/velin-lightbox-UCD6N7HF.js +0 -140
  302. package/dist/chunks/velin-live-dot-XHUZCIDZ.js +0 -67
  303. package/dist/chunks/velin-menubar-SFEXJE56.js +0 -86
  304. package/dist/chunks/velin-modal-2HOBXE6F.js +0 -176
  305. package/dist/chunks/velin-modal-GLI2XZZB.js +0 -176
  306. package/dist/chunks/velin-popover-EXINRIGJ.js +0 -145
  307. package/dist/chunks/velin-popover-OXX7MRZ6.js +0 -145
  308. package/dist/chunks/velin-popover-YKCCROJG.js +0 -145
  309. package/dist/chunks/velin-rating-XRQJV4LO.js +0 -91
  310. package/dist/chunks/velin-scroll-top-F2FCZNYD.js +0 -58
  311. package/dist/chunks/velin-search-4YHJWYSS.js +0 -556
  312. package/dist/chunks/velin-search-LWHY23Q5.js +0 -474
  313. package/dist/chunks/velin-secure-field-H7FSBUJW.js +0 -95
  314. package/dist/chunks/velin-segmented-control-PQX6LKOJ.js +0 -109
  315. package/dist/chunks/velin-sheet-3OGI4HD7.js +0 -119
  316. package/dist/chunks/velin-sparkline-GVEANJVW.js +0 -184
  317. package/dist/chunks/velin-sparkline-KDA3GQAN.js +0 -162
  318. package/dist/chunks/velin-stepper-2ZIHLKGM.js +0 -141
  319. package/dist/chunks/velin-stepper-FYEUEWE6.js +0 -141
  320. package/dist/chunks/velin-stepper-wc-QU3KRVQR.js +0 -133
  321. package/dist/chunks/velin-theme-toggle-BNNS7WLV.js +0 -285
  322. package/dist/chunks/velin-theme-toggle-NO7V4TWI.js +0 -285
  323. package/dist/chunks/velin-theme-toggle-QELCJM2Q.js +0 -291
  324. package/dist/chunks/velin-toast-RCZ4CSUC.js +0 -109
  325. package/dist/chunks/velin-toast-WEUBTJG6.js +0 -109
  326. package/dist/chunks/velin-tooltip-664IOHZA.js +0 -112
  327. package/dist/chunks/velin-tooltip-wc-LXDVT6DE.js +0 -103
  328. 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] Security & accessibility scanner
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 scaffold "<prompt>" Generate layout HTML from a text description
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 Print all blueprint ids
121
- velinstyle blueprint <name> [--output, -o <file>]
122
-
123
- ${C.bold('Scaffold (0.8.0):')}
124
- velinstyle scaffold "<prompt>" Compose blueprints from natural language
125
- velinstyle scaffold list-intents Show supported intent keywords
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] Report CLS, lazy-load, script defer issues
135
- velinstyle perf suggest [path] Same as audit with fix hints
136
- velinstyle perf fix [path] Apply safe fixes (--write)
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
- return;
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', // Design tokens (colors, spacing, typography, etc.)
188
- 'reset', // CSS reset + layer order
189
- 'base', // Focus styles + content styles
190
- 'a11y', // Accessibility + security utilities
191
- 'layout', // Grid, container, flex, breakpoints
192
- 'components', // All UI components (button, card, nav, etc.)
193
- 'utilities', // Utility classes (display, spacing, text, etc.)
194
- 'helpers', // Helper classes (ratios, stacks, stretched-link, etc.)
234
+ 'tokens',
235
+ 'reset',
236
+ 'base',
237
+ 'a11y',
238
+ 'layout',
239
+ 'components',
240
+ 'utilities',
241
+ 'helpers',
195
242
  ],
196
- theme: null, // e.g. 'neon', 'ocean', 'corporate'
243
+ theme: null, // e.g. 'earth', 'nordic', 'ocean'
197
244
  output: './velinstyle-custom.css',
198
245
  minify: true,
199
246
  scan: {
200
- enabled: false, // Set true to auto-scan on build
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
- writeFileSync(configPath, config);
209
- console.log(C.green('Created velinstyle.config.js'));
210
- console.log('Edit the layers array, then run: velinstyle build');
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 output = getArg('--output', '-o') || config.output || './velinstyle-custom.css';
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(`npx lightningcss --bundle ${minifyFlag} "${tmpPath}" -o "${resolve(output)}"`, {
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(resolve(output), css);
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 { listBlueprints, emitBlueprint } = await import('./blueprint.js');
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
- return;
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
- switch (command) {
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 '--help': case '-h': help(); break;
769
- default: help(); break;
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
  }