@neetru/cli 2.8.0 → 2.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +96 -0
- package/dist/commands/bug.d.ts +87 -0
- package/dist/commands/bug.js +419 -0
- package/dist/commands/bug.js.map +1 -0
- package/dist/commands/customers.d.ts +17 -0
- package/dist/commands/customers.js +160 -0
- package/dist/commands/customers.js.map +1 -0
- package/dist/commands/db.d.ts +4 -0
- package/dist/commands/db.js +267 -63
- package/dist/commands/db.js.map +1 -1
- package/dist/commands/docs.d.ts +4 -0
- package/dist/commands/docs.js +99 -7
- package/dist/commands/docs.js.map +1 -1
- package/dist/commands/doctor.js +4 -1
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/marketplace.d.ts +36 -0
- package/dist/commands/marketplace.js +584 -0
- package/dist/commands/marketplace.js.map +1 -0
- package/dist/commands/new.js +196 -37
- package/dist/commands/new.js.map +1 -1
- package/dist/commands/open.d.ts +8 -0
- package/dist/commands/open.js +61 -13
- package/dist/commands/open.js.map +1 -1
- package/dist/commands/products.d.ts +23 -0
- package/dist/commands/products.js +39 -1
- package/dist/commands/products.js.map +1 -1
- package/dist/commands/tenants.js +15 -0
- package/dist/commands/tenants.js.map +1 -1
- package/dist/commands/ui.d.ts +1 -1
- package/dist/commands/ui.js +172 -2
- package/dist/commands/ui.js.map +1 -1
- package/dist/commands/workspaces.d.ts +10 -1
- package/dist/commands/workspaces.js +136 -22
- package/dist/commands/workspaces.js.map +1 -1
- package/dist/index.js +276 -4
- package/dist/index.js.map +1 -1
- package/dist/lib/config-schema.d.ts +8 -8
- package/dist/lib/pickers.d.ts +12 -0
- package/dist/lib/pickers.js +34 -0
- package/dist/lib/pickers.js.map +1 -1
- package/package.json +5 -2
|
@@ -9,19 +9,40 @@
|
|
|
9
9
|
* GET /api/cli/v1/workspaces/{id} (get)
|
|
10
10
|
* (open) NÃO chama API — só monta a URL do painel e abre o browser.
|
|
11
11
|
*/
|
|
12
|
-
import
|
|
12
|
+
import * as fs from 'node:fs/promises';
|
|
13
|
+
import * as path from 'node:path';
|
|
13
14
|
import chalk from 'chalk';
|
|
15
|
+
import { safeOpenUrl } from './open.js';
|
|
14
16
|
import ora from 'ora';
|
|
15
17
|
import { apiRequest } from '../lib/api-client.js';
|
|
16
18
|
import { config } from '../lib/config.js';
|
|
17
19
|
import { requireToken, handleApiError, printWriteResult } from '../lib/cli-write.js';
|
|
18
20
|
import { renderTable, fmtTimestamp } from '../lib/render.js';
|
|
19
|
-
import { pickProductId, pickProductSlug, pickWorkspace, isInteractive, promptChoice, promptText, resolveCustomer, } from '../lib/pickers.js';
|
|
21
|
+
import { pickProductId, pickProductSlug, pickWorkspace, resolveProductIdentifier, isInteractive, promptChoice, promptText, resolveCustomer, } from '../lib/pickers.js';
|
|
20
22
|
import { log } from '../utils/logger.js';
|
|
23
|
+
/** Formata o erro 400 "Nenhum customer ativo" de forma acionável. */
|
|
24
|
+
function humanizeWorkspaceCreateError(message) {
|
|
25
|
+
if (/nenhum customer ativo/i.test(message)) {
|
|
26
|
+
return ('Nenhum customer ativo encontrado.\n\n' +
|
|
27
|
+
' Customer = entidade comercial (PJ) que vai operar o ambiente.\n' +
|
|
28
|
+
' Você pode criar em:\n' +
|
|
29
|
+
' • Painel web: https://core.neetru.com/customers\n' +
|
|
30
|
+
' • CLI: neetru customers create --name "..." --email "..." (em breve)\n\n' +
|
|
31
|
+
' Depois rode novamente:\n' +
|
|
32
|
+
' neetru workspaces create --product <id> --customer <customerId>\n');
|
|
33
|
+
}
|
|
34
|
+
return message;
|
|
35
|
+
}
|
|
21
36
|
export async function runWorkspacesCreate(opts) {
|
|
22
37
|
const token = await requireToken(opts.json);
|
|
38
|
+
// pdv #3 fix: se --product for slug (ex: pdv-agiliza), resolve para id antes
|
|
39
|
+
// de chamar pickProductId. Isso corrige a inconsistência onde tenants create
|
|
40
|
+
// aceitava slug mas workspaces create não.
|
|
41
|
+
const productFlag = opts.product
|
|
42
|
+
? await resolveProductIdentifier(token, opts.product, { json: opts.json })
|
|
43
|
+
: undefined;
|
|
23
44
|
const product = await pickProductId(token, {
|
|
24
|
-
fromFlag:
|
|
45
|
+
fromFlag: productFlag,
|
|
25
46
|
json: opts.json,
|
|
26
47
|
message: 'Produto do workspace:',
|
|
27
48
|
});
|
|
@@ -32,6 +53,71 @@ export async function runWorkspacesCreate(opts) {
|
|
|
32
53
|
{ name: 'staging', value: 'staging' },
|
|
33
54
|
{ name: 'prod', value: 'prod' },
|
|
34
55
|
], { default: 'dev', json: opts.json }));
|
|
56
|
+
// Bug #40: detecta tenant ativo existente para produto+env antes de criar.
|
|
57
|
+
if (!opts.forceDuplicate) {
|
|
58
|
+
const dupSpinner = opts.json
|
|
59
|
+
? null
|
|
60
|
+
: ora({ text: 'Verificando ambientes existentes…', color: 'blue' }).start();
|
|
61
|
+
let existingTenant = null;
|
|
62
|
+
try {
|
|
63
|
+
const qs = new URLSearchParams({ product, status: 'ativo' }).toString();
|
|
64
|
+
const listRes = await apiRequest(`/api/cli/v1/tenants?${qs}`, { token });
|
|
65
|
+
dupSpinner?.stop();
|
|
66
|
+
const rows = listRes.tenants ?? listRes.workspaces ?? [];
|
|
67
|
+
const match = rows.find((r) => (r.environmentId ?? r.env) === env);
|
|
68
|
+
if (match)
|
|
69
|
+
existingTenant = match;
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
// Falha ao checar duplicatas não bloqueia — prossegue criação normalmente.
|
|
73
|
+
dupSpinner?.stop();
|
|
74
|
+
}
|
|
75
|
+
if (existingTenant) {
|
|
76
|
+
const label = existingTenant.name ?? existingTenant.id ?? '(sem nome)';
|
|
77
|
+
// Modo script/JSON (--json ou --yes implícito): bloqueia com 409.
|
|
78
|
+
if (opts.json) {
|
|
79
|
+
console.log(JSON.stringify({
|
|
80
|
+
ok: false,
|
|
81
|
+
error: 'tenant_already_exists',
|
|
82
|
+
status: 409,
|
|
83
|
+
message: `Já existe ambiente ativo '${label}' para produto=${product} env=${env}. Use --force-duplicate para criar mesmo assim.`,
|
|
84
|
+
existing: existingTenant,
|
|
85
|
+
}));
|
|
86
|
+
process.exit(1);
|
|
87
|
+
}
|
|
88
|
+
// Modo interativo: pergunta o que fazer.
|
|
89
|
+
if (isInteractive(opts)) {
|
|
90
|
+
log.warn(`Já existe ambiente '${chalk.cyan(label)}' (${existingTenant.id}) para este produto+env.`);
|
|
91
|
+
const choice = await promptChoice('O que deseja fazer?', [
|
|
92
|
+
{ name: `Reusar '${label}' (sem novo OAuth)`, value: 'reuse' },
|
|
93
|
+
{ name: 'Criar ambiente novo mesmo assim', value: 'new' },
|
|
94
|
+
{ name: 'Cancelar', value: 'cancel' },
|
|
95
|
+
], { json: opts.json });
|
|
96
|
+
if (choice === 'cancel') {
|
|
97
|
+
log.dim('Operação cancelada.');
|
|
98
|
+
process.exit(0);
|
|
99
|
+
}
|
|
100
|
+
if (choice === 'reuse') {
|
|
101
|
+
log.success(`Reusando ambiente existente: ${existingTenant.id}`);
|
|
102
|
+
log.dim('Nota: o OAuth client/secret já foi gerado na criação original.\n' +
|
|
103
|
+
' Se precisar rotacionar, use o painel: https://core.neetru.com/workspaces/' +
|
|
104
|
+
existingTenant.id);
|
|
105
|
+
if (opts.bindConfig && existingTenant.id) {
|
|
106
|
+
await bindTenantToConfig(existingTenant.id);
|
|
107
|
+
}
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
// choice === 'new': prossegue criando normalmente abaixo
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
// Terminal não-interativo sem --json: bloqueia com instrução clara.
|
|
114
|
+
log.error(`Já existe ambiente ativo '${label}' para produto=${product} env=${env}.\n` +
|
|
115
|
+
' Use --force-duplicate para criar um segundo ambiente (raro — verifique se é isso que quer).\n' +
|
|
116
|
+
` Para reusar o existente, use o id: ${existingTenant.id}`);
|
|
117
|
+
process.exit(1);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
35
121
|
const tier = opts.tier ??
|
|
36
122
|
(await promptChoice('Tier:', [
|
|
37
123
|
{ name: 'standard', value: 'standard' },
|
|
@@ -52,12 +138,27 @@ export async function runWorkspacesCreate(opts) {
|
|
|
52
138
|
environmentId: env,
|
|
53
139
|
resourceTier: tier,
|
|
54
140
|
name: opts.name,
|
|
141
|
+
forceDuplicate: opts.forceDuplicate,
|
|
55
142
|
},
|
|
56
143
|
});
|
|
57
144
|
spinner?.stop();
|
|
58
145
|
}
|
|
59
146
|
catch (error) {
|
|
60
147
|
spinner?.fail('Falha ao criar workspace.');
|
|
148
|
+
// Bug #40: humaniza o erro "Nenhum customer ativo".
|
|
149
|
+
if (error instanceof Error &&
|
|
150
|
+
/nenhum customer ativo/i.test(error.message)) {
|
|
151
|
+
if (opts.json) {
|
|
152
|
+
console.log(JSON.stringify({
|
|
153
|
+
ok: false,
|
|
154
|
+
error: 'no_active_customer',
|
|
155
|
+
message: humanizeWorkspaceCreateError(error.message),
|
|
156
|
+
}));
|
|
157
|
+
process.exit(1);
|
|
158
|
+
}
|
|
159
|
+
log.error(humanizeWorkspaceCreateError(error.message));
|
|
160
|
+
process.exit(1);
|
|
161
|
+
}
|
|
61
162
|
handleApiError(error, opts.json);
|
|
62
163
|
}
|
|
63
164
|
if (opts.json) {
|
|
@@ -69,6 +170,35 @@ export async function runWorkspacesCreate(opts) {
|
|
|
69
170
|
log.warn('OAuth client secret (one-time — guarde agora):');
|
|
70
171
|
console.log(` clientId: ${chalk.cyan(res.oauthClientId)}`);
|
|
71
172
|
console.log(` secret: ${chalk.yellow(res.oauthClientSecret)}`);
|
|
173
|
+
// gestovendas #8 fix: --bind-config grava tenantId no neetru.config.json.
|
|
174
|
+
if (opts.bindConfig) {
|
|
175
|
+
await bindTenantToConfig(res.tenantId ?? res.id);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Grava `tenantId` no neetru.config.json (ou .neetru.json) do cwd.
|
|
180
|
+
* Não sobrescreve outros campos — faz merge shallow.
|
|
181
|
+
*/
|
|
182
|
+
async function bindTenantToConfig(tenantId) {
|
|
183
|
+
for (const fname of ['neetru.config.json', '.neetru.json']) {
|
|
184
|
+
const filePath = path.resolve(process.cwd(), fname);
|
|
185
|
+
try {
|
|
186
|
+
const raw = await fs.readFile(filePath, 'utf8');
|
|
187
|
+
const parsed = JSON.parse(raw);
|
|
188
|
+
parsed['tenantId'] = tenantId;
|
|
189
|
+
await fs.writeFile(filePath, JSON.stringify(parsed, null, 2) + '\n', 'utf8');
|
|
190
|
+
log.success(`tenantId gravado em ${fname}`);
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
catch (e) {
|
|
194
|
+
if (e.code !== 'ENOENT') {
|
|
195
|
+
log.warn(`Não foi possível atualizar ${fname}: ${e.message}`);
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
log.warn(`neetru.config.json não encontrado no diretório atual.\n` +
|
|
201
|
+
` Grave manualmente: "tenantId": "${tenantId}"`);
|
|
72
202
|
}
|
|
73
203
|
export async function runWorkspacesAdvance(id, opts) {
|
|
74
204
|
const token = await requireToken(opts.json);
|
|
@@ -211,27 +341,11 @@ export function buildWorkspaceDashboardUrl(id) {
|
|
|
211
341
|
}
|
|
212
342
|
/**
|
|
213
343
|
* Abre uma URL no browser default do OS. Não bloqueia o processo.
|
|
214
|
-
*
|
|
344
|
+
* HIGH-2: delega pra safeOpenUrl que valida protocolo http(s) e usa
|
|
345
|
+
* shell:false — evita injeção via URLs config-derived no Windows.
|
|
215
346
|
*/
|
|
216
347
|
export function openBrowser(url) {
|
|
217
|
-
|
|
218
|
-
if (process.platform === 'win32') {
|
|
219
|
-
spawn('cmd', ['/c', 'start', '""', url], {
|
|
220
|
-
detached: true,
|
|
221
|
-
stdio: 'ignore',
|
|
222
|
-
windowsHide: true,
|
|
223
|
-
}).unref();
|
|
224
|
-
return;
|
|
225
|
-
}
|
|
226
|
-
if (process.platform === 'darwin') {
|
|
227
|
-
spawn('open', [url], { detached: true, stdio: 'ignore' }).unref();
|
|
228
|
-
return;
|
|
229
|
-
}
|
|
230
|
-
spawn('xdg-open', [url], { detached: true, stdio: 'ignore' }).unref();
|
|
231
|
-
}
|
|
232
|
-
catch (e) {
|
|
233
|
-
log.warn(`Não consegui abrir browser. Acesse manualmente: ${url}`);
|
|
234
|
-
}
|
|
348
|
+
safeOpenUrl(url);
|
|
235
349
|
}
|
|
236
350
|
export async function runWorkspacesOpen(id, opts = {}) {
|
|
237
351
|
let workspaceId = id;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspaces.js","sourceRoot":"","sources":["../../src/commands/workspaces.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"workspaces.js","sourceRoot":"","sources":["../../src/commands/workspaces.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -2,6 +2,16 @@
|
|
|
2
2
|
import { Command } from 'commander';
|
|
3
3
|
import { log } from './utils/logger.js';
|
|
4
4
|
import { CLI_VERSION } from './version.js';
|
|
5
|
+
// pdv #6 fix: fecha stdin antes de qualquer process.exit() para evitar a
|
|
6
|
+
// asserção libuv "!(handle->flags & UV_HANDLE_CLOSING)" no Windows.
|
|
7
|
+
// stdin fica aberto como handle libuv quando inquirer/ora o pegam; destruir
|
|
8
|
+
// antes do exit garante que o loop de eventos drene limpo.
|
|
9
|
+
process.on('exit', () => {
|
|
10
|
+
try {
|
|
11
|
+
process.stdin.destroy();
|
|
12
|
+
}
|
|
13
|
+
catch { /* silencioso — handle pode já estar fechado */ }
|
|
14
|
+
});
|
|
5
15
|
const program = new Command();
|
|
6
16
|
program
|
|
7
17
|
.name('neetru')
|
|
@@ -239,6 +249,47 @@ program
|
|
|
239
249
|
const { runSurfaceStatus } = await import('./commands/surface-status.js');
|
|
240
250
|
await runSurfaceStatus({ clientId: opts.clientId, json: !!opts.json });
|
|
241
251
|
});
|
|
252
|
+
// ── neetru customers ──────────────────────────────────────────────────
|
|
253
|
+
// pdv #2 fix: operadores podem criar customers pelo CLI sem abrir o painel.
|
|
254
|
+
// Customer = empresa/PJ que paga (CRM comercial).
|
|
255
|
+
// Tenant = instância do produto para esse customer.
|
|
256
|
+
const customersCmd = program
|
|
257
|
+
.command('customers')
|
|
258
|
+
.description('Gerenciar customers (empresa/PJ que paga o serviço Neetru)');
|
|
259
|
+
customersCmd
|
|
260
|
+
.command('list')
|
|
261
|
+
.description('Listar customers')
|
|
262
|
+
.option('--status <status>', 'ativo | em prospecção | suspenso | arquivado')
|
|
263
|
+
.option('--search <texto>', 'busca por nome, email ou CNPJ')
|
|
264
|
+
.option('--json', 'saída em JSON')
|
|
265
|
+
.action(async (opts) => {
|
|
266
|
+
const { runCustomersList } = await import('./commands/customers.js');
|
|
267
|
+
await runCustomersList({ status: opts.status, search: opts.search, json: !!opts.json });
|
|
268
|
+
});
|
|
269
|
+
customersCmd
|
|
270
|
+
.command('get <id>')
|
|
271
|
+
.description('Mostrar detalhes de um customer')
|
|
272
|
+
.option('--json', 'saída em JSON')
|
|
273
|
+
.action(async (id, opts) => {
|
|
274
|
+
const { runCustomersGet } = await import('./commands/customers.js');
|
|
275
|
+
await runCustomersGet(id, { json: !!opts.json });
|
|
276
|
+
});
|
|
277
|
+
customersCmd
|
|
278
|
+
.command('create')
|
|
279
|
+
.description('Criar customer (empresa/PJ) — necessário antes de criar workspace')
|
|
280
|
+
.option('--name <nome>', 'nome do customer (razão social ou nome comercial)')
|
|
281
|
+
.option('--email <email>', 'email de contato')
|
|
282
|
+
.option('--tax-id <cnpj>', 'CNPJ ou CPF (opcional)')
|
|
283
|
+
.option('--json', 'saída em JSON')
|
|
284
|
+
.action(async (opts) => {
|
|
285
|
+
const { runCustomersCreate } = await import('./commands/customers.js');
|
|
286
|
+
await runCustomersCreate({
|
|
287
|
+
name: opts.name,
|
|
288
|
+
email: opts.email,
|
|
289
|
+
taxId: opts.taxId,
|
|
290
|
+
json: !!opts.json,
|
|
291
|
+
});
|
|
292
|
+
});
|
|
242
293
|
// ── neetru tenants ────────────────────────────────────────────────────
|
|
243
294
|
const tenantsCmd = program
|
|
244
295
|
.command('tenants')
|
|
@@ -269,7 +320,10 @@ tenantsCmd
|
|
|
269
320
|
});
|
|
270
321
|
tenantsCmd
|
|
271
322
|
.command('create')
|
|
272
|
-
.description('Criar tenant
|
|
323
|
+
.description('[STAFF-ONLY] Criar tenant sem OAuth client/secret.\n' +
|
|
324
|
+
'DEPRECATED: para uso normal (ambiente completo com OAuth), use:\n' +
|
|
325
|
+
' neetru workspaces create\n' +
|
|
326
|
+
'Este comando permanece para casos staff-only (registro de tenant pré-existente).')
|
|
273
327
|
.option('--name <name>', 'nome do tenant')
|
|
274
328
|
.option('--slug <slug>', 'slug do tenant')
|
|
275
329
|
.option('--customer <customerId>', 'id do customer')
|
|
@@ -450,6 +504,8 @@ workspacesCmd
|
|
|
450
504
|
.option('--env <env>', 'dev | staging | prod (default: dev)')
|
|
451
505
|
.option('--tier <tier>', 'dev | standard | enterprise (default: standard)')
|
|
452
506
|
.option('--name <name>', 'label do workspace')
|
|
507
|
+
.option('--bind-config', 'grava tenantId retornado no neetru.config.json do cwd')
|
|
508
|
+
.option('--force-duplicate', 'cria mesmo que já exista ambiente ativo para produto+env')
|
|
453
509
|
.option('--json', 'saída em JSON')
|
|
454
510
|
.action(async (opts) => {
|
|
455
511
|
const { runWorkspacesCreate } = await import('./commands/workspaces.js');
|
|
@@ -459,6 +515,8 @@ workspacesCmd
|
|
|
459
515
|
env: opts.env,
|
|
460
516
|
tier: opts.tier,
|
|
461
517
|
name: opts.name,
|
|
518
|
+
bindConfig: !!opts.bindConfig,
|
|
519
|
+
forceDuplicate: !!opts.forceDuplicate,
|
|
462
520
|
json: !!opts.json,
|
|
463
521
|
});
|
|
464
522
|
});
|
|
@@ -811,6 +869,15 @@ adminDatabaseCmd
|
|
|
811
869
|
const { runDbGet } = await import('./commands/products-db.js');
|
|
812
870
|
await runDbGet(id, { json: !!opts.json });
|
|
813
871
|
});
|
|
872
|
+
// gestovendas #12 fix: alias `status` → `get` (skill /neetru documenta como `status`).
|
|
873
|
+
adminDatabaseCmd
|
|
874
|
+
.command('status [id]')
|
|
875
|
+
.description('[Staff] Alias de `get` — mostrar detalhes e status de um banco')
|
|
876
|
+
.option('--json')
|
|
877
|
+
.action(async (id, opts) => {
|
|
878
|
+
const { runDbGet } = await import('./commands/products-db.js');
|
|
879
|
+
await runDbGet(id, { json: !!opts.json });
|
|
880
|
+
});
|
|
814
881
|
// D-2: `set-status` é ESCRITA explícita. `status` era ambíguo com o READ em `neetru db status`.
|
|
815
882
|
adminDatabaseCmd
|
|
816
883
|
.command('set-status [id] [status]')
|
|
@@ -855,16 +922,27 @@ const productsDbCmd = productsCmd
|
|
|
855
922
|
process.stderr.write('\nAviso: `neetru products db` foi renomeado para `neetru admin database`.\n' +
|
|
856
923
|
'Por favor, atualize seus scripts. Este alias será removido em breve.\n\n');
|
|
857
924
|
});
|
|
925
|
+
// gestovendas #2 / pdv #5 fix: alias `list` aceita --product (slug legado) OU
|
|
926
|
+
// --product-id (novo). Se slug recebido, passa como productId para o Core.
|
|
927
|
+
// O Core tenta resolver slug → id server-side (fallback); se o Core não suportar,
|
|
928
|
+
// o operador vê mensagem específica do servidor e não um erro de sintaxe.
|
|
858
929
|
productsDbCmd
|
|
859
930
|
.command('list')
|
|
860
931
|
.description('[RENOMEADO — use: neetru admin database list]')
|
|
861
|
-
.option('--product-id <id>')
|
|
932
|
+
.option('--product-id <id>', 'ID do produto (novo)')
|
|
933
|
+
.option('--product <slugOrId>', 'slug ou ID do produto (legado — use --product-id)')
|
|
862
934
|
.option('--engine <engine>')
|
|
863
935
|
.option('--status <status>')
|
|
864
936
|
.option('--json')
|
|
865
937
|
.action(async (opts) => {
|
|
938
|
+
// Tradução de flag: --product (legado) → productId (novo).
|
|
939
|
+
const productId = opts.productId ?? opts.product;
|
|
940
|
+
if (opts.product && !opts.productId) {
|
|
941
|
+
process.stderr.write(`[DEPRECATED] Use --product-id em vez de --product.\n` +
|
|
942
|
+
` Próxima major remove o suporte a --product neste alias.\n`);
|
|
943
|
+
}
|
|
866
944
|
const { runDbList } = await import('./commands/products-db.js');
|
|
867
|
-
await runDbList({ productId
|
|
945
|
+
await runDbList({ productId, engine: opts.engine, status: opts.status, json: !!opts.json });
|
|
868
946
|
});
|
|
869
947
|
productsDbCmd
|
|
870
948
|
.command('engines')
|
|
@@ -1025,6 +1103,74 @@ program
|
|
|
1025
1103
|
ctaLabel: opts.ctaLabel,
|
|
1026
1104
|
});
|
|
1027
1105
|
});
|
|
1106
|
+
// ── neetru marketplace ────────────────────────────────────────────────
|
|
1107
|
+
const marketplaceCmd = program
|
|
1108
|
+
.command('marketplace')
|
|
1109
|
+
.description('Central de artefatos do ecossistema Neetru (skills, SDK, templates)');
|
|
1110
|
+
const marketplaceSkillsCmd = marketplaceCmd
|
|
1111
|
+
.command('skills')
|
|
1112
|
+
.description('Gerenciar Skills do Claude Code');
|
|
1113
|
+
marketplaceSkillsCmd
|
|
1114
|
+
.command('install')
|
|
1115
|
+
.description('Clonar neetru-libs e instalar skills em ~/.claude/skills/')
|
|
1116
|
+
.action(async () => {
|
|
1117
|
+
const { runSkillsInstall } = await import('./commands/marketplace.js');
|
|
1118
|
+
await runSkillsInstall();
|
|
1119
|
+
});
|
|
1120
|
+
marketplaceSkillsCmd
|
|
1121
|
+
.command('update')
|
|
1122
|
+
.description('Atualizar cache neetru-libs (git pull) e re-copiar skills instaladas')
|
|
1123
|
+
.action(async () => {
|
|
1124
|
+
const { runSkillsUpdate } = await import('./commands/marketplace.js');
|
|
1125
|
+
await runSkillsUpdate();
|
|
1126
|
+
});
|
|
1127
|
+
marketplaceSkillsCmd
|
|
1128
|
+
.command('list')
|
|
1129
|
+
.description('Listar skills disponíveis no cache local')
|
|
1130
|
+
.action(async () => {
|
|
1131
|
+
const { runSkillsList } = await import('./commands/marketplace.js');
|
|
1132
|
+
await runSkillsList();
|
|
1133
|
+
});
|
|
1134
|
+
marketplaceSkillsCmd
|
|
1135
|
+
.command('uninstall')
|
|
1136
|
+
.description('Remover skills de ~/.claude/skills/ (pede confirmação)')
|
|
1137
|
+
.option('--yes', 'pular confirmação interativa')
|
|
1138
|
+
.action(async (opts) => {
|
|
1139
|
+
const { runSkillsUninstall } = await import('./commands/marketplace.js');
|
|
1140
|
+
await runSkillsUninstall({ yes: !!opts.yes });
|
|
1141
|
+
});
|
|
1142
|
+
const marketplaceSdkCmd = marketplaceCmd
|
|
1143
|
+
.command('sdk')
|
|
1144
|
+
.description('Gerenciar @neetru/sdk no projeto atual');
|
|
1145
|
+
marketplaceSdkCmd
|
|
1146
|
+
.command('init')
|
|
1147
|
+
.description('Adicionar @neetru/sdk ao package.json e criar src/neetru.ts')
|
|
1148
|
+
.action(async () => {
|
|
1149
|
+
const { runSdkInit } = await import('./commands/marketplace.js');
|
|
1150
|
+
await runSdkInit();
|
|
1151
|
+
});
|
|
1152
|
+
marketplaceSdkCmd
|
|
1153
|
+
.command('templates')
|
|
1154
|
+
.description('Listar templates de feature disponíveis (auth, billing, usage…)')
|
|
1155
|
+
.action(async () => {
|
|
1156
|
+
const { runSdkTemplates } = await import('./commands/marketplace.js');
|
|
1157
|
+
await runSdkTemplates();
|
|
1158
|
+
});
|
|
1159
|
+
marketplaceSdkCmd
|
|
1160
|
+
.command('add <template>')
|
|
1161
|
+
.description('Copiar template de feature pra src/ do projeto atual')
|
|
1162
|
+
.option('--force', 'sobrescrever arquivos existentes')
|
|
1163
|
+
.action(async (template, opts) => {
|
|
1164
|
+
const { runSdkAddTemplate } = await import('./commands/marketplace.js');
|
|
1165
|
+
await runSdkAddTemplate(template, { force: !!opts.force });
|
|
1166
|
+
});
|
|
1167
|
+
marketplaceCmd
|
|
1168
|
+
.command('browse')
|
|
1169
|
+
.description('Abrir https://github.com/Neetru/neetru-libs no browser')
|
|
1170
|
+
.action(async () => {
|
|
1171
|
+
const { runMarketplaceBrowse } = await import('./commands/marketplace.js');
|
|
1172
|
+
await runMarketplaceBrowse();
|
|
1173
|
+
});
|
|
1028
1174
|
// ── neetru add ────────────────────────────────────────────────────────
|
|
1029
1175
|
program
|
|
1030
1176
|
.command('add <feature>')
|
|
@@ -1124,6 +1270,7 @@ dbCmd
|
|
|
1124
1270
|
.option('--env <env>', 'ambiente: dev-local (padrão) | staging | production')
|
|
1125
1271
|
.option('--product-id <id>', 'override do productId (default: slug do neetru.config.json)')
|
|
1126
1272
|
.option('-y, --yes', 'modo não-interativo (usa defaults)')
|
|
1273
|
+
.option('--json', 'saída em JSON estruturado')
|
|
1127
1274
|
.action(async (opts) => {
|
|
1128
1275
|
const { runDbInit } = await import('./commands/db.js');
|
|
1129
1276
|
await runDbInit({
|
|
@@ -1132,6 +1279,7 @@ dbCmd
|
|
|
1132
1279
|
env: opts.env,
|
|
1133
1280
|
productId: opts.productId,
|
|
1134
1281
|
yes: !!opts.yes,
|
|
1282
|
+
json: !!opts.json,
|
|
1135
1283
|
});
|
|
1136
1284
|
});
|
|
1137
1285
|
// ── neetru db apply ───────────────────────────────────────────────────
|
|
@@ -1144,6 +1292,7 @@ dbCmd
|
|
|
1144
1292
|
.option('--schema <path>', 'caminho do schema (default: db/schema.ts)')
|
|
1145
1293
|
.option('--dry-run', 'calcula o diff mas NÃO envia ao Core')
|
|
1146
1294
|
.option('-y, --yes', 'pula a confirmação interativa')
|
|
1295
|
+
.option('--json', 'saída em JSON estruturado')
|
|
1147
1296
|
.action(async (opts) => {
|
|
1148
1297
|
const { runDbApply } = await import('./commands/db.js');
|
|
1149
1298
|
await runDbApply({
|
|
@@ -1152,6 +1301,7 @@ dbCmd
|
|
|
1152
1301
|
schemaPath: opts.schema,
|
|
1153
1302
|
dryRun: !!opts.dryRun,
|
|
1154
1303
|
yes: !!opts.yes,
|
|
1304
|
+
json: !!opts.json,
|
|
1155
1305
|
});
|
|
1156
1306
|
});
|
|
1157
1307
|
// ── neetru db migrations ──────────────────────────────────────────────
|
|
@@ -1436,6 +1586,117 @@ supportTicketsCmd
|
|
|
1436
1586
|
const { runSupportTicketsStatus } = await import('./commands/support.js');
|
|
1437
1587
|
await runSupportTicketsStatus(id, { to: opts.to, json: !!opts.json });
|
|
1438
1588
|
});
|
|
1589
|
+
// ── neetru bug ───────────────────────────────────────────────────────
|
|
1590
|
+
/**
|
|
1591
|
+
* neetru bug — bugs e ocorrências reportados pela CLI, agentes Claude e staff.
|
|
1592
|
+
*
|
|
1593
|
+
* Subcomandos:
|
|
1594
|
+
* report — reportar novo bug (interativo ou one-shot via flags)
|
|
1595
|
+
* list — listar bugs abertos (ou com filtros)
|
|
1596
|
+
* show <id> — detalhe completo
|
|
1597
|
+
* claim <id> — assumir investigação
|
|
1598
|
+
* resolve <id> — encerrar (resolved/wont_fix/duplicate)
|
|
1599
|
+
* comment <id> — adicionar comentário na thread
|
|
1600
|
+
*
|
|
1601
|
+
* Exemplo rápido (agentes Claude):
|
|
1602
|
+
* neetru bug report --title "X trava" --body "Stack trace…" --category cli --severity high --actor-type agent_claude --json
|
|
1603
|
+
* neetru bug list --status open --json
|
|
1604
|
+
*/
|
|
1605
|
+
const bugCmd = program
|
|
1606
|
+
.command('bug')
|
|
1607
|
+
.description('Reportar, listar e resolver bugs e ocorrências da plataforma');
|
|
1608
|
+
bugCmd
|
|
1609
|
+
.command('report')
|
|
1610
|
+
.description('Reportar novo bug (interativo ou flags --title/--body para agentes)')
|
|
1611
|
+
.option('--title <text>', 'título curto do bug')
|
|
1612
|
+
.option('--body <text>', 'descrição detalhada')
|
|
1613
|
+
.option('--category <cat>', 'cli | sdk | core | agent | libs | docs | infra | other', 'other')
|
|
1614
|
+
.option('--severity <sev>', 'critical | high | medium | low', 'medium')
|
|
1615
|
+
.option('--product <id>', 'productId afetado (opcional)')
|
|
1616
|
+
.option('--steps <text>', 'passos para reproduzir (opcional)')
|
|
1617
|
+
.option('--expected <text>', 'comportamento esperado (opcional)')
|
|
1618
|
+
.option('--actual <text>', 'comportamento atual (opcional)')
|
|
1619
|
+
.option('--actor-type <type>', 'cli_principal | agent_claude | staff_session', 'cli_principal')
|
|
1620
|
+
.option('--json', 'saída em JSON (modo não-interativo)')
|
|
1621
|
+
.action(async (opts) => {
|
|
1622
|
+
const { runBugReport } = await import('./commands/bug.js');
|
|
1623
|
+
await runBugReport({
|
|
1624
|
+
title: opts.title,
|
|
1625
|
+
body: opts.body,
|
|
1626
|
+
category: opts.category,
|
|
1627
|
+
severity: opts.severity,
|
|
1628
|
+
product: opts.product,
|
|
1629
|
+
steps: opts.steps,
|
|
1630
|
+
expected: opts.expected,
|
|
1631
|
+
actual: opts.actual,
|
|
1632
|
+
actorType: opts.actorType,
|
|
1633
|
+
json: !!opts.json,
|
|
1634
|
+
});
|
|
1635
|
+
});
|
|
1636
|
+
bugCmd
|
|
1637
|
+
.command('list')
|
|
1638
|
+
.description('Listar bugs e ocorrências')
|
|
1639
|
+
.option('--status <s>', 'open | triaged | in_progress | resolved | wont_fix | duplicate')
|
|
1640
|
+
.option('--category <cat>', 'cli | sdk | core | agent | libs | docs | infra | other')
|
|
1641
|
+
.option('--assigned-to <uid>', 'filtrar por responsável (uid ou session id)')
|
|
1642
|
+
.option('--product <id>', 'filtrar por productId')
|
|
1643
|
+
.option('--limit <n>', 'máximo de resultados (default 20, max 200)')
|
|
1644
|
+
.option('--json', 'saída em JSON')
|
|
1645
|
+
.action(async (opts) => {
|
|
1646
|
+
const { runBugList } = await import('./commands/bug.js');
|
|
1647
|
+
await runBugList({
|
|
1648
|
+
status: opts.status,
|
|
1649
|
+
category: opts.category,
|
|
1650
|
+
assignedTo: opts.assignedTo,
|
|
1651
|
+
product: opts.product,
|
|
1652
|
+
limit: opts.limit,
|
|
1653
|
+
json: !!opts.json,
|
|
1654
|
+
});
|
|
1655
|
+
});
|
|
1656
|
+
bugCmd
|
|
1657
|
+
.command('show <id>')
|
|
1658
|
+
.description('Mostrar detalhe completo de um bug')
|
|
1659
|
+
.option('--json', 'saída em JSON')
|
|
1660
|
+
.action(async (id, opts) => {
|
|
1661
|
+
const { runBugShow } = await import('./commands/bug.js');
|
|
1662
|
+
await runBugShow(id, { json: !!opts.json });
|
|
1663
|
+
});
|
|
1664
|
+
bugCmd
|
|
1665
|
+
.command('claim <id>')
|
|
1666
|
+
.description('Assumir investigação de um bug')
|
|
1667
|
+
.option('--assigned-to <uid>', 'uid ou session id (default: caller)')
|
|
1668
|
+
.option('--json', 'saída em JSON')
|
|
1669
|
+
.action(async (id, opts) => {
|
|
1670
|
+
const { runBugClaim } = await import('./commands/bug.js');
|
|
1671
|
+
await runBugClaim(id, { assignedTo: opts.assignedTo, json: !!opts.json });
|
|
1672
|
+
});
|
|
1673
|
+
bugCmd
|
|
1674
|
+
.command('resolve <id>')
|
|
1675
|
+
.description('Encerrar um bug como resolvido, wont_fix ou duplicate')
|
|
1676
|
+
.option('--summary <text>', 'resumo do que foi feito / por que não corrigir')
|
|
1677
|
+
.option('--commit <sha>', 'commit SHA que corrige o bug (opcional)')
|
|
1678
|
+
.option('--status <s>', 'resolved | wont_fix | duplicate (default: resolved)', 'resolved')
|
|
1679
|
+
.option('--duplicate-of <id>', 'ID do bug original (obrigatório quando --status duplicate)')
|
|
1680
|
+
.option('--json', 'saída em JSON (modo não-interativo)')
|
|
1681
|
+
.action(async (id, opts) => {
|
|
1682
|
+
const { runBugResolve } = await import('./commands/bug.js');
|
|
1683
|
+
await runBugResolve(id, {
|
|
1684
|
+
summary: opts.summary,
|
|
1685
|
+
commit: opts.commit,
|
|
1686
|
+
status: opts.status,
|
|
1687
|
+
duplicateOf: opts.duplicateOf,
|
|
1688
|
+
json: !!opts.json,
|
|
1689
|
+
});
|
|
1690
|
+
});
|
|
1691
|
+
bugCmd
|
|
1692
|
+
.command('comment <id>')
|
|
1693
|
+
.description('Adicionar comentário na thread de um bug')
|
|
1694
|
+
.option('--body <text>', 'corpo do comentário')
|
|
1695
|
+
.option('--json', 'saída em JSON (modo não-interativo)')
|
|
1696
|
+
.action(async (id, opts) => {
|
|
1697
|
+
const { runBugComment } = await import('./commands/bug.js');
|
|
1698
|
+
await runBugComment(id, { body: opts.body, json: !!opts.json });
|
|
1699
|
+
});
|
|
1439
1700
|
// ── neetru dns ───────────────────────────────────────────────────────
|
|
1440
1701
|
const dnsCmd = program
|
|
1441
1702
|
.command('dns')
|
|
@@ -1572,9 +1833,20 @@ drCmd
|
|
|
1572
1833
|
// Frente B — docs em GCS + Firestore registry. Desacopla conteúdo de docs
|
|
1573
1834
|
// do deploy do Core (owner edita markdown direto pelo bucket OU via CLI,
|
|
1574
1835
|
// sem rebuild).
|
|
1836
|
+
//
|
|
1837
|
+
// `neetru docs open [topic]` abre documentação no browser. É o ponto de
|
|
1838
|
+
// entrada pra quem quer LER docs, não publicar.
|
|
1575
1839
|
const docsCmd = program
|
|
1576
1840
|
.command('docs')
|
|
1577
|
-
.description('
|
|
1841
|
+
.description('Documentação + registry de docs publicados em gs://neetru-docs');
|
|
1842
|
+
docsCmd
|
|
1843
|
+
.command('open [topic]')
|
|
1844
|
+
.description('Abrir documentação no browser (ex: sdk, cli, db, webhooks, auth)')
|
|
1845
|
+
.option('--json', 'saída em JSON (imprime URL sem abrir browser)')
|
|
1846
|
+
.action(async (topic, opts) => {
|
|
1847
|
+
const { runDocsOpen } = await import('./commands/docs.js');
|
|
1848
|
+
await runDocsOpen(topic, { json: !!opts.json });
|
|
1849
|
+
});
|
|
1578
1850
|
docsCmd
|
|
1579
1851
|
.command('publish <file>')
|
|
1580
1852
|
.description('Publicar arquivo markdown (sobe pro GCS + registry Firestore)')
|