fix: instalação no Windows não morre mais nos symlinks do harness - #31
Merged
Conversation
…trator próprio com materialização) O tar.exe do Windows (bsdtar) não cria symlink sem privilégio (admin/Developer Mode) — os 55 espelhos do harness (.agents/* e .cursor/agents/*) falhavam com "Invalid argument", o tar saía 1 e o instalador abortava com um falso "corrupted download" que repetir nunca resolvia. - src/lib/tar-extract.js (novo): extrator .tar.gz em JS puro (formato pax do git archive, zero dependência) — tenta symlink real; na primeira recusa materializa todos os links como cópia do alvo resolvido (confinado ao destino, com passes para cadeias de link e suporte a pax x/g, GNU L/K e hardlink). - template-fetch: tenta o tar do sistema; se faltar ou falhar, re-extrai do zero com o extrator próprio. tar_missing deixou de existir (não é mais beco sem saída) e extract_failed agora só dispara quando os DOIS extratores recusam os bytes (corrupção real). - imp fix: restore de entradas link: do manifest ganha o mesmo fallback de cópia quando symlink() é negado. - Skills CLI (vercel-labs) auditado e já é seguro no win32 (junction + cópia) — sem mudança. - Validação: git archive real do harness (362 arquivos + 55 links) com paridade byte a byte contra o tar do sistema; testes novos constroem o tar à mão e rodam em qualquer OS sem privilégio de symlink. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…a forward slash No Windows (com privilégio de symlink) o readlink devolve o target com backslashes e o manifest gravava link:..\..\... — não-portável entre OSes e o único teste vermelho do CI Windows na main. collectHarnessManifest normaliza o target para / e classifyHarnessState normaliza o lado do disco antes de comparar, então link carimbado num OS continua pristine no outro. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
elberrd
added a commit
that referenced
this pull request
Aug 17, 2026
…ializados) + pasta ~/.impactus-cli (#33) Empacota os dois fixes já mergeados na main: - PR #31: extrator tar próprio com materialização de symlinks (Windows sem privilégio instala; "corrupted download" falso eliminado) + manifest do harness portável. - PR #32: pasta de gestão renomeada para ~/.impactus-cli com migração automática do ~/.create-iai; IMPACTUS_TOKEN/IMPACTUS_API preferidos. Co-authored-by: Claude Fable 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
Teste real no Windows (log do Elber, 16/ago): o passo Harness abortava com "The downloaded harness file arrived corrupted" — e repetir nunca resolvia. O tarball estava íntegro; o que falhava era o
tar.exedo Windows (bsdtar) comCan't create '…': Invalid argumentem exatamente 55 entradas: os espelhos symlink do harness (.agents/agents/*,.agents/commands/*,.agents/skills/*,.cursor/agents/*→.claude/e.cursor/).Causa: o tarball do GitHub preserva symlinks, e o Windows só cria symlink com privilégio (shell admin ou Developer Mode) — que aluno típico não tem. Sem este fix, a instalação no Windows está quebrada para praticamente todo aluno.
Investigação das outras superfícies
fetchTemplateToDir(harness, live1/live2, re-download doimp fix)imp fixrestore delink:do manifestsymlink()→ EPERM) — corrigido aquifia-templates/pi-templates(stamp local)cpverbatimSymlinks)Correção
src/lib/tar-extract.js(novo): extrator.tar.gzem JS puro (formato pax dogit archive, zero dependência nova). Tenta symlink real; na primeira recusa materializa todos os links como cópia do alvo resolvido — confinado ao destino, com passes para cadeias de link, suporte a paxx/g, GNUL/K, hardlink e rejeição de path traversal.template-fetch.js: tenta otardo sistema primeiro (rápido, preserva links onde o OS deixa); se faltar ou falhar, limpa o destino e re-extrai com o extrator próprio.tar_missingdeixou de existir (não é mais beco sem saída) eextract_failedagora só dispara quando os DOIS extratores recusam os bytes (corrupção real — a mensagem "corrupted, run again" volta a ser verdadeira).fix.js: restore de entradaslink:ganha fallback de cópia quandosymlink()é negado.Validação
git archivereal do harness (362 arquivos + 55 links): modo normal preserva os 55 links e tem paridade byte a byte com a saída do tar do sistema (diff -rlimpo); modo Windows-simulado materializa os 55 com conteúdo idêntico ao canônico, zero pulados.test/tar-extract.test.jsconstrói os bytes do tar à mão — roda em qualquer OS sem exigir privilégio de symlink no runner do CI.🤖 Generated with Claude Code