Olá! Bem-vindo à nossa quarta lição do Módulo 8.
Na aula anterior, estabelecemos um método para consolidar todas as alterações de código e banco de dados em um "conjunto de alterações lógicas". Vimos como usar git worktrees para criar um workspace unificado e isolado para cada tarefa do Jira, permitindo que o nosso agente orquestre as modificações em múltiplos repositórios (backend-repo, frontend-repo, etc.) de forma segura. No final da lição, tínhamos todos os arquivos gerados nos lugares certos, mas como alterações ainda não versionadas.
Nesta lição, vamos dar o passo seguinte e crucial: transformar essas alterações em commits e, finalmente, em Pull Requests no GitHub. Focaremos no resultado de aprendizagem: usar as ações do GitHub previamente definidas para criar branches, fazer commit de todas as alterações e abrir pull requests em todos os repositórios relevantes. Este é o momento em que o trabalho do agente se torna visível e é formalmente entregue para revisão humana, replicando um passo fundamental do fluxo de trabalho de qualquer desenvolvedor.
1. A Anatomia de um Commit Automatizado
Antes de criar um Pull Request, precisamos entender como o Git representa as alterações. Um Pull Request é simplesmente um pedido para mesclar uma branch em outra. Portanto, nosso primeiro trabalho é criar essa branch com nossos commits.
Fazer um commit via API não é um único comando. Envolve a recriação dos objetos fundamentais do Git:
- Blobs: O conteúdo de cada arquivo alterado é salvo como um objeto "blob".
- Tree: A estrutura de diretórios do repositório é representada por um objeto "tree", que aponta para os blobs (arquivos) e outras árvores (subdiretórios). Para o nosso commit, criamos uma nova árvore que reflete o estado do repositório após nossas alterações.
- Commit: Um objeto "commit" é criado, apontando para a nova árvore e para o commit "pai" (o último commit da branch base). Ele também contém a mensagem do commit, o autor, etc.
- Reference: Finalmente, uma "referência" (como
refs/heads/feature/PROJ-123) é criada ou atualizada para apontar para o nosso novo objeto de commit. Este passo é o que efetivamente "cria" ou "empurra" a branch.
Este processo de baixo nível nos dá controle total, que é exatamente o que um agente autônomo precisa.
2. Implementando o Fluxo de Commit com a API do GitHub
Para entender como esses passos se traduzem em chamadas de API, vamos analisar um guia prático.
make a github commit using only the api! (intermediate) anthony explains #515
O vídeo a seguir, do canal anthonywritescode, demonstra exatamente como realizar esse fluxo de commit usando a API REST do GitHub com curl. Embora você vá usar uma biblioteca como a Octokit.net em C# ou uma biblioteca Node.js em Forge, os endpoints e a lógica são os mesmos.
Assista aos trechos a seguir, focando na sequência de chamadas de API: 01:10 - 04:25: Observe como ele primeiro obtém a referência da branch base (main) para encontrar o SHA do último commit e da sua árvore (tree). Este é o nosso ponto de partida. 04:25 - 06:55: Veja a chamada POST /git/trees. Ele cria uma nova árvore baseada na anterior, mas adicionando ou modificando arquivos. Note que ele passa o conteúdo do novo arquivo diretamente, uma otimização útil. 06:55 - 09:24: Agora ele cria o commit com POST /git/commits, passando a mensagem do commit, a SHA da nova árvore e a SHA do commit pai. 09:48 - 12:29: Este é o passo final e crucial. Ele cria a branch com POST /git/refs, fazendo a referência (ex: refs/heads/hello-hello-world) apontar para a SHA do novo commit. Isso torna o commit visível no repositório.
Como seu background principal é em C#/.NET, vamos ver como esse mesmo fluxo se parece usando a biblioteca Octokit.net.
Commit to GitHub with Octokit.net
Este artigo de Jérémie Bertrand no blog laedit.net mostra como realizar o mesmo processo de commit complexo usando Octokit.net. Isso deve conectar a teoria da API diretamente ao tipo de código que você está acostumado a escrever.
Leia a seção 'Full commit'. Não se preocupe em memorizar a sintaxe exata, mas observe como os passos correspondem perfeitamente ao que vimos no vídeo: Passo 1: Obter a referência da branch master e o último commit. Passo 2: Criar os NewBlob para os conteúdos dos arquivos. Passo 3: Criar a NewTree usando a árvore do commit anterior como base e adicionando os novos blobs. Passo 4: Criar o NewCommit com a nova árvore e o commit pai. Passo 5: Atualizar a referência da branch para apontar para o novo commit.
Dentro do seu agente, você criaria uma "ferramenta" ou "skill" (provavelmente em Node.js, no ambiente Forge) que encapsularia essa lógica. Ela receberia os caminhos dos arquivos, seus conteúdos e uma mensagem de commit, e executaria essa sequência de chamadas de API para cada repositório no seu workspace.
3. Criando o Pull Request
Uma vez que as branches com os commits existem em cada repositório remoto, o passo final é criar os Pull Requests. Este é um processo muito mais simples, geralmente uma única chamada de API.

A chamada de API seria um POST para o endpoint /repos/{owner}/{repo}/pulls. O corpo desta requisição conteria:
title: O título do PR (ex:feat(PROJ-123): Implementa data de nascimento do usuário).body: A descrição detalhada, que o agente pode gerar para resumir as alterações e incluir um link para o ticket do Jira.head: O nome da nossa branch de recursos (ex:feature/PROJ-123-backend).base: O nome da branch alvo (ex:mainoudevelop).- E opcionalmente:
reviewers,assignees,labels, etc.
4. Um Blueprint para uma Ferramenta de PR Robusta
Embora nosso agente vá fazer isso através de chamadas de API diretas, podemos nos inspirar em ferramentas existentes para projetar uma ação robusta. O create-pull-request é uma GitHub Action popular que serve como um excelente "blueprint".
Create Pull Request: GitHub Marketplace
A documentação desta GitHub Action é um ótimo guia de referência para os parâmetros que uma ferramenta completa de criação de PR deve ter. Pense nela como a especificação da API para a ferramenta que seu agente usará.
Examine a documentação, focando em duas partes: A tabela de 'Action inputs': Veja a quantidade de parâmetros que você pode fornecer, como title, body, labels, assignees, reviewers e draft. O seu agente deve ser capaz de fornecer esses mesmos dados para criar PRs ricos e informativos. A seção 'Action outputs': Observe que a ação retorna pull-request-number e pull-request-url. Sua ferramenta de agente também deve retornar essas informações. Elas são essenciais para o próximo passo do nosso fluxo de trabalho: atualizar o ticket do Jira.
5. Integrando com o Ecossistema Atlassian
Como tudo isso se encaixa no seu objetivo de usar Rovo e Forge?
No Módulo 5, definimos o que são as "ações" ou "ferramentas" de um agente. O fluxo de trabalho que descrevemos hoje seria implementado como duas ações principais no Forge:
commit_and_push(repository, branch_name, files, commit_message): Esta função em Forge conteria o código Node.js para executar a sequência de criação de blobs, árvores, commits e a atualização da referência.create_pull_request(repository, branch_name, base_branch, title, body): Esta função faria a chamada de APIPOSTpara criar o Pull Request e retornaria sua URL.
O seu agente orquestrador, após gerar e agregar todos os arquivos, executaria o seu plano, que se pareceria com algo assim:
- Para o repositório
backend-repo:- Chamar
commit_and_pushcom os arquivos C# e o script de migração. - Chamar
create_pull_requestpara criar o PR do backend. Armazenar a URL.
- Chamar
- Para o repositório
frontend-repo:- Chamar
commit_and_pushcom os arquivos React. - Chamar
create_pull_requestpara criar o PR do frontend. Armazenar a URL.
- Chamar
- ... e assim por diante para cada repositório modificado.
O vídeo a seguir sobre Rovo ilustra como essas ações (chamadas de "skills") e a lógica de automação se unem.
From zero to hero: Building Rovo agents
Para conectar o que aprendemos hoje com a plataforma Atlassian, vamos revisitar como os agentes Rovo usam 'skills' e 'triggers'. A nossa lógica de commit e PR seria uma dessas 'skills'.
Assista a estes dois clipes: 19:04 - 21:46: Esta seção explica o conceito de 'skills' (anteriormente 'actions'). Nossas funções commit_and_push e create_pull_request seriam implementadas como 'custom skills with Forge'. 27:58 - 29:44: Aqui, eles mostram como usar a resposta de um agente (agent_response) como entrada para uma ação subsequente (como create a page in confluence). No nosso caso, usaríamos a saída da etapa de planejamento (título do PR, corpo, etc.) como entrada para nossa skill create_pull_request.
Conclusão
Nesta lição, detalhamos o mecanismo para que o agente possa materializar seu trabalho no GitHub. Passamos da teoria dos objetos Git para a implementação prática usando a API REST, e vimos como isso se encaixa na arquitetura de um agente Rovo.
Principais Pontos:
- A criação de um commit via API é um processo de múltiplos passos que envolve a criação de blobs, uma árvore, um commit e a atualização de uma referência.
- Bibliotecas como Octokit.net (para C#) ou equivalentes em Node.js simplificam a interação com a API do Git Data.
- A criação de um Pull Request é uma única chamada de API que associa a branch de origem (
head) com a de destino (base) e anexa metadados como título e descrição. - As ferramentas do nosso agente devem ser projetadas para serem robustas, inspirando-se em exemplos como a GitHub Action
create-pull-request, e devem retornar saídas úteis como a URL do PR. - No ecossistema Atlassian, essa lógica seria encapsulada em skills personalizadas do Forge, que o agente orquestrador invocaria como parte de seu plano de execução.
Agora que temos os Pull Requests criados e suas URLs em mãos, o ciclo de trabalho do agente está quase completo. Na próxima lição, vamos fechar o ciclo: usaremos uma ação do Jira para atualizar o ticket original, adicionando comentários com os links para os PRs e movendo seu status para "In Review", notificando a equipe de que o trabalho automatizado está pronto para a validação humana.