← Voltar ao blog

IA & Agentes

GitHub Copilot a fundo [1] - AGENTS.md e custom instructions: ensinando as regras do seu repo

GitHub Copilot in depth [1] - AGENTS.md and custom instructions

GitHub Copilot a fundo [1] - AGENTS.md e custom instructions: ensinando as regras do seu repo

Fala dataholics, hoje começa série nova por aqui: GitHub Copilot a fundo. Eu já tinha falado dele na série do ecossistema de Copilots, só que ali foi sobrevoo e ficou faltando justamente a parte que muda o resultado no dia a dia, que é como você configura esse bicho. Vamos começar pelo básico que quase ninguém faz bem feito: ensinar as regras do seu repositório pro agente.

O que veremos nesse post:

  • Por que o Copilot entrega código com cara de outro projeto

  • AGENTS.md, o arquivo que virou padrão de mercado

  • copilot-instructions.md e as instruções por pasta

  • Onde cada arquivo funciona (a matriz que ninguém lê)

  • O que escrever e o que NÃO escrever ali dentro


O problema real

Você pede pro Copilot criar um endpoint novo e ele volta com requests quando o projeto todo usa httpx, escreve teste em unittest quando o repo é pytest inteiro, e ainda inventa uma pasta que não existe. Aí o pessoal culpa o modelo, troca pro modelo mais caro e o resultado continua torto, porque o problema não estava no modelo e sim no fato de que ninguém contou pro agente como esse projeto funciona.

Um dev novo no time recebe onboarding, lê o README, pergunta no Teams e em dois dias já escreve no padrão. O agente entra no repo sem nada disso e tem que adivinhar pelo que consegue ler no contexto daquela requisição, então ele adivinha pela média da internet e a média da internet não é o seu time.


AGENTS.md, o padrão que pegou

O jeito mais direto de resolver é um AGENTS.md na raiz do repositório. Ele nasceu como convenção aberta e hoje é lido por GitHub Copilot, Claude Code, Cursor, Gemini CLI e mais um monte de ferramenta, ou seja, você escreve uma vez e serve pro time inteiro mesmo que cada um use um agente diferente. Isso na prática é ótimo, porque acabou aquela briga de "eu uso outra ferramenta, não vou manter o arquivo de vocês".

E tem um detalhe bacana: dentro do AGENTS.md você pode usar @ seguido de um caminho relativo pra incluir outro arquivo, então dá pra manter o arquivo principal enxuto e apontar pros documentos que já existem no repo.

# AGENTS.md

## Stack
Python 3.12, FastAPI, httpx, pytest. Sem requests, sem unittest.
Package manager: uv (nunca pip install direto).

## Comandos
uv sync
uv run pytest -q
ruff check . --fix

## Estrutura
app/routers/   endpoints
app/services/  regra de negocio
app/repo/      acesso a dados (nada de SQL fora daqui)

## Convencoes
Nome de funcao em snake_case, sem abreviacao.
Toda funcao publica com type hint e docstring de uma linha.

Detalhes de deploy: @docs/deploy.md

Reginaldo, e se eu já tenho um CLAUDE.md aqui no projeto?

Boa, esse caso é comum e resolve fácil, porque o Copilot trata AGENTS.md, CLAUDE.md e GEMINI.md como o mesmo tipo de instrução de agente. Você não precisa manter três arquivos duplicados brigando entre si, escolhe um como fonte da verdade e deixa os outros só apontando pra ele com o @caminho.


copilot-instructions.md e as instruções por pasta

Do lado específico do Copilot existem dois arquivos que valem conhecer. O primeiro é o .github/copilot-instructions.md, que é a instrução do repositório inteiro e é o arquivo com maior cobertura de todos, funciona em praticamente toda superfície do Copilot. O segundo é o .github/instructions/*.instructions.md, que é onde a coisa fica interessante, porque ele aceita um applyTo no frontmatter e só entra em cena quando o agente mexe naquele caminho.

---
applyTo: "app/repo/**/*.py"
---

Nessa pasta a regra e diferente:
- Nunca montar SQL por concatenacao de string, sempre parametro.
- Toda query nova precisa de um teste em tests/repo.
- Retornar dataclass, nao dict solto.

Isso resolve o problema clássico do arquivo único gigante. Em vez de escrever "quando você estiver na camada de dados faça X, quando estiver no front faça Y" e rezar pro modelo lembrar disso lá no fim de um prompt de 400 linhas, você fatia a regra por pasta e o agente só carrega o que interessa pro arquivo que ele está tocando. Menos contexto queimado e regra mais respeitada.


Onde cada arquivo funciona

Esse é o ponto que gera mais confusão, porque nem todo arquivo é lido em toda superfície. A documentação tem essa matriz e vale colar aqui, porque tem gente configurando instrução por pasta e reclamando que o chat do github.com ignora, quando na verdade ele nem suporta.

  • .github/copilot-instructions.md: funciona em tudo, chat do github.com, VS Code, cloud agent, code review e CLI.

  • *.instructions.md com applyTo: VS Code, cloud agent, code review e CLI. NÃO vale no chat do github.com.

  • AGENTS.md, CLAUDE.md, GEMINI.md: VS Code, cloud agent, code review e CLI. Também fica de fora do chat do github.com.

  • Instruções pessoais em ~/.copilot/: chat do github.com e CLI, e como o nome diz, valem só pra você.

  • Instruções de organização (configuradas no settings da org, não em arquivo): chat do github.com, cloud agent e code review.

DETALHE IMPORTANTE: essas camadas somam, elas não se substituem. Se a org define uma regra e o repo define outra, as duas chegam no agente, e se elas se contradizem o resultado fica na sorte. Vale combinar com o time o que é regra de org (segurança, licença, o que nunca pode) e o que é regra de repo (stack, comando, estrutura).


O que escrever e o que deixar de fora

O que funciona de verdade é informação que o agente não consegue deduzir sozinho e que ele erraria se tentasse: stack com versão, gerenciador de pacote, comando de build e de teste, layout de pastas, convenção de nome e as proibições explícitas do tipo "não use tal lib". Comando de teste é o que dá mais retorno por linha escrita, porque o agente que sabe rodar o teste se corrige sozinho e devolve código que já passou.

O que não funciona é transformar o arquivo em manifesto. Já vi arquivo de instrução com a história da empresa, o organograma e o code of conduct, e eu acho isso pior do que não ter arquivo, porque todo request paga o custo desse contexto e o agente dilui a regra que importa no meio da prosa. Meu jeito de fazer: arquivo raiz curto, do tamanho de um README de projeto pequeno, e o resto fatiado com applyTo.

Uma coisa que eu ainda não tenho medição bonita pra mostrar, mas que sinto no uso: depois que você coloca comando de teste e as proibições explícitas, cai muito o retrabalho de review. Não é que o agente virou sênior, é que ele parou de errar as coisas bobas.


RESUMO

  • AGENTS.md na raiz: padrão aberto, serve pro Copilot e pros outros agentes, aceita @caminho pra incluir arquivo.

  • .github/copilot-instructions.md: instrução do repo com a maior cobertura de superfícies.

  • .github/instructions/*.instructions.md com applyTo: regra por caminho, o recurso mais subutilizado dos três.

  • Camada pessoal e camada de organização existem e somam com as do repo.

  • Escreva stack, comandos, estrutura e proibições. Deixe de fora manifesto e história da empresa.

No próximo post da série a gente sobe um degrau e vai pra Agent Skills, que é quando você quer que o agente carregue um conhecimento mais pesado só na hora que precisa dele, sem pagar contexto o tempo todo. Comenta aí se você já tem AGENTS.md nos seus repos ou se o Copilot ainda está adivinhando.

Referências:

https://docs.github.com/en/copilot/reference/custom-instructions-support

https://docs.github.com/copilot/customizing-copilot/adding-custom-instructions-for-github-copilot

Fique bem e até a próxima.

#githubcopilot #agentsmd #copilot #ia #agentes #datainaction

#githubcopilot#agentsmd#copilot#ia#agentes#datainaction

Gostou? Tem mais no YouTube e no LinkedIn.

← Voltar ao blog