@nio-cli/cli 0.2.0 → 0.3.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 (77) hide show
  1. package/README.md +68 -26
  2. package/dist/app/ai-client.js +44 -0
  3. package/dist/app/ai-client.js.map +1 -0
  4. package/dist/app/docker-manager.js +12 -9
  5. package/dist/app/docker-manager.js.map +1 -1
  6. package/dist/cli/commands/ai.js +61 -0
  7. package/dist/cli/commands/ai.js.map +1 -0
  8. package/dist/cli/commands/auth.js +91 -70
  9. package/dist/cli/commands/auth.js.map +1 -1
  10. package/dist/cli/commands/config.js +4 -2
  11. package/dist/cli/commands/config.js.map +1 -1
  12. package/dist/cli/commands/debug.js +9 -0
  13. package/dist/cli/commands/debug.js.map +1 -1
  14. package/dist/cli/commands/docker.js +25 -0
  15. package/dist/cli/commands/docker.js.map +1 -1
  16. package/dist/cli/commands/docs/content.js +26 -6
  17. package/dist/cli/commands/docs/content.js.map +1 -1
  18. package/dist/cli/commands/init/auth-step.js +2 -1
  19. package/dist/cli/commands/init/auth-step.js.map +1 -1
  20. package/dist/cli/commands/init/handoff.js +20 -0
  21. package/dist/cli/commands/init/handoff.js.map +1 -0
  22. package/dist/cli/commands/init/index.js +24 -38
  23. package/dist/cli/commands/init/index.js.map +1 -1
  24. package/dist/cli/commands/open.js +8 -0
  25. package/dist/cli/commands/open.js.map +1 -1
  26. package/dist/cli/commands/start.js +8 -0
  27. package/dist/cli/commands/start.js.map +1 -0
  28. package/dist/cli/flows/onboarding.js +116 -0
  29. package/dist/cli/flows/onboarding.js.map +1 -0
  30. package/dist/cli/program.js +58 -0
  31. package/dist/cli/program.js.map +1 -0
  32. package/dist/cli.js +26 -53
  33. package/dist/cli.js.map +1 -1
  34. package/dist/gateway/config.js +1 -2
  35. package/dist/gateway/config.js.map +1 -1
  36. package/dist/lib/auth/gateway-client.js +22 -42
  37. package/dist/lib/auth/gateway-client.js.map +1 -1
  38. package/dist/lib/auth/gateway-process.js +54 -0
  39. package/dist/lib/auth/gateway-process.js.map +1 -0
  40. package/dist/lib/auth/nio-config.js +10 -1
  41. package/dist/lib/auth/nio-config.js.map +1 -1
  42. package/dist/lib/clients/client-configs.js +24 -10
  43. package/dist/lib/clients/client-configs.js.map +1 -1
  44. package/dist/lib/debug.js +6 -0
  45. package/dist/lib/debug.js.map +1 -0
  46. package/dist/lib/headroom.js +44 -0
  47. package/dist/lib/headroom.js.map +1 -0
  48. package/dist/lib/ide-tasks.js +54 -0
  49. package/dist/lib/ide-tasks.js.map +1 -0
  50. package/dist/lib/load-env.js +31 -2
  51. package/dist/lib/load-env.js.map +1 -1
  52. package/dist/matrix-logo.js +43 -11
  53. package/dist/matrix-logo.js.map +1 -1
  54. package/dist/tui/app.js +116 -0
  55. package/dist/tui/app.js.map +1 -0
  56. package/dist/tui/components.js +0 -0
  57. package/dist/tui/components.js.map +1 -0
  58. package/dist/tui/debug.js +17 -0
  59. package/dist/tui/debug.js.map +1 -0
  60. package/dist/tui/index.js +2 -0
  61. package/dist/tui/index.js.map +1 -0
  62. package/dist/tui/launch.js +64 -0
  63. package/dist/tui/launch.js.map +1 -0
  64. package/dist/tui/markdown.js +40 -0
  65. package/dist/tui/markdown.js.map +1 -0
  66. package/dist/tui/opencode.js +28 -0
  67. package/dist/tui/opencode.js.map +1 -0
  68. package/dist/tui/palette-source.js +71 -0
  69. package/dist/tui/palette-source.js.map +1 -0
  70. package/dist/tui/palette.js +100 -0
  71. package/dist/tui/palette.js.map +1 -0
  72. package/dist/tui/state.js +105 -0
  73. package/dist/tui/state.js.map +1 -0
  74. package/dist/tui/theme.js +14 -0
  75. package/dist/tui/theme.js.map +1 -0
  76. package/headroom/docker-compose.yml +27 -0
  77. package/package.json +11 -1
package/README.md CHANGED
@@ -27,10 +27,11 @@ você → nio (CLI) ──► nio-gateway ──► Postgres (login: senh
27
27
  `EnvironmentBuilder` garante os toolchains, resolve os MCPs e grava o `config`
28
28
  materializado na linha `sessions` do Postgres. A sessão é isolada, tem UUID e
29
29
  pode ser reativada depois (`nio sessions`).
30
- 3. **A CLI registra o MCP `nio`** no `opencode.json` e entrega o terminal pro
31
- **OpenCode** (operador de IA fixo, modelo `opencode/big-pickle`). A partir daí
32
- o agente tem as tools `nio_*` criar/ativar sessão, re-materializar ambiente,
33
- detectar dependências, delegar execução.
30
+ 3. **`nio ai` abre a interface NIO** o Headroom (proxy de compressão, container
31
+ Docker, obrigatório), o `opencode serve` headless (`opencode/big-pickle`, MCP
32
+ `nio` + MCPs do perfil), e a UI do NIO em Ink (chat, sidebar, paleta `/`). Com
33
+ IDE, roda num terminal integrado dela. A partir daí o agente tem as tools
34
+ `nio_*` — criar/ativar sessão, re-materializar ambiente, delegar execução.
34
35
 
35
36
  O **Postgres é a fonte da verdade** do domínio (usuários, sessões, trilha de
36
37
  auth). A CLI e o gateway só falam com o banco que **você** configurar — não há
@@ -56,6 +57,7 @@ Ficam no PATH: `nio` (CLI), `nio-gateway` (serviço de auth), `nio-cli` e
56
57
  | **PostgreSQL** alcançável | fonte da verdade (sessões, usuários) | schema em `db/schema.sql` aplicado uma vez |
57
58
  | **`JWT_SECRET`** (segredo do time) | assinar/validar as sessões | mesmo valor em toda máquina |
58
59
  | **OpenCode** | operador de IA | o `nio init` oferece instalar (`npm i -g opencode-ai`) |
60
+ | **Docker** | obrigatório pro `nio ai` — roda o Headroom (proxy de compressão) | `docker compose version` |
59
61
  | *(opcional)* provedor de SMS | 2º fator | `SMS_ENDPOINT_URL` + `SMS_AUTH_HEADER` + `SMS_BODY_TEMPLATE` |
60
62
 
61
63
  ---
@@ -102,7 +104,7 @@ JWT_SECRET=<mesmo-valor-do-time>
102
104
  | `JWT_SECRET` / `JWT_EXPIRES_IN` | **sem** prefixo (segredo do time) | `nio-gateway` + `nio-cli` |
103
105
  | `SMS_ENDPOINT_URL` / `SMS_AUTH_HEADER` / `SMS_BODY_TEMPLATE` / `SMS_FROM` | **sem** prefixo | `nio-gateway` |
104
106
  | `NIO_GATEWAY_HOST` (default `127.0.0.1`) | `NIO_` | `nio-gateway` — `0.0.0.0` p/ Kong em container |
105
- | `NIO_GATEWAY_URL` (default `http://127.0.0.1:8000`) | `NIO_` | a CLI, pra achar o gateway/Kong |
107
+ | `NIO_GATEWAY_URL` (default `http://127.0.0.1:3000`) | `NIO_` | a CLI acha o nio-gateway (Kong na frente = aponta :8000) |
106
108
 
107
109
  O schema de conexão é sempre `postgres://…`; um destino inválido falha explícito,
108
110
  nunca cai num default silencioso.
@@ -111,17 +113,28 @@ nunca cai num default silencioso.
111
113
 
112
114
  ## Primeiros passos
113
115
 
116
+ Um comando só:
117
+
118
+ ```bash
119
+ nio # (ou `nio start`) — a esteira guiada
120
+ ```
121
+
122
+ A esteira detecta em que ponto você está e conduz — **config → gateway → login →
123
+ sessão → handoff pro OpenCode** —, perguntando antes de cada passo. Ela sobe o
124
+ `nio-gateway` sozinha se faltar. Se você sair no meio, ela imprime a linha exata
125
+ pra retomar (`nio start`); nada morre no silêncio.
126
+
127
+ Por dentro, é isto (cada um roda na mão também):
128
+
114
129
  ```bash
115
130
  nio config setup # cola NIO_DATABASE_URL + JWT_SECRET (o time te passa), testa, salva
116
- nio-gateway & # gateway de auth no ar (precisa pro login/logout/2FA)
117
- nio register # cria seu usuário na base compartilhada
131
+ nio-gateway # gateway de auth (a esteira sobe sozinha se faltar)
132
+ nio register # cria seu usuário na base compartilhada → cai no login
118
133
  nio login # autentica (salva o JWT em ~/.nio/session.json)
119
134
  nio security enable-2fa # (opcional) 2º fator
120
- nio init # monta o ambiente da sessão neste diretório
135
+ nio init # monta o ambiente da sessão `nio ai` (Headroom + OpenCode, num terminal da IDE)
121
136
  ```
122
137
 
123
- Se você pular o `nio config setup`, o próprio `nio register`/`init` abre o wizard.
124
-
125
138
  O `nio-gateway` só é necessário pros comandos de auth (`login`/`logout`/
126
139
  `verify-2fa`/`security`). Todo o resto — `init`, `sessions`, as tools MCP —
127
140
  fala com o Postgres direto usando o JWT local. Rode `nio debug` a qualquer
@@ -137,9 +150,9 @@ Hexagonal. O núcleo não conhece IO; os adapters implementam os contratos.
137
150
  entrypoints: src/cli.ts (nio) src/gateway/index.ts (nio-gateway)
138
151
  src/mcp-server.ts (nio-cli) src/mcp-server-lang.ts (nio-lang)
139
152
  app: SessionManager · EnvironmentBuilder · DependencyWatcher · DockerManager
140
- core/: types.ts / session.ts (entidades) + ports.ts / repositories.ts
141
- / environment.ts / docker.ts / messaging.ts (interfaces, sem IO)
142
- adapters/: pg/ (Postgres) ide/ (vscode) pkg/ (npm,pip,…) docker/ sms/ skills/
153
+ core/: types.ts (entidades + enums) + ports por domínio, sem IO:
154
+ repositories.ts · environment.ts · docker.ts · messaging.ts · lang.ts
155
+ adapters/: pg/ (Postgres) ide/ (vscode) pkg/ (npm,pip,…) docker/ sms/ skills/ lang/
143
156
  profiles/: catálogo dos 6 perfis (fixos no fonte)
144
157
  ```
145
158
 
@@ -159,7 +172,7 @@ Detalhes: [`docs/arch/`](docs/arch/) (uma `ARQUITETURA-*.md` por camada) e os
159
172
 
160
173
  ### Perfis
161
174
 
162
- Fixos no fonte (`src/core/session.ts`) — novos perfis só entram alterando o código:
175
+ Fixos no fonte (`src/core/types.ts`) — novos perfis só entram alterando o código:
163
176
 
164
177
  `fullstack` · `analyst` · `scientist` · `dba` · `qa` · `bi`
165
178
 
@@ -200,15 +213,32 @@ endpoint local que imprime o código no terminal (aponte `SMS_ENDPOINT_URL` pra
200
213
 
201
214
  ---
202
215
 
203
- ## Operador de IA
204
-
205
- No fim do `nio init`, a CLI entrega o terminal pro operador de IA fixo:
206
- **OpenCode** rodando `opencode/big-pickle` (default gravado no
207
- `~/.config/opencode/opencode.json`, junto do MCP `nio` e dos MCPs do perfil). Ver
208
- [`docs/arch/ARQUITETURA-CLIENTE-IA.md`](docs/arch/ARQUITETURA-CLIENTE-IA.md).
209
-
210
- > Multi-cliente (OpenCode | Codex), proxy de compressão de contexto e ladder de
211
- > failover entre modelos são **feature futura** desenho parkeado em
216
+ ## Operador de IA (`nio ai`)
217
+
218
+ No fim do `nio init` a CLI sobe o **client de IA** da sessão — e o mesmo `nio ai`
219
+ retoma a qualquer momento. Ele:
220
+
221
+ 1. **Sobe o Headroom** — proxy de compressão de contexto em container Docker
222
+ (`headroom/docker-compose.yml`), **obrigatório** ([ADR 0007](docs/adr/0007-headroom-proxy-obrigatorio.md)).
223
+ Sem Docker, `nio ai` para com erro acionável (o `nio init` não morre — materializa
224
+ o ambiente e deixa a linha `nio ai` pra retomar). Manual: `nio docker headroom {up,down,status}`.
225
+ 2. **Aponta o provider pro Headroom** — grava `provider.opencode.options.baseURL`
226
+ no `~/.config/opencode/opencode.json` (junto do `model: opencode/big-pickle`,
227
+ do MCP `nio` e dos MCPs do perfil).
228
+ 3. **Sobe o `opencode serve` headless e abre a interface NIO** (Ink — chat
229
+ streamado, sidebar verde, paleta `/` com os comandos e capacidades do NIO). O
230
+ motor é o `opencode/big-pickle`; a casca é nossa. Se a sessão tem IDE (VS Code /
231
+ Cursor), o `nio init` grava um `.vscode/tasks.json` (task `NIO`, `runOn: folderOpen`)
232
+ e o `nio ai` sobe num **terminal integrado da IDE** — uma superfície, não duas.
233
+ Sem IDE, roda no terminal atual. Sem TTY / sem `opencode` → cai na TUI do OpenCode.
234
+
235
+ Ver [`docs/arch/ARQUITETURA-CLIENTE-IA.md`](docs/arch/ARQUITETURA-CLIENTE-IA.md) e
236
+ [`docs/arch/ARQUITETURA-CLIENTE-TUI.md`](docs/arch/ARQUITETURA-CLIENTE-TUI.md).
237
+
238
+ > A interface NIO (Ink) está na **fatia 2a** ([ADR 0008](docs/adr/0008-interface-nio-ink.md)).
239
+ > A paridade completa com o OpenCode (diff viewer, file tree, seletor de modelo…) é a 2b.
240
+ > Multi-cliente (OpenCode | Codex) e o ladder de failover entre modelos seguem
241
+ > parkeados em
212
242
  > [`docs/arch/ARQUITETURA-CLIENTES-MULTI-FUTURO.md`](docs/arch/ARQUITETURA-CLIENTES-MULTI-FUTURO.md)
213
243
  > ([ADR 0004](docs/adr/0004-operador-ia-unico.md)).
214
244
 
@@ -220,10 +250,12 @@ Operações do CLI, **sem o binário na frente** (declarado no cabeçalho da tab
220
250
  Gerada da fonte por `npm run gen:docs`. Ajuda de qualquer comando: `nio <cmd> --help`.
221
251
 
222
252
  <!-- COMMANDS:START -->
223
- <!-- gerado por `bun run gen:docs` — não edite à mão. binário `nio`, 35 comandos. -->
253
+ <!-- gerado por `bun run gen:docs` — não edite à mão. binário `nio`, 42 comandos. -->
224
254
 
225
255
  | Comando | Descrição |
226
256
  | --- | --- |
257
+ | `ai` | Abre a interface NIO da sessão ativa (Headroom + opencode serve + Ink) |
258
+ | `ai status` | Estado do Headroom (proxy obrigatório do client de IA) |
227
259
  | `clean-legacy` | Remove commands/skills legados (substituídos) de ~/.claude e ~/.codex |
228
260
  | `completion [shell]` | Imprime o script de autocomplete (bash\|zsh\|fish). |
229
261
  | `config` | Config compartilhada da equipe (~/.nio/config.env) |
@@ -235,6 +267,10 @@ Gerada da fonte por `npm run gen:docs`. Ajuda de qualquer comando: `nio <cmd> --
235
267
  | `docker compose <action> [service]` | Wrapper sobre `docker compose` do projeto (up\|down\|restart\|ps\|logs) |
236
268
  | `docker create` | Cria e sobe um container (wizard ou flags) |
237
269
  | `docker debug [container]` | Coleta o contexto de um container e entrega o diagnóstico pro operador de IA |
270
+ | `docker headroom` | Proxy de compressão de contexto — obrigatório pro `nio ai` (ADR 0007) |
271
+ | `docker headroom down` | Derruba o container do Headroom |
272
+ | `docker headroom status` | O Headroom está no ar? |
273
+ | `docker headroom up` | Sobe o container do Headroom |
238
274
  | `docker orquest [instruction]` | Orquestra os serviços do projeto via compose, dirigido pelo operador (linguagem natural) |
239
275
  | `docker portainer` | Abre o Portainer no navegador |
240
276
  | `docker toolkit` | Infra NIO: Docker MCP Gateway + Portainer (docker/docker-compose.yml) |
@@ -248,7 +284,7 @@ Gerada da fonte por `npm run gen:docs`. Ajuda de qualquer comando: `nio <cmd> --
248
284
  | `login` | Autentica via nio-gateway (túnel HTTP) e salva a sessão localmente (JWT) |
249
285
  | `logout` | Encerra a sessão local e revoga a auth_session no banco |
250
286
  | `plan` | Roda o engine pensante sobre o projeto e escreve/refina o plan.md da raiz. |
251
- | `register` | Cria um novo usuário no banco (user_cli) |
287
+ | `register` | Cria um novo usuário no banco (user_cli) e já entra (login) |
252
288
  | `security` | 2º fator do login (SMS OTP + códigos de backup) |
253
289
  | `security disable-2fa` | Desativa o 2º fator |
254
290
  | `security enable-2fa` | Ativa o 2º fator via SMS |
@@ -256,6 +292,7 @@ Gerada da fonte por `npm run gen:docs`. Ajuda de qualquer comando: `nio <cmd> --
256
292
  | `security status` | Mostra o estado do 2º fator |
257
293
  | `skills` | Skills, commands e agents do nio (lidos do repo aberto via cache) |
258
294
  | `skills status` | Lista os docs do repo de skills (cache local ~/.nio/skills) |
295
+ | `start` | Conduz a esteira: config → gateway → login → sessão → OpenCode |
259
296
  | `sync` | Instala/atualiza skills, commands e agents nos clientes configurados, a partir do bundle (idempotente); checa atualização do pacote |
260
297
  | `validate-plan` | Lê o plan.md da raiz e roda o engine pensante para julgar se o plano precisa de uma spec antes de implementar. |
261
298
  | `whoami` | Mostra o usuário autenticado |
@@ -449,7 +486,12 @@ background em qualquer comando (`update-notifier`).
449
486
  | `Conteúdo de skills não encontrado` | cache `~/.nio/skills` vazio — rode `nio sync` com rede, ou `NIO_SKILLS_DIR` pra um checkout local |
450
487
  | Sobraram comandos antigos | `nio clean-legacy` (`--dry-run` pra revisar antes) |
451
488
 
452
- Sempre: `nio debug` mostra o estado de tudo com uma dica por item.
489
+ Sempre: `nio debug` mostra o estado de tudo com uma dica por item. E
490
+ `NIO_DEBUG=1 nio <cmd>` liga log verboso (`[nio:debug]` em stderr): `.env`
491
+ carregados, config resolvida, requests pro gateway, e stack trace completo nos erros.
492
+
493
+ O logo Matrix anima (chuva caindo) toda vez que aparece em terminal interativo.
494
+ `NIO_NO_ANIM=1` deixa ele sempre estático; fora de TTY (pipe/CI) já é estático.
453
495
 
454
496
  ---
455
497
 
@@ -0,0 +1,44 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { ensureHeadroomRunning, HEADROOM_URL } from '../lib/headroom.js';
3
+ import { installOpencodeGlobal, NIO_OPERATOR_MODEL } from '../lib/clients/client-configs.js';
4
+ import { isBinaryInstalled } from '../lib/clients/client-install.js';
5
+ import { c, sym } from '../lib/colors.js';
6
+ import { dlog } from '../lib/debug.js';
7
+ export class HeadroomRequiredError extends Error {
8
+ constructor(detail) {
9
+ super(`Headroom é obrigatório pro client de IA (ADR 0007). ${detail}`);
10
+ this.name = 'HeadroomRequiredError';
11
+ }
12
+ }
13
+ export async function ensureHeadroomAndWire(ensure = ensureHeadroomRunning) {
14
+ const h = await ensure();
15
+ if (!h.ok)
16
+ throw new HeadroomRequiredError(h.error ?? 'não consegui subir o Headroom.');
17
+ if (h.started)
18
+ console.log(` ${c.green(sym.ok)} Headroom no ar (${HEADROOM_URL}).`);
19
+ try {
20
+ installOpencodeGlobal([], undefined, HEADROOM_URL);
21
+ dlog('opencode.json: provider.opencode.options.baseURL =', HEADROOM_URL);
22
+ }
23
+ catch (err) {
24
+ console.warn(` ${c.yellow(sym.warn)} não gravei o baseURL no opencode.json: ${err.message}`);
25
+ }
26
+ }
27
+ export async function launchAiClient(opts, deps = {}) {
28
+ const spawnFn = deps.spawnFn ?? spawn;
29
+ const isInstalled = deps.isInstalled ?? isBinaryInstalled;
30
+ await ensureHeadroomAndWire(deps.ensureHeadroom);
31
+ if (!isInstalled('opencode')) {
32
+ console.log(` ${c.yellow(sym.warn)} OpenCode não está no PATH. Instale com \`npm i -g opencode-ai\`.`);
33
+ return 127;
34
+ }
35
+ return new Promise((resolve) => {
36
+ const child = spawnFn('opencode', ['run', '--model', NIO_OPERATOR_MODEL, opts.prompt], { stdio: 'inherit', cwd: opts.cwd });
37
+ child.on('exit', (code) => resolve(code ?? 0));
38
+ child.on('error', (err) => {
39
+ console.error(`[erro] Falha ao iniciar o OpenCode: ${err.message}`);
40
+ resolve(127);
41
+ });
42
+ });
43
+ }
44
+ //# sourceMappingURL=ai-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-client.js","sourceRoot":"","sources":["../../src/app/ai-client.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,qBAAqB,EAAE,YAAY,EAA6B,MAAM,oBAAoB,CAAC;AACpG,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAC7F,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAGvC,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IAC9C,YAAY,MAAc;QACxB,KAAK,CAAC,uDAAuD,MAAM,EAAE,CAAC,CAAC;QACvE,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;IACtC,CAAC;CACF;AAaD,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,SAA8C,qBAAqB;IAEnE,MAAM,CAAC,GAAG,MAAM,MAAM,EAAE,CAAC;IACzB,IAAI,CAAC,CAAC,CAAC,EAAE;QAAE,MAAM,IAAI,qBAAqB,CAAC,CAAC,CAAC,KAAK,IAAI,gCAAgC,CAAC,CAAC;IACxF,IAAI,CAAC,CAAC,OAAO;QAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,oBAAoB,YAAY,IAAI,CAAC,CAAC;IACrF,IAAI,CAAC;QACH,qBAAqB,CAAC,EAAE,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;QACnD,IAAI,CAAC,oDAAoD,EAAE,YAAY,CAAC,CAAC;IAC3E,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,2CAA4C,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;IAC3G,CAAC;AACH,CAAC;AAGD,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,IAAqC,EACrC,OAAqB,EAAE;IAEvB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC;IACtC,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,iBAAiB,CAAC;IAE1D,MAAM,qBAAqB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAEjD,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE,CAAC;QAC7B,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,mEAAmE,CAC3F,CAAC;QACF,OAAO,GAAG,CAAC;IACb,CAAC;IAED,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,KAAK,GAAG,OAAO,CACnB,UAAU,EACV,CAAC,KAAK,EAAE,SAAS,EAAE,kBAAkB,EAAE,IAAI,CAAC,MAAM,CAAC,EACnD,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CACpC,CAAC;QACF,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;QAC/C,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACxB,OAAO,CAAC,KAAK,CAAC,uCAAuC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YACpE,OAAO,CAAC,GAAG,CAAC,CAAC;QACf,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -1,5 +1,4 @@
1
- import { spawn } from 'node:child_process';
2
- import { NIO_OPERATOR_MODEL } from '../lib/clients/client-configs.js';
1
+ import { launchAiClient, HeadroomRequiredError } from './ai-client.js';
3
2
  import { CLUSTER_STACK } from '../lib/docker.js';
4
3
  const PREAMBLE = [
5
4
  'Você é o operador de infra Docker desta máquina.',
@@ -56,13 +55,17 @@ export function parseServicesLine(output) {
56
55
  return [];
57
56
  return m[1].split(',').map((s) => s.trim()).filter(Boolean);
58
57
  }
59
- export function runOperator(prompt, opts = {}) {
60
- const spawnFn = opts.spawnFn ?? spawn;
61
- return new Promise((resolve) => {
62
- const child = spawnFn('opencode', ['run', '--model', NIO_OPERATOR_MODEL, prompt], { stdio: 'inherit', cwd: opts.cwd });
63
- child.on('exit', (code) => resolve(code ?? 1));
64
- child.on('error', () => resolve(127));
65
- });
58
+ export async function runOperator(prompt, opts = {}) {
59
+ try {
60
+ return await launchAiClient({ cwd: opts.cwd ?? process.cwd(), prompt });
61
+ }
62
+ catch (err) {
63
+ if (err instanceof HeadroomRequiredError) {
64
+ console.error(`[erro] ${err.message}`);
65
+ return 1;
66
+ }
67
+ throw err;
68
+ }
66
69
  }
67
70
  export function parseStackServices(stdout) {
68
71
  return stdout
@@ -1 +1 @@
1
- {"version":3,"file":"docker-manager.js","sourceRoot":"","sources":["../../src/app/docker-manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"docker-manager.js","sourceRoot":"","sources":["../../src/app/docker-manager.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAajD,MAAM,QAAQ,GAAG;IACf,kDAAkD;IAClD,oFAAoF;IACpF,oFAAoF;CACrF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAGb,MAAM,UAAU,gBAAgB,CAAC,GAAiB;IAChD,OAAO;QACL,QAAQ;QACR,EAAE;QACF,oCAAoC,GAAG,CAAC,SAAS,oDAAoD;QACrG,yFAAyF;QACzF,EAAE;QACF,sBAAsB;QACtB,GAAG,CAAC,EAAE;QACN,EAAE;QACF,mBAAmB,GAAG,CAAC,SAAS,aAAa;QAC7C,GAAG,CAAC,IAAI;QACR,EAAE;QACF,sBAAsB,GAAG,CAAC,SAAS,eAAe;QAClD,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC;KAC3B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAGD,MAAM,UAAU,kBAAkB,CAAC,WAAmB,EAAE,WAAmB,EAAE,MAAe;IAC1F,OAAO;QACL,QAAQ;QACR,EAAE;QACF,YAAY,WAAW,EAAE;QACzB,WAAW,WAAW,EAAE;QACxB,EAAE;QACF,MAAM;YACJ,CAAC,CAAC,uHAAuH;YACzH,CAAC,CAAC,wHAAwH;KAC7H,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAGD,MAAM,UAAU,kBAAkB,CAAC,WAAmB,EAAE,WAAmB;IACzE,OAAO;QACL,QAAQ;QACR,EAAE;QACF,YAAY,WAAW,EAAE;QACzB,mDAAmD,aAAa,SAAS,WAAW,EAAE;QACtF,EAAE;QACF,8DAA8D;QAC9D,gIAAgI;QAChI,yCAAyC,aAAa,KAAK;QAC3D,2CAA2C,aAAa,6DAA6D;QACrH,EAAE;QACF,kHAAkH;KACnH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAGD,MAAM,UAAU,iBAAiB,CAAC,MAAc;IAC9C,MAAM,CAAC,GAAG,yBAAyB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACjD,IAAI,CAAC,CAAC;QAAE,OAAO,EAAE,CAAC;IAClB,OAAO,CAAC,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAC/D,CAAC;AAOD,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,MAAc,EACd,OAAyB,EAAE;IAE3B,IAAI,CAAC;QACH,OAAO,MAAM,cAAc,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IAC1E,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,qBAAqB,EAAE,CAAC;YACzC,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YACvC,OAAO,CAAC,CAAC;QACX,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAKD,MAAM,UAAU,kBAAkB,CAAC,MAAc;IAC/C,OAAO,MAAM;SACV,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,MAAM,CAAC,OAAO,CAAC;SACf,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACT,MAAM,CAAC,IAAI,EAAE,QAAQ,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC5C,OAAO,EAAE,IAAI,EAAE,IAAK,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;IAC3D,CAAC,CAAC,CAAC;AACP,CAAC;AAGD,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,MAAM,CAAC,GAAG,2BAA2B,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IACvD,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACpB,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACpD,CAAC;AAGD,MAAM,UAAU,gBAAgB,CAAC,OAAgB;IAC/C,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,KAA4D,CAAC;IAC1F,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,IAAI,IAAI,CAAC;AACxC,CAAC;AAGD,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,IAAuB,EACvB,OAAgB,EAChB,KAA0B;IAE1B,MAAM,KAAK,GAA4B,EAAE,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,CAAC;IAC3E,MAAM,MAAM,GAA4B,EAAE,GAAG,CAAE,KAAK,CAAC,MAAkC,IAAI,EAAE,CAAC,EAAE,CAAC;IACjG,IAAI,KAAK;QAAE,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC;;QAC7B,OAAO,MAAM,CAAC,OAAO,CAAC;IAC3B,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;IACtB,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;AACpE,CAAC;AAGD,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,OAAsB,EACtB,SAAiB;IAEjB,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC5C,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC;QAChB,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC;QAC5B,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC;KAC3B,CAAC,CAAC;IACH,OAAO;QACL,SAAS;QACT,EAAE,EAAE,EAAE,CAAC,MAAM,IAAI,EAAE,CAAC,KAAK,IAAI,EAAE;QAC/B,IAAI,EAAE,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,IAAI,EAAE;QACrC,OAAO,EAAE,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,KAAK,IAAI,EAAE;KAC/C,CAAC;AACJ,CAAC"}
@@ -0,0 +1,61 @@
1
+ import { brand } from "../../brand.js";
2
+ import { c, sym } from "../../lib/colors.js";
3
+ import { loadSession } from "../../lib/auth/session-store.js";
4
+ import { createSessionRepository } from "../../adapters/pg/session-repository.js";
5
+ import { headroomHealthy, HEADROOM_URL } from "../../lib/headroom.js";
6
+ import { HeadroomRequiredError } from "../../app/ai-client.js";
7
+ async function requireActiveSession() {
8
+ const stored = await loadSession();
9
+ if (!stored) {
10
+ console.error(`${c.yellow(sym.warn)} Não autenticado. Rode ${c.cyan(`${brand.name} login`)}.`);
11
+ process.exit(1);
12
+ }
13
+ let session;
14
+ try {
15
+ session = await createSessionRepository().findActiveByUser(stored.userId);
16
+ }
17
+ catch (err) {
18
+ console.error(`${c.red(sym.err)} Falha no banco: ${err.message}`);
19
+ process.exit(1);
20
+ throw err;
21
+ }
22
+ if (!session) {
23
+ console.error(`${c.yellow(sym.warn)} Nenhuma sessão ativa. Rode ${c.cyan(`${brand.name} init`)} ou ` +
24
+ `${c.cyan(`${brand.name} sessions activate <id>`)}.`);
25
+ process.exit(1);
26
+ }
27
+ return session;
28
+ }
29
+ async function runAi() {
30
+ const session = await requireActiveSession();
31
+ try {
32
+ const { launchNioTui } = await import("../../tui/index.js");
33
+ const code = await launchNioTui({ cwd: session.projectPath });
34
+ if (code !== 0)
35
+ process.exitCode = code;
36
+ }
37
+ catch (err) {
38
+ if (err instanceof HeadroomRequiredError) {
39
+ console.error(`${c.red(sym.err)} ${err.message}`);
40
+ console.error(c.dim(` suba o Docker e rode \`${brand.name} docker headroom up\`, ou tente de novo.`));
41
+ process.exit(1);
42
+ }
43
+ throw err;
44
+ }
45
+ }
46
+ export function registerAiCommand(program) {
47
+ const ai = program
48
+ .command("ai")
49
+ .description("Abre a interface NIO da sessão ativa (Headroom + opencode serve + Ink)")
50
+ .action(runAi);
51
+ ai
52
+ .command("status")
53
+ .description("Estado do Headroom (proxy obrigatório do client de IA)")
54
+ .action(async () => {
55
+ const up = await headroomHealthy();
56
+ console.log(`${up ? c.green(sym.ok) : c.red(sym.err)} Headroom ${c.dim(HEADROOM_URL)} — ${up ? "no ar" : "fora"}`);
57
+ if (!up)
58
+ console.log(c.dim(` suba com \`${brand.name} docker headroom up\``));
59
+ });
60
+ }
61
+ //# sourceMappingURL=ai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai.js","sourceRoot":"","sources":["../../../src/cli/commands/ai.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,15 @@
1
1
  import { input, password } from "../../lib/prompts.js";
2
2
  import { brand } from "../../brand.js";
3
- import { renderMatrixLogo } from "../../matrix-logo.js";
3
+ import { animateMatrixLogo } from "../../matrix-logo.js";
4
4
  import { startSpinner } from "../../lib/spinner.js";
5
5
  import { c, sym } from "../../lib/colors.js";
6
6
  import { createUserRepository } from "../../adapters/pg/user-repository.js";
7
7
  import { gatewayLogin, gatewayLogout, gatewayVerify2fa, } from "../../lib/auth/gateway-client.js";
8
8
  import { loadSession, saveSession, clearSession } from "../../lib/auth/session-store.js";
9
9
  import { ensureConfig } from "../../lib/auth/nio-config.js";
10
+ import { ensureGatewayRunning } from "../../lib/auth/gateway-process.js";
11
+ import { continueChain } from "../flows/onboarding.js";
12
+ import { box, cmd } from "../../lib/colors.js";
10
13
  import { authCopy } from "../copy.js";
11
14
  async function resolveSecondFactor(challengeId, phoneHint) {
12
15
  console.log(` ${c.dim(`código enviado por SMS para ${phoneHint}`)}`);
@@ -30,39 +33,95 @@ async function resolveSecondFactor(challengeId, phoneHint) {
30
33
  return null;
31
34
  }
32
35
  const MIN_PASSWORD_LENGTH = 8;
33
- function registerRegisterCommand(program) {
34
- program
35
- .command("register")
36
- .description("Cria um novo usuário no banco (user_cli)")
37
- .action(async () => {
38
- await ensureConfig({ interactive: true });
39
- const name = await input({
40
- message: authCopy.register.namePrompt,
41
- validate: (v) => v.trim().length > 0 || authCopy.register.nameInvalid,
42
- });
43
- const pass = await password({
44
- message: authCopy.register.passwordPrompt,
45
- mask: "*",
46
- validate: (v) => v.length >= MIN_PASSWORD_LENGTH || authCopy.register.passwordInvalid,
47
- });
48
- const repo = createUserRepository();
49
- const spinner = startSpinner("Criando usuário...");
50
- try {
51
- const existing = await repo.findByName(name.trim());
52
- if (existing) {
53
- spinner.fail(`Usuário "${name.trim()}" já existe.`);
36
+ async function requireGateway() {
37
+ const result = await ensureGatewayRunning();
38
+ if (result.ok)
39
+ return;
40
+ console.error(box(`${c.yellow(sym.warn)} ${c.bold("O nio-gateway não está no ar e não consegui subir sozinho.")}\n` +
41
+ `${c.dim("abra noutra janela:")} ${cmd("nio-gateway")}\n` +
42
+ `${c.dim("e tente de novo.")}`, { borderColor: "yellow", title: "Gateway necessário" }));
43
+ process.exit(1);
44
+ }
45
+ export async function runLogin() {
46
+ await ensureConfig({ interactive: true });
47
+ await requireGateway();
48
+ const name = await input({ message: authCopy.login.namePrompt });
49
+ const pass = await password({ message: authCopy.login.passwordPrompt, mask: "*" });
50
+ const spinner = startSpinner("Autenticando...");
51
+ let session;
52
+ try {
53
+ const result = await gatewayLogin(name.trim(), pass);
54
+ if (!result) {
55
+ spinner.fail(authCopy.login.invalidCredentials);
56
+ process.exit(1);
57
+ }
58
+ spinner.stop();
59
+ if (result.step === "done") {
60
+ session = result;
61
+ }
62
+ else {
63
+ const s = await resolveSecondFactor(result.challengeId, result.phoneHint);
64
+ if (!s) {
65
+ console.error(`${c.red(sym.err)} 2º fator não concluído.`);
54
66
  process.exit(1);
55
67
  }
56
- const user = await repo.create({ name: name.trim(), password: pass });
57
- spinner.stop();
58
- console.log(renderMatrixLogo());
59
- console.log(`[ok] Usuário criado: ${user.name} (id ${user.id})`);
60
- console.log(`Rode \`${brand.name} login\` pra autenticar.`);
68
+ session = s;
61
69
  }
62
- catch (err) {
63
- spinner.fail(`Falha ao criar usuário: ${err.message}`);
70
+ }
71
+ catch (err) {
72
+ spinner.fail(`Falha ao autenticar: ${err.message}`);
73
+ process.exit(1);
74
+ }
75
+ await saveSession({
76
+ userId: session.userId,
77
+ name: session.name,
78
+ token: session.token,
79
+ sessionId: session.sessionId,
80
+ loggedInAt: new Date().toISOString(),
81
+ expiresAt: session.expiresAt,
82
+ });
83
+ await animateMatrixLogo();
84
+ console.log("[ok] Autenticado!");
85
+ console.log(`Usuário: ${session.name}`);
86
+ console.log(`ID: ${session.userId}`);
87
+ }
88
+ export async function runRegister() {
89
+ await ensureConfig({ interactive: true });
90
+ const name = await input({
91
+ message: authCopy.register.namePrompt,
92
+ validate: (v) => v.trim().length > 0 || authCopy.register.nameInvalid,
93
+ });
94
+ const pass = await password({
95
+ message: authCopy.register.passwordPrompt,
96
+ mask: "*",
97
+ validate: (v) => v.length >= MIN_PASSWORD_LENGTH || authCopy.register.passwordInvalid,
98
+ });
99
+ const repo = createUserRepository();
100
+ const spinner = startSpinner("Criando usuário...");
101
+ try {
102
+ const existing = await repo.findByName(name.trim());
103
+ if (existing) {
104
+ spinner.fail(`Usuário "${name.trim()}" já existe.`);
64
105
  process.exit(1);
65
106
  }
107
+ const user = await repo.create({ name: name.trim(), password: pass });
108
+ spinner.stop();
109
+ console.log(`${c.green(sym.ok)} Usuário criado: ${user.name} (id ${user.id})`);
110
+ }
111
+ catch (err) {
112
+ spinner.fail(`Falha ao criar usuário: ${err.message}`);
113
+ process.exit(1);
114
+ }
115
+ console.log(c.dim("\nVamos entrar:"));
116
+ await runLogin();
117
+ }
118
+ function registerRegisterCommand(program) {
119
+ program
120
+ .command("register")
121
+ .description("Cria um novo usuário no banco (user_cli) e já entra (login)")
122
+ .action(async () => {
123
+ await runRegister();
124
+ await continueChain({ from: "command" });
66
125
  });
67
126
  }
68
127
  function registerLoginCommand(program) {
@@ -70,46 +129,8 @@ function registerLoginCommand(program) {
70
129
  .command("login")
71
130
  .description("Autentica via nio-gateway (túnel HTTP) e salva a sessão localmente (JWT)")
72
131
  .action(async () => {
73
- await ensureConfig({ interactive: true });
74
- const name = await input({ message: authCopy.login.namePrompt });
75
- const pass = await password({ message: authCopy.login.passwordPrompt, mask: "*" });
76
- const spinner = startSpinner("Autenticando...");
77
- let session;
78
- try {
79
- const result = await gatewayLogin(name.trim(), pass);
80
- if (!result) {
81
- spinner.fail(authCopy.login.invalidCredentials);
82
- process.exit(1);
83
- }
84
- spinner.stop();
85
- if (result.step === "done") {
86
- session = result;
87
- }
88
- else {
89
- const s = await resolveSecondFactor(result.challengeId, result.phoneHint);
90
- if (!s) {
91
- console.error(`${c.red(sym.err)} 2º fator não concluído.`);
92
- process.exit(1);
93
- }
94
- session = s;
95
- }
96
- }
97
- catch (err) {
98
- spinner.fail(`Falha ao autenticar: ${err.message}`);
99
- process.exit(1);
100
- }
101
- await saveSession({
102
- userId: session.userId,
103
- name: session.name,
104
- token: session.token,
105
- sessionId: session.sessionId,
106
- loggedInAt: new Date().toISOString(),
107
- expiresAt: session.expiresAt,
108
- });
109
- console.log(renderMatrixLogo());
110
- console.log("[ok] Autenticado!");
111
- console.log(`Usuário: ${session.name}`);
112
- console.log(`ID: ${session.userId}`);
132
+ await runLogin();
133
+ await continueChain({ from: "command" });
113
134
  });
114
135
  }
115
136
  function registerLogoutCommand(program) {
@@ -144,7 +165,7 @@ function registerWhoamiCommand(program) {
144
165
  console.log(JSON.stringify(session, null, 2));
145
166
  return;
146
167
  }
147
- console.log(renderMatrixLogo());
168
+ await animateMatrixLogo();
148
169
  console.log(`Usuário: ${session.name}`);
149
170
  console.log(`ID: ${session.userId}`);
150
171
  console.log(`Login em: ${session.loggedInAt}`);
@@ -1 +1 @@
1
- {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/cli/commands/auth.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/cli/commands/auth.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import { c, sym } from "../../lib/colors.js";
2
2
  import { CONFIG_FILE, checkConfig, runConfigWizard } from "../../lib/auth/nio-config.js";
3
+ import { continueChain } from "../flows/onboarding.js";
3
4
  const LABEL = { missing: "faltando", invalid: "inválido", unreachable: "sem conexão" };
4
5
  async function runCheck(opts) {
5
6
  const problems = await checkConfig();
@@ -30,8 +31,9 @@ export function registerConfigCommand(program) {
30
31
  .command("setup")
31
32
  .description("Wizard: cola os valores do time, testa a conexão e salva")
32
33
  .action(async () => {
33
- const ok = await runConfigWizard();
34
- process.exit(ok ? 0 : 1);
34
+ if (!(await runConfigWizard()))
35
+ process.exit(1);
36
+ await continueChain({ from: "command" });
35
37
  });
36
38
  config
37
39
  .command("path")