@neetru/cli 2.28.7 → 2.28.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +78 -0
- package/README.md +25 -1
- package/dist/commands/admin/oidc-login.d.ts +18 -0
- package/dist/commands/admin/oidc-login.js +68 -3
- package/dist/commands/admin/oidc-login.js.map +1 -1
- package/dist/commands/admin/sdk-credential.js +11 -6
- package/dist/commands/admin/sdk-credential.js.map +1 -1
- package/dist/commands/agent-release.d.ts +2 -0
- package/dist/commands/agent-release.js +41 -29
- package/dist/commands/agent-release.js.map +1 -1
- package/dist/commands/agent-write.d.ts +1 -0
- package/dist/commands/agent-write.js +4 -0
- package/dist/commands/agent-write.js.map +1 -1
- package/dist/commands/ai-models.js +9 -4
- package/dist/commands/ai-models.js.map +1 -1
- package/dist/commands/archive.js +9 -2
- package/dist/commands/archive.js.map +1 -1
- package/dist/commands/auth.js +17 -2
- package/dist/commands/auth.js.map +1 -1
- package/dist/commands/autocomplete.d.ts +1 -1
- package/dist/commands/autocomplete.js +2 -0
- package/dist/commands/autocomplete.js.map +1 -1
- package/dist/commands/chat-menu.js +20 -6
- package/dist/commands/chat-menu.js.map +1 -1
- package/dist/commands/chat.d.ts +14 -0
- package/dist/commands/chat.js +32 -4
- package/dist/commands/chat.js.map +1 -1
- package/dist/commands/config.js +7 -0
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/db-move.d.ts +204 -0
- package/dist/commands/db-move.js +890 -0
- package/dist/commands/db-move.js.map +1 -0
- package/dist/commands/db.d.ts +14 -3
- package/dist/commands/db.js +102 -67
- package/dist/commands/db.js.map +1 -1
- package/dist/commands/deploy.d.ts +15 -0
- package/dist/commands/deploy.js +42 -1
- package/dist/commands/deploy.js.map +1 -1
- package/dist/commands/dev-up.d.ts +5 -0
- package/dist/commands/dev-up.js +29 -4
- package/dist/commands/dev-up.js.map +1 -1
- package/dist/commands/doctor.js +12 -6
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/domains.js +48 -36
- package/dist/commands/domains.js.map +1 -1
- package/dist/commands/init.d.ts +0 -8
- package/dist/commands/init.js +14 -3
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/logs.js +18 -21
- package/dist/commands/logs.js.map +1 -1
- package/dist/commands/mobile.d.ts +26 -0
- package/dist/commands/mobile.js +344 -0
- package/dist/commands/mobile.js.map +1 -0
- package/dist/commands/ops.d.ts +20 -0
- package/dist/commands/ops.js +70 -17
- package/dist/commands/ops.js.map +1 -1
- package/dist/commands/products-db.d.ts +1 -0
- package/dist/commands/products-db.js +15 -15
- package/dist/commands/products-db.js.map +1 -1
- package/dist/commands/promote.js +13 -32
- package/dist/commands/promote.js.map +1 -1
- package/dist/commands/schema.d.ts +4 -0
- package/dist/commands/schema.js +25 -16
- package/dist/commands/schema.js.map +1 -1
- package/dist/commands/servers.d.ts +2 -3
- package/dist/commands/servers.js +4 -7
- package/dist/commands/servers.js.map +1 -1
- package/dist/commands/smoke.d.ts +123 -0
- package/dist/commands/smoke.js +529 -0
- package/dist/commands/smoke.js.map +1 -0
- package/dist/commands/vm-memory.d.ts +53 -0
- package/dist/commands/vm-memory.js +307 -0
- package/dist/commands/vm-memory.js.map +1 -0
- package/dist/commands/vm.d.ts +2 -0
- package/dist/commands/vm.js +8 -0
- package/dist/commands/vm.js.map +1 -1
- package/dist/commands/webhooks.d.ts +2 -0
- package/dist/commands/webhooks.js +7 -0
- package/dist/commands/webhooks.js.map +1 -1
- package/dist/index.js +403 -21
- package/dist/index.js.map +1 -1
- package/dist/lib/agent-artifact-url.d.ts +19 -0
- package/dist/lib/agent-artifact-url.js +48 -0
- package/dist/lib/agent-artifact-url.js.map +1 -0
- package/dist/lib/api-client.d.ts +11 -3
- package/dist/lib/api-client.js +55 -24
- package/dist/lib/api-client.js.map +1 -1
- package/dist/lib/api-error.js +32 -1
- package/dist/lib/api-error.js.map +1 -1
- package/dist/lib/auth.d.ts +2 -9
- package/dist/lib/auth.js +34 -18
- package/dist/lib/auth.js.map +1 -1
- package/dist/lib/cli-write.d.ts +31 -0
- package/dist/lib/cli-write.js +51 -2
- package/dist/lib/cli-write.js.map +1 -1
- package/dist/lib/mobile-local/index.d.ts +7 -0
- package/dist/lib/mobile-local/index.js +7 -0
- package/dist/lib/mobile-local/index.js.map +1 -0
- package/dist/lib/mobile-local/mobile-json.d.ts +57 -0
- package/dist/lib/mobile-local/mobile-json.js +169 -0
- package/dist/lib/mobile-local/mobile-json.js.map +1 -0
- package/dist/lib/product-config.d.ts +5 -0
- package/dist/lib/product-config.js +37 -0
- package/dist/lib/product-config.js.map +1 -0
- package/dist/lib/telemetry.d.ts +7 -0
- package/dist/lib/telemetry.js +9 -0
- package/dist/lib/telemetry.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,84 @@
|
|
|
2
2
|
|
|
3
3
|
Convenção: [Keep a Changelog](https://keepachangelog.com/) + [SemVer](https://semver.org/).
|
|
4
4
|
|
|
5
|
+
## [Unreleased]
|
|
6
|
+
|
|
7
|
+
### Adicionado
|
|
8
|
+
|
|
9
|
+
- **`neetru mobile`** — registro/gestão de Apps Mobile (iOS/Android) do produto atual, consumindo o contrato do Core (`neetru-core` PR #482 — dev-facing, self-service, mesmo padrão de `db`/`domains`).
|
|
10
|
+
- **`neetru mobile init --platform <ios|android> --redirect-uri <https://...> [...]`** — registra o app no Core (`POST /api/cli/v1/products/{slug}/mobile-apps`) e só DEPOIS grava o stub local em `.neetru/mobile.json` (mesma ordem register-antes-do-stub de `db init` — evita entrada órfã se o POST falhar). Flags condicionais por plataforma: `--bundle-id`/`--team-id` (ios), `--package-name`/`--sha-fingerprint` (repetível, android), `--name` opcional. `--redirect-uri` **precisa** ser `https://` (Universal Link/App Link, RFC 8252) — custom scheme (`meuapp://`) é rejeitado localmente e pelo Core, decisão de segurança do owner, não limitação temporária. Resposta traz o `oidcClientId` (PKCE público, sem client secret) — a saída lembra de configurar `NEETRU_MOBILE_CLIENT_ID` no app.
|
|
11
|
+
- **`neetru mobile list`** — `GET` dos apps mobile do produto atual, tabela (platform/bundle-package/status/oidcClientId) ou `--json`.
|
|
12
|
+
- **`neetru mobile revoke <appId>`** — `DELETE`, destrutivo top-tier (admin ONLY + step-up MFA, mesmo gate de `servers deactivate`) — mata sessões ativas do app instantaneamente. `confirmDestructive` + `resolveStepUp`, fail-closed em `--json`/sem TTY (exige `--yes` explícito). Remove a entrada de `.neetru/mobile.json` só DEPOIS do sucesso remoto.
|
|
13
|
+
- Novo módulo `@neetru/mobile-local` (`src/lib/mobile-local/`) — contrato do `.neetru/mobile.json`, espelha `@neetru/db-local` (registry versionado, migração defensiva, escrita atômica temp-file+rename).
|
|
14
|
+
- Extraído `loadProductConfig` (lê `neetru.config.json`) para `src/lib/product-config.js` — `db.ts` migrado para reusar (era uma cópia privada duplicada por arquivo; evita mais uma).
|
|
15
|
+
|
|
16
|
+
- **`neetru smoke`** — percorre as páginas do produto **local** (contra `next dev`/`neetru dev up` via `--base-url`, default `http://localhost:3000`) **antes** de `neetru build` + `neetru deploy`, pegando página quebrada, login que não renderiza ou banco fora do ar sem subir nada em produção. Nasceu do pedido do owner: devs não estavam testando o SaaS localmente antes de mandar pra prod.
|
|
17
|
+
- **Checks (cada um vira ✓ pass / ✗ fail / ⚠ warn):** (1) **alcance das rotas** — auto-descobre rotas do App Router (`app/**/page.*`) e do Pages Router legado (`pages/**/*` exceto `_app`/`_document`/`api`); route groups `(...)` removidos; segmentos dinâmicos `[param]`/`[...slug]` **pulados com aviso** (sem valor de amostra trivial); GET em cada rota, passa em 200–399 sem marcador de erro no corpo, falha em `>=400` ou marcador (`Application error`, `Internal Server Error`, `__next_error__`, 404 do Next, título 500). (2) **login carrega** — sem botão/afford de login detectado = aviso, não-200 = falha. (3) **banco/health** — GET no `--health-path` (default `/api/health`): 200 saudável passa, **404 = aviso** (produto não expõe health path — DB não verificável por aqui), outro não-200 = falha. (4) **smoke de prod** (só com `--prod`) — GET em `<prod>/` e `<prod><health-path>`, espera 200 em cada.
|
|
18
|
+
- Flags: `--base-url`, `--prod`, `--health-path`, `--routes <csv>` (sobrescreve a auto-descoberta), `--timeout <ms>` (default 10000), `--json` (uma linha, mesma disciplina de `neetru build --json`). Exit `1` se **qualquer** check falhar; avisos não bloqueiam.
|
|
19
|
+
- **Decisão LEVE, sem Playwright/headless browser** — o CLI é publicado no npm e não pode ganhar uma dependência de ~300MB de browser; usa só HTTP GET (fetch nativo) + inspeção do HTML/JSON retornado. **v2 deferido e documentado:** captura de erro de console (que exigiria um browser real) fica atrás de um flag opt-in que instalaria o headless sob demanda.
|
|
20
|
+
- **`neetru vm memory`** — controle de memória (RAM) por inquilino na VM (incidente OOM 2026-09-07 — PDV caiu por falta de RAM na VM multi-inquilino).
|
|
21
|
+
- **`neetru vm memory status [serverId]`** (alias `list`) — lista os inquilinos da VM compartilhada com **teto desejado** (systemd `MemoryMax`), **uso vivo** reportado pelo heartbeat, **folga** por inquilino e o rodapé de **Σ tetos + reserva SO/DB vs RAM total** (com o teto da soma a 90% da RAM). `GET /api/cli/v1/servers/{id}/memory`. Modo `--json` para consumo programático.
|
|
22
|
+
- **`neetru vm memory set <slug> --memory-max <MB> [--max-old-space <MB>] [--high <MB>]`** — define o teto de memória de um inquilino de forma GERENCIADA (antes era ajuste manual de drop-in systemd pelo Suporte). `POST /api/cli/v1/servers/{id}/memory` → Server Action `setProductMemoryLimit` do Core.
|
|
23
|
+
- **Guardrail (avisa; o Core recusa fail-closed):** antes de enviar, o CLI faz o GET da alocação atual, projeta a nova soma e **AVISA** quando `Σ tetos + reserva` passa de `RAM × 0.90` (`memory_overcommit` — OOM garantido) ou quando o teto novo cai **abaixo do uso vivo × 1.15** (`memory_shrink_below_usage` — pode OOM o próprio alvo, exige `--confirm-shrink`). A autoridade fail-closed é o Core; o CLI só mostra a conta.
|
|
24
|
+
- **Ergonomia:** só `--max-old-space` (sem `--memory-max`) herda o teto atual do slug (mudança só-de-heap); `--memory-max` tem o alias `--max`; `--mfa` tem o alias `--mfa-token`.
|
|
25
|
+
- **Validações fail-fast (espelham o schema do Core):** slug `/^[a-z][a-z0-9-]*$/`, piso duro `MemoryMax ≥ 64MB`, `--high ≤ --memory-max`, `--max-old-space < --memory-max` (o heap V8 tem que caber no cgroup com folga pra RSS — senão OOM-kill em vez de GC).
|
|
26
|
+
- **Superfície sensível de infra → step-up MFA** (`X-Neetru-MFA-Session`/`-Token` via `resolveStepUp`; a rota do Core exige `requireCliStepUpMfa`) + confirmação interativa (bypass `--yes`; em `--json` exige `--mfa`).
|
|
27
|
+
- **Alias `neetru products memory set <slug>`** (design §3.7) — delega ao mesmo core, resolvendo a VM via `--server`/picker.
|
|
28
|
+
- **`neetru db move`** — relocação ATÔMICA de um banco de produto entre VMs (Fase 2 / PR #423 — relocate atômico snee-002 → snee-003). Nasceu do incidente snee-002 sem RAM (PDV em OOM): mover Postgres/Mongo na mão é risco G1/G2 (banco meio-migrado = inalcançável = outage pior que o OOM), então a ferramenta vem primeiro.
|
|
29
|
+
- **`neetru db move --product <slug> --to <serverId>`** — dá o kickoff da máquina de estados no Core (`relocateProductDatabase` → `POST /api/cli/v1/db/[id]/relocate`) e **acompanha o progresso**, reportando **SUCESSO só quando o Core confirma o cutover VERIFICADO** (`state=done`). Resolve o banco por `--product <slug>` (fail-closed em ambiguidade: pede `--db <dbId>`/`--env`) ou aceita `--db <dbId>` explícito.
|
|
30
|
+
- **Progresso ostensivo da máquina de estados** — imprime cada transição (`planning → provisioning_target → replicating → verifying_target → quiescing_source → final_sync → cutover → observing → draining_source → done`) com rótulo PT-BR.
|
|
31
|
+
- **Rollback reportado como fail-closed** — em `rolled_back`/`failed` imprime o `code` do erro E "**o produto NÃO foi movido — seguiu na origem**" (INV-2), sai com **exit code 1**, e **nunca** afirma "concluída".
|
|
32
|
+
- **Confirmação interativa** antes de mover (destrutivo sobre banco de produção), pulável com **`--yes`** (modo script). **Step-up MFA** via `resolveStepUp` (sessão 1h → `--mfa-token` → prompt).
|
|
33
|
+
- Flags: `--strategy snapshot_quiesce|logical_stream` (padrão `snapshot_quiesce`), `--manual-cutover` (pausa em `verifying_target` aguardando `db move confirm`), `--max-quiesce-ms <n>` (padrão 15000, **teto duro 60000** — guardrail INV-1), `--dry-run` (só o preflight, sem MFA/sem provisionar), `--no-watch` (só dispara e imprime o `migrationId`).
|
|
34
|
+
- **`neetru db move status <migrationId>`** — estado da relocação + `verifyReport` (contagem por tabela origem vs destino) + gates.
|
|
35
|
+
- **`neetru db move confirm <migrationId> --mfa <code>`** — libera o cutover manual (`--manual-cutover`).
|
|
36
|
+
- **`neetru db move abort <migrationId> --reason "<t>"`** — dispara o rollback do estado atual (exige `--reason`; confirmação interativa pulável com `--yes`).
|
|
37
|
+
- **`neetru db where --product <slug>` / `--db <dbId>`** — READ-ONLY: mostra em qual VM o banco de um produto **vive hoje** (serverId + endpoint). Complementa `neetru db status <dbId>` (que exige o dbId) aceitando o slug do produto.
|
|
38
|
+
- **Nota:** os endpoints `/api/cli/v1/db/[id]/relocate` e `/api/cli/v1/db/relocate/[migrationId]{,/confirm,/abort}` são o contrato com o Core, construídos pelo componente irmão (Fase 2 / PR #423). Este bump entrega só a superfície CLI; o `db move` real depende do Core estar publicado com esses endpoints.
|
|
39
|
+
|
|
40
|
+
### Testes
|
|
41
|
+
|
|
42
|
+
- **`mobile-local.test.ts`** (novo) — `@neetru/mobile-local`: migração defensiva do `.neetru/mobile.json` (entradas malformadas descartadas, upgrade sem `version`, default `status: 'active'`), round-trip `readMobileJson`/`writeMobileJson` (atômico, sem lixo `.tmp-*`), `upsertMobileApp`/`removeMobileApp`.
|
|
43
|
+
- **`mobile-commands.test.ts`** (novo) — `neetru mobile`: validação por-plataforma em `init` (ios exige bundle-id+team-id, android exige package-name+sha-fingerprint, redirect-uri precisa `https://`), ordem register-no-Core-antes-do-stub-local, **POST falho NÃO deixa `.neetru/mobile.json` órfão** (nem sobrescreve entradas pré-existentes), `list` happy-path/`--json`/erro de API, `revoke` fail-closed sem `--yes`/`--json`/TTY, header MFA (`X-Neetru-MFA-Token`) anexado no DELETE, remoção local só após sucesso remoto (DELETE falho preserva o registry).
|
|
44
|
+
- **`smoke.test.ts`** (novo, 18 testes): descoberta de rotas a partir de fixture `app/` (route groups removidos, dinâmicos pulados/avisados, `api/` excluída); alcance (pass 200, fail 500, fail em marcador de erro no corpo 200, unit de `classifyReachability`); health (pass ok JSON, warn 404, fail 503, unit de `classifyHealth`); login (warn sem afford, fail não-200); saída `--json` (shape + `ok=false` + exit 1 via ExitSentinel); smoke de prod só roda com `--prod`. `fetchImpl` e diretório de descoberta injetados — sem servidor vivo.
|
|
45
|
+
- `top-level-commands-coverage.regression.test.ts`: `smoke` adicionado a `TOP_LEVEL_COMMANDS` (autocomplete) pra acompanhar o novo comando em `index.ts`.
|
|
46
|
+
- **`vm-memory.test.ts`** (novo, 18 casos): status GET+JSON+tabela; set GET→POST com body correto + header MFA; alias `--max`; herança de teto com só `--max-old-space`; `--high`/`--confirm-shrink`/`--reason` no body; validações fail-fast (slug inválido, sem flags, `max-old-space ≥ memory-max`, `high > memory-max`, abaixo do piso, não-inteiro, slug sem teto); avisos de overcommit / encolhimento / RAM desconhecida (o Core continua sendo a autoridade fail-closed).
|
|
47
|
+
- **`db-move.test.ts`** (novo) — mocka o Core (`apiRequest`) e as deps de escrita. Cobre: (a) **sucesso** (só reporta "concluída" quando o poll chega em `done`; body/headers/MFA corretos no POST); (b) **falha com rollback** (`rolled_back` + `lastError` → "seguiu na origem" + `setSafeExitCode(1)`, sem afirmar sucesso); (c) **`--yes`** (repassa `yes:true` ao `confirmDestructive` e prossegue); (d) **`--dry-run`** (sem confirmação/MFA, `body.dryRun=true`, sem poll); (e) manual-cutover (pausa e instrui `db move confirm`); (f) guardrails de input (`--to` ausente, estratégia inválida, produto ambíguo → exit 1 sem tocar o Core); (g) `confirm`/`abort`/`status`/`where`; e os helpers PUROS (`classifyRelocation`, `validateMaxQuiesceMs`, `formatVerifyReportLines`).
|
|
48
|
+
|
|
49
|
+
## [2.28.10] — 2026-09-29 (segurança: step-up MFA nas rotas endurecidas pela auditoria cli/v1 do Core)
|
|
50
|
+
|
|
51
|
+
> **Publicar ANTES do deploy do Core** com a auditoria cli/v1 2026-09-29 (branch `fix/cli-v1-auditoria-2026-09-29` do `neetru-core`). Sem este CLI, os comandos abaixo passam a bater `401 mfa_required` sempre. Contra o Core atual os headers MFA são ignorados (compatível).
|
|
52
|
+
|
|
53
|
+
### Segurança / Corrigido
|
|
54
|
+
|
|
55
|
+
- **`neetru agent release`** — o Core exige step-up MFA em **todos** os canais (H1: publicar release atinge a frota inteira via auto-update). Novo `--mfa-token <code>`; segue o `resolveStepUp` padrão (sessão de 1h → `--mfa-token` → prompt TOTP; fail-closed sem TTY). A URL de cada binário agora é **validada localmente** com a mesma regra do Core (`src/lib/agent-artifact-url.ts`): só `https://core.neetru.com/releases/...` ou o bucket GCS de releases (`neetru-agent-releases`, ou `NEETRU_AGENT_RELEASES_BUCKET`) — sem porta, sem credencial embutida. Fora disso: erro claro com as origens aceitas, **antes** de pedir MFA ou chamar a API. `--dry-run` segue sem MFA.
|
|
56
|
+
- **`neetru ops reg-token`** — step-up MFA obrigatório (H5) + `--mfa-token`.
|
|
57
|
+
- **`neetru ops bootstrap-admin`** — com admin existente o Core exige step-up MFA (H2). Como o CLI não sabe se já há admin, manda a sessão de 1h / `--mfa-token` se houver e, no `401 mfa_required`, prompta o TOTP e repete uma vez (em `--json`/não-TTY: fail-closed com `error: "mfa_required"`). Novo **`--reactivate`** (envia `reactivate: true`) para reativar staff desligado — sem ele o Core recusa com 409 `staff_disabled`.
|
|
58
|
+
- **`neetru ops migrate cli-keys`** — step-up MFA fora do `--dry-run` (M4) + `--mfa-token`. Dry-run segue sem MFA.
|
|
59
|
+
- **`neetru vm provision`** — step-up MFA obrigatório (M6: cada chamada cria uma VM faturada), resolvido depois da confirmação de custo + `--mfa-token`.
|
|
60
|
+
- **`neetru deploy --env prod|production`** — step-up MFA (M7, mesmo gate de `promote`) nos três alvos (vm, workspace, cloud-run), resolvido **logo antes** do `POST /api/cli/v1/deploy` (depois do build/upload, pra o TOTP não vencer no meio). Novo `--mfa-token`. `dev`/`staging` inalterados. Com `--non-interactive`/`--json` nunca prompta (fail-closed com instrução).
|
|
61
|
+
- **Mensagem do 401** — `handleApiError` distingue `401 mfa_required` ("Step-up MFA exigido: … passe --mfa-token ou rode `neetru auth mfa-session`"; `--json`: `error: "mfa_required"`) de token inválido, e mostra a `message`/`error_description` que o `requireCliAuth` do Core passou a mandar (M8). O 401 legado (`{error:"Unauthorized"}`) mantém o fallback "Execute: neetru login". Exit code segue 2. O parser do `apiRequest` passa a preferir `code` explícito ao `error` string (RFC) quando os dois vêm juntos.
|
|
62
|
+
- Não há comando `functions move|redeploy|revert` no CLI — o gate de MFA (M5) dessas rotas não tem superfície aqui.
|
|
63
|
+
|
|
64
|
+
Revisão adversarial do Core (`neetru-core` PR #512):
|
|
65
|
+
|
|
66
|
+
- **`neetru agent canary start`** — step-up MFA (start empurra a versão pra parte da frota, mesmo peso do rollback) + `--mfa-token`.
|
|
67
|
+
- **`neetru servers provision`** — MFA em **toda** provisão (M6; antes só com `--is-db-vm`).
|
|
68
|
+
- **`neetru admin database set-status`** — o Core exige MFA quando o banco está `active`/`degraded` (H3). Como o CLI não sabe o estado, usa `withStepUpRetry` (tenta; no `401 mfa_required` pede o TOTP e repete 1x) + `--mfa-token`. `archived` passou a ser recusado pelo Core nessa rota (use `db delete`).
|
|
69
|
+
- **Novo `neetru admin oidc-login rotate <clientId> --product-id <id> [--immediate]`** — `POST /api/cli/v1/products/{id}/oidc-login/rotate` com step-up MFA. Mesmo contrato do `create`: o Core **não devolve o secret** (vai pro Secret Manager e o próximo deploy o injeta server-side); a saída mostra `previousSecretValidUntil` (graça de 24h) ou, com `--immediate` (`{immediate:true}`), avisa que o secret anterior já não vale e o login cai até o próximo deploy.
|
|
70
|
+
- **`neetru ops bootstrap-admin`** sem admin existente — envia `x-bootstrap-secret` a partir de `--bootstrap-secret <valor>` ou env `NEETRU_BOOTSTRAP_SECRET` (nunca logado/impresso); com o segredo, a sessão CLI é opcional.
|
|
71
|
+
|
|
72
|
+
### Interno
|
|
73
|
+
|
|
74
|
+
- `cli-write`: `withStepUpRetry` (step-up condicional com retry único no `401 mfa_required`), `isMfaRequiredError`; `StepUpOptions` ganha `nonInteractive` e `skipSession`.
|
|
75
|
+
|
|
76
|
+
### Testes
|
|
77
|
+
|
|
78
|
+
- **`step-up-mfa-auditoria-cli-v1.test.ts`** (novo, `cli-write` real + `homedir` temporário): allowlist da URL (aceita/recusa, env do bucket); `agent release` (URL ruim → exit 1 sem MFA/API; header token/sessão; fail-closed; dry-run); `reg-token`; `bootstrap-admin` (sem 401 → 1 chamada; `--reactivate` no body; retry com prompt TOTP; sessão recusada → retry ignora a sessão; `--json` fail-closed; TOTP recusado não repete → exit 2); `migrate cli-keys` (dry-run sem header; aplicar com header; fail-closed); `vm provision`; `deploy` (`isProdEnv`, staging sem MFA, prod/production com header, `--non-interactive` não prompta mesmo com TTY); revisão #512: `agent canary start`, `servers provision` sem `--is-db-vm`, `admin database set-status` (sem 401 → sem MFA; retry com TOTP; `--json` fail-closed), `admin oidc-login rotate` (rota, body com/sem `immediate`, saída, fail-closed) e `bootstrap-admin --bootstrap-secret`/env (header enviado, valor nunca impresso, sessão opcional).
|
|
79
|
+
- `cli-mfa-destructive-surface.test.ts`: `servers provision` de app passa a exigir MFA (teste invertido); `agent canary start` e `servers provision` entram na enumeração destrutiva.
|
|
80
|
+
- **`api-error-401-shape.test.ts`** (novo): parser do 401 novo/legado/RFC/`mfa_required` via `fetch` stubado; mensagens e JSON do `handleApiError`.
|
|
81
|
+
- `ops-new-commands.test.ts` / `deploy.test.ts`: testes existentes de `migrate cli-keys` (aplicar) e `deploy --env prod` passam `mfaToken`; o de deploy afirma o header MFA no POST.
|
|
82
|
+
|
|
5
83
|
## [2.28.7] — 2026-09-07 (fix: `servers force-cleanup` sem step-up MFA — drift do P0.4)
|
|
6
84
|
|
|
7
85
|
### Corrigido
|
package/README.md
CHANGED
|
@@ -53,6 +53,7 @@ Cria produto + workspace + scaffold local Next.js 15 + instala deps + abre cockp
|
|
|
53
53
|
| `neetru add <feature>` | Adicionar features ao scaffold (auth, billing, etc) |
|
|
54
54
|
| `neetru deploy` | Pipeline de deploy interativo (cloud-run / vm / workspace) |
|
|
55
55
|
| `neetru build [--stack ...] [--target-env dev\|workspace\|prod] [--env-file ...] [--no-cache] [--no-install]` | Empacotar produto em tarball pra deploy |
|
|
56
|
+
| `neetru smoke [--base-url ...] [--prod ...] [--health-path ...] [--routes csv] [--json]` | Percorrer as páginas do produto **local** antes do deploy (alcance + login + DB) + smoke de prod opcional |
|
|
56
57
|
| `neetru promote` | Promover dev → staging → prod |
|
|
57
58
|
| `neetru env switch <target>` | Trocar `NEETRU_ENV` no `.env.local` |
|
|
58
59
|
| `neetru env set --service=X --set KEY=VAL` | Setar env vars de serviço Cloud Run |
|
|
@@ -144,6 +145,28 @@ Isso existe porque o Next.js carrega `.env.local` (arquivo do disco do dev, nunc
|
|
|
144
145
|
|
|
145
146
|
Se o produto envolver `next.config.mjs` com `withNeetruBuildGuard` (`@neetru/sdk/build-guard`, `@neetru/sdk >= 3.1.15`), `neetru build` confere pós-build que o env realmente compilado bate com o esperado — e **recusa empacotar o tarball** se divergir, em vez de deployar um bundle quebrado silenciosamente.
|
|
146
147
|
|
|
148
|
+
## Smoke local antes do deploy (`neetru smoke`)
|
|
149
|
+
|
|
150
|
+
Roda contra o servidor **dev local** (`next dev` / `neetru dev up`) e percorre as páginas do produto **antes** de `neetru build` + `neetru deploy` — pega página quebrada, login que não renderiza ou banco fora do ar sem subir nada em produção.
|
|
151
|
+
|
|
152
|
+
```bash
|
|
153
|
+
# suba o dev local primeiro (ex: next dev na porta 3000), depois:
|
|
154
|
+
neetru smoke
|
|
155
|
+
neetru smoke --base-url=http://localhost:9002 --health-path=/api/health
|
|
156
|
+
neetru smoke --routes=/,/login,/dashboard # rotas explícitas (pula a auto-descoberta)
|
|
157
|
+
neetru smoke --prod=https://meu-saas.neetru.com # + smoke básico de prod (GET / e health, espera 200)
|
|
158
|
+
neetru smoke --json | jq '.summary' # saída de 1 linha machine-readable
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
O que verifica (cada check vira ✓ pass / ✗ fail / ⚠ warn):
|
|
162
|
+
|
|
163
|
+
1. **Alcance das rotas** — auto-descobre as rotas do App Router (`app/**/page.*`) e do Pages Router legado (`pages/**/*`, exceto `_app`/`_document`/`api`). Route groups `(...)` são removidos; segmentos dinâmicos `[param]`/`[...slug]` são **pulados com aviso** (não há valor de amostra trivial). GET em cada rota: passa em 200–399 sem marcador de erro no corpo; falha em `>=400` ou marcador (`Application error`, `Internal Server Error`, `__next_error__`, 404 do Next, título 500).
|
|
164
|
+
2. **Login carrega** — acha a rota de login e confere que renderiza; sem um botão/afford de login detectado vira **aviso**, não falha; não-200 falha.
|
|
165
|
+
3. **Banco / health** — GET no `--health-path`: 200 com corpo saudável passa; **404 vira aviso** (produto não expõe health path — DB não verificável por aqui); qualquer outro não-200 falha.
|
|
166
|
+
4. **Smoke de prod** (só com `--prod`) — GET em `<prod>/` e `<prod><health-path>`, espera 200 em cada.
|
|
167
|
+
|
|
168
|
+
Exit `1` se **qualquer** check falhar (avisos não bloqueiam). Abordagem **leve, sem Playwright/headless browser** — o CLI é publicado no npm e não pode ganhar uma dependência de ~300MB de browser. Captura de erro de console (que exigiria um browser real) fica para um **v2** documentado, atrás de um flag opt-in que instale o headless sob demanda.
|
|
169
|
+
|
|
147
170
|
## Configuração
|
|
148
171
|
|
|
149
172
|
Token Bearer fica em `~/.config/neetru-cli/auth.json` (chmod 0600 em Unix, NTFS ACL em Windows) — gerado por `neetru login` via OAuth Device Code Flow. Configs gerais ficam em `~/.config/neetru-cli/config.json` (Linux/macOS) ou `%APPDATA%\neetru-cli\config.json` (Windows):
|
|
@@ -176,7 +199,8 @@ neetru audit tail --json | jq 'select(.action | startswith("billing"))'
|
|
|
176
199
|
- **Tokens** salvos em `~/.config/neetru-cli/auth.json` (chmod 0600 em Unix, NTFS ACL em Windows). Desde 2.11.0 o resolver canônico (`getActiveTokenSync`) prefere esse arquivo sobre o Conf storage legado (que será removido em 2.12.0)
|
|
177
200
|
- **URL allowlist** (desde 2.11.0): `neetruApiUrl` rejeita hosts fora de `*.neetru.com` + `localhost` sem `--allow-untrusted-url` — fecha vetor de exfiltração do Bearer token
|
|
178
201
|
- **Rate-limit** por método HTTP: GET 120/min, POST/PUT/PATCH 30/min, DELETE 5/min
|
|
179
|
-
- **Step-up MFA** (TOTP) obrigatório em operações destrutivas: `--mfa-token <code>` ou prompt
|
|
202
|
+
- **Step-up MFA** (TOTP) obrigatório em operações destrutivas: sessão de 1h (`neetru auth mfa-session`), `--mfa-token <code>` ou prompt (em `--json`/sem TTY: fail-closed). Desde 2.28.10 também em `agent release` (todos os canais), `ops reg-token`, `ops bootstrap-admin` (quando já há admin; `--reactivate` reativa staff desligado), `ops migrate cli-keys` (fora do dry-run), `vm provision` e `deploy --env prod`
|
|
203
|
+
- **`agent release`** só aceita binários em `https://core.neetru.com/releases/...` ou no bucket GCS de releases (validado localmente, mesma regra do Core)
|
|
180
204
|
- **Dry-run** disponível em comandos de mutação: `--dry-run` mostra efeito SEM aplicar
|
|
181
205
|
- **Telemetry** opt-in (desde 2.11.0): habilitando `telemetry.enabled=true` o CLI emite `{command, durationMs, ok, exitCode}` anônimo via `installId` UUID. Zero token/path/email/env vazam
|
|
182
206
|
|
|
@@ -9,6 +9,24 @@ export interface OidcLoginCreateOptions {
|
|
|
9
9
|
json?: boolean;
|
|
10
10
|
}
|
|
11
11
|
export declare function runOidcLoginCreate(opts: OidcLoginCreateOptions): Promise<void>;
|
|
12
|
+
export interface OidcLoginRotateOptions {
|
|
13
|
+
productId?: string;
|
|
14
|
+
/** `--immediate` — revoga o secret anterior na hora (sem a graça de 24h). */
|
|
15
|
+
immediate?: boolean;
|
|
16
|
+
mfaToken?: string;
|
|
17
|
+
json?: boolean;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* `neetru admin oidc-login rotate <clientId> --product-id <id> [--immediate]`
|
|
21
|
+
*
|
|
22
|
+
* `POST /api/cli/v1/products/{productId}/oidc-login/rotate` (H4, auditoria
|
|
23
|
+
* cli/v1 2026-09-29). Mesmo contrato de `create`: o Core NÃO devolve o
|
|
24
|
+
* `client_secret` — grava a versão nova no Secret Manager e o PRÓXIMO deploy a
|
|
25
|
+
* injeta server-side. O secret anterior segue aceito até
|
|
26
|
+
* `previousSecretValidUntil` (24h); com `--immediate` ele é revogado na hora e o
|
|
27
|
+
* login do produto fica fora até o próximo deploy. Step-up MFA obrigatório.
|
|
28
|
+
*/
|
|
29
|
+
export declare function runOidcLoginRotate(clientId: string, opts: OidcLoginRotateOptions): Promise<void>;
|
|
12
30
|
export interface OidcLoginListOptions {
|
|
13
31
|
productId?: string;
|
|
14
32
|
json?: boolean;
|
|
@@ -13,6 +13,8 @@
|
|
|
13
13
|
* Sub-comandos:
|
|
14
14
|
* create — cria o login-client (PUBLIC/PKCE por default; --confidential p/ BFF)
|
|
15
15
|
* list — lista os login-clients do produto (mascarado, sem secret)
|
|
16
|
+
* rotate — rotaciona o client_secret (MFA; --immediate revoga o anterior na hora)
|
|
17
|
+
* rotate — rotaciona o client_secret (MFA; --immediate revoga o anterior na hora)
|
|
16
18
|
*
|
|
17
19
|
* Dois padrões de `redirect_uri` (o `/authorize` faz match EXATO byte-a-byte):
|
|
18
20
|
* - PUBLIC (PKCE client-side puro, ex.: NeetruLoginButton sem backend) → o SDK
|
|
@@ -23,11 +25,14 @@
|
|
|
23
25
|
* Endpoints (Core):
|
|
24
26
|
* GET /api/cli/v1/products/{productId}/oidc-login
|
|
25
27
|
* POST /api/cli/v1/products/{productId}/oidc-login
|
|
28
|
+
* POST /api/cli/v1/products/{productId}/oidc-login/rotate
|
|
29
|
+
* POST /api/cli/v1/products/{productId}/oidc-login/rotate
|
|
26
30
|
*/
|
|
27
31
|
import chalk from 'chalk';
|
|
28
32
|
import ora from 'ora';
|
|
29
33
|
import { apiRequest } from '../../lib/api-client.js';
|
|
30
34
|
import { requireToken, handleApiError } from '../../lib/cli-read.js';
|
|
35
|
+
import { resolveStepUp } from '../../lib/cli-write.js';
|
|
31
36
|
import { renderTable } from '../../lib/render.js';
|
|
32
37
|
import { log } from '../../utils/logger.js';
|
|
33
38
|
import { safeExit } from '../../utils/safe-exit.js';
|
|
@@ -67,9 +72,11 @@ export async function runOidcLoginCreate(opts) {
|
|
|
67
72
|
// pula a tela (autoConsent) — use só para integração 1ª-parte consciente.
|
|
68
73
|
if (opts.noConsent)
|
|
69
74
|
body.autoConsent = true;
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
75
|
+
// step-up MFA canônico (mesmo hotfix de `admin database rotate` 2026-08-16):
|
|
76
|
+
// honra a sessão MFA de 1h (`neetru auth mfa-session`) → X-Neetru-MFA-Session,
|
|
77
|
+
// senão --mfa-token → X-Neetru-MFA-Token, senão prompt (fail-closed em
|
|
78
|
+
// --json/não-TTY). Antes montava o header só do --mfa-token, ignorando a sessão.
|
|
79
|
+
const { headers } = await resolveStepUp({ mfaToken: opts.mfaToken, json: opts.json });
|
|
73
80
|
const spinner = opts.json
|
|
74
81
|
? null
|
|
75
82
|
: ora({ text: 'Criando login-client OIDC…', color: 'blue' }).start();
|
|
@@ -108,6 +115,64 @@ export async function runOidcLoginCreate(opts) {
|
|
|
108
115
|
' bater com o que o SDK envia (PKCE client-side puro = a ORIGIN do produto).'));
|
|
109
116
|
console.log();
|
|
110
117
|
}
|
|
118
|
+
/**
|
|
119
|
+
* `neetru admin oidc-login rotate <clientId> --product-id <id> [--immediate]`
|
|
120
|
+
*
|
|
121
|
+
* `POST /api/cli/v1/products/{productId}/oidc-login/rotate` (H4, auditoria
|
|
122
|
+
* cli/v1 2026-09-29). Mesmo contrato de `create`: o Core NÃO devolve o
|
|
123
|
+
* `client_secret` — grava a versão nova no Secret Manager e o PRÓXIMO deploy a
|
|
124
|
+
* injeta server-side. O secret anterior segue aceito até
|
|
125
|
+
* `previousSecretValidUntil` (24h); com `--immediate` ele é revogado na hora e o
|
|
126
|
+
* login do produto fica fora até o próximo deploy. Step-up MFA obrigatório.
|
|
127
|
+
*/
|
|
128
|
+
export async function runOidcLoginRotate(clientId, opts) {
|
|
129
|
+
const token = await requireToken(opts.json);
|
|
130
|
+
function fail(message) {
|
|
131
|
+
if (opts.json) {
|
|
132
|
+
console.log(JSON.stringify({ ok: false, error: 'missing_param', message }));
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
log.error(message);
|
|
136
|
+
}
|
|
137
|
+
return safeExit(1);
|
|
138
|
+
}
|
|
139
|
+
if (!clientId || !clientId.trim())
|
|
140
|
+
fail('<clientId> é obrigatório.');
|
|
141
|
+
if (!opts.productId)
|
|
142
|
+
fail('--product-id é obrigatório.');
|
|
143
|
+
const { headers } = await resolveStepUp({ mfaToken: opts.mfaToken, json: opts.json });
|
|
144
|
+
const spinner = opts.json
|
|
145
|
+
? null
|
|
146
|
+
: ora({ text: `Rotacionando credencial de ${clientId}…`, color: 'blue' }).start();
|
|
147
|
+
let res;
|
|
148
|
+
try {
|
|
149
|
+
res = await apiRequest(`/api/cli/v1/products/${encodeURIComponent(opts.productId)}/oidc-login/rotate`, {
|
|
150
|
+
method: 'POST',
|
|
151
|
+
token,
|
|
152
|
+
headers,
|
|
153
|
+
body: { clientId: clientId.trim(), ...(opts.immediate ? { immediate: true } : {}) },
|
|
154
|
+
});
|
|
155
|
+
spinner?.stop();
|
|
156
|
+
}
|
|
157
|
+
catch (error) {
|
|
158
|
+
spinner?.fail('Falha ao rotacionar a credencial.');
|
|
159
|
+
handleApiError(error, opts.json);
|
|
160
|
+
}
|
|
161
|
+
if (opts.json) {
|
|
162
|
+
console.log(JSON.stringify(res));
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
console.log();
|
|
166
|
+
log.success(`Credencial do login-client ${chalk.cyan(res.clientId)} rotacionada.`);
|
|
167
|
+
console.log(chalk.yellow(' NEETRU_CLIENT_SECRET novo → Secret Manager; NÃO é exibido. O próximo deploy o injeta server-side.'));
|
|
168
|
+
if (res.immediate || opts.immediate) {
|
|
169
|
+
console.log(chalk.red(' --immediate: o secret anterior JÁ NÃO VALE — o login do produto fica fora até o próximo deploy. Rode o deploy agora.'));
|
|
170
|
+
}
|
|
171
|
+
else if (res.previousSecretValidUntil) {
|
|
172
|
+
console.log(` ${chalk.dim('secret anterior aceito até')} ${res.previousSecretValidUntil} — faça o deploy antes disso.`);
|
|
173
|
+
}
|
|
174
|
+
console.log();
|
|
175
|
+
}
|
|
111
176
|
export async function runOidcLoginList(opts) {
|
|
112
177
|
const token = await requireToken(opts.json);
|
|
113
178
|
if (!opts.productId) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oidc-login.js","sourceRoot":"","sources":["../../../src/commands/admin/oidc-login.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"oidc-login.js","sourceRoot":"","sources":["../../../src/commands/admin/oidc-login.ts"],"names":[],"mappings":"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"}
|
|
@@ -22,6 +22,7 @@ import chalk from 'chalk';
|
|
|
22
22
|
import ora from 'ora';
|
|
23
23
|
import { apiRequest } from '../../lib/api-client.js';
|
|
24
24
|
import { requireToken, handleApiError } from '../../lib/cli-read.js';
|
|
25
|
+
import { resolveStepUp } from '../../lib/cli-write.js';
|
|
25
26
|
import { renderTable } from '../../lib/render.js';
|
|
26
27
|
import { log } from '../../utils/logger.js';
|
|
27
28
|
import { safeExit } from '../../utils/safe-exit.js';
|
|
@@ -52,9 +53,13 @@ export async function runSdkCredentialCreate(opts) {
|
|
|
52
53
|
const body = { name: opts.name };
|
|
53
54
|
if (scopesList)
|
|
54
55
|
body.allowedScopes = scopesList;
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
56
|
+
// step-up MFA canônico (mesmo hotfix aplicado em `admin database rotate`
|
|
57
|
+
// 2026-08-16): resolveStepUp honra a sessão MFA de 1h (`neetru auth
|
|
58
|
+
// mfa-session`) → X-Neetru-MFA-Session, senão --mfa-token → X-Neetru-MFA-Token,
|
|
59
|
+
// senão prompt (fail-closed em --json/não-TTY com mensagem acionável). Antes
|
|
60
|
+
// montava o header só de --mfa-token, IGNORANDO a sessão de 1h — o operador com
|
|
61
|
+
// sessão ativa levava 401 fantasma ('Token inválido... neetru login').
|
|
62
|
+
const { headers } = await resolveStepUp({ mfaToken: opts.mfaToken, json: opts.json });
|
|
58
63
|
const spinner = opts.json
|
|
59
64
|
? null
|
|
60
65
|
: ora({ text: 'Criando credencial OIDC…', color: 'blue' }).start();
|
|
@@ -145,9 +150,9 @@ export async function runSdkCredentialRevoke(clientId, opts) {
|
|
|
145
150
|
}
|
|
146
151
|
safeExit(1);
|
|
147
152
|
}
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
153
|
+
// step-up MFA canônico (idem create): honra a sessão de 1h antes de cair no
|
|
154
|
+
// --mfa-token/prompt, em vez de montar o header só do --mfa-token.
|
|
155
|
+
const { headers } = await resolveStepUp({ mfaToken: opts.mfaToken, json: opts.json });
|
|
151
156
|
const spinner = opts.json
|
|
152
157
|
? null
|
|
153
158
|
: ora({ text: `Revogando ${clientId}…`, color: 'yellow' }).start();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdk-credential.js","sourceRoot":"","sources":["../../../src/commands/admin/sdk-credential.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,GAAG,EAAE,MAAM,uBAAuB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AA4CpD,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,IAAgC;IAEhC,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE5C,4DAA4D;IAC5D,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;QACpB,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,6BAA6B,EAAE,CAAC,CAAC,CAAC;QAC7G,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;QAC3C,CAAC;QACD,QAAQ,CAAC,CAAC,CAAC,CAAC;IACd,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACf,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,uBAAuB,EAAE,CAAC,CAAC,CAAC;QACvG,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;QACrC,CAAC;QACD,QAAQ,CAAC,CAAC,CAAC,CAAC;IACd,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM;QAC5B,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;QAC7D,CAAC,CAAC,SAAS,CAAC;IAEd,MAAM,IAAI,GAA4B,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;IAC1D,IAAI,UAAU;QAAE,IAAI,CAAC,aAAa,GAAG,UAAU,CAAC;IAEhD,MAAM,OAAO,
|
|
1
|
+
{"version":3,"file":"sdk-credential.js","sourceRoot":"","sources":["../../../src/commands/admin/sdk-credential.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,5 +9,7 @@ export interface AgentReleaseOptions {
|
|
|
9
9
|
artifact?: string[];
|
|
10
10
|
/** se setado, só monta o payload e imprime, não chama API */
|
|
11
11
|
dryRun?: boolean;
|
|
12
|
+
/** `--mfa-token <código>` — TOTP do step-up MFA (pula o prompt interativo). */
|
|
13
|
+
mfaToken?: string;
|
|
12
14
|
}
|
|
13
15
|
export declare function runAgentRelease(opts: AgentReleaseOptions): Promise<void>;
|
|
@@ -11,6 +11,11 @@
|
|
|
11
11
|
* Backend: `POST api.neetru.com/cli/v1/agent/release` (Bearer token nrt_*),
|
|
12
12
|
* exige role `admin` em `cli_api_keys/{keyId}`.
|
|
13
13
|
*
|
|
14
|
+
* Auditoria cli/v1 2026-09-29 (H1): o Core exige step-up MFA em TODO canal
|
|
15
|
+
* (sessão de 1h via `neetru auth mfa-session` → `--mfa-token` → prompt TOTP) e
|
|
16
|
+
* só aceita `artifacts.<arch>.url` em `https://core.neetru.com/releases/...` ou
|
|
17
|
+
* no bucket GCS de releases — validado aqui ANTES de chamar a API.
|
|
18
|
+
*
|
|
14
19
|
* Roadmap:
|
|
15
20
|
* - Sprint futura: comando `--upload` que faz GCS upload + sha256 + register
|
|
16
21
|
* numa só chamada (precisa de credenciais GCP locais ou signed URL via Core).
|
|
@@ -21,13 +26,18 @@ import * as path from 'node:path';
|
|
|
21
26
|
import { createHash } from 'node:crypto';
|
|
22
27
|
import chalk from 'chalk';
|
|
23
28
|
import { log } from '../utils/logger.js';
|
|
24
|
-
import { apiRequest
|
|
29
|
+
import { apiRequest } from '../lib/api-client.js';
|
|
30
|
+
import { handleApiError } from '../lib/api-error.js';
|
|
31
|
+
import { resolveStepUp } from '../lib/cli-write.js';
|
|
32
|
+
import { AGENT_ARTIFACT_URL_HINT, agentReleasesBucket, isAllowedAgentArtifactUrl, } from '../lib/agent-artifact-url.js';
|
|
25
33
|
import { safeExit } from '../utils/safe-exit.js';
|
|
26
34
|
const VALID_CHANNELS = ['stable', 'beta', 'canary'];
|
|
27
35
|
const VALID_ARCHS = ['linux-x64', 'linux-arm64', 'darwin-x64', 'darwin-arm64'];
|
|
28
36
|
const SEMVER_RE = /^\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.-]+)?$/;
|
|
29
37
|
const SHA256_RE = /^[a-f0-9]{64}$/;
|
|
30
|
-
|
|
38
|
+
function gcsBase() {
|
|
39
|
+
return `https://storage.googleapis.com/${agentReleasesBucket()}/releases`;
|
|
40
|
+
}
|
|
31
41
|
function isArch(s) {
|
|
32
42
|
return VALID_ARCHS.includes(s);
|
|
33
43
|
}
|
|
@@ -85,18 +95,18 @@ export async function runAgentRelease(opts) {
|
|
|
85
95
|
// ── validação básica ───────────────────────────────────────────────
|
|
86
96
|
if (!opts.version) {
|
|
87
97
|
log.error('--version é obrigatório (ex: 1.2.0).');
|
|
88
|
-
safeExit(
|
|
98
|
+
safeExit(1);
|
|
89
99
|
return;
|
|
90
100
|
}
|
|
91
101
|
if (!SEMVER_RE.test(opts.version)) {
|
|
92
102
|
log.error(`--version inválido "${opts.version}". Use semver (1.2.3 ou 1.2.3-beta.1).`);
|
|
93
|
-
safeExit(
|
|
103
|
+
safeExit(1);
|
|
94
104
|
return;
|
|
95
105
|
}
|
|
96
106
|
const channel = (opts.channel ?? 'beta').toLowerCase();
|
|
97
107
|
if (!isChannel(channel)) {
|
|
98
108
|
log.error(`--channel inválido "${channel}". Válidos: ${VALID_CHANNELS.join(' | ')}`);
|
|
99
|
-
safeExit(
|
|
109
|
+
safeExit(1);
|
|
100
110
|
return;
|
|
101
111
|
}
|
|
102
112
|
// ── changelog ───────────────────────────────────────────────────────
|
|
@@ -107,13 +117,13 @@ export async function runAgentRelease(opts) {
|
|
|
107
117
|
}
|
|
108
118
|
catch (err) {
|
|
109
119
|
log.error(`Falha ao ler changelog "${changelog}": ${err.message}`);
|
|
110
|
-
safeExit(
|
|
120
|
+
safeExit(1);
|
|
111
121
|
return;
|
|
112
122
|
}
|
|
113
123
|
}
|
|
114
124
|
if (!changelog || changelog.trim().length < 10) {
|
|
115
125
|
log.error('--changelog obrigatório (mín 10 chars). Use "@path/to/CHANGELOG.md" pra ler de arquivo.');
|
|
116
|
-
safeExit(
|
|
126
|
+
safeExit(1);
|
|
117
127
|
return;
|
|
118
128
|
}
|
|
119
129
|
// ── monta artifacts ────────────────────────────────────────────────
|
|
@@ -124,14 +134,14 @@ export async function runAgentRelease(opts) {
|
|
|
124
134
|
const { arch, filePath } = parseBinaryArg(a);
|
|
125
135
|
log.info(`Computando sha256 de ${chalk.dim(filePath)}...`);
|
|
126
136
|
const { sha256, sizeBytes } = await sha256File(filePath);
|
|
127
|
-
const url = `${
|
|
137
|
+
const url = `${gcsBase()}/${encodeURIComponent(opts.version)}/neetru-agent-${arch}`;
|
|
128
138
|
artifacts[arch] = { url, sha256, sizeBytes };
|
|
129
139
|
log.success(` ${arch}: sha256=${sha256.slice(0, 12)}... (${(sizeBytes / 1_000_000).toFixed(1)} MB)`);
|
|
130
140
|
log.dim(` URL: ${url}`);
|
|
131
141
|
}
|
|
132
142
|
catch (err) {
|
|
133
143
|
log.error(err.message);
|
|
134
|
-
safeExit(
|
|
144
|
+
safeExit(1);
|
|
135
145
|
return;
|
|
136
146
|
}
|
|
137
147
|
}
|
|
@@ -144,13 +154,25 @@ export async function runAgentRelease(opts) {
|
|
|
144
154
|
}
|
|
145
155
|
catch (err) {
|
|
146
156
|
log.error(err.message);
|
|
147
|
-
safeExit(
|
|
157
|
+
safeExit(1);
|
|
148
158
|
return;
|
|
149
159
|
}
|
|
150
160
|
}
|
|
151
161
|
if (Object.keys(artifacts).length === 0) {
|
|
152
162
|
log.error('Nenhum artifact informado. Use --binary arch=path ou --artifact arch=URL@sha256@sizeBytes.');
|
|
153
|
-
safeExit(
|
|
163
|
+
safeExit(1);
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
// H1 (auditoria cli/v1 2026-09-29): mesma allowlist de origem do Core —
|
|
167
|
+
// falha aqui, com mensagem clara, em vez de um 400 genérico da API.
|
|
168
|
+
const badUrls = Object.entries(artifacts).filter(([, a]) => !isAllowedAgentArtifactUrl(a.url));
|
|
169
|
+
if (badUrls.length > 0) {
|
|
170
|
+
for (const [arch, a] of badUrls) {
|
|
171
|
+
log.error(`--artifact ${arch}: URL fora da origem permitida de releases: ${a.url}`);
|
|
172
|
+
}
|
|
173
|
+
log.dim(` Origens aceitas: ${AGENT_ARTIFACT_URL_HINT}`);
|
|
174
|
+
log.dim(' Suba o binário pro bucket de releases (ou use --binary, que deriva a URL canônica).');
|
|
175
|
+
safeExit(1);
|
|
154
176
|
return;
|
|
155
177
|
}
|
|
156
178
|
// ── payload ─────────────────────────────────────────────────────────
|
|
@@ -168,9 +190,13 @@ export async function runAgentRelease(opts) {
|
|
|
168
190
|
return;
|
|
169
191
|
}
|
|
170
192
|
log.info(`Registrando release ${chalk.bold(opts.version)} (channel=${chalk.bold(channel)}, ${Object.keys(artifacts).length} arch(s))...`);
|
|
193
|
+
// H1: publicar release atinge a frota inteira via auto-update — step-up MFA
|
|
194
|
+
// obrigatório em todos os canais (mesmo fluxo de `agent yank`).
|
|
195
|
+
const { headers } = await resolveStepUp({ mfaToken: opts.mfaToken });
|
|
171
196
|
try {
|
|
172
197
|
const r = await apiRequest('/api/cli/v1/agent/release', {
|
|
173
198
|
method: 'POST',
|
|
199
|
+
headers,
|
|
174
200
|
body: payload,
|
|
175
201
|
});
|
|
176
202
|
if (r.alreadyExists) {
|
|
@@ -182,24 +208,10 @@ export async function runAgentRelease(opts) {
|
|
|
182
208
|
log.dim(` Painel: https://core.neetru.com/agent/releases`);
|
|
183
209
|
}
|
|
184
210
|
catch (err) {
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
safeExit(4);
|
|
190
|
-
return;
|
|
191
|
-
}
|
|
192
|
-
log.error(`API ${err.status}: ${err.message}`);
|
|
193
|
-
safeExit(5);
|
|
194
|
-
return;
|
|
195
|
-
}
|
|
196
|
-
if (err instanceof CliNetworkError) {
|
|
197
|
-
log.error(`Conexão falhou: ${err.message}`);
|
|
198
|
-
safeExit(6);
|
|
199
|
-
return;
|
|
200
|
-
}
|
|
201
|
-
log.error(err instanceof Error ? err.message : String(err));
|
|
202
|
-
safeExit(7);
|
|
211
|
+
// Exit codes canônicos (api-error.ts): 401→2, 403→3, 4xx→1, 5xx/rede→4.
|
|
212
|
+
// Antes: 401 e 403 fundidos em exit 4, API→5, rede→6, unknown→7 — fora da
|
|
213
|
+
// convenção única e ilegível pra CI. Auditoria UX 2026-09.
|
|
214
|
+
handleApiError(err);
|
|
203
215
|
}
|
|
204
216
|
}
|
|
205
217
|
//# sourceMappingURL=agent-release.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-release.js","sourceRoot":"","sources":["../../src/commands/agent-release.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"agent-release.js","sourceRoot":"","sources":["../../src/commands/agent-release.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,7 @@ export interface AgentYankOptions extends StepUpOptions {
|
|
|
5
5
|
export declare function runAgentYank(version: string, opts: AgentYankOptions): Promise<void>;
|
|
6
6
|
export declare function runAgentCanaryStart(version: string, opts: {
|
|
7
7
|
json?: boolean;
|
|
8
|
+
mfaToken?: string;
|
|
8
9
|
}): Promise<void>;
|
|
9
10
|
export interface AgentCanaryRollbackOptions extends StepUpOptions {
|
|
10
11
|
reason: string;
|