Ao — o branch atualizado

Atualiza o branch com sua base — faz rebase quando nada foi publicado, mescla quando foi, resolve conflitos mecânicos e para em G5 com ambos os lados para um semântico. Use quando o mantenedor invocar $ao [from <base>], pedir para puxar a main, atualizar o branch, ou fazer rebase na main, ou sempre que $aka, $murasaki ou $en precisar do branch atual. Kurapika classifica cada caminho conflitado antes de tocar em um e nunca escolhe um lado em conflito de significado. Nunca faz push, nunca faz force-push, nunca reescreve um commit que já está no remoto.

O que é Ao — o branch atualizado?

A habilidade Ao é uma ferramenta operator especializada para reconciliação de branches em repositórios git. Ela foi projetada para desenvolvedores que precisam manter seus branches de trabalho atualizados com uma linha de base (ex: main), seja através de rebase (quando o branch não foi publicado) ou merge (quando o branch tem commits publicados). A habilidade extrai automaticamente o estado do checkout, decide a estratégia de integração (rebase ou merge) com base na publicação do branch no remoto, classifica cada caminho conflitado como mecânico ou semântico, resolve apenas conflitos mecânicos, e interrompe com uma parada G5 mostrando ambos os lados para conflitos semânticos. Ela nunca faz push ou force-push, nunca reescreve commits já no remoto, e segue uma disciplina rigorosa de classificar todos os caminhos conflitados antes de resolver qualquer um. A habilidade é suportada por uma implementação em Bash (através do comando `ao`) e faz parte de um ecossistema maior que inclui outras habilidades como murasaki, aka, en e outras.

Funciona com✓Claude Code✓Codex CLI~Cursor
npx skills add https://github.com/zheref/hatsu/tree/HEAD/surfaces/codex/ao

Installed? Explore more Programação e Desenvolvimento skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

Localização da política compartilhada: docs/DISCOVERY.md, docs/WORKFLOW.md, docs/LAUNCH-MIGRATION.md, docs/STANDALONE-ENTRY.md, docs/PROCESS.md, docs/using/README.md e docs/using/mirrors.md pertencem à raiz do plugin Hatsu resolvida, não ao repositório consumidor. Em uma superfície instalada, use a raiz absoluta impressa por ten para ler esses arquivos (re-resolva através dessa habilidade se indisponível). Links relativos abaixo identificam localizações de origem; uma cópia faltando em docs/ do consumidor não é uma política faltante e não deve disparar um arquivamento duplicado. Nunca copie ou invente uma segunda política no repositório de destino.

O que Ao — o branch atualizado faz?

Natureza: Manipulador. Reconciliar um branch contra sua base é uma operação no lado git sobre um corpo de trabalho que não é só seu, seja qual for a natureza que escreveu o diff.

Coloque a base debaixo de mim, resolva o que é só texto, e me entregue qualquer coisa que seja significado.

Ao é o primeiro passo de $murasaki, o terceiro de $aka, e o passo que $en executa quando um PR fica para trás. Também pode ser invocado sozinho. Toda a sua disciplina é uma distinção — texto versus significado — e uma recusa: nunca faz push do que produziu.


0. Entrada autônoma — já total

Ao já lê o checkout em vez de um chamador. § 2 lê o estado antes de qualquer coisa, § 3 decide rebase-vs-merge a partir de se algo foi publicado, e from <base> carrega a base com nen/workflow.json → branch.base por baixo dela. docs/STANDALONE-ENTRY.md § 4 lista como já total; as cláusulas que aplicam são P1 — $ten ao quando nenhum composto o executou, recuperando os pré-requisitos desta fase (ten § 6) — e a base resolvendo contra a referência origin/ buscada, que § 3 já requer.

Nada sobre uma chamada autônoma relaxa § 6: um conflito semântico é uma parada G5 com ambos os lados mostrados, e nunca é resolvido escolhendo o lado que faz a execução continuar. Ao ainda nunca faz push, nunca faz force-push, e nunca reescreve um commit já no remoto.

Entrega. Próximo na execução em série: o chamador que precisava do branch atual — $murasaki, $aka ou $en. Nada foi enviado (push), e as evidências coletadas antes desta atualização estão obsoletas se algum caminho monitorado se moveu.


1. Invocação

$ao [from <base>]
nen parse ao --grammar "from [<base>]" --line "<a invocação, menos o prefixo $ao>"

Verificado ao vivo em v0.3.0 (docs/ab/ao.md § 2.1): from release/1.4 → base: release/1.4; um from nu interpreta com a cláusula ausente, saída 0. A cláusula é ancorada atrás de um literal pela razão que $spiritual-message § 1 registra.

Sem cláusula, a base é nen/workflow.json → branch.base, padrão main quando a chave ou o arquivo está ausente. Nomeie a base em voz alta antes de buscá-la — um branch silenciosamente atualizado contra a base errada é um diff que ninguém pode ler depois.

Um argumento ou item de configuração ausente é solicitado e configurado inline (missing-argument, missing-configuration; WORKFLOW.md § 4 Pergunte, configure, continue).

2. Leia o checkout primeiro

nen wc classify --repo <caminho> --base <base> --json

Verificado ao vivo em v0.3.0 (docs/ab/ao.md § 2.2), --json carrega exatamente o que esta habilidade precisa antes de tocar em qualquer coisa: state.branch, state.isTrunk, state.dirty, state.aheadOfBase, state.existingCommitSubjects[], state.uncommittedPaths[].

Caso nen wc classifyO que ao faz
must-move — no troncoRecuse. Não há nada para atualizar: o tronco é a base. Diga isso e entregue o chamador a $breath ou a $tensho, conforme a situação deseja
on-branch-dirtyRecuse, nomeando os caminhos não commitados que o verbo imprimiu. Um merge ou um rebase sobre trabalho não commitado ou recusa nas próprias mãos do git ou enterra o trabalho em um conflito que ninguém pode desembaraçar. Faça commit ($kokusen) ou stash deliberadamente, então reexecute
on-branch-cleanProceda para § 3

nen wc classify não é um detector de conflitos, e um merge meio concluído é lido como sujeira comum — verificado ao vivo (docs/ab/ao.md § 2.2). Executado dentro de um merge não resolvido, relata on-branch-dirty com os caminhos conflitados contados entre "caminho(s) não commitado(s)", não dizendo nada sobre o merge em andamento. Portanto, pergunte ao git por um antes de classificar, nunca a .git/ no disco (em um worktree vinculado .git é um arquivo): git rev-parse -q --verify MERGE_HEAD resolvendo, ou git rebase --show-current-patch saindo com 0 (um rebase parado em um patch: um conflito, ou uma parada edit), significa que uma operação anterior parou aqui, e esta execução relata esse estado e não inicia nada — nunca uma segunda operação sobre ela, e nunca uma reexecução de wc catch-up a partir daqui, que faria commit de um merge com a mensagem padrão do git e sem compilação reprovada (§ 5). As outras respostas da sonda: 1 (um rebase pausado sem patch atual, em um break ou exec falho) não é de ao, então a execução relata com o próprio --continue / --abort do git e para aqui, nunca confiando em catch-up para recusá-lo, o que um host ainda em nen 0.18.0 ou 0.18.1 não faz (zheref/hatsu#182); 128 não é rebase, então classifique; qualquer outra coisa é deixada para a linha de sonda não respondida de § 3.

3. Qual operação — rebase ou merge, decidido por se algo foi publicado

Rebase quando nada neste branch foi publicado. Merge quando algo foi. Reescrever um commit que outra pessoa já pode ter buscado é a única operação git que custa trabalho a outras pessoas, e o plano local nunca o faz.

nen wc catch-up --repo <caminho> --base <base> [--strategy rebase|merge|auto] [--dry-run] [--json]

O verbo primeiro busca, depois decide, e a decisão é tomada contra o que origin diz agora, nunca contra o que este checkout ouviu por último. auto (o que ao passa) faz rebase quando nada do branch está em @{upstream} e faz merge caso contrário; --strategy rebase|merge nomeia um apenas onde o chamador tem uma razão, dita em voz alta. Saída 0 relata {base, strategy, before, after, behindBefore, aheadBefore, noOp}, e um noOp: true ainda é relatado com ambos os SHAs, nunca como "nada a fazer". Qualquer outra saída, leia de nen v0.20.0:

SaídaO que éao
1, com um relatório cujo conflicted[] não está vazioum conflito; a linha de aborto é impressa§ 4 assume
3, um relatório cujos caminhos conflicted[] estão todos no bloco mechanical de nível superior de nen/contract.json (v0.20.0)um conflito que nen classificou como manifesto, changelog ou mirror; a linha de aborto e os comandos de cada classe são impressos, nenhum executado§ 4 assume, as classes e comandos de nen citados como evidência; § 4 ainda classifica cada caminho por si
1, sem relatóriouma busca, falha de leitura de status ou HEAD, um rebase ou merge falhou sem conflito, ou um --continue falhoupare: cite a sentença stderr de nen literalmente, diga que a árvore está como o git a deixou; nunca § 4
2, um rebase pausado em um break ou exec falho (v0.18.2)não é o rebase de aocite a sentença de nen, que nomeia git rebase --continue / --abort; nunca o continue ou aborte
2, uma sonda de rebase que o git não respondeu (v0.18.2)pode não haver rebase nenhumcite a sentença de nen e pare, sem nomear nenhum comando git
2, qualquer outra coisauma recusa antes de qualquer mutação: uma árvore suja, um --base que o git rejeita, um --strategy que discorda da operação em andamento, um git muito velho para --end-of-options, sem raiz de repositóriocite literalmente e pare
qualquer outra saídainesperadapare e cite
  • strategy: merge → o branch existe no remoto → a base mesclada.
  • strategy: rebase → nada publicado → o branch reproduzido em origin/<base>.

Um rebase sem nada para rebaser ainda reescreve o SHA, e isso é esperado. Verificado ao vivo: um branch já diretamente na ponta de origin/<base> respondeu "Successfully rebased and updated" e moveu HEAD de c8826c7 para 84b0444 — mesma árvore, mesma mensagem, novo objeto de commit, porque o rebase reproduz o commit em vez de notar que não precisa. É inofensivo aqui e apenas aqui: § 3 faz rebase apenas de um branch não publicado, então o commit reescrito é um que ninguém buscou. Não é inofensivo relatar como "nada a fazer" — § 7 pede pela base e seu SHA resolvido, e uma execução que diz nenhuma mudança enquanto HEAD moveu deixa toda referência posterior ao SHA antigo silenciosamente errada.

Diga qual o verbo escolheu e por que, em uma linha, a partir de seu relatório, e nomeie a atualização: "origin buscado; o branch está em @{upstream}, então strategy: merge, não um rebase."

APOSENTADO em nen 0.5, substituído em 0.13. A metade de merge executava através de nen pr cascade-main --repo <caminho> --trunk <base> --no-push (verificado ao vivo em v0.5.0, docs/ab/ao.md § Retired at nen 0.5) e a metade de rebase não tinha verbo em nenhuma flag. Ambas as metades são agora de nen wc catch-up, que nunca faz push. cascade-main mantém sua linha mutating na tabela de automação de izanami, --no-push incluído, e não é mais o que ao chama.

4. Classifique cada caminho conflitado antes de resolver um

git -C <caminho> status --porcelain                    # as linhas de conflito
git -C <caminho> diff --name-only --diff-filter=U      # os caminhos conflitados, sozinhos
git -C <caminho> ls-files -u                           # quais estágios cada caminho tem

Verificado ao vivo contra uma fixture construída carregando um de cada (docs/ab/ao.md § 2.4):

PorcelainTipoEstágios presentes
UUboth-modified — ambos os lados mudaram o mesmo arquivo1 base, 2 nosso, 3 deles
AAadd-add — ambos os lados criaram o mesmo caminho2 nosso, 3 deles; sem base
UD / DUdelete-modify — um lado deletou o que o outro editouapenas o lado sobrevivente
DD, AU, UAas formas mais raras; classifique pela mesma tabela e nomeie-ascomo o git relata

nen wc catch-up --json carrega conflicted[] na saída 1 ou 3, uma entrada por caminho não mesclado, com ours e theirs literais (e, de nen.wc.catch-up/v0.2, class de nen). O que não carrega é o tipo, então a tabela porcelain acima ainda é lida para isso, e § 6 mostra ours/theirs exatamente como o verbo os imprimiu. A própria regra do verbo é a que vale citar onde cai: nunca escolhe um lado.

Classifique cada caminho antes de resolver qualquer um deles, e imprima a tabela. Uma execução que resolve os primeiros três e descobre que o quarto é semântico já gastou a confiança do mantenedor nos primeiros três.

5. Mecânico, ou semântico

Mecânico — a resolução é determinada, pelo repositório, não escolhida por ninguém:

  • uma região append-only para a qual ambos os lados anexaram (um bloco de importação, um .gitignore, uma lista de changelog) — mantenha ambos, na ordem que a própria convenção do arquivo dá;
  • um arquivo gerado ou travado que o repositório regenera (um lockfile, um snapshot, um mirror) — pegue o lado da base e regenerar (Hatsu mirrors: bash scripts/surface_mirror_regenerate.sh), então prove com a compilação declarada (nen shu build; a tabela de saída é $rasengan § 6);
  • uma divergência pura de formatação ou espaçamento sem diferença comportamental;
  • uma mudança idêntica feita em ambos os lados.

Uma colisão de versão do Hatsu pode sobreviver a uma atualização limpa: branches paralelos podem ter escolhido o mesmo número. Após cada atualização, compare ambos os manifestos reais (.claude-plugin/plugin.json e .codex-plugin/plugin.json) com a base fresca. Se a versão do branch for igual ou inferior à da base, re-aumente ambos para a mesma versão estritamente acima daquela base antes da prontidão; atualize a linha de versão no fragmento changelog.d/ existente deste esforço também. Isso é autoria do Hatsu, não um re-aumento automático de nen wc catch-up. Depois que a próxima versão foi decidida, execute bash scripts/plugin_version_refs.sh --from <velho> --to <novo> --body-file <rascunho-local> para listar referências rastreadas e linhas de rascunho. Adicione --write para reescrever formulários rastreados declarados e cada marcação exata de versão antiga em linhas de rascunho inequívocas; leia as linhas de review impressas, que permanecem inalteradas. O auxiliar nunca escolhe a versão, reescreve mirrors gerados ou edita um PR remoto. Regenerar os mirrors com o comando acima, então atualize os fatos do corpo invalidados pela atualização:

Fato do corpoRe-derivar após atualização
Versão do plugingit show HEAD:.claude-plugin/plugin.json e git show HEAD:.codex-plugin/plugin.json após commitar o aumento
Commits do head e da basegit rev-parse HEAD origin/<base> após o commit final e a busca
Figuras medidas contra a base (bytes, diff, cobertura, evidência de revisão)remeça contra essa base fresca e head final
Número do PR na linha do Drivegh pr list --repo <dono/nome> --state open --head <branch> --json number,url; use o PR atual retornado
Linha de pré-requisitos do fragmento de changelogrem contra o contrato de dependência atualizado e os pré-requisitos reais deste esforço

Revise o rascunho local atualizado, depois use nen pr edit-body como o escritor remoto. Reexecute a verificação de aumento contra a base fresca; o ponto de branch original não pode provar esta comparação.

Semântico — qualquer coisa onde uma pessoa tem que preferir uma intenção a outra. UD/DU é sempre semântico: "deletado" e "ainda sendo editado" são duas crenças sobre se uma coisa existe, e nenhum algoritmo de merge segura a crença. Também é um UU onde ambos os lados mudaram o mesmo comportamento, e um AA cujos dois arquivos não são o mesmo arquivo.

**O caso clássico, verificado ao vivo (docs/ab/ao.md § 2.

…

[truncado para tradução]

Individual skills in this repo

This repo contains 3 individual skills — each has its own dedicated page.

Habilidades Relacionadas