@neetru/cli 2.8.0 → 2.9.3

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 (44) hide show
  1. package/CHANGELOG.md +128 -0
  2. package/dist/commands/admin/sdk-credential.d.ts +19 -0
  3. package/dist/commands/admin/sdk-credential.js +169 -0
  4. package/dist/commands/admin/sdk-credential.js.map +1 -0
  5. package/dist/commands/bug.d.ts +87 -0
  6. package/dist/commands/bug.js +419 -0
  7. package/dist/commands/bug.js.map +1 -0
  8. package/dist/commands/customers.d.ts +17 -0
  9. package/dist/commands/customers.js +160 -0
  10. package/dist/commands/customers.js.map +1 -0
  11. package/dist/commands/db.d.ts +4 -0
  12. package/dist/commands/db.js +380 -64
  13. package/dist/commands/db.js.map +1 -1
  14. package/dist/commands/docs.d.ts +4 -0
  15. package/dist/commands/docs.js +99 -7
  16. package/dist/commands/docs.js.map +1 -1
  17. package/dist/commands/doctor.js +4 -1
  18. package/dist/commands/doctor.js.map +1 -1
  19. package/dist/commands/marketplace.d.ts +36 -0
  20. package/dist/commands/marketplace.js +584 -0
  21. package/dist/commands/marketplace.js.map +1 -0
  22. package/dist/commands/new.js +196 -37
  23. package/dist/commands/new.js.map +1 -1
  24. package/dist/commands/open.d.ts +8 -0
  25. package/dist/commands/open.js +61 -13
  26. package/dist/commands/open.js.map +1 -1
  27. package/dist/commands/products.d.ts +23 -0
  28. package/dist/commands/products.js +39 -1
  29. package/dist/commands/products.js.map +1 -1
  30. package/dist/commands/tenants.js +24 -2
  31. package/dist/commands/tenants.js.map +1 -1
  32. package/dist/commands/ui.d.ts +1 -1
  33. package/dist/commands/ui.js +172 -2
  34. package/dist/commands/ui.js.map +1 -1
  35. package/dist/commands/workspaces.d.ts +10 -1
  36. package/dist/commands/workspaces.js +145 -23
  37. package/dist/commands/workspaces.js.map +1 -1
  38. package/dist/index.js +327 -4
  39. package/dist/index.js.map +1 -1
  40. package/dist/lib/config-schema.d.ts +10 -10
  41. package/dist/lib/pickers.d.ts +25 -0
  42. package/dist/lib/pickers.js +75 -1
  43. package/dist/lib/pickers.js.map +1 -1
  44. package/package.json +5 -2
@@ -0,0 +1,419 @@
1
+ /**
2
+ * `neetru bug report|list|show|claim|resolve|comment`
3
+ *
4
+ * Controle de bugs e ocorrências via CLI. Permite que agentes Claude,
5
+ * staff e automações reportem bugs no Core e acompanhem a resolução.
6
+ *
7
+ * Endpoints (todos /api/cli/v1/bugs/...):
8
+ * POST / — criar bug report
9
+ * GET / — listar bugs
10
+ * GET /[id] — detalhe
11
+ * PATCH /[id]/claim — assumir investigação
12
+ * PATCH /[id]/resolve — encerrar (resolved/wont_fix/duplicate)
13
+ * POST /[id]/comment — adicionar comentário
14
+ */
15
+ import chalk from 'chalk';
16
+ import ora from 'ora';
17
+ import inquirer from 'inquirer';
18
+ import { apiRequest } from '../lib/api-client.js';
19
+ import { requireToken, handleApiError } from '../lib/cli-read.js';
20
+ import { printWriteResult } from '../lib/cli-write.js';
21
+ import { renderTable, fmtTimestamp } from '../lib/render.js';
22
+ import { log } from '../utils/logger.js';
23
+ // ─── Formatação ──────────────────────────────────────────────────────────────
24
+ function colorStatus(s) {
25
+ if (!s)
26
+ return chalk.dim('—');
27
+ if (s === 'open')
28
+ return chalk.red(s);
29
+ if (s === 'triaged')
30
+ return chalk.yellow(s);
31
+ if (s === 'in_progress')
32
+ return chalk.cyan(s);
33
+ if (s === 'resolved')
34
+ return chalk.green(s);
35
+ return chalk.dim(s);
36
+ }
37
+ function colorSeverity(s) {
38
+ if (!s)
39
+ return chalk.dim('—');
40
+ if (s === 'critical')
41
+ return chalk.bgRed.white.bold(` ${s} `);
42
+ if (s === 'high')
43
+ return chalk.red(s);
44
+ if (s === 'medium')
45
+ return chalk.yellow(s);
46
+ return chalk.dim(s);
47
+ }
48
+ /**
49
+ * Cria um bug report interativo (ou one-shot via flags).
50
+ *
51
+ * Modo interativo: prompts inquirer para title/body/category/severity.
52
+ * Modo one-shot: --title + --body obrigatórios; demais com defaults.
53
+ *
54
+ * Exemplo interativo:
55
+ * neetru bug report
56
+ *
57
+ * Exemplo one-shot (para agentes Claude):
58
+ * neetru bug report --title "neetru deploy trava" --body "Stack trace..." \
59
+ * --category cli --severity high --actor-type agent_claude
60
+ */
61
+ export async function runBugReport(opts) {
62
+ const token = await requireToken(opts.json);
63
+ let title = opts.title?.trim() ?? '';
64
+ let description = opts.body?.trim() ?? '';
65
+ let category = opts.category?.trim() ?? '';
66
+ let severity = opts.severity?.trim() ?? '';
67
+ const interactive = !opts.json && (!title || !description);
68
+ if (interactive) {
69
+ const answers = await inquirer.prompt([
70
+ {
71
+ type: 'input',
72
+ name: 'title',
73
+ message: 'Título do bug (curto, objetivo):',
74
+ when: !title,
75
+ validate: (v) => v.trim().length > 0 || 'Obrigatório.',
76
+ default: title || undefined,
77
+ },
78
+ {
79
+ type: 'editor',
80
+ name: 'description',
81
+ message: 'Descrição completa (abre editor):',
82
+ when: !description,
83
+ validate: (v) => v.trim().length > 0 || 'Obrigatório.',
84
+ },
85
+ {
86
+ type: 'list',
87
+ name: 'category',
88
+ message: 'Categoria:',
89
+ when: !category,
90
+ choices: [
91
+ { name: 'CLI', value: 'cli' },
92
+ { name: 'SDK', value: 'sdk' },
93
+ { name: 'Core (painel)', value: 'core' },
94
+ { name: 'Agente Linux', value: 'agent' },
95
+ { name: 'Libs internas', value: 'libs' },
96
+ { name: 'Docs', value: 'docs' },
97
+ { name: 'Infra / GCP', value: 'infra' },
98
+ { name: 'Outro', value: 'other' },
99
+ ],
100
+ default: 'other',
101
+ },
102
+ {
103
+ type: 'list',
104
+ name: 'severity',
105
+ message: 'Severidade:',
106
+ when: !severity,
107
+ choices: [
108
+ { name: 'Crítico — bloqueia produção completamente', value: 'critical' },
109
+ { name: 'Alto — funcionalidade principal quebrada', value: 'high' },
110
+ { name: 'Médio — degradação parcial', value: 'medium' },
111
+ { name: 'Baixo — cosmético / melhoria', value: 'low' },
112
+ ],
113
+ default: 'medium',
114
+ },
115
+ ]);
116
+ title = title || answers.title;
117
+ description = description || answers.description;
118
+ category = category || answers.category;
119
+ severity = severity || answers.severity;
120
+ }
121
+ category = category || 'other';
122
+ severity = severity || 'medium';
123
+ const spinner = opts.json ? null : ora({ text: 'Criando bug report…', color: 'blue' }).start();
124
+ let res;
125
+ try {
126
+ res = await apiRequest('/api/cli/v1/bugs', {
127
+ method: 'POST',
128
+ token,
129
+ body: {
130
+ title,
131
+ description,
132
+ category,
133
+ severity,
134
+ productId: opts.product || undefined,
135
+ reproductionSteps: opts.steps || undefined,
136
+ expectedBehavior: opts.expected || undefined,
137
+ actualBehavior: opts.actual || undefined,
138
+ actorType: opts.actorType || 'cli_principal',
139
+ },
140
+ });
141
+ spinner?.stop();
142
+ }
143
+ catch (error) {
144
+ spinner?.fail('Falha ao criar bug report.');
145
+ handleApiError(error, opts.json);
146
+ }
147
+ printWriteResult({ id: res.id, status: res.status }, `Bug reportado com sucesso. ID: ${chalk.cyan(res.id)}`, opts.json);
148
+ }
149
+ /**
150
+ * Lista bugs com filtros opcionais.
151
+ *
152
+ * Exemplo (para agentes Claude puxarem bugs abertos):
153
+ * neetru bug list --status open --json
154
+ */
155
+ export async function runBugList(opts) {
156
+ const token = await requireToken(opts.json);
157
+ const qs = new URLSearchParams();
158
+ if (opts.status)
159
+ qs.set('status', opts.status);
160
+ if (opts.category)
161
+ qs.set('category', opts.category);
162
+ if (opts.assignedTo)
163
+ qs.set('assignedTo', opts.assignedTo);
164
+ if (opts.product)
165
+ qs.set('productId', opts.product);
166
+ if (opts.limit)
167
+ qs.set('limit', opts.limit);
168
+ const q = qs.toString();
169
+ const spinner = opts.json ? null : ora({ text: 'Buscando bugs…', color: 'blue' }).start();
170
+ let res;
171
+ try {
172
+ res = await apiRequest(`/api/cli/v1/bugs${q ? `?${q}` : ''}`, { token });
173
+ spinner?.stop();
174
+ }
175
+ catch (error) {
176
+ spinner?.fail('Falha ao listar bugs.');
177
+ handleApiError(error, opts.json);
178
+ }
179
+ if (opts.json) {
180
+ console.log(JSON.stringify(res));
181
+ return;
182
+ }
183
+ log.heading(`Bugs e ocorrências (${res.count})`);
184
+ if (res.count === 0) {
185
+ log.dim('Nenhuma ocorrência no escopo dos filtros.');
186
+ return;
187
+ }
188
+ renderTable([
189
+ { header: 'ID', value: (b) => b.id, maxWidth: 24 },
190
+ { header: 'TÍTULO', value: (b) => b.title ?? '—', maxWidth: 40 },
191
+ { header: 'STATUS', value: (b) => colorStatus(b.status) },
192
+ { header: 'SEV', value: (b) => colorSeverity(b.severity) },
193
+ { header: 'CATEGORIA', value: (b) => b.category ?? '—', maxWidth: 10 },
194
+ { header: 'RESPONSÁVEL', value: (b) => b.assignedTo ?? chalk.dim('—'), maxWidth: 24 },
195
+ { header: 'REPORTADO', value: (b) => fmtTimestamp(b.reportedAt), maxWidth: 14 },
196
+ ], res.reports);
197
+ console.log();
198
+ }
199
+ /**
200
+ * Mostra detalhe completo de um bug.
201
+ *
202
+ * Exemplo:
203
+ * neetru bug show bug_abc123
204
+ */
205
+ export async function runBugShow(id, opts) {
206
+ if (!id) {
207
+ log.error('Uso: neetru bug show <id>');
208
+ process.exit(1);
209
+ }
210
+ const token = await requireToken(opts.json);
211
+ const spinner = opts.json ? null : ora({ text: `Buscando bug ${id}…`, color: 'blue' }).start();
212
+ let res;
213
+ try {
214
+ res = await apiRequest(`/api/cli/v1/bugs/${encodeURIComponent(id)}`, { token });
215
+ spinner?.stop();
216
+ }
217
+ catch (error) {
218
+ spinner?.fail('Falha ao buscar bug.');
219
+ handleApiError(error, opts.json);
220
+ }
221
+ if (opts.json) {
222
+ console.log(JSON.stringify(res));
223
+ return;
224
+ }
225
+ const b = res.report;
226
+ const row = (k, v) => console.log(` ${chalk.dim(k.padEnd(20))} ${v}`);
227
+ log.heading(`Bug ${b.id}`);
228
+ row('Título', b.title ?? '—');
229
+ row('Status', colorStatus(b.status));
230
+ row('Severidade', colorSeverity(b.severity));
231
+ row('Categoria', b.category ?? '—');
232
+ row('Responsável', b.assignedTo ?? chalk.dim('sem responsável'));
233
+ row('Reportado por', b.reportedBy?.email ?? b.reportedBy?.actorId ?? '—');
234
+ row('Tipo de actor', b.reportedBy?.actorType ?? '—');
235
+ if (b.productId)
236
+ row('Produto', b.productId);
237
+ row('Reportado em', fmtTimestamp(b.reportedAt));
238
+ if (b.updatedAt)
239
+ row('Atualizado em', fmtTimestamp(b.updatedAt));
240
+ if (b.environment) {
241
+ if (b.environment.cliVersion)
242
+ row('CLI', b.environment.cliVersion);
243
+ if (b.environment.nodeVersion)
244
+ row('Node', b.environment.nodeVersion);
245
+ if (b.environment.os)
246
+ row('OS', b.environment.os);
247
+ }
248
+ if (b.description) {
249
+ console.log();
250
+ console.log(chalk.dim(' Descrição:'));
251
+ console.log(` ${b.description.replace(/\n/g, '\n ')}`);
252
+ }
253
+ if (b.reproductionSteps) {
254
+ console.log();
255
+ console.log(chalk.dim(' Passos para reproduzir:'));
256
+ console.log(` ${b.reproductionSteps.replace(/\n/g, '\n ')}`);
257
+ }
258
+ if (b.resolution) {
259
+ console.log();
260
+ console.log(chalk.dim(' Resolução:'));
261
+ console.log(` ${b.resolution.summary}`);
262
+ if (b.resolution.commitSha)
263
+ console.log(` commit: ${chalk.cyan(b.resolution.commitSha)}`);
264
+ }
265
+ if (Array.isArray(b.comments) && b.comments.length > 0) {
266
+ console.log();
267
+ console.log(chalk.dim(` Comentários (${b.comments.length}):`));
268
+ for (const c of b.comments) {
269
+ const ts = fmtTimestamp(c.at);
270
+ console.log(` [${chalk.cyan(c.author)}] ${chalk.dim(ts)}`);
271
+ console.log(` ${c.body}`);
272
+ }
273
+ }
274
+ console.log();
275
+ }
276
+ /**
277
+ * Assume a investigação de um bug.
278
+ *
279
+ * Exemplo:
280
+ * neetru bug claim bug_abc123
281
+ */
282
+ export async function runBugClaim(id, opts) {
283
+ if (!id) {
284
+ log.error('Uso: neetru bug claim <id>');
285
+ process.exit(1);
286
+ }
287
+ const token = await requireToken(opts.json);
288
+ const spinner = opts.json ? null : ora({ text: `Assumindo bug ${id}…`, color: 'blue' }).start();
289
+ let res;
290
+ try {
291
+ res = await apiRequest(`/api/cli/v1/bugs/${encodeURIComponent(id)}/claim`, {
292
+ method: 'PATCH',
293
+ token,
294
+ body: opts.assignedTo ? { assignedTo: opts.assignedTo } : {},
295
+ });
296
+ spinner?.stop();
297
+ }
298
+ catch (error) {
299
+ spinner?.fail('Falha ao assumir bug.');
300
+ handleApiError(error, opts.json);
301
+ }
302
+ printWriteResult({ id: res.id, assignedTo: res.assignedTo, status: res.status }, `Bug ${res.id} assumido por ${res.assignedTo} (status: ${res.status}).`, opts.json);
303
+ }
304
+ /**
305
+ * Marca bug como resolvido, wont_fix ou duplicate.
306
+ *
307
+ * Exemplo:
308
+ * neetru bug resolve bug_abc123 --summary "Corrigido em deploy X" --commit abc1234
309
+ */
310
+ export async function runBugResolve(id, opts) {
311
+ if (!id) {
312
+ log.error('Uso: neetru bug resolve <id> --summary "<texto>"');
313
+ process.exit(1);
314
+ }
315
+ let summary = opts.summary?.trim() ?? '';
316
+ let status = (opts.status ?? 'resolved').trim();
317
+ let duplicateOf = opts.duplicateOf?.trim() ?? '';
318
+ if (!opts.json && !summary) {
319
+ const ans = await inquirer.prompt([
320
+ {
321
+ type: 'editor',
322
+ name: 'summary',
323
+ message: 'Resumo da resolução:',
324
+ validate: (v) => v.trim().length > 0 || 'Obrigatório.',
325
+ },
326
+ {
327
+ type: 'list',
328
+ name: 'status',
329
+ message: 'Resultado:',
330
+ choices: [
331
+ { name: 'Resolvido', value: 'resolved' },
332
+ { name: 'Não corrigir (wont_fix)', value: 'wont_fix' },
333
+ { name: 'Duplicado', value: 'duplicate' },
334
+ ],
335
+ default: 'resolved',
336
+ },
337
+ {
338
+ type: 'input',
339
+ name: 'duplicateOf',
340
+ message: 'ID do bug original:',
341
+ when: (a) => a.status === 'duplicate',
342
+ validate: (v) => v.trim().length > 0 || 'Obrigatório quando duplicate.',
343
+ },
344
+ ]);
345
+ summary = ans.summary;
346
+ status = ans.status;
347
+ duplicateOf = ans.duplicateOf ?? '';
348
+ }
349
+ if (!summary) {
350
+ log.error('--summary é obrigatório');
351
+ process.exit(1);
352
+ }
353
+ const token = await requireToken(opts.json);
354
+ const spinner = opts.json ? null : ora({ text: `Encerrando bug ${id}…`, color: 'blue' }).start();
355
+ let res;
356
+ try {
357
+ res = await apiRequest(`/api/cli/v1/bugs/${encodeURIComponent(id)}/resolve`, {
358
+ method: 'PATCH',
359
+ token,
360
+ body: {
361
+ summary,
362
+ status,
363
+ commitSha: opts.commit?.trim() || undefined,
364
+ duplicateOf: duplicateOf || undefined,
365
+ },
366
+ });
367
+ spinner?.stop();
368
+ }
369
+ catch (error) {
370
+ spinner?.fail('Falha ao encerrar bug.');
371
+ handleApiError(error, opts.json);
372
+ }
373
+ printWriteResult({ id: res.id, status: res.status }, `Bug ${res.id} encerrado como "${res.status}".`, opts.json);
374
+ }
375
+ /**
376
+ * Adiciona comentário em um bug.
377
+ *
378
+ * Exemplo (agente Claude):
379
+ * neetru bug comment bug_abc123 --body "Testei em Node 22 — reproduzível."
380
+ */
381
+ export async function runBugComment(id, opts) {
382
+ if (!id) {
383
+ log.error('Uso: neetru bug comment <id> --body "<texto>"');
384
+ process.exit(1);
385
+ }
386
+ let body = opts.body?.trim() ?? '';
387
+ if (!opts.json && !body) {
388
+ const ans = await inquirer.prompt([
389
+ {
390
+ type: 'editor',
391
+ name: 'body',
392
+ message: 'Comentário:',
393
+ validate: (v) => v.trim().length > 0 || 'Obrigatório.',
394
+ },
395
+ ]);
396
+ body = ans.body;
397
+ }
398
+ if (!body) {
399
+ log.error('--body é obrigatório');
400
+ process.exit(1);
401
+ }
402
+ const token = await requireToken(opts.json);
403
+ const spinner = opts.json ? null : ora({ text: `Comentando bug ${id}…`, color: 'blue' }).start();
404
+ let res;
405
+ try {
406
+ res = await apiRequest(`/api/cli/v1/bugs/${encodeURIComponent(id)}/comment`, {
407
+ method: 'POST',
408
+ token,
409
+ body: { body },
410
+ });
411
+ spinner?.stop();
412
+ }
413
+ catch (error) {
414
+ spinner?.fail('Falha ao comentar.');
415
+ handleApiError(error, opts.json);
416
+ }
417
+ printWriteResult({ id: res.id, commentCount: res.commentCount }, `Comentário adicionado. Total: ${res.commentCount}.`, opts.json);
418
+ }
419
+ //# sourceMappingURL=bug.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bug.js","sourceRoot":"","sources":["../../src/commands/bug.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ export interface CustomersListOptions {
2
+ status?: string;
3
+ search?: string;
4
+ json?: boolean;
5
+ }
6
+ export declare function runCustomersList(opts?: CustomersListOptions): Promise<void>;
7
+ export interface CustomersGetOptions {
8
+ json?: boolean;
9
+ }
10
+ export declare function runCustomersGet(id: string, opts?: CustomersGetOptions): Promise<void>;
11
+ export interface CustomersCreateOptions {
12
+ name?: string;
13
+ email?: string;
14
+ taxId?: string;
15
+ json?: boolean;
16
+ }
17
+ export declare function runCustomersCreate(opts?: CustomersCreateOptions): Promise<void>;
@@ -0,0 +1,160 @@
1
+ /**
2
+ * `neetru customers` — comandos de gestão de customers via CLI.
3
+ *
4
+ * Endpoints:
5
+ * GET /api/cli/v1/customers (list)
6
+ * GET /api/cli/v1/customers/{id} (get)
7
+ * POST /api/cli/v1/customers (create — pdv #2)
8
+ *
9
+ * Customer = empresa/PJ que paga os serviços Neetru (CRM comercial).
10
+ * Diferente de Tenant = instância do produto para esse customer.
11
+ *
12
+ * Plain PT-BR em todas as strings visíveis ao usuário.
13
+ */
14
+ import chalk from 'chalk';
15
+ import ora from 'ora';
16
+ import { apiRequest } from '../lib/api-client.js';
17
+ import { requireToken, handleApiError, printWriteResult } from '../lib/cli-write.js';
18
+ import { renderTable, fmtTimestamp } from '../lib/render.js';
19
+ import { promptText } from '../lib/pickers.js';
20
+ import { log } from '../utils/logger.js';
21
+ function colorStatus(s) {
22
+ if (!s)
23
+ return chalk.dim('—');
24
+ if (s === 'ativo')
25
+ return chalk.green(s);
26
+ if (s === 'suspenso')
27
+ return chalk.yellow(s);
28
+ if (s === 'arquivado')
29
+ return chalk.dim(s);
30
+ return s;
31
+ }
32
+ export async function runCustomersList(opts = {}) {
33
+ const token = await requireToken(opts.json);
34
+ const params = new URLSearchParams();
35
+ if (opts.status)
36
+ params.set('status', opts.status);
37
+ if (opts.search)
38
+ params.set('search', opts.search);
39
+ const qs = params.toString();
40
+ const spinner = opts.json
41
+ ? null
42
+ : ora({ text: 'Buscando customers…', color: 'blue' }).start();
43
+ let res;
44
+ try {
45
+ res = await apiRequest(`/api/cli/v1/customers${qs ? `?${qs}` : ''}`, { token });
46
+ spinner?.stop();
47
+ }
48
+ catch (error) {
49
+ spinner?.fail('Falha ao buscar customers.');
50
+ handleApiError(error, opts.json);
51
+ }
52
+ if (opts.json) {
53
+ console.log(JSON.stringify({ ok: res.ok, count: res.count, customers: res.customers }));
54
+ return;
55
+ }
56
+ log.heading(`Customers (${res.count})`);
57
+ renderTable([
58
+ { header: 'ID', value: (r) => r.id, maxWidth: 24 },
59
+ { header: 'NOME', value: (r) => r.name ?? '—', maxWidth: 28 },
60
+ { header: 'EMAIL', value: (r) => r.contactEmail ?? '—', maxWidth: 30 },
61
+ { header: 'CNPJ/CPF', value: (r) => r.cnpj ?? '—', maxWidth: 18 },
62
+ { header: 'STATUS', value: (r) => colorStatus(r.status), maxWidth: 14 },
63
+ { header: 'CRIADO', value: (r) => fmtTimestamp(r.createdAt) },
64
+ ], res.customers);
65
+ console.log();
66
+ }
67
+ export async function runCustomersGet(id, opts = {}) {
68
+ const token = await requireToken(opts.json);
69
+ if (!id) {
70
+ if (opts.json) {
71
+ console.log(JSON.stringify({ ok: false, error: 'missing_input', message: '<id> é obrigatório.' }));
72
+ }
73
+ else {
74
+ log.error('<id> é obrigatório. Use: neetru customers get <id>');
75
+ }
76
+ process.exit(1);
77
+ return;
78
+ }
79
+ const spinner = opts.json
80
+ ? null
81
+ : ora({ text: `Buscando customer ${id}…`, color: 'blue' }).start();
82
+ let res;
83
+ try {
84
+ res = await apiRequest(`/api/cli/v1/customers/${encodeURIComponent(id)}`, { token });
85
+ spinner?.stop();
86
+ }
87
+ catch (error) {
88
+ spinner?.fail('Falha ao buscar customer.');
89
+ handleApiError(error, opts.json);
90
+ }
91
+ if (opts.json) {
92
+ console.log(JSON.stringify(res));
93
+ return;
94
+ }
95
+ const c = res.customer ?? {};
96
+ log.heading(`Customer ${c.name ?? id}`);
97
+ renderTable([
98
+ { header: 'CAMPO', value: (r) => r.k, maxWidth: 20 },
99
+ { header: 'VALOR', value: (r) => r.v, maxWidth: 70 },
100
+ ], [
101
+ { k: 'id', v: c.id ?? id },
102
+ { k: 'nome', v: c.name ?? '—' },
103
+ { k: 'email', v: c.contactEmail ?? '—' },
104
+ { k: 'cnpj/cpf', v: c.cnpj ?? '—' },
105
+ { k: 'razão social', v: c.legalName ?? '—' },
106
+ { k: 'status', v: colorStatus(c.status) },
107
+ { k: 'origem', v: c.origin ?? '—' },
108
+ { k: 'criado', v: fmtTimestamp(c.createdAt) },
109
+ { k: 'atualizado', v: fmtTimestamp(c.updatedAt) },
110
+ ]);
111
+ console.log();
112
+ }
113
+ export async function runCustomersCreate(opts = {}) {
114
+ const token = await requireToken(opts.json);
115
+ // Coleta os campos — interativo se não passados como flags.
116
+ let name = opts.name?.trim() ?? '';
117
+ if (!name) {
118
+ name = await promptText('Nome do customer (ex: Mercado X Ltda):', {
119
+ json: opts.json,
120
+ required: true,
121
+ validate: (v) => (v.length >= 2 ? true : 'Mínimo 2 caracteres.'),
122
+ });
123
+ }
124
+ let email = opts.email?.trim() ?? '';
125
+ if (!email) {
126
+ email = await promptText('Email de contato:', {
127
+ json: opts.json,
128
+ required: true,
129
+ validate: (v) => (v.includes('@') ? true : 'Email inválido.'),
130
+ });
131
+ }
132
+ // taxId é opcional — CNPJ ou CPF.
133
+ const taxId = opts.taxId?.trim() || undefined;
134
+ const spinner = opts.json
135
+ ? null
136
+ : ora({ text: 'Criando customer…', color: 'blue' }).start();
137
+ let res;
138
+ try {
139
+ res = await apiRequest('/api/cli/v1/customers', {
140
+ method: 'POST',
141
+ token,
142
+ body: { name, email, taxId },
143
+ });
144
+ spinner?.stop();
145
+ }
146
+ catch (error) {
147
+ spinner?.fail('Falha ao criar customer.');
148
+ handleApiError(error, opts.json);
149
+ }
150
+ printWriteResult({ id: res.id, name: res.name, contactEmail: res.contactEmail, status: res.status }, `Customer criado: ${chalk.bold(res.name)} (${res.id})`, opts.json);
151
+ if (!opts.json) {
152
+ log.dim(` ID: ${res.id}`);
153
+ log.dim(` Email: ${res.contactEmail}`);
154
+ log.dim(` Status: ${colorStatus(res.status)}`);
155
+ log.dim('');
156
+ log.dim('Próximos passos:');
157
+ log.dim(` Criar workspace: neetru workspaces create --customer ${res.id} --product <id>`);
158
+ }
159
+ }
160
+ //# sourceMappingURL=customers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"customers.js","sourceRoot":"","sources":["../../src/commands/customers.ts"],"names":[],"mappings":"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"}
@@ -15,6 +15,8 @@ export interface DbInitOptions {
15
15
  env?: string;
16
16
  productId?: string;
17
17
  yes?: boolean;
18
+ /** gestovendas #9: saída em JSON para integração CI/automação. */
19
+ json?: boolean;
18
20
  /**
19
21
  * @deprecated Opção legada removida (D-3). Passar `--out` resulta em exit(1)
20
22
  * com mensagem clara. Mantida na interface só para não quebrar callers que
@@ -33,6 +35,8 @@ export interface DbApplyOptions {
33
35
  schemaPath?: string;
34
36
  dryRun?: boolean;
35
37
  yes?: boolean;
38
+ /** gestovendas #9: saída em JSON para integração CI/automação. */
39
+ json?: boolean;
36
40
  }
37
41
  export declare function runDbApply(opts?: DbApplyOptions): Promise<void>;
38
42
  export interface DbMigrationsListOptions {