Pular para o conteúdo principal
Versão: Atual

Desenvolvimento

Requisitos​

  • A versão do Go declarada em go.mod para comandos diretos de desenvolvimento. ./install.sh inicializa temporariamente a toolchain exata revisada quando o Go estiver ausente ou for muito antigo.
  • Git
  • Bash e ShellCheck
  • Python 3 para empacotamento determinístico da Web skill
  • Docker apenas para testes de integração das dependências do servidor

Para um checkout privado, autentique o Git e clone por SSH:

git clone git@github.com:ivo-lopes/ivoai.git
cd ivoai
./install.sh
ivoai setup

Verificações locais​

scripts/test-managed-opencode.sh usa o artefato OpenCode pinado com fixtures locais de provider e MCP. A matriz cobre descoberta e execução nativa pelo mesmo frontend/bridge, HTTP/SSE, permissões, attach, teclado e resize real, sem exigir credenciais pessoais de providers.

node --test internal/opencodebridge/presentation.test.mjs compara goldens determinísticos das funções de apresentação importadas pela TUI: identidade, permissões, autenticação/quota, runtime, servidores, seleção restrita, degradação e linhas em 60/100/160 colunas. Goldens em Go cobrem metadados dos seletores de modelo/variant e erros sanitizados. Testes normais nunca regravam os baselines. Após revisar uma mudança intencional, use UPDATE_GOLDENS=1 nos testes correspondentes; a CI recusa esse modo. Timestamps, portas e IDs de sessão não entram na apresentação. Estado, modelo, reasoning, permissões, health e seleção nunca são normalizados.

gofmt -w .
go test ./...
go test -race ./...
go vet ./...
shellcheck install.sh scripts/*.sh
scripts/install-smoke.sh
scripts/upgrade-matrix.sh
scripts/package-skill.sh
unzip -t dist/ivoai-memory-context.zip
go build ./cmd/ivoai
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build ./cmd/ivoai
CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build ./cmd/ivoai

A CI também executa govulncheck ./.... Os testes usam diretórios XDG temporários, processos executáveis falsos e servidores httptest. Eles não acessam credenciais de desenvolvedor do Codex ou do Claude. Os packages do servidor continuam testáveis sem root, systemd, Docker ou um processo Qdrant ativo.

O harness do scheduler automático usa adapters falsos do Codex/Claude, controle de ciclo de vida falso do Ruflo e registros sintéticos de cotas/capabilities. Seu teste de DAG temporal executa simultaneamente dois workers independentes com atraso e verifica que tarefas dependentes não comecem antecipadamente. Os testes de roteamento cobrem os quatro níveis de pontuação, pesos normalizados, esgotamento de cota por provider/modelo, pressão de cota, esforço incompatível, capabilities indisponíveis, rejeição de trabalho duplicado e seleção econômica entre primary e worker. Nenhum teste normal invoca um LLM real.

O harness de atualização constrói a tag v0.5.0 real e o candidato atual. Um helper vinculado dentro do módulo v0.5.0 arquivado executa download, verificação de checksum, extração, sondagem de versão e promoção atômica reais do updater publicado contra um servidor local de releases. Em seguida, o candidato executa setup/Doctor e seu update --rollback real e compatível com o legado; o harness valida a leitura da v0.5.0, a preservação de campos desconhecidos e marcadores pertencentes aos providers e a atualização após o rollback. O mesmo harness repete a promoção histórica, a bridge de setup simples, o rollback, o Doctor do servidor antigo e a atualização após rollback em uma instalação somente servidor; ele também verifica que a bridge não crie configuração de cliente. Testes unitários de transação cobrem o novo updater com journal, modo servidor e migração injetada, Doctor, interrupção e falhas de tamanho, disco, caminho e ownership. A CI faz checkout de todo o histórico para que a tag histórica esteja disponível.

Cobertura da instalação na CI​

O job install-smoke executa em containers Ubuntu 22.04, Ubuntu 24.04 e Debian 12. O scripts/install-smoke.sh isola HOME e todos os diretórios XDG, habilita IVOAI_TEST_MODE e verifica duas execuções do instalador, duas execuções do setup do cliente, duas do setup do servidor, saída de status e doctor, estabilidade de ownership, permissões e idempotência. O modo de teste usa fixtures locais de componentes e ignora o provisionamento de Docker/systemd; portanto, esse job valida o contrato da CLI e do sistema de arquivos sem contatar contas de usuário nem hosts de componentes upstream.

O job real-client-install usa a mesma matriz de três distribuições sem IVOAI_TEST_MODE. Ele instala o binário ivoai a partir do código-fonte em checkout, executa duas vezes o setup dos componentes reais e fixados do cliente como usuário de teste sem privilégios e então verifica status, saída do doctor legível por pessoas e saída JSON do doctor. Ele não autentica contas reais do ChatGPT, Claude ou servidor ivoai e não exercita o arquivo público da release do GitHub, pois o binário ivoai vem do checkout.

O job real-server-deployment executa em um host Ubuntu 24.04. Ele instala o binário ivoai em checkout, provisiona duas vezes o servidor Docker/systemd, executa server doctor, cria um código de enrollment de curta duração e exercita backup e restauração. Essa verificação de implantação não consome o código de enrollment em um cliente separado nem usa credenciais do proprietário.

O job cross-build compila o binário para Linux amd64 e arm64. Juntos, esses jobs complementam os testes unitários, de race, vet, formatação, ShellCheck, build e vulnerabilidades do job quality.

Release​

Tags de versionamento semântico acionam o workflow de release. Ele verifica os gates de qualidade, constrói arquivos para Linux amd64 e arm64, empacota a Web skill ivoai-memory-context, verifica o ZIP, gera checksums.txt para cada artefato e publica uma release no GitHub. O script de empacotamento grava metadados ZIP fixos para que uma entrada idêntica da skill produza um arquivo idêntico. Não crie uma tag em um commit antes que verificações unitárias, de race, vet, cross-build, idempotência de instalação, implantação e segurança sejam aprovadas.

Custo e origem das evidências de validação P1/P2​

No backlog de 2026-10-12, use GOMAXPROCS=2, go test -p 1 e TMPDIR em disco em hosts limitados. Não execute várias suítes completas ou builds do frontend simultaneamente. As camadas têm finalidades distintas:

CamadaEscopo e custoAcesso a provedores
Go focadoPerfis, propriedade/reparo de hooks, continuidade, replay e status; segundos a dezenas de segundosSomente fixtures
Node e PythonStreaming limitado, reconexão, teclado e saída consumida; segundosNenhum
Go completo / race / vetConfiguração, sessões e ciclo de vida compartilhados; minutos, maior RAM com raceFixtures; testes reais são opt-in
Scripts OpenCode/CodexBinários revisados reais e contratos HTTP/TUI; minutosProvedor local simulado, sem login
TestLiveNativeAUTOArtifactInferência Codex e continuidade no terminal; minutos e quota da contaSomente Codex; estado isolado sem componente Claude
Instalação e atualizaçãoHOME/XDG sintéticos, componentes e recuperação de estadoFixtures locais, sem migração de produção

O smoke real aceita IVOAI_NATIVE_SMOKE_CONTINUITY=1 e, com IVOAI_NATIVE_SMOKE_FRONTEND=codex, IVOAI_NATIVE_SMOKE_SWITCH=1. Esta última opção verifica interrupção e reabertura do frontend ocioso e troca para OpenCode sem mudar o provedor. Isso não comprova recuperação de DAG aprovado interrompido. Utilize apenas artefatos revisados e verificados por checksum nos overrides IVOAI_NATIVE_SMOKE_CODEX_PATH/IVOAI_NATIVE_SMOKE_OPENCODE_PATH. Credenciais e configurações pessoais não são copiadas. Um digest antes/depois protege a configuração pessoal do Codex.

A homologação relaciona-se à IVOAI-136 existente; o aceite de capacidades públicas segue IVOAI-135/146. Fixtures não substituem homologação com provedor, e rollback de executáveis não equivale a rollback de migração de banco.

IVOAI_NATIVE_SMOKE_RECOVERY=1 habilita separadamente o smoke real de interrupção e recuperação de execução aprovada somente leitura. Aguarda checkpoint do host com uma tarefa concluída e outra pendente, interrompe apenas o frontend próprio com PID verificado, executa session recover, exige nova aprovação e verifica integração, preservação das tarefas, repositório inalterado e identidade do provedor. Exige Linux com pidfd e janela real de interrupção; ausência de evidência falha sem editar checkpoints.