@neetru/cli 2.2.0 → 2.4.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 (48) hide show
  1. package/dist/commands/ai.js +82 -10
  2. package/dist/commands/ai.js.map +1 -1
  3. package/dist/commands/auth.d.ts +19 -0
  4. package/dist/commands/auth.js +203 -0
  5. package/dist/commands/auth.js.map +1 -0
  6. package/dist/commands/deploy.js +8 -8
  7. package/dist/commands/deployments.d.ts +5 -5
  8. package/dist/commands/deployments.js +32 -6
  9. package/dist/commands/deployments.js.map +1 -1
  10. package/dist/commands/products-db.d.ts +9 -9
  11. package/dist/commands/products-db.js +84 -19
  12. package/dist/commands/products-db.js.map +1 -1
  13. package/dist/commands/products.d.ts +2 -2
  14. package/dist/commands/products.js +8 -6
  15. package/dist/commands/products.js.map +1 -1
  16. package/dist/commands/schema.d.ts +25 -0
  17. package/dist/commands/schema.js +321 -0
  18. package/dist/commands/schema.js.map +1 -0
  19. package/dist/commands/servers.d.ts +5 -5
  20. package/dist/commands/servers.js +25 -17
  21. package/dist/commands/servers.js.map +1 -1
  22. package/dist/commands/status.js +3 -2
  23. package/dist/commands/status.js.map +1 -1
  24. package/dist/commands/tenants.d.ts +14 -14
  25. package/dist/commands/tenants.js +62 -30
  26. package/dist/commands/tenants.js.map +1 -1
  27. package/dist/commands/ui.d.ts +1 -0
  28. package/dist/commands/ui.js +454 -0
  29. package/dist/commands/ui.js.map +1 -0
  30. package/dist/commands/workspaces.d.ts +9 -9
  31. package/dist/commands/workspaces.js +66 -31
  32. package/dist/commands/workspaces.js.map +1 -1
  33. package/dist/index.js +226 -165
  34. package/dist/index.js.map +1 -1
  35. package/dist/lib/ai/auth-discovery.d.ts +26 -0
  36. package/dist/lib/ai/auth-discovery.js +256 -0
  37. package/dist/lib/ai/auth-discovery.js.map +1 -0
  38. package/dist/lib/ai/orchestrator.d.ts +25 -0
  39. package/dist/lib/ai/orchestrator.js +190 -28
  40. package/dist/lib/ai/orchestrator.js.map +1 -1
  41. package/dist/lib/config-schema.d.ts +18 -18
  42. package/dist/lib/pickers.d.ts +123 -0
  43. package/dist/lib/pickers.js +336 -0
  44. package/dist/lib/pickers.js.map +1 -0
  45. package/dist/lib/schema-cache.d.ts +87 -0
  46. package/dist/lib/schema-cache.js +134 -0
  47. package/dist/lib/schema-cache.js.map +1 -0
  48. package/package.json +1 -1
@@ -1,19 +1,60 @@
1
1
  import * as readline from 'readline/promises';
2
2
  import chalk from 'chalk';
3
- import { chat } from '../lib/ai/orchestrator.js';
3
+ import { chat, chatParallel } from '../lib/ai/orchestrator.js';
4
+ import { discoveredKeys } from '../lib/ai/auth-discovery.js';
5
+ import { config } from '../lib/config.js';
4
6
  import { log } from '../utils/logger.js';
7
+ import { runAuthSetup } from './auth.js';
5
8
  const PROMPT_PREFIX = chalk.hex('#1E90FF').bold(' › ');
6
9
  const ASSISTANT_PREFIX = chalk.dim(' ◆ ');
10
+ // Help público — sem /modelo (orchestrator escolhe). /debug:model é o
11
+ // override avançado pra quem quer forçar.
7
12
  const HELP_TEXT = `
8
- Comandos especiais:
9
- /sair /exit encerrar sessão
10
- /limpar /clear limpar histórico de contexto
11
- /modelo <nome> trocar modelo (claude | openai | gemini | auto)
12
- /help mostrar este texto
13
+ Comandos:
14
+ /sair /exit encerrar sessão
15
+ /limpar /clear limpar histórico de contexto
16
+ /agentes <pergunta> consultar 2+ modelos em paralelo e comparar
17
+ /auth rodar wizard de configuração (claude/codex/gemini)
18
+ /help mostrar este texto
19
+ /debug:model <nome> forçar modelo (claude|openai|gemini|auto)
13
20
  `.trim();
21
+ /**
22
+ * Checa se o usuário tem pelo menos uma cred (local OU descoberta). Se zero,
23
+ * roda o setup wizard inline antes de abrir o REPL.
24
+ */
25
+ async function ensureAtLeastOneProvider() {
26
+ const local = {
27
+ anthropic: !!config.get('anthropicApiKey'),
28
+ openai: !!config.get('openaiApiKey'),
29
+ gemini: !!config.get('geminiApiKey'),
30
+ };
31
+ if (local.anthropic || local.openai || local.gemini)
32
+ return true;
33
+ const discovered = discoveredKeys();
34
+ if (discovered.anthropic || discovered.openai || discovered.gemini)
35
+ return true;
36
+ // Zero — força setup interativo.
37
+ log.warn('Nenhum provedor de IA configurado.');
38
+ log.info('Abrindo wizard de configuração...');
39
+ await runAuthSetup();
40
+ // Re-checa.
41
+ const after = !!config.get('anthropicApiKey') ||
42
+ !!config.get('openaiApiKey') ||
43
+ !!config.get('geminiApiKey') ||
44
+ !!discoveredKeys().anthropic ||
45
+ !!discoveredKeys().openai ||
46
+ !!discoveredKeys().gemini;
47
+ return after;
48
+ }
14
49
  export async function runAiRepl(opts = {}) {
15
50
  log.banner();
16
51
  log.info('Assistente Neetru — contexto da plataforma carregado.');
52
+ // Bloqueia antes do REPL se não tem cred nenhuma.
53
+ const ready = await ensureAtLeastOneProvider();
54
+ if (!ready) {
55
+ log.error('Sem credenciais configuradas. Saindo.');
56
+ process.exit(1);
57
+ }
17
58
  log.info('Digite /help para ver comandos. /sair para encerrar.');
18
59
  log.separator();
19
60
  console.log();
@@ -38,7 +79,7 @@ export async function runAiRepl(opts = {}) {
38
79
  }
39
80
  if (!input)
40
81
  continue;
41
- // Comandos internos
82
+ // ── Comandos internos ──────────────────────────────────────────
42
83
  if (input === '/sair' || input === '/exit') {
43
84
  log.dim('Encerrando sessão.');
44
85
  break;
@@ -52,17 +93,48 @@ export async function runAiRepl(opts = {}) {
52
93
  console.log(HELP_TEXT);
53
94
  continue;
54
95
  }
55
- if (input.startsWith('/modelo ') || input.startsWith('/model ')) {
96
+ if (input === '/auth') {
97
+ await runAuthSetup();
98
+ continue;
99
+ }
100
+ if (input.startsWith('/debug:model ')) {
56
101
  const m = input.split(' ')[1];
57
102
  if (['claude', 'openai', 'gemini', 'auto'].includes(m)) {
58
103
  currentModel = m;
59
- log.success(`Modelo alterado para: ${m}`);
104
+ log.success(`Modelo forçado: ${m}`);
60
105
  }
61
106
  else {
62
- log.warn('Modelos disponíveis: claude | openai | gemini | auto');
107
+ log.warn('Use: claude | openai | gemini | auto');
108
+ }
109
+ continue;
110
+ }
111
+ if (input.startsWith('/agentes ')) {
112
+ const question = input.slice('/agentes '.length).trim();
113
+ if (!question) {
114
+ log.warn('Use: /agentes <pergunta>');
115
+ continue;
116
+ }
117
+ console.log();
118
+ log.info('Consultando todos os provedores configurados em paralelo...');
119
+ try {
120
+ const results = await chatParallel(question, '');
121
+ for (const r of results) {
122
+ console.log(chalk.bold(`\n── ${r.model.toUpperCase()} ──`));
123
+ if (r.ok) {
124
+ console.log(r.response);
125
+ }
126
+ else {
127
+ console.log(chalk.red(`(erro) ${r.error}`));
128
+ }
129
+ }
130
+ console.log();
131
+ }
132
+ catch (err) {
133
+ log.error(err?.message ?? 'Erro ao executar chatParallel.');
63
134
  }
64
135
  continue;
65
136
  }
137
+ // ── Chat normal ────────────────────────────────────────────────
66
138
  history.push({ role: 'user', content: input });
67
139
  console.log();
68
140
  process.stdout.write(ASSISTANT_PREFIX);
@@ -1 +1 @@
1
- {"version":3,"file":"ai.js","sourceRoot":"","sources":["../../src/commands/ai.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ai.js","sourceRoot":"","sources":["../../src/commands/ai.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ interface CommonOpts {
2
+ json?: boolean;
3
+ }
4
+ /**
5
+ * `neetru auth status` — pura leitura, mostra tabela.
6
+ */
7
+ export declare function runAuthStatus(opts?: CommonOpts): Promise<void>;
8
+ /**
9
+ * `neetru auth pull` — sem perguntar, copia toda apiKey extraída dos CLIs
10
+ * concorrentes pra config do Neetru. Útil pra CI/script.
11
+ */
12
+ export declare function runAuthPull(opts?: CommonOpts): Promise<void>;
13
+ /**
14
+ * Wizard interativo: detecta → pergunta quais quer ativar → instala faltantes
15
+ * → guia login. Idempotente. Pode ser chamado direto pelo `neetru ai` quando
16
+ * detecta zero credenciais.
17
+ */
18
+ export declare function runAuthSetup(opts?: CommonOpts): Promise<void>;
19
+ export {};
@@ -0,0 +1,203 @@
1
+ /**
2
+ * `neetru auth` — gerencia credenciais dos provedores de IA usados pelo
3
+ * `neetru ai` (Anthropic, OpenAI, Gemini).
4
+ *
5
+ * Sub-comandos:
6
+ * neetru auth status → lista provedores detectados (binário + creds)
7
+ * neetru auth setup → wizard interativo: detecta, instala faltantes,
8
+ * guia login
9
+ * neetru auth pull → puxa creds dos CLIs concorrentes pra config do Neetru
10
+ *
11
+ * Objetivo: zerar fricção do "anthropicApiKey não configurada". Se user
12
+ * já tem Claude Code/Codex/Gemini, reaproveita.
13
+ */
14
+ import chalk from 'chalk';
15
+ import * as readline from 'readline/promises';
16
+ import { detectAllProviders, installGlobal, } from '../lib/ai/auth-discovery.js';
17
+ import { config } from '../lib/config.js';
18
+ import { log } from '../utils/logger.js';
19
+ const PROVIDER_TO_CONFIG = {
20
+ anthropic: 'anthropicApiKey',
21
+ openai: 'openaiApiKey',
22
+ gemini: 'geminiApiKey',
23
+ };
24
+ function badge(s) {
25
+ if (s.apiKey)
26
+ return chalk.green('✓ pronto');
27
+ if (s.installed && s.credentialSource)
28
+ return chalk.yellow('! login parcial');
29
+ if (s.installed)
30
+ return chalk.yellow('! sem creds');
31
+ return chalk.dim('- não instalado');
32
+ }
33
+ function rowName(p) {
34
+ switch (p) {
35
+ case 'anthropic':
36
+ return 'Claude (Anthropic)';
37
+ case 'openai':
38
+ return 'Codex (OpenAI)';
39
+ case 'gemini':
40
+ return 'Gemini (Google)';
41
+ }
42
+ }
43
+ /**
44
+ * `neetru auth status` — pura leitura, mostra tabela.
45
+ */
46
+ export async function runAuthStatus(opts = {}) {
47
+ const providers = detectAllProviders();
48
+ const configured = {
49
+ anthropic: !!config.get('anthropicApiKey'),
50
+ openai: !!config.get('openaiApiKey'),
51
+ gemini: !!config.get('geminiApiKey'),
52
+ };
53
+ if (opts.json) {
54
+ console.log(JSON.stringify({
55
+ providers: providers.map((p) => ({
56
+ ...p,
57
+ apiKey: p.apiKey ? '<redacted>' : undefined,
58
+ })),
59
+ configured,
60
+ }, null, 2));
61
+ return;
62
+ }
63
+ console.log(chalk.bold('\nNeetru Auth — status dos provedores de IA\n'));
64
+ for (const p of providers) {
65
+ const configuredHere = configured[p.provider] ? chalk.green('(neetru config OK)') : '';
66
+ console.log(` ${badge(p)} ${chalk.bold(rowName(p.provider))} ${configuredHere}`);
67
+ console.log(` ${chalk.dim(p.hint)}`);
68
+ }
69
+ console.log();
70
+ console.log(chalk.dim('Para configurar tudo de uma vez: neetru auth setup'));
71
+ }
72
+ /**
73
+ * `neetru auth pull` — sem perguntar, copia toda apiKey extraída dos CLIs
74
+ * concorrentes pra config do Neetru. Útil pra CI/script.
75
+ */
76
+ export async function runAuthPull(opts = {}) {
77
+ const providers = detectAllProviders();
78
+ const copied = [];
79
+ for (const p of providers) {
80
+ if (!p.apiKey)
81
+ continue;
82
+ const cfgKey = PROVIDER_TO_CONFIG[p.provider];
83
+ if (config.get(cfgKey))
84
+ continue; // não sobrescreve
85
+ config.set(cfgKey, p.apiKey);
86
+ copied.push(p.provider);
87
+ }
88
+ if (opts.json) {
89
+ console.log(JSON.stringify({ copied }, null, 2));
90
+ return;
91
+ }
92
+ if (copied.length === 0) {
93
+ log.info('Nenhuma cred nova para copiar (ou já estão configuradas).');
94
+ return;
95
+ }
96
+ log.success(`Copiadas ${copied.length} credenciais: ${copied.join(', ')}`);
97
+ }
98
+ /**
99
+ * Pergunta sim/não pro usuário via readline. Default = no.
100
+ */
101
+ async function confirm(rl, question, def = false) {
102
+ const hint = def ? '[S/n]' : '[s/N]';
103
+ const ans = (await rl.question(`${question} ${chalk.dim(hint)} `)).trim().toLowerCase();
104
+ if (!ans)
105
+ return def;
106
+ return ans === 's' || ans === 'sim' || ans === 'y' || ans === 'yes';
107
+ }
108
+ /**
109
+ * Wizard interativo: detecta → pergunta quais quer ativar → instala faltantes
110
+ * → guia login. Idempotente. Pode ser chamado direto pelo `neetru ai` quando
111
+ * detecta zero credenciais.
112
+ */
113
+ export async function runAuthSetup(opts = {}) {
114
+ const providers = detectAllProviders();
115
+ if (opts.json) {
116
+ // Modo não-interativo: só roda pull silencioso.
117
+ return runAuthPull(opts);
118
+ }
119
+ console.log(chalk.bold('\nNeetru Auth — wizard de configuração\n'));
120
+ console.log(chalk.dim('Detectado:\n'));
121
+ for (const p of providers) {
122
+ console.log(` ${badge(p)} ${rowName(p.provider)}`);
123
+ }
124
+ console.log();
125
+ // Pull silencioso de tudo que já tá pronto.
126
+ const autoConfigured = [];
127
+ for (const p of providers) {
128
+ if (!p.apiKey)
129
+ continue;
130
+ const cfgKey = PROVIDER_TO_CONFIG[p.provider];
131
+ if (!config.get(cfgKey)) {
132
+ config.set(cfgKey, p.apiKey);
133
+ autoConfigured.push(p.provider);
134
+ }
135
+ }
136
+ if (autoConfigured.length) {
137
+ log.success(`Reaproveitadas creds de: ${autoConfigured.join(', ')}`);
138
+ }
139
+ // Identifica provedores que precisam de ação (sem cred ou sem binário).
140
+ const needsAction = providers.filter((p) => !p.apiKey);
141
+ if (needsAction.length === 0) {
142
+ log.success('Todos os provedores prontos. Você pode rodar `neetru ai`.');
143
+ return;
144
+ }
145
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
146
+ try {
147
+ console.log(chalk.bold('\nProvedores que precisam de configuração:'));
148
+ const wanted = [];
149
+ for (const p of needsAction) {
150
+ const want = await confirm(rl, ` Configurar ${rowName(p.provider)}?`, false);
151
+ if (want)
152
+ wanted.push(p);
153
+ }
154
+ if (wanted.length === 0) {
155
+ log.dim('Nada para configurar. OK.');
156
+ return;
157
+ }
158
+ for (const p of wanted) {
159
+ console.log(chalk.bold(`\n→ ${rowName(p.provider)}`));
160
+ // Instalar binário se ausente.
161
+ if (!p.installed) {
162
+ const install = await confirm(rl, ` Instalar ${p.npmPackage} globalmente?`, true);
163
+ if (install) {
164
+ log.info(`Rodando: npm install -g ${p.npmPackage}`);
165
+ const ok = installGlobal(p.npmPackage);
166
+ if (!ok) {
167
+ log.error(`Falha ao instalar ${p.npmPackage}. Instale manualmente.`);
168
+ continue;
169
+ }
170
+ log.success(`${p.binary} instalado.`);
171
+ }
172
+ else {
173
+ log.dim('Pulado.');
174
+ continue;
175
+ }
176
+ }
177
+ else {
178
+ log.dim(` ${p.binary} já instalado.`);
179
+ }
180
+ // Pedir api key direto (mais simples que mandar usuário pro `claude /login`).
181
+ const provideKey = await confirm(rl, ` Colar API key agora? (alternativa: ${p.hint.replace(/^.*— /, '')})`, true);
182
+ if (provideKey) {
183
+ const key = (await rl.question(` Cole a API key: `)).trim();
184
+ if (key) {
185
+ config.set(PROVIDER_TO_CONFIG[p.provider], key);
186
+ log.success(`${rowName(p.provider)} configurado.`);
187
+ }
188
+ else {
189
+ log.warn('Vazio — não configurado.');
190
+ }
191
+ }
192
+ else {
193
+ log.dim(`Use o login do ${p.binary} ou rode "neetru auth pull" depois pra puxar.`);
194
+ }
195
+ }
196
+ console.log();
197
+ log.success('Wizard finalizado. Rode `neetru ai` pra testar.');
198
+ }
199
+ finally {
200
+ rl.close();
201
+ }
202
+ }
203
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"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"}
@@ -2,18 +2,18 @@
2
2
  * `neetru deploy` — pipeline interativo de deploy do produto.
3
3
  *
4
4
  * Sprint 3 (P1-1): substitui o stub vazio. Fluxo:
5
- * 1. Resolve produto (lista via /api/v1/cli/catalog).
5
+ * 1. Resolve produto (lista via /api/cli/v1/catalog).
6
6
  * 2. Detecta stack (product_config + fallback local).
7
7
  * 3. Escolhe target (cloud-run | vm-existente | provisionar-nova).
8
- * 4. Para target=vm: lista servers online (/api/v1/cli/servers) +
8
+ * 4. Para target=vm: lista servers online (/api/cli/v1/servers) +
9
9
  * escolha capacity-aware.
10
10
  * 5. Domínio + porta (auto-detect ou input).
11
11
  * 6. Build (chama runBuild se artifact ausente).
12
12
  * 7. Upload artifact (Sprint 1: usa file:// local — owner roda em VM com
13
13
  * acesso ao mesmo FS, OU define `NEETRU_ARTIFACT_BUCKET` e o CLI faz
14
14
  * upload via signed URL — Sprint 2.5).
15
- * 8. POST /api/v1/cli/deploy → recebe deploymentId + statusUrl.
16
- * 9. Polling /api/v1/cli/deploy/status até estado terminal.
15
+ * 8. POST /api/cli/v1/deploy → recebe deploymentId + statusUrl.
16
+ * 9. Polling /api/cli/v1/deploy/status até estado terminal.
17
17
  *
18
18
  * NÃO bloqueia em modo `--non-interactive` quando flags suficientes vieram.
19
19
  */
@@ -113,7 +113,7 @@ async function pickProduct(opts, nonInteractive, cwd) {
113
113
  const spinner = ora({ text: 'Buscando catálogo…', color: 'blue' }).start();
114
114
  let catalog;
115
115
  try {
116
- catalog = await apiRequest('/api/v1/cli/catalog');
116
+ catalog = await apiRequest('/api/cli/v1/catalog');
117
117
  spinner.stop();
118
118
  }
119
119
  catch (err) {
@@ -172,7 +172,7 @@ async function pickServer(opts, nonInteractive) {
172
172
  }
173
173
  if (resp.servers.length === 0) {
174
174
  log.error('Nenhum servidor online encontrado.');
175
- log.dim(' Provisione um com: POST /api/v1/cli/servers/provision');
175
+ log.dim(' Provisione um com: POST /api/cli/v1/servers/provision');
176
176
  process.exit(1);
177
177
  }
178
178
  if (opts.server) {
@@ -433,7 +433,7 @@ async function pollDeploymentStatus(deploymentId) {
433
433
  while (Date.now() - start < timeoutMs) {
434
434
  let resp;
435
435
  try {
436
- resp = await apiRequest(`/api/v1/cli/deploy/status?id=${encodeURIComponent(deploymentId)}`);
436
+ resp = await apiRequest(`/api/cli/v1/deploy/status?id=${encodeURIComponent(deploymentId)}`);
437
437
  }
438
438
  catch (err) {
439
439
  // transient — segue tentando.
@@ -527,7 +527,7 @@ export async function runDeploy(opts) {
527
527
  let deploy;
528
528
  const dispatchSpinner = ora({ text: 'Enviando comando ao Core…', color: 'blue' }).start();
529
529
  try {
530
- deploy = await apiRequest('/api/v1/cli/deploy', {
530
+ deploy = await apiRequest('/api/cli/v1/deploy', {
531
531
  method: 'POST',
532
532
  body,
533
533
  });
@@ -1,10 +1,10 @@
1
1
  import { type StepUpOptions } from '../lib/cli-write.js';
2
2
  export interface DeploymentsCreateOptions {
3
- product: string;
4
- tenant: string;
5
- version: string;
6
- env: string;
7
- server: string;
3
+ product?: string;
4
+ tenant?: string;
5
+ version?: string;
6
+ env?: string;
7
+ server?: string;
8
8
  json?: boolean;
9
9
  }
10
10
  export declare function runDeploymentsCreate(opts: DeploymentsCreateOptions): Promise<void>;
@@ -11,23 +11,49 @@
11
11
  import ora from 'ora';
12
12
  import { apiRequest } from '../lib/api-client.js';
13
13
  import { requireToken, handleApiError, confirmDestructive, printWriteResult, resolveStepUp, } from '../lib/cli-write.js';
14
+ import { pickProductId, pickServer, pickTenant, promptChoice, promptText } from '../lib/pickers.js';
14
15
  import { log } from '../utils/logger.js';
15
16
  export async function runDeploymentsCreate(opts) {
16
17
  const token = await requireToken(opts.json);
18
+ const product = await pickProductId(token, {
19
+ fromFlag: opts.product,
20
+ json: opts.json,
21
+ message: 'Produto do deployment:',
22
+ });
23
+ const tenant = await pickTenant(token, {
24
+ fromFlag: opts.tenant,
25
+ product,
26
+ json: opts.json,
27
+ message: 'Tenant alvo:',
28
+ });
29
+ const version = opts.version ?? (await promptText('Versao:', { json: opts.json }));
30
+ const env = opts.env ??
31
+ (await promptChoice('Ambiente:', [
32
+ { name: 'dev', value: 'dev' },
33
+ { name: 'staging', value: 'staging' },
34
+ { name: 'prod', value: 'prod' },
35
+ ], { default: 'dev', json: opts.json }));
36
+ const server = await pickServer(token, {
37
+ fromFlag: opts.server,
38
+ status: 'online',
39
+ capacity: true,
40
+ json: opts.json,
41
+ message: 'Server alvo:',
42
+ });
17
43
  const spinner = opts.json
18
44
  ? null
19
- : ora({ text: `Criando deployment ${opts.product}@${opts.version}…`, color: 'blue' }).start();
45
+ : ora({ text: `Criando deployment ${product}@${version}...`, color: 'blue' }).start();
20
46
  let res;
21
47
  try {
22
48
  res = await apiRequest('/api/cli/v1/deployments', {
23
49
  method: 'POST',
24
50
  token,
25
51
  body: {
26
- productId: opts.product,
27
- tenantId: opts.tenant,
28
- version: opts.version,
29
- environmentId: opts.env,
30
- serverId: opts.server,
52
+ productId: product,
53
+ tenantId: tenant,
54
+ version,
55
+ environmentId: env,
56
+ serverId: server,
31
57
  },
32
58
  });
33
59
  spinner?.stop();
@@ -1 +1 @@
1
- {"version":3,"file":"deployments.js","sourceRoot":"","sources":["../../src/commands/deployments.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"deployments.js","sourceRoot":"","sources":["../../src/commands/deployments.ts"],"names":[],"mappings":"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"}
@@ -6,30 +6,30 @@ export interface DbListOptions {
6
6
  }
7
7
  export declare function runDbList(opts: DbListOptions): Promise<void>;
8
8
  export interface DbCreateOptions {
9
- productId: string;
10
- label: string;
11
- engine: string;
12
- environment: string;
9
+ productId?: string;
10
+ label?: string;
11
+ engine?: string;
12
+ env?: string;
13
13
  region: string;
14
14
  serverId?: string;
15
15
  replicaCount?: string;
16
16
  json?: boolean;
17
17
  }
18
18
  export declare function runDbCreate(opts: DbCreateOptions): Promise<void>;
19
- export declare function runDbGet(id: string, opts: {
19
+ export declare function runDbGet(id: string | undefined, opts: {
20
20
  json?: boolean;
21
21
  }): Promise<void>;
22
- export declare function runDbStatus(id: string, status: string, opts: {
22
+ export declare function runDbStatus(id: string | undefined, status: string | undefined, opts: {
23
23
  reason?: string;
24
24
  json?: boolean;
25
25
  }): Promise<void>;
26
- export declare function runDbRetry(id: string, opts: {
26
+ export declare function runDbRetry(id: string | undefined, opts: {
27
27
  json?: boolean;
28
28
  }): Promise<void>;
29
- export declare function runDbRotate(id: string, opts: {
29
+ export declare function runDbRotate(id: string | undefined, opts: {
30
30
  json?: boolean;
31
31
  }): Promise<void>;
32
- export declare function runDbDelete(id: string, opts: {
32
+ export declare function runDbDelete(id: string | undefined, opts: {
33
33
  json?: boolean;
34
34
  }): Promise<void>;
35
35
  export declare function runDbEngines(opts: {