@neetru/cli 2.7.5 → 2.9.1

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 (105) hide show
  1. package/CHANGELOG.md +316 -220
  2. package/README.md +137 -137
  3. package/dist/cli-kit/format.d.ts +49 -0
  4. package/dist/cli-kit/format.js +88 -0
  5. package/dist/cli-kit/format.js.map +1 -0
  6. package/dist/cli-kit/glyphs.d.ts +22 -0
  7. package/dist/cli-kit/glyphs.js +22 -0
  8. package/dist/cli-kit/glyphs.js.map +1 -0
  9. package/dist/cli-kit/index.d.ts +13 -0
  10. package/dist/cli-kit/index.js +12 -0
  11. package/dist/cli-kit/index.js.map +1 -0
  12. package/dist/cli-kit/palette.d.ts +10 -0
  13. package/dist/cli-kit/palette.js +36 -0
  14. package/dist/cli-kit/palette.js.map +1 -0
  15. package/dist/commands/ai.js +8 -8
  16. package/dist/commands/autocomplete.js +34 -34
  17. package/dist/commands/bug.d.ts +87 -0
  18. package/dist/commands/bug.js +419 -0
  19. package/dist/commands/bug.js.map +1 -0
  20. package/dist/commands/customers.d.ts +17 -0
  21. package/dist/commands/customers.js +160 -0
  22. package/dist/commands/customers.js.map +1 -0
  23. package/dist/commands/db.d.ts +91 -7
  24. package/dist/commands/db.js +898 -123
  25. package/dist/commands/db.js.map +1 -1
  26. package/dist/commands/deploy.d.ts +5 -0
  27. package/dist/commands/deploy.js +68 -0
  28. package/dist/commands/deploy.js.map +1 -1
  29. package/dist/commands/dev.d.ts +68 -0
  30. package/dist/commands/dev.js +345 -0
  31. package/dist/commands/dev.js.map +1 -0
  32. package/dist/commands/docs.d.ts +4 -0
  33. package/dist/commands/docs.js +99 -7
  34. package/dist/commands/docs.js.map +1 -1
  35. package/dist/commands/doctor.js +4 -1
  36. package/dist/commands/doctor.js.map +1 -1
  37. package/dist/commands/init.js +121 -121
  38. package/dist/commands/marketplace.d.ts +36 -0
  39. package/dist/commands/marketplace.js +584 -0
  40. package/dist/commands/marketplace.js.map +1 -0
  41. package/dist/commands/new.d.ts +6 -0
  42. package/dist/commands/new.js +220 -40
  43. package/dist/commands/new.js.map +1 -1
  44. package/dist/commands/open.d.ts +8 -0
  45. package/dist/commands/open.js +61 -13
  46. package/dist/commands/open.js.map +1 -1
  47. package/dist/commands/products-db.d.ts +1 -1
  48. package/dist/commands/products-db.js +17 -4
  49. package/dist/commands/products-db.js.map +1 -1
  50. package/dist/commands/products.d.ts +23 -0
  51. package/dist/commands/products.js +39 -1
  52. package/dist/commands/products.js.map +1 -1
  53. package/dist/commands/tenants.js +15 -0
  54. package/dist/commands/tenants.js.map +1 -1
  55. package/dist/commands/ui.d.ts +1 -1
  56. package/dist/commands/ui.js +172 -2
  57. package/dist/commands/ui.js.map +1 -1
  58. package/dist/commands/workspaces.d.ts +10 -1
  59. package/dist/commands/workspaces.js +136 -22
  60. package/dist/commands/workspaces.js.map +1 -1
  61. package/dist/index.js +532 -44
  62. package/dist/index.js.map +1 -1
  63. package/dist/lib/ai/context.js +90 -90
  64. package/dist/lib/config-schema.d.ts +8 -8
  65. package/dist/lib/db-local/db-json.d.ts +63 -0
  66. package/dist/lib/db-local/db-json.js +189 -0
  67. package/dist/lib/db-local/db-json.js.map +1 -0
  68. package/dist/lib/db-local/env.d.ts +26 -0
  69. package/dist/lib/db-local/env.js +64 -0
  70. package/dist/lib/db-local/env.js.map +1 -0
  71. package/dist/lib/db-local/fingerprint.d.ts +8 -0
  72. package/dist/lib/db-local/fingerprint.js +28 -0
  73. package/dist/lib/db-local/fingerprint.js.map +1 -0
  74. package/dist/lib/db-local/index.d.ts +15 -0
  75. package/dist/lib/db-local/index.js +14 -0
  76. package/dist/lib/db-local/index.js.map +1 -0
  77. package/dist/lib/db-pipeline/build-deps.d.ts +14 -0
  78. package/dist/lib/db-pipeline/build-deps.js +158 -0
  79. package/dist/lib/db-pipeline/build-deps.js.map +1 -0
  80. package/dist/lib/db-pipeline/errors.d.ts +29 -0
  81. package/dist/lib/db-pipeline/errors.js +29 -0
  82. package/dist/lib/db-pipeline/errors.js.map +1 -0
  83. package/dist/lib/db-pipeline/index.d.ts +26 -0
  84. package/dist/lib/db-pipeline/index.js +25 -0
  85. package/dist/lib/db-pipeline/index.js.map +1 -0
  86. package/dist/lib/db-pipeline/pipeline.d.ts +13 -0
  87. package/dist/lib/db-pipeline/pipeline.js +119 -0
  88. package/dist/lib/db-pipeline/pipeline.js.map +1 -0
  89. package/dist/lib/db-pipeline/rehearse.d.ts +99 -0
  90. package/dist/lib/db-pipeline/rehearse.js +219 -0
  91. package/dist/lib/db-pipeline/rehearse.js.map +1 -0
  92. package/dist/lib/db-pipeline/types.d.ts +112 -0
  93. package/dist/lib/db-pipeline/types.js +20 -0
  94. package/dist/lib/db-pipeline/types.js.map +1 -0
  95. package/dist/lib/pickers.d.ts +12 -0
  96. package/dist/lib/pickers.js +34 -0
  97. package/dist/lib/pickers.js.map +1 -1
  98. package/package.json +66 -62
  99. package/templates/auth/callback.ts +22 -22
  100. package/templates/auth/sign-in.tsx +41 -41
  101. package/templates/billing/checkout.ts +22 -22
  102. package/templates/billing/page.tsx +43 -43
  103. package/templates/support/ticket-form.tsx +68 -68
  104. package/templates/usage/track.ts +30 -30
  105. package/templates/users/profile.tsx +43 -43
package/CHANGELOG.md CHANGED
@@ -1,220 +1,316 @@
1
- # Changelog @neetru/cli
2
-
3
- Convenção: [Keep a Changelog](https://keepachangelog.com/) + [SemVer](https://semver.org/).
4
-
5
- ## [2.7.5] — 2026-05-20 (fix do crash no upgrade)
6
-
7
- ### Corrigido
8
-
9
- - `neetru upgrade` não crasha mais ao terminar. O comando chamava
10
- `process.exit(0)` logo após o `fetch` ao npm no Windows isso
11
- derrubava o libuv com `Assertion failed: !(handle->flags &
12
- UV_HANDLE_CLOSING)` (`async.c`), porque o socket do undici (fetch
13
- nativo) ainda estava em teardown. Agora o comando só retorna; o event
14
- loop drena sozinho (o undici dá unref nos sockets idle) e o processo
15
- encerra limpo na hora.
16
-
17
- ## [2.7.4] 2026-05-20 (submenus redesenhados)
18
-
19
- ### Adicionado
20
-
21
- - Submenu **"Começar um projeto"** no menu principal reúne o scaffold
22
- local (`neetru init`), a criação completa (`neetru new`) e uma tela de
23
- info sobre o `@neetru/sdk` (o que é, como instalar e consumir).
24
- - Os 10 submenus ganharam o **mesmo visual do menu principal**: moldura
25
- azul-marinho, marcador `> <` no item ativo e navegação por setas — em
26
- coluna única, alinhada à esquerda.
27
-
28
- ### Corrigido
29
-
30
- - Submenu não engole mais a primeira seta. O menu principal entregava o
31
- stdin pausado / fora de raw mode pro submenu, e o inquirer perdia a
32
- tecla — só respondia depois de um toque inicial. Agora o stdin fica
33
- "quente" na entrega; a seta funciona de cara.
34
-
35
- ## [2.7.3] — 2026-05-20 (polish do cabeçalho)
36
-
37
- ### Mudado
38
-
39
- - Cabeçalho do `neetru` interativo: logo renderizado **ao lado** do texto
40
- (antes era acima), com a sessão e a versão alinhadas à direita do logo.
41
- - Paleta de contorno do menu e do logo ajustada para um azul mais suave.
42
-
43
- ## [2.7.2] 2026-05-20 (aviso de versão + menu em 2 colunas)
44
-
45
- ### Adicionado
46
-
47
- - O cabeçalho do `neetru` interativo mostra a **versão instalada** (`v2.7.2`)
48
- ao lado do usuário logado. Quando uma versão mais nova publicada no
49
- npm, aparece uma linha **amarela** avisando pra rodar `neetru upgrade`.
50
- A checagem tem timeout curto e é à prova de falha — offline não trava o
51
- CLI.
52
- - Menu principal redesenhado em **duas colunas**, com navegação por setas
53
- (↑/↓/←/→) e contorno azul-marinho; o item ativo é marcado com `> <`.
54
-
55
- ## [2.7.1] 2026-05-20 (UI do CLI interativo)
56
-
57
- ### Adicionado
58
-
59
- - Logo Neetru em ANSI truecolor no cabeçalho do `neetru` interativo.
60
- - Cabeçalho mostra o usuário logado (email), lido localmente do
61
- `auth.json` sem chamada de rede.
62
- - Menu principal com o nome do recurso + uma descrição curta abaixo,
63
- quando útil.
64
-
65
- ### Corrigido
66
-
67
- - O CLI interativo não encerra mais sozinho: comandos que chamavam
68
- `process.exit()` em erro (ex.: "Nenhum server encontrado") matavam o
69
- menu inteiro. Agora o erro é capturado e o CLI volta ao menu — só
70
- "Sair" (ou Ctrl+C) encerra.
71
-
72
- ## [2.7.0] — 2026-05-20 (Fluxo de Ambientes Fase 3 — destino cloud-run)
73
-
74
- ### Adicionado
75
-
76
- - `neetru deploy --target=cloud-run` caminho de deploy pro destino Cloud Run
77
- dedicado. Aceita `--image <uri>` (imagem de container buildada e pushada)
78
- ou faz `docker build` + `docker push` automático via `--registry <host>`
79
- (Artifact Registry). O destino `cloud-run` agora aparece no menu interativo.
80
-
81
- ### Mudado
82
-
83
- - `neetru promote` — vocabulário de estágios migrado para `dev | staging | prod`
84
- (antes `dev/workspace/beta/prod`). Gates: 24h em `dev→staging`,
85
- 168h + canary em `staging→prod`.
86
- - `neetru deploy --target` sem valor default; omitir abre o menu interativo
87
- (workspace / cloud-run / vm). Modo não-interativo continua assumindo `vm`.
88
-
89
- ## [2.0.0]2026-05-06 (Sprint 12 — CLI estabilizada)
90
-
91
- ### Adicionado
92
-
93
- - `neetru doctor` — diagnóstico completo do ambiente: token CLI, Core acessível,
94
- schema do `neetru.config.json`, valor de `NEETRU_ENV`, e versão do CLI
95
- comparada com a `latest` no npm. Saída em tabela colorida (default) ou
96
- JSON (`--json`). Diferença pra `validate`: doctor inclui environment +
97
- version mismatch (warning, não fail).
98
- - `neetru upgrade` verifica `dist-tags.latest` em
99
- `https://registry.npmjs.org/@neetru/cli` e exibe instrução de upgrade
100
- (`npm install -g @neetru/cli@latest`). Sem auto-install — não quebra
101
- pipelines pinados.
102
- - `neetru autocomplete <bash|zsh|pwsh>` — gera script de shell completion
103
- pra os 22 subcomandos top-level. Usuário cola na config do shell:
104
- `neetru autocomplete bash >> ~/.bashrc`.
105
- - `neetru config set telemetry.enabled <true|false>` opt-in explícito de
106
- telemetria. Default desligado. Quando ligado, CLI envia eventos
107
- anonimizados pra `POST /sdk/v1/telemetry/log` (placeholder na v2.0).
108
- Nunca envia tokens, paths absolutos ou conteúdo de arquivos.
109
-
110
- ### Bumped
111
-
112
- - `1.4.0 → 2.0.0` (major bump por convenção de estabilidade — sem breaking
113
- changes funcionais).
114
-
115
- ### Não publicado no npm ainda
116
-
117
- Bump local. Publish manual pra npm fica deferidoowner aprovará. Build
118
- local (`npm run build` em `cli/`) gera o `dist/` pronto pra publicação.
119
-
120
- ## [1.3.0] 2026-05-06
121
-
122
- ### Adicionado
123
-
124
- - `neetru add <feature>` — copia template em `cli/templates/{feature}/*` para
125
- `src/lib/neetru/{feature}/*` no projeto atual. Features: `auth`, `billing`,
126
- `usage`, `users`, `support`. Suporta `--force` pra sobrescrever.
127
- - `neetru mocks reset` reseta `.neetru/dev-fixtures.json` para `{}` (útil
128
- com `NEETRU_ENV=dev`).
129
- - `neetru env switch <dev|workspace|production>` atualiza/insere
130
- `NEETRU_ENV=<value>` em `.env.local` preservando as outras chaves.
131
- - `neetru logs` ganhou flags:
132
- - `--product <productId>` — filtra logs por produto.
133
- - `--channel <channel>` — filtra por channel (stdout/stderr/app/...).
134
- - `--correlation-id <uuid>` — filtra por correlation ID.
135
-
136
- ### Templates novos (`cli/templates/`)
137
-
138
- - `auth/sign-in.tsx`, `auth/callback.ts`
139
- - `billing/page.tsx`, `billing/checkout.ts`
140
- - `usage/track.ts`
141
- - `users/profile.tsx`
142
- - `support/ticket-form.tsx`
143
-
144
- ### Não publicado no npm ainda
145
-
146
- Bump local `1.2.0 1.3.0`. Publish pra npm fica deferidoowner aprovará
147
- manualmente quando quiser. Build local (`npm run build` em `cli/`) já compila.
148
-
149
- ## [1.2.0] 2026-05-06
150
-
151
- **Consolidação das duas linhas paralelas.** Esta versão unifica os comandos das duas linhas de CLI que estavam coexistindo:
152
-
153
- - **`@neetru/cli@1.0.x` (publicada no npm)**: linha *workspace-centric* com `init`, `add`, `validate`, `generate-types`, `whoami`, `login`, `status`, `logs`, `deploy`, `open`. APIs: `/api/v1/cli/workspace/*`.
154
- - **`@neetru/cli@0.1.0` (monorepo, não publicada)**: linha *server-centric* com `ai`, `init`, `config`, `login`, `logout`, `whoami`, `build`, `deploy`, `publish`. APIs: `/api/v1/cli/{catalog,deploy,servers}`.
155
-
156
- As duas falam **APIs distintas e complementares** do mesmo Neetru Core, refletindo a topologia real do produto:
157
-
158
- ```
159
- Workspace (prototipação) ──build/promote──► Server VM ou Cloud Run (produção)
160
- ```
161
-
162
- A `1.2.0` traz ambos os conjuntos de comandos numa única CLI. O monorepo passa a ser a fonte canônica.
163
-
164
- ### Adicionado em relação a `1.0.1`
165
-
166
- Comandos da linha *server-centric* (deploy via VM agent ou Cloud Run):
167
-
168
- - `neetru ai` REPL multi-model (Claude/OpenAI/Gemini) com contexto Neetru-aware
169
- - `neetru build` — empacota produto local em tarball + manifest com sha256, detecção automática de stack (node/docker/php-apache/static)
170
- - `neetru deploy` — pipeline E2E interativo (escolha de produto/server/domain/port + polling status até estado terminal). Suporta `--non-interactive` para CI.
171
- - `neetru publish` — registra produto no catálogo público (`public_products`), com `--draft` e `--unpublish`
172
- - `neetru config {set|get|path}` — gerenciamento de chaves de API e config local
173
- - `neetru logout` limpa credenciais
174
- - `neetru login --token nrt_<keyId>_<secret>` modo CI/legacy paralelo ao Device Code OAuth
175
- - `neetru login --json` saída machine-readable para scripts
176
-
177
- ### Mantido de `1.0.1` (re-implementado em TypeScript com convenções do monorepo)
178
-
179
- - `neetru status --client-id <id>` status de workspace (build/deploy último, domínio, tier, expira em N dias)
180
- - `neetru logs --client-id <id>` — visualiza logs do workspace; suporta `-f` follow + `-n N` lines + `--since 30m` + `--level error`
181
- - `neetru validate` health-check da config local + ping `/api/health` + whoami
182
- - `neetru open [target]` — abre dashboard, builds, logs, workspaces, products, servers, incidents no browser
183
- - `neetru init <name>` — agora gera projeto Next.js 15 OU Node API (Fastify) com schema canônico v2
184
-
185
- ### Backlog 1.3.x
186
-
187
- Comandos que ainda dependem de design/templates novos:
188
-
189
- - `neetru add <feature>` scaffolds OAuth/billing/usage/users
190
- - `neetru generate-types` codegen TypeScript de planos/features/entitlements
191
-
192
- ### Alterado
193
-
194
- - Package agora é ESM nativo (`"type": "module"`). Imports usam `.js` extension.
195
- - `neetru login` agora usa Device Code OAuth (RFC 8628) por default; `--token` permanece para CI.
196
-
197
- ### Migração de `1.0.x`
198
-
199
- Não caminho 100% automático porque a config local muda:
200
-
201
- - `1.0.x` lia `neetru.json` workspace-local com `{clientId, coreUrl}` + var de ambiente `NEETRU_CLIENT_SECRET`
202
- - `1.2.0` `~/.config/neetru-cli/auth.json` (Bearer token salvo por `neetru login`) + `neetru.config.json` por projeto com `{slug, runtime, publish}`
203
-
204
- Recomendação:
205
-
206
- 1. `npm uninstall -g @neetru/cli && npm install -g @neetru/cli@1.2.0`
207
- 2. `neetru login` (Device Code) — gera credencial Bearer no novo formato
208
- 3. Para comandos workspace (`status`, `logs`, `open`), passe `--client-id <oauthClientId>` explicitamente o `clientId` continua sendo o `oauthClientId` do seu workspace, achável em UI Core `/workspaces/{id}`
209
-
210
- ## [1.0.1] — anterior
211
-
212
- Linha workspace publicada no npm. Comandos: `init`, `add`, `validate`, `generate-types`, `whoami`, `login`, `status`, `logs`, `deploy`, `open`. APIs: `/api/v1/cli/workspace/*`.
213
-
214
- ## [1.0.0] anterior
215
-
216
- Primeira versão pública.
217
-
218
- ## [0.1.0] — interno (não publicado)
219
-
220
- Snapshot interno do monorepo durante desenvolvimento da Sprint 1+. Substituído por `1.2.0`.
1
+ # Changelog @neetru/cli
2
+
3
+ Convenção: [Keep a Changelog](https://keepachangelog.com/) + [SemVer](https://semver.org/).
4
+
5
+ ## [2.9.1] — 2026-05-25 (security: 5 HIGH fixes)
6
+
7
+ ### Corrigido (segurança)
8
+
9
+ - **HIGH-1 — `db apply --json` selecionava o primeiro banco silenciosamente com múltiplos bancos.**
10
+ Em modo não-interativo (`--json` ou `--yes` sem TTY), se `.neetru/db.json` tiver N > 1 bancos
11
+ e `--db` não for passado, o CLI agora emite erro estruturado em vez de aplicar no primeiro banco.
12
+ Saída JSON: `{ ok: false, error: "db_required", message: "...", available: [...] }`.
13
+ Em CI isso evitava migração silenciosa no banco errado.
14
+
15
+ - **HIGH-2 Abertura de URL no Windows usava `cmd /c start` sem validação de protocolo.**
16
+ URLs derivadas de config podiam conter caracteres de injeção de shell (`& malicious.exe`).
17
+ Nova função `safeOpenUrl` valida `^https?://` antes de qualquer chamada de sistema e usa
18
+ `rundll32 url.dll,FileProtocolHandler` (sem shell) no Windows. Aplica em `open.ts` e
19
+ `workspaces.ts` (que agora delega para `safeOpenUrl`).
20
+
21
+ - **HIGH-3 `db init` gravava stub local em `.neetru/db.json` antes de registrar no Core.**
22
+ Falha de rede/400 do Core deixava entrada órfã e re-rodar `db init` adicionava banco duplicado.
23
+ Agora o registro no Core acontece primeiro; `.neetru/db.json` é escrito após sucesso.
24
+
25
+ - **HIGH-4 `marketplace sdk add <template>` aceitava path traversal.**
26
+ `path.join(templatesDir, templateName)` aceitava `../../etc/passwd` como nome.
27
+ Adicionada whitelist `ALLOWED_SDK_TEMPLATES` e verificação `startsWith(resolve(templatesDir) + sep)`
28
+ como defesa em profundidade.
29
+
30
+ - **HIGH-5 `docs publish` usava path absoluto Windows como slug.**
31
+ Path como `C:/Users/dev/projeto/docs/intro.md` virava slug `C:/Users/dev/projeto/docs/intro`,
32
+ expondo estrutura de filesystem. `deriveSlugFromPath` agora converte para relativo via
33
+ `path.relative(cwd, file)` e rejeita slugs com `:`, `..` ou `/` inicial.
34
+
35
+ ## [2.8.2] — 2026-05-25 (fix UX slug conflict + docs open)
36
+
37
+ ### Corrigido
38
+
39
+ - **Bug #31 `neetru new` não falha seco em conflito de slug.**
40
+ Quando o Core retorna 400 com "Já existe um produto com o slug X", o CLI
41
+ agora exibe o produto existente (nome, ID, status) e oferece um prompt
42
+ interativo com três opções:
43
+ 1. Vincular este projeto local ao produto existente (escreve `.neetru/config.json`
44
+ apontando para o `productId`).
45
+ 2. Criar com slug diferente — lista sugestões (`gestovendas-v2`, `-2`, etc.)
46
+ ou permite digitar um slug livre.
47
+ 3. Cancelar.
48
+ Removida a mensagem "Tente manualmente: neetru products create --slug <mesmo-slug>"
49
+ que sugeria repetir exatamente o comando que vai falhar de novo.
50
+ O fallback genérico cobre qualquer 400 cujo `message` contenha "Já existe",
51
+ "slug", "already exists" ou "duplicate".
52
+
53
+ - **Bug #26 `neetru docs` não abria documentação ao vivo.**
54
+ O comando `neetru docs` era exclusivamente um registry CRUD (publish/list/get/delete)
55
+ e não tinha forma de acessar a documentação pública. Adicionado:
56
+ - `neetru docs open [topic]` — abre `https://core.neetru.com/docs` (ou seção
57
+ específica) no browser padrão. Tópicos: `sdk`, `cli`, `db`, `webhooks`, `auth`,
58
+ `billing`, `observability`, `infra`, `dns`, `deploy`, `architecture`.
59
+ - `neetru docs open` sem argumento abre o índice geral.
60
+ - Argumentos desconhecidos abrem busca: `core.neetru.com/docs?q=<query>`.
61
+ - No menu interativo (`neetru ui`), "Docs live" agora exibe "Abrir documentação
62
+ no navegador" como primeira opção antes das opções de registry.
63
+
64
+ ### Notas de uso
65
+
66
+ ```
67
+ neetru docs open # abre core.neetru.com/docs
68
+ neetru docs open sdk # vai direto pra referência do SDK
69
+ neetru docs open webhooks # manual de runtime/webhooks
70
+ ```
71
+
72
+ ## [2.8.1] — 2026-05-25 (marketplace)
73
+
74
+ ### Adicionado
75
+
76
+ - **`neetru marketplace`**central de artefatos do ecossistema Neetru.
77
+ - `neetru marketplace skills install` clona `Neetru/neetru-libs` em
78
+ `~/.neetru/marketplace-cache/` e instala skills em `~/.claude/skills/`.
79
+ Linux/macOS: symlink (atualizações automáticas via git pull).
80
+ Windows: cópia recursiva (sem exigir Developer Mode).
81
+ - `neetru marketplace skills update` — git pull no cache + re-copia skills
82
+ instaladas como cópia (symlinks já são atualizados pelo pull).
83
+ - `neetru marketplace skills list` — tabela com nome, versão, status e
84
+ descrição de cada skill disponível no cache local.
85
+ - `neetru marketplace skills uninstall` — remove skills de `~/.claude/skills/`
86
+ com confirmação interativa (bypass via `--yes`).
87
+ - `neetru marketplace sdk init` adiciona `@neetru/sdk@^2.1.0` ao
88
+ `package.json` do projeto atual e cria `src/neetru.ts` com boilerplate
89
+ de `createNeetruClient`. Idempotente não sobrescreve arquivo existente.
90
+ - `neetru marketplace sdk templates` — lista templates disponíveis em
91
+ `templates/` da instalação do CLI.
92
+ - `neetru marketplace sdk add <template>` — copia template de feature
93
+ (auth/billing/usage/support/users) pra `src/` do projeto atual.
94
+ - `neetru marketplace browse` abre `https://github.com/Neetru/neetru-libs`
95
+ no browser (start/open/xdg-open por plataforma).
96
+ - **Menu interativo** item **"Marketplace"** adicionado ao menu principal
97
+ (entre Suporte e Docs live) com sub-menu completo: skills (instalar /
98
+ atualizar / listar / remover) + SDK (init / add template / listar / docs)
99
+ + abrir no GitHub.
100
+
101
+ ## [2.7.5] — 2026-05-20 (fix do crash no upgrade)
102
+
103
+ ### Corrigido
104
+
105
+ - `neetru upgrade` não crasha mais ao terminar. O comando chamava
106
+ `process.exit(0)` logo após o `fetch` ao npm — no Windows isso
107
+ derrubava o libuv com `Assertion failed: !(handle->flags &
108
+ UV_HANDLE_CLOSING)` (`async.c`), porque o socket do undici (fetch
109
+ nativo) ainda estava em teardown. Agora o comando só retorna; o event
110
+ loop drena sozinho (o undici dá unref nos sockets idle) e o processo
111
+ encerra limpo na hora.
112
+
113
+ ## [2.7.4] — 2026-05-20 (submenus redesenhados)
114
+
115
+ ### Adicionado
116
+
117
+ - Submenu **"Começar um projeto"** no menu principalreúne o scaffold
118
+ local (`neetru init`), a criação completa (`neetru new`) e uma tela de
119
+ info sobre o `@neetru/sdk` (o que é, como instalar e consumir).
120
+ - Os 10 submenus ganharam o **mesmo visual do menu principal**: moldura
121
+ azul-marinho, marcador `> <` no item ativo e navegação por setas — em
122
+ coluna única, alinhada à esquerda.
123
+
124
+ ### Corrigido
125
+
126
+ - Submenu não engole mais a primeira seta. O menu principal entregava o
127
+ stdin pausado / fora de raw mode pro submenu, e o inquirer perdia a
128
+ tecla — só respondia depois de um toque inicial. Agora o stdin fica
129
+ "quente" na entrega; a seta funciona de cara.
130
+
131
+ ## [2.7.3] — 2026-05-20 (polish do cabeçalho)
132
+
133
+ ### Mudado
134
+
135
+ - Cabeçalho do `neetru` interativo: logo renderizado **ao lado** do texto
136
+ (antes era acima), com a sessão e a versão alinhadas à direita do logo.
137
+ - Paleta de contorno do menu e do logo ajustada para um azul mais suave.
138
+
139
+ ## [2.7.2] — 2026-05-20 (aviso de versão + menu em 2 colunas)
140
+
141
+ ### Adicionado
142
+
143
+ - O cabeçalho do `neetru` interativo mostra a **versão instalada** (`v2.7.2`)
144
+ ao lado do usuário logado. Quando há uma versão mais nova publicada no
145
+ npm, aparece uma linha **amarela** avisando pra rodar `neetru upgrade`.
146
+ A checagem tem timeout curto e é à prova de falha offline não trava o
147
+ CLI.
148
+ - Menu principal redesenhado em **duas colunas**, com navegação por setas
149
+ (↑/↓/←/→) e contorno azul-marinho; o item ativo é marcado com `> <`.
150
+
151
+ ## [2.7.1] 2026-05-20 (UI do CLI interativo)
152
+
153
+ ### Adicionado
154
+
155
+ - Logo Neetru em ANSI truecolor no cabeçalho do `neetru` interativo.
156
+ - Cabeçalho mostra o usuário logado (email), lido localmente do
157
+ `auth.json` — sem chamada de rede.
158
+ - Menu principal com o nome do recurso + uma descrição curta abaixo,
159
+ quando útil.
160
+
161
+ ### Corrigido
162
+
163
+ - O CLI interativo não encerra mais sozinho: comandos que chamavam
164
+ `process.exit()` em erro (ex.: "Nenhum server encontrado") matavam o
165
+ menu inteiro. Agora o erro é capturado e o CLI volta ao menu — só
166
+ "Sair" (ou Ctrl+C) encerra.
167
+
168
+ ## [2.7.0]2026-05-20 (Fluxo de Ambientes Fase 3 — destino cloud-run)
169
+
170
+ ### Adicionado
171
+
172
+ - `neetru deploy --target=cloud-run` — caminho de deploy pro destino Cloud Run
173
+ dedicado. Aceita `--image <uri>` (imagem de container já buildada e pushada)
174
+ ou faz `docker build` + `docker push` automático via `--registry <host>`
175
+ (Artifact Registry). O destino `cloud-run` agora aparece no menu interativo.
176
+
177
+ ### Mudado
178
+
179
+ - `neetru promote`vocabulário de estágios migrado para `dev | staging | prod`
180
+ (antes `dev/workspace/beta/prod`). Gates: 24h em `dev→staging`,
181
+ 168h + canary em `staging→prod`.
182
+ - `neetru deploy --target` — sem valor default; omitir abre o menu interativo
183
+ (workspace / cloud-run / vm). Modo não-interativo continua assumindo `vm`.
184
+
185
+ ## [2.0.0] — 2026-05-06 (Sprint 12 — CLI estabilizada)
186
+
187
+ ### Adicionado
188
+
189
+ - `neetru doctor`diagnóstico completo do ambiente: token CLI, Core acessível,
190
+ schema do `neetru.config.json`, valor de `NEETRU_ENV`, e versão do CLI
191
+ comparada com a `latest` no npm. Saída em tabela colorida (default) ou
192
+ JSON (`--json`). Diferença pra `validate`: doctor inclui environment +
193
+ version mismatch (warning, não fail).
194
+ - `neetru upgrade` verifica `dist-tags.latest` em
195
+ `https://registry.npmjs.org/@neetru/cli` e exibe instrução de upgrade
196
+ (`npm install -g @neetru/cli@latest`). Sem auto-install — não quebra
197
+ pipelines pinados.
198
+ - `neetru autocomplete <bash|zsh|pwsh>` — gera script de shell completion
199
+ pra os 22 subcomandos top-level. Usuário cola na config do shell:
200
+ `neetru autocomplete bash >> ~/.bashrc`.
201
+ - `neetru config set telemetry.enabled <true|false>` opt-in explícito de
202
+ telemetria. Default desligado. Quando ligado, CLI envia eventos
203
+ anonimizados pra `POST /sdk/v1/telemetry/log` (placeholder na v2.0).
204
+ Nunca envia tokens, paths absolutos ou conteúdo de arquivos.
205
+
206
+ ### Bumped
207
+
208
+ - `1.4.0 2.0.0` (major bump por convenção de estabilidadesem breaking
209
+ changes funcionais).
210
+
211
+ ### Não publicado no npm ainda
212
+
213
+ Bump local. Publish manual pra npm fica deferido — owner aprovará. Build
214
+ local (`npm run build` em `cli/`) gera o `dist/` pronto pra publicação.
215
+
216
+ ## [1.3.0] — 2026-05-06
217
+
218
+ ### Adicionado
219
+
220
+ - `neetru add <feature>` copia template em `cli/templates/{feature}/*` para
221
+ `src/lib/neetru/{feature}/*` no projeto atual. Features: `auth`, `billing`,
222
+ `usage`, `users`, `support`. Suporta `--force` pra sobrescrever.
223
+ - `neetru mocks reset` — reseta `.neetru/dev-fixtures.json` para `{}` (útil
224
+ com `NEETRU_ENV=dev`).
225
+ - `neetru env switch <dev|workspace|production>` — atualiza/insere
226
+ `NEETRU_ENV=<value>` em `.env.local` preservando as outras chaves.
227
+ - `neetru logs` ganhou flags:
228
+ - `--product <productId>` — filtra logs por produto.
229
+ - `--channel <channel>` — filtra por channel (stdout/stderr/app/...).
230
+ - `--correlation-id <uuid>` — filtra por correlation ID.
231
+
232
+ ### Templates novos (`cli/templates/`)
233
+
234
+ - `auth/sign-in.tsx`, `auth/callback.ts`
235
+ - `billing/page.tsx`, `billing/checkout.ts`
236
+ - `usage/track.ts`
237
+ - `users/profile.tsx`
238
+ - `support/ticket-form.tsx`
239
+
240
+ ### Não publicado no npm ainda
241
+
242
+ Bump local `1.2.0 → 1.3.0`. Publish pra npm fica deferido — owner aprovará
243
+ manualmente quando quiser. Build local (`npm run build` em `cli/`) já compila.
244
+
245
+ ## [1.2.0] — 2026-05-06
246
+
247
+ **Consolidação das duas linhas paralelas.** Esta versão unifica os comandos das duas linhas de CLI que estavam coexistindo:
248
+
249
+ - **`@neetru/cli@1.0.x` (publicada no npm)**: linha *workspace-centric* com `init`, `add`, `validate`, `generate-types`, `whoami`, `login`, `status`, `logs`, `deploy`, `open`. APIs: `/api/v1/cli/workspace/*`.
250
+ - **`@neetru/cli@0.1.0` (monorepo, não publicada)**: linha *server-centric* com `ai`, `init`, `config`, `login`, `logout`, `whoami`, `build`, `deploy`, `publish`. APIs: `/api/v1/cli/{catalog,deploy,servers}`.
251
+
252
+ As duas falam **APIs distintas e complementares** do mesmo Neetru Core, refletindo a topologia real do produto:
253
+
254
+ ```
255
+ Workspace (prototipação) ──build/promote──► Server VM ou Cloud Run (produção)
256
+ ```
257
+
258
+ A `1.2.0` traz ambos os conjuntos de comandos numa única CLI. O monorepo passa a ser a fonte canônica.
259
+
260
+ ### Adicionado em relação a `1.0.1`
261
+
262
+ Comandos da linha *server-centric* (deploy via VM agent ou Cloud Run):
263
+
264
+ - `neetru ai` — REPL multi-model (Claude/OpenAI/Gemini) com contexto Neetru-aware
265
+ - `neetru build` — empacota produto local em tarball + manifest com sha256, detecção automática de stack (node/docker/php-apache/static)
266
+ - `neetru deploy` — pipeline E2E interativo (escolha de produto/server/domain/port + polling status até estado terminal). Suporta `--non-interactive` para CI.
267
+ - `neetru publish` — registra produto no catálogo público (`public_products`), com `--draft` e `--unpublish`
268
+ - `neetru config {set|get|path}` — gerenciamento de chaves de API e config local
269
+ - `neetru logout` — limpa credenciais
270
+ - `neetru login --token nrt_<keyId>_<secret>` — modo CI/legacy paralelo ao Device Code OAuth
271
+ - `neetru login --json` — saída machine-readable para scripts
272
+
273
+ ### Mantido de `1.0.1` (re-implementado em TypeScript com convenções do monorepo)
274
+
275
+ - `neetru status --client-id <id>` — status de workspace (build/deploy último, domínio, tier, expira em N dias)
276
+ - `neetru logs --client-id <id>` — visualiza logs do workspace; suporta `-f` follow + `-n N` lines + `--since 30m` + `--level error`
277
+ - `neetru validate` — health-check da config local + ping `/api/health` + whoami
278
+ - `neetru open [target]` — abre dashboard, builds, logs, workspaces, products, servers, incidents no browser
279
+ - `neetru init <name>` — agora gera projeto Next.js 15 OU Node API (Fastify) com schema canônico v2
280
+
281
+ ### Backlog 1.3.x
282
+
283
+ Comandos que ainda dependem de design/templates novos:
284
+
285
+ - `neetru add <feature>` — scaffolds OAuth/billing/usage/users
286
+ - `neetru generate-types` — codegen TypeScript de planos/features/entitlements
287
+
288
+ ### Alterado
289
+
290
+ - Package agora é ESM nativo (`"type": "module"`). Imports usam `.js` extension.
291
+ - `neetru login` agora usa Device Code OAuth (RFC 8628) por default; `--token` permanece para CI.
292
+
293
+ ### Migração de `1.0.x`
294
+
295
+ Não há caminho 100% automático porque a config local muda:
296
+
297
+ - `1.0.x` lia `neetru.json` workspace-local com `{clientId, coreUrl}` + var de ambiente `NEETRU_CLIENT_SECRET`
298
+ - `1.2.0` lê `~/.config/neetru-cli/auth.json` (Bearer token salvo por `neetru login`) + `neetru.config.json` por projeto com `{slug, runtime, publish}`
299
+
300
+ Recomendação:
301
+
302
+ 1. `npm uninstall -g @neetru/cli && npm install -g @neetru/cli@1.2.0`
303
+ 2. `neetru login` (Device Code) — gera credencial Bearer no novo formato
304
+ 3. Para comandos workspace (`status`, `logs`, `open`), passe `--client-id <oauthClientId>` explicitamente — o `clientId` continua sendo o `oauthClientId` do seu workspace, achável em UI Core `/workspaces/{id}`
305
+
306
+ ## [1.0.1] — anterior
307
+
308
+ Linha workspace publicada no npm. Comandos: `init`, `add`, `validate`, `generate-types`, `whoami`, `login`, `status`, `logs`, `deploy`, `open`. APIs: `/api/v1/cli/workspace/*`.
309
+
310
+ ## [1.0.0] — anterior
311
+
312
+ Primeira versão pública.
313
+
314
+ ## [0.1.0] — interno (não publicado)
315
+
316
+ Snapshot interno do monorepo durante desenvolvimento da Sprint 1+. Substituído por `1.2.0`.