@neetru/cli 2.0.0 → 2.1.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.
Files changed (72) hide show
  1. package/dist/commands/agent-release.d.ts +13 -0
  2. package/dist/commands/agent-release.js +204 -0
  3. package/dist/commands/agent-release.js.map +1 -0
  4. package/dist/commands/agent-write.d.ts +12 -0
  5. package/dist/commands/agent-write.js +94 -0
  6. package/dist/commands/agent-write.js.map +1 -0
  7. package/dist/commands/api-catalog.d.ts +20 -0
  8. package/dist/commands/api-catalog.js +126 -0
  9. package/dist/commands/api-catalog.js.map +1 -0
  10. package/dist/commands/audit.d.ts +8 -0
  11. package/dist/commands/audit.js +69 -0
  12. package/dist/commands/audit.js.map +1 -0
  13. package/dist/commands/billing.d.ts +6 -0
  14. package/dist/commands/billing.js +69 -0
  15. package/dist/commands/billing.js.map +1 -0
  16. package/dist/commands/build.js +10 -3
  17. package/dist/commands/build.js.map +1 -1
  18. package/dist/commands/cloud-run.d.ts +11 -0
  19. package/dist/commands/cloud-run.js +87 -0
  20. package/dist/commands/cloud-run.js.map +1 -0
  21. package/dist/commands/deploy.d.ts +7 -0
  22. package/dist/commands/deploy.js +150 -17
  23. package/dist/commands/deploy.js.map +1 -1
  24. package/dist/commands/deployments.d.ts +11 -0
  25. package/dist/commands/deployments.js +69 -0
  26. package/dist/commands/deployments.js.map +1 -0
  27. package/dist/commands/dr.d.ts +11 -0
  28. package/dist/commands/dr.js +79 -0
  29. package/dist/commands/dr.js.map +1 -0
  30. package/dist/commands/infra-read.d.ts +9 -0
  31. package/dist/commands/infra-read.js +113 -0
  32. package/dist/commands/infra-read.js.map +1 -0
  33. package/dist/commands/init.d.ts +13 -1
  34. package/dist/commands/init.js +327 -70
  35. package/dist/commands/init.js.map +1 -1
  36. package/dist/commands/products-db.d.ts +37 -0
  37. package/dist/commands/products-db.js +230 -0
  38. package/dist/commands/products-db.js.map +1 -0
  39. package/dist/commands/products.d.ts +12 -0
  40. package/dist/commands/products.js +97 -0
  41. package/dist/commands/products.js.map +1 -0
  42. package/dist/commands/servers.d.ts +23 -0
  43. package/dist/commands/servers.js +166 -0
  44. package/dist/commands/servers.js.map +1 -0
  45. package/dist/commands/support.d.ts +25 -0
  46. package/dist/commands/support.js +184 -0
  47. package/dist/commands/support.js.map +1 -0
  48. package/dist/commands/surface-status.d.ts +5 -0
  49. package/dist/commands/surface-status.js +63 -0
  50. package/dist/commands/surface-status.js.map +1 -0
  51. package/dist/commands/tenants.d.ts +34 -0
  52. package/dist/commands/tenants.js +179 -0
  53. package/dist/commands/tenants.js.map +1 -0
  54. package/dist/commands/workspaces.d.ts +15 -0
  55. package/dist/commands/workspaces.js +72 -0
  56. package/dist/commands/workspaces.js.map +1 -0
  57. package/dist/index.js +775 -6
  58. package/dist/index.js.map +1 -1
  59. package/dist/lib/api-client.d.ts +18 -0
  60. package/dist/lib/api-client.js +124 -4
  61. package/dist/lib/api-client.js.map +1 -1
  62. package/dist/lib/cli-read.d.ts +13 -0
  63. package/dist/lib/cli-read.js +103 -0
  64. package/dist/lib/cli-read.js.map +1 -0
  65. package/dist/lib/cli-write.d.ts +47 -0
  66. package/dist/lib/cli-write.js +137 -0
  67. package/dist/lib/cli-write.js.map +1 -0
  68. package/dist/lib/config-schema.d.ts +10 -10
  69. package/dist/lib/render.d.ts +16 -0
  70. package/dist/lib/render.js +74 -0
  71. package/dist/lib/render.js.map +1 -0
  72. package/package.json +4 -4
@@ -0,0 +1,184 @@
1
+ /**
2
+ * `neetru support tickets list|describe|reply|assign|status` — control plane
3
+ * de tickets de suporte. F5 §4.2.6 — fecha a operação de inbox via CLI.
4
+ *
5
+ * Endpoints (todos /api/cli/v1/support/tickets/...):
6
+ * GET /
7
+ * GET /[id]
8
+ * POST /[id]/reply
9
+ * POST /[id]/assign
10
+ * POST /[id]/status
11
+ */
12
+ import chalk from 'chalk';
13
+ import ora from 'ora';
14
+ import { apiRequest } from '../lib/api-client.js';
15
+ import { requireToken, handleApiError } from '../lib/cli-read.js';
16
+ import { printWriteResult } from '../lib/cli-write.js';
17
+ import { renderTable, fmtTimestamp } from '../lib/render.js';
18
+ import { log } from '../utils/logger.js';
19
+ function colorStatus(s) {
20
+ if (!s)
21
+ return chalk.dim('—');
22
+ if (s === 'open')
23
+ return chalk.yellow(s);
24
+ if (s === 'in_progress')
25
+ return chalk.cyan(s);
26
+ if (s === 'resolved')
27
+ return chalk.green(s);
28
+ if (s === 'closed')
29
+ return chalk.dim(s);
30
+ return s;
31
+ }
32
+ export async function runSupportTicketsList(opts) {
33
+ const token = await requireToken(opts.json);
34
+ const qs = new URLSearchParams();
35
+ if (opts.status)
36
+ qs.set('status', opts.status);
37
+ if (opts.severity)
38
+ qs.set('severity', opts.severity);
39
+ if (opts.product)
40
+ qs.set('product', opts.product);
41
+ if (opts.customer)
42
+ qs.set('customer', opts.customer);
43
+ if (opts.breached)
44
+ qs.set('breached', 'true');
45
+ if (opts.limit)
46
+ qs.set('limit', opts.limit);
47
+ const q = qs.toString();
48
+ const spinner = opts.json ? null : ora({ text: 'Buscando tickets…', color: 'blue' }).start();
49
+ let res;
50
+ try {
51
+ res = await apiRequest(`/api/cli/v1/support/tickets${q ? `?${q}` : ''}`, { token });
52
+ spinner?.stop();
53
+ }
54
+ catch (error) {
55
+ spinner?.fail('Falha ao listar tickets.');
56
+ handleApiError(error, opts.json);
57
+ }
58
+ if (opts.json) {
59
+ console.log(JSON.stringify(res));
60
+ return;
61
+ }
62
+ log.heading(`Support tickets (${res.count})`);
63
+ if (res.count === 0) {
64
+ log.dim('Nenhum ticket no escopo dos filtros.');
65
+ return;
66
+ }
67
+ renderTable([
68
+ { header: 'ID', value: (t) => t.id, maxWidth: 18 },
69
+ { header: 'TÍTULO', value: (t) => t.title ?? '—', maxWidth: 36 },
70
+ { header: 'STATUS', value: (t) => colorStatus(t.status) },
71
+ { header: 'SEVERITY', value: (t) => t.severity ?? '—' },
72
+ { header: 'PRODUTO', value: (t) => t.productId ?? '—', maxWidth: 18 },
73
+ { header: 'SLA', value: (t) => (t.slaBreached ? chalk.red('estourado') : 'ok') },
74
+ { header: 'ASSIGNED', value: (t) => t.assignedTo ?? chalk.dim('—'), maxWidth: 22 },
75
+ ], res.tickets);
76
+ console.log();
77
+ }
78
+ export async function runSupportTicketsDescribe(id, opts) {
79
+ if (!id) {
80
+ log.error('Uso: neetru support tickets describe <id>');
81
+ process.exit(1);
82
+ }
83
+ const token = await requireToken(opts.json);
84
+ const spinner = opts.json ? null : ora({ text: `Buscando ticket ${id}…`, color: 'blue' }).start();
85
+ let res;
86
+ try {
87
+ res = await apiRequest(`/api/cli/v1/support/tickets/${encodeURIComponent(id)}`, { token });
88
+ spinner?.stop();
89
+ }
90
+ catch (error) {
91
+ spinner?.fail('Falha ao buscar ticket.');
92
+ handleApiError(error, opts.json);
93
+ }
94
+ if (opts.json) {
95
+ console.log(JSON.stringify(res));
96
+ return;
97
+ }
98
+ const t = res.ticket;
99
+ log.heading(`Ticket ${t.id}`);
100
+ const row = (k, v) => console.log(` ${chalk.dim(k.padEnd(16))} ${v}`);
101
+ row('Título', t.title ?? '—');
102
+ row('Status', colorStatus(t.status));
103
+ row('Severity', t.severity ?? '—');
104
+ row('Produto', t.productId ?? '—');
105
+ row('Customer', t.customerId ?? t.tenantId ?? '—');
106
+ row('Assigned', t.assignedTo ?? '—');
107
+ row('SLA', t.slaBreached ? chalk.red('estourado') : 'ok');
108
+ row('Criado', fmtTimestamp(t.createdAt));
109
+ row('Atualizado', fmtTimestamp(t.updatedAt));
110
+ if (t.description) {
111
+ console.log();
112
+ console.log(chalk.dim(' Descrição:'));
113
+ console.log(` ${t.description}`);
114
+ }
115
+ if (Array.isArray(t.messages) && t.messages.length > 0) {
116
+ console.log();
117
+ console.log(chalk.dim(` Mensagens (${t.messages.length}):`));
118
+ for (const msg of t.messages) {
119
+ const tag = msg.authorType === 'support_agent' ? chalk.cyan('staff') : chalk.green('cliente');
120
+ console.log(` [${tag}] ${msg.author ?? '?'} — ${fmtTimestamp(msg.createdAt)}`);
121
+ console.log(` ${msg.text ?? ''}`);
122
+ }
123
+ }
124
+ console.log();
125
+ }
126
+ export async function runSupportTicketsReply(id, opts) {
127
+ if (!id || !opts.message) {
128
+ log.error('Uso: neetru support tickets reply <id> --message "<texto>"');
129
+ process.exit(1);
130
+ }
131
+ const token = await requireToken(opts.json);
132
+ const spinner = opts.json ? null : ora({ text: `Respondendo ticket ${id}…`, color: 'blue' }).start();
133
+ let res;
134
+ try {
135
+ res = await apiRequest(`/api/cli/v1/support/tickets/${encodeURIComponent(id)}/reply`, { method: 'POST', token, body: { message: opts.message } });
136
+ spinner?.stop();
137
+ }
138
+ catch (error) {
139
+ spinner?.fail('Falha ao responder ticket.');
140
+ handleApiError(error, opts.json);
141
+ }
142
+ printWriteResult({ ticketId: res.ticketId, status: res.status }, `Ticket ${res.ticketId} respondido (status: ${res.status}).`, opts.json);
143
+ }
144
+ export async function runSupportTicketsAssign(id, opts) {
145
+ if (!id || !opts.to) {
146
+ log.error('Uso: neetru support tickets assign <id> --to <staffUid>');
147
+ process.exit(1);
148
+ }
149
+ const token = await requireToken(opts.json);
150
+ const spinner = opts.json ? null : ora({ text: `Atribuindo ticket ${id}…`, color: 'blue' }).start();
151
+ let res;
152
+ try {
153
+ res = await apiRequest(`/api/cli/v1/support/tickets/${encodeURIComponent(id)}/assign`, { method: 'POST', token, body: { assigneeUid: opts.to } });
154
+ spinner?.stop();
155
+ }
156
+ catch (error) {
157
+ spinner?.fail('Falha ao atribuir ticket.');
158
+ handleApiError(error, opts.json);
159
+ }
160
+ printWriteResult({ ticketId: res.ticketId, assigneeUid: res.assigneeUid }, `Ticket ${res.ticketId} atribuído a ${res.assigneeUid}.`, opts.json);
161
+ }
162
+ export async function runSupportTicketsStatus(id, opts) {
163
+ if (!id || !opts.to) {
164
+ log.error('Uso: neetru support tickets status <id> --to open|in_progress|resolved|closed');
165
+ process.exit(1);
166
+ }
167
+ const token = await requireToken(opts.json);
168
+ const spinner = opts.json
169
+ ? null
170
+ : ora({ text: `Transicionando ticket ${id} → ${opts.to}…`, color: 'blue' }).start();
171
+ let res;
172
+ try {
173
+ res = await apiRequest(`/api/cli/v1/support/tickets/${encodeURIComponent(id)}/status`, { method: 'POST', token, body: { status: opts.to } });
174
+ spinner?.stop();
175
+ }
176
+ catch (error) {
177
+ spinner?.fail('Falha ao transicionar ticket.');
178
+ handleApiError(error, opts.json);
179
+ }
180
+ printWriteResult({ ticketId: res.ticketId, status: res.status, changed: res.changed }, res.changed
181
+ ? `Ticket ${res.ticketId} → ${res.status}`
182
+ : `Ticket ${res.ticketId} já está em ${res.status} (no-op).`, opts.json);
183
+ }
184
+ //# sourceMappingURL=support.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"support.js","sourceRoot":"","sources":["../../src/commands/support.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export interface SurfaceStatusOptions {
2
+ clientId?: string;
3
+ json?: boolean;
4
+ }
5
+ export declare function runSurfaceStatus(opts: SurfaceStatusOptions): Promise<void>;
@@ -0,0 +1,63 @@
1
+ /**
2
+ * `neetru status` — saúde das superfícies públicas do ecossistema Neetru.
3
+ *
4
+ * Endpoint: GET /api/cli/v1/status — probe server-side de landing, api,
5
+ * portal e políticas. Quando `--client-id` é passado, delega ao status de
6
+ * workspace legado (`runWorkspaceStatus`) para preservar compatibilidade.
7
+ *
8
+ * Saída: tabela (default) ou `--json`. Exit 3 se alguma superfície não está
9
+ * saudável (útil pra CI / monitoring).
10
+ */
11
+ import chalk from 'chalk';
12
+ import ora from 'ora';
13
+ import { apiRequest } from '../lib/api-client.js';
14
+ import { requireToken, handleApiError } from '../lib/cli-read.js';
15
+ import { renderTable } from '../lib/render.js';
16
+ import { log } from '../utils/logger.js';
17
+ import { runStatus as runWorkspaceStatus } from './status.js';
18
+ function colorStatus(s) {
19
+ if (s === 'healthy')
20
+ return chalk.green(s);
21
+ if (s === 'degraded')
22
+ return chalk.yellow(s);
23
+ return chalk.red(s);
24
+ }
25
+ export async function runSurfaceStatus(opts) {
26
+ // Backward-compat: `neetru status --client-id <id>` = status do workspace.
27
+ if (opts.clientId) {
28
+ await runWorkspaceStatus({ clientId: opts.clientId, json: opts.json });
29
+ return;
30
+ }
31
+ const token = await requireToken(opts.json);
32
+ const spinner = opts.json
33
+ ? null
34
+ : ora({ text: 'Verificando superfícies públicas…', color: 'blue' }).start();
35
+ let res;
36
+ try {
37
+ res = await apiRequest('/api/cli/v1/status', { token });
38
+ spinner?.stop();
39
+ }
40
+ catch (error) {
41
+ spinner?.fail('Falha ao verificar superfícies.');
42
+ handleApiError(error, opts.json);
43
+ }
44
+ if (opts.json) {
45
+ console.log(JSON.stringify(res));
46
+ if (!res.healthy)
47
+ process.exit(3);
48
+ return;
49
+ }
50
+ log.heading(`Superfícies públicas — ${res.healthy ? chalk.green('todas saudáveis') : chalk.red('atenção')}`);
51
+ renderTable([
52
+ { header: 'SUPERFÍCIE', value: (s) => s.name, maxWidth: 20 },
53
+ { header: 'URL', value: (s) => s.url, maxWidth: 44 },
54
+ { header: 'STATUS', value: (s) => colorStatus(s.status) },
55
+ { header: 'HTTP', value: (s) => (s.httpStatus != null ? String(s.httpStatus) : '—') },
56
+ { header: 'LATÊNCIA', value: (s) => (s.latencyMs != null ? `${s.latencyMs}ms` : '—') },
57
+ ], res.surfaces);
58
+ console.log(chalk.dim(` verificado em ${res.checkedAt}`));
59
+ console.log();
60
+ if (!res.healthy)
61
+ process.exit(3);
62
+ }
63
+ //# sourceMappingURL=surface-status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"surface-status.js","sourceRoot":"","sources":["../../src/commands/surface-status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import { type ConfirmOptions } from '../lib/cli-write.js';
2
+ export interface TenantsListOptions {
3
+ status?: string;
4
+ product?: string;
5
+ limit?: string;
6
+ json?: boolean;
7
+ }
8
+ export declare function runTenantsList(opts: TenantsListOptions): Promise<void>;
9
+ export interface TenantsGetOptions {
10
+ json?: boolean;
11
+ }
12
+ export declare function runTenantsGet(id: string, opts: TenantsGetOptions): Promise<void>;
13
+ export interface TenantsCreateOptions {
14
+ name: string;
15
+ slug: string;
16
+ customer: string;
17
+ product: string;
18
+ env: string;
19
+ domain?: string;
20
+ json?: boolean;
21
+ }
22
+ export declare function runTenantsCreate(opts: TenantsCreateOptions): Promise<void>;
23
+ export interface TenantsUpdateOptions {
24
+ name: string;
25
+ slug: string;
26
+ customer: string;
27
+ product: string;
28
+ env: string;
29
+ domain?: string;
30
+ json?: boolean;
31
+ }
32
+ export declare function runTenantsUpdate(id: string, opts: TenantsUpdateOptions): Promise<void>;
33
+ export declare function runTenantsSuspend(id: string, opts: ConfirmOptions): Promise<void>;
34
+ export declare function runTenantsReactivate(id: string, opts: ConfirmOptions): Promise<void>;
@@ -0,0 +1,179 @@
1
+ /**
2
+ * `neetru tenants list` / `neetru tenants get <id>` — control plane read-only.
3
+ *
4
+ * Endpoints:
5
+ * GET /api/cli/v1/tenants (list, filtros --status / --product)
6
+ * GET /api/cli/v1/tenants/{id} (get)
7
+ *
8
+ * Saída: tabela (default) ou `--json`.
9
+ */
10
+ import chalk from 'chalk';
11
+ import ora from 'ora';
12
+ import { apiRequest } from '../lib/api-client.js';
13
+ import { requireToken, handleApiError } from '../lib/cli-read.js';
14
+ import { confirmDestructive, printWriteResult, } from '../lib/cli-write.js';
15
+ import { renderTable, fmtTimestamp } from '../lib/render.js';
16
+ import { log } from '../utils/logger.js';
17
+ function colorStatus(s) {
18
+ if (!s)
19
+ return chalk.dim('—');
20
+ if (s === 'ativo')
21
+ return chalk.green(s);
22
+ if (s === 'suspenso' || s === 'arquivado')
23
+ return chalk.red(s);
24
+ if (s === 'em provisionamento')
25
+ return chalk.yellow(s);
26
+ return chalk.cyan(s);
27
+ }
28
+ export async function runTenantsList(opts) {
29
+ const token = await requireToken(opts.json);
30
+ const params = new URLSearchParams();
31
+ if (opts.status)
32
+ params.set('status', opts.status);
33
+ if (opts.product)
34
+ params.set('product', opts.product);
35
+ if (opts.limit)
36
+ params.set('limit', opts.limit);
37
+ const qs = params.toString();
38
+ const spinner = opts.json ? null : ora({ text: 'Buscando tenants…', color: 'blue' }).start();
39
+ let res;
40
+ try {
41
+ res = await apiRequest(`/api/cli/v1/tenants${qs ? `?${qs}` : ''}`, { token });
42
+ spinner?.stop();
43
+ }
44
+ catch (error) {
45
+ spinner?.fail('Falha ao buscar tenants.');
46
+ handleApiError(error, opts.json);
47
+ }
48
+ if (opts.json) {
49
+ console.log(JSON.stringify(res));
50
+ return;
51
+ }
52
+ log.heading(`Tenants (${res.count})`);
53
+ renderTable([
54
+ { header: 'ID', value: (r) => r.id, maxWidth: 22 },
55
+ { header: 'NOME', value: (r) => r.name ?? '—', maxWidth: 28 },
56
+ { header: 'STATUS', value: (r) => colorStatus(r.status) },
57
+ { header: 'PRODUTO', value: (r) => r.productId ?? '—', maxWidth: 22 },
58
+ { header: 'ENV', value: (r) => r.environmentId ?? '—' },
59
+ { header: 'DOMÍNIO', value: (r) => r.primaryDomain ?? '—', maxWidth: 30 },
60
+ ], res.tenants);
61
+ console.log();
62
+ }
63
+ export async function runTenantsGet(id, opts) {
64
+ if (!id) {
65
+ log.error('Uso: neetru tenants get <id>');
66
+ process.exit(1);
67
+ }
68
+ const token = await requireToken(opts.json);
69
+ const spinner = opts.json ? null : ora({ text: `Buscando tenant ${id}…`, color: 'blue' }).start();
70
+ let res;
71
+ try {
72
+ res = await apiRequest(`/api/cli/v1/tenants/${encodeURIComponent(id)}`, { token });
73
+ spinner?.stop();
74
+ }
75
+ catch (error) {
76
+ spinner?.fail('Falha ao buscar tenant.');
77
+ handleApiError(error, opts.json);
78
+ }
79
+ if (opts.json) {
80
+ console.log(JSON.stringify(res));
81
+ return;
82
+ }
83
+ const t = res.tenant;
84
+ log.heading(`Tenant ${t.id}`);
85
+ const row = (k, v) => console.log(` ${chalk.dim(k.padEnd(16))} ${v}`);
86
+ row('Nome', t.name ?? '—');
87
+ row('Slug', t.slug ?? '—');
88
+ row('Status', colorStatus(t.status));
89
+ row('Customer', t.customerId ?? '—');
90
+ row('Produto', t.productId ?? '—');
91
+ row('Ambiente', t.environmentId ?? '—');
92
+ row('Domínio', t.primaryDomain ?? '—');
93
+ row('Criado em', fmtTimestamp(t.createdAt));
94
+ row('Atualizado', fmtTimestamp(t.updatedAt));
95
+ console.log();
96
+ }
97
+ export async function runTenantsCreate(opts) {
98
+ const token = await requireToken(opts.json);
99
+ const spinner = opts.json ? null : ora({ text: 'Criando tenant…', color: 'blue' }).start();
100
+ let res;
101
+ try {
102
+ res = await apiRequest('/api/cli/v1/tenants', {
103
+ method: 'POST',
104
+ token,
105
+ body: {
106
+ name: opts.name,
107
+ slug: opts.slug,
108
+ customerId: opts.customer,
109
+ productId: opts.product,
110
+ environmentId: opts.env,
111
+ primaryDomain: opts.domain,
112
+ },
113
+ });
114
+ spinner?.stop();
115
+ }
116
+ catch (error) {
117
+ spinner?.fail('Falha ao criar tenant.');
118
+ handleApiError(error, opts.json);
119
+ }
120
+ printWriteResult({ id: res.id }, `Tenant criado: ${res.id}`, opts.json);
121
+ }
122
+ export async function runTenantsUpdate(id, opts) {
123
+ if (!id) {
124
+ log.error('Uso: neetru tenants update <id> --name … --slug … --customer … --product … --env …');
125
+ process.exit(1);
126
+ }
127
+ const token = await requireToken(opts.json);
128
+ const spinner = opts.json ? null : ora({ text: `Atualizando tenant ${id}…`, color: 'blue' }).start();
129
+ try {
130
+ await apiRequest(`/api/cli/v1/tenants/${encodeURIComponent(id)}`, {
131
+ method: 'PATCH',
132
+ token,
133
+ body: {
134
+ name: opts.name,
135
+ slug: opts.slug,
136
+ customerId: opts.customer,
137
+ productId: opts.product,
138
+ environmentId: opts.env,
139
+ primaryDomain: opts.domain,
140
+ },
141
+ });
142
+ spinner?.stop();
143
+ }
144
+ catch (error) {
145
+ spinner?.fail('Falha ao atualizar tenant.');
146
+ handleApiError(error, opts.json);
147
+ }
148
+ printWriteResult({ id }, `Tenant ${id} atualizado.`, opts.json);
149
+ }
150
+ async function runTenantsStatusChange(id, action, opts) {
151
+ if (!id) {
152
+ log.error(`Uso: neetru tenants ${action} <id>`);
153
+ process.exit(1);
154
+ }
155
+ const token = await requireToken(opts.json);
156
+ if (action === 'suspend') {
157
+ await confirmDestructive(`Suspender o tenant ${id}? O acesso do cliente fica bloqueado até reativar.`, opts);
158
+ }
159
+ const spinner = opts.json
160
+ ? null
161
+ : ora({ text: `${action === 'suspend' ? 'Suspendendo' : 'Reativando'} tenant ${id}…`, color: 'blue' }).start();
162
+ let res;
163
+ try {
164
+ res = await apiRequest(`/api/cli/v1/tenants/${encodeURIComponent(id)}?action=${action}`, { method: 'POST', token });
165
+ spinner?.stop();
166
+ }
167
+ catch (error) {
168
+ spinner?.fail(`Falha ao ${action === 'suspend' ? 'suspender' : 'reativar'} tenant.`);
169
+ handleApiError(error, opts.json);
170
+ }
171
+ printWriteResult({ id: res.id, status: res.status }, `Tenant ${res.id} → ${res.status}`, opts.json);
172
+ }
173
+ export async function runTenantsSuspend(id, opts) {
174
+ return runTenantsStatusChange(id, 'suspend', opts);
175
+ }
176
+ export async function runTenantsReactivate(id, opts) {
177
+ return runTenantsStatusChange(id, 'reactivate', opts);
178
+ }
179
+ //# sourceMappingURL=tenants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tenants.js","sourceRoot":"","sources":["../../src/commands/tenants.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export interface WorkspacesCreateOptions {
2
+ product: string;
3
+ customer: string;
4
+ env: string;
5
+ tier: string;
6
+ name?: string;
7
+ json?: boolean;
8
+ }
9
+ export declare function runWorkspacesCreate(opts: WorkspacesCreateOptions): Promise<void>;
10
+ export interface WorkspacesAdvanceOptions {
11
+ product: string;
12
+ version: string;
13
+ json?: boolean;
14
+ }
15
+ export declare function runWorkspacesAdvance(id: string, opts: WorkspacesAdvanceOptions): Promise<void>;
@@ -0,0 +1,72 @@
1
+ /**
2
+ * `neetru workspaces create|advance` — control plane de workspaces (runtime
3
+ * shared `neetru-workspaces`).
4
+ *
5
+ * Endpoints:
6
+ * POST /api/cli/v1/workspaces (create)
7
+ * POST /api/cli/v1/workspaces/{id}/advance (advance — promove bundle)
8
+ */
9
+ import chalk from 'chalk';
10
+ import ora from 'ora';
11
+ import { apiRequest } from '../lib/api-client.js';
12
+ import { requireToken, handleApiError, printWriteResult } from '../lib/cli-write.js';
13
+ import { log } from '../utils/logger.js';
14
+ export async function runWorkspacesCreate(opts) {
15
+ const token = await requireToken(opts.json);
16
+ const spinner = opts.json
17
+ ? null
18
+ : ora({ text: 'Criando workspace…', color: 'blue' }).start();
19
+ let res;
20
+ try {
21
+ res = await apiRequest('/api/cli/v1/workspaces', {
22
+ method: 'POST',
23
+ token,
24
+ body: {
25
+ productId: opts.product,
26
+ customerId: opts.customer,
27
+ environmentId: opts.env,
28
+ resourceTier: opts.tier,
29
+ name: opts.name,
30
+ },
31
+ });
32
+ spinner?.stop();
33
+ }
34
+ catch (error) {
35
+ spinner?.fail('Falha ao criar workspace.');
36
+ handleApiError(error, opts.json);
37
+ }
38
+ if (opts.json) {
39
+ console.log(JSON.stringify(res));
40
+ return;
41
+ }
42
+ log.success(`Workspace criado: ${res.id}`);
43
+ log.dim(`Domínio: ${res.temporaryDomain} · status: ${res.status}`);
44
+ log.warn('OAuth client secret (one-time — guarde agora):');
45
+ console.log(` clientId: ${chalk.cyan(res.oauthClientId)}`);
46
+ console.log(` secret: ${chalk.yellow(res.oauthClientSecret)}`);
47
+ }
48
+ export async function runWorkspacesAdvance(id, opts) {
49
+ if (!id) {
50
+ log.error('Uso: neetru workspaces advance <workspaceId> --product <slug> --version <v>');
51
+ process.exit(1);
52
+ }
53
+ const token = await requireToken(opts.json);
54
+ const spinner = opts.json
55
+ ? null
56
+ : ora({ text: `Promovendo ${opts.product}@${opts.version} no workspace ${id}…`, color: 'blue' }).start();
57
+ let res;
58
+ try {
59
+ res = await apiRequest(`/api/cli/v1/workspaces/${encodeURIComponent(id)}/advance`, {
60
+ method: 'POST',
61
+ token,
62
+ body: { productSlug: opts.product, version: opts.version },
63
+ });
64
+ spinner?.stop();
65
+ }
66
+ catch (error) {
67
+ spinner?.fail('Falha ao avançar workspace.');
68
+ handleApiError(error, opts.json);
69
+ }
70
+ printWriteResult({ tenantId: res.tenantId, version: res.version, runtimeStatus: res.runtimeStatus }, `Workspace ${res.tenantId} → ${res.version} (${res.runtimeStatus})`, opts.json);
71
+ }
72
+ //# sourceMappingURL=workspaces.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspaces.js","sourceRoot":"","sources":["../../src/commands/workspaces.ts"],"names":[],"mappings":"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"}