GitHub Packages — Registry Privado
Os pacotes @cactus-agents/* são publicados no GitHub Packages como registry npm privado.
Visão geral
front-cactus-core (SDK)
├── @cactus-agents/api-client
├── @cactus-agents/auth
├── @cactus-agents/brand
├── @cactus-agents/types
└── @cactus-agents/utils
│
│ publicados em https://npm.pkg.github.com
│
▼
front-web-base + forks (consumidores)
└── pnpm install → baixa do GitHub Packages
Por que não usamos GITHUB_TOKEN no CI
O GITHUB_TOKEN automático do GitHub Actions é limitado ao repositório onde o workflow roda. Quando o CI do front-web-base tenta baixar pacotes publicados pelo front-cactus-core, o token não tem permissão — resulta em 403 Forbidden.
Alternativas avaliadas:
| Abordagem | Prós | Contras |
|---|---|---|
| Conceder acesso por pacote | Sem PAT extra | 5 pacotes × 30 forks = 150 configs manuais. Não escala. |
| PAT por repositório | Simples | Adicionar secret em cada fork. Manutenção por repo. |
| PAT como org secret | Um secret, todos os repos herdam | PAT atrelado a uma conta. Adotado. |
| Pacotes públicos | Zero auth | Qualquer pessoa pode instalar os pacotes |
Estratégia adotada: org secret
Um único PAT (classic) com escopo read:packages, armazenado como org secret na organização cactus-agents.
Configuração
-
PAT: Settings → Developer settings → Personal access tokens → Tokens (classic)
- Escopo:
read:packages - Nome sugerido:
org-packages-read
- Escopo:
-
Org secret: GitHub → cactus-agents → Settings → Secrets and variables → Actions
- Nome:
GH_PACKAGES_TOKEN - Valor: o PAT gerado
- Repository access: All repositories
- Nome:
-
Workflows: usam
${{ secrets.GH_PACKAGES_TOKEN }}comoNODE_AUTH_TOKEN
Diagrama
┌─────────────────────────────┐
│ Org: cactus-agents │
│ │
│ Org Secret: │
│ GH_PACKAGES_TOKEN = ghp_… │
│ │ │
│ ├──▶ front-web-base │
│ ├──▶ front-web-vera │
│ ├──▶ front-web-7k │
│ └──▶ (todos os forks)│
└─────────────────────────────┘
Configuração local (desenvolvedores)
.npmrc do projeto (commitado)
Cada repo consumidor tem no .npmrc:
@cactus-agents:registry=https://npm.pkg.github.com
Isso redireciona @cactus-agents/* para o GitHub Packages. Não inclui token — a auth fica no ambiente.
Auth do desenvolvedor
Cada dev configura um PAT pessoal no ~/.npmrc global:
//npm.pkg.github.com/:_authToken=ghp_SEU_TOKEN_AQUI
Para gerar:
- GitHub → Settings → Developer settings → Personal access tokens → Tokens (classic)
- Escopo:
read:packages - Gerar e colar no
~/.npmrc
Nunca commite tokens no repositório. O .npmrc do projeto contém apenas o registry, sem token.
Manutenção
PAT expirou
- Gerar novo PAT com
read:packages - Atualizar o org secret
GH_PACKAGES_TOKEN(Org Settings → Secrets → Actions) - Todos os repos são corrigidos automaticamente — não é necessário alterar nada nos workflows
Novo pacote @cactus-agents/*
Nenhuma ação extra. O PAT tem acesso a todos os pacotes da org cactus-agents.
Novo fork criado
Nenhuma ação extra para packages. O org secret GH_PACKAGES_TOKEN é herdado automaticamente.
Apenas configure os secrets específicos do fork:
CLOUDFLARE_API_TOKENCLOUDFLARE_ACCOUNT_ID
Revogar acesso de um desenvolvedor
Remover da org cactus-agents. O PAT pessoal do dev para de funcionar automaticamente.
Fork saindo da org
Se um fork precisar sair da org no futuro:
- Criar um PAT de serviço dedicado com
read:packages - Adicionar como secret no repo externo
- O PAT pode ser revogado individualmente a qualquer momento