@auto-engineer/react-gen 1.134.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/skills/design/SKILL.md +302 -0
- package/dist/skills/design/data/cip/deliverables.csv +51 -0
- package/dist/skills/design/data/cip/industries.csv +21 -0
- package/dist/skills/design/data/cip/mockup-contexts.csv +21 -0
- package/dist/skills/design/data/cip/styles.csv +21 -0
- package/dist/skills/design/data/icon/styles.csv +16 -0
- package/dist/skills/design/data/logo/colors.csv +56 -0
- package/dist/skills/design/data/logo/industries.csv +56 -0
- package/dist/skills/design/data/logo/styles.csv +56 -0
- package/dist/skills/design/references/banner-sizes-and-styles.md +118 -0
- package/dist/skills/design/references/cip-deliverable-guide.md +95 -0
- package/dist/skills/design/references/cip-design.md +121 -0
- package/dist/skills/design/references/cip-prompt-engineering.md +84 -0
- package/dist/skills/design/references/cip-style-guide.md +68 -0
- package/dist/skills/design/references/design-routing.md +207 -0
- package/dist/skills/design/references/icon-design.md +122 -0
- package/dist/skills/design/references/logo-color-psychology.md +101 -0
- package/dist/skills/design/references/logo-design.md +92 -0
- package/dist/skills/design/references/logo-prompt-engineering.md +158 -0
- package/dist/skills/design/references/logo-style-guide.md +109 -0
- package/dist/skills/design/references/slides-copywriting-formulas.md +84 -0
- package/dist/skills/design/references/slides-create.md +4 -0
- package/dist/skills/design/references/slides-html-template.md +295 -0
- package/dist/skills/design/references/slides-layout-patterns.md +137 -0
- package/dist/skills/design/references/slides-strategies.md +94 -0
- package/dist/skills/design/references/slides.md +42 -0
- package/dist/skills/design/references/social-photos-design.md +329 -0
- package/dist/skills/design/scripts/cip/core.py +215 -0
- package/dist/skills/design/scripts/cip/generate.py +484 -0
- package/dist/skills/design/scripts/cip/render-html.py +424 -0
- package/dist/skills/design/scripts/cip/search.py +127 -0
- package/dist/skills/design/scripts/icon/generate.py +487 -0
- package/dist/skills/design/scripts/logo/core.py +175 -0
- package/dist/skills/design/scripts/logo/generate.py +362 -0
- package/dist/skills/design/scripts/logo/search.py +114 -0
- package/dist/skills/design-system/SKILL.md +244 -0
- package/dist/skills/design-system/data/slide-backgrounds.csv +11 -0
- package/dist/skills/design-system/data/slide-charts.csv +26 -0
- package/dist/skills/design-system/data/slide-color-logic.csv +14 -0
- package/dist/skills/design-system/data/slide-copy.csv +26 -0
- package/dist/skills/design-system/data/slide-layout-logic.csv +16 -0
- package/dist/skills/design-system/data/slide-layouts.csv +26 -0
- package/dist/skills/design-system/data/slide-strategies.csv +16 -0
- package/dist/skills/design-system/data/slide-typography.csv +15 -0
- package/dist/skills/design-system/references/component-specs.md +236 -0
- package/dist/skills/design-system/references/component-tokens.md +214 -0
- package/dist/skills/design-system/references/primitive-tokens.md +203 -0
- package/dist/skills/design-system/references/semantic-tokens.md +215 -0
- package/dist/skills/design-system/references/states-and-variants.md +241 -0
- package/dist/skills/design-system/references/tailwind-integration.md +251 -0
- package/dist/skills/design-system/references/token-architecture.md +224 -0
- package/dist/skills/design-system/scripts/embed-tokens.cjs +97 -0
- package/dist/skills/design-system/scripts/fetch-background.py +317 -0
- package/dist/skills/design-system/scripts/generate-slide.py +753 -0
- package/dist/skills/design-system/scripts/generate-tokens.cjs +213 -0
- package/dist/skills/design-system/scripts/html-token-validator.py +327 -0
- package/dist/skills/design-system/scripts/search-slides.py +218 -0
- package/dist/skills/design-system/scripts/slide-token-validator.py +35 -0
- package/dist/skills/design-system/scripts/slide_search_core.py +453 -0
- package/dist/skills/design-system/scripts/validate-tokens.cjs +251 -0
- package/dist/skills/design-system/templates/design-tokens-starter.json +143 -0
- package/dist/skills/design-taste-frontend/SKILL.md +79 -0
- package/dist/skills/emil-design-engineering/SKILL.md +108 -0
- package/dist/skills/emil-design-engineering/animations.md +266 -0
- package/dist/skills/emil-design-engineering/component-design.md +382 -0
- package/dist/skills/emil-design-engineering/forms-controls.md +261 -0
- package/dist/skills/emil-design-engineering/marketing.md +160 -0
- package/dist/skills/emil-design-engineering/performance.md +222 -0
- package/dist/skills/emil-design-engineering/touch-accessibility.md +236 -0
- package/dist/skills/emil-design-engineering/ui-polish.md +303 -0
- package/dist/skills/frontend-design/SKILL.md +42 -0
- package/dist/skills/full-output-enforcement/SKILL.md +32 -0
- package/dist/skills/high-end-visual-design/SKILL.md +98 -0
- package/dist/skills/react-doctor/AGENTS.md +15 -0
- package/dist/skills/react-doctor/SKILL.md +19 -0
- package/dist/skills/redesign-existing-projects/SKILL.md +178 -0
- package/dist/skills/ui-styling/LICENSE.txt +202 -0
- package/dist/skills/ui-styling/SKILL.md +324 -0
- package/dist/skills/ui-styling/canvas-fonts/ArsenalSC-OFL.txt +93 -0
- package/dist/skills/ui-styling/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
- package/dist/skills/ui-styling/canvas-fonts/BigShoulders-Bold.ttf +0 -0
- package/dist/skills/ui-styling/canvas-fonts/BigShoulders-OFL.txt +93 -0
- package/dist/skills/ui-styling/canvas-fonts/BigShoulders-Regular.ttf +0 -0
- package/dist/skills/ui-styling/canvas-fonts/Boldonse-OFL.txt +93 -0
- package/dist/skills/ui-styling/canvas-fonts/Boldonse-Regular.ttf +0 -0
- package/dist/skills/ui-styling/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
- package/dist/skills/ui-styling/canvas-fonts/BricolageGrotesque-OFL.txt +93 -0
- package/dist/skills/ui-styling/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
- package/dist/skills/ui-styling/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
- package/dist/skills/ui-styling/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
- package/dist/skills/ui-styling/canvas-fonts/CrimsonPro-OFL.txt +93 -0
- package/dist/skills/ui-styling/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
- package/dist/skills/ui-styling/canvas-fonts/DMMono-OFL.txt +93 -0
- package/dist/skills/ui-styling/canvas-fonts/DMMono-Regular.ttf +0 -0
- package/dist/skills/ui-styling/canvas-fonts/EricaOne-OFL.txt +94 -0
- package/dist/skills/ui-styling/canvas-fonts/EricaOne-Regular.ttf +0 -0
- package/dist/skills/ui-styling/canvas-fonts/GeistMono-Bold.ttf +0 -0
- package/dist/skills/ui-styling/canvas-fonts/GeistMono-OFL.txt +93 -0
- package/dist/skills/ui-styling/canvas-fonts/GeistMono-Regular.ttf +0 -0
- package/dist/skills/ui-styling/canvas-fonts/Gloock-OFL.txt +93 -0
- package/dist/skills/ui-styling/canvas-fonts/Gloock-Regular.ttf +0 -0
- package/dist/skills/ui-styling/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
- package/dist/skills/ui-styling/canvas-fonts/IBMPlexMono-OFL.txt +93 -0
- package/dist/skills/ui-styling/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
- package/dist/skills/ui-styling/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
- package/dist/skills/ui-styling/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
- package/dist/skills/ui-styling/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
- package/dist/skills/ui-styling/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
- package/dist/skills/ui-styling/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
- package/dist/skills/ui-styling/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
- package/dist/skills/ui-styling/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
- package/dist/skills/ui-styling/canvas-fonts/InstrumentSans-OFL.txt +93 -0
- package/dist/skills/ui-styling/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
- package/dist/skills/ui-styling/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
- package/dist/skills/ui-styling/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
- package/dist/skills/ui-styling/canvas-fonts/Italiana-OFL.txt +93 -0
- package/dist/skills/ui-styling/canvas-fonts/Italiana-Regular.ttf +0 -0
- package/dist/skills/ui-styling/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
- package/dist/skills/ui-styling/canvas-fonts/JetBrainsMono-OFL.txt +93 -0
- package/dist/skills/ui-styling/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
- package/dist/skills/ui-styling/canvas-fonts/Jura-Light.ttf +0 -0
- package/dist/skills/ui-styling/canvas-fonts/Jura-Medium.ttf +0 -0
- package/dist/skills/ui-styling/canvas-fonts/Jura-OFL.txt +93 -0
- package/dist/skills/ui-styling/canvas-fonts/LibreBaskerville-OFL.txt +93 -0
- package/dist/skills/ui-styling/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
- package/dist/skills/ui-styling/canvas-fonts/Lora-Bold.ttf +0 -0
- package/dist/skills/ui-styling/canvas-fonts/Lora-BoldItalic.ttf +0 -0
- package/dist/skills/ui-styling/canvas-fonts/Lora-Italic.ttf +0 -0
- package/dist/skills/ui-styling/canvas-fonts/Lora-OFL.txt +93 -0
- package/dist/skills/ui-styling/canvas-fonts/Lora-Regular.ttf +0 -0
- package/dist/skills/ui-styling/canvas-fonts/NationalPark-Bold.ttf +0 -0
- package/dist/skills/ui-styling/canvas-fonts/NationalPark-OFL.txt +93 -0
- package/dist/skills/ui-styling/canvas-fonts/NationalPark-Regular.ttf +0 -0
- package/dist/skills/ui-styling/canvas-fonts/NothingYouCouldDo-OFL.txt +93 -0
- package/dist/skills/ui-styling/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
- package/dist/skills/ui-styling/canvas-fonts/Outfit-Bold.ttf +0 -0
- package/dist/skills/ui-styling/canvas-fonts/Outfit-OFL.txt +93 -0
- package/dist/skills/ui-styling/canvas-fonts/Outfit-Regular.ttf +0 -0
- package/dist/skills/ui-styling/canvas-fonts/PixelifySans-Medium.ttf +0 -0
- package/dist/skills/ui-styling/canvas-fonts/PixelifySans-OFL.txt +93 -0
- package/dist/skills/ui-styling/canvas-fonts/PoiretOne-OFL.txt +93 -0
- package/dist/skills/ui-styling/canvas-fonts/PoiretOne-Regular.ttf +0 -0
- package/dist/skills/ui-styling/canvas-fonts/RedHatMono-Bold.ttf +0 -0
- package/dist/skills/ui-styling/canvas-fonts/RedHatMono-OFL.txt +93 -0
- package/dist/skills/ui-styling/canvas-fonts/RedHatMono-Regular.ttf +0 -0
- package/dist/skills/ui-styling/canvas-fonts/Silkscreen-OFL.txt +93 -0
- package/dist/skills/ui-styling/canvas-fonts/Silkscreen-Regular.ttf +0 -0
- package/dist/skills/ui-styling/canvas-fonts/SmoochSans-Medium.ttf +0 -0
- package/dist/skills/ui-styling/canvas-fonts/SmoochSans-OFL.txt +93 -0
- package/dist/skills/ui-styling/canvas-fonts/Tektur-Medium.ttf +0 -0
- package/dist/skills/ui-styling/canvas-fonts/Tektur-OFL.txt +93 -0
- package/dist/skills/ui-styling/canvas-fonts/Tektur-Regular.ttf +0 -0
- package/dist/skills/ui-styling/canvas-fonts/WorkSans-Bold.ttf +0 -0
- package/dist/skills/ui-styling/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
- package/dist/skills/ui-styling/canvas-fonts/WorkSans-Italic.ttf +0 -0
- package/dist/skills/ui-styling/canvas-fonts/WorkSans-OFL.txt +93 -0
- package/dist/skills/ui-styling/canvas-fonts/WorkSans-Regular.ttf +0 -0
- package/dist/skills/ui-styling/canvas-fonts/YoungSerif-OFL.txt +93 -0
- package/dist/skills/ui-styling/canvas-fonts/YoungSerif-Regular.ttf +0 -0
- package/dist/skills/ui-styling/references/canvas-design-system.md +320 -0
- package/dist/skills/ui-styling/references/shadcn-accessibility.md +471 -0
- package/dist/skills/ui-styling/references/shadcn-components.md +424 -0
- package/dist/skills/ui-styling/references/shadcn-theming.md +373 -0
- package/dist/skills/ui-styling/references/tailwind-customization.md +483 -0
- package/dist/skills/ui-styling/references/tailwind-responsive.md +382 -0
- package/dist/skills/ui-styling/references/tailwind-utilities.md +455 -0
- package/dist/skills/ui-styling/scripts/.coverage +0 -0
- package/dist/skills/ui-styling/scripts/requirements.txt +17 -0
- package/dist/skills/ui-styling/scripts/shadcn_add.py +292 -0
- package/dist/skills/ui-styling/scripts/tailwind_config_gen.py +456 -0
- package/dist/skills/ui-styling/scripts/tests/coverage-ui.json +1392 -0
- package/dist/skills/ui-styling/scripts/tests/requirements.txt +3 -0
- package/dist/skills/ui-styling/scripts/tests/test_shadcn_add.py +266 -0
- package/dist/skills/ui-styling/scripts/tests/test_tailwind_config_gen.py +336 -0
- package/dist/skills/ui-ux-pro-max/SKILL.md +659 -0
- package/dist/skills/ui-ux-pro-max/data/_sync_all.py +414 -0
- package/dist/skills/ui-ux-pro-max/data/app-interface.csv +31 -0
- package/dist/skills/ui-ux-pro-max/data/charts.csv +26 -0
- package/dist/skills/ui-ux-pro-max/data/colors.csv +162 -0
- package/dist/skills/ui-ux-pro-max/data/design.csv +1776 -0
- package/dist/skills/ui-ux-pro-max/data/draft.csv +1779 -0
- package/dist/skills/ui-ux-pro-max/data/google-fonts.csv +1924 -0
- package/dist/skills/ui-ux-pro-max/data/icons.csv +106 -0
- package/dist/skills/ui-ux-pro-max/data/landing.csv +35 -0
- package/dist/skills/ui-ux-pro-max/data/products.csv +162 -0
- package/dist/skills/ui-ux-pro-max/data/react-performance.csv +45 -0
- package/dist/skills/ui-ux-pro-max/data/stacks/react-native.csv +52 -0
- package/dist/skills/ui-ux-pro-max/data/styles.csv +85 -0
- package/dist/skills/ui-ux-pro-max/data/typography.csv +74 -0
- package/dist/skills/ui-ux-pro-max/data/ui-reasoning.csv +162 -0
- package/dist/skills/ui-ux-pro-max/data/ux-guidelines.csv +100 -0
- package/dist/skills/ui-ux-pro-max/scripts/__pycache__/core.cpython-314.pyc +0 -0
- package/dist/skills/ui-ux-pro-max/scripts/__pycache__/design_system.cpython-314.pyc +0 -0
- package/dist/skills/ui-ux-pro-max/scripts/core.py +247 -0
- package/dist/skills/ui-ux-pro-max/scripts/design_system.py +1067 -0
- package/dist/skills/ui-ux-pro-max/scripts/search.py +114 -0
- package/dist/skills/vercel-react-best-practices/AGENTS.md +2934 -0
- package/dist/skills/vercel-react-best-practices/README.md +123 -0
- package/dist/skills/vercel-react-best-practices/SKILL.md +136 -0
- package/dist/skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md +55 -0
- package/dist/skills/vercel-react-best-practices/rules/advanced-init-once.md +42 -0
- package/dist/skills/vercel-react-best-practices/rules/advanced-use-latest.md +39 -0
- package/dist/skills/vercel-react-best-practices/rules/async-api-routes.md +38 -0
- package/dist/skills/vercel-react-best-practices/rules/async-defer-await.md +80 -0
- package/dist/skills/vercel-react-best-practices/rules/async-dependencies.md +51 -0
- package/dist/skills/vercel-react-best-practices/rules/async-parallel.md +28 -0
- package/dist/skills/vercel-react-best-practices/rules/async-suspense-boundaries.md +99 -0
- package/dist/skills/vercel-react-best-practices/rules/bundle-barrel-imports.md +59 -0
- package/dist/skills/vercel-react-best-practices/rules/bundle-conditional.md +31 -0
- package/dist/skills/vercel-react-best-practices/rules/bundle-defer-third-party.md +49 -0
- package/dist/skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md +35 -0
- package/dist/skills/vercel-react-best-practices/rules/bundle-preload.md +50 -0
- package/dist/skills/vercel-react-best-practices/rules/client-event-listeners.md +74 -0
- package/dist/skills/vercel-react-best-practices/rules/client-localstorage-schema.md +71 -0
- package/dist/skills/vercel-react-best-practices/rules/client-passive-event-listeners.md +48 -0
- package/dist/skills/vercel-react-best-practices/rules/client-swr-dedup.md +56 -0
- package/dist/skills/vercel-react-best-practices/rules/js-batch-dom-css.md +107 -0
- package/dist/skills/vercel-react-best-practices/rules/js-cache-function-results.md +80 -0
- package/dist/skills/vercel-react-best-practices/rules/js-cache-property-access.md +28 -0
- package/dist/skills/vercel-react-best-practices/rules/js-cache-storage.md +70 -0
- package/dist/skills/vercel-react-best-practices/rules/js-combine-iterations.md +32 -0
- package/dist/skills/vercel-react-best-practices/rules/js-early-exit.md +50 -0
- package/dist/skills/vercel-react-best-practices/rules/js-hoist-regexp.md +45 -0
- package/dist/skills/vercel-react-best-practices/rules/js-index-maps.md +37 -0
- package/dist/skills/vercel-react-best-practices/rules/js-length-check-first.md +49 -0
- package/dist/skills/vercel-react-best-practices/rules/js-min-max-loop.md +82 -0
- package/dist/skills/vercel-react-best-practices/rules/js-set-map-lookups.md +24 -0
- package/dist/skills/vercel-react-best-practices/rules/js-tosorted-immutable.md +57 -0
- package/dist/skills/vercel-react-best-practices/rules/rendering-activity.md +26 -0
- package/dist/skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
- package/dist/skills/vercel-react-best-practices/rules/rendering-conditional-render.md +40 -0
- package/dist/skills/vercel-react-best-practices/rules/rendering-content-visibility.md +38 -0
- package/dist/skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md +46 -0
- package/dist/skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
- package/dist/skills/vercel-react-best-practices/rules/rendering-hydration-suppress-warning.md +30 -0
- package/dist/skills/vercel-react-best-practices/rules/rendering-svg-precision.md +28 -0
- package/dist/skills/vercel-react-best-practices/rules/rendering-usetransition-loading.md +75 -0
- package/dist/skills/vercel-react-best-practices/rules/rerender-defer-reads.md +39 -0
- package/dist/skills/vercel-react-best-practices/rules/rerender-dependencies.md +45 -0
- package/dist/skills/vercel-react-best-practices/rules/rerender-derived-state-no-effect.md +40 -0
- package/dist/skills/vercel-react-best-practices/rules/rerender-derived-state.md +29 -0
- package/dist/skills/vercel-react-best-practices/rules/rerender-functional-setstate.md +74 -0
- package/dist/skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md +58 -0
- package/dist/skills/vercel-react-best-practices/rules/rerender-memo-with-default-value.md +38 -0
- package/dist/skills/vercel-react-best-practices/rules/rerender-memo.md +44 -0
- package/dist/skills/vercel-react-best-practices/rules/rerender-move-effect-to-event.md +45 -0
- package/dist/skills/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md +35 -0
- package/dist/skills/vercel-react-best-practices/rules/rerender-transitions.md +40 -0
- package/dist/skills/vercel-react-best-practices/rules/rerender-use-ref-transient-values.md +73 -0
- package/dist/skills/vercel-react-best-practices/rules/server-after-nonblocking.md +73 -0
- package/dist/skills/vercel-react-best-practices/rules/server-auth-actions.md +96 -0
- package/dist/skills/vercel-react-best-practices/rules/server-cache-lru.md +41 -0
- package/dist/skills/vercel-react-best-practices/rules/server-cache-react.md +76 -0
- package/dist/skills/vercel-react-best-practices/rules/server-dedup-props.md +65 -0
- package/dist/skills/vercel-react-best-practices/rules/server-parallel-fetching.md +83 -0
- package/dist/skills/vercel-react-best-practices/rules/server-serialization.md +38 -0
- package/dist/skills/web-animation-design/PRACTICAL-TIPS.md +304 -0
- package/dist/skills/web-animation-design/SKILL.md +336 -0
- package/dist/skills/web-design-guidelines/SKILL.md +39 -0
- package/dist/src/agents/create-constants-agent.d.ts +6 -0
- package/dist/src/agents/create-constants-agent.d.ts.map +1 -0
- package/dist/src/agents/create-constants-agent.js +42 -0
- package/dist/src/agents/create-constants-agent.js.map +1 -0
- package/dist/src/agents/create-landing-page-agent.d.ts +4 -0
- package/dist/src/agents/create-landing-page-agent.d.ts.map +1 -0
- package/dist/src/agents/create-landing-page-agent.js +62 -0
- package/dist/src/agents/create-landing-page-agent.js.map +1 -0
- package/dist/src/agents/create-narrative-agent.d.ts +4 -0
- package/dist/src/agents/create-narrative-agent.d.ts.map +1 -0
- package/dist/src/agents/create-narrative-agent.js +36 -0
- package/dist/src/agents/create-narrative-agent.js.map +1 -0
- package/dist/src/agents/create-pipeline.d.ts +9 -0
- package/dist/src/agents/create-pipeline.d.ts.map +1 -0
- package/dist/src/agents/create-pipeline.js +28 -0
- package/dist/src/agents/create-pipeline.js.map +1 -0
- package/dist/src/agents/create-router-agent.d.ts +4 -0
- package/dist/src/agents/create-router-agent.d.ts.map +1 -0
- package/dist/src/agents/create-router-agent.js +46 -0
- package/dist/src/agents/create-router-agent.js.map +1 -0
- package/dist/src/agents/create-theme-agent.d.ts +4 -0
- package/dist/src/agents/create-theme-agent.d.ts.map +1 -0
- package/dist/src/agents/create-theme-agent.js +105 -0
- package/dist/src/agents/create-theme-agent.js.map +1 -0
- package/dist/src/agents/create-validation-agent.d.ts +4 -0
- package/dist/src/agents/create-validation-agent.d.ts.map +1 -0
- package/dist/src/agents/create-validation-agent.js +36 -0
- package/dist/src/agents/create-validation-agent.js.map +1 -0
- package/dist/src/agents/scaffold-agent.d.ts +5 -0
- package/dist/src/agents/scaffold-agent.d.ts.map +1 -0
- package/dist/src/agents/scaffold-agent.js +11 -0
- package/dist/src/agents/scaffold-agent.js.map +1 -0
- package/dist/src/commands/generate-react-app.d.ts +27 -0
- package/dist/src/commands/generate-react-app.d.ts.map +1 -0
- package/dist/src/commands/generate-react-app.js +92 -0
- package/dist/src/commands/generate-react-app.js.map +1 -0
- package/dist/src/config.d.ts +3 -0
- package/dist/src/config.d.ts.map +1 -0
- package/dist/src/config.js +15 -0
- package/dist/src/config.js.map +1 -0
- package/dist/src/index.d.ts +10 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +4 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/prompts/build-narrative-context.d.ts +3 -0
- package/dist/src/prompts/build-narrative-context.d.ts.map +1 -0
- package/dist/src/prompts/build-narrative-context.js +103 -0
- package/dist/src/prompts/build-narrative-context.js.map +1 -0
- package/dist/src/prompts/landing-page-system.d.ts +2 -0
- package/dist/src/prompts/landing-page-system.d.ts.map +1 -0
- package/dist/src/prompts/landing-page-system.js +63 -0
- package/dist/src/prompts/landing-page-system.js.map +1 -0
- package/dist/src/prompts/narrative-system.d.ts +2 -0
- package/dist/src/prompts/narrative-system.d.ts.map +1 -0
- package/dist/src/prompts/narrative-system.js +52 -0
- package/dist/src/prompts/narrative-system.js.map +1 -0
- package/dist/src/prompts/router-system.d.ts +2 -0
- package/dist/src/prompts/router-system.d.ts.map +1 -0
- package/dist/src/prompts/router-system.js +35 -0
- package/dist/src/prompts/router-system.js.map +1 -0
- package/dist/src/prompts/theme-system.d.ts +2 -0
- package/dist/src/prompts/theme-system.d.ts.map +1 -0
- package/dist/src/prompts/theme-system.js +126 -0
- package/dist/src/prompts/theme-system.js.map +1 -0
- package/dist/src/prompts/validation-system.d.ts +2 -0
- package/dist/src/prompts/validation-system.d.ts.map +1 -0
- package/dist/src/prompts/validation-system.js +28 -0
- package/dist/src/prompts/validation-system.js.map +1 -0
- package/dist/src/tools/check-imports.d.ts +6 -0
- package/dist/src/tools/check-imports.d.ts.map +1 -0
- package/dist/src/tools/check-imports.js +129 -0
- package/dist/src/tools/check-imports.js.map +1 -0
- package/dist/src/tools/exit-loop.d.ts +6 -0
- package/dist/src/tools/exit-loop.d.ts.map +1 -0
- package/dist/src/tools/exit-loop.js +12 -0
- package/dist/src/tools/exit-loop.js.map +1 -0
- package/dist/src/tools/list-files.d.ts +4 -0
- package/dist/src/tools/list-files.d.ts.map +1 -0
- package/dist/src/tools/list-files.js +36 -0
- package/dist/src/tools/list-files.js.map +1 -0
- package/dist/src/tools/read-file.d.ts +10 -0
- package/dist/src/tools/read-file.d.ts.map +1 -0
- package/dist/src/tools/read-file.js +21 -0
- package/dist/src/tools/read-file.js.map +1 -0
- package/dist/src/tools/run-eslint.d.ts +6 -0
- package/dist/src/tools/run-eslint.d.ts.map +1 -0
- package/dist/src/tools/run-eslint.js +27 -0
- package/dist/src/tools/run-eslint.js.map +1 -0
- package/dist/src/tools/run-tsc.d.ts +6 -0
- package/dist/src/tools/run-tsc.d.ts.map +1 -0
- package/dist/src/tools/run-tsc.js +27 -0
- package/dist/src/tools/run-tsc.js.map +1 -0
- package/dist/src/tools/write-file.d.ts +15 -0
- package/dist/src/tools/write-file.d.ts.map +1 -0
- package/dist/src/tools/write-file.js +44 -0
- package/dist/src/tools/write-file.js.map +1 -0
- package/dist/src/types.d.ts +330 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +102 -0
- package/dist/src/types.js.map +1 -0
- package/dist/src/utils/create-skill-tool.d.ts +2 -0
- package/dist/src/utils/create-skill-tool.d.ts.map +1 -0
- package/dist/src/utils/create-skill-tool.js +13 -0
- package/dist/src/utils/create-skill-tool.js.map +1 -0
- package/dist/src/utils/parse-model.d.ts +3 -0
- package/dist/src/utils/parse-model.d.ts.map +1 -0
- package/dist/src/utils/parse-model.js +7 -0
- package/dist/src/utils/parse-model.js.map +1 -0
- package/dist/src/utils/slugify.d.ts +2 -0
- package/dist/src/utils/slugify.d.ts.map +1 -0
- package/dist/src/utils/slugify.js +7 -0
- package/dist/src/utils/slugify.js.map +1 -0
- package/dist/starter/.env.example +1 -0
- package/dist/starter/README.md +73 -0
- package/dist/starter/components.json +21 -0
- package/dist/starter/eslint.config.js +23 -0
- package/dist/starter/index.html +13 -0
- package/dist/starter/package-lock.json +7590 -0
- package/dist/starter/package.json +57 -0
- package/dist/starter/pnpm-lock.yaml +4479 -0
- package/dist/starter/public/favicon.svg +1 -0
- package/dist/starter/public/icons.svg +24 -0
- package/dist/starter/src/App.tsx +7 -0
- package/dist/starter/src/assets/hero.png +0 -0
- package/dist/starter/src/assets/vite.svg +1 -0
- package/dist/starter/src/components/error-boundary.tsx +38 -0
- package/dist/starter/src/components/not-found.tsx +16 -0
- package/dist/starter/src/components/ui/accordion.tsx +51 -0
- package/dist/starter/src/components/ui/alert-dialog.tsx +162 -0
- package/dist/starter/src/components/ui/alert.tsx +49 -0
- package/dist/starter/src/components/ui/aspect-ratio.tsx +9 -0
- package/dist/starter/src/components/ui/avatar.tsx +87 -0
- package/dist/starter/src/components/ui/badge.tsx +40 -0
- package/dist/starter/src/components/ui/breadcrumb.tsx +92 -0
- package/dist/starter/src/components/ui/button-group.tsx +74 -0
- package/dist/starter/src/components/ui/button.tsx +62 -0
- package/dist/starter/src/components/ui/calendar.tsx +158 -0
- package/dist/starter/src/components/ui/card.tsx +56 -0
- package/dist/starter/src/components/ui/carousel.tsx +215 -0
- package/dist/starter/src/components/ui/chart.tsx +296 -0
- package/dist/starter/src/components/ui/checkbox.tsx +29 -0
- package/dist/starter/src/components/ui/collapsible.tsx +15 -0
- package/dist/starter/src/components/ui/combobox.tsx +266 -0
- package/dist/starter/src/components/ui/command.tsx +136 -0
- package/dist/starter/src/components/ui/context-menu.tsx +211 -0
- package/dist/starter/src/components/ui/dialog.tsx +135 -0
- package/dist/starter/src/components/ui/direction.tsx +18 -0
- package/dist/starter/src/components/ui/drawer.tsx +106 -0
- package/dist/starter/src/components/ui/dropdown-menu.tsx +219 -0
- package/dist/starter/src/components/ui/empty.tsx +85 -0
- package/dist/starter/src/components/ui/field.tsx +225 -0
- package/dist/starter/src/components/ui/form.tsx +135 -0
- package/dist/starter/src/components/ui/hover-card.tsx +36 -0
- package/dist/starter/src/components/ui/input-group.tsx +146 -0
- package/dist/starter/src/components/ui/input-otp.tsx +68 -0
- package/dist/starter/src/components/ui/input.tsx +21 -0
- package/dist/starter/src/components/ui/item.tsx +157 -0
- package/dist/starter/src/components/ui/kbd.tsx +22 -0
- package/dist/starter/src/components/ui/label.tsx +19 -0
- package/dist/starter/src/components/ui/menubar.tsx +236 -0
- package/dist/starter/src/components/ui/native-select.tsx +44 -0
- package/dist/starter/src/components/ui/navigation-menu.tsx +142 -0
- package/dist/starter/src/components/ui/pagination.tsx +98 -0
- package/dist/starter/src/components/ui/popover.tsx +52 -0
- package/dist/starter/src/components/ui/progress.tsx +24 -0
- package/dist/starter/src/components/ui/radio-group.tsx +31 -0
- package/dist/starter/src/components/ui/resizable.tsx +47 -0
- package/dist/starter/src/components/ui/scroll-area.tsx +46 -0
- package/dist/starter/src/components/ui/select.tsx +162 -0
- package/dist/starter/src/components/ui/separator.tsx +26 -0
- package/dist/starter/src/components/ui/sheet.tsx +107 -0
- package/dist/starter/src/components/ui/sidebar.tsx +674 -0
- package/dist/starter/src/components/ui/skeleton.tsx +7 -0
- package/dist/starter/src/components/ui/slider.tsx +54 -0
- package/dist/starter/src/components/ui/sonner.tsx +31 -0
- package/dist/starter/src/components/ui/spinner.tsx +9 -0
- package/dist/starter/src/components/ui/switch.tsx +33 -0
- package/dist/starter/src/components/ui/table.tsx +75 -0
- package/dist/starter/src/components/ui/tabs.tsx +69 -0
- package/dist/starter/src/components/ui/textarea.tsx +18 -0
- package/dist/starter/src/components/ui/toggle-group.tsx +79 -0
- package/dist/starter/src/components/ui/toggle.tsx +41 -0
- package/dist/starter/src/components/ui/tooltip.tsx +42 -0
- package/dist/starter/src/hooks/use-mobile.ts +19 -0
- package/dist/starter/src/index.css +93 -0
- package/dist/starter/src/lib/graphql-client.ts +5 -0
- package/dist/starter/src/lib/providers.tsx +23 -0
- package/dist/starter/src/lib/utils.ts +6 -0
- package/dist/starter/src/main.tsx +16 -0
- package/dist/starter/tsconfig.app.json +32 -0
- package/dist/starter/tsconfig.json +4 -0
- package/dist/starter/tsconfig.node.json +26 -0
- package/dist/starter/vite.config.ts +16 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +47 -0
- package/skills/design/SKILL.md +302 -0
- package/skills/design/data/cip/deliverables.csv +51 -0
- package/skills/design/data/cip/industries.csv +21 -0
- package/skills/design/data/cip/mockup-contexts.csv +21 -0
- package/skills/design/data/cip/styles.csv +21 -0
- package/skills/design/data/icon/styles.csv +16 -0
- package/skills/design/data/logo/colors.csv +56 -0
- package/skills/design/data/logo/industries.csv +56 -0
- package/skills/design/data/logo/styles.csv +56 -0
- package/skills/design/references/banner-sizes-and-styles.md +118 -0
- package/skills/design/references/cip-deliverable-guide.md +95 -0
- package/skills/design/references/cip-design.md +121 -0
- package/skills/design/references/cip-prompt-engineering.md +84 -0
- package/skills/design/references/cip-style-guide.md +68 -0
- package/skills/design/references/design-routing.md +207 -0
- package/skills/design/references/icon-design.md +122 -0
- package/skills/design/references/logo-color-psychology.md +101 -0
- package/skills/design/references/logo-design.md +92 -0
- package/skills/design/references/logo-prompt-engineering.md +158 -0
- package/skills/design/references/logo-style-guide.md +109 -0
- package/skills/design/references/slides-copywriting-formulas.md +84 -0
- package/skills/design/references/slides-create.md +4 -0
- package/skills/design/references/slides-html-template.md +295 -0
- package/skills/design/references/slides-layout-patterns.md +137 -0
- package/skills/design/references/slides-strategies.md +94 -0
- package/skills/design/references/slides.md +42 -0
- package/skills/design/references/social-photos-design.md +329 -0
- package/skills/design/scripts/cip/core.py +215 -0
- package/skills/design/scripts/cip/generate.py +484 -0
- package/skills/design/scripts/cip/render-html.py +424 -0
- package/skills/design/scripts/cip/search.py +127 -0
- package/skills/design/scripts/icon/generate.py +487 -0
- package/skills/design/scripts/logo/core.py +175 -0
- package/skills/design/scripts/logo/generate.py +362 -0
- package/skills/design/scripts/logo/search.py +114 -0
- package/skills/design-system/SKILL.md +244 -0
- package/skills/design-system/data/slide-backgrounds.csv +11 -0
- package/skills/design-system/data/slide-charts.csv +26 -0
- package/skills/design-system/data/slide-color-logic.csv +14 -0
- package/skills/design-system/data/slide-copy.csv +26 -0
- package/skills/design-system/data/slide-layout-logic.csv +16 -0
- package/skills/design-system/data/slide-layouts.csv +26 -0
- package/skills/design-system/data/slide-strategies.csv +16 -0
- package/skills/design-system/data/slide-typography.csv +15 -0
- package/skills/design-system/references/component-specs.md +236 -0
- package/skills/design-system/references/component-tokens.md +214 -0
- package/skills/design-system/references/primitive-tokens.md +203 -0
- package/skills/design-system/references/semantic-tokens.md +215 -0
- package/skills/design-system/references/states-and-variants.md +241 -0
- package/skills/design-system/references/tailwind-integration.md +251 -0
- package/skills/design-system/references/token-architecture.md +224 -0
- package/skills/design-system/scripts/embed-tokens.cjs +97 -0
- package/skills/design-system/scripts/fetch-background.py +317 -0
- package/skills/design-system/scripts/generate-slide.py +753 -0
- package/skills/design-system/scripts/generate-tokens.cjs +213 -0
- package/skills/design-system/scripts/html-token-validator.py +327 -0
- package/skills/design-system/scripts/search-slides.py +218 -0
- package/skills/design-system/scripts/slide-token-validator.py +35 -0
- package/skills/design-system/scripts/slide_search_core.py +453 -0
- package/skills/design-system/scripts/validate-tokens.cjs +251 -0
- package/skills/design-system/templates/design-tokens-starter.json +143 -0
- package/skills/design-taste-frontend/SKILL.md +79 -0
- package/skills/emil-design-engineering/SKILL.md +108 -0
- package/skills/emil-design-engineering/animations.md +266 -0
- package/skills/emil-design-engineering/component-design.md +382 -0
- package/skills/emil-design-engineering/forms-controls.md +261 -0
- package/skills/emil-design-engineering/marketing.md +160 -0
- package/skills/emil-design-engineering/performance.md +222 -0
- package/skills/emil-design-engineering/touch-accessibility.md +236 -0
- package/skills/emil-design-engineering/ui-polish.md +303 -0
- package/skills/frontend-design/SKILL.md +42 -0
- package/skills/full-output-enforcement/SKILL.md +32 -0
- package/skills/high-end-visual-design/SKILL.md +98 -0
- package/skills/react-doctor/AGENTS.md +15 -0
- package/skills/react-doctor/SKILL.md +19 -0
- package/skills/redesign-existing-projects/SKILL.md +178 -0
- package/skills/ui-styling/LICENSE.txt +202 -0
- package/skills/ui-styling/SKILL.md +324 -0
- package/skills/ui-styling/canvas-fonts/ArsenalSC-OFL.txt +93 -0
- package/skills/ui-styling/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/BigShoulders-Bold.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/BigShoulders-OFL.txt +93 -0
- package/skills/ui-styling/canvas-fonts/BigShoulders-Regular.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/Boldonse-OFL.txt +93 -0
- package/skills/ui-styling/canvas-fonts/Boldonse-Regular.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/BricolageGrotesque-OFL.txt +93 -0
- package/skills/ui-styling/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/CrimsonPro-OFL.txt +93 -0
- package/skills/ui-styling/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/DMMono-OFL.txt +93 -0
- package/skills/ui-styling/canvas-fonts/DMMono-Regular.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/EricaOne-OFL.txt +94 -0
- package/skills/ui-styling/canvas-fonts/EricaOne-Regular.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/GeistMono-Bold.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/GeistMono-OFL.txt +93 -0
- package/skills/ui-styling/canvas-fonts/GeistMono-Regular.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/Gloock-OFL.txt +93 -0
- package/skills/ui-styling/canvas-fonts/Gloock-Regular.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/IBMPlexMono-OFL.txt +93 -0
- package/skills/ui-styling/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/InstrumentSans-OFL.txt +93 -0
- package/skills/ui-styling/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/Italiana-OFL.txt +93 -0
- package/skills/ui-styling/canvas-fonts/Italiana-Regular.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/JetBrainsMono-OFL.txt +93 -0
- package/skills/ui-styling/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/Jura-Light.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/Jura-Medium.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/Jura-OFL.txt +93 -0
- package/skills/ui-styling/canvas-fonts/LibreBaskerville-OFL.txt +93 -0
- package/skills/ui-styling/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/Lora-Bold.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/Lora-BoldItalic.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/Lora-Italic.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/Lora-OFL.txt +93 -0
- package/skills/ui-styling/canvas-fonts/Lora-Regular.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/NationalPark-Bold.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/NationalPark-OFL.txt +93 -0
- package/skills/ui-styling/canvas-fonts/NationalPark-Regular.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/NothingYouCouldDo-OFL.txt +93 -0
- package/skills/ui-styling/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/Outfit-Bold.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/Outfit-OFL.txt +93 -0
- package/skills/ui-styling/canvas-fonts/Outfit-Regular.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/PixelifySans-Medium.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/PixelifySans-OFL.txt +93 -0
- package/skills/ui-styling/canvas-fonts/PoiretOne-OFL.txt +93 -0
- package/skills/ui-styling/canvas-fonts/PoiretOne-Regular.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/RedHatMono-Bold.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/RedHatMono-OFL.txt +93 -0
- package/skills/ui-styling/canvas-fonts/RedHatMono-Regular.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/Silkscreen-OFL.txt +93 -0
- package/skills/ui-styling/canvas-fonts/Silkscreen-Regular.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/SmoochSans-Medium.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/SmoochSans-OFL.txt +93 -0
- package/skills/ui-styling/canvas-fonts/Tektur-Medium.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/Tektur-OFL.txt +93 -0
- package/skills/ui-styling/canvas-fonts/Tektur-Regular.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/WorkSans-Bold.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/WorkSans-Italic.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/WorkSans-OFL.txt +93 -0
- package/skills/ui-styling/canvas-fonts/WorkSans-Regular.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/YoungSerif-OFL.txt +93 -0
- package/skills/ui-styling/canvas-fonts/YoungSerif-Regular.ttf +0 -0
- package/skills/ui-styling/references/canvas-design-system.md +320 -0
- package/skills/ui-styling/references/shadcn-accessibility.md +471 -0
- package/skills/ui-styling/references/shadcn-components.md +424 -0
- package/skills/ui-styling/references/shadcn-theming.md +373 -0
- package/skills/ui-styling/references/tailwind-customization.md +483 -0
- package/skills/ui-styling/references/tailwind-responsive.md +382 -0
- package/skills/ui-styling/references/tailwind-utilities.md +455 -0
- package/skills/ui-styling/scripts/.coverage +0 -0
- package/skills/ui-styling/scripts/requirements.txt +17 -0
- package/skills/ui-styling/scripts/shadcn_add.py +292 -0
- package/skills/ui-styling/scripts/tailwind_config_gen.py +456 -0
- package/skills/ui-styling/scripts/tests/coverage-ui.json +1392 -0
- package/skills/ui-styling/scripts/tests/requirements.txt +3 -0
- package/skills/ui-styling/scripts/tests/test_shadcn_add.py +266 -0
- package/skills/ui-styling/scripts/tests/test_tailwind_config_gen.py +336 -0
- package/skills/ui-ux-pro-max/SKILL.md +659 -0
- package/skills/ui-ux-pro-max/data/_sync_all.py +414 -0
- package/skills/ui-ux-pro-max/data/app-interface.csv +31 -0
- package/skills/ui-ux-pro-max/data/charts.csv +26 -0
- package/skills/ui-ux-pro-max/data/colors.csv +162 -0
- package/skills/ui-ux-pro-max/data/design.csv +1776 -0
- package/skills/ui-ux-pro-max/data/draft.csv +1779 -0
- package/skills/ui-ux-pro-max/data/google-fonts.csv +1924 -0
- package/skills/ui-ux-pro-max/data/icons.csv +106 -0
- package/skills/ui-ux-pro-max/data/landing.csv +35 -0
- package/skills/ui-ux-pro-max/data/products.csv +162 -0
- package/skills/ui-ux-pro-max/data/react-performance.csv +45 -0
- package/skills/ui-ux-pro-max/data/stacks/react-native.csv +52 -0
- package/skills/ui-ux-pro-max/data/styles.csv +85 -0
- package/skills/ui-ux-pro-max/data/typography.csv +74 -0
- package/skills/ui-ux-pro-max/data/ui-reasoning.csv +162 -0
- package/skills/ui-ux-pro-max/data/ux-guidelines.csv +100 -0
- package/skills/ui-ux-pro-max/scripts/__pycache__/core.cpython-314.pyc +0 -0
- package/skills/ui-ux-pro-max/scripts/__pycache__/design_system.cpython-314.pyc +0 -0
- package/skills/ui-ux-pro-max/scripts/core.py +247 -0
- package/skills/ui-ux-pro-max/scripts/design_system.py +1067 -0
- package/skills/ui-ux-pro-max/scripts/search.py +114 -0
- package/skills/vercel-react-best-practices/AGENTS.md +2934 -0
- package/skills/vercel-react-best-practices/README.md +123 -0
- package/skills/vercel-react-best-practices/SKILL.md +136 -0
- package/skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md +55 -0
- package/skills/vercel-react-best-practices/rules/advanced-init-once.md +42 -0
- package/skills/vercel-react-best-practices/rules/advanced-use-latest.md +39 -0
- package/skills/vercel-react-best-practices/rules/async-api-routes.md +38 -0
- package/skills/vercel-react-best-practices/rules/async-defer-await.md +80 -0
- package/skills/vercel-react-best-practices/rules/async-dependencies.md +51 -0
- package/skills/vercel-react-best-practices/rules/async-parallel.md +28 -0
- package/skills/vercel-react-best-practices/rules/async-suspense-boundaries.md +99 -0
- package/skills/vercel-react-best-practices/rules/bundle-barrel-imports.md +59 -0
- package/skills/vercel-react-best-practices/rules/bundle-conditional.md +31 -0
- package/skills/vercel-react-best-practices/rules/bundle-defer-third-party.md +49 -0
- package/skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md +35 -0
- package/skills/vercel-react-best-practices/rules/bundle-preload.md +50 -0
- package/skills/vercel-react-best-practices/rules/client-event-listeners.md +74 -0
- package/skills/vercel-react-best-practices/rules/client-localstorage-schema.md +71 -0
- package/skills/vercel-react-best-practices/rules/client-passive-event-listeners.md +48 -0
- package/skills/vercel-react-best-practices/rules/client-swr-dedup.md +56 -0
- package/skills/vercel-react-best-practices/rules/js-batch-dom-css.md +107 -0
- package/skills/vercel-react-best-practices/rules/js-cache-function-results.md +80 -0
- package/skills/vercel-react-best-practices/rules/js-cache-property-access.md +28 -0
- package/skills/vercel-react-best-practices/rules/js-cache-storage.md +70 -0
- package/skills/vercel-react-best-practices/rules/js-combine-iterations.md +32 -0
- package/skills/vercel-react-best-practices/rules/js-early-exit.md +50 -0
- package/skills/vercel-react-best-practices/rules/js-hoist-regexp.md +45 -0
- package/skills/vercel-react-best-practices/rules/js-index-maps.md +37 -0
- package/skills/vercel-react-best-practices/rules/js-length-check-first.md +49 -0
- package/skills/vercel-react-best-practices/rules/js-min-max-loop.md +82 -0
- package/skills/vercel-react-best-practices/rules/js-set-map-lookups.md +24 -0
- package/skills/vercel-react-best-practices/rules/js-tosorted-immutable.md +57 -0
- package/skills/vercel-react-best-practices/rules/rendering-activity.md +26 -0
- package/skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
- package/skills/vercel-react-best-practices/rules/rendering-conditional-render.md +40 -0
- package/skills/vercel-react-best-practices/rules/rendering-content-visibility.md +38 -0
- package/skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md +46 -0
- package/skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
- package/skills/vercel-react-best-practices/rules/rendering-hydration-suppress-warning.md +30 -0
- package/skills/vercel-react-best-practices/rules/rendering-svg-precision.md +28 -0
- package/skills/vercel-react-best-practices/rules/rendering-usetransition-loading.md +75 -0
- package/skills/vercel-react-best-practices/rules/rerender-defer-reads.md +39 -0
- package/skills/vercel-react-best-practices/rules/rerender-dependencies.md +45 -0
- package/skills/vercel-react-best-practices/rules/rerender-derived-state-no-effect.md +40 -0
- package/skills/vercel-react-best-practices/rules/rerender-derived-state.md +29 -0
- package/skills/vercel-react-best-practices/rules/rerender-functional-setstate.md +74 -0
- package/skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md +58 -0
- package/skills/vercel-react-best-practices/rules/rerender-memo-with-default-value.md +38 -0
- package/skills/vercel-react-best-practices/rules/rerender-memo.md +44 -0
- package/skills/vercel-react-best-practices/rules/rerender-move-effect-to-event.md +45 -0
- package/skills/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md +35 -0
- package/skills/vercel-react-best-practices/rules/rerender-transitions.md +40 -0
- package/skills/vercel-react-best-practices/rules/rerender-use-ref-transient-values.md +73 -0
- package/skills/vercel-react-best-practices/rules/server-after-nonblocking.md +73 -0
- package/skills/vercel-react-best-practices/rules/server-auth-actions.md +96 -0
- package/skills/vercel-react-best-practices/rules/server-cache-lru.md +41 -0
- package/skills/vercel-react-best-practices/rules/server-cache-react.md +76 -0
- package/skills/vercel-react-best-practices/rules/server-dedup-props.md +65 -0
- package/skills/vercel-react-best-practices/rules/server-parallel-fetching.md +83 -0
- package/skills/vercel-react-best-practices/rules/server-serialization.md +38 -0
- package/skills/web-animation-design/PRACTICAL-TIPS.md +304 -0
- package/skills/web-animation-design/SKILL.md +336 -0
- package/skills/web-design-guidelines/SKILL.md +39 -0
- package/starter/.env.example +1 -0
- package/starter/README.md +73 -0
- package/starter/components.json +21 -0
- package/starter/eslint.config.js +23 -0
- package/starter/index.html +13 -0
- package/starter/package-lock.json +7590 -0
- package/starter/package.json +57 -0
- package/starter/pnpm-lock.yaml +4479 -0
- package/starter/public/favicon.svg +1 -0
- package/starter/public/icons.svg +24 -0
- package/starter/src/App.tsx +7 -0
- package/starter/src/assets/hero.png +0 -0
- package/starter/src/assets/vite.svg +1 -0
- package/starter/src/components/error-boundary.tsx +38 -0
- package/starter/src/components/not-found.tsx +16 -0
- package/starter/src/components/ui/accordion.tsx +51 -0
- package/starter/src/components/ui/alert-dialog.tsx +162 -0
- package/starter/src/components/ui/alert.tsx +49 -0
- package/starter/src/components/ui/aspect-ratio.tsx +9 -0
- package/starter/src/components/ui/avatar.tsx +87 -0
- package/starter/src/components/ui/badge.tsx +40 -0
- package/starter/src/components/ui/breadcrumb.tsx +92 -0
- package/starter/src/components/ui/button-group.tsx +74 -0
- package/starter/src/components/ui/button.tsx +62 -0
- package/starter/src/components/ui/calendar.tsx +158 -0
- package/starter/src/components/ui/card.tsx +56 -0
- package/starter/src/components/ui/carousel.tsx +215 -0
- package/starter/src/components/ui/chart.tsx +296 -0
- package/starter/src/components/ui/checkbox.tsx +29 -0
- package/starter/src/components/ui/collapsible.tsx +15 -0
- package/starter/src/components/ui/combobox.tsx +266 -0
- package/starter/src/components/ui/command.tsx +136 -0
- package/starter/src/components/ui/context-menu.tsx +211 -0
- package/starter/src/components/ui/dialog.tsx +135 -0
- package/starter/src/components/ui/direction.tsx +18 -0
- package/starter/src/components/ui/drawer.tsx +106 -0
- package/starter/src/components/ui/dropdown-menu.tsx +219 -0
- package/starter/src/components/ui/empty.tsx +85 -0
- package/starter/src/components/ui/field.tsx +225 -0
- package/starter/src/components/ui/form.tsx +135 -0
- package/starter/src/components/ui/hover-card.tsx +36 -0
- package/starter/src/components/ui/input-group.tsx +146 -0
- package/starter/src/components/ui/input-otp.tsx +68 -0
- package/starter/src/components/ui/input.tsx +21 -0
- package/starter/src/components/ui/item.tsx +157 -0
- package/starter/src/components/ui/kbd.tsx +22 -0
- package/starter/src/components/ui/label.tsx +19 -0
- package/starter/src/components/ui/menubar.tsx +236 -0
- package/starter/src/components/ui/native-select.tsx +44 -0
- package/starter/src/components/ui/navigation-menu.tsx +142 -0
- package/starter/src/components/ui/pagination.tsx +98 -0
- package/starter/src/components/ui/popover.tsx +52 -0
- package/starter/src/components/ui/progress.tsx +24 -0
- package/starter/src/components/ui/radio-group.tsx +31 -0
- package/starter/src/components/ui/resizable.tsx +47 -0
- package/starter/src/components/ui/scroll-area.tsx +46 -0
- package/starter/src/components/ui/select.tsx +162 -0
- package/starter/src/components/ui/separator.tsx +26 -0
- package/starter/src/components/ui/sheet.tsx +107 -0
- package/starter/src/components/ui/sidebar.tsx +674 -0
- package/starter/src/components/ui/skeleton.tsx +7 -0
- package/starter/src/components/ui/slider.tsx +54 -0
- package/starter/src/components/ui/sonner.tsx +31 -0
- package/starter/src/components/ui/spinner.tsx +9 -0
- package/starter/src/components/ui/switch.tsx +33 -0
- package/starter/src/components/ui/table.tsx +75 -0
- package/starter/src/components/ui/tabs.tsx +69 -0
- package/starter/src/components/ui/textarea.tsx +18 -0
- package/starter/src/components/ui/toggle-group.tsx +79 -0
- package/starter/src/components/ui/toggle.tsx +41 -0
- package/starter/src/components/ui/tooltip.tsx +42 -0
- package/starter/src/hooks/use-mobile.ts +19 -0
- package/starter/src/index.css +93 -0
- package/starter/src/lib/graphql-client.ts +5 -0
- package/starter/src/lib/providers.tsx +23 -0
- package/starter/src/lib/utils.ts +6 -0
- package/starter/src/main.tsx +16 -0
- package/starter/tsconfig.app.json +32 -0
- package/starter/tsconfig.json +4 -0
- package/starter/tsconfig.node.json +26 -0
- package/starter/vite.config.ts +16 -0
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import fs from 'fs-extra';
|
|
3
|
+
import { slugify } from '../utils/slugify.js';
|
|
4
|
+
function toConstName(name) {
|
|
5
|
+
return name
|
|
6
|
+
.replace(/([a-z])([A-Z])/g, '$1_$2')
|
|
7
|
+
.replace(/[^a-zA-Z0-9]+/g, '_')
|
|
8
|
+
.toUpperCase();
|
|
9
|
+
}
|
|
10
|
+
function buildQueriesFile(narrative) {
|
|
11
|
+
const slicesWithRequests = narrative.slices.filter((s) => s.request && s.type !== 'react');
|
|
12
|
+
if (slicesWithRequests.length === 0)
|
|
13
|
+
return null;
|
|
14
|
+
const lines = [
|
|
15
|
+
`// Auto-generated GraphQL constants from domain model.`,
|
|
16
|
+
`// DO NOT EDIT — these are the exact query/mutation strings from the model.`,
|
|
17
|
+
``,
|
|
18
|
+
];
|
|
19
|
+
for (const slice of slicesWithRequests) {
|
|
20
|
+
const constName = toConstName(slice.name);
|
|
21
|
+
lines.push(`/** Slice: "${slice.name}" (${slice.type}) */`);
|
|
22
|
+
lines.push(`export const ${constName} = \`${slice.request}\`;`);
|
|
23
|
+
lines.push(``);
|
|
24
|
+
}
|
|
25
|
+
return lines.join('\n');
|
|
26
|
+
}
|
|
27
|
+
export async function runConstants(opts) {
|
|
28
|
+
const created = [];
|
|
29
|
+
for (const narrative of opts.model.narratives) {
|
|
30
|
+
const slug = slugify(narrative.name);
|
|
31
|
+
const dir = path.join(opts.outputDir, 'src', 'features', slug);
|
|
32
|
+
await fs.ensureDir(dir);
|
|
33
|
+
const queriesContent = buildQueriesFile(narrative);
|
|
34
|
+
if (queriesContent) {
|
|
35
|
+
const fp = path.join(dir, 'queries.ts');
|
|
36
|
+
await fs.writeFile(fp, queriesContent, 'utf-8');
|
|
37
|
+
created.push(`src/features/${slug}/queries.ts`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return `Pre-generated: ${created.join(', ')}`;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=create-constants-agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-constants-agent.js","sourceRoot":"","sources":["../../../src/agents/create-constants-agent.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,UAAU,CAAC;AAE1B,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAE9C,SAAS,WAAW,CAAC,IAAY;IAC/B,OAAO,IAAI;SACR,OAAO,CAAC,iBAAiB,EAAE,OAAO,CAAC;SACnC,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC;SAC9B,WAAW,EAAE,CAAC;AACnB,CAAC;AAED,SAAS,gBAAgB,CAAC,SAAoB;IAC5C,MAAM,kBAAkB,GAAG,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;IAC3F,IAAI,kBAAkB,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEjD,MAAM,KAAK,GAAa;QACtB,wDAAwD;QACxD,6EAA6E;QAC7E,EAAE;KACH,CAAC;IAEF,KAAK,MAAM,KAAK,IAAI,kBAAkB,EAAE,CAAC;QACvC,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC1C,KAAK,CAAC,IAAI,CAAC,eAAe,KAAK,CAAC,IAAI,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,CAAC;QAC5D,KAAK,CAAC,IAAI,CAAC,gBAAgB,SAAS,QAAQ,KAAK,CAAC,OAAO,KAAK,CAAC,CAAC;QAChE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAA+C;IAChF,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;QAC9C,MAAM,IAAI,GAAG,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;QAC/D,MAAM,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QAExB,MAAM,cAAc,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;QACnD,IAAI,cAAc,EAAE,CAAC;YACnB,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;YACxC,MAAM,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC;YAChD,OAAO,CAAC,IAAI,CAAC,gBAAgB,IAAI,aAAa,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IAED,OAAO,kBAAkB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;AAChD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-landing-page-agent.d.ts","sourceRoot":"","sources":["../../../src/agents/create-landing-page-agent.ts"],"names":[],"mappings":"AACA,OAAO,EAA6B,KAAK,aAAa,EAAqB,MAAM,IAAI,CAAC;AAMtF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AA+B/C,wBAAsB,mBAAmB,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA8BpH"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { generateText, hasToolCall, stepCountIs, tool } from 'ai';
|
|
3
|
+
import fs from 'fs-extra';
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
import { LANDING_PAGE_SYSTEM_PROMPT } from '../prompts/landing-page-system.js';
|
|
6
|
+
import { createExitLoopTool } from '../tools/exit-loop.js';
|
|
7
|
+
import { createReadFileTool } from '../tools/read-file.js';
|
|
8
|
+
import { getSkillToolkit } from '../utils/create-skill-tool.js';
|
|
9
|
+
import { slugify } from '../utils/slugify.js';
|
|
10
|
+
const SKILL_NAMES = [
|
|
11
|
+
'design-taste-frontend',
|
|
12
|
+
'full-output-enforcement',
|
|
13
|
+
'frontend-design',
|
|
14
|
+
'high-end-visual-design',
|
|
15
|
+
'emil-design-engineering',
|
|
16
|
+
'web-animation-design',
|
|
17
|
+
'ui-ux-pro-max',
|
|
18
|
+
'design',
|
|
19
|
+
'web-design-guidelines',
|
|
20
|
+
];
|
|
21
|
+
function createWriteLandingPageTool(outputDir) {
|
|
22
|
+
return tool({
|
|
23
|
+
description: 'Write the landing page component. Always writes to src/components/landing-page.tsx.',
|
|
24
|
+
inputSchema: z.object({
|
|
25
|
+
content: z.string().describe('Full file content for the landing page component'),
|
|
26
|
+
}),
|
|
27
|
+
execute: async ({ content }) => {
|
|
28
|
+
const filePath = path.resolve(outputDir, 'src', 'components', 'landing-page.tsx');
|
|
29
|
+
await fs.ensureDir(path.dirname(filePath));
|
|
30
|
+
await fs.writeFile(filePath, content, 'utf-8');
|
|
31
|
+
return { success: true, path: 'src/components/landing-page.tsx' };
|
|
32
|
+
},
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
export async function runLandingPageAgent(model, llm, outputDir) {
|
|
36
|
+
const { skill } = await getSkillToolkit();
|
|
37
|
+
const narrativeDescriptions = model.narratives
|
|
38
|
+
.map((n) => {
|
|
39
|
+
const slug = slugify(n.name);
|
|
40
|
+
return `- **${n.name}** — route: \`/${slug}\`, description: ${n.description || n.slices.map((s) => s.name).join(', ')}`;
|
|
41
|
+
})
|
|
42
|
+
.join('\n');
|
|
43
|
+
const domainContext = `## APPLICATION CONTEXT
|
|
44
|
+
This is a **${model.variant}** application.
|
|
45
|
+
|
|
46
|
+
Features (with their routes):
|
|
47
|
+
${narrativeDescriptions}`;
|
|
48
|
+
const { text } = await generateText({
|
|
49
|
+
model: llm,
|
|
50
|
+
system: `${LANDING_PAGE_SYSTEM_PROMPT}\n\n---\n\n${domainContext}`,
|
|
51
|
+
prompt: `Before starting, load these skills by calling the skill tool for each one: ${SKILL_NAMES.join(', ')}. These define mandatory design and code quality rules you MUST follow.\n\nAfter loading all skills, write the landing page component. Call exit_loop when done.`,
|
|
52
|
+
tools: {
|
|
53
|
+
skill,
|
|
54
|
+
write_landing_page: createWriteLandingPageTool(outputDir),
|
|
55
|
+
read_file: createReadFileTool(outputDir),
|
|
56
|
+
exit_loop: createExitLoopTool('Call this after you have written the landing page component.'),
|
|
57
|
+
},
|
|
58
|
+
stopWhen: [hasToolCall('exit_loop'), stepCountIs(15)],
|
|
59
|
+
});
|
|
60
|
+
return text;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=create-landing-page-agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-landing-page-agent.js","sourceRoot":"","sources":["../../../src/agents/create-landing-page-agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-narrative-agent.d.ts","sourceRoot":"","sources":["../../../src/agents/create-narrative-agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,aAAa,EAAe,MAAM,IAAI,CAAC;AAMhF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAe7C,wBAAsB,iBAAiB,CAAC,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAoBpH"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { generateText, hasToolCall, stepCountIs } from 'ai';
|
|
2
|
+
import { buildNarrativeContext } from '../prompts/build-narrative-context.js';
|
|
3
|
+
import { NARRATIVE_SYSTEM_PROMPT } from '../prompts/narrative-system.js';
|
|
4
|
+
import { createExitLoopTool } from '../tools/exit-loop.js';
|
|
5
|
+
import { createReadFileTool } from '../tools/read-file.js';
|
|
6
|
+
import { createWriteFileTool } from '../tools/write-file.js';
|
|
7
|
+
import { getSkillToolkit } from '../utils/create-skill-tool.js';
|
|
8
|
+
const SKILL_NAMES = [
|
|
9
|
+
'design-taste-frontend',
|
|
10
|
+
'full-output-enforcement',
|
|
11
|
+
'vercel-react-best-practices',
|
|
12
|
+
'frontend-design',
|
|
13
|
+
'high-end-visual-design',
|
|
14
|
+
'emil-design-engineering',
|
|
15
|
+
'ui-styling',
|
|
16
|
+
'react-doctor',
|
|
17
|
+
'web-design-guidelines',
|
|
18
|
+
];
|
|
19
|
+
export async function runNarrativeAgent(narrative, llm, outputDir) {
|
|
20
|
+
const context = buildNarrativeContext(narrative);
|
|
21
|
+
const { skill } = await getSkillToolkit();
|
|
22
|
+
const { text } = await generateText({
|
|
23
|
+
model: llm,
|
|
24
|
+
system: `${NARRATIVE_SYSTEM_PROMPT}\n\n---\n\n${context}`,
|
|
25
|
+
prompt: `Before starting, load these skills by calling the skill tool for each one: ${SKILL_NAMES.join(', ')}. These define mandatory design and code quality rules you MUST follow.\n\nAfter loading all skills, generate ALL component files for every slice. Call exit_loop when done.`,
|
|
26
|
+
tools: {
|
|
27
|
+
skill,
|
|
28
|
+
write_file: createWriteFileTool(outputDir),
|
|
29
|
+
read_file: createReadFileTool(outputDir),
|
|
30
|
+
exit_loop: createExitLoopTool('Call this after you have written ALL components for the narrative. Do not exit until every slice has a corresponding component file.'),
|
|
31
|
+
},
|
|
32
|
+
stopWhen: [hasToolCall('exit_loop'), stepCountIs(15)],
|
|
33
|
+
});
|
|
34
|
+
return text;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=create-narrative-agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-narrative-agent.js","sourceRoot":"","sources":["../../../src/agents/create-narrative-agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAsB,WAAW,EAAE,MAAM,IAAI,CAAC;AAChF,OAAO,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AAC9E,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AACzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAE7D,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAEhE,MAAM,WAAW,GAAG;IAClB,uBAAuB;IACvB,yBAAyB;IACzB,6BAA6B;IAC7B,iBAAiB;IACjB,wBAAwB;IACxB,yBAAyB;IACzB,YAAY;IACZ,cAAc;IACd,uBAAuB;CACxB,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,SAAoB,EAAE,GAAkB,EAAE,SAAiB;IACjG,MAAM,OAAO,GAAG,qBAAqB,CAAC,SAAS,CAAC,CAAC;IACjD,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,eAAe,EAAE,CAAC;IAE1C,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,YAAY,CAAC;QAClC,KAAK,EAAE,GAAG;QACV,MAAM,EAAE,GAAG,uBAAuB,cAAc,OAAO,EAAE;QACzD,MAAM,EAAE,8EAA8E,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,8KAA8K;QAC1R,KAAK,EAAE;YACL,KAAK;YACL,UAAU,EAAE,mBAAmB,CAAC,SAAS,CAAC;YAC1C,SAAS,EAAE,kBAAkB,CAAC,SAAS,CAAC;YACxC,SAAS,EAAE,kBAAkB,CAC3B,sIAAsI,CACvI;SACF;QACD,QAAQ,EAAE,CAAC,WAAW,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC;KACtD,CAAC,CAAC;IAEH,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { LanguageModel } from 'ai';
|
|
2
|
+
import type { DomainModel } from '../types.js';
|
|
3
|
+
export declare function runPipeline(opts: {
|
|
4
|
+
model: DomainModel;
|
|
5
|
+
llm: LanguageModel;
|
|
6
|
+
starterDir: string;
|
|
7
|
+
outputDir: string;
|
|
8
|
+
}): Promise<void>;
|
|
9
|
+
//# sourceMappingURL=create-pipeline.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-pipeline.d.ts","sourceRoot":"","sources":["../../../src/agents/create-pipeline.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AAExC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAW/C,wBAAsB,WAAW,CAAC,IAAI,EAAE;IACtC,KAAK,EAAE,WAAW,CAAC;IACnB,GAAG,EAAE,aAAa,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB,GAAG,OAAO,CAAC,IAAI,CAAC,CAuBhB"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import createDebug from 'debug';
|
|
2
|
+
import { runConstants } from './create-constants-agent.js';
|
|
3
|
+
import { runLandingPageAgent } from './create-landing-page-agent.js';
|
|
4
|
+
import { runNarrativeAgent } from './create-narrative-agent.js';
|
|
5
|
+
import { runRouterAgent } from './create-router-agent.js';
|
|
6
|
+
import { runThemeAgent } from './create-theme-agent.js';
|
|
7
|
+
import { runValidationAgent } from './create-validation-agent.js';
|
|
8
|
+
import { runScaffold } from './scaffold-agent.js';
|
|
9
|
+
const debug = createDebug('auto:react-gen:pipeline');
|
|
10
|
+
export async function runPipeline(opts) {
|
|
11
|
+
const { model, llm, starterDir, outputDir } = opts;
|
|
12
|
+
debug('scaffold');
|
|
13
|
+
await runScaffold({ starterDir, outputDir });
|
|
14
|
+
debug('constants');
|
|
15
|
+
await runConstants({ model, outputDir });
|
|
16
|
+
debug('parallel: landing page + theme + %d narratives', model.narratives.length);
|
|
17
|
+
await Promise.all([
|
|
18
|
+
runLandingPageAgent(model, llm, outputDir),
|
|
19
|
+
runThemeAgent(model, llm, outputDir),
|
|
20
|
+
...model.narratives.map((n) => runNarrativeAgent(n, llm, outputDir)),
|
|
21
|
+
]);
|
|
22
|
+
debug('router');
|
|
23
|
+
await runRouterAgent(model, llm, outputDir);
|
|
24
|
+
debug('validation');
|
|
25
|
+
await runValidationAgent(llm, model, outputDir);
|
|
26
|
+
debug('pipeline complete');
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=create-pipeline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-pipeline.js","sourceRoot":"","sources":["../../../src/agents/create-pipeline.ts"],"names":[],"mappings":"AACA,OAAO,WAAW,MAAM,OAAO,CAAC;AAEhC,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAElD,MAAM,KAAK,GAAG,WAAW,CAAC,yBAAyB,CAAC,CAAC;AAErD,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAKjC;IACC,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC;IAEnD,KAAK,CAAC,UAAU,CAAC,CAAC;IAClB,MAAM,WAAW,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC;IAE7C,KAAK,CAAC,WAAW,CAAC,CAAC;IACnB,MAAM,YAAY,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IAEzC,KAAK,CAAC,gDAAgD,EAAE,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IACjF,MAAM,OAAO,CAAC,GAAG,CAAC;QAChB,mBAAmB,CAAC,KAAK,EAAE,GAAG,EAAE,SAAS,CAAC;QAC1C,aAAa,CAAC,KAAK,EAAE,GAAG,EAAE,SAAS,CAAC;QACpC,GAAG,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,CAAC,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;KACrE,CAAC,CAAC;IAEH,KAAK,CAAC,QAAQ,CAAC,CAAC;IAChB,MAAM,cAAc,CAAC,KAAK,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;IAE5C,KAAK,CAAC,YAAY,CAAC,CAAC;IACpB,MAAM,kBAAkB,CAAC,GAAG,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;IAEhD,KAAK,CAAC,mBAAmB,CAAC,CAAC;AAC7B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-router-agent.d.ts","sourceRoot":"","sources":["../../../src/agents/create-router-agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,aAAa,EAAe,MAAM,IAAI,CAAC;AAMhF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAY/C,wBAAsB,cAAc,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAiC/G"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { generateText, hasToolCall, stepCountIs } from 'ai';
|
|
2
|
+
import { ROUTER_SYSTEM_PROMPT } from '../prompts/router-system.js';
|
|
3
|
+
import { createExitLoopTool } from '../tools/exit-loop.js';
|
|
4
|
+
import { createListFilesTool } from '../tools/list-files.js';
|
|
5
|
+
import { createReadFileTool } from '../tools/read-file.js';
|
|
6
|
+
import { createWriteFileTool } from '../tools/write-file.js';
|
|
7
|
+
import { getSkillToolkit } from '../utils/create-skill-tool.js';
|
|
8
|
+
import { slugify } from '../utils/slugify.js';
|
|
9
|
+
const SKILL_NAMES = [
|
|
10
|
+
'design-taste-frontend',
|
|
11
|
+
'full-output-enforcement',
|
|
12
|
+
'frontend-design',
|
|
13
|
+
'vercel-react-best-practices',
|
|
14
|
+
'react-doctor',
|
|
15
|
+
];
|
|
16
|
+
export async function runRouterAgent(model, llm, outputDir) {
|
|
17
|
+
const { skill } = await getSkillToolkit();
|
|
18
|
+
const narrativeDescriptions = model.narratives
|
|
19
|
+
.map((n) => {
|
|
20
|
+
const slug = slugify(n.name);
|
|
21
|
+
return `- **${n.name}** — route: \`/${slug}\`, feature dir: \`src/features/${slug}/\``;
|
|
22
|
+
})
|
|
23
|
+
.join('\n');
|
|
24
|
+
const domainContext = `## APPLICATION CONTEXT
|
|
25
|
+
This is a **${model.variant}** application.
|
|
26
|
+
|
|
27
|
+
Features (use these EXACT routes):
|
|
28
|
+
${narrativeDescriptions}
|
|
29
|
+
|
|
30
|
+
IMPORTANT: Each feature MUST be mapped to the exact route listed above. Do NOT invent different route paths.`;
|
|
31
|
+
const { text } = await generateText({
|
|
32
|
+
model: llm,
|
|
33
|
+
system: `${ROUTER_SYSTEM_PROMPT}\n\n---\n\n${domainContext}`,
|
|
34
|
+
prompt: `Before starting, load these skills by calling the skill tool for each one: ${SKILL_NAMES.join(', ')}. These define mandatory design and code quality rules you MUST follow.\n\nAfter loading all skills, write the router config and landing page. Call exit_loop when done.`,
|
|
35
|
+
tools: {
|
|
36
|
+
skill,
|
|
37
|
+
write_file: createWriteFileTool(outputDir, { allowProtected: true }),
|
|
38
|
+
read_file: createReadFileTool(outputDir),
|
|
39
|
+
list_files: createListFilesTool(outputDir),
|
|
40
|
+
exit_loop: createExitLoopTool('Call this after you have written the router config and landing page.'),
|
|
41
|
+
},
|
|
42
|
+
stopWhen: [hasToolCall('exit_loop'), stepCountIs(15)],
|
|
43
|
+
});
|
|
44
|
+
return text;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=create-router-agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-router-agent.js","sourceRoot":"","sources":["../../../src/agents/create-router-agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAsB,WAAW,EAAE,MAAM,IAAI,CAAC;AAChF,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAE7D,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAE9C,MAAM,WAAW,GAAG;IAClB,uBAAuB;IACvB,yBAAyB;IACzB,iBAAiB;IACjB,6BAA6B;IAC7B,cAAc;CACf,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,KAAkB,EAAE,GAAkB,EAAE,SAAiB;IAC5F,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,eAAe,EAAE,CAAC;IAE1C,MAAM,qBAAqB,GAAG,KAAK,CAAC,UAAU;SAC3C,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACT,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC7B,OAAO,OAAO,CAAC,CAAC,IAAI,kBAAkB,IAAI,mCAAmC,IAAI,KAAK,CAAC;IACzF,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,MAAM,aAAa,GAAG;cACV,KAAK,CAAC,OAAO;;;EAGzB,qBAAqB;;6GAEsF,CAAC;IAE5G,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,YAAY,CAAC;QAClC,KAAK,EAAE,GAAG;QACV,MAAM,EAAE,GAAG,oBAAoB,cAAc,aAAa,EAAE;QAC5D,MAAM,EAAE,8EAA8E,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,0KAA0K;QACtR,KAAK,EAAE;YACL,KAAK;YACL,UAAU,EAAE,mBAAmB,CAAC,SAAS,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC;YACpE,SAAS,EAAE,kBAAkB,CAAC,SAAS,CAAC;YACxC,UAAU,EAAE,mBAAmB,CAAC,SAAS,CAAC;YAC1C,SAAS,EAAE,kBAAkB,CAAC,sEAAsE,CAAC;SACtG;QACD,QAAQ,EAAE,CAAC,WAAW,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC;KACtD,CAAC,CAAC;IAEH,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-theme-agent.d.ts","sourceRoot":"","sources":["../../../src/agents/create-theme-agent.ts"],"names":[],"mappings":"AACA,OAAO,EAA6B,KAAK,aAAa,EAAqB,MAAM,IAAI,CAAC;AAOtF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAmG/C,wBAAsB,aAAa,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAwB9G"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { generateText, hasToolCall, stepCountIs, tool } from 'ai';
|
|
3
|
+
import fs from 'fs-extra';
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
import { THEME_SYSTEM_PROMPT } from '../prompts/theme-system.js';
|
|
6
|
+
import { createExitLoopTool } from '../tools/exit-loop.js';
|
|
7
|
+
import { createReadFileTool } from '../tools/read-file.js';
|
|
8
|
+
import { createWriteFileTool } from '../tools/write-file.js';
|
|
9
|
+
import { getSkillToolkit } from '../utils/create-skill-tool.js';
|
|
10
|
+
const SKILL_NAMES = ['design-taste-frontend', 'high-end-visual-design', 'design-system', 'design'];
|
|
11
|
+
function createCheckThemeTool(outputDir) {
|
|
12
|
+
return tool({
|
|
13
|
+
description: 'Checks if src/index.css has been properly themed (contains oklch primary color, not the default teal). Call this after writing index.css. If it returns success, call exit_loop.',
|
|
14
|
+
inputSchema: z.object({}),
|
|
15
|
+
execute: async () => {
|
|
16
|
+
const cssPath = path.join(outputDir, 'src', 'index.css');
|
|
17
|
+
if (!(await fs.pathExists(cssPath))) {
|
|
18
|
+
return {
|
|
19
|
+
ok: false,
|
|
20
|
+
errors: ['src/index.css does not exist. You must call write_file("src/index.css", ...) to create it.'],
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
const content = await fs.readFile(cssPath, 'utf-8');
|
|
24
|
+
const errors = [];
|
|
25
|
+
if (content.includes('#0d9488')) {
|
|
26
|
+
errors.push('Still has the default teal (#0d9488). Write a NEW index.css with a domain-appropriate color.');
|
|
27
|
+
}
|
|
28
|
+
if (!content.includes('--primary:')) {
|
|
29
|
+
errors.push('Missing --primary variable. Write the complete CSS file with all variables.');
|
|
30
|
+
}
|
|
31
|
+
if (!content.includes('@import "tailwindcss"')) {
|
|
32
|
+
errors.push('Missing @import "tailwindcss". Write the complete file structure.');
|
|
33
|
+
}
|
|
34
|
+
if (content.includes('@plugin')) {
|
|
35
|
+
errors.push('Has @plugin directives which are not installed. Remove all @plugin lines.');
|
|
36
|
+
}
|
|
37
|
+
if (content.includes('@tailwind')) {
|
|
38
|
+
errors.push('Uses @tailwind directives (Tailwind v3 syntax). Use @import "tailwindcss" instead.');
|
|
39
|
+
}
|
|
40
|
+
if (!content.includes('@theme inline')) {
|
|
41
|
+
errors.push('Missing "@theme inline". The @theme block MUST use the "inline" keyword. Copy the EXACT template — only replace HUE values.');
|
|
42
|
+
}
|
|
43
|
+
if (!content.includes('Outfit')) {
|
|
44
|
+
errors.push('Missing the Outfit font. Copy the EXACT template which includes the Google Fonts import for Outfit. Inter is BANNED.');
|
|
45
|
+
}
|
|
46
|
+
if (!content.includes("'Outfit', system-ui, sans-serif") &&
|
|
47
|
+
!content.includes('"Outfit", system-ui, sans-serif')) {
|
|
48
|
+
errors.push('--font-sans must be set to "Outfit", system-ui, sans-serif in the @theme inline block.');
|
|
49
|
+
}
|
|
50
|
+
if (!content.includes('JetBrains Mono')) {
|
|
51
|
+
errors.push('--font-mono must include "JetBrains Mono". Copy the EXACT template which imports it from Google Fonts.');
|
|
52
|
+
}
|
|
53
|
+
if (!content.includes('--color-chart-1')) {
|
|
54
|
+
errors.push('Missing chart color variables (--color-chart-1 through --color-chart-5). Copy the EXACT template.');
|
|
55
|
+
}
|
|
56
|
+
if (content.includes('Inter')) {
|
|
57
|
+
errors.push('References Inter font which is BANNED. Remove ALL Inter references. Use Outfit only.');
|
|
58
|
+
}
|
|
59
|
+
if (content.includes('@source')) {
|
|
60
|
+
errors.push('Has @source directive which is not needed. Remove it.');
|
|
61
|
+
}
|
|
62
|
+
if (!content.includes('font-feature-settings')) {
|
|
63
|
+
errors.push('Body is missing font-feature-settings: "cv02", "cv03", "cv04", "cv11". Copy the EXACT @layer base block from the template.');
|
|
64
|
+
}
|
|
65
|
+
const lines = content.split('\n');
|
|
66
|
+
const fontsLineIndex = lines.findIndex((l) => l.includes('fonts.googleapis.com'));
|
|
67
|
+
if (fontsLineIndex === -1) {
|
|
68
|
+
errors.push('Missing Google Fonts @import for Outfit and JetBrains Mono. It must be the second line, right after @import "tailwindcss".');
|
|
69
|
+
}
|
|
70
|
+
else if (fontsLineIndex > 5) {
|
|
71
|
+
errors.push(`Google Fonts @import is at line ${fontsLineIndex + 1} but MUST be at the top (line 2, right after @import "tailwindcss"). CSS @import rules must come before other rules.`);
|
|
72
|
+
}
|
|
73
|
+
const fgMatch = content.match(/--foreground:\s*oklch\([\d.]+ ([\d.]+)/);
|
|
74
|
+
if (fgMatch && parseFloat(fgMatch[1]) === 0) {
|
|
75
|
+
errors.push('--foreground has 0 chroma (pure gray). The template uses oklch(0.14 0.02 HUE) — only replace HUE with your hue angle number.');
|
|
76
|
+
}
|
|
77
|
+
if (errors.length > 0) {
|
|
78
|
+
return { ok: false, errors, message: `Found ${errors.length} issue(s). Fix ALL of them in a single rewrite.` };
|
|
79
|
+
}
|
|
80
|
+
return { ok: true, message: 'Theme looks good. Call exit_loop now.' };
|
|
81
|
+
},
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
export async function runThemeAgent(model, llm, outputDir) {
|
|
85
|
+
const { skill } = await getSkillToolkit();
|
|
86
|
+
const narrativeDescriptions = model.narratives
|
|
87
|
+
.map((n) => `- ${n.name}: ${n.description || n.slices.map((s) => s.name).join(', ')}`)
|
|
88
|
+
.join('\n');
|
|
89
|
+
const context = `Application features:\n${narrativeDescriptions}`;
|
|
90
|
+
const { text } = await generateText({
|
|
91
|
+
model: llm,
|
|
92
|
+
system: `${THEME_SYSTEM_PROMPT}\n\n---\n\n${context}`,
|
|
93
|
+
prompt: `Before starting, load these skills by calling the skill tool for each one: ${SKILL_NAMES.join(', ')}. These define mandatory design and color choices rules you MUST follow.\n\nAfter loading all skills, write index.css then call check_theme to verify it. If check_theme says ok, call exit_loop.`,
|
|
94
|
+
tools: {
|
|
95
|
+
skill,
|
|
96
|
+
write_file: createWriteFileTool(outputDir, { allowProtected: true }),
|
|
97
|
+
read_file: createReadFileTool(outputDir),
|
|
98
|
+
check_theme: createCheckThemeTool(outputDir),
|
|
99
|
+
exit_loop: createExitLoopTool('Call this when check_theme returns ok: true.'),
|
|
100
|
+
},
|
|
101
|
+
stopWhen: [hasToolCall('exit_loop'), stepCountIs(15)],
|
|
102
|
+
});
|
|
103
|
+
return text;
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=create-theme-agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-theme-agent.js","sourceRoot":"","sources":["../../../src/agents/create-theme-agent.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,WAAW,EAAsB,WAAW,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AACtF,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAE7D,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAEhE,MAAM,WAAW,GAAG,CAAC,uBAAuB,EAAE,wBAAwB,EAAE,eAAe,EAAE,QAAQ,CAAC,CAAC;AAEnG,SAAS,oBAAoB,CAAC,SAAiB;IAC7C,OAAO,IAAI,CAAC;QACV,WAAW,EACT,kLAAkL;QACpL,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;QACzB,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;YACzD,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;gBACpC,OAAO;oBACL,EAAE,EAAE,KAAK;oBACT,MAAM,EAAE,CAAC,4FAA4F,CAAC;iBACvG,CAAC;YACJ,CAAC;YACD,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACpD,MAAM,MAAM,GAAa,EAAE,CAAC;YAE5B,IAAI,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;gBAChC,MAAM,CAAC,IAAI,CAAC,8FAA8F,CAAC,CAAC;YAC9G,CAAC;YACD,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;gBACpC,MAAM,CAAC,IAAI,CAAC,6EAA6E,CAAC,CAAC;YAC7F,CAAC;YACD,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAC,EAAE,CAAC;gBAC/C,MAAM,CAAC,IAAI,CAAC,mEAAmE,CAAC,CAAC;YACnF,CAAC;YACD,IAAI,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;gBAChC,MAAM,CAAC,IAAI,CAAC,2EAA2E,CAAC,CAAC;YAC3F,CAAC;YACD,IAAI,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;gBAClC,MAAM,CAAC,IAAI,CAAC,oFAAoF,CAAC,CAAC;YACpG,CAAC;YACD,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;gBACvC,MAAM,CAAC,IAAI,CACT,6HAA6H,CAC9H,CAAC;YACJ,CAAC;YACD,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAChC,MAAM,CAAC,IAAI,CACT,sHAAsH,CACvH,CAAC;YACJ,CAAC;YACD,IACE,CAAC,OAAO,CAAC,QAAQ,CAAC,iCAAiC,CAAC;gBACpD,CAAC,OAAO,CAAC,QAAQ,CAAC,iCAAiC,CAAC,EACpD,CAAC;gBACD,MAAM,CAAC,IAAI,CAAC,wFAAwF,CAAC,CAAC;YACxG,CAAC;YACD,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;gBACxC,MAAM,CAAC,IAAI,CACT,wGAAwG,CACzG,CAAC;YACJ,CAAC;YACD,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;gBACzC,MAAM,CAAC,IAAI,CACT,mGAAmG,CACpG,CAAC;YACJ,CAAC;YACD,IAAI,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC9B,MAAM,CAAC,IAAI,CAAC,sFAAsF,CAAC,CAAC;YACtG,CAAC;YACD,IAAI,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;gBAChC,MAAM,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;YACvE,CAAC;YACD,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAC,EAAE,CAAC;gBAC/C,MAAM,CAAC,IAAI,CACT,4HAA4H,CAC7H,CAAC;YACJ,CAAC;YACD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,cAAc,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,sBAAsB,CAAC,CAAC,CAAC;YAClF,IAAI,cAAc,KAAK,CAAC,CAAC,EAAE,CAAC;gBAC1B,MAAM,CAAC,IAAI,CACT,4HAA4H,CAC7H,CAAC;YACJ,CAAC;iBAAM,IAAI,cAAc,GAAG,CAAC,EAAE,CAAC;gBAC9B,MAAM,CAAC,IAAI,CACT,mCAAmC,cAAc,GAAG,CAAC,sHAAsH,CAC5K,CAAC;YACJ,CAAC;YACD,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;YACxE,IAAI,OAAO,IAAI,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC5C,MAAM,CAAC,IAAI,CACT,8HAA8H,CAC/H,CAAC;YACJ,CAAC;YAED,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,MAAM,CAAC,MAAM,iDAAiD,EAAE,CAAC;YACjH,CAAC;YACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,uCAAuC,EAAE,CAAC;QACxE,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,KAAkB,EAAE,GAAkB,EAAE,SAAiB;IAC3F,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,eAAe,EAAE,CAAC;IAE1C,MAAM,qBAAqB,GAAG,KAAK,CAAC,UAAU;SAC3C,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;SACrF,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,MAAM,OAAO,GAAG,0BAA0B,qBAAqB,EAAE,CAAC;IAElE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,YAAY,CAAC;QAClC,KAAK,EAAE,GAAG;QACV,MAAM,EAAE,GAAG,mBAAmB,cAAc,OAAO,EAAE;QACrD,MAAM,EAAE,8EAA8E,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,mMAAmM;QAC/S,KAAK,EAAE;YACL,KAAK;YACL,UAAU,EAAE,mBAAmB,CAAC,SAAS,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC;YACpE,SAAS,EAAE,kBAAkB,CAAC,SAAS,CAAC;YACxC,WAAW,EAAE,oBAAoB,CAAC,SAAS,CAAC;YAC5C,SAAS,EAAE,kBAAkB,CAAC,8CAA8C,CAAC;SAC9E;QACD,QAAQ,EAAE,CAAC,WAAW,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC;KACtD,CAAC,CAAC;IAEH,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { type LanguageModel } from 'ai';
|
|
2
|
+
import type { DomainModel } from '../types.js';
|
|
3
|
+
export declare function runValidationAgent(llm: LanguageModel, domainModel: DomainModel, outputDir: string): Promise<string>;
|
|
4
|
+
//# sourceMappingURL=create-validation-agent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-validation-agent.d.ts","sourceRoot":"","sources":["../../../src/agents/create-validation-agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,aAAa,EAAe,MAAM,IAAI,CAAC;AAShF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAK/C,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,aAAa,EAClB,WAAW,EAAE,WAAW,EACxB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,CAAC,CA6BjB"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { generateText, hasToolCall, stepCountIs } from 'ai';
|
|
2
|
+
import { VALIDATION_SYSTEM_PROMPT } from '../prompts/validation-system.js';
|
|
3
|
+
import { createCheckImportsTool } from '../tools/check-imports.js';
|
|
4
|
+
import { createExitLoopTool } from '../tools/exit-loop.js';
|
|
5
|
+
import { createListFilesTool } from '../tools/list-files.js';
|
|
6
|
+
import { createReadFileTool } from '../tools/read-file.js';
|
|
7
|
+
import { createRunEslintTool } from '../tools/run-eslint.js';
|
|
8
|
+
import { createRunTscTool } from '../tools/run-tsc.js';
|
|
9
|
+
import { createWriteFileTool } from '../tools/write-file.js';
|
|
10
|
+
import { getSkillToolkit } from '../utils/create-skill-tool.js';
|
|
11
|
+
const SKILL_NAMES = ['redesign-existing-projects', 'react-doctor', 'web-design-guidelines'];
|
|
12
|
+
export async function runValidationAgent(llm, domainModel, outputDir) {
|
|
13
|
+
const { skill } = await getSkillToolkit();
|
|
14
|
+
const narrativeDescriptions = domainModel.narratives
|
|
15
|
+
.map((n) => `- ${n.name}: ${n.description || n.slices.map((s) => s.name).join(', ')}`)
|
|
16
|
+
.join('\n');
|
|
17
|
+
const domainHint = `\n\n## Domain Context\nThis is a "${domainModel.variant}" application with features:\n${narrativeDescriptions}\nWhen creating or fixing the landing page, write copy and choose icons specific to this domain. Do NOT use generic text like "Welcome to...".`;
|
|
18
|
+
const { text } = await generateText({
|
|
19
|
+
model: llm,
|
|
20
|
+
system: VALIDATION_SYSTEM_PROMPT + domainHint,
|
|
21
|
+
prompt: `Before starting, load these skills by calling the skill tool for each one: ${SKILL_NAMES.join(', ')}. These define mandatory rules you MUST follow.\n\nAfter loading all skills, run tsc and eslint to check for errors. Fix any issues found. Call exit_loop when both report 0 errors.`,
|
|
22
|
+
tools: {
|
|
23
|
+
skill,
|
|
24
|
+
run_tsc: createRunTscTool(outputDir),
|
|
25
|
+
run_eslint: createRunEslintTool(outputDir),
|
|
26
|
+
check_imports: createCheckImportsTool(outputDir),
|
|
27
|
+
write_file: createWriteFileTool(outputDir, { allowProtected: true }),
|
|
28
|
+
read_file: createReadFileTool(outputDir),
|
|
29
|
+
list_files: createListFilesTool(outputDir),
|
|
30
|
+
exit_loop: createExitLoopTool('Call this when both tsc and eslint report 0 errors. This signals the validation loop to stop.'),
|
|
31
|
+
},
|
|
32
|
+
stopWhen: [hasToolCall('exit_loop'), stepCountIs(15)],
|
|
33
|
+
});
|
|
34
|
+
return text;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=create-validation-agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-validation-agent.js","sourceRoot":"","sources":["../../../src/agents/create-validation-agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAsB,WAAW,EAAE,MAAM,IAAI,CAAC;AAChF,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAE7D,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAEhE,MAAM,WAAW,GAAG,CAAC,4BAA4B,EAAE,cAAc,EAAE,uBAAuB,CAAC,CAAC;AAE5F,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,GAAkB,EAClB,WAAwB,EACxB,SAAiB;IAEjB,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,eAAe,EAAE,CAAC;IAE1C,MAAM,qBAAqB,GAAG,WAAW,CAAC,UAAU;SACjD,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;SACrF,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,MAAM,UAAU,GAAG,qCAAqC,WAAW,CAAC,OAAO,iCAAiC,qBAAqB,gJAAgJ,CAAC;IAElR,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,YAAY,CAAC;QAClC,KAAK,EAAE,GAAG;QACV,MAAM,EAAE,wBAAwB,GAAG,UAAU;QAC7C,MAAM,EAAE,8EAA8E,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,sLAAsL;QAClS,KAAK,EAAE;YACL,KAAK;YACL,OAAO,EAAE,gBAAgB,CAAC,SAAS,CAAC;YACpC,UAAU,EAAE,mBAAmB,CAAC,SAAS,CAAC;YAC1C,aAAa,EAAE,sBAAsB,CAAC,SAAS,CAAC;YAChD,UAAU,EAAE,mBAAmB,CAAC,SAAS,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC;YACpE,SAAS,EAAE,kBAAkB,CAAC,SAAS,CAAC;YACxC,UAAU,EAAE,mBAAmB,CAAC,SAAS,CAAC;YAC1C,SAAS,EAAE,kBAAkB,CAC3B,+FAA+F,CAChG;SACF;QACD,QAAQ,EAAE,CAAC,WAAW,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC;KACtD,CAAC,CAAC;IAEH,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scaffold-agent.d.ts","sourceRoot":"","sources":["../../../src/agents/scaffold-agent.ts"],"names":[],"mappings":"AAGA,wBAAsB,WAAW,CAAC,IAAI,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAQlG"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { execaCommand } from 'execa';
|
|
2
|
+
import fs from 'fs-extra';
|
|
3
|
+
export async function runScaffold(opts) {
|
|
4
|
+
await fs.copy(opts.starterDir, opts.outputDir, {
|
|
5
|
+
overwrite: true,
|
|
6
|
+
filter: (src) => !src.includes('node_modules'),
|
|
7
|
+
});
|
|
8
|
+
await execaCommand('pnpm install --ignore-workspace --frozen-lockfile', { cwd: opts.outputDir });
|
|
9
|
+
return `Starter template copied to ${opts.outputDir}`;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=scaffold-agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scaffold-agent.js","sourceRoot":"","sources":["../../../src/agents/scaffold-agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AACrC,OAAO,EAAE,MAAM,UAAU,CAAC;AAE1B,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAA+C;IAC/E,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,EAAE;QAC7C,SAAS,EAAE,IAAI;QACf,MAAM,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC;KACvD,CAAC,CAAC;IACH,MAAM,YAAY,CAAC,mDAAmD,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;IAEjG,OAAO,8BAA8B,IAAI,CAAC,SAAS,EAAE,CAAC;AACxD,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { type Command, type Event } from '@auto-engineer/message-bus';
|
|
2
|
+
import type { DomainModel } from '../types.js';
|
|
3
|
+
export type GenerateReactAppCommand = Command<'GenerateReactApp', {
|
|
4
|
+
model?: DomainModel;
|
|
5
|
+
modelPath?: string;
|
|
6
|
+
graphqlSchema?: string;
|
|
7
|
+
outputDir: string;
|
|
8
|
+
}>;
|
|
9
|
+
export type ReactAppGeneratedEvent = Event<'ReactAppGenerated', {
|
|
10
|
+
outputDir: string;
|
|
11
|
+
narrativeCount: number;
|
|
12
|
+
sliceCount: number;
|
|
13
|
+
}>;
|
|
14
|
+
export type ReactAppGenerationFailedEvent = Event<'ReactAppGenerationFailed', {
|
|
15
|
+
error: string;
|
|
16
|
+
outputDir: string;
|
|
17
|
+
}>;
|
|
18
|
+
export type GenerateReactAppEvents = ReactAppGeneratedEvent | ReactAppGenerationFailedEvent;
|
|
19
|
+
export declare const commandHandler: import("@auto-engineer/message-bus").UnifiedCommandHandler<Readonly<{
|
|
20
|
+
type: string;
|
|
21
|
+
data: Readonly<Record<string, unknown>>;
|
|
22
|
+
timestamp?: Date;
|
|
23
|
+
requestId?: string;
|
|
24
|
+
correlationId?: string;
|
|
25
|
+
}>>;
|
|
26
|
+
export default commandHandler;
|
|
27
|
+
//# sourceMappingURL=generate-react-app.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-react-app.d.ts","sourceRoot":"","sources":["../../../src/commands/generate-react-app.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,OAAO,EAAwB,KAAK,KAAK,EAAE,MAAM,4BAA4B,CAAC;AAI5F,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAc/C,MAAM,MAAM,uBAAuB,GAAG,OAAO,CAC3C,kBAAkB,EAClB;IACE,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;CACnB,CACF,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG,KAAK,CACxC,mBAAmB,EACnB;IACE,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;CACpB,CACF,CAAC;AAEF,MAAM,MAAM,6BAA6B,GAAG,KAAK,CAC/C,0BAA0B,EAC1B;IACE,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB,CACF,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG,sBAAsB,GAAG,6BAA6B,CAAC;AAE5F,eAAO,MAAM,cAAc;;;;;;GAiFzB,CAAC;AAEH,eAAe,cAAc,CAAC"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
import { defineCommandHandler } from '@auto-engineer/message-bus';
|
|
5
|
+
import createDebug from 'debug';
|
|
6
|
+
import { runPipeline } from '../agents/create-pipeline.js';
|
|
7
|
+
import { createModel } from '../config.js';
|
|
8
|
+
import { parseModel } from '../utils/parse-model.js';
|
|
9
|
+
const debug = createDebug('auto:react-gen');
|
|
10
|
+
const resolveStarterPath = () => {
|
|
11
|
+
const currentDir = path.dirname(fileURLToPath(import.meta.url));
|
|
12
|
+
const packagePath = path.resolve(currentDir, '../../starter');
|
|
13
|
+
if (fs.existsSync(packagePath))
|
|
14
|
+
return packagePath;
|
|
15
|
+
const distPath = path.resolve(currentDir, '../../../starter');
|
|
16
|
+
if (fs.existsSync(distPath))
|
|
17
|
+
return distPath;
|
|
18
|
+
return packagePath;
|
|
19
|
+
};
|
|
20
|
+
export const commandHandler = defineCommandHandler({
|
|
21
|
+
name: 'GenerateReactApp',
|
|
22
|
+
displayName: 'Build Front End',
|
|
23
|
+
alias: 'build:frontend',
|
|
24
|
+
description: 'Generate a complete React application from a domain model using AI agents. Produces themed, routed, validated React + Vite + Tailwind app with shadcn/ui components.',
|
|
25
|
+
category: 'generate',
|
|
26
|
+
icon: 'layout',
|
|
27
|
+
fields: {
|
|
28
|
+
model: {
|
|
29
|
+
description: 'The domain model object (provide this or modelPath)',
|
|
30
|
+
},
|
|
31
|
+
modelPath: {
|
|
32
|
+
description: 'Path to the domain model JSON file (provide this or model)',
|
|
33
|
+
},
|
|
34
|
+
graphqlSchema: {
|
|
35
|
+
description: 'GraphQL schema string for the generated back end',
|
|
36
|
+
},
|
|
37
|
+
outputDir: {
|
|
38
|
+
description: 'Output directory for the generated React app',
|
|
39
|
+
required: true,
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
examples: ['$ auto build:frontend --model-path=./model.json --output-dir=./client'],
|
|
43
|
+
events: [
|
|
44
|
+
{ name: 'ReactAppGenerated', displayName: 'Front End Built' },
|
|
45
|
+
{ name: 'ReactAppGenerationFailed', displayName: 'Front End Build Failed' },
|
|
46
|
+
],
|
|
47
|
+
handle: async (command) => {
|
|
48
|
+
const { model: providedModel, modelPath, outputDir } = command.data;
|
|
49
|
+
if (providedModel === undefined && modelPath === undefined) {
|
|
50
|
+
throw new Error('Either model or modelPath must be provided');
|
|
51
|
+
}
|
|
52
|
+
debug('Generating React app: %s → %s', modelPath ?? '(model object)', outputDir);
|
|
53
|
+
try {
|
|
54
|
+
const resolvedOutput = path.resolve(outputDir);
|
|
55
|
+
const starterDir = resolveStarterPath();
|
|
56
|
+
debug('Starter path: %s', starterDir);
|
|
57
|
+
const model = providedModel ?? (await parseModel(path.resolve(modelPath)));
|
|
58
|
+
const narrativeCount = model.narratives.length;
|
|
59
|
+
const sliceCount = model.narratives.reduce((s, n) => s + n.slices.length, 0);
|
|
60
|
+
debug('Parsed model: %d narratives, %d slices', narrativeCount, sliceCount);
|
|
61
|
+
const llm = createModel();
|
|
62
|
+
debug('LLM: %s', process.env.CUSTOM_PROVIDER_DEFAULT_MODEL);
|
|
63
|
+
await runPipeline({
|
|
64
|
+
model,
|
|
65
|
+
llm,
|
|
66
|
+
starterDir,
|
|
67
|
+
outputDir: resolvedOutput,
|
|
68
|
+
});
|
|
69
|
+
debug('Pipeline complete → %s', resolvedOutput);
|
|
70
|
+
return {
|
|
71
|
+
type: 'ReactAppGenerated',
|
|
72
|
+
data: { outputDir: resolvedOutput, narrativeCount, sliceCount },
|
|
73
|
+
timestamp: new Date(),
|
|
74
|
+
requestId: command.requestId,
|
|
75
|
+
correlationId: command.correlationId,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
80
|
+
debug('Generation failed: %s', errorMessage);
|
|
81
|
+
return {
|
|
82
|
+
type: 'ReactAppGenerationFailed',
|
|
83
|
+
data: { error: errorMessage, outputDir },
|
|
84
|
+
timestamp: new Date(),
|
|
85
|
+
requestId: command.requestId,
|
|
86
|
+
correlationId: command.correlationId,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
},
|
|
90
|
+
});
|
|
91
|
+
export default commandHandler;
|
|
92
|
+
//# sourceMappingURL=generate-react-app.js.map
|