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 classify | O que ao faz |
|---|---|
must-move — no tronco | Recuse. 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-dirty | Recuse, 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-clean | Proceda para § 3 |
nen wc classifynã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, relataon-branch-dirtycom 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_HEADresolvendo, ougit rebase --show-current-patchsaindo com0(um rebase parado em um patch: um conflito, ou uma paradaedit), 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 dewc catch-upa 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 umbreakouexecfalho) não é de ao, então a execução relata com o próprio--continue/--abortdo 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);128nã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ída | O que é | ao |
|---|---|---|
1, com um relatório cujo conflicted[] não está vazio | um 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ório | uma busca, falha de leitura de status ou HEAD, um rebase ou merge falhou sem conflito, ou um --continue falhou | pare: 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 ao | cite 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 nenhum | cite a sentença de nen e pare, sem nomear nenhum comando git |
2, qualquer outra coisa | uma 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ório | cite literalmente e pare |
| qualquer outra saída | inesperada | pare e cite |
strategy: merge→ o branch existe no remoto → a base mesclada.strategy: rebase→ nada publicado → o branch reproduzido emorigin/<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 moveuHEADdec8826c7para84b0444— 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 enquantoHEADmoveu 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 em0.13. A metade de merge executava através denen pr cascade-main --repo <caminho> --trunk <base> --no-push(verificado ao vivo emv0.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 denen wc catch-up, que nunca faz push.cascade-mainmantém sua linhamutatingna tabela de automação de izanami,--no-pushincluí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):
| Porcelain | Tipo | Estágios presentes |
|---|---|---|
UU | both-modified — ambos os lados mudaram o mesmo arquivo | 1 base, 2 nosso, 3 deles |
AA | add-add — ambos os lados criaram o mesmo caminho | 2 nosso, 3 deles; sem base |
UD / DU | delete-modify — um lado deletou o que o outro editou | apenas o lado sobrevivente |
DD, AU, UA | as formas mais raras; classifique pela mesma tabela e nomeie-as | como o git relata |
nen wc catch-up --jsoncarregaconflicted[]na saída1ou3, uma entrada por caminho não mesclado, comoursetheirsliterais (e, denen.wc.catch-up/v0.2,classde nen). O que não carrega é o tipo, então a tabela porcelain acima ainda é lida para isso, e § 6 mostraours/theirsexatamente 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 corpo | Re-derivar após atualização |
|---|---|
| Versão do plugin | git show HEAD:.claude-plugin/plugin.json e git show HEAD:.codex-plugin/plugin.json após commitar o aumento |
| Commits do head e da base | git 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 Drive | gh pr list --repo <dono/nome> --state open --head <branch> --json number,url; use o PR atual retornado |
| Linha de pré-requisitos do fragmento de changelog | rem 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]