@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.
- package/dist/commands/agent-release.d.ts +13 -0
- package/dist/commands/agent-release.js +204 -0
- package/dist/commands/agent-release.js.map +1 -0
- package/dist/commands/agent-write.d.ts +12 -0
- package/dist/commands/agent-write.js +94 -0
- package/dist/commands/agent-write.js.map +1 -0
- package/dist/commands/api-catalog.d.ts +20 -0
- package/dist/commands/api-catalog.js +126 -0
- package/dist/commands/api-catalog.js.map +1 -0
- package/dist/commands/audit.d.ts +8 -0
- package/dist/commands/audit.js +69 -0
- package/dist/commands/audit.js.map +1 -0
- package/dist/commands/billing.d.ts +6 -0
- package/dist/commands/billing.js +69 -0
- package/dist/commands/billing.js.map +1 -0
- package/dist/commands/build.js +10 -3
- package/dist/commands/build.js.map +1 -1
- package/dist/commands/cloud-run.d.ts +11 -0
- package/dist/commands/cloud-run.js +87 -0
- package/dist/commands/cloud-run.js.map +1 -0
- package/dist/commands/deploy.d.ts +7 -0
- package/dist/commands/deploy.js +150 -17
- package/dist/commands/deploy.js.map +1 -1
- package/dist/commands/deployments.d.ts +11 -0
- package/dist/commands/deployments.js +69 -0
- package/dist/commands/deployments.js.map +1 -0
- package/dist/commands/dr.d.ts +11 -0
- package/dist/commands/dr.js +79 -0
- package/dist/commands/dr.js.map +1 -0
- package/dist/commands/infra-read.d.ts +9 -0
- package/dist/commands/infra-read.js +113 -0
- package/dist/commands/infra-read.js.map +1 -0
- package/dist/commands/init.d.ts +13 -1
- package/dist/commands/init.js +327 -70
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/products-db.d.ts +37 -0
- package/dist/commands/products-db.js +230 -0
- package/dist/commands/products-db.js.map +1 -0
- package/dist/commands/products.d.ts +12 -0
- package/dist/commands/products.js +97 -0
- package/dist/commands/products.js.map +1 -0
- package/dist/commands/servers.d.ts +23 -0
- package/dist/commands/servers.js +166 -0
- package/dist/commands/servers.js.map +1 -0
- package/dist/commands/support.d.ts +25 -0
- package/dist/commands/support.js +184 -0
- package/dist/commands/support.js.map +1 -0
- package/dist/commands/surface-status.d.ts +5 -0
- package/dist/commands/surface-status.js +63 -0
- package/dist/commands/surface-status.js.map +1 -0
- package/dist/commands/tenants.d.ts +34 -0
- package/dist/commands/tenants.js +179 -0
- package/dist/commands/tenants.js.map +1 -0
- package/dist/commands/workspaces.d.ts +15 -0
- package/dist/commands/workspaces.js +72 -0
- package/dist/commands/workspaces.js.map +1 -0
- package/dist/index.js +775 -6
- package/dist/index.js.map +1 -1
- package/dist/lib/api-client.d.ts +18 -0
- package/dist/lib/api-client.js +124 -4
- package/dist/lib/api-client.js.map +1 -1
- package/dist/lib/cli-read.d.ts +13 -0
- package/dist/lib/cli-read.js +103 -0
- package/dist/lib/cli-read.js.map +1 -0
- package/dist/lib/cli-write.d.ts +47 -0
- package/dist/lib/cli-write.js +137 -0
- package/dist/lib/cli-write.js.map +1 -0
- package/dist/lib/config-schema.d.ts +10 -10
- package/dist/lib/render.d.ts +16 -0
- package/dist/lib/render.js +74 -0
- package/dist/lib/render.js.map +1 -0
- package/package.json +4 -4
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface AgentReleaseOptions {
|
|
2
|
+
version: string;
|
|
3
|
+
channel?: string;
|
|
4
|
+
changelog?: string;
|
|
5
|
+
minCore?: string;
|
|
6
|
+
/** lista de "arch=path/to/binary" que será sha256-eado e tamanho-medido localmente */
|
|
7
|
+
binary?: string[];
|
|
8
|
+
/** lista de "arch=URL@sha256@sizeBytes" pra usar valores explícitos sem tocar no FS */
|
|
9
|
+
artifact?: string[];
|
|
10
|
+
/** se setado, só monta o payload e imprime, não chama API */
|
|
11
|
+
dryRun?: boolean;
|
|
12
|
+
}
|
|
13
|
+
export declare function runAgentRelease(opts: AgentReleaseOptions): Promise<void>;
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `neetru agent release` — publica nova release do agente Neetru.
|
|
3
|
+
*
|
|
4
|
+
* Fluxo completo (manual hoje, CI futuro):
|
|
5
|
+
* 1. Build local: `cd agent/ && npm run release:linux-x64`
|
|
6
|
+
* 2. Upload manual: `gsutil cp agent/neetru-agent-linux-x64 gs://neetru-agent-releases/releases/{version}/`
|
|
7
|
+
* + `gsutil cp agent/neetru-agent-linux-x64.sha256 gs://...`
|
|
8
|
+
* 3. **Este comando** — registra `agent_releases/{version}` no Firestore via
|
|
9
|
+
* Bearer token + Server Action. Idempotente.
|
|
10
|
+
*
|
|
11
|
+
* Backend: `POST api.neetru.com/cli/v1/agent/release` (Bearer token nrt_*),
|
|
12
|
+
* exige role `admin` em `cli_api_keys/{keyId}`.
|
|
13
|
+
*
|
|
14
|
+
* Roadmap:
|
|
15
|
+
* - Sprint futura: comando `--upload` que faz GCS upload + sha256 + register
|
|
16
|
+
* numa só chamada (precisa de credenciais GCP locais ou signed URL via Core).
|
|
17
|
+
*/
|
|
18
|
+
import * as fs from 'node:fs/promises';
|
|
19
|
+
import * as fsSync from 'node:fs';
|
|
20
|
+
import * as path from 'node:path';
|
|
21
|
+
import { createHash } from 'node:crypto';
|
|
22
|
+
import chalk from 'chalk';
|
|
23
|
+
import { log } from '../utils/logger.js';
|
|
24
|
+
import { apiRequest, CliApiError, CliNetworkError } from '../lib/api-client.js';
|
|
25
|
+
const VALID_CHANNELS = ['stable', 'beta', 'canary'];
|
|
26
|
+
const VALID_ARCHS = ['linux-x64', 'linux-arm64', 'darwin-x64', 'darwin-arm64'];
|
|
27
|
+
const SEMVER_RE = /^\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.-]+)?$/;
|
|
28
|
+
const SHA256_RE = /^[a-f0-9]{64}$/;
|
|
29
|
+
const GCS_BASE = 'https://storage.googleapis.com/neetru-agent-releases/releases';
|
|
30
|
+
function isArch(s) {
|
|
31
|
+
return VALID_ARCHS.includes(s);
|
|
32
|
+
}
|
|
33
|
+
function isChannel(s) {
|
|
34
|
+
return VALID_CHANNELS.includes(s);
|
|
35
|
+
}
|
|
36
|
+
async function sha256File(filePath) {
|
|
37
|
+
const buf = await fs.readFile(filePath);
|
|
38
|
+
const sha256 = createHash('sha256').update(buf).digest('hex');
|
|
39
|
+
return { sha256, sizeBytes: buf.length };
|
|
40
|
+
}
|
|
41
|
+
async function loadChangelogFromFile(filePath) {
|
|
42
|
+
const abs = path.resolve(process.cwd(), filePath);
|
|
43
|
+
return fs.readFile(abs, 'utf8');
|
|
44
|
+
}
|
|
45
|
+
function parseBinaryArg(arg) {
|
|
46
|
+
const idx = arg.indexOf('=');
|
|
47
|
+
if (idx < 0)
|
|
48
|
+
throw new Error(`--binary inválido "${arg}". Esperado "arch=path".`);
|
|
49
|
+
const arch = arg.slice(0, idx);
|
|
50
|
+
const filePath = arg.slice(idx + 1);
|
|
51
|
+
if (!isArch(arch)) {
|
|
52
|
+
throw new Error(`--binary com arch inválido "${arch}". Válidos: ${VALID_ARCHS.join(', ')}`);
|
|
53
|
+
}
|
|
54
|
+
if (!filePath || !fsSync.existsSync(filePath)) {
|
|
55
|
+
throw new Error(`--binary path não encontrado: ${filePath}`);
|
|
56
|
+
}
|
|
57
|
+
return { arch, filePath };
|
|
58
|
+
}
|
|
59
|
+
function parseArtifactArg(arg) {
|
|
60
|
+
// Format: arch=URL@sha256@sizeBytes
|
|
61
|
+
const parts = arg.split('=');
|
|
62
|
+
if (parts.length !== 2)
|
|
63
|
+
throw new Error(`--artifact inválido "${arg}". Esperado "arch=URL@sha256@sizeBytes".`);
|
|
64
|
+
const arch = parts[0];
|
|
65
|
+
if (!isArch(arch)) {
|
|
66
|
+
throw new Error(`--artifact com arch inválido "${arch}". Válidos: ${VALID_ARCHS.join(', ')}`);
|
|
67
|
+
}
|
|
68
|
+
const rest = parts[1].split('@');
|
|
69
|
+
if (rest.length !== 3)
|
|
70
|
+
throw new Error(`--artifact inválido "${arg}". Esperado "arch=URL@sha256@sizeBytes".`);
|
|
71
|
+
const [url, sha256, sizeStr] = rest;
|
|
72
|
+
if (!SHA256_RE.test(sha256.toLowerCase())) {
|
|
73
|
+
throw new Error(`--artifact ${arch}: sha256 inválido (esperado hex64).`);
|
|
74
|
+
}
|
|
75
|
+
const sizeBytes = Number(sizeStr);
|
|
76
|
+
if (!Number.isFinite(sizeBytes) || sizeBytes <= 0) {
|
|
77
|
+
throw new Error(`--artifact ${arch}: sizeBytes inválido.`);
|
|
78
|
+
}
|
|
79
|
+
return { arch, payload: { url, sha256: sha256.toLowerCase(), sizeBytes } };
|
|
80
|
+
}
|
|
81
|
+
export async function runAgentRelease(opts) {
|
|
82
|
+
log.banner();
|
|
83
|
+
log.heading('neetru agent release');
|
|
84
|
+
// ── validação básica ───────────────────────────────────────────────
|
|
85
|
+
if (!opts.version) {
|
|
86
|
+
log.error('--version é obrigatório (ex: 1.2.0).');
|
|
87
|
+
process.exit(2);
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
if (!SEMVER_RE.test(opts.version)) {
|
|
91
|
+
log.error(`--version inválido "${opts.version}". Use semver (1.2.3 ou 1.2.3-beta.1).`);
|
|
92
|
+
process.exit(2);
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
const channel = (opts.channel ?? 'beta').toLowerCase();
|
|
96
|
+
if (!isChannel(channel)) {
|
|
97
|
+
log.error(`--channel inválido "${channel}". Válidos: ${VALID_CHANNELS.join(' | ')}`);
|
|
98
|
+
process.exit(2);
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
// ── changelog ───────────────────────────────────────────────────────
|
|
102
|
+
let changelog = opts.changelog ?? '';
|
|
103
|
+
if (changelog.startsWith('@')) {
|
|
104
|
+
try {
|
|
105
|
+
changelog = await loadChangelogFromFile(changelog.slice(1));
|
|
106
|
+
}
|
|
107
|
+
catch (err) {
|
|
108
|
+
log.error(`Falha ao ler changelog "${changelog}": ${err.message}`);
|
|
109
|
+
process.exit(3);
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
if (!changelog || changelog.trim().length < 10) {
|
|
114
|
+
log.error('--changelog obrigatório (mín 10 chars). Use "@path/to/CHANGELOG.md" pra ler de arquivo.');
|
|
115
|
+
process.exit(2);
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
// ── monta artifacts ────────────────────────────────────────────────
|
|
119
|
+
const artifacts = {};
|
|
120
|
+
// Via --binary: lê arquivo local, computa sha256 + size, URL canônica GCS
|
|
121
|
+
for (const a of opts.binary ?? []) {
|
|
122
|
+
try {
|
|
123
|
+
const { arch, filePath } = parseBinaryArg(a);
|
|
124
|
+
log.info(`Computando sha256 de ${chalk.dim(filePath)}...`);
|
|
125
|
+
const { sha256, sizeBytes } = await sha256File(filePath);
|
|
126
|
+
const url = `${GCS_BASE}/${encodeURIComponent(opts.version)}/neetru-agent-${arch}`;
|
|
127
|
+
artifacts[arch] = { url, sha256, sizeBytes };
|
|
128
|
+
log.success(` ${arch}: sha256=${sha256.slice(0, 12)}... (${(sizeBytes / 1_000_000).toFixed(1)} MB)`);
|
|
129
|
+
log.dim(` URL: ${url}`);
|
|
130
|
+
}
|
|
131
|
+
catch (err) {
|
|
132
|
+
log.error(err.message);
|
|
133
|
+
process.exit(2);
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
// Via --artifact: tudo explícito, no FS read
|
|
138
|
+
for (const a of opts.artifact ?? []) {
|
|
139
|
+
try {
|
|
140
|
+
const { arch, payload } = parseArtifactArg(a);
|
|
141
|
+
artifacts[arch] = payload;
|
|
142
|
+
log.success(` ${arch}: sha256=${payload.sha256.slice(0, 12)}... (${(payload.sizeBytes / 1_000_000).toFixed(1)} MB)`);
|
|
143
|
+
}
|
|
144
|
+
catch (err) {
|
|
145
|
+
log.error(err.message);
|
|
146
|
+
process.exit(2);
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
if (Object.keys(artifacts).length === 0) {
|
|
151
|
+
log.error('Nenhum artifact informado. Use --binary arch=path ou --artifact arch=URL@sha256@sizeBytes.');
|
|
152
|
+
process.exit(2);
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
// ── payload ─────────────────────────────────────────────────────────
|
|
156
|
+
const payload = {
|
|
157
|
+
version: opts.version,
|
|
158
|
+
channel,
|
|
159
|
+
changelog,
|
|
160
|
+
artifacts,
|
|
161
|
+
...(opts.minCore ? { minSupportedCoreVersion: opts.minCore } : {}),
|
|
162
|
+
};
|
|
163
|
+
if (opts.dryRun) {
|
|
164
|
+
log.heading('Dry run — payload que seria enviado:');
|
|
165
|
+
console.log(JSON.stringify(payload, null, 2));
|
|
166
|
+
log.warn('Nada foi enviado. Remova --dry-run para publicar.');
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
log.info(`Registrando release ${chalk.bold(opts.version)} (channel=${chalk.bold(channel)}, ${Object.keys(artifacts).length} arch(s))...`);
|
|
170
|
+
try {
|
|
171
|
+
const r = await apiRequest('/cli/v1/agent/release', {
|
|
172
|
+
method: 'POST',
|
|
173
|
+
body: payload,
|
|
174
|
+
});
|
|
175
|
+
if (r.alreadyExists) {
|
|
176
|
+
log.warn(`Release ${chalk.bold(r.version)} já existia. Idempotente — nenhuma mudança.`);
|
|
177
|
+
}
|
|
178
|
+
else {
|
|
179
|
+
log.success(`Release ${chalk.bold(r.version)} publicada.`);
|
|
180
|
+
}
|
|
181
|
+
log.dim(` Painel: https://core.neetru.com/agent/releases`);
|
|
182
|
+
}
|
|
183
|
+
catch (err) {
|
|
184
|
+
if (err instanceof CliApiError) {
|
|
185
|
+
if (err.status === 401 || err.status === 403) {
|
|
186
|
+
log.error('Não autorizado. CLI precisa estar logado com chave admin.');
|
|
187
|
+
log.dim(' neetru login');
|
|
188
|
+
process.exit(4);
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
log.error(`API ${err.status}: ${err.message}`);
|
|
192
|
+
process.exit(5);
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
if (err instanceof CliNetworkError) {
|
|
196
|
+
log.error(`Conexão falhou: ${err.message}`);
|
|
197
|
+
process.exit(6);
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
log.error(err instanceof Error ? err.message : String(err));
|
|
201
|
+
process.exit(7);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
//# sourceMappingURL=agent-release.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-release.js","sourceRoot":"","sources":["../../src/commands/agent-release.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type StepUpOptions } from '../lib/cli-write.js';
|
|
2
|
+
export interface AgentYankOptions extends StepUpOptions {
|
|
3
|
+
reason: string;
|
|
4
|
+
}
|
|
5
|
+
export declare function runAgentYank(version: string, opts: AgentYankOptions): Promise<void>;
|
|
6
|
+
export declare function runAgentCanaryStart(version: string, opts: {
|
|
7
|
+
json?: boolean;
|
|
8
|
+
}): Promise<void>;
|
|
9
|
+
export interface AgentCanaryRollbackOptions extends StepUpOptions {
|
|
10
|
+
reason: string;
|
|
11
|
+
}
|
|
12
|
+
export declare function runAgentCanaryRollback(version: string, opts: AgentCanaryRollbackOptions): Promise<void>;
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `neetru agent yank` + `neetru agent canary start|rollback` — write commands
|
|
3
|
+
* sobre releases do agente Neetru.
|
|
4
|
+
*
|
|
5
|
+
* Endpoints:
|
|
6
|
+
* POST /api/cli/v1/agent/yank (yank — destrutivo)
|
|
7
|
+
* POST /api/cli/v1/agent/canary?action=start (start canary)
|
|
8
|
+
* POST /api/cli/v1/agent/canary?action=rollback (rollback — destrutivo)
|
|
9
|
+
*
|
|
10
|
+
* `neetru agent release` (publicar release) já existe em `agent-release.ts`.
|
|
11
|
+
*/
|
|
12
|
+
import ora from 'ora';
|
|
13
|
+
import { apiRequest } from '../lib/api-client.js';
|
|
14
|
+
import { requireToken, handleApiError, confirmDestructive, printWriteResult, resolveStepUp, } from '../lib/cli-write.js';
|
|
15
|
+
import { log } from '../utils/logger.js';
|
|
16
|
+
export async function runAgentYank(version, opts) {
|
|
17
|
+
if (!version) {
|
|
18
|
+
log.error('Uso: neetru agent yank <version> --reason "<motivo ≥5 chars>"');
|
|
19
|
+
process.exit(1);
|
|
20
|
+
}
|
|
21
|
+
const token = await requireToken(opts.json);
|
|
22
|
+
await confirmDestructive(`Yankar a release ${version} do agente? Installers/auto-upgrade vão ignorá-la.`, opts);
|
|
23
|
+
const { headers } = await resolveStepUp(opts);
|
|
24
|
+
const spinner = opts.json
|
|
25
|
+
? null
|
|
26
|
+
: ora({ text: `Yankando release ${version}…`, color: 'blue' }).start();
|
|
27
|
+
let res;
|
|
28
|
+
try {
|
|
29
|
+
res = await apiRequest(`/api/cli/v1/agent/yank${opts.dryRun ? '?dryRun=true' : ''}`, {
|
|
30
|
+
method: 'POST',
|
|
31
|
+
token,
|
|
32
|
+
headers,
|
|
33
|
+
body: { version, reason: opts.reason },
|
|
34
|
+
});
|
|
35
|
+
spinner?.stop();
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
spinner?.fail('Falha ao yankar release.');
|
|
39
|
+
handleApiError(error, opts.json);
|
|
40
|
+
}
|
|
41
|
+
printWriteResult(res.dryRun ? res : { version: res.version, yanked: res.yanked }, `Release ${res.version} yankada.`, opts.json);
|
|
42
|
+
}
|
|
43
|
+
export async function runAgentCanaryStart(version, opts) {
|
|
44
|
+
if (!version) {
|
|
45
|
+
log.error('Uso: neetru agent canary start <version>');
|
|
46
|
+
process.exit(1);
|
|
47
|
+
}
|
|
48
|
+
const token = await requireToken(opts.json);
|
|
49
|
+
const spinner = opts.json
|
|
50
|
+
? null
|
|
51
|
+
: ora({ text: `Iniciando canary de ${version}…`, color: 'blue' }).start();
|
|
52
|
+
let res;
|
|
53
|
+
try {
|
|
54
|
+
res = await apiRequest('/api/cli/v1/agent/canary?action=start', {
|
|
55
|
+
method: 'POST',
|
|
56
|
+
token,
|
|
57
|
+
body: { version },
|
|
58
|
+
});
|
|
59
|
+
spinner?.stop();
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
spinner?.fail('Falha ao iniciar canary.');
|
|
63
|
+
handleApiError(error, opts.json);
|
|
64
|
+
}
|
|
65
|
+
printWriteResult({ version: res.version, phase: res.phase }, `Canary de ${res.version} iniciado — phase: ${res.phase}`, opts.json);
|
|
66
|
+
}
|
|
67
|
+
export async function runAgentCanaryRollback(version, opts) {
|
|
68
|
+
if (!version) {
|
|
69
|
+
log.error('Uso: neetru agent canary rollback <version> --reason "<motivo ≥5 chars>"');
|
|
70
|
+
process.exit(1);
|
|
71
|
+
}
|
|
72
|
+
const token = await requireToken(opts.json);
|
|
73
|
+
await confirmDestructive(`Rollback do canary de ${version}? A release não retorna ao rollout — só com nova versão.`, opts);
|
|
74
|
+
const { headers } = await resolveStepUp(opts);
|
|
75
|
+
const spinner = opts.json
|
|
76
|
+
? null
|
|
77
|
+
: ora({ text: `Rollback do canary de ${version}…`, color: 'blue' }).start();
|
|
78
|
+
let res;
|
|
79
|
+
try {
|
|
80
|
+
res = await apiRequest(`/api/cli/v1/agent/canary?action=rollback${opts.dryRun ? '&dryRun=true' : ''}`, {
|
|
81
|
+
method: 'POST',
|
|
82
|
+
token,
|
|
83
|
+
headers,
|
|
84
|
+
body: { version, reason: opts.reason },
|
|
85
|
+
});
|
|
86
|
+
spinner?.stop();
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
spinner?.fail('Falha ao fazer rollback do canary.');
|
|
90
|
+
handleApiError(error, opts.json);
|
|
91
|
+
}
|
|
92
|
+
printWriteResult(res.dryRun ? res : { version: res.version, phase: res.phase }, `Canary de ${res.version} → ${res.phase}`, opts.json);
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=agent-write.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-write.js","sourceRoot":"","sources":["../../src/commands/agent-write.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { type ConfirmOptions, type StepUpOptions } from '../lib/cli-write.js';
|
|
2
|
+
export interface ApiCatalogWriteOptions {
|
|
3
|
+
name?: string;
|
|
4
|
+
description?: string;
|
|
5
|
+
baseUrl?: string;
|
|
6
|
+
version?: string;
|
|
7
|
+
authMethod?: string;
|
|
8
|
+
docsUrl?: string;
|
|
9
|
+
ownerTeam?: string;
|
|
10
|
+
contactEmail?: string;
|
|
11
|
+
scopes?: string;
|
|
12
|
+
status?: string;
|
|
13
|
+
json?: boolean;
|
|
14
|
+
}
|
|
15
|
+
export declare function runApiCatalogCreate(slug: string, opts: ApiCatalogWriteOptions): Promise<void>;
|
|
16
|
+
export declare function runApiCatalogUpdate(slug: string, opts: ApiCatalogWriteOptions): Promise<void>;
|
|
17
|
+
export declare function runApiCatalogArchive(slug: string, opts: ConfirmOptions & {
|
|
18
|
+
unarchive?: boolean;
|
|
19
|
+
}): Promise<void>;
|
|
20
|
+
export declare function runApiCatalogDelete(slug: string, opts: StepUpOptions): Promise<void>;
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `neetru api-catalog create|update|archive|delete` — control plane do registry
|
|
3
|
+
* de APIs versionadas (`apis/{slug}`).
|
|
4
|
+
*
|
|
5
|
+
* Endpoints:
|
|
6
|
+
* POST /api/cli/v1/api-catalog (create)
|
|
7
|
+
* PUT /api/cli/v1/api-catalog/{slug} (update)
|
|
8
|
+
* POST /api/cli/v1/api-catalog/{slug}?action=archive (soft-delete)
|
|
9
|
+
* DELETE /api/cli/v1/api-catalog/{slug} (delete físico — destrutivo)
|
|
10
|
+
*/
|
|
11
|
+
import ora from 'ora';
|
|
12
|
+
import { apiRequest } from '../lib/api-client.js';
|
|
13
|
+
import { requireToken, handleApiError, confirmDestructive, printWriteResult, resolveStepUp, } from '../lib/cli-write.js';
|
|
14
|
+
import { log } from '../utils/logger.js';
|
|
15
|
+
function buildPayload(slug, opts) {
|
|
16
|
+
return {
|
|
17
|
+
slug,
|
|
18
|
+
name: opts.name,
|
|
19
|
+
description: opts.description,
|
|
20
|
+
baseUrl: opts.baseUrl,
|
|
21
|
+
version: opts.version,
|
|
22
|
+
authMethod: opts.authMethod,
|
|
23
|
+
docsUrl: opts.docsUrl,
|
|
24
|
+
ownerTeam: opts.ownerTeam,
|
|
25
|
+
contactEmail: opts.contactEmail,
|
|
26
|
+
requiredScopes: opts.scopes
|
|
27
|
+
? opts.scopes.split(',').map((s) => s.trim()).filter(Boolean)
|
|
28
|
+
: undefined,
|
|
29
|
+
status: opts.status,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
export async function runApiCatalogCreate(slug, opts) {
|
|
33
|
+
if (!slug) {
|
|
34
|
+
log.error('Uso: neetru api-catalog create <slug> --name … --base-url … --version … --auth-method … --status …');
|
|
35
|
+
process.exit(1);
|
|
36
|
+
}
|
|
37
|
+
const token = await requireToken(opts.json);
|
|
38
|
+
const spinner = opts.json
|
|
39
|
+
? null
|
|
40
|
+
: ora({ text: `Registrando API "${slug}"…`, color: 'blue' }).start();
|
|
41
|
+
let res;
|
|
42
|
+
try {
|
|
43
|
+
res = await apiRequest('/api/cli/v1/api-catalog', {
|
|
44
|
+
method: 'POST',
|
|
45
|
+
token,
|
|
46
|
+
body: buildPayload(slug, opts),
|
|
47
|
+
});
|
|
48
|
+
spinner?.stop();
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
spinner?.fail('Falha ao registrar API.');
|
|
52
|
+
handleApiError(error, opts.json);
|
|
53
|
+
}
|
|
54
|
+
printWriteResult({ id: res.id }, `API registrada: ${res.id}`, opts.json);
|
|
55
|
+
}
|
|
56
|
+
export async function runApiCatalogUpdate(slug, opts) {
|
|
57
|
+
if (!slug) {
|
|
58
|
+
log.error('Uso: neetru api-catalog update <slug> --name … --base-url … --version … --auth-method … --status …');
|
|
59
|
+
process.exit(1);
|
|
60
|
+
}
|
|
61
|
+
const token = await requireToken(opts.json);
|
|
62
|
+
const spinner = opts.json
|
|
63
|
+
? null
|
|
64
|
+
: ora({ text: `Atualizando API "${slug}"…`, color: 'blue' }).start();
|
|
65
|
+
let res;
|
|
66
|
+
try {
|
|
67
|
+
res = await apiRequest(`/api/cli/v1/api-catalog/${encodeURIComponent(slug)}`, {
|
|
68
|
+
method: 'PUT',
|
|
69
|
+
token,
|
|
70
|
+
body: buildPayload(slug, opts),
|
|
71
|
+
});
|
|
72
|
+
spinner?.stop();
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
spinner?.fail('Falha ao atualizar API.');
|
|
76
|
+
handleApiError(error, opts.json);
|
|
77
|
+
}
|
|
78
|
+
printWriteResult({ id: res.id }, `API ${res.id} atualizada.`, opts.json);
|
|
79
|
+
}
|
|
80
|
+
export async function runApiCatalogArchive(slug, opts) {
|
|
81
|
+
if (!slug) {
|
|
82
|
+
log.error('Uso: neetru api-catalog archive <slug> [--unarchive]');
|
|
83
|
+
process.exit(1);
|
|
84
|
+
}
|
|
85
|
+
const token = await requireToken(opts.json);
|
|
86
|
+
const action = opts.unarchive ? 'unarchive' : 'archive';
|
|
87
|
+
if (action === 'archive') {
|
|
88
|
+
await confirmDestructive(`Arquivar a API "${slug}"? Some da listagem default (reversível com --unarchive).`, opts);
|
|
89
|
+
}
|
|
90
|
+
const spinner = opts.json
|
|
91
|
+
? null
|
|
92
|
+
: ora({ text: `${action === 'archive' ? 'Arquivando' : 'Reativando'} API "${slug}"…`, color: 'blue' }).start();
|
|
93
|
+
let res;
|
|
94
|
+
try {
|
|
95
|
+
res = await apiRequest(`/api/cli/v1/api-catalog/${encodeURIComponent(slug)}?action=${action}`, { method: 'POST', token });
|
|
96
|
+
spinner?.stop();
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
spinner?.fail(`Falha ao ${action === 'archive' ? 'arquivar' : 'reativar'} API.`);
|
|
100
|
+
handleApiError(error, opts.json);
|
|
101
|
+
}
|
|
102
|
+
printWriteResult({ id: res.id, archived: res.archived }, `API ${res.id} → ${res.archived ? 'arquivada' : 'ativa'}`, opts.json);
|
|
103
|
+
}
|
|
104
|
+
export async function runApiCatalogDelete(slug, opts) {
|
|
105
|
+
if (!slug) {
|
|
106
|
+
log.error('Uso: neetru api-catalog delete <slug>');
|
|
107
|
+
process.exit(1);
|
|
108
|
+
}
|
|
109
|
+
const token = await requireToken(opts.json);
|
|
110
|
+
await confirmDestructive(`Deletar fisicamente a API "${slug}"? Esta ação é IRREVERSÍVEL (use archive para soft-delete).`, opts);
|
|
111
|
+
const { headers } = await resolveStepUp(opts);
|
|
112
|
+
const spinner = opts.json
|
|
113
|
+
? null
|
|
114
|
+
: ora({ text: `Deletando API "${slug}"…`, color: 'blue' }).start();
|
|
115
|
+
let res;
|
|
116
|
+
try {
|
|
117
|
+
res = await apiRequest(`/api/cli/v1/api-catalog/${encodeURIComponent(slug)}${opts.dryRun ? '?dryRun=true' : ''}`, { method: 'DELETE', token, headers });
|
|
118
|
+
spinner?.stop();
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
spinner?.fail('Falha ao deletar API.');
|
|
122
|
+
handleApiError(error, opts.json);
|
|
123
|
+
}
|
|
124
|
+
printWriteResult(res.dryRun ? res : { id: res.id, deleted: res.deleted }, `API ${res.id} deletada.`, opts.json);
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=api-catalog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-catalog.js","sourceRoot":"","sources":["../../src/commands/api-catalog.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `neetru audit tail` — últimos N eventos da trilha de auditoria do Core.
|
|
3
|
+
*
|
|
4
|
+
* Endpoint: GET /api/cli/v1/audit/tail
|
|
5
|
+
* filtros: --limit, --action, --severity, --actor
|
|
6
|
+
*
|
|
7
|
+
* Saída: tabela (default, mais recente primeiro) ou `--json`.
|
|
8
|
+
*/
|
|
9
|
+
import chalk from 'chalk';
|
|
10
|
+
import ora from 'ora';
|
|
11
|
+
import { apiRequest } from '../lib/api-client.js';
|
|
12
|
+
import { requireToken, handleApiError } from '../lib/cli-read.js';
|
|
13
|
+
import { renderTable, fmtTimestamp } from '../lib/render.js';
|
|
14
|
+
import { log } from '../utils/logger.js';
|
|
15
|
+
function colorSeverity(s) {
|
|
16
|
+
if (!s || s === 'info')
|
|
17
|
+
return chalk.dim(s ?? 'info');
|
|
18
|
+
if (s === 'warning')
|
|
19
|
+
return chalk.yellow(s);
|
|
20
|
+
if (s === 'critical')
|
|
21
|
+
return chalk.red(s);
|
|
22
|
+
return chalk.cyan(s);
|
|
23
|
+
}
|
|
24
|
+
function colorResult(r) {
|
|
25
|
+
if (r === 'success')
|
|
26
|
+
return chalk.green(r);
|
|
27
|
+
if (r === 'failure')
|
|
28
|
+
return chalk.red(r);
|
|
29
|
+
return chalk.dim(r);
|
|
30
|
+
}
|
|
31
|
+
export async function runAuditTail(opts) {
|
|
32
|
+
const token = await requireToken(opts.json);
|
|
33
|
+
const params = new URLSearchParams();
|
|
34
|
+
if (opts.limit)
|
|
35
|
+
params.set('limit', opts.limit);
|
|
36
|
+
if (opts.action)
|
|
37
|
+
params.set('action', opts.action);
|
|
38
|
+
if (opts.severity)
|
|
39
|
+
params.set('severity', opts.severity);
|
|
40
|
+
if (opts.actor)
|
|
41
|
+
params.set('actor', opts.actor);
|
|
42
|
+
const qs = params.toString();
|
|
43
|
+
const spinner = opts.json ? null : ora({ text: 'Buscando audit logs…', color: 'blue' }).start();
|
|
44
|
+
let res;
|
|
45
|
+
try {
|
|
46
|
+
res = await apiRequest(`/api/cli/v1/audit/tail${qs ? `?${qs}` : ''}`, { token });
|
|
47
|
+
spinner?.stop();
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
spinner?.fail('Falha ao buscar audit logs.');
|
|
51
|
+
handleApiError(error, opts.json);
|
|
52
|
+
}
|
|
53
|
+
if (opts.json) {
|
|
54
|
+
console.log(JSON.stringify(res));
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
log.heading(`Audit tail (${res.count} eventos)`);
|
|
58
|
+
renderTable([
|
|
59
|
+
{ header: 'TIMESTAMP', value: (e) => fmtTimestamp(e.ts) },
|
|
60
|
+
{ header: 'AÇÃO', value: (e) => e.action, maxWidth: 32 },
|
|
61
|
+
{ header: 'ATOR', value: (e) => e.actor.email, maxWidth: 28 },
|
|
62
|
+
{ header: 'SRC', value: (e) => e.actor.source ?? '—' },
|
|
63
|
+
{ header: 'ALVO', value: (e) => `${e.target.kind}/${e.target.id}`, maxWidth: 30 },
|
|
64
|
+
{ header: 'RESULTADO', value: (e) => colorResult(e.result) },
|
|
65
|
+
{ header: 'SEV', value: (e) => colorSeverity(e.severity) },
|
|
66
|
+
], res.events);
|
|
67
|
+
console.log();
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=audit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/commands/audit.ts"],"names":[],"mappings":"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"}
|