Para agentes de IA
Uma IA que não conhece a biblioteca escreve um date picker do zero, inventa uma classe vermelha para
erro e ordena a tabela no cliente. Dois arquivos resolvem isso sem você explicar de novo a cada conversa: a
referência completa em texto puro e três linhas no AGENTS.md do seu projeto.
llms.txt
A API inteira num arquivo de texto, feito para ser lido por modelo e não por gente. Aponte a IA para ele:
https://juniorcarlini.github.io/tucano/llms.txt
Primeiro vem uma seção por componente, com o caminho declarativo por data-*, que é o normal num projeto
Django. Depois, a referência completa: seletor, atributos, todas as opções com o comentário que as explica,
métodos, eventos, classes CSS e tokens. Essa parte é gerada do código a cada build — se uma opção não está lá,
ela não existe. No fim ficam as regras do que não fazer.
Toda página deste site anuncia o arquivo no <head>, para ferramenta que procura por ele:
<link rel="alternate" type="text/plain" href="https://juniorcarlini.github.io/tucano/llms.txt">Por que texto puro, e não esta documentação
Uma página de docs traz menu, demonstração e script junto com a informação, e a IA gasta contexto lendo o que não serve. O llms.txt é só a API, na ordem em que se usa, e cabe inteiro numa conversa.
AGENTS.md no seu projeto
Cole isto no AGENTS.md da raiz do projeto que usa a Tucano — ou no CLAUDE.md, no
.cursorrules, onde a sua ferramenta procurar. É o que faz a IA escolher a biblioteca em vez de
escrever um componente do zero.
## Interface
Este projeto usa a Tucano. Não escreva do zero date picker, select com busca, color picker, upload, máscara, toast, tooltip, modal, gaveta, acordeão, abas, menu suspenso, tabela, paginação nem editor de texto.
Referência completa: https://juniorcarlini.github.io/tucano/llms.txtA lista nomeia os componentes com JavaScript, que são os que uma IA mais reescreve. As peças que são só classe —
botão, aviso, etiqueta, carregando, linha do tempo, caixa, opção e chave, menu lateral, rótulo e campo de formulário —
estão no mesmo llms.txt, e a regra "não desenhe um segundo botão" cobre o resto.
Três linhas bastam porque o trabalho está no link. Se quiser que a IA acerte já na primeira resposta, sem abrir a referência, acrescente os exemplos que o seu projeto mais usa:
## Interface
Este projeto usa a Tucano. Não escreva do zero date picker, select com busca, color picker, upload, máscara, toast, tooltip, modal, gaveta, acordeão, abas, menu suspenso, tabela, paginação nem editor de texto.
Referência completa: https://juniorcarlini.github.io/tucano/llms.txt
<input data-tuc-datepicker data-mode="range">
<select data-tuc-select multiple>
<input data-tuc-mask="cpf-cnpj">
<input type="file" data-tuc-upload>
<button data-tuc-tip="..." class="tuc-btn is-primary">
Tucano.toast.success('Salvo');
await Tucano.confirm({ title: 'Excluir?' });
Tucano.drawer({ title: 'Filtros', side: 'right' });
O elemento nativo continua dono do valor: name, required e getlist() do Django seguem funcionando. Não substitua por estado só em JS.E o AGENTS.md da Tucano
O AGENTS.md do repositório é para
quem vai mexer no código da própria biblioteca: como rodar, a estrutura e as decisões que não devem ser
revertidas sem motivo, cada uma com o defeito que a motivou. Para usar a Tucano num projeto, ele não é
necessário — o llms.txt é.
O que a IA não deve fazer
São as regras que fecham o llms.txt. Cada uma existe porque é o erro que um modelo comete
quando deduz em vez de ler.
| Não faça | Faça | Por quê |
|---|---|---|
| Escrever date picker, select com busca ou color picker do zero | Marcar o campo com data-tuc-datepicker, data-tuc-select, data-tuc-color | É o que a biblioteca existe para evitar |
| Usar a API em JavaScript por hábito | Preferir os data-*; JS só para opção que não existe como atributo — disabledDates, presets próprios, onChange | Atributo funciona no template, sobrevive ao HTMX e dispensa script |
Remover o <select> nativo ou o name do input | Deixar o elemento nativo no formulário | É nele que o valor vive: required e getlist() dependem dele |
Estilizar as classes internas .tuc-*__* | Sobrescrever as variáveis --tuc-* em :root | As classes internas são montadas pelo script e o desenho sai dos tokens |
Escrever abrir(), tamanho, 'direita' | open/close/toggle, size, tone, side, items, actions; valores 'left', 'right', 'danger', 'success' | A API é toda em inglês, e opção desconhecida é ignorada em silêncio |
| Ordenar no cliente uma lista paginada | Deixar o cabeçalho ser o <a> para ?sort= e ?dir=, com a ordem no order_by() antes do Paginator | Ordenar a página da tela produz uma ordem falsa. data-sort-mode="client" só para tabela pequena e sem paginação |
| Inventar classe vermelha para campo com erro | aria-invalid="true" no campo e a mensagem em .tuc-error | É o atributo que o leitor de tela anuncia, e o Django 5 já o escreve |
| Abrir painel quando o campo recebe foco | Deixar abrir por ↓, Espaço, clique; Enter também no select | É a regra do <select> nativo e do ARIA APG |
Esquecer o hidden no painel do dropdown escrito no template | <div class="tuc-dropdown" id="..." hidden> | Sem ele o menu aparece no meio da página até o script rodar. O <dialog> do modal e da gaveta não precisa |
| Desenhar um segundo botão | .tuc-btn com is-outline, is-ghost, is-icon, is-sm — inclusive dentro de tabela | Classe própria só para posicionar |
| Escrever o placeholder de campo com máscara | Deixar vazio | Ele sai do formato: data-tuc-mask="cpf" já nasce com 000.000.000-00, e data-tuc-mask="brl" com R$ 0,00 |
Carregar do CDN com @latest | Prender a versão: tucano@v0.37.2 | O jsDelivr guarda @latest em cache por muito tempo e serve build antigo sem avisar |
Importar de tucano pelo npm e esperar que os campos se montem | Tucano.init(document), ou importar tucano/auto | Pelo npm o auto-init não vem junto, para o empacotador levar só o que foi importado; o tucano/auto inicializa e escuta o HTMX como o script do CDN |
Ler e.target.name no tucano:change do date picker | e.detail.iso, ou o <input type="hidden"> ao lado | O date picker move o name para o hidden com o valor ISO; o campo visível fica sem nome. No select, na máscara e no upload o name continua no alvo |
| Escrever validação de CPF, formatação de moeda ou de data à mão | Tucano.mask, Tucano.dates e Tucano.color | São os mesmos módulos que os componentes usam, expostos como API: validateCpfCnpj, applyCurrency, format, parseUserInput, isDark |
| Montar um aviso flutuante próprio para o retorno do servidor | As messages do Django em <div data-tuc-toast>, ou o cabeçalho HX-Trigger com tucano:toast | O toast já cuida de pilha, pausa no foco e das regiões que o leitor de tela anuncia; o evento do HTMX é escutado sozinho |
Publicar o que veio do editor com |safe direto | Sanitizar no servidor antes | A peneira do editor protege o editor, não a publicação |
Esperar que HTML inserido por fetch ou innerHTML se inicialize sozinho | Chamar Tucano.init(node) no trecho novo | O automático cobre o load e cada htmx:afterSwap; outro caminho de inserção a biblioteca não vê |
Remover data-tuc-ready | Deixar o atributo | É ele que impede o autoInit de montar o mesmo campo duas vezes |
Na dúvida, a referência gerada manda
Se um exemplo em prosa e a "Referência completa" do llms.txt discordarem, vale a referência: ela é extraída do código a cada build. Peça à IA para copiar o exemplo de cada seção em vez de deduzir, e para conferir cada opção nessa lista.