Repository navigation
chore(scripts): scripts/git.ts como dono único de processos filhos nos gates - #263
Merged
Merged
Conversation
Every gate in scripts/ spawned git, gh and bun through its own Bun.spawnSync wrapper, with its own error text, path quoting and origin/main default, and the oven-sh/bun#34069 workaround reached only check-private-messages.ts. - scripts/git.ts owns spawn/spawnAsync, the git helpers (always with core.quotepath=false) and DEFAULT_BASE; every caller migrates to it. - check-eslint-disables and the private-terms corpus read numbered lines from behavior-change's parseDiff instead of their own parsers; parseDiff now keeps a file whose header git quotes. - local/no-raw-spawn bans Bun.spawn, Bun.spawnSync, child_process and the Bun shell in scripts/ outside the owner. Closes #260 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Resolve the conflicts with #262: check-eslint-disables, private-terms-history and replay-gates keep the scripts/git.ts helpers and the shared parseDiff, which now reads hunk numbers through parseInteger as #262 required of the old parsers. scripts/git.ts and scripts/behavior-change.ts join the security surfaces, since the private-data guard now loads both. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problema
Cada gate em
scripts/tinha o próprio wrapper deBun.spawnSyncparagit,ghebun(replay-gates,risk,prova,private-terms*,new-tests-fail-on-main,check-eslint-disables,risk-label), cada um com sua mensagem de erro, seu quoting de caminho e seu defaultorigin/main(7 cópias). O contorno do oven-sh/bun#34069 só existia emcheck-private-messages.ts, echeck-eslint-disables.tseprivate-terms-history.tstinham parsers de diff próprios apesar do dono embehavior-change.ts(#236/#245). Mesma causa C1, agora na infra descripts/.Mudança
scripts/git.ts, dono único de processos filhos:spawn(síncrono),spawnAsync(o caminho do contorno #34069, usado porcheck-private-messages),git/gitBytes/gitResult/gitQuiet/revisionExists/repoRoot(sempre comcore.quotepath=false, que antes sóprivate-terms-historypassava) eDEFAULT_BASE. Todos os chamadores foram migrados.parseDiff(behavior-change.ts) agora numera cada linha no seu lado (old para remoção, new para o resto).check-eslint-disablesedeletedLines(corpus de termos privados) passam a lê-lo em vez dos parsers próprios. AgoraparseDifftambém mantém um arquivo cujo cabeçalho o git coloca entre aspas (caminho com aspas ou tab). Antes, as linhas desse arquivo caíam no arquivo anterior ou sumiam.local/no-raw-spawn: proíbeBun.spawn,Bun.spawnSync,child_processe o shell do Bun ($) emscripts/**, com isenção só parascripts/git.ts(viaignoresnoeslint.config.js). Tem fixturebeforede1045a83:scripts/replay-gates.ts, testes emtest/eslint-no-raw-spawn.test.ts, isenções nomeadas parasrc/**etest/**e uma linha na tabela de cobertura doAGENTS.md.test/git.test.tscobre caminho não ASCII sem quoting, o erro com o stderr do git e HEAD sem commits.test/behavior-change.test.tscobre a numeração por lado entre hunks e o cabeçalho com aspas; as duas expectativas existentes ganharam o campoline, e nenhuma asserção foi removida.Escopo
Closes #260
Checklist
GLOSSARY.mdfoi atualizado neste PR. (Não introduz termo de domínio.)Verificação
main(ec8ae54, chore(lint): estende no-loose-number, no-raw-cents, no-double-cast e knip a scripts/** #262): conflitos emcheck-eslint-disables.ts,private-terms-history.ts,private-terms.tsereplay-gates.tsresolvidos mantendo os helpers descripts/git.tse oparseDiffcompartilhado. OparseDiffagora lê o número do hunk comparseIntegere falha em cabeçalho ilegível, a mesma exigência que o chore(lint): estende no-loose-number, no-raw-cents, no-double-cast e knip a scripts/** #262 fez aos parsers antigos.scripts/verify.shapós o merge:VERIFICAÇÃO OK(Bun 1.4.2).scripts/verify.sh:VERIFICAÇÃO OK. Rodei com o Bun 1.4.2 pinado, baixado do release oficial, porque o Bun da máquina é 1.4.4. O passoprivate-terms corpusrodou (o diff mantém a guarda):every removed term is guarded (origin/main...HEAD). O replay do chore: remove referências pessoais do código e dos fixtures #177 emtest/private-terms-corpus.test.tscontinua verde com o novodeletedLines.scripts/damain, aponta 15 spawns crus (abaixo).bunx eslint scripts/sai com 0.Risco (
bun scripts/risk.ts→ exit 2, labelrisco)O PR é arriscado por tocar superfícies de segurança:
eslint-rules/,scripts/private-terms*.ts,scripts/check-private-messages.ts,scripts/git.tsescripts/behavior-change.ts. O raio de impacto é o seguinte. A guarda passa a chamar o git porscripts/git.ts: mesmos comandos e mesmos-zemls-tree/ls-files/diff --name-only. A única mudança é quecore.quotepath=falseagora vale em todo lugar, e esses comandos já usam-z, que não faz quoting.deletedLinespassa a usarparseDiff. Com--unified=0não há linhas de contexto, então a numeração do lado old é a mesma de antes. O replay do #177 etest/private-terms.test.tsprovam a guarda sem mudança./blast-radiusnão estava disponível nesta sessão; este parágrafo é a análise manual. Aguarda a decisão do mantenedor.Decisões para o Filipe:
IncluirResolvido no merge dascripts/git.tsescripts/behavior-change.tsemSECURITY_SURFACES?main: o testetest/risk-guard-imports.test.ts(chore(lint): estende no-loose-number, no-raw-cents, no-double-cast e knip a scripts/** #262) exige que todo módulo carregado pela guarda seja superfície de segurança, e a guarda agora carrega os dois. Eles entraram emscripts/risk.tse na lista doAGENTS.md. Consequência: uma mudança futura no parser de diff (behavior-change.ts) passa a serrisco, como mostra o replay abaixo para o refactor(ci): dono único para "este diff muda comportamento" #245.spawnAsync(contorno #34069) continua só emcheck-private-messages, que é o único gate que roda in-process sobbun test --parallelcomghlento. Os demais seguem síncronos viaspawn. Migrar tudo para async cascateariaasyncpor todos os gates. Fica centralizado no dono para quando for preciso.Fails-on-main: isento — PR
choreque não mudasrc/nembin/.Prova
Web: sem equivalente na web
Antes (main)
origin/maincom sóeslint-rules/eeslint.config.jsdesta branch copiados (bunx eslint --format json scripts/, resumido comjq):Depois (branch)
Replay dos gates (o PR toca
scripts/risk.ts,scripts/prova.tsescripts/replay-gates.ts), após o merge damain(ec8ae54).fails-on-maineprovasaem idênticos aos damain.riskdifere em dois commits, ambos pelas novas superfíciesscripts/behavior-change.ts/scripts/git.ts: o #262 ganha mais um motivo (já disparava) e o #245 passa deskippedparaFIRED, como esperado para uma mudança no parser de diff que a guarda usa.diff main branch -- replay-gates --gate riskbun scripts/replay-gates.ts --gate risk(branch)bun scripts/replay-gates.ts --gate fails-on-mainbun scripts/replay-gates.ts --gate prova