@neetru/cli 2.5.0 → 2.7.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/CHANGELOG.md +17 -0
- package/README.md +93 -148
- package/dist/commands/bootstrap.d.ts +7 -0
- package/dist/commands/bootstrap.js +328 -0
- package/dist/commands/bootstrap.js.map +1 -0
- package/dist/commands/deploy.d.ts +4 -0
- package/dist/commands/deploy.js +210 -6
- package/dist/commands/deploy.js.map +1 -1
- package/dist/commands/docs.d.ts +26 -0
- package/dist/commands/docs.js +240 -0
- package/dist/commands/docs.js.map +1 -0
- package/dist/commands/logs.d.ts +5 -1
- package/dist/commands/logs.js +215 -31
- package/dist/commands/logs.js.map +1 -1
- package/dist/commands/ops.d.ts +58 -0
- package/dist/commands/ops.js +359 -0
- package/dist/commands/ops.js.map +1 -0
- package/dist/commands/promote.js +3 -3
- package/dist/commands/promote.js.map +1 -1
- package/dist/commands/vm.d.ts +6 -0
- package/dist/commands/vm.js +89 -0
- package/dist/commands/vm.js.map +1 -0
- package/dist/index.js +120 -7
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,359 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `neetru ops` — comandos de operação interna do Neetru Core.
|
|
3
|
+
*
|
|
4
|
+
* Substitui os scripts ad-hoc em scripts/ com interface consistente, autenticação
|
|
5
|
+
* via Bearer token e flags --dry-run onde há mutação.
|
|
6
|
+
*
|
|
7
|
+
* Namespace ops:
|
|
8
|
+
* neetru ops heartbeat — checar heartbeat do agente em um server
|
|
9
|
+
* neetru ops smoke notification — dispara notification de smoke end-to-end
|
|
10
|
+
* neetru ops smoke observability — smoke test do pipeline de observability
|
|
11
|
+
* neetru ops reg-token <serverId> — gerar registration token para um server
|
|
12
|
+
* neetru ops resolve-errors — resolver erros abertos em lote
|
|
13
|
+
* neetru ops openapi-diff — detectar breaking changes na spec OpenAPI
|
|
14
|
+
*
|
|
15
|
+
* TODO (próximo sprint): bootstrap-admin, backfill incidents-source, backfill workspaces,
|
|
16
|
+
* seed api-catalog, rehash-sdk-secrets, migrate cli-keys.
|
|
17
|
+
*/
|
|
18
|
+
import chalk from 'chalk';
|
|
19
|
+
import ora from 'ora';
|
|
20
|
+
import { apiRequest } from '../lib/api-client.js';
|
|
21
|
+
import { requireToken, handleApiError } from '../lib/cli-read.js';
|
|
22
|
+
import { log } from '../utils/logger.js';
|
|
23
|
+
// ─── Helpers ──────────────────────────────────────────────────────────────────
|
|
24
|
+
function deprecationBanner(scriptName, command) {
|
|
25
|
+
console.warn(chalk.yellow(`[aviso] scripts/${scriptName} está deprecado. Use: neetru ${command}`));
|
|
26
|
+
}
|
|
27
|
+
export async function runOpsHeartbeat(opts) {
|
|
28
|
+
const token = await requireToken(opts.json);
|
|
29
|
+
const serverId = opts.serverId ?? 'srv-test-01';
|
|
30
|
+
const spinner = opts.json ? null : ora({ text: `Verificando heartbeat de ${serverId}…`, color: 'blue' }).start();
|
|
31
|
+
let res;
|
|
32
|
+
try {
|
|
33
|
+
res = await apiRequest(`/api/cli/v1/ops/heartbeat?serverId=${encodeURIComponent(serverId)}`, { token });
|
|
34
|
+
spinner?.stop();
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
spinner?.fail('Falha ao verificar heartbeat.');
|
|
38
|
+
handleApiError(error, opts.json);
|
|
39
|
+
}
|
|
40
|
+
if (opts.json) {
|
|
41
|
+
console.log(JSON.stringify(res));
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
const data = res;
|
|
45
|
+
const exists = data.exists;
|
|
46
|
+
if (!exists) {
|
|
47
|
+
console.log(chalk.red(` server/${serverId} NÃO ENCONTRADO`));
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
const fields = data.fields;
|
|
51
|
+
console.log(chalk.bold(`=== servers/${serverId} ===`));
|
|
52
|
+
if (fields) {
|
|
53
|
+
for (const [k, v] of Object.entries(fields).sort()) {
|
|
54
|
+
console.log(` ${chalk.cyan(k)}: ${JSON.stringify(v)}`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
export async function runOpsSmokeNotification(opts) {
|
|
59
|
+
const token = await requireToken(opts.json);
|
|
60
|
+
const body = {
|
|
61
|
+
recipientRole: opts.recipientRole ?? 'admin',
|
|
62
|
+
recipientUid: opts.recipientUid,
|
|
63
|
+
kind: opts.kind ?? 'smoke_test',
|
|
64
|
+
title: opts.title,
|
|
65
|
+
link: opts.link ?? '/dashboard',
|
|
66
|
+
};
|
|
67
|
+
const spinner = opts.json ? null : ora({ text: 'Disparando smoke notification…', color: 'blue' }).start();
|
|
68
|
+
let res;
|
|
69
|
+
try {
|
|
70
|
+
res = await apiRequest('/api/cli/v1/ops/smoke/notification', {
|
|
71
|
+
method: 'POST',
|
|
72
|
+
body,
|
|
73
|
+
token,
|
|
74
|
+
});
|
|
75
|
+
spinner?.stop();
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
spinner?.fail('Falha ao disparar smoke notification.');
|
|
79
|
+
handleApiError(error, opts.json);
|
|
80
|
+
}
|
|
81
|
+
if (opts.json) {
|
|
82
|
+
console.log(JSON.stringify(res));
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
const data = res;
|
|
86
|
+
const action = data.action;
|
|
87
|
+
if (action === 'dedup') {
|
|
88
|
+
log.warn(`DEDUP: notification existente ${String(data.docId ?? '')} — occurrences incrementado.`);
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
log.success(`Notification criada: ${String(data.docId ?? '')}`);
|
|
92
|
+
}
|
|
93
|
+
console.log(' Valide em core.neetru.com: sino no header deve mostrar badge unread.');
|
|
94
|
+
}
|
|
95
|
+
export async function runOpsSmokeObservability(opts) {
|
|
96
|
+
const token = await requireToken(opts.json);
|
|
97
|
+
const body = {
|
|
98
|
+
baseUrl: opts.baseUrl ?? 'https://core.neetru.com',
|
|
99
|
+
bearer: opts.bearer,
|
|
100
|
+
waitSec: opts.waitSec ?? 30,
|
|
101
|
+
};
|
|
102
|
+
const spinner = opts.json
|
|
103
|
+
? null
|
|
104
|
+
: ora({ text: 'Executando smoke observability (aguarda settle)…', color: 'blue' }).start();
|
|
105
|
+
let res;
|
|
106
|
+
try {
|
|
107
|
+
// timeout longo pois o endpoint aguarda settle do Firestore
|
|
108
|
+
res = await apiRequest('/api/cli/v1/ops/smoke/observability', {
|
|
109
|
+
method: 'POST',
|
|
110
|
+
body,
|
|
111
|
+
token,
|
|
112
|
+
});
|
|
113
|
+
spinner?.stop();
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
spinner?.fail('Falha ao executar smoke observability.');
|
|
117
|
+
handleApiError(error, opts.json);
|
|
118
|
+
}
|
|
119
|
+
if (opts.json) {
|
|
120
|
+
console.log(JSON.stringify(res));
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
const data = res;
|
|
124
|
+
const probes = data.probes;
|
|
125
|
+
console.log(chalk.bold('\nResultado do smoke observability:'));
|
|
126
|
+
if (probes && probes.length > 0) {
|
|
127
|
+
const header = ` ${'FONTE'.padEnd(22)} ${'STATUS HTTP'.padEnd(12)} ${'ÚLTIMA (s)'.padEnd(12)} MATCH`;
|
|
128
|
+
const sep = ` ${'─'.repeat(22)} ${'─'.repeat(12)} ${'─'.repeat(12)} ─────`;
|
|
129
|
+
console.log(chalk.dim(header));
|
|
130
|
+
console.log(chalk.dim(sep));
|
|
131
|
+
for (const p of probes) {
|
|
132
|
+
const matched = p.matched ? chalk.green('SIM') : chalk.red('NÃO');
|
|
133
|
+
console.log(` ${String(p.source ?? '').padEnd(22)} ${String(p.endpointStatus ?? '—').padEnd(12)} ${String(p.lastAgeSec ?? '—').padEnd(12)} ${matched}`);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
const tag = data.runTag;
|
|
137
|
+
if (tag)
|
|
138
|
+
console.log(chalk.dim(`\n run tag: ${tag}`));
|
|
139
|
+
}
|
|
140
|
+
export async function runOpsRegToken(serverId, opts) {
|
|
141
|
+
const token = await requireToken(opts.json);
|
|
142
|
+
const spinner = opts.json ? null : ora({ text: `Gerando registration token para ${serverId}…`, color: 'blue' }).start();
|
|
143
|
+
let res;
|
|
144
|
+
try {
|
|
145
|
+
res = await apiRequest('/api/cli/v1/ops/reg-token', {
|
|
146
|
+
method: 'POST',
|
|
147
|
+
body: { serverId, expiresMin: opts.expiresMin ?? 30 },
|
|
148
|
+
token,
|
|
149
|
+
});
|
|
150
|
+
spinner?.stop();
|
|
151
|
+
}
|
|
152
|
+
catch (error) {
|
|
153
|
+
spinner?.fail('Falha ao gerar registration token.');
|
|
154
|
+
handleApiError(error, opts.json);
|
|
155
|
+
}
|
|
156
|
+
if (opts.json) {
|
|
157
|
+
console.log(JSON.stringify(res));
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
const data = res;
|
|
161
|
+
console.log(chalk.bold('Registration token gerado:'));
|
|
162
|
+
console.log(` ${chalk.green(String(data.token ?? ''))}`);
|
|
163
|
+
console.log(` server: ${String(data.serverId ?? serverId)}`);
|
|
164
|
+
console.log(` expira em: ${String(data.expiresAt ?? '—')}`);
|
|
165
|
+
console.log(chalk.dim(' (use este token no agente durante o registro — uso único)'));
|
|
166
|
+
}
|
|
167
|
+
export async function runOpsResolveErrors(opts) {
|
|
168
|
+
const token = await requireToken(opts.json);
|
|
169
|
+
if (!opts.dryRun && !opts.json) {
|
|
170
|
+
const { default: readline } = await import('node:readline');
|
|
171
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
172
|
+
const answer = await new Promise((resolve) => {
|
|
173
|
+
rl.question(chalk.yellow('Isso irá marcar TODOS os erros abertos como resolvidos. Confirmar? (sim/não): '), (a) => {
|
|
174
|
+
rl.close();
|
|
175
|
+
resolve(a.trim().toLowerCase());
|
|
176
|
+
});
|
|
177
|
+
});
|
|
178
|
+
if (answer !== 'sim' && answer !== 's') {
|
|
179
|
+
log.warn('Operação cancelada.');
|
|
180
|
+
process.exit(0);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
const spinner = opts.json ? null : ora({ text: `Resolvendo erros abertos${opts.dryRun ? ' (dry-run)' : ''}…`, color: 'blue' }).start();
|
|
184
|
+
let res;
|
|
185
|
+
try {
|
|
186
|
+
res = await apiRequest('/api/cli/v1/ops/resolve-errors', {
|
|
187
|
+
method: 'POST',
|
|
188
|
+
body: {
|
|
189
|
+
dryRun: opts.dryRun ?? false,
|
|
190
|
+
resolvedBy: opts.resolvedBy ?? `cli-ops-${new Date().toISOString().slice(0, 10)}`,
|
|
191
|
+
},
|
|
192
|
+
token,
|
|
193
|
+
});
|
|
194
|
+
spinner?.stop();
|
|
195
|
+
}
|
|
196
|
+
catch (error) {
|
|
197
|
+
spinner?.fail('Falha ao resolver erros.');
|
|
198
|
+
handleApiError(error, opts.json);
|
|
199
|
+
}
|
|
200
|
+
if (opts.json) {
|
|
201
|
+
console.log(JSON.stringify(res));
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
const data = res;
|
|
205
|
+
const results = data.results;
|
|
206
|
+
console.log(chalk.bold(`\nResultado (modo: ${opts.dryRun ? 'DRY-RUN' : 'WRITE'}):`));
|
|
207
|
+
if (results) {
|
|
208
|
+
for (const r of results) {
|
|
209
|
+
const skipped = r.skipped ? ` (+${r.skipped} dry-run skipped)` : '';
|
|
210
|
+
console.log(` ${r.collection}: ${chalk.green(String(r.resolved))} resolvidos${skipped}`);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
export async function runOpsOpenapiDiff(opts) {
|
|
215
|
+
const token = await requireToken(opts.json);
|
|
216
|
+
const spinner = opts.json ? null : ora({ text: 'Verificando diff da spec OpenAPI…', color: 'blue' }).start();
|
|
217
|
+
let res;
|
|
218
|
+
try {
|
|
219
|
+
res = await apiRequest('/api/cli/v1/ops/openapi-diff', {
|
|
220
|
+
method: 'POST',
|
|
221
|
+
body: { update: opts.update ?? false },
|
|
222
|
+
token,
|
|
223
|
+
});
|
|
224
|
+
spinner?.stop();
|
|
225
|
+
}
|
|
226
|
+
catch (error) {
|
|
227
|
+
spinner?.fail('Falha ao checar OpenAPI diff.');
|
|
228
|
+
handleApiError(error, opts.json);
|
|
229
|
+
}
|
|
230
|
+
if (opts.json) {
|
|
231
|
+
console.log(JSON.stringify(res));
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
234
|
+
const data = res;
|
|
235
|
+
const breakingChanges = data.breakingChanges;
|
|
236
|
+
const snapshotUpdated = data.snapshotUpdated;
|
|
237
|
+
const status = data.status;
|
|
238
|
+
if (status === 'no_snapshot') {
|
|
239
|
+
log.success('Snapshot inicial criado. Adicione docs/openapi-snapshot.json ao commit.');
|
|
240
|
+
return;
|
|
241
|
+
}
|
|
242
|
+
if (status === 'updated') {
|
|
243
|
+
log.success('Snapshot atualizado com --update.');
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
if (breakingChanges && breakingChanges.length > 0) {
|
|
247
|
+
console.log(chalk.red('\nBREAKING CHANGES DETECTADOS:'));
|
|
248
|
+
for (const b of breakingChanges) {
|
|
249
|
+
console.log(` ${chalk.red('–')} ${b}`);
|
|
250
|
+
}
|
|
251
|
+
console.log(chalk.yellow('\n Recomendação: bump de versão major na spec (info.version).'));
|
|
252
|
+
console.log(chalk.dim(' Para atualizar: neetru ops openapi-diff --update'));
|
|
253
|
+
}
|
|
254
|
+
else if (snapshotUpdated) {
|
|
255
|
+
log.success('Spec mudou sem breaking changes — snapshot atualizado.');
|
|
256
|
+
}
|
|
257
|
+
else {
|
|
258
|
+
log.success('Sem mudanças na spec. Snapshot inalterado.');
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
// ─── Registro do comando `ops` em program ─────────────────────────────────────
|
|
262
|
+
export function registerOpsCommand(program) {
|
|
263
|
+
const opsCmd = program
|
|
264
|
+
.command('ops')
|
|
265
|
+
.description('Operações internas do Core (migrado de scripts/)');
|
|
266
|
+
// ── ops heartbeat ──────────────────────────────────────────────────────────
|
|
267
|
+
opsCmd
|
|
268
|
+
.command('heartbeat')
|
|
269
|
+
.description('Verificar heartbeat e estado de um server')
|
|
270
|
+
.option('--server-id <id>', 'ID do server (default: srv-test-01)', 'srv-test-01')
|
|
271
|
+
.option('--json', 'saída em JSON')
|
|
272
|
+
.action(async (cmdOpts) => {
|
|
273
|
+
await runOpsHeartbeat({ serverId: cmdOpts.serverId, json: !!cmdOpts.json });
|
|
274
|
+
});
|
|
275
|
+
// ── ops smoke ──────────────────────────────────────────────────────────────
|
|
276
|
+
const smokeCmd = opsCmd
|
|
277
|
+
.command('smoke')
|
|
278
|
+
.description('Smoke tests end-to-end do Core');
|
|
279
|
+
smokeCmd
|
|
280
|
+
.command('notification')
|
|
281
|
+
.description('Disparar notification de smoke e validar fluxo de alertas')
|
|
282
|
+
.option('--recipient-role <role>', 'role destinatário (admin|operator|billing|viewer)', 'admin')
|
|
283
|
+
.option('--recipient-uid <uid>', 'uid específico (prevalece sobre --recipient-role)')
|
|
284
|
+
.option('--kind <kind>', 'kind da notification (default: smoke_test)', 'smoke_test')
|
|
285
|
+
.option('--title <title>', 'título da notification')
|
|
286
|
+
.option('--link <link>', 'link de destino (default: /dashboard)', '/dashboard')
|
|
287
|
+
.option('--json', 'saída em JSON')
|
|
288
|
+
.action(async (cmdOpts) => {
|
|
289
|
+
await runOpsSmokeNotification({
|
|
290
|
+
recipientRole: cmdOpts.recipientRole,
|
|
291
|
+
recipientUid: cmdOpts.recipientUid,
|
|
292
|
+
kind: cmdOpts.kind,
|
|
293
|
+
title: cmdOpts.title,
|
|
294
|
+
link: cmdOpts.link,
|
|
295
|
+
json: !!cmdOpts.json,
|
|
296
|
+
});
|
|
297
|
+
});
|
|
298
|
+
smokeCmd
|
|
299
|
+
.command('observability')
|
|
300
|
+
.description('Smoke test fim-a-fim do pipeline de observability')
|
|
301
|
+
.option('--base-url <url>', 'base URL do Core', 'https://core.neetru.com')
|
|
302
|
+
.option('--bearer <token>', 'Bearer token da CLI key (opcional — exercita telemetry log)')
|
|
303
|
+
.option('--wait-sec <n>', 'segundos de espera para Firestore propagar (default: 30)', '30')
|
|
304
|
+
.option('--json', 'saída em JSON')
|
|
305
|
+
.action(async (cmdOpts) => {
|
|
306
|
+
await runOpsSmokeObservability({
|
|
307
|
+
baseUrl: cmdOpts.baseUrl,
|
|
308
|
+
bearer: cmdOpts.bearer,
|
|
309
|
+
waitSec: cmdOpts.waitSec ? Number.parseInt(cmdOpts.waitSec, 10) : 30,
|
|
310
|
+
json: !!cmdOpts.json,
|
|
311
|
+
});
|
|
312
|
+
});
|
|
313
|
+
// ── ops reg-token ──────────────────────────────────────────────────────────
|
|
314
|
+
opsCmd
|
|
315
|
+
.command('reg-token <serverId>')
|
|
316
|
+
.description('Gerar registration token para um server (uso único, expira em 30min)')
|
|
317
|
+
.option('--expires-min <n>', 'minutos até expiração (default: 30)', '30')
|
|
318
|
+
.option('--json', 'saída em JSON')
|
|
319
|
+
.action(async (serverId, cmdOpts) => {
|
|
320
|
+
await runOpsRegToken(serverId, {
|
|
321
|
+
expiresMin: cmdOpts.expiresMin ? Number.parseInt(cmdOpts.expiresMin, 10) : 30,
|
|
322
|
+
json: !!cmdOpts.json,
|
|
323
|
+
});
|
|
324
|
+
});
|
|
325
|
+
// ── ops resolve-errors ─────────────────────────────────────────────────────
|
|
326
|
+
opsCmd
|
|
327
|
+
.command('resolve-errors')
|
|
328
|
+
.description('Marcar todos os erros abertos (client_errors + server_errors) como resolvidos')
|
|
329
|
+
.option('--dry-run', 'lista o que seria resolvido sem aplicar')
|
|
330
|
+
.option('--resolved-by <id>', 'identificador do ator (default: cli-ops-<data>')
|
|
331
|
+
.option('--yes', 'pula confirmação interativa')
|
|
332
|
+
.option('--json', 'saída em JSON')
|
|
333
|
+
.action(async (cmdOpts) => {
|
|
334
|
+
await runOpsResolveErrors({
|
|
335
|
+
dryRun: !!cmdOpts.dryRun,
|
|
336
|
+
resolvedBy: cmdOpts.resolvedBy,
|
|
337
|
+
json: !!cmdOpts.json,
|
|
338
|
+
});
|
|
339
|
+
});
|
|
340
|
+
// ── ops openapi-diff ───────────────────────────────────────────────────────
|
|
341
|
+
opsCmd
|
|
342
|
+
.command('openapi-diff')
|
|
343
|
+
.description('Detectar breaking changes na spec OpenAPI comparando com o snapshot')
|
|
344
|
+
.option('--update', 'atualizar o snapshot sem checar breaking changes')
|
|
345
|
+
.option('--json', 'saída em JSON')
|
|
346
|
+
.action(async (cmdOpts) => {
|
|
347
|
+
await runOpsOpenapiDiff({ update: !!cmdOpts.update, json: !!cmdOpts.json });
|
|
348
|
+
});
|
|
349
|
+
// ── TODO (próximo sprint) ──────────────────────────────────────────────────
|
|
350
|
+
// - neetru ops bootstrap-admin (→ scripts/bootstrap-admin.ts)
|
|
351
|
+
// - neetru ops backfill incidents-source (→ scripts/backfill-incidents-source.ts)
|
|
352
|
+
// - neetru ops backfill workspaces (→ scripts/backfill-workspaces.ts)
|
|
353
|
+
// - neetru ops seed api-catalog (→ scripts/seed-api-catalog.mjs)
|
|
354
|
+
// - neetru ops rehash-sdk-secrets (→ scripts/rehash-sdk-client-secrets.mjs)
|
|
355
|
+
// - neetru ops migrate cli-keys (→ scripts/migrate-cli-api-keys.mjs)
|
|
356
|
+
}
|
|
357
|
+
// ─── Re-export deprecation helper para uso em scripts/ ───────────────────────
|
|
358
|
+
export { deprecationBanner };
|
|
359
|
+
//# sourceMappingURL=ops.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ops.js","sourceRoot":"","sources":["../../src/commands/ops.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/promote.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `neetru promote --from=
|
|
2
|
+
* `neetru promote --from=dev|staging --to=staging|prod` — staff-gated.
|
|
3
3
|
*
|
|
4
4
|
* Sprint 10 (CLI 1.4). Wrapper sobre a server action `requestPromotion`
|
|
5
5
|
* (Core) — chama via API REST `/cli/v1/promotion/request`. Retorna o
|
|
@@ -20,7 +20,7 @@ import chalk from 'chalk';
|
|
|
20
20
|
import { log } from '../utils/logger.js';
|
|
21
21
|
import { apiRequest, CliApiError, CliNetworkError } from '../lib/api-client.js';
|
|
22
22
|
const CONFIG_FILENAMES = ['neetru.config.json', '.neetru.json'];
|
|
23
|
-
const VALID_ENVS = ['dev', '
|
|
23
|
+
const VALID_ENVS = ['dev', 'staging', 'prod'];
|
|
24
24
|
async function loadProductConfig() {
|
|
25
25
|
for (const name of CONFIG_FILENAMES) {
|
|
26
26
|
const filePath = path.resolve(process.cwd(), name);
|
|
@@ -43,7 +43,7 @@ export async function runPromote(opts) {
|
|
|
43
43
|
log.banner();
|
|
44
44
|
log.heading('neetru promote');
|
|
45
45
|
if (!opts.from || !opts.to) {
|
|
46
|
-
log.error('--from e --to são obrigatórios. Ex: neetru promote --from=
|
|
46
|
+
log.error('--from e --to são obrigatórios. Ex: neetru promote --from=dev --to=staging');
|
|
47
47
|
process.exit(1);
|
|
48
48
|
return;
|
|
49
49
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"promote.js","sourceRoot":"","sources":["../../src/commands/promote.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,MAAM,MAAM,SAAS,CAAC;AAClC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEhF,MAAM,gBAAgB,GAAG,CAAC,oBAAoB,EAAE,cAAc,CAAU,CAAC;AACzE,MAAM,UAAU,GAAG,CAAC,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"promote.js","sourceRoot":"","sources":["../../src/commands/promote.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `neetru vm provision` — provisiona a VM compartilhada da infra Neetru.
|
|
3
|
+
*
|
|
4
|
+
* Fluxo de Ambientes Fase 2. Mostra a spec + custo estimado, pede confirmação
|
|
5
|
+
* (regra: nunca cria infra silenciosamente) e dispara o provisionamento.
|
|
6
|
+
* A regra "1 VM única" é imposta no servidor.
|
|
7
|
+
*/
|
|
8
|
+
import inquirer from 'inquirer';
|
|
9
|
+
import { apiRequest, CliApiError, CliNetworkError } from '../lib/api-client.js';
|
|
10
|
+
import { log } from '../utils/logger.js';
|
|
11
|
+
function handleApiError(error) {
|
|
12
|
+
if (error instanceof CliApiError) {
|
|
13
|
+
if (error.status === 401) {
|
|
14
|
+
log.error('Token inválido ou expirado. Execute: neetru login');
|
|
15
|
+
process.exit(2);
|
|
16
|
+
}
|
|
17
|
+
if (error.status === 403) {
|
|
18
|
+
log.error(`Permissão negada: ${error.message}`);
|
|
19
|
+
process.exit(3);
|
|
20
|
+
}
|
|
21
|
+
log.error(`Erro do servidor (${error.status}): ${error.message}`);
|
|
22
|
+
process.exit(4);
|
|
23
|
+
}
|
|
24
|
+
if (error instanceof CliNetworkError) {
|
|
25
|
+
log.error(error.message);
|
|
26
|
+
process.exit(4);
|
|
27
|
+
}
|
|
28
|
+
log.error(error.message);
|
|
29
|
+
process.exit(4);
|
|
30
|
+
}
|
|
31
|
+
export async function runVmProvision(opts) {
|
|
32
|
+
log.banner();
|
|
33
|
+
const qs = new URLSearchParams();
|
|
34
|
+
if (opts.machineType)
|
|
35
|
+
qs.set('machineType', opts.machineType);
|
|
36
|
+
if (opts.zone)
|
|
37
|
+
qs.set('zone', opts.zone);
|
|
38
|
+
const query = qs.toString();
|
|
39
|
+
let plan;
|
|
40
|
+
try {
|
|
41
|
+
plan = await apiRequest(`/api/cli/v1/vm/plan${query ? `?${query}` : ''}`);
|
|
42
|
+
}
|
|
43
|
+
catch (err) {
|
|
44
|
+
handleApiError(err);
|
|
45
|
+
}
|
|
46
|
+
if (plan.alreadyProvisioned) {
|
|
47
|
+
log.success(`A VM compartilhada já existe (${plan.existingVmId}). Nada a fazer.`);
|
|
48
|
+
process.exit(0);
|
|
49
|
+
}
|
|
50
|
+
log.heading('Provisionar a VM compartilhada da Neetru');
|
|
51
|
+
log.dim(` nome: ${plan.spec.name}`);
|
|
52
|
+
log.dim(` máquina: ${plan.spec.machineType}`);
|
|
53
|
+
log.dim(` zona: ${plan.spec.zone}`);
|
|
54
|
+
log.dim(` disco: ${plan.spec.diskGb} GB`);
|
|
55
|
+
log.dim(` custo: ~R$ ${plan.estimatedMonthlyCostBRL}/mês (estimado)`);
|
|
56
|
+
const nonInteractive = !process.stdout.isTTY;
|
|
57
|
+
if (!opts.yes && nonInteractive) {
|
|
58
|
+
log.error('Modo não interativo exige --yes para confirmar o custo recorrente.');
|
|
59
|
+
process.exit(1);
|
|
60
|
+
}
|
|
61
|
+
if (!opts.yes) {
|
|
62
|
+
const { ok } = await inquirer.prompt([
|
|
63
|
+
{
|
|
64
|
+
type: 'confirm',
|
|
65
|
+
name: 'ok',
|
|
66
|
+
message: 'Confirmar a criação da VM (custo recorrente)?',
|
|
67
|
+
default: false,
|
|
68
|
+
},
|
|
69
|
+
]);
|
|
70
|
+
if (!ok) {
|
|
71
|
+
log.warn('Provisionamento cancelado.');
|
|
72
|
+
process.exit(0);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
let res;
|
|
76
|
+
try {
|
|
77
|
+
res = await apiRequest('/api/cli/v1/vm/provision', {
|
|
78
|
+
method: 'POST',
|
|
79
|
+
body: { machineType: opts.machineType, zone: opts.zone, confirmed: true },
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
catch (err) {
|
|
83
|
+
handleApiError(err);
|
|
84
|
+
}
|
|
85
|
+
log.success(`VM provisionada: ${res.serverId} (${res.machineType} em ${res.zone}).`);
|
|
86
|
+
log.dim(' O agente se registra automaticamente após o boot. Acompanhe em /servers.');
|
|
87
|
+
process.exit(0);
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=vm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vm.js","sourceRoot":"","sources":["../../src/commands/vm.ts"],"names":[],"mappings":"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"}
|