From criar-site
Generates a complete responsive site with AI-generated images and videos (Freepik API), applying universal design principles and one of 3 opinionated kits (Portfolio Editorial, Clínica Estética, Tech Apple-ish). Invoke via /criar-site or ask for a full landing page.
How this skill is triggered — by the user, by Claude, or both
Slash command
/criar-site:criar-siteThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Esta Skill cria um site completo (HTML + CSS + JS + assets de IA) a partir de um briefing do usuário, aplicando:
LESSONS.mdcomposer.pyhub.pyprompt_engineer.pyprompts/estilos/cinematic-density.mdprompts/principios/01-composicao.mdprompts/principios/02-tipografia.mdprompts/principios/03-cor.mdprompts/principios/04-movimento.mdprompts/principios/05-qualidade-ia.mdprompts/principios/06-ux-acessibilidade.mdprompts/principios/07-estrutura-site.mdprompts/principios/index.mdprompts/prompt-engineer/README.mdprompts/prompt-engineer/engine-image.mdprompts/prompt-engineer/engine-motion.mdprompts/prompt-engineer/kit-presets/clinica-estetica.mdprompts/prompt-engineer/kit-presets/portfolio-editorial.mdprompts/prompt-engineer/kit-presets/tech-apple.mdprompts/prompt-engineer/taxonomy.mdEsta Skill cria um site completo (HTML + CSS + JS + assets de IA) a partir de um briefing do usuário, aplicando:
prompts/principios/)templates/ — cada kit é um projeto Astro próprio com kit.config.ts definindo editáveis, variants e envelope de rejects. Os kits são: Portfolio Editorial, Clínica Estética, Tech Apple-isheditableTokens do kit escolhido)Usuário:
/criar-siteNão ativar automaticamente em pedidos parciais (ex: "gera só uma imagem"). Nesses casos, usar hub.py diretamente.
.env na raiz do projeto contém FREEPIK_API_KEY válidapip install -r requirements.txt a partir da raiz da skill)prompts/principios/ existem (index + 01-07)templates/:
templates/portfolio-editorial/ (kit 1 — grotesque condensada + 1 accent saturada + ritmo declarativo)templates/clinica-estetica/ (kit 2 — serif expressiva + muted quente + retratos + ornamentos orgânicos)templates/tech-apple/ (kit 3 — sans geométrica bold + produto flutuante + light/dark variant)kit.config.ts com editableTokens, componentVariants e rejectsnode --version)Se algum pré-requisito falhar, abortar com mensagem clara e orientação.
Fase 1 — Identidade do projeto (as 3 perguntas juntas):
Fase 2 — Estrutura e estética (após resposta da Fase 1):
4. Seções desejadas (propor set padrão baseado no propósito; usuário ajusta) — OU usuário pede "sugira"
5. Referências visuais (visualRefs) — pedir ao usuário que cole caminhos locais ou URLs de 2 a 6 imagens que representam o território estético desejado. Papel duplo dessas refs:
reference_images no payload Freepik durante a geração (Etapa 5). Nano Banana aceita image refs nativamente.briefing.json no campo visualRefs.Classificação interna do DNA (NÃO exposta ao usuário em vocabulário de kit):
rejects de cada preset vira sinal advisory, não bloqueio: se o conflito pode ser resolvido por mistura consciente, prossegue.Traduzir a classificação pra linguagem de marca (exposta ao usuário):
"Pelas refs e o briefing, vejo um studio editorial com paleta autoral warm — estrutura gráfica bold dialoga com fotografia de materialidade natural. Tipografia grotesque condensada + paleta cream/wood/terracotta + retratos humanos em contexto de material."
Parâmetros específicos do projeto (expostos como escolhas criativas, não tokens de kit):
Fase 2.5 — Ancoragem conceitual (sub-perguntas específicas ao tipo de projeto):
feedback_ancoragem_conceitual.md em memory pra templates por tipo de projetoFase 3 — Modo de geração + Orçamento + Assets (eu proponho, usuário aprova):
Fase 3.0 — Modo de geração (PERGUNTA ANTES DE QUALQUER ESTIMATIVA DE CUSTO):
"Como você prefere gerar as imagens/vídeos do site?
(A) Modo API — você linka sua API de geração (Freepik, etc) e eu gero automaticamente em paralelo. Mais rápido, mas precisa de chave configurada.
(B) Modo Manual — eu te entrego os prompts técnicos já finalizados + specs (aspect ratio, modelo sugerido, negative prompt); você gera externamente na plataforma que preferir (web UI Freepik, MidJourney, DALL-E, etc) e me devolve as imagens. Continuo o fluxo a partir daí."
hub.has_api_key()). Se sim, prosseguir. Se não, orientar a colar no .env na raiz do projeto.Fase 3.1 — Proposta de assets: 7. Com base em TUDO coletado (incluindo ancoragem), proponho lista concreta de assets: quantidade + tipos + modelos sugeridos + aspect ratios + descrições específicas. Em modo manual, sugerir o modelo ainda é útil — orienta o usuário na plataforma externa.
Fase 3.2 — Orçamento estimado:
8. Apresento custo estimado consolidado (hub.orcamento_lote). Em modo manual, o custo é referência — usuário paga diretamente na plataforma dele, não pela nossa API. Mesmo assim mostrar pra ele saber o tamanho do comprometimento.
Fase 3.3 — Aprovação: 9. Usuário aprova, ajusta (adicionar/cortar, trocar modelo), ou cancela.
Importante sobre vídeos: quantidade decidida aqui, mas vídeos só são gerados APÓS aprovação das imagens-base (ver Etapa 7). Cf. feedback_video_apos_imagem.md.
Salvar briefing completo em sites/{slug-do-projeto}/briefing.json ao fim da Fase 3.
Ler apenas os arquivos necessários pra economizar contexto:
prompts/principios/index.md (sempre — traz princípios-tótem)prompts/principios/01-composicao.mdprompts/principios/07-estrutura-site.mdprompts/principios/05-qualidade-ia.mdtemplates/{kit-escolhido}/kit.config.ts (editableTokens + componentVariants + rejects + structuralDefaults)templates/{kit-escolhido}/src/components/sections/ — inventário de seções disponíveis no kitPrincípios de tipografia, cor, movimento e UX serão carregados sob demanda durante etapas específicas (ex: tipografia na Etapa 8 ao gerar tokens).
Com base em briefing + princípios + vocabulário do kit escolhido, produzir plano estrutural:
templates/{kit}/src/components/sections/ (não inventar seções fora do inventário do kit)Hero variant="monumental-word" no Portfolio)Default sensato: seguir kit.config.ts.structuralDefaults.sectionOrder como ponto de partida. O briefing customiza — não reinventa.
Gate de confirmação: mostrar plano ao usuário em tabela clara (coluna "Componente" ao lado de "Seção"). Aguardar aprovação ou ajuste antes de seguir.
Para cada asset identificado no plano, perguntar ao usuário (obrigatório, sem defaults silenciosos):
1:1, 2:3, 3:2, 4:3, 3:4, 5:4, 4:5, 16:9, 9:16, 21:9)gemini-2-5-flash-image-preview / nano-banana-pro-1k|2k|4k / nano-banana-pro-flash-1k|2k|4kseedance-lite-720p|1080p / seedance-pro-720p|1080pSugerir padrão sensato por tipo de asset, mas sempre confirmar com usuário.
prompt-engineerPrompts não são mais montados inline nesta etapa. Toda geração passa pelo módulo prompts/prompt-engineer/ (relativo à raiz da skill) — ver prompts/prompt-engineer/README.md.
Pipeline obrigatório por asset:
Carregar kit preset — ler prompts/prompt-engineer/kit-presets/{kit-escolhido}.md e extrair o preamble formal + specs técnicas (câmeras, lentes, luz baseline, grain profile, palavras-âncora, rejects).
Destilar ficha estética a partir do briefing:
visualRefs paths (da Fase 2)Invocar engine correspondente:
hub.render_image(asset, kit, brief, visualRefs)hub.render_motion(asset, kit, brief, motion, sourceImage) — vídeo só depois da imagem-base aprovada (regra de ouro)"Use the reference images only as aesthetic, compositional, and visual-aspect references to generate the following image:" quando visualRefs.length > 0, e cospe (prompt, negative) prontos pra API.Salvar prompts gerados em sites/{projeto}/prompts-gerados/{asset-name}.txt pra rastreabilidade.
Validar densidade técnica — se o engine retornar prompt abaixo da régua (sem os 11 eixos preenchidos, sem HEX na paleta, sem câmera/lente declarada, com adjetivo banido), regenerar. Máx 2 retries antes de pedir ajuste ao usuário.
Validação de limite: cada prompt deve caber em 3000 chars antes do hub.py comprimir. Tamanho alvo do engine: 400-900 palavras pra imagem, 300-700 pra motion.
Régua mínima: nenhum prompt cai abaixo da densidade das refs visuais em ref-prompt-engeneer/IMAGENS/. Se cair, o engine falha visivelmente — não mascarar com retry genérico.
Chamar hub.orcamento_lote() com lista completa. Apresentar:
┌─────────── ORÇAMENTO DO SITE ───────────
│ {Nome do projeto}
├──────────────────────────────────────────
│ [breakdown detalhado por asset]
├──────────────────────────────────────────
│ TOTAL ESTIMADO: $X.XXXX
│ Gasto acumulado histórico: $Y.YYYY
│ Saldo free tier restante: ~$Z.ZZZZ
└──────────────────────────────────────────
Confirma gerar? [s/N]
Se usuário recusar:
Ramifica conforme o modo declarado na Fase 3.0:
hub.gerar_imagem() ou hub.gerar_video() com pular_confirmacao=True (já autorizado no orçamento consolidado).{path, seed, task_id, custo_real}.Gravar pacote de prompts em sites/{projeto}/prompts-gerados/ — um .txt por asset, cada arquivo contém:
id do assetaspect_ratio finalmodelo sugerido (apenas referência, usuário pode usar outro)PROMPT (bloco corrido em inglês técnico, com prefixo obrigatório se há visualRefs)NEGATIVE (string de proibições)visualRefs (paths relativos pra sites/{projeto}/refs/) que devem ser anexadas externamente, se a ferramenta suportar.Entregar ao usuário uma tabela-guia com: id · aspect · modelo sugerido · refs a anexar · caminho do .txt pra copiar-e-colar.
Aguardar o usuário subir os arquivos gerados — pedir que ele crie uma pasta, gere externamente (Freepik web, MidJourney, DALL-E, etc), e coloque as imagens com nome idêntico ao id do asset (ex: 01-hero.png, 02-still.png).
Ao receber os arquivos: validar que todos os ids esperados estão presentes. Mover pra sites/{projeto}/public/assets/ com nomes limpos. Registrar no seeds.json com source: manual (não tem task_id nem seed da nossa API — anotar a ferramenta usada se o usuário quiser rastrear).
Validar densidade técnica visualmente (o Claude lê as imagens recebidas e checa: paleta bate com briefing? composição editorial? materialidade densa? Se qualquer asset cai abaixo da régua, pedir regeneração externa com ajuste no prompt).
Seguir pra Etapa 8 (assembly) igual ao modo API.
Importante — vídeo em modo manual: o briefing pode incluir vídeos, mas só entregamos prompt de vídeo depois da imagem-base ser aprovada (regra inviolável). Em modo manual, isso significa: fluxo de 2 rodadas — primeiro recebe as imagens, aprova, depois entrega prompts de vídeo, usuário gera externamente, sobe os arquivos.
Princípio-tótem (Fase 2 da skill): cada kit é uma matriz estética abstrata. Cada briefing cunha um template-instância único combinando matrizes em proporção. Não há mais clone-de-template — há síntese pelo composer.py.
O briefing produz um JSON conforme templates/_shared/briefing-schema.ts declarando:
matrix.primary — define ANATOMIA (componentes principais)matrix.secondary / tertiary — opcionais, contribuem com ingredientestokens.{palette, typography, spacing, motion, radius} — cada um vem de uma das 3 matrizes (mix livre)slots — dados pra cada seção principal (header, hero, pitch, grid, cta, footer, gallery)signatureSlots — opt-in de elementos signature (marquee, testimonials, specs, ornament) de qualquer matrizassetInventory — quantidade real de projetos/assets pra ajustar layout (single-feature vs grid)Composer orquestra:
from composer import compose_site, report_composition
print(report_composition(briefing)) # mostra ao usuário a síntese
out = compose_site("sites/<slug>/briefing.json")
O composer:
sites/<slug>/package.json, astro.config.mjs, tsconfig.json, public/ da matriz primarysrc/ da primary (BaseLayout + components + scripts + styles base)src/styles/tokens.css com a composição mixada (5 token modules das matrizes escolhidas, dentro de um único @theme {})briefing.json + .composer-meta.json no projeto pra rastreabilidadeApós o composer:
src/pages/index.astro referenciando os componentes copiados, ordem definida em briefing.sectionOrder, props vindas dos briefing.slots. Cada seção é um componente da matriz primary (ou signature opt-in) com props traduzidas.<title>, <meta description>, OG tags, sitemap, robots).06-ux-acessibilidade.md): WCAG AA, touch ≥ 44px, focus-visible, alt text.Validação anti-drift:
tokens.css final só tem propriedades dos 5 módulos selecionados (sem custom properties órfãs).index.astro só importa de @components/ da matriz primary OU de signatures explicitamente opt-in.kit.config.ts da matriz primary não foi violado (rejects continuam advisory, mas se algum bloqueio duro aparecer, parar).Com todos os assets baixados:
Copiar kit escolhido de templates/{kit}/ → sites/{projeto}/
kit.config.ts, src/**/*, public/**/*, package.json, astro.config.mjs, tsconfig.json, .gitignorenode_modules/, dist/, .astro/Sobrescrever src/styles/tokens.css com overrides do briefing:
kit.config.ts.editableTokens podem ser sobrescritosaccent: 'cadmium-red', pegar hex de editableTokens.accent.presets[name='cadmium-red'].valueeditableTokens.displayFont.options[choice].stack e substituir --font-display03-cor.md (máx 4 cores ativas, contraste WCAG AA), 02-tipografia.md (base 16, razão modular do kit), 04-movimento.md (múltiplos de 200ms)Atualizar BaseLayout.astro se briefing trocou fonts:
<link href="https://fonts.googleapis.com/css2?family=..."> com TODAS as options do kit pré-carregadas. Normalmente não precisa trocar.Compor src/pages/index.astro com as seções do plano:
@components/sections/variant quando o componente aceita (ex: <Hero variant="monumental-word" word="BRAND" ... />)public/assets/Gerar metadata:
<title> + <meta description> únicos derivados do briefingsitemap.xml + robots.txtExecutar checklist final (de 06-ux-acessibilidade.md):
--color-ink vs --color-bg do kit + accent vs bg quando accent é CTA)global.css do kit já tem :focus-visible com accent)Validação anti-drift (executar ao final da Etapa 8):
tokens.css final não tem cor fora de editableTokens.*.presets nem fonts fora de editableTokens.*.optionsindex.astro só importa de @components/sections/ e @components/base/ do kitcomponentVariantsDois sites com o mesmo kit precisam parecer distintos visualmente. Garantir ao menos 2 destes dimensões diferentes entre dois briefings do mesmo kit:
structuralDefaults.sectionOrder é sugestão, não camisa)Se um novo briefing coincide com um site anterior em mais de 3 dimensões, forçar divergência no briefing.
cd sites/{projeto}/ && npm install && npm run devhttp://localhost:4321custos.log)sites/{projeto}/seeds.jsonnpm run build)sites/{slug-projeto}/
├── briefing.json (Etapa 1)
├── plano-arquitetura.json (Etapa 3)
├── prompts-gerados/ (Etapa 5)
│ └── {asset-name}.txt
├── seeds.json (Etapa 7)
├── public/assets/ (Etapa 7 — mídia gerada)
│ ├── hero.png
│ ├── bg-loop.mp4
│ └── ...
├── src/ (Etapa 8 — Astro)
│ ├── pages/index.astro
│ ├── components/
│ ├── layouts/
│ └── styles/tokens.css
├── package.json
└── astro.config.mjs
Consolidadas das memórias de feedback do projeto. Todas inviolaveis — quando em conflito, vence a regra mais alta.
custos.log (JSONL).kit.config.ts, envelope, rejects, taxonomy, preamble, 11 eixos — tudo isso é vocabulário do sistema, não da conversa. Usuário vê narrativa de marca, nunca arquitetura do módulo.primary + secondary + proporção (ex: 80% Editorial + 20% Clínica). rejects viram sinais advisory, não bloqueios.<h1> em CSS absolute sobre a imagem.ref-prompt-engeneer/IMAGENS/). Régua invisível de qualidade técnica. Nunca vira input de API. Nunca é referência de estilo.visualRefs do briefing. Uploadadas pelo usuário por projeto. Entram como reference_images na API Freepik + alimentam destilação do briefing.Use the reference images only as aesthetic, compositional, and visual-aspect references to generate the following image: — senão Nano copia demais a ref.| Erro | Causa provável | Ação |
|---|---|---|
400 prompt >3000 chars | Prompt ultrapassou limite | Wrapper comprime automaticamente (drops Narrative tone, depois trim de clausulas redundantes) |
400 aspect_ratio inválido | Formato errado (ex: widescreen_16_9) | Usar formato X:Y (ex: 16:9) |
402 / 403 / 429 free tier | Free tier esgotado | Pausar execução, reportar link do billing, não retry automático |
Seedance duration rejeitado | Só aceita 5 ou 10 | hub.py valida antes do POST |
| Geração genérica | Prompt insuficientemente técnico | Regenerar com mais specs (câmera, lente, luz, HEX); máx 2 retries |
| Tipografia hero malformada | Nano ignora texto em fotografia densa | Gerar hero sem tipo embutido, aplicar via CSS absolute no Astro |
| Pattern tile tipográfico deformado | Nano erra letterform + opacity | Gerar via SVG/CSS, não via Nano |
| Ref visual copiada (Nano) | Faltou prefixo obrigatório | Sempre iniciar prompt com "Use the reference images only as aesthetic..." |
| Placeholder vazio em work grid | Briefing tem menos projetos reais que o grid | Trocar layout pra single-feature ou 2-col, adaptar ao inventário |
| Download do asset falha | Rede / URL expirada | Retry 3x com backoff exponencial, depois reportar |
| Modelo rejeita conteúdo | Violação de política Freepik | Reportar ao usuário + pedir ajuste de prompt |
| Vite bloqueia tunnel host | server.allowedHosts restritivo | Adicionar em astro.config.mjs → vite.server.allowedHosts: ['.trycloudflare.com'] |
hub.pycustos.log (JSONL)prompts/principios/index.mdtemplates/portfolio-editorial/ + kit.config.tstemplates/clinica-estetica/ + kit.config.tstemplates/tech-apple/ + kit.config.tsGuides collaborative design exploration before implementation: explores context, asks clarifying questions, proposes approaches, and writes a design doc for user approval.
Creates structured, bite-sized implementation plans from specs or requirements before writing code. Useful for breaking down multi-step tasks into testable steps with file structure and task boundaries.
Resolves in-progress git merge or rebase conflicts by analyzing history, understanding intent, and preserving both changes where possible. Runs automated checks after resolution.
npx claudepluginhub humanstudioacademy/skills --plugin criar-site