@neetru/cli 2.33.0 → 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 (56) hide show
  1. package/CHANGELOG.md +60 -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.js +10 -5
  16. package/dist/commands/db.d.ts +8 -2
  17. package/dist/commands/db.js +13 -6
  18. package/dist/commands/deploy.d.ts +14 -5
  19. package/dist/commands/deploy.js +376 -55
  20. package/dist/commands/dev-context.js +1 -1
  21. package/dist/commands/environments-repoint.d.ts +49 -0
  22. package/dist/commands/environments-repoint.js +219 -0
  23. package/dist/commands/init.js +7 -1
  24. package/dist/commands/new.js +14 -0
  25. package/dist/commands/secrets.d.ts +6 -4
  26. package/dist/commands/secrets.js +14 -7
  27. package/dist/commands/ui.js +1 -1
  28. package/dist/commands/workspaces.js +16 -1
  29. package/dist/index.js +47 -7
  30. package/dist/lib/ai/auth-discovery.d.ts +9 -12
  31. package/dist/lib/ai/auth-discovery.js +43 -145
  32. package/dist/lib/ai/orchestrator.d.ts +13 -6
  33. package/dist/lib/ai/orchestrator.js +46 -246
  34. package/dist/lib/ai/provedores.d.ts +57 -0
  35. package/dist/lib/ai/provedores.js +66 -0
  36. package/dist/lib/build-targets.d.ts +48 -10
  37. package/dist/lib/build-targets.js +64 -10
  38. package/dist/lib/cli-write.js +6 -3
  39. package/dist/lib/code-agent-gateway.d.ts +2 -2
  40. package/dist/lib/code-agent-gateway.js +2 -2
  41. package/dist/lib/code-agent-settings.d.ts +2 -2
  42. package/dist/lib/code-agent-settings.js +2 -4
  43. package/dist/lib/code-agent-types.d.ts +3 -1
  44. package/dist/lib/config.d.ts +4 -7
  45. package/dist/lib/config.js +9 -6
  46. package/dist/lib/deploy-recusa-de-destino.d.ts +9 -0
  47. package/dist/lib/deploy-recusa-de-destino.js +98 -0
  48. package/dist/lib/deploy-render-probe.d.ts +117 -0
  49. package/dist/lib/deploy-render-probe.js +475 -0
  50. package/dist/lib/deploy-vm-um-app.d.ts +62 -0
  51. package/dist/lib/deploy-vm-um-app.js +83 -0
  52. package/dist/lib/segredo-produto.d.ts +25 -5
  53. package/dist/lib/segredo-produto.js +45 -10
  54. package/dist/lib/sse.d.ts +4 -5
  55. package/dist/lib/sse.js +4 -5
  56. package/package.json +1 -2
@@ -37,13 +37,43 @@ import { CARACTERE_DE_TROCA, decodificarUtf8, recusaNaoUtf8, semBomInicial } fro
37
37
  // mesma). Reexportada para quem já importava daqui.
38
38
  export { CARACTERE_DE_TROCA, CodificacaoInvalida, decodificarUtf8, semBomInicial, } from './texto-utf8.js';
39
39
  /**
40
- * Aviso de que o segredo registrado ainda não chega ao app na VM. Com data:
41
- * quando o agente for liberado, a frase fica visivelmente velha em vez de
42
- * mentir calada. Mesmo fato que o Core declara no `assertNoSecretEnvVars`.
40
+ * Primeira versão PUBLICADA do agente da VM que entrega os segredos do produto
41
+ * ao app (Parte 2 de bug_8b85353b, agent#87): com `productEnv: true` no
42
+ * `agent.deploy`, ele busca os valores no Core e grava
43
+ * `/etc/neetru/<slug>.product.env` (root, 0600), lido pelo unit do app.
44
+ *
45
+ * Por que 1.6.80 e não 1.6.79: o CHANGELOG do agente põe o recurso na 1.6.79,
46
+ * mas essa versão foi declarada e nunca publicada; `agent_releases/1.6.80`
47
+ * (stable) saiu em 2026-10-20 e as duas VMs operacionais (snee-002-multi e
48
+ * snee-003-db) reportam 1.6.80 desde 2026-10-22 (medido na vistoria de 22/10).
49
+ * Agente mais velho ignora `productEnv` calado — por isso a versão vai na nota.
50
+ */
51
+ export const AGENTE_MINIMO_SEGREDO_DO_PRODUTO = '1.6.80';
52
+ // Até a 2.33.0 a CLI dizia, no `secrets set` (tela e `note` do `--json`) e no
53
+ // `deploy --target vm`, que "o agente da VM ainda não entrega segredos do
54
+ // produto ao app" — frase escrita em 2026-10-16, verdadeira até a 1.6.80 sair
55
+ // (2026-10-20) e falsa depois. Ela mandava o dev NÃO usar um caminho que
56
+ // funciona: a imagem espelhada do defeito que define o bug_8b85353b
57
+ // ("documentar um caminho que não existe"). As duas notas abaixo dizem só o
58
+ // que é verdade hoje: QUANDO o segredo chega (num deploy) e o que a VM precisa.
59
+ /** Nota depois de `neetru secrets set` gravar: o app só vê a gravação no PRÓXIMO deploy. */
60
+ export function notaEntregaDoSegredo(ambiente) {
61
+ return (`O app recebe o segredo no próximo deploy em ${ambiente}: nesse deploy o agente da VM ` +
62
+ `(versão ${AGENTE_MINIMO_SEGREDO_DO_PRODUTO} ou mais nova) busca o valor no Core e o grava ` +
63
+ 'num arquivo que só o root da VM lê. O app que está no ar só vê esta gravação depois desse deploy.');
64
+ }
65
+ /**
66
+ * Nota do `neetru deploy --target vm` depois de descartar do `--env-file`
67
+ * chave(s) com cara de segredo que o registro aceita. `env` é o `--env` cru do
68
+ * deploy: sai no nome canônico que o Core aceita, ou `<ambiente>`.
43
69
  */
44
- export const AVISO_AGENTE_PENDENTE = 'Atenção: em 2026-10-16 o agente da VM ainda não entrega segredos do produto ao app ' +
45
- '(Parte 2 de bug_8b85353b). O registro já vale e passa a chegar ao app no primeiro ' +
46
- 'deploy depois que o agente for atualizado.';
70
+ export function notaSegredoDescartadoNoDeploy(env) {
71
+ const ambiente = normalizarAmbienteTenant(env) ?? '<ambiente>';
72
+ return ('Segredo do produto chega ao app na VM pelo registro, não pelo --env-file: a chave já ' +
73
+ `registrada em ${ambiente} entra neste deploy (agente da VM ${AGENTE_MINIMO_SEGREDO_DO_PRODUTO} ` +
74
+ 'ou mais novo); a que ainda não está registrada só chega no primeiro deploy depois do ' +
75
+ `registro. Confira o que já está registrado com \`neetru secrets list --env ${ambiente}\`.`);
76
+ }
47
77
  /**
48
78
  * O comando que registra `chave` no ambiente do deploy. `env` é o `--env` cru
49
79
  * do deploy (`dev`, `production`…): sai no nome canônico que o Core aceita, ou
@@ -140,15 +170,20 @@ export function problemaNaChaveReservada(chave) {
140
170
  * Por que a chave é recusada, ou `null` se serve. NUNCA repete o que foi
141
171
  * digitado: `KEY=valor` e o valor colado no lugar do nome são os dois erros
142
172
  * mais prováveis, e ecoar a entrada imprimiria o segredo.
173
+ *
174
+ * `comoMandarOValor`: por onde o valor entra NO COMANDO que chamou (o `set`
175
+ * passa "por --stdin, --from-file ou pelo pedido na tela"). bug_89d2497e
176
+ * (etapa 1): o texto citava essas flags a todo chamador, e o `secrets archive`
177
+ * — que não recebe valor nem declara as flags — também o mostrava.
143
178
  */
144
- export function problemaNaChave(chave) {
179
+ export function problemaNaChave(chave, comoMandarOValor) {
145
180
  if (typeof chave === 'string' && CHAVE_SEGREDO_RE.test(chave))
146
181
  return null;
147
182
  if (typeof chave === 'string' && chave.includes('=')) {
148
183
  return ('Parece que você passou CHAVE=VALOR. O valor do segredo nunca vai na linha de ' +
149
- 'comando (fica no histórico do shell). Passe só o nome e mande o valor por ' +
150
- '--stdin, --from-file ou pelo pedido na tela. Se o valor já foi digitado, ' +
151
- 'considere-o exposto e troque-o.');
184
+ 'comando (fica no histórico do shell). Passe só o nome' +
185
+ (comoMandarOValor ? ` e mande o valor ${comoMandarOValor}` : '') +
186
+ '. Se o valor já foi digitado, considere-o exposto e troque-o.');
152
187
  }
153
188
  return ('Nome de segredo inválido. Use CAIXA_ALTA com letras, dígitos e underscore, ' +
154
189
  'começando por letra, de 2 a 64 caracteres (ex.: NEETRU_WEBHOOK_SECRET). ' +
package/dist/lib/sse.d.ts CHANGED
@@ -4,11 +4,10 @@
4
4
  * linha `data: ` encontrada — `payload` é a string crua (sem parse; o caller
5
5
  * decide o shape do JSON e trata `[DONE]`/keep-alives à sua maneira).
6
6
  *
7
- * Extraído de `src/lib/ai/orchestrator.ts` (onde nasceu pra reusar o parsing
8
- * manual que `streamGemini` já fazia em `streamGateway`) pra um módulo sem
9
- * dependências pesadas — `code-agent-gateway.ts` (`neetru code`) reusa o
10
- * mesmo parser sem herdar o bundle inteiro do orchestrator (@anthropic-ai/sdk
11
- * + openai). Cleanup do reader é feito aqui (`reader.cancel()` em finally) —
7
+ * Extraído de `src/lib/ai/orchestrator.ts` (onde nasceu no `streamGateway`)
8
+ * pra um módulo sem dependências pesadas — `code-agent-gateway.ts`
9
+ * (`neetru code`) reusa o mesmo parser sem herdar o bundle inteiro do
10
+ * orchestrator (SDK `openai`). Cleanup do reader é feito aqui (`reader.cancel()` em finally) —
12
11
  * o caller só precisa gerenciar seu próprio timeout/AbortController.
13
12
  */
14
13
  export declare function readSseLines(body: ReadableStream<Uint8Array>, onLine: (payload: string) => void): Promise<void>;
package/dist/lib/sse.js CHANGED
@@ -4,11 +4,10 @@
4
4
  * linha `data: ` encontrada — `payload` é a string crua (sem parse; o caller
5
5
  * decide o shape do JSON e trata `[DONE]`/keep-alives à sua maneira).
6
6
  *
7
- * Extraído de `src/lib/ai/orchestrator.ts` (onde nasceu pra reusar o parsing
8
- * manual que `streamGemini` já fazia em `streamGateway`) pra um módulo sem
9
- * dependências pesadas — `code-agent-gateway.ts` (`neetru code`) reusa o
10
- * mesmo parser sem herdar o bundle inteiro do orchestrator (@anthropic-ai/sdk
11
- * + openai). Cleanup do reader é feito aqui (`reader.cancel()` em finally) —
7
+ * Extraído de `src/lib/ai/orchestrator.ts` (onde nasceu no `streamGateway`)
8
+ * pra um módulo sem dependências pesadas — `code-agent-gateway.ts`
9
+ * (`neetru code`) reusa o mesmo parser sem herdar o bundle inteiro do
10
+ * orchestrator (SDK `openai`). Cleanup do reader é feito aqui (`reader.cancel()` em finally) —
12
11
  * o caller só precisa gerenciar seu próprio timeout/AbortController.
13
12
  */
14
13
  export async function readSseLines(body, onLine) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@neetru/cli",
3
- "version": "2.33.0",
3
+ "version": "2.34.0",
4
4
  "type": "module",
5
5
  "description": "Neetru Developer Kit — scaffold, AI assistant, publish, build e deploy de produtos SaaS Neetru via Core (VM-based agents)",
6
6
  "keywords": [
@@ -42,7 +42,6 @@
42
42
  "prepublishOnly": "npm run build"
43
43
  },
44
44
  "dependencies": {
45
- "@anthropic-ai/sdk": "^0.96.0",
46
45
  "@neetru/db-classifier": "^0.1.5",
47
46
  "chalk": "^5.4.1",
48
47
  "commander": "^12.1.0",