@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.
- package/dist/commands/ai.js +82 -10
- package/dist/commands/ai.js.map +1 -1
- package/dist/commands/auth.d.ts +19 -0
- package/dist/commands/auth.js +203 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/deploy.js +8 -8
- package/dist/commands/deployments.d.ts +5 -5
- package/dist/commands/deployments.js +32 -6
- package/dist/commands/deployments.js.map +1 -1
- package/dist/commands/products-db.d.ts +9 -9
- package/dist/commands/products-db.js +84 -19
- package/dist/commands/products-db.js.map +1 -1
- package/dist/commands/products.d.ts +2 -2
- package/dist/commands/products.js +8 -6
- package/dist/commands/products.js.map +1 -1
- package/dist/commands/schema.d.ts +25 -0
- package/dist/commands/schema.js +321 -0
- package/dist/commands/schema.js.map +1 -0
- package/dist/commands/servers.d.ts +5 -5
- package/dist/commands/servers.js +25 -17
- package/dist/commands/servers.js.map +1 -1
- package/dist/commands/status.js +3 -2
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/tenants.d.ts +14 -14
- package/dist/commands/tenants.js +62 -30
- package/dist/commands/tenants.js.map +1 -1
- package/dist/commands/ui.d.ts +1 -0
- package/dist/commands/ui.js +454 -0
- package/dist/commands/ui.js.map +1 -0
- package/dist/commands/workspaces.d.ts +9 -9
- package/dist/commands/workspaces.js +66 -31
- package/dist/commands/workspaces.js.map +1 -1
- package/dist/index.js +226 -165
- package/dist/index.js.map +1 -1
- package/dist/lib/ai/auth-discovery.d.ts +26 -0
- package/dist/lib/ai/auth-discovery.js +256 -0
- package/dist/lib/ai/auth-discovery.js.map +1 -0
- package/dist/lib/ai/orchestrator.d.ts +25 -0
- package/dist/lib/ai/orchestrator.js +190 -28
- package/dist/lib/ai/orchestrator.js.map +1 -1
- package/dist/lib/config-schema.d.ts +18 -18
- package/dist/lib/pickers.d.ts +123 -0
- package/dist/lib/pickers.js +336 -0
- package/dist/lib/pickers.js.map +1 -0
- package/dist/lib/schema-cache.d.ts +87 -0
- package/dist/lib/schema-cache.js +134 -0
- package/dist/lib/schema-cache.js.map +1 -0
- package/package.json +1 -1
package/dist/commands/ai.js
CHANGED
|
@@ -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
|
|
9
|
-
/sair /exit
|
|
10
|
-
/limpar /clear
|
|
11
|
-
/
|
|
12
|
-
/
|
|
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
|
|
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
|
|
104
|
+
log.success(`Modelo forçado: ${m}`);
|
|
60
105
|
}
|
|
61
106
|
else {
|
|
62
|
-
log.warn('
|
|
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);
|
package/dist/commands/ai.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai.js","sourceRoot":"","sources":["../../src/commands/ai.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,mBAAmB,CAAC;AAC9C,OAAO,KAAK,MAAM,OAAO,CAAC;
|
|
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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"}
|
package/dist/commands/deploy.js
CHANGED
|
@@ -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/
|
|
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/
|
|
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/
|
|
16
|
-
* 9. Polling /api/v1/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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
|
|
4
|
-
tenant
|
|
5
|
-
version
|
|
6
|
-
env
|
|
7
|
-
server
|
|
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 ${
|
|
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:
|
|
27
|
-
tenantId:
|
|
28
|
-
version
|
|
29
|
-
environmentId:
|
|
30
|
-
serverId:
|
|
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":"AAAA;;;;;;;;;GASG;AACH,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EACL,YAAY,EACZ,cAAc,EACd,kBAAkB,EAClB,gBAAgB,EAChB,aAAa,GAEd,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAWzC,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,IAA8B;IAE9B,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI;
|
|
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
|
|
10
|
-
label
|
|
11
|
-
engine
|
|
12
|
-
|
|
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: {
|