CLI, GitHub Action e dataset aberto da Copa do Mundo FIFA 2026 (USA, Canadá, México).
npx copa26 next BRA ___ ___ ___ __
/ __\___ ___ / _ \__ _|_ ) / /
/ /__/ _ \/ _ \ /_)/ _` |/ / / _ \
\____/\___/ .__/ ___/\__,_/___\___/
|_|
27 dias para a abertura. 2026-06-11
╭─────────────────────────────────────────────────╮
│ Próximo jogo de 🇧🇷 Brasil │
├─────────────────────────────────────────────────┤
│ Jogo: 🇧🇷 Brasil x TBD 🏳️ │
│ Quando: qua 17 jun, 16:00 (America/New_York) │
│ Onde: MetLife Stadium, Nova York/NJ │
│ Status: scheduled │
╰─────────────────────────────────────────────────╯
A Copa do Mundo de 2026 é histórica:
- 🏟️ Primeira edição com 48 seleções (era 32)
- 🌎 Três países-sede: EUA, México, Canadá
- ⚽ 104 jogos (era 64)
- 🏆 16 cidades-sede entre os três países
copa26 entrega, em um único pacote:
- CLI no terminal com
npx copa26 - Widget para o seu README do GitHub
- GitHub Action que atualiza o seu perfil automaticamente
- Dataset aberto (JSON e TypeScript) para usar em qualquer projeto
npx copa26 next BRAnpm install -g copa26
copa26 --helpnpm install copa26import { TEAMS, GROUPS, STADIUMS, KEY_DATES } from 'copa26';
console.log(`Total de seleções: ${TEAMS.length}`);| Comando | O que faz |
|---|---|
copa26 |
Banner e próximo jogo geral |
copa26 next [team] |
Próximo jogo geral ou de uma seleção |
copa26 groups [A-L] |
Todos os 12 grupos ou um específico |
copa26 teams [code] |
Lista das 48 seleções ou detalhe de uma |
copa26 stadiums [USA/MEX/CAN] |
16 sedes (filtra por país opcional) |
copa26 countdown |
Contagem regressiva para 11 de junho de 2026 |
copa26 --version |
Versão instalada |
copa26 --help |
Ajuda |
Exemplos:
copa26 next BRA # Próximo jogo do Brasil
copa26 teams Brasil # Detalhes da seleção
copa26 groups C # Apenas o grupo C
copa26 stadiums MEX # Sedes no México
copa26 countdown # Dias e horas restantesCole isso no seu profile README (Ronbragaglia/Ronbragaglia/README.md):
<!-- COPA26:START -->

<!-- COPA26:END -->O widget é atualizado automaticamente todos os dias por uma GitHub Action. Ele mostra os dias restantes até a abertura e o próximo jogo da seleção.
Para trocar de seleção, substitua BRA por ARG, POR, JPN e qualquer outro dos 48 códigos disponíveis.
Quer que o seu próprio repositório atualize um README com a seleção que você escolher?
# .github/workflows/copa26.yml
name: Atualizar widget Copa 2026
on:
schedule: [{ cron: '0 9 * * *' }]
workflow_dispatch:
permissions:
contents: write
jobs:
update:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: Ronbragaglia/copa26@v0.1.0
with:
team: BRA
readme: README.md
- run: |
git config user.name 'github-actions[bot]'
git config user.email '41898282+github-actions[bot]@users.noreply.github.com'
git add README.md
git diff --cached --quiet || (git commit -m "chore: atualiza widget copa26" && git push)
⚠️ Segurança: em produção, fixe a action por SHA, nunca por tag. Exemplo:Ronbragaglia/copa26@<sha>.
Todos os dados estão em TypeScript com tipos. A versão JSON também fica disponível em data/:
import { TEAMS, type Team } from 'copa26';
const sulamericanos = TEAMS.filter((t) => t.confederation === 'CONMEBOL');
// 6 seleções: ARG, BRA, COL, ECU, PAR, URUEstrutura:
TEAMS, 48 seleções (sede, classificada ou em repescagem)GROUPS, 12 grupos da fase de grupos (A até L)STADIUMS, 16 estádios com capacidade e coordenadasMATCHES, calendário de jogosKEY_DATES, abertura, fases e final
Sentiu falta de algo? Abra uma issue ou mande um PR.
Entre 1 de junho e 31 de julho de 2026, um workflow agendado roda a cada 2 horas, busca resultados na API pública football-data.org e abre um Pull Request automático quando detecta novos jogos ou placares atualizados.
Como funciona:
- Workflow
auto-sync.ymldispara a cada 2 horas (cron). - Verifica se estamos na janela da Copa, senão faz skip gracioso.
- Chama
scripts/sync-results.mjs, que valida cada match contra um schema rígido (códigos de seleção, score >= 0 e <= 99, data dentro da janela). - Se houver diferença com
src/data/schedule.ts, abre PR com labelauto-sync. - CI valida o PR (CodeQL + tests + lint) antes de qualquer merge.
- Maintainer revisa e mergeia. Nunca há push direto no
main.
Por que PR e não commit direto?
maintem branch protection: linear history, sem force-push, status checks obrigatórios.- Um bug na API ou em parsing nunca contamina a
mainsem revisão. - Audit trail completo: cada atualização vira PR com diff visível.
Para ativar no fork:
- Crie conta gratuita em https://www.football-data.org/client/register
- Adicione o token como secret
FOOTBALL_DATA_TOKENem Settings, Secrets and variables, Actions. - O workflow começa a rodar no próximo cron.
Sem token? O script faz skip gracioso (sem quebrar o CI).
copa26 é tratado como SaaS de verdade: zero erros para usuários.
- ✅ Sem fetch externo em runtime, tudo estático, zero SSRF
- ✅ Input sanitization rigorosa, regex allowlist
/^[A-Za-z0-9-]+$/ - ✅ XML escape obrigatório em todos os SVGs gerados
- ✅ Sem
eval, semFunction(...), semchild_processem runtime - ✅ CodeQL
security-and-qualitysemanal e em todo PR - ✅ npm provenance ativo (verifique com
npm view copa26 --json) - ✅ Dependências auditadas semanalmente (Dependabot)
- ✅ GitHub Actions pinadas por SHA (sem tag mutável)
- ✅
harden-runnerem todos os workflows (egress audit) - ✅
--ignore-scriptsem todonpm cido CI - ✅ Auto-sync via PR, nunca push direto: dados externos passam por validação de schema antes de virar PR para review humano
Política completa: SECURITY.md
Reportar vulnerabilidade: GitHub Security Advisories (canal privado).
PRs são muito bem-vindos, especialmente:
- Atualizar grupos após o sorteio oficial
- Adicionar resultados dos jogos
- Atualizar repescagem quando definida
- Traduzir as mensagens do CLI
Veja CONTRIBUTING.md.
- TypeScript 5 com
strict: trueenoUncheckedIndexedAccess - Zero dependências de runtime além de
kleur(cores no terminal, sem deps transitivas) node:testnativo, sem framework externo- ESLint com
--max-warnings 0 - GitHub Actions com hardening completo (CodeQL, Dependabot, harden-runner, pinning por SHA)
| Evento | Data | Local |
|---|---|---|
| Abertura | 11 jun 2026 | Estádio Azteca, Cidade do México |
| Fim da fase de grupos | 27 jun 2026 | |
| 16 avos (novidade!) | 28 jun 2026 | |
| Oitavas | 04 jul 2026 | |
| Quartas | 09 jul 2026 | |
| Semifinais | 14 jul 2026 | |
| Disputa de 3º lugar | 18 jul 2026 | |
| Final | 19 jul 2026 | MetLife Stadium, Nova York/NJ |
MIT © Rone Bragaglia
Feito com ⚽ no Brasil. Boa Copa! 🇧🇷