Skip to content

fix: instalação no Windows não morre mais nos symlinks do harness - #31

Merged
elberrd merged 2 commits into
mainfrom
fix/windows-tar-symlinks
Aug 17, 2026
Merged

fix: instalação no Windows não morre mais nos symlinks do harness#31
elberrd merged 2 commits into
mainfrom
fix/windows-tar-symlinks

Conversation

@elberrd

@elberrd elberrd commented Aug 17, 2026

Copy link
Copy Markdown
Owner

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.exe do Windows (bsdtar) com Can't create '…': Invalid argument em 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

Superfície Situação
fetchTemplateToDir (harness, live1/live2, re-download do imp fix) ponto único — corrigido aqui
imp fix restore de link: do manifest mesmo buraco (symlink() → EPERM) — corrigido aqui
Skills CLI (vercel-labs/skills) auditado: já é seguro (junction no win32 + cópia quando o link falha) — sem mudança
fia-templates/pi-templates (stamp local) zero symlinks — sem risco
merge do harness (cp verbatimSymlinks) copia o que o clone tiver (cópias no Windows, links onde o OS permite) — sem mudança

Correção

  • src/lib/tar-extract.js (novo): extrator .tar.gz em JS puro (formato pax do git 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 pax x/g, GNU L/K, hardlink e rejeição de path traversal.
  • template-fetch.js: tenta o tar do 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_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 — a mensagem "corrupted, run again" volta a ser verdadeira).
  • fix.js: restore de entradas link: ganha fallback de cópia quando symlink() é negado.
  • DOCS.md: §8 ganhou "Extraction and the Windows symlink fallback"; notas nos pontos que citam symlinks.

Validação

  • git archive real 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 -r limpo); modo Windows-simulado materializa os 55 com conteúdo idêntico ao canônico, zero pulados.
  • test/tar-extract.test.js constrói os bytes do tar à mão — roda em qualquer OS sem exigir privilégio de symlink no runner do CI.
  • Suite completa verde (759 testes) + lint limpo.

🤖 Generated with Claude Code

elberrd and others added 2 commits August 16, 2026 22:40
…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
elberrd merged commit a180052 into main Aug 17, 2026
7 checks passed
@elberrd
elberrd deleted the fix/windows-tar-symlinks branch August 17, 2026 01:56
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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant