TRILHA 5

🛠️ Desenvolvimento & Contribuição

Workflow de feature, testes em 3 níveis, fork model e CI. Aprenda a contribuir como veterano — especificar contra o codebase, provar em Rust, validar via RPC, testar a UI e mandar PR limpo.

3
Módulos
18
Tópicos
~2h30
Duração
Avançado
Nível

Mapa da trilha

Conteúdo detalhado

5.1 ~50 min

🌊 Workflow de feature

Do specify ao E2E, em 6 passos. A ordem importa: testes antes da próxima camada.

O que é:

Unidades pequenas, com responsabilidade afiada, compostas por fronteiras explícitas. Domínio em src/openhuman/<dominio>/, transporte em src/core/.

Por que aprender:

Código grande sem fronteiras vira lama. O OpenHuman é grande justamente porque cada domínio sabe seu lugar e não vaza.

Conceitos-chave:

Domínio dedicado, no parallel architectures, mod.rs leve, controllers no registry — nunca branches em cli.rs/jsonrpc.rs.

O que é:

Antes de escrever uma linha, ancore a feature em padrões existentes: domínios atuais, registry, naming openhuman.<ns>_<fn>.

Por que aprender:

Arquitetura paralela é a doença mais cara de curar. Se já existe um padrão, use-o.

Conceitos-chave:

Capability catalog (src/openhuman/about_app/), naming RPC, controller-only exposure, sem novos arquivos no root de src/openhuman/.

O que é:

Lógica de domínio em src/openhuman/<dominio>/, schemas + handlers no registry, unit tests até funcionar em isolamento.

Por que aprender:

Provar a lógica em Rust antes da UI evita debug cruzado: se quebra, você sabe que é a UI, não o core.

Conceitos-chave:

ops.rs, store.rs, types.rs, schemas.rs, rpc.rs; RpcOutcome<T> contract; mod.rs apenas exporta.

O que é:

Estenda tests/json_rpc_e2e.rs para que os métodos RPC casem exatamente com o que a UI vai chamar.

Por que aprender:

Erros de contrato são silenciosos. Provar pelo transporte garante que serialização, auth e shape do payload batem.

Conceitos-chave:

scripts/test-rust-with-mock.sh, mock API server, bearer token em OPENHUMAN_CORE_TOKEN, request/response shape.

O que é:

Telas e estado no React usando core_rpc_relay / coreRpcClient. Regras ficam no core.

Por que aprender:

UI orquestra e apresenta — não decide. Lógica duplicada em TS é dívida garantida.

Conceitos-chave:

Sempre invoke('core_rpc_relay', ...) (evita CORS preflight), i18n via useT(), no dynamic imports em prod.

O que é:

Antes de codar, defina os cenários E2E que cobrem happy path, falhas, auth e regressões. Não testável = spec incompleta.

Por que aprender:

Escopo definido por testes é escopo que cabe num PR. Sem isso, features incham até o infinito.

Conceitos-chave:

Vitest co-localizado, WDIO em app/test/e2e/specs/, atualizar about_app/ no mesmo PR.

Ver Completo
5.2 ~50 min

🧪 Testes em 3 níveis

Vitest co-localizado, WDIO dual-platform, cargo com mock. Coverage gate ≥80% em linhas alteradas.

O que é:

Pirâmide do projeto: unit (Vitest + cargo) rápido e barato, RPC (JSON-RPC E2E) prova o contrato, E2E (WDIO) prova o fluxo completo.

Por que aprender:

Cada nível pega uma classe diferente de bug. Confiar só em E2E é lento; só em unit é cego.

Conceitos-chave:

Comportamento sobre implementação, mocks determinísticos, sem rede real, sem flake de tempo.

O que é:

Testes *.test.ts / *.test.tsx ao lado do código em app/src/**. Config em app/test/vitest.config.ts.

Por que aprender:

Teste perto do código é teste que existe. Pastas separadas viram cemitério.

Conceitos-chave:

pnpm test, pnpm test:coverage, helpers em app/src/test/, debug runner pnpm debug unit.

O que é:

Mesmo mock backend usado por unit, RPC E2E e WDIO. Core em scripts/mock-api-core.mjs, server em scripts/mock-api-server.mjs.

Por que aprender:

Um mock só evita drift de comportamento entre níveis. Resultados determinísticos via POST /__admin/reset.

Conceitos-chave:

/__admin/health, /__admin/reset, /__admin/behavior, /__admin/requests; rodar manual com pnpm mock:api.

O que é:

E2E roda contra o app empacotado. Linux usa tauri-driver (WebDriver :4444). macOS usa Appium Mac2 (XCUITest :4723) no .app.

Por que aprender:

CI roda no Linux. Dev local em Mac roda nativo. Ambos os caminhos têm que funcionar antes do PR.

Conceitos-chave:

Specs em app/test/e2e/specs/, helpers element-helpers.ts (clickNativeButton, waitForWebView), nunca raw XCUIElementType*.

O que é:

pnpm test:rust sobe o mock backend e roda cargo test. Para um teste só: bash scripts/test-rust-with-mock.sh --test json_rpc_e2e.

Por que aprender:

Provar o contrato RPC sem depender de backend real evita flake e acelera o ciclo.

Conceitos-chave:

Suite tests/json_rpc_e2e.rs, debug runner pnpm debug rust, logs em target/debug-logs/.

O que é:

PRs devem ter ≥80% de cobertura nas linhas alteradas. Workflow .github/workflows/coverage.yml usa diff-cover sobre Vitest + cargo-llvm-cov.

Por que aprender:

Cobertura global engana — o que importa é cobrir o que você acabou de mudar. Sem isso, código novo entra sem rede.

Conceitos-chave:

Teste happy path + edge cases, não só o caminho feliz; merged LCOV (app + core + Tauri shell).

Ver Completo
5.3 ~50 min

🌿 Git, PRs e CI

Fork model, branch off upstream/main, push em origin, PR contra tinyhumansai:main. Hooks, templates e i18n parity.

O que é:

Layout obrigatório: origin aponta pro seu fork (push aqui), upstream aponta pra tinyhumansai/openhuman (fetch-only).

Por que aprender:

Push direto no upstream polui branches e fura code review. Trate upstream como leitura.

Conceitos-chave:

git remote rename origin upstream, git remote add origin git@github.com:<seu>/openhuman.git, git fetch upstream.

O que é:

Antes de qualquer mudança: git fetch upstream && git checkout -b <branch> upstream/main. Trabalho fica na feature branch.

Por que aprender:

Main limpa só avança via merge. Misturar trabalho local em main quebra o rebase e força resets dolorosos.

Conceitos-chave:

Branch atômica por feature, nomes descritivos, rebase sobre upstream/main quando necessário.

O que é:

Push pra origin, abrir PR contra tinyhumansai/openhuman:main com --head <seu-user>:<branch>.

Por que aprender:

Origem do PR sendo o fork mantém upstream limpo. --head resolve ambiguidade quando há mesma branch em vários remotes.

Conceitos-chave:

Issue templates em .github/ISSUE_TEMPLATE/, PR template em .github/PULL_REQUEST_TEMPLATE.md, seguir verbatim.

O que é:

Husky roda pnpm rust:check antes de cada push. --no-verify só para falhas pré-existentes não relacionadas ao seu PR.

Por que aprender:

Pegar erro de compile localmente é segundos; pegar no CI é minutos e desperdício de tempo de reviewer.

Conceitos-chave:

Prettier, ESLint, tsc --noEmit, cargo fmt, cargo check — todos parte do ciclo local.

O que é:

Toda string de UI passa por useT(). Chave nova vai em en.ts e no chunk correspondente en-N.ts + mesma posição em todos os 12 locales.

Por que aprender:

CI roda pnpm i18n:check. Faltando chave em qualquer locale = PR não merge. Use inglês como placeholder.

Conceitos-chave:

Locales: ar, bn, de, es, fr, hi, id, it, ko, pt, ru, zh-CN. Hard-coded em JSX/label=/aria-label= não passa.

O que é:

Gates de merge: coverage ≥80% em linhas alteradas, pnpm i18n:check, ESLint/Prettier, tsc --noEmit, cargo check, suite de testes.

Por que aprender:

Saber o que CI checa = não ter PR vermelho por surpresa. Rode local antes de pushar.

Conceitos-chave:

Workflows em .github/workflows/, debug runners para logs locais, rebase quando upstream avança.

Ver Completo
← Trilha 4: Técnicas Avançadas Trilha 6: Troubleshooting →