@neetru/cli 2.3.0 → 2.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/deploy.js +8 -8
- package/dist/commands/deployments.d.ts +5 -5
- package/dist/commands/deployments.js +32 -6
- package/dist/commands/deployments.js.map +1 -1
- package/dist/commands/products-db.d.ts +9 -9
- package/dist/commands/products-db.js +84 -19
- package/dist/commands/products-db.js.map +1 -1
- package/dist/commands/products.d.ts +2 -2
- package/dist/commands/products.js +8 -6
- package/dist/commands/products.js.map +1 -1
- package/dist/commands/schema.d.ts +25 -0
- package/dist/commands/schema.js +321 -0
- package/dist/commands/schema.js.map +1 -0
- package/dist/commands/servers.d.ts +5 -5
- package/dist/commands/servers.js +25 -17
- package/dist/commands/servers.js.map +1 -1
- package/dist/commands/status.js +3 -2
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/tenants.d.ts +14 -14
- package/dist/commands/tenants.js +62 -30
- package/dist/commands/tenants.js.map +1 -1
- package/dist/commands/ui.d.ts +1 -0
- package/dist/commands/ui.js +454 -0
- package/dist/commands/ui.js.map +1 -0
- package/dist/commands/workspaces.d.ts +9 -9
- package/dist/commands/workspaces.js +66 -31
- package/dist/commands/workspaces.js.map +1 -1
- package/dist/index.js +95 -63
- package/dist/index.js.map +1 -1
- package/dist/lib/ai/orchestrator.js +46 -23
- package/dist/lib/ai/orchestrator.js.map +1 -1
- package/dist/lib/config-schema.d.ts +18 -18
- package/dist/lib/pickers.d.ts +123 -0
- package/dist/lib/pickers.js +336 -0
- package/dist/lib/pickers.js.map +1 -0
- package/dist/lib/schema-cache.d.ts +87 -0
- package/dist/lib/schema-cache.js +134 -0
- package/dist/lib/schema-cache.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import inquirer from 'inquirer';
|
|
3
|
+
import { apiRequest, CliApiError, CliNetworkError } from './api-client.js';
|
|
4
|
+
import { log } from '../utils/logger.js';
|
|
5
|
+
export function isInteractive(opts = {}) {
|
|
6
|
+
return (!opts.json &&
|
|
7
|
+
!opts.nonInteractive &&
|
|
8
|
+
process.env.CI !== 'true' &&
|
|
9
|
+
Boolean(process.stdin.isTTY) &&
|
|
10
|
+
Boolean(process.stdout.isTTY));
|
|
11
|
+
}
|
|
12
|
+
function failInput(message, json) {
|
|
13
|
+
if (json) {
|
|
14
|
+
console.log(JSON.stringify({ ok: false, error: 'missing_input', message }));
|
|
15
|
+
}
|
|
16
|
+
else {
|
|
17
|
+
log.error(message);
|
|
18
|
+
}
|
|
19
|
+
process.exit(1);
|
|
20
|
+
}
|
|
21
|
+
function failLookup(error, json) {
|
|
22
|
+
if (error instanceof CliApiError) {
|
|
23
|
+
if (json) {
|
|
24
|
+
console.log(JSON.stringify({
|
|
25
|
+
ok: false,
|
|
26
|
+
error: error.code,
|
|
27
|
+
status: error.status,
|
|
28
|
+
message: error.message,
|
|
29
|
+
}));
|
|
30
|
+
}
|
|
31
|
+
else if (error.status === 401) {
|
|
32
|
+
log.error('Nao autenticado. Execute: neetru login');
|
|
33
|
+
}
|
|
34
|
+
else if (error.status === 403) {
|
|
35
|
+
log.error(`Acesso negado: ${error.message}`);
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
log.error(`Erro do servidor (${error.status}): ${error.message}`);
|
|
39
|
+
}
|
|
40
|
+
process.exit(error.status === 401 ? 1 : 2);
|
|
41
|
+
}
|
|
42
|
+
if (error instanceof CliNetworkError) {
|
|
43
|
+
if (json) {
|
|
44
|
+
console.log(JSON.stringify({ ok: false, error: 'network', message: error.message }));
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
log.error(error.message);
|
|
48
|
+
}
|
|
49
|
+
process.exit(2);
|
|
50
|
+
}
|
|
51
|
+
if (json) {
|
|
52
|
+
console.log(JSON.stringify({
|
|
53
|
+
ok: false,
|
|
54
|
+
error: 'unknown',
|
|
55
|
+
message: error instanceof Error ? error.message : String(error),
|
|
56
|
+
}));
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
log.error(error instanceof Error ? error.message : String(error));
|
|
60
|
+
}
|
|
61
|
+
process.exit(2);
|
|
62
|
+
}
|
|
63
|
+
export async function resolveOrPick(opts) {
|
|
64
|
+
const flagged = opts.fromFlag?.trim();
|
|
65
|
+
if (flagged)
|
|
66
|
+
return flagged;
|
|
67
|
+
if (opts.json) {
|
|
68
|
+
failInput(`${opts.flagName} e obrigatorio em modo --json.`, true);
|
|
69
|
+
}
|
|
70
|
+
let items;
|
|
71
|
+
try {
|
|
72
|
+
items = await opts.fetcher();
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
failLookup(error, opts.json);
|
|
76
|
+
}
|
|
77
|
+
if (items.length === 0) {
|
|
78
|
+
failInput(opts.emptyError, opts.json);
|
|
79
|
+
}
|
|
80
|
+
if (items.length === 1) {
|
|
81
|
+
return opts.getId(items[0]);
|
|
82
|
+
}
|
|
83
|
+
if (!isInteractive(opts)) {
|
|
84
|
+
const available = items
|
|
85
|
+
.map((item) => ` - ${opts.getId(item)}: ${stripAnsi(opts.format(item))}`)
|
|
86
|
+
.join('\n');
|
|
87
|
+
failInput(`Multiplos candidatos encontrados. Passe ${opts.flagName} explicitamente.\nDisponiveis:\n${available}`, opts.json);
|
|
88
|
+
}
|
|
89
|
+
const choices = items.map((item) => ({
|
|
90
|
+
name: opts.format(item),
|
|
91
|
+
value: opts.getId(item),
|
|
92
|
+
short: opts.getId(item),
|
|
93
|
+
}));
|
|
94
|
+
if (opts.allowManual !== false) {
|
|
95
|
+
choices.push(new inquirer.Separator());
|
|
96
|
+
choices.push({ name: chalk.dim('Digitar ID manualmente'), value: '__manual__' });
|
|
97
|
+
}
|
|
98
|
+
const answer = await inquirer.prompt([
|
|
99
|
+
{
|
|
100
|
+
type: 'list',
|
|
101
|
+
name: 'picked',
|
|
102
|
+
message: opts.message,
|
|
103
|
+
choices,
|
|
104
|
+
pageSize: 12,
|
|
105
|
+
},
|
|
106
|
+
]);
|
|
107
|
+
if (answer.picked === '__manual__') {
|
|
108
|
+
return promptText('ID:', { required: true });
|
|
109
|
+
}
|
|
110
|
+
return answer.picked;
|
|
111
|
+
}
|
|
112
|
+
export async function promptText(message, opts = {}) {
|
|
113
|
+
if (!isInteractive(opts)) {
|
|
114
|
+
if (opts.default !== undefined)
|
|
115
|
+
return opts.default;
|
|
116
|
+
if (opts.required === false)
|
|
117
|
+
return '';
|
|
118
|
+
failInput(`Informe ${message}`, opts.json);
|
|
119
|
+
}
|
|
120
|
+
const answer = await inquirer.prompt([
|
|
121
|
+
{
|
|
122
|
+
type: 'input',
|
|
123
|
+
name: 'value',
|
|
124
|
+
message,
|
|
125
|
+
default: opts.default,
|
|
126
|
+
validate: (value) => {
|
|
127
|
+
const trimmed = value.trim();
|
|
128
|
+
if (opts.validate)
|
|
129
|
+
return opts.validate(trimmed);
|
|
130
|
+
if (opts.required !== false && trimmed.length === 0)
|
|
131
|
+
return 'Obrigatorio.';
|
|
132
|
+
return true;
|
|
133
|
+
},
|
|
134
|
+
},
|
|
135
|
+
]);
|
|
136
|
+
return answer.value.trim();
|
|
137
|
+
}
|
|
138
|
+
export async function promptChoice(message, choices, opts = {}) {
|
|
139
|
+
if (!isInteractive(opts)) {
|
|
140
|
+
if (opts.default !== undefined)
|
|
141
|
+
return opts.default;
|
|
142
|
+
failInput(`Escolha ${message}`, opts.json);
|
|
143
|
+
}
|
|
144
|
+
const answer = await inquirer.prompt([
|
|
145
|
+
{
|
|
146
|
+
type: 'list',
|
|
147
|
+
name: 'picked',
|
|
148
|
+
message,
|
|
149
|
+
choices,
|
|
150
|
+
default: opts.default,
|
|
151
|
+
pageSize: 10,
|
|
152
|
+
},
|
|
153
|
+
]);
|
|
154
|
+
return answer.picked;
|
|
155
|
+
}
|
|
156
|
+
export async function resolveCustomer(opts = {}) {
|
|
157
|
+
const flagged = opts.fromFlag?.trim();
|
|
158
|
+
if (flagged)
|
|
159
|
+
return flagged;
|
|
160
|
+
if (!isInteractive(opts))
|
|
161
|
+
return 'self';
|
|
162
|
+
const picked = await promptChoice('Cliente do workspace:', [
|
|
163
|
+
{ name: 'Neetru/default interno', value: 'self' },
|
|
164
|
+
{ name: 'Digitar customerId manualmente', value: 'manual' },
|
|
165
|
+
], { default: 'self' });
|
|
166
|
+
if (picked === 'manual') {
|
|
167
|
+
return promptText('customerId:', { required: true });
|
|
168
|
+
}
|
|
169
|
+
return 'self';
|
|
170
|
+
}
|
|
171
|
+
export async function listProducts(token) {
|
|
172
|
+
const res = await apiRequest('/api/cli/v1/products', { token });
|
|
173
|
+
return res.products ?? res.items ?? [];
|
|
174
|
+
}
|
|
175
|
+
export async function listTenants(token, filters = {}) {
|
|
176
|
+
const params = new URLSearchParams();
|
|
177
|
+
if (filters.product)
|
|
178
|
+
params.set('product', filters.product);
|
|
179
|
+
if (filters.status)
|
|
180
|
+
params.set('status', filters.status);
|
|
181
|
+
const qs = params.toString();
|
|
182
|
+
const res = await apiRequest(`/api/cli/v1/tenants${qs ? `?${qs}` : ''}`, { token });
|
|
183
|
+
return res.tenants ?? res.items ?? [];
|
|
184
|
+
}
|
|
185
|
+
export async function listWorkspaces(token, filters = {}) {
|
|
186
|
+
return listTenants(token, filters);
|
|
187
|
+
}
|
|
188
|
+
export async function listServers(token, filters = {}) {
|
|
189
|
+
const params = new URLSearchParams();
|
|
190
|
+
if (filters.status)
|
|
191
|
+
params.set('status', filters.status);
|
|
192
|
+
if (filters.capacity)
|
|
193
|
+
params.set('capacity', 'true');
|
|
194
|
+
const qs = params.toString();
|
|
195
|
+
const res = await apiRequest(`/api/cli/v1/servers${qs ? `?${qs}` : ''}`, { token });
|
|
196
|
+
return res.servers ?? res.items ?? [];
|
|
197
|
+
}
|
|
198
|
+
export async function listProductDatabases(token, filters = {}) {
|
|
199
|
+
const params = new URLSearchParams();
|
|
200
|
+
if (filters.productId)
|
|
201
|
+
params.set('productId', filters.productId);
|
|
202
|
+
if (filters.engine)
|
|
203
|
+
params.set('engine', filters.engine);
|
|
204
|
+
if (filters.status)
|
|
205
|
+
params.set('status', filters.status);
|
|
206
|
+
const qs = params.toString();
|
|
207
|
+
const res = await apiRequest(`/api/cli/v1/db/list${qs ? `?${qs}` : ''}`, { token });
|
|
208
|
+
return res.databases ?? res.items ?? [];
|
|
209
|
+
}
|
|
210
|
+
export function productLabel(product) {
|
|
211
|
+
const name = product.name ?? product.slug ?? product.id;
|
|
212
|
+
const slug = product.slug ? chalk.dim(`(${product.slug})`) : '';
|
|
213
|
+
const status = product.status ? chalk.dim(`- ${product.status}`) : '';
|
|
214
|
+
const team = product.ownerTeam ? chalk.dim(`- ${product.ownerTeam}`) : '';
|
|
215
|
+
return compact([statusDot(product.status), chalk.bold(name), slug, status, team]).join(' ');
|
|
216
|
+
}
|
|
217
|
+
export async function pickProductId(token, opts = {}) {
|
|
218
|
+
return resolveOrPick({
|
|
219
|
+
...opts,
|
|
220
|
+
fetcher: () => listProducts(token),
|
|
221
|
+
format: productLabel,
|
|
222
|
+
getId: (product) => product.id,
|
|
223
|
+
message: opts.message ?? 'Escolha o produto:',
|
|
224
|
+
emptyError: 'Nenhum produto encontrado. Crie com: neetru products create',
|
|
225
|
+
flagName: '--product',
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
export async function pickProductSlug(token, opts = {}) {
|
|
229
|
+
return resolveOrPick({
|
|
230
|
+
...opts,
|
|
231
|
+
fetcher: () => listProducts(token),
|
|
232
|
+
format: productLabel,
|
|
233
|
+
getId: (product) => product.slug ?? product.id,
|
|
234
|
+
message: opts.message ?? 'Escolha o produto:',
|
|
235
|
+
emptyError: 'Nenhum produto encontrado. Crie com: neetru products create',
|
|
236
|
+
flagName: '--product',
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
export async function pickTenant(token, opts = {}) {
|
|
240
|
+
return resolveOrPick({
|
|
241
|
+
...opts,
|
|
242
|
+
fetcher: () => listTenants(token, { product: opts.product, status: opts.status }),
|
|
243
|
+
format: tenantLabel,
|
|
244
|
+
getId: (tenant) => tenant.id,
|
|
245
|
+
message: opts.message ?? 'Escolha o tenant:',
|
|
246
|
+
emptyError: 'Nenhum tenant encontrado no escopo atual.',
|
|
247
|
+
flagName: '--tenant',
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
export async function pickWorkspace(token, opts = {}) {
|
|
251
|
+
return resolveOrPick({
|
|
252
|
+
...opts,
|
|
253
|
+
fetcher: () => listWorkspaces(token, { product: opts.product, status: opts.status }),
|
|
254
|
+
format: workspaceLabel,
|
|
255
|
+
getId: (workspace) => workspace.id,
|
|
256
|
+
message: opts.message ?? 'Escolha o workspace:',
|
|
257
|
+
emptyError: 'Nenhum workspace encontrado no escopo atual.',
|
|
258
|
+
flagName: '<workspaceId>',
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
export async function pickServer(token, opts = {}) {
|
|
262
|
+
return resolveOrPick({
|
|
263
|
+
...opts,
|
|
264
|
+
fetcher: () => listServers(token, { status: opts.status, capacity: opts.capacity }),
|
|
265
|
+
format: serverLabel,
|
|
266
|
+
getId: (server) => server.id,
|
|
267
|
+
message: opts.message ?? 'Escolha o server:',
|
|
268
|
+
emptyError: 'Nenhum server encontrado no escopo atual.',
|
|
269
|
+
flagName: '--server',
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
export async function pickDatabase(token, opts = {}) {
|
|
273
|
+
return resolveOrPick({
|
|
274
|
+
...opts,
|
|
275
|
+
fetcher: () => listProductDatabases(token, {
|
|
276
|
+
productId: opts.productId,
|
|
277
|
+
engine: opts.engine,
|
|
278
|
+
status: opts.status,
|
|
279
|
+
}),
|
|
280
|
+
format: databaseLabel,
|
|
281
|
+
getId: (database) => database.id,
|
|
282
|
+
message: opts.message ?? 'Escolha o banco:',
|
|
283
|
+
emptyError: 'Nenhum banco encontrado no escopo atual.',
|
|
284
|
+
flagName: '<id>',
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
function workspaceLabel(workspace) {
|
|
288
|
+
const name = workspace.name ?? workspace.slug ?? workspace.id;
|
|
289
|
+
const product = workspace.productId ? chalk.dim(`- product=${workspace.productId}`) : '';
|
|
290
|
+
const env = workspace.environmentId ? chalk.dim(`- env=${workspace.environmentId}`) : '';
|
|
291
|
+
const domain = workspace.primaryDomain ?? workspace.temporaryDomain;
|
|
292
|
+
const domainLabel = domain ? chalk.dim(`- ${domain}`) : '';
|
|
293
|
+
return compact([statusDot(workspace.status), chalk.bold(name), product, env, domainLabel]).join(' ');
|
|
294
|
+
}
|
|
295
|
+
function tenantLabel(tenant) {
|
|
296
|
+
const name = tenant.name ?? tenant.slug ?? tenant.id;
|
|
297
|
+
const product = tenant.productId ? chalk.dim(`- product=${tenant.productId}`) : '';
|
|
298
|
+
const env = tenant.environmentId ? chalk.dim(`- env=${tenant.environmentId}`) : '';
|
|
299
|
+
return compact([statusDot(tenant.status), chalk.bold(name), product, env]).join(' ');
|
|
300
|
+
}
|
|
301
|
+
function serverLabel(server) {
|
|
302
|
+
const name = server.name ?? server.id;
|
|
303
|
+
const region = server.region ? chalk.dim(`- ${server.region}`) : '';
|
|
304
|
+
const ip = server.ipAddress ?? server.ip;
|
|
305
|
+
const ipLabel = ip ? chalk.dim(`- ${ip}`) : '';
|
|
306
|
+
const ram = server.availableRamMb != null
|
|
307
|
+
? chalk.dim(`- ${server.availableRamMb}/${server.totalRamMb ?? '?'}MB`)
|
|
308
|
+
: '';
|
|
309
|
+
return compact([statusDot(server.status), chalk.bold(name), region, ipLabel, ram]).join(' ');
|
|
310
|
+
}
|
|
311
|
+
function databaseLabel(database) {
|
|
312
|
+
const label = database.label ?? database.id;
|
|
313
|
+
const product = chalk.dim(`- product=${database.productId}`);
|
|
314
|
+
const engine = database.engine ? chalk.dim(`- ${database.engine}`) : '';
|
|
315
|
+
const env = database.environment ? chalk.dim(`- env=${database.environment}`) : '';
|
|
316
|
+
return compact([statusDot(database.status), chalk.bold(label), product, engine, env]).join(' ');
|
|
317
|
+
}
|
|
318
|
+
function statusDot(status) {
|
|
319
|
+
if (!status)
|
|
320
|
+
return chalk.dim('-');
|
|
321
|
+
if (['ativo', 'active', 'online', 'running'].includes(status))
|
|
322
|
+
return chalk.green('*');
|
|
323
|
+
if (['suspenso', 'suspended', 'offline', 'failed', 'error'].includes(status))
|
|
324
|
+
return chalk.red('*');
|
|
325
|
+
if (['em provisionamento', 'provisioning', 'pending'].includes(status))
|
|
326
|
+
return chalk.yellow('*');
|
|
327
|
+
return chalk.dim('*');
|
|
328
|
+
}
|
|
329
|
+
function compact(values) {
|
|
330
|
+
return values.filter((value) => value.trim().length > 0);
|
|
331
|
+
}
|
|
332
|
+
function stripAnsi(value) {
|
|
333
|
+
// eslint-disable-next-line no-control-regex
|
|
334
|
+
return value.replace(/\x1b\[[0-9;]*m/g, '');
|
|
335
|
+
}
|
|
336
|
+
//# sourceMappingURL=pickers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pickers.js","sourceRoot":"","sources":["../../src/lib/pickers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
export interface OpenApiSpec {
|
|
2
|
+
openapi: string;
|
|
3
|
+
info: {
|
|
4
|
+
title: string;
|
|
5
|
+
version: string;
|
|
6
|
+
description?: string;
|
|
7
|
+
};
|
|
8
|
+
paths?: Record<string, OpenApiPathItem>;
|
|
9
|
+
components?: {
|
|
10
|
+
schemas?: Record<string, unknown>;
|
|
11
|
+
[key: string]: unknown;
|
|
12
|
+
};
|
|
13
|
+
tags?: Array<{
|
|
14
|
+
name: string;
|
|
15
|
+
description?: string;
|
|
16
|
+
}>;
|
|
17
|
+
servers?: Array<{
|
|
18
|
+
url: string;
|
|
19
|
+
description?: string;
|
|
20
|
+
}>;
|
|
21
|
+
[key: string]: unknown;
|
|
22
|
+
}
|
|
23
|
+
export interface OpenApiPathItem {
|
|
24
|
+
[method: string]: OpenApiOperation | unknown;
|
|
25
|
+
}
|
|
26
|
+
export interface OpenApiOperation {
|
|
27
|
+
summary?: string;
|
|
28
|
+
description?: string;
|
|
29
|
+
operationId?: string;
|
|
30
|
+
tags?: string[];
|
|
31
|
+
parameters?: unknown[];
|
|
32
|
+
requestBody?: unknown;
|
|
33
|
+
responses?: Record<string, unknown>;
|
|
34
|
+
security?: unknown[];
|
|
35
|
+
}
|
|
36
|
+
export interface EndpointEntry {
|
|
37
|
+
method: string;
|
|
38
|
+
path: string;
|
|
39
|
+
summary: string;
|
|
40
|
+
tags: string[];
|
|
41
|
+
operationId: string;
|
|
42
|
+
}
|
|
43
|
+
export interface EndpointDetail {
|
|
44
|
+
method: string;
|
|
45
|
+
path: string;
|
|
46
|
+
summary: string;
|
|
47
|
+
description: string;
|
|
48
|
+
operationId: string;
|
|
49
|
+
tags: string[];
|
|
50
|
+
parameters: unknown[];
|
|
51
|
+
requestBody: unknown;
|
|
52
|
+
responses: Record<string, unknown>;
|
|
53
|
+
security: unknown[];
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Retorna a spec OpenAPI do Neetru Core.
|
|
57
|
+
*
|
|
58
|
+
* - Se houver cache válido (< 24h) E `refresh !== true`: retorna o cache.
|
|
59
|
+
* - Caso contrário: faz fetch de `/api/internal/openapi.json`, atualiza cache e retorna.
|
|
60
|
+
*
|
|
61
|
+
* @throws {CliApiError | CliNetworkError} em caso de falha no fetch.
|
|
62
|
+
*/
|
|
63
|
+
export declare function getCachedSchema(refresh?: boolean): Promise<OpenApiSpec>;
|
|
64
|
+
/**
|
|
65
|
+
* Retorna o caminho e metadados do cache atual (usado por `schema validate`).
|
|
66
|
+
*/
|
|
67
|
+
export declare function getCacheInfo(): {
|
|
68
|
+
path: string;
|
|
69
|
+
exists: boolean;
|
|
70
|
+
ageMs: number | null;
|
|
71
|
+
stale: boolean;
|
|
72
|
+
};
|
|
73
|
+
/**
|
|
74
|
+
* Lista todos os endpoints registrados na spec.
|
|
75
|
+
*
|
|
76
|
+
* @returns Array de `{method, path, summary, tags, operationId}` ordenado por path+method.
|
|
77
|
+
*/
|
|
78
|
+
export declare function listEndpoints(spec: OpenApiSpec): EndpointEntry[];
|
|
79
|
+
/**
|
|
80
|
+
* Retorna detalhes completos de um endpoint específico (requestBody, responses, parameters).
|
|
81
|
+
*
|
|
82
|
+
* @param spec - Spec OpenAPI
|
|
83
|
+
* @param method - Método HTTP (case-insensitive, ex: "GET", "post")
|
|
84
|
+
* @param endpointPath - Path exato (ex: "/api/cli/v1/tenants")
|
|
85
|
+
* @returns `EndpointDetail` ou `null` se não encontrado.
|
|
86
|
+
*/
|
|
87
|
+
export declare function describeEndpoint(spec: OpenApiSpec, method: string, endpointPath: string): EndpointDetail | null;
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cache local da spec OpenAPI do Neetru Core.
|
|
3
|
+
*
|
|
4
|
+
* Salva em `~/.config/neetru-cli/schema.json` (via Conf path) com TTL de 24h.
|
|
5
|
+
* Se expirado ou `refresh=true`, faz fetch de `/api/internal/openapi.json`.
|
|
6
|
+
*
|
|
7
|
+
* Helpers pra IA consumir: `listEndpoints` e `describeEndpoint`.
|
|
8
|
+
*/
|
|
9
|
+
import fs from 'node:fs';
|
|
10
|
+
import path from 'node:path';
|
|
11
|
+
import os from 'node:os';
|
|
12
|
+
import { apiRequest } from './api-client.js';
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
// Path de cache
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
const TTL_MS = 24 * 60 * 60 * 1000; // 24h
|
|
17
|
+
/** Caminho do arquivo de cache — `~/.config/neetru-cli/schema.json`. */
|
|
18
|
+
function getCachePath() {
|
|
19
|
+
// Respeita XDG_CONFIG_HOME se definido, caso contrário usa $HOME/.config
|
|
20
|
+
const configHome = process.env.XDG_CONFIG_HOME ?? path.join(os.homedir(), '.config');
|
|
21
|
+
return path.join(configHome, 'neetru-cli', 'schema.json');
|
|
22
|
+
}
|
|
23
|
+
function readCache() {
|
|
24
|
+
const p = getCachePath();
|
|
25
|
+
try {
|
|
26
|
+
const raw = fs.readFileSync(p, 'utf-8');
|
|
27
|
+
return JSON.parse(raw);
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
function writeCache(spec) {
|
|
34
|
+
const p = getCachePath();
|
|
35
|
+
fs.mkdirSync(path.dirname(p), { recursive: true });
|
|
36
|
+
const envelope = { fetchedAt: Date.now(), spec };
|
|
37
|
+
fs.writeFileSync(p, JSON.stringify(envelope, null, 2), 'utf-8');
|
|
38
|
+
}
|
|
39
|
+
// ---------------------------------------------------------------------------
|
|
40
|
+
// getCachedSchema
|
|
41
|
+
// ---------------------------------------------------------------------------
|
|
42
|
+
/**
|
|
43
|
+
* Retorna a spec OpenAPI do Neetru Core.
|
|
44
|
+
*
|
|
45
|
+
* - Se houver cache válido (< 24h) E `refresh !== true`: retorna o cache.
|
|
46
|
+
* - Caso contrário: faz fetch de `/api/internal/openapi.json`, atualiza cache e retorna.
|
|
47
|
+
*
|
|
48
|
+
* @throws {CliApiError | CliNetworkError} em caso de falha no fetch.
|
|
49
|
+
*/
|
|
50
|
+
export async function getCachedSchema(refresh = false) {
|
|
51
|
+
if (!refresh) {
|
|
52
|
+
const cached = readCache();
|
|
53
|
+
if (cached && Date.now() - cached.fetchedAt < TTL_MS) {
|
|
54
|
+
return cached.spec;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
const spec = await apiRequest('/api/internal/openapi.json');
|
|
58
|
+
writeCache(spec);
|
|
59
|
+
return spec;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Retorna o caminho e metadados do cache atual (usado por `schema validate`).
|
|
63
|
+
*/
|
|
64
|
+
export function getCacheInfo() {
|
|
65
|
+
const p = getCachePath();
|
|
66
|
+
const cached = readCache();
|
|
67
|
+
if (!cached) {
|
|
68
|
+
return { path: p, exists: false, ageMs: null, stale: true };
|
|
69
|
+
}
|
|
70
|
+
const ageMs = Date.now() - cached.fetchedAt;
|
|
71
|
+
return { path: p, exists: true, ageMs, stale: ageMs > TTL_MS };
|
|
72
|
+
}
|
|
73
|
+
// ---------------------------------------------------------------------------
|
|
74
|
+
// Helpers de consulta da spec
|
|
75
|
+
// ---------------------------------------------------------------------------
|
|
76
|
+
const HTTP_METHODS = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace'];
|
|
77
|
+
/**
|
|
78
|
+
* Lista todos os endpoints registrados na spec.
|
|
79
|
+
*
|
|
80
|
+
* @returns Array de `{method, path, summary, tags, operationId}` ordenado por path+method.
|
|
81
|
+
*/
|
|
82
|
+
export function listEndpoints(spec) {
|
|
83
|
+
const results = [];
|
|
84
|
+
const paths = spec.paths ?? {};
|
|
85
|
+
for (const [p, pathItem] of Object.entries(paths)) {
|
|
86
|
+
if (!pathItem || typeof pathItem !== 'object')
|
|
87
|
+
continue;
|
|
88
|
+
for (const method of HTTP_METHODS) {
|
|
89
|
+
const op = pathItem[method];
|
|
90
|
+
if (!op || typeof op !== 'object')
|
|
91
|
+
continue;
|
|
92
|
+
results.push({
|
|
93
|
+
method: method.toUpperCase(),
|
|
94
|
+
path: p,
|
|
95
|
+
summary: op.summary ?? '',
|
|
96
|
+
tags: op.tags ?? [],
|
|
97
|
+
operationId: op.operationId ?? '',
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return results.sort((a, b) => {
|
|
102
|
+
const pa = a.path.localeCompare(b.path);
|
|
103
|
+
return pa !== 0 ? pa : a.method.localeCompare(b.method);
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Retorna detalhes completos de um endpoint específico (requestBody, responses, parameters).
|
|
108
|
+
*
|
|
109
|
+
* @param spec - Spec OpenAPI
|
|
110
|
+
* @param method - Método HTTP (case-insensitive, ex: "GET", "post")
|
|
111
|
+
* @param endpointPath - Path exato (ex: "/api/cli/v1/tenants")
|
|
112
|
+
* @returns `EndpointDetail` ou `null` se não encontrado.
|
|
113
|
+
*/
|
|
114
|
+
export function describeEndpoint(spec, method, endpointPath) {
|
|
115
|
+
const pathItem = (spec.paths ?? {})[endpointPath];
|
|
116
|
+
if (!pathItem)
|
|
117
|
+
return null;
|
|
118
|
+
const op = pathItem[method.toLowerCase()];
|
|
119
|
+
if (!op)
|
|
120
|
+
return null;
|
|
121
|
+
return {
|
|
122
|
+
method: method.toUpperCase(),
|
|
123
|
+
path: endpointPath,
|
|
124
|
+
summary: op.summary ?? '',
|
|
125
|
+
description: op.description ?? '',
|
|
126
|
+
operationId: op.operationId ?? '',
|
|
127
|
+
tags: op.tags ?? [],
|
|
128
|
+
parameters: op.parameters ?? [],
|
|
129
|
+
requestBody: op.requestBody ?? null,
|
|
130
|
+
responses: op.responses ?? {},
|
|
131
|
+
security: op.security ?? [],
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=schema-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-cache.js","sourceRoot":"","sources":["../../src/lib/schema-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,UAAU,EAAgC,MAAM,iBAAiB,CAAC;AA2D3E,8EAA8E;AAC9E,gBAAgB;AAChB,8EAA8E;AAE9E,MAAM,MAAM,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,MAAM;AAE1C,wEAAwE;AACxE,SAAS,YAAY;IACnB,yEAAyE;IACzE,MAAM,UAAU,GACd,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;IACpE,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,EAAE,aAAa,CAAC,CAAC;AAC5D,CAAC;AAOD,SAAS,SAAS;IAChB,MAAM,CAAC,GAAG,YAAY,EAAE,CAAC;IACzB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QACxC,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAkB,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,IAAiB;IACnC,MAAM,CAAC,GAAG,YAAY,EAAE,CAAC;IACzB,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,MAAM,QAAQ,GAAkB,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC;IAChE,EAAE,CAAC,aAAa,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AAClE,CAAC;AAED,8EAA8E;AAC9E,kBAAkB;AAClB,8EAA8E;AAE9E;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAAO,GAAG,KAAK;IACnD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,IAAI,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,SAAS,GAAG,MAAM,EAAE,CAAC;YACrD,OAAO,MAAM,CAAC,IAAI,CAAC;QACrB,CAAC;IACH,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,UAAU,CAAc,4BAA4B,CAAC,CAAC;IACzE,UAAU,CAAC,IAAI,CAAC,CAAC;IACjB,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY;IAC1B,MAAM,CAAC,GAAG,YAAY,EAAE,CAAC;IACzB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAC9D,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC;IAC5C,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,GAAG,MAAM,EAAE,CAAC;AACjE,CAAC;AAED,8EAA8E;AAC9E,8BAA8B;AAC9B,8EAA8E;AAE9E,MAAM,YAAY,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;AAE3F;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,IAAiB;IAC7C,MAAM,OAAO,GAAoB,EAAE,CAAC;IACpC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;IAE/B,KAAK,MAAM,CAAC,CAAC,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAClD,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ;YAAE,SAAS;QACxD,KAAK,MAAM,MAAM,IAAI,YAAY,EAAE,CAAC;YAClC,MAAM,EAAE,GAAI,QAAoC,CAAC,MAAM,CAAiC,CAAC;YACzF,IAAI,CAAC,EAAE,IAAI,OAAO,EAAE,KAAK,QAAQ;gBAAE,SAAS;YAC5C,OAAO,CAAC,IAAI,CAAC;gBACX,MAAM,EAAE,MAAM,CAAC,WAAW,EAAE;gBAC5B,IAAI,EAAE,CAAC;gBACP,OAAO,EAAE,EAAE,CAAC,OAAO,IAAI,EAAE;gBACzB,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,EAAE;gBACnB,WAAW,EAAE,EAAE,CAAC,WAAW,IAAI,EAAE;aAClC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAC3B,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACxC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,gBAAgB,CAC9B,IAAiB,EACjB,MAAc,EACd,YAAoB;IAEpB,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,YAAY,CAAwC,CAAC;IACzF,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAE3B,MAAM,EAAE,GAAG,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,CAAiC,CAAC;IAC1E,IAAI,CAAC,EAAE;QAAE,OAAO,IAAI,CAAC;IAErB,OAAO;QACL,MAAM,EAAE,MAAM,CAAC,WAAW,EAAE;QAC5B,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,EAAE,CAAC,OAAO,IAAI,EAAE;QACzB,WAAW,EAAE,EAAE,CAAC,WAAW,IAAI,EAAE;QACjC,WAAW,EAAE,EAAE,CAAC,WAAW,IAAI,EAAE;QACjC,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,EAAE;QACnB,UAAU,EAAG,EAAE,CAAC,UAAwB,IAAI,EAAE;QAC9C,WAAW,EAAE,EAAE,CAAC,WAAW,IAAI,IAAI;QACnC,SAAS,EAAG,EAAE,CAAC,SAAqC,IAAI,EAAE;QAC1D,QAAQ,EAAG,EAAE,CAAC,QAAsB,IAAI,EAAE;KAC3C,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED