@neetru/cli 2.32.1 → 2.34.0

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.
Files changed (63) hide show
  1. package/CHANGELOG.md +78 -0
  2. package/README.md +38 -3
  3. package/dist/commands/admin/sdk-credential.js +3 -1
  4. package/dist/commands/ai-models.d.ts +2 -1
  5. package/dist/commands/ai-models.js +4 -5
  6. package/dist/commands/ai.d.ts +12 -2
  7. package/dist/commands/ai.js +47 -38
  8. package/dist/commands/auth.d.ts +3 -2
  9. package/dist/commands/auth.js +96 -57
  10. package/dist/commands/build.js +35 -4
  11. package/dist/commands/chat.d.ts +24 -6
  12. package/dist/commands/chat.js +43 -7
  13. package/dist/commands/code.js +11 -2
  14. package/dist/commands/config.js +15 -13
  15. package/dist/commands/db-frontdoor.d.ts +116 -0
  16. package/dist/commands/db-frontdoor.js +572 -0
  17. package/dist/commands/db-move.d.ts +5 -0
  18. package/dist/commands/db-move.js +27 -0
  19. package/dist/commands/db.d.ts +8 -2
  20. package/dist/commands/db.js +13 -6
  21. package/dist/commands/deploy.d.ts +14 -5
  22. package/dist/commands/deploy.js +376 -55
  23. package/dist/commands/dev-context.js +1 -1
  24. package/dist/commands/environments-repoint.d.ts +49 -0
  25. package/dist/commands/environments-repoint.js +219 -0
  26. package/dist/commands/init.js +7 -1
  27. package/dist/commands/new.js +14 -0
  28. package/dist/commands/secrets.d.ts +6 -4
  29. package/dist/commands/secrets.js +14 -7
  30. package/dist/commands/servers.d.ts +29 -0
  31. package/dist/commands/servers.js +108 -1
  32. package/dist/commands/ui.js +1 -1
  33. package/dist/commands/workspaces.js +16 -1
  34. package/dist/index.js +103 -7
  35. package/dist/lib/ai/auth-discovery.d.ts +9 -12
  36. package/dist/lib/ai/auth-discovery.js +43 -145
  37. package/dist/lib/ai/orchestrator.d.ts +13 -6
  38. package/dist/lib/ai/orchestrator.js +46 -246
  39. package/dist/lib/ai/provedores.d.ts +57 -0
  40. package/dist/lib/ai/provedores.js +66 -0
  41. package/dist/lib/api-client.d.ts +8 -1
  42. package/dist/lib/api-client.js +18 -2
  43. package/dist/lib/build-targets.d.ts +48 -10
  44. package/dist/lib/build-targets.js +64 -10
  45. package/dist/lib/cli-write.js +6 -3
  46. package/dist/lib/code-agent-gateway.d.ts +2 -2
  47. package/dist/lib/code-agent-gateway.js +2 -2
  48. package/dist/lib/code-agent-settings.d.ts +2 -2
  49. package/dist/lib/code-agent-settings.js +2 -4
  50. package/dist/lib/code-agent-types.d.ts +3 -1
  51. package/dist/lib/config.d.ts +4 -7
  52. package/dist/lib/config.js +9 -6
  53. package/dist/lib/deploy-recusa-de-destino.d.ts +9 -0
  54. package/dist/lib/deploy-recusa-de-destino.js +98 -0
  55. package/dist/lib/deploy-render-probe.d.ts +117 -0
  56. package/dist/lib/deploy-render-probe.js +475 -0
  57. package/dist/lib/deploy-vm-um-app.d.ts +62 -0
  58. package/dist/lib/deploy-vm-um-app.js +83 -0
  59. package/dist/lib/segredo-produto.d.ts +25 -5
  60. package/dist/lib/segredo-produto.js +45 -10
  61. package/dist/lib/sse.d.ts +4 -5
  62. package/dist/lib/sse.js +4 -5
  63. package/package.json +1 -2
@@ -1370,7 +1370,9 @@ function restoreFail(json, error, message) {
1370
1370
  * 1. Lista backups disponíveis via GET /api/cli/v1/db/[id]/backups
1371
1371
  * 2. Operador escolhe qual backup restaurar
1372
1372
  * 3. Exige confirmação textual "RESTAURAR" (operação destrutiva)
1373
- * 4. POST /api/cli/v1/db/[id]/restore com MFA step-up
1373
+ * 4. POST /api/cli/v1/db/[id]/restore com MFA step-up (`resolveStepUp`:
1374
+ * `--mfa-token` → sessão de 1h → pergunta do TOTP; sem nenhum dos três em
1375
+ * `--json`/sem terminal, falha fechada com `mfa_required`)
1374
1376
  *
1375
1377
  * Automação / --json (auditoria UX 2026-09): o restore precisa ser scriptável.
1376
1378
  * - `--backup-id <id>` pula o prompt de seleção (validado contra a lista).
@@ -1388,10 +1390,6 @@ export async function runDbRestore(dbId, opts) {
1388
1390
  restoreFail(opts.json, 'invalid_input', '<dbId> é obrigatório.');
1389
1391
  return;
1390
1392
  }
1391
- if (!opts.mfa) {
1392
- restoreFail(opts.json, 'mfa_required', '--mfa-token <token> é obrigatório para restaurar banco (operação destrutiva).');
1393
- return;
1394
- }
1395
1393
  // Fail-CLOSED em --json: sem TTY pra escolher backup ou digitar a confirmação,
1396
1394
  // então exige --backup-id e --yes explícitos (pula o inquirer, nunca trava).
1397
1395
  if (opts.json && !opts.backupId) {
@@ -1471,6 +1469,15 @@ export async function runDbRestore(dbId, opts) {
1471
1469
  }
1472
1470
  }
1473
1471
  // 4. POST restore com MFA step-up.
1472
+ //
1473
+ // bug_757b9746: o restore exigia `--mfa-token` logo na entrada e montava
1474
+ // `X-Neetru-MFA-Token` à mão — com a sessão de 1h de `neetru auth mfa-session`
1475
+ // ativa, recusava do mesmo jeito, embora a rota do Core
1476
+ // (`requireCliStepUpMfa`) aceite `X-Neetru-MFA-Session`. Era o último comando
1477
+ // destrutivo fora do `resolveStepUp`. Resolvido AQUI, depois da escolha e da
1478
+ // confirmação e antes do spinner: o TOTP perguntado não vence no meio, quem
1479
+ // cancela não gasta código e a pergunta não disputa a linha com o spinner.
1480
+ const { headers: mfaHeaders } = await resolveStepUp({ mfaToken: opts.mfa, json: opts.json });
1474
1481
  const spinnerRestore = opts.json
1475
1482
  ? null
1476
1483
  : ora({ text: 'Disparando restore…', color: 'yellow' }).start();
@@ -1478,7 +1485,7 @@ export async function runDbRestore(dbId, opts) {
1478
1485
  try {
1479
1486
  resp = await apiRequest(`/api/cli/v1/db/${encodeURIComponent(dbId)}/restore`, {
1480
1487
  method: 'POST',
1481
- headers: { 'X-Neetru-MFA-Token': opts.mfa },
1488
+ headers: mfaHeaders,
1482
1489
  body: { backupId, dbId },
1483
1490
  });
1484
1491
  spinnerRestore?.succeed(`Restore iniciado — job ${chalk.bold(resp.jobId ?? '—')} · status: ${resp.status}`);
@@ -84,6 +84,8 @@ export interface DeployOptions {
84
84
  * HTTP de saúde pós-deploy (`GET https://<domain>/api/health?deep=1`). Default
85
85
  * SEMPRE false — o probe roda por padrão. Use apenas em casos legítimos sem
86
86
  * superfície HTTP (ex.: deploy de um serviço/worker sem endpoint web).
87
+ * Pula também a conferência da página inicial (bug_0d2e0087), que só roda
88
+ * depois de a saúde passar.
87
89
  */
88
90
  skipHealthProbe?: boolean;
89
91
  /**
@@ -170,9 +172,16 @@ export declare function runPublicSecretGate(source: {
170
172
  * Também não mandamos para stack não-node: ali `entrypoint` é `index.html` /
171
173
  * `index.php` / referência de imagem, que não é "arquivo para o `node` rodar".
172
174
  *
173
- * ATENÇÃO — a cadeia ainda NÃO fecha só com isto: o Core descarta o campo hoje
174
- * (`deployRequestSchema` não o declara, e objeto zod sem `.passthrough()` remove
175
- * chave desconhecida em silêncio). Ver "o que falta no Core" na descrição do PR.
175
+ * Do lado do Core o campo chega: desde o d6cfda64 (2026-10-11) o
176
+ * `deployRequestSchema` declara `entrypoint` e o `entrypointToStartCommand` o
177
+ * traduz para o `startCommand` do agente (`node apps/web/server.js`).
178
+ *
179
+ * O que ainda NÃO fecha é do agente (medido na main dele, 1.6.80): a decisão de
180
+ * instalar dependências (`resolveNodeInstallPlan` em `deploy-plan.ts`) também
181
+ * olha só a raiz do pacote. Sem `server.js` nem `.next/` na raiz, o pacote de
182
+ * monorepo não é reconhecido como standalone e o agente roda `npm rebuild` (e,
183
+ * se falhar, `npm install`) na raiz do pacote, em vez de pular a instalação.
184
+ * O conserto é no `neetru-agent-service-vm` (bug_bc72fe7e).
176
185
  */
177
186
  export declare function entrypointParaDeploy(manifest: Pick<BuildManifest, 'entrypoint' | 'appPrefix' | 'stack'> | null | undefined): string | undefined;
178
187
  /** `true` pra `prod`/`production` (o Core normaliza `production`→`prod`). */
@@ -262,8 +271,8 @@ export declare const SECRET_ENVVAR_PATTERNS: RegExp[];
262
271
  export declare function avisoSegredoDescartadoNaVm(chave: string, env: string | undefined): string;
263
272
  /**
264
273
  * O aviso desta chave manda para `neetru secrets set`? Não manda quando o
265
- * Core reserva a chave — aí o aviso de que o agente ainda não entrega
266
- * segredos do produto também não cabe.
274
+ * Core reserva a chave — aí a nota de como o segredo registrado chega ao app
275
+ * (`notaSegredoDescartadoNoDeploy`) também não cabe.
267
276
  */
268
277
  export declare function segredoDescartadoApontaSecretsSet(chave: string): boolean;
269
278
  export declare function pickTarget(opts: DeployOptions, nonInteractive: boolean, runtime?: string): Promise<'cloud-run' | 'vm' | 'workspace'>;