@neetru/cli 1.0.1 → 2.1.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/CHANGELOG.md +136 -0
- package/README.md +109 -152
- package/dist/commands/add.d.ts +8 -3
- package/dist/commands/add.js +70 -143
- package/dist/commands/add.js.map +1 -1
- 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/ai.d.ts +4 -0
- package/dist/commands/ai.js +88 -0
- package/dist/commands/ai.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/autocomplete.d.ts +7 -0
- package/dist/commands/autocomplete.js +107 -0
- package/dist/commands/autocomplete.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.d.ts +18 -0
- package/dist/commands/build.js +295 -0
- package/dist/commands/build.js.map +1 -0
- 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/config.d.ts +3 -0
- package/dist/commands/config.js +70 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/db.d.ts +14 -0
- package/dist/commands/db.js +187 -0
- package/dist/commands/db.js.map +1 -0
- package/dist/commands/deploy.d.ts +23 -3
- package/dist/commands/deploy.js +530 -177
- 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/doctor.d.ts +27 -0
- package/dist/commands/doctor.js +211 -0
- package/dist/commands/doctor.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/env.d.ts +15 -0
- package/dist/commands/env.js +56 -0
- package/dist/commands/env.js.map +1 -0
- package/dist/commands/fn.d.ts +6 -0
- package/dist/commands/fn.js +87 -0
- package/dist/commands/fn.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 +10 -3
- package/dist/commands/init.js +275 -142
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/login.d.ts +6 -3
- package/dist/commands/login.js +222 -92
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/logout.d.ts +1 -0
- package/dist/commands/logout.js +28 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/logs.d.ts +14 -3
- package/dist/commands/logs.js +132 -106
- package/dist/commands/logs.js.map +1 -1
- package/dist/commands/mocks.d.ts +5 -0
- package/dist/commands/mocks.js +23 -0
- package/dist/commands/mocks.js.map +1 -0
- package/dist/commands/open.d.ts +4 -3
- package/dist/commands/open.js +53 -85
- package/dist/commands/open.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/promote.d.ts +9 -0
- package/dist/commands/promote.js +114 -0
- package/dist/commands/promote.js.map +1 -0
- package/dist/commands/publish.d.ts +14 -0
- package/dist/commands/publish.js +180 -0
- package/dist/commands/publish.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/status.d.ts +5 -3
- package/dist/commands/status.js +91 -93
- package/dist/commands/status.js.map +1 -1
- 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/upgrade.d.ts +12 -0
- package/dist/commands/upgrade.js +77 -0
- package/dist/commands/upgrade.js.map +1 -0
- package/dist/commands/validate.d.ts +1 -3
- package/dist/commands/validate.js +83 -91
- package/dist/commands/validate.js.map +1 -1
- package/dist/commands/whoami.d.ts +5 -3
- package/dist/commands/whoami.js +76 -28
- package/dist/commands/whoami.js.map +1 -1
- 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.d.ts +0 -1
- package/dist/index.js +1094 -36
- package/dist/index.js.map +1 -1
- package/dist/lib/ai/context.d.ts +11 -0
- package/dist/lib/ai/context.js +112 -0
- package/dist/lib/ai/context.js.map +1 -0
- package/dist/lib/ai/orchestrator.d.ts +10 -0
- package/dist/lib/ai/orchestrator.js +92 -0
- package/dist/lib/ai/orchestrator.js.map +1 -0
- package/dist/lib/api-client.d.ts +39 -0
- package/dist/lib/api-client.js +185 -0
- package/dist/lib/api-client.js.map +1 -0
- package/dist/lib/auth.d.ts +15 -0
- package/dist/lib/auth.js +98 -0
- package/dist/lib/auth.js.map +1 -0
- 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 +165 -0
- package/dist/lib/config-schema.js +57 -0
- package/dist/lib/config-schema.js.map +1 -0
- package/dist/lib/config.d.ts +15 -0
- package/dist/lib/config.js +33 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/render.d.ts +16 -0
- package/dist/lib/render.js +74 -0
- package/dist/lib/render.js.map +1 -0
- package/dist/utils/logger.d.ts +13 -0
- package/dist/utils/logger.js +27 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +35 -33
- package/templates/auth/callback.ts +22 -0
- package/templates/auth/sign-in.tsx +41 -0
- package/templates/billing/checkout.ts +22 -0
- package/templates/billing/page.tsx +43 -0
- package/templates/support/ticket-form.tsx +68 -0
- package/templates/usage/track.ts +30 -0
- package/templates/users/profile.tsx +43 -0
- package/LICENSE +0 -21
- package/dist/commands/add.d.ts.map +0 -1
- package/dist/commands/deploy.d.ts.map +0 -1
- package/dist/commands/generate-types.d.ts +0 -3
- package/dist/commands/generate-types.d.ts.map +0 -1
- package/dist/commands/generate-types.js +0 -150
- package/dist/commands/generate-types.js.map +0 -1
- package/dist/commands/init.d.ts.map +0 -1
- package/dist/commands/login.d.ts.map +0 -1
- package/dist/commands/logs.d.ts.map +0 -1
- package/dist/commands/open.d.ts.map +0 -1
- package/dist/commands/status.d.ts.map +0 -1
- package/dist/commands/validate.d.ts.map +0 -1
- package/dist/commands/whoami.d.ts.map +0 -1
- package/dist/config.d.ts +0 -14
- package/dist/config.d.ts.map +0 -1
- package/dist/config.js +0 -83
- package/dist/config.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/scaffold/auth.d.ts +0 -3
- package/dist/scaffold/auth.d.ts.map +0 -1
- package/dist/scaffold/auth.js +0 -228
- package/dist/scaffold/auth.js.map +0 -1
- package/dist/scaffold/billing.d.ts +0 -3
- package/dist/scaffold/billing.d.ts.map +0 -1
- package/dist/scaffold/billing.js +0 -184
- package/dist/scaffold/billing.js.map +0 -1
- package/dist/scaffold/usage.d.ts +0 -3
- package/dist/scaffold/usage.d.ts.map +0 -1
- package/dist/scaffold/usage.js +0 -173
- package/dist/scaffold/usage.js.map +0 -1
- package/dist/scaffold/users.d.ts +0 -3
- package/dist/scaffold/users.d.ts.map +0 -1
- package/dist/scaffold/users.js +0 -135
- package/dist/scaffold/users.js.map +0 -1
package/dist/lib/auth.js
ADDED
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token storage for `neetru` CLI — `~/.config/neetru-cli/auth.json`.
|
|
3
|
+
*
|
|
4
|
+
* Sprint 1 — Device Code OAuth (RFC 8628). Replaces the legacy `Conf`-based
|
|
5
|
+
* `neetruApiKey` storage with a dedicated file we can chmod 0600 explicitly.
|
|
6
|
+
*
|
|
7
|
+
* File shape:
|
|
8
|
+
* ```json
|
|
9
|
+
* {
|
|
10
|
+
* "token": "nrt_<keyId>_<secret>",
|
|
11
|
+
* "email": "owner@neetru.com",
|
|
12
|
+
* "savedAt": "2026-05-05T12:00:00.000Z"
|
|
13
|
+
* }
|
|
14
|
+
* ```
|
|
15
|
+
*/
|
|
16
|
+
import { promises as fs, existsSync } from 'node:fs';
|
|
17
|
+
import { dirname, join } from 'node:path';
|
|
18
|
+
import { homedir } from 'node:os';
|
|
19
|
+
export function getAuthFilePath() {
|
|
20
|
+
// XDG-ish location; works on Linux, macOS, and Windows (homedir resolves
|
|
21
|
+
// %USERPROFILE%). We deliberately don't honor $XDG_CONFIG_HOME — keeps the
|
|
22
|
+
// path stable for `neetru logout` and docs.
|
|
23
|
+
return join(homedir(), '.config', 'neetru-cli', 'auth.json');
|
|
24
|
+
}
|
|
25
|
+
export class AuthFileMissingError extends Error {
|
|
26
|
+
constructor() {
|
|
27
|
+
super('Não autenticado. Execute: neetru login');
|
|
28
|
+
this.name = 'AuthFileMissingError';
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
export class AuthFileInvalidError extends Error {
|
|
32
|
+
constructor(message) {
|
|
33
|
+
super(message);
|
|
34
|
+
this.name = 'AuthFileInvalidError';
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
export async function loadToken() {
|
|
38
|
+
const path = getAuthFilePath();
|
|
39
|
+
if (!existsSync(path)) {
|
|
40
|
+
throw new AuthFileMissingError();
|
|
41
|
+
}
|
|
42
|
+
let raw;
|
|
43
|
+
try {
|
|
44
|
+
raw = await fs.readFile(path, 'utf8');
|
|
45
|
+
}
|
|
46
|
+
catch (err) {
|
|
47
|
+
throw new AuthFileInvalidError(`Falha ao ler ${path}: ${err.message}`);
|
|
48
|
+
}
|
|
49
|
+
let parsed;
|
|
50
|
+
try {
|
|
51
|
+
parsed = JSON.parse(raw);
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
throw new AuthFileInvalidError(`Arquivo ${path} corrompido. Execute: neetru logout && neetru login`);
|
|
55
|
+
}
|
|
56
|
+
const data = parsed;
|
|
57
|
+
if (!data ||
|
|
58
|
+
typeof data.token !== 'string' ||
|
|
59
|
+
typeof data.email !== 'string' ||
|
|
60
|
+
typeof data.savedAt !== 'string') {
|
|
61
|
+
throw new AuthFileInvalidError(`Arquivo ${path} incompleto. Execute: neetru logout && neetru login`);
|
|
62
|
+
}
|
|
63
|
+
return { token: data.token, email: data.email, savedAt: data.savedAt };
|
|
64
|
+
}
|
|
65
|
+
export async function saveToken(token, email) {
|
|
66
|
+
const path = getAuthFilePath();
|
|
67
|
+
const dir = dirname(path);
|
|
68
|
+
// Garante diretório (mode 0700 é redundante em Windows mas é o intent).
|
|
69
|
+
await fs.mkdir(dir, { recursive: true, mode: 0o700 });
|
|
70
|
+
const payload = {
|
|
71
|
+
token,
|
|
72
|
+
email,
|
|
73
|
+
savedAt: new Date().toISOString(),
|
|
74
|
+
};
|
|
75
|
+
// Escreve com mode restritivo. Em Windows, fs.chmod no-ops em parte mas o
|
|
76
|
+
// arquivo continua visível só pra owner via NTFS herdado de %USERPROFILE%.
|
|
77
|
+
await fs.writeFile(path, JSON.stringify(payload, null, 2), {
|
|
78
|
+
encoding: 'utf8',
|
|
79
|
+
mode: 0o600,
|
|
80
|
+
});
|
|
81
|
+
// Defensive chmod — writeFile mode acima é só a cria; se já existia, força.
|
|
82
|
+
try {
|
|
83
|
+
await fs.chmod(path, 0o600);
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
// Em Windows alguns runtimes tratam mode 0600 como read-only flag;
|
|
87
|
+
// ignoramos erro silenciosamente.
|
|
88
|
+
}
|
|
89
|
+
return path;
|
|
90
|
+
}
|
|
91
|
+
export async function clearToken() {
|
|
92
|
+
const path = getAuthFilePath();
|
|
93
|
+
if (!existsSync(path))
|
|
94
|
+
return false;
|
|
95
|
+
await fs.unlink(path);
|
|
96
|
+
return true;
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/lib/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolve o Bearer token corrente. Retorna `null` se não houver sessão.
|
|
3
|
+
*/
|
|
4
|
+
export declare function resolveToken(): Promise<string | null>;
|
|
5
|
+
/**
|
|
6
|
+
* Exige token; encerra com exit(1) se ausente. Honra `--json`.
|
|
7
|
+
*/
|
|
8
|
+
export declare function requireToken(json?: boolean): Promise<string>;
|
|
9
|
+
/**
|
|
10
|
+
* Tratamento padronizado de erro de API para comandos de leitura.
|
|
11
|
+
* Imprime a mensagem adequada e encerra o processo — nunca retorna.
|
|
12
|
+
*/
|
|
13
|
+
export declare function handleApiError(error: unknown, json?: boolean): never;
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Helpers compartilhados pelos comandos de LEITURA do control plane
|
|
3
|
+
* (`tenants`, `audit`, `billing`, `servers`, `products`, `status`).
|
|
4
|
+
*
|
|
5
|
+
* Centraliza: resolução do token (auth.json + fallback Conf legado) e o
|
|
6
|
+
* tratamento padronizado de erros de API → exit codes consistentes.
|
|
7
|
+
*
|
|
8
|
+
* Exit codes (convenção do CLI):
|
|
9
|
+
* 1 — não autenticado / não encontrado (4xx semântico do usuário)
|
|
10
|
+
* 2 — token inválido/revogado, erro de rede, erro de servidor
|
|
11
|
+
*/
|
|
12
|
+
import { config } from './config.js';
|
|
13
|
+
import { loadToken, AuthFileMissingError, AuthFileInvalidError, } from './auth.js';
|
|
14
|
+
import { CliApiError, CliNetworkError } from './api-client.js';
|
|
15
|
+
import { log } from '../utils/logger.js';
|
|
16
|
+
/**
|
|
17
|
+
* Resolve o Bearer token corrente. Retorna `null` se não houver sessão.
|
|
18
|
+
*/
|
|
19
|
+
export async function resolveToken() {
|
|
20
|
+
try {
|
|
21
|
+
const auth = await loadToken();
|
|
22
|
+
return auth.token;
|
|
23
|
+
}
|
|
24
|
+
catch (err) {
|
|
25
|
+
if (err instanceof AuthFileMissingError) {
|
|
26
|
+
// Fallback: Conf storage (legacy `neetru login --token <nrt_...>`).
|
|
27
|
+
return config.get('neetruApiKey') ?? null;
|
|
28
|
+
}
|
|
29
|
+
if (err instanceof AuthFileInvalidError) {
|
|
30
|
+
log.error(err.message);
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
throw err;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Exige token; encerra com exit(1) se ausente. Honra `--json`.
|
|
38
|
+
*/
|
|
39
|
+
export async function requireToken(json) {
|
|
40
|
+
const token = await resolveToken();
|
|
41
|
+
if (!token) {
|
|
42
|
+
if (json) {
|
|
43
|
+
console.log(JSON.stringify({ ok: false, error: 'unauthenticated' }));
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
log.error('Nenhuma sessão ativa. Execute: neetru login');
|
|
47
|
+
}
|
|
48
|
+
process.exit(1);
|
|
49
|
+
}
|
|
50
|
+
return token;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Tratamento padronizado de erro de API para comandos de leitura.
|
|
54
|
+
* Imprime a mensagem adequada e encerra o processo — nunca retorna.
|
|
55
|
+
*/
|
|
56
|
+
export function handleApiError(error, json) {
|
|
57
|
+
if (error instanceof CliApiError) {
|
|
58
|
+
if (error.status === 401 || error.status === 403) {
|
|
59
|
+
if (json) {
|
|
60
|
+
console.log(JSON.stringify({ ok: false, error: 'forbidden', status: error.status, message: error.message }));
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
log.error(error.status === 401
|
|
64
|
+
? 'Token inválido ou revogado. Execute: neetru login'
|
|
65
|
+
: `Acesso negado: ${error.message}`);
|
|
66
|
+
}
|
|
67
|
+
process.exit(error.status === 401 ? 1 : 2);
|
|
68
|
+
}
|
|
69
|
+
if (error.status === 404) {
|
|
70
|
+
if (json) {
|
|
71
|
+
console.log(JSON.stringify({ ok: false, error: 'not_found', message: error.message }));
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
log.error(error.message || 'Recurso não encontrado.');
|
|
75
|
+
}
|
|
76
|
+
process.exit(1);
|
|
77
|
+
}
|
|
78
|
+
if (json) {
|
|
79
|
+
console.log(JSON.stringify({ ok: false, error: error.code, status: error.status, message: error.message }));
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
log.error(`Erro do servidor (${error.status}): ${error.message}`);
|
|
83
|
+
}
|
|
84
|
+
process.exit(2);
|
|
85
|
+
}
|
|
86
|
+
if (error instanceof CliNetworkError) {
|
|
87
|
+
if (json) {
|
|
88
|
+
console.log(JSON.stringify({ ok: false, error: 'network', message: error.message }));
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
log.error(error.message);
|
|
92
|
+
}
|
|
93
|
+
process.exit(2);
|
|
94
|
+
}
|
|
95
|
+
if (json) {
|
|
96
|
+
console.log(JSON.stringify({ ok: false, error: 'unknown', message: error.message }));
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
log.error(error.message);
|
|
100
|
+
}
|
|
101
|
+
process.exit(2);
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=cli-read.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-read.js","sourceRoot":"","sources":["../../src/lib/cli-read.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { requireToken, handleApiError } from './cli-read.js';
|
|
2
|
+
export { requireToken, handleApiError };
|
|
3
|
+
export interface ConfirmOptions {
|
|
4
|
+
/** `--yes` / `--force` — pula a confirmação (modo script/CI). */
|
|
5
|
+
yes?: boolean;
|
|
6
|
+
force?: boolean;
|
|
7
|
+
/** Saída em JSON — não imprime prompt humano. */
|
|
8
|
+
json?: boolean;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Gate de confirmação pra operações DESTRUTIVAS (suspend, deactivate, delete,
|
|
12
|
+
* rollback, archive, yank). Se `--yes`/`--force` foi passado, retorna sem
|
|
13
|
+
* bloquear. Caso contrário, prompta `y/N` — se o operador não confirmar (ou se
|
|
14
|
+
* o terminal não é interativo), encerra o processo com exit code 1.
|
|
15
|
+
*
|
|
16
|
+
* Uso:
|
|
17
|
+
* await confirmDestructive(
|
|
18
|
+
* `Suspender o tenant ${id}? Esta ação é reversível mas afeta produção.`,
|
|
19
|
+
* opts,
|
|
20
|
+
* );
|
|
21
|
+
* // ... só chega aqui se confirmou ou --yes
|
|
22
|
+
*/
|
|
23
|
+
export declare function confirmDestructive(message: string, opts: ConfirmOptions): Promise<void>;
|
|
24
|
+
export interface StepUpOptions extends ConfirmOptions {
|
|
25
|
+
/** `--mfa-token <code>` — código TOTP pra step-up (pula o prompt interativo). */
|
|
26
|
+
mfaToken?: string;
|
|
27
|
+
/** `--dry-run` — servidor valida e retorna o efeito SEM aplicar. */
|
|
28
|
+
dryRun?: boolean;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Resolve o que uma operação destrutiva TOP-TIER precisa mandar pro servidor:
|
|
32
|
+
* - `headers`: `X-Neetru-MFA-Token` (step-up MFA) e/ou `X-Neetru-Dry-Run`;
|
|
33
|
+
* - `query`: sufixo `?dryRun=true`/`&dryRun=true` quando aplicável.
|
|
34
|
+
*
|
|
35
|
+
* Em dry-run NÃO exige MFA (nada é aplicado). Fora de dry-run exige o código
|
|
36
|
+
* TOTP — do flag `--mfa-token` ou prompt interativo. Se não houver como obter
|
|
37
|
+
* (terminal não-interativo sem `--mfa-token`), encerra com instrução clara —
|
|
38
|
+
* o servidor recusaria de qualquer forma (fail-closed).
|
|
39
|
+
*/
|
|
40
|
+
export declare function resolveStepUp(opts: StepUpOptions): Promise<{
|
|
41
|
+
headers: Record<string, string>;
|
|
42
|
+
}>;
|
|
43
|
+
/**
|
|
44
|
+
* Imprime o resultado de um comando de escrita — JSON cru ou linha humana.
|
|
45
|
+
* Reconhece a resposta de dry-run (`{ dryRun: true }`) e a sinaliza.
|
|
46
|
+
*/
|
|
47
|
+
export declare function printWriteResult(result: Record<string, unknown>, humanMessage: string, json?: boolean): void;
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Helpers compartilhados pelos comandos de ESCRITA do control plane
|
|
3
|
+
* (`tenants create|update|...`, `servers provision|...`, `workspaces`,
|
|
4
|
+
* `deployments`, `cloud-run`, `agent yank|canary`, `api-catalog`, `products`).
|
|
5
|
+
*
|
|
6
|
+
* Centraliza:
|
|
7
|
+
* - resolução de token (reusa `requireToken` de `cli-read.ts`);
|
|
8
|
+
* - confirmação interativa pra operações destrutivas (`confirmDestructive`),
|
|
9
|
+
* com bypass via `--yes`/`--force` pra scripts/CI;
|
|
10
|
+
* - tratamento de erro de API → exit codes consistentes (reusa `handleApiError`).
|
|
11
|
+
*/
|
|
12
|
+
import { createInterface } from 'node:readline';
|
|
13
|
+
import { requireToken, handleApiError } from './cli-read.js';
|
|
14
|
+
import { log } from '../utils/logger.js';
|
|
15
|
+
export { requireToken, handleApiError };
|
|
16
|
+
/**
|
|
17
|
+
* Pede uma confirmação interativa `y/N` no terminal. Resolve `true` se o
|
|
18
|
+
* operador digitou `y`/`yes` (case-insensitive); `false` caso contrário.
|
|
19
|
+
*
|
|
20
|
+
* Em terminal não-interativo (`!process.stdin.isTTY`) resolve `false` —
|
|
21
|
+
* o caller deve então orientar o uso de `--yes`.
|
|
22
|
+
*/
|
|
23
|
+
function promptYesNo(question) {
|
|
24
|
+
if (!process.stdin.isTTY)
|
|
25
|
+
return Promise.resolve(false);
|
|
26
|
+
return new Promise((resolve) => {
|
|
27
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
28
|
+
rl.question(` ${question} [y/N] `, (answer) => {
|
|
29
|
+
rl.close();
|
|
30
|
+
const a = answer.trim().toLowerCase();
|
|
31
|
+
resolve(a === 'y' || a === 'yes');
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Gate de confirmação pra operações DESTRUTIVAS (suspend, deactivate, delete,
|
|
37
|
+
* rollback, archive, yank). Se `--yes`/`--force` foi passado, retorna sem
|
|
38
|
+
* bloquear. Caso contrário, prompta `y/N` — se o operador não confirmar (ou se
|
|
39
|
+
* o terminal não é interativo), encerra o processo com exit code 1.
|
|
40
|
+
*
|
|
41
|
+
* Uso:
|
|
42
|
+
* await confirmDestructive(
|
|
43
|
+
* `Suspender o tenant ${id}? Esta ação é reversível mas afeta produção.`,
|
|
44
|
+
* opts,
|
|
45
|
+
* );
|
|
46
|
+
* // ... só chega aqui se confirmou ou --yes
|
|
47
|
+
*/
|
|
48
|
+
export async function confirmDestructive(message, opts) {
|
|
49
|
+
if (opts.yes || opts.force)
|
|
50
|
+
return;
|
|
51
|
+
if (opts.json) {
|
|
52
|
+
// Em modo JSON não há como promptar — exige flag explícita.
|
|
53
|
+
console.log(JSON.stringify({
|
|
54
|
+
ok: false,
|
|
55
|
+
error: 'confirmation_required',
|
|
56
|
+
message: 'Operação destrutiva em modo --json exige --yes.',
|
|
57
|
+
}));
|
|
58
|
+
process.exit(1);
|
|
59
|
+
}
|
|
60
|
+
log.warn(message);
|
|
61
|
+
const confirmed = await promptYesNo('Confirmar?');
|
|
62
|
+
if (!confirmed) {
|
|
63
|
+
if (!process.stdin.isTTY) {
|
|
64
|
+
log.error('Terminal não-interativo: use --yes (ou --force) para confirmar operações destrutivas.');
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
log.dim('Operação cancelada.');
|
|
68
|
+
}
|
|
69
|
+
process.exit(1);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/** Prompt interativo de uma linha (sem máscara — código TOTP não é segredo persistente). */
|
|
73
|
+
function promptLine(question) {
|
|
74
|
+
if (!process.stdin.isTTY)
|
|
75
|
+
return Promise.resolve('');
|
|
76
|
+
return new Promise((resolve) => {
|
|
77
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
78
|
+
rl.question(` ${question} `, (answer) => {
|
|
79
|
+
rl.close();
|
|
80
|
+
resolve(answer.trim());
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Resolve o que uma operação destrutiva TOP-TIER precisa mandar pro servidor:
|
|
86
|
+
* - `headers`: `X-Neetru-MFA-Token` (step-up MFA) e/ou `X-Neetru-Dry-Run`;
|
|
87
|
+
* - `query`: sufixo `?dryRun=true`/`&dryRun=true` quando aplicável.
|
|
88
|
+
*
|
|
89
|
+
* Em dry-run NÃO exige MFA (nada é aplicado). Fora de dry-run exige o código
|
|
90
|
+
* TOTP — do flag `--mfa-token` ou prompt interativo. Se não houver como obter
|
|
91
|
+
* (terminal não-interativo sem `--mfa-token`), encerra com instrução clara —
|
|
92
|
+
* o servidor recusaria de qualquer forma (fail-closed).
|
|
93
|
+
*/
|
|
94
|
+
export async function resolveStepUp(opts) {
|
|
95
|
+
const headers = {};
|
|
96
|
+
if (opts.dryRun) {
|
|
97
|
+
headers['X-Neetru-Dry-Run'] = 'true';
|
|
98
|
+
return { headers };
|
|
99
|
+
}
|
|
100
|
+
let code = (opts.mfaToken ?? '').trim();
|
|
101
|
+
if (!code) {
|
|
102
|
+
if (!process.stdin.isTTY) {
|
|
103
|
+
const msg = 'Operação destrutiva top-tier exige step-up MFA: passe --mfa-token <código TOTP> (terminal não-interativo).';
|
|
104
|
+
if (opts.json) {
|
|
105
|
+
console.log(JSON.stringify({ ok: false, error: 'mfa_required', message: msg }));
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
log.error(msg);
|
|
109
|
+
}
|
|
110
|
+
process.exit(1);
|
|
111
|
+
}
|
|
112
|
+
code = await promptLine('Código MFA (TOTP) para confirmar:');
|
|
113
|
+
}
|
|
114
|
+
if (!code) {
|
|
115
|
+
log.error('Código MFA não fornecido — operação cancelada.');
|
|
116
|
+
process.exit(1);
|
|
117
|
+
}
|
|
118
|
+
headers['X-Neetru-MFA-Token'] = code;
|
|
119
|
+
return { headers };
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Imprime o resultado de um comando de escrita — JSON cru ou linha humana.
|
|
123
|
+
* Reconhece a resposta de dry-run (`{ dryRun: true }`) e a sinaliza.
|
|
124
|
+
*/
|
|
125
|
+
export function printWriteResult(result, humanMessage, json) {
|
|
126
|
+
const isDryRun = result.dryRun === true;
|
|
127
|
+
if (json) {
|
|
128
|
+
console.log(JSON.stringify({ ok: true, ...result }));
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
if (isDryRun) {
|
|
132
|
+
log.warn(`[dry-run] Nada foi aplicado. Efeito que SERIA aplicado: ${JSON.stringify(result.wouldApply ?? {})}`);
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
log.success(humanMessage);
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=cli-write.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-write.js","sourceRoot":"","sources":["../../src/lib/cli-write.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const PUBLIC_PRODUCT_ICON_KEYS: readonly ["activity", "factory", "chart", "shield", "spark", "target", "trending"];
|
|
3
|
+
export declare const PUBLIC_PRODUCT_STATUSES: readonly ["live", "soon", "beta"];
|
|
4
|
+
export declare const RUNTIMES: readonly ["nextjs", "node-api"];
|
|
5
|
+
export declare const slugSchema: z.ZodString;
|
|
6
|
+
export declare const publishBlockSchema: z.ZodObject<{
|
|
7
|
+
tagline: z.ZodString;
|
|
8
|
+
description: z.ZodString;
|
|
9
|
+
iconKey: z.ZodEnum<["activity", "factory", "chart", "shield", "spark", "target", "trending"]>;
|
|
10
|
+
status: z.ZodEnum<["live", "soon", "beta"]>;
|
|
11
|
+
order: z.ZodOptional<z.ZodNumber>;
|
|
12
|
+
ctaHref: z.ZodOptional<z.ZodString>;
|
|
13
|
+
ctaLabel: z.ZodOptional<z.ZodString>;
|
|
14
|
+
}, "strip", z.ZodTypeAny, {
|
|
15
|
+
description: string;
|
|
16
|
+
status: "soon" | "beta" | "live";
|
|
17
|
+
tagline: string;
|
|
18
|
+
iconKey: "spark" | "target" | "activity" | "factory" | "chart" | "shield" | "trending";
|
|
19
|
+
order?: number | undefined;
|
|
20
|
+
ctaHref?: string | undefined;
|
|
21
|
+
ctaLabel?: string | undefined;
|
|
22
|
+
}, {
|
|
23
|
+
description: string;
|
|
24
|
+
status: "soon" | "beta" | "live";
|
|
25
|
+
tagline: string;
|
|
26
|
+
iconKey: "spark" | "target" | "activity" | "factory" | "chart" | "shield" | "trending";
|
|
27
|
+
order?: number | undefined;
|
|
28
|
+
ctaHref?: string | undefined;
|
|
29
|
+
ctaLabel?: string | undefined;
|
|
30
|
+
}>;
|
|
31
|
+
export declare const deployBlockSchema: z.ZodObject<{
|
|
32
|
+
region: z.ZodOptional<z.ZodString>;
|
|
33
|
+
serviceName: z.ZodOptional<z.ZodString>;
|
|
34
|
+
}, "passthrough", z.ZodTypeAny, z.objectOutputType<{
|
|
35
|
+
region: z.ZodOptional<z.ZodString>;
|
|
36
|
+
serviceName: z.ZodOptional<z.ZodString>;
|
|
37
|
+
}, z.ZodTypeAny, "passthrough">, z.objectInputType<{
|
|
38
|
+
region: z.ZodOptional<z.ZodString>;
|
|
39
|
+
serviceName: z.ZodOptional<z.ZodString>;
|
|
40
|
+
}, z.ZodTypeAny, "passthrough">>;
|
|
41
|
+
export declare const neetruConfigSchema: z.ZodObject<{
|
|
42
|
+
$schema: z.ZodOptional<z.ZodString>;
|
|
43
|
+
slug: z.ZodString;
|
|
44
|
+
name: z.ZodString;
|
|
45
|
+
runtime: z.ZodEnum<["nextjs", "node-api"]>;
|
|
46
|
+
tenantId: z.ZodOptional<z.ZodString>;
|
|
47
|
+
publish: z.ZodOptional<z.ZodObject<{
|
|
48
|
+
tagline: z.ZodString;
|
|
49
|
+
description: z.ZodString;
|
|
50
|
+
iconKey: z.ZodEnum<["activity", "factory", "chart", "shield", "spark", "target", "trending"]>;
|
|
51
|
+
status: z.ZodEnum<["live", "soon", "beta"]>;
|
|
52
|
+
order: z.ZodOptional<z.ZodNumber>;
|
|
53
|
+
ctaHref: z.ZodOptional<z.ZodString>;
|
|
54
|
+
ctaLabel: z.ZodOptional<z.ZodString>;
|
|
55
|
+
}, "strip", z.ZodTypeAny, {
|
|
56
|
+
description: string;
|
|
57
|
+
status: "soon" | "beta" | "live";
|
|
58
|
+
tagline: string;
|
|
59
|
+
iconKey: "spark" | "target" | "activity" | "factory" | "chart" | "shield" | "trending";
|
|
60
|
+
order?: number | undefined;
|
|
61
|
+
ctaHref?: string | undefined;
|
|
62
|
+
ctaLabel?: string | undefined;
|
|
63
|
+
}, {
|
|
64
|
+
description: string;
|
|
65
|
+
status: "soon" | "beta" | "live";
|
|
66
|
+
tagline: string;
|
|
67
|
+
iconKey: "spark" | "target" | "activity" | "factory" | "chart" | "shield" | "trending";
|
|
68
|
+
order?: number | undefined;
|
|
69
|
+
ctaHref?: string | undefined;
|
|
70
|
+
ctaLabel?: string | undefined;
|
|
71
|
+
}>>;
|
|
72
|
+
deploy: z.ZodOptional<z.ZodObject<{
|
|
73
|
+
region: z.ZodOptional<z.ZodString>;
|
|
74
|
+
serviceName: z.ZodOptional<z.ZodString>;
|
|
75
|
+
}, "passthrough", z.ZodTypeAny, z.objectOutputType<{
|
|
76
|
+
region: z.ZodOptional<z.ZodString>;
|
|
77
|
+
serviceName: z.ZodOptional<z.ZodString>;
|
|
78
|
+
}, z.ZodTypeAny, "passthrough">, z.objectInputType<{
|
|
79
|
+
region: z.ZodOptional<z.ZodString>;
|
|
80
|
+
serviceName: z.ZodOptional<z.ZodString>;
|
|
81
|
+
}, z.ZodTypeAny, "passthrough">>>;
|
|
82
|
+
}, "strip", z.ZodTypeAny, {
|
|
83
|
+
name: string;
|
|
84
|
+
slug: string;
|
|
85
|
+
runtime: "nextjs" | "node-api";
|
|
86
|
+
$schema?: string | undefined;
|
|
87
|
+
tenantId?: string | undefined;
|
|
88
|
+
publish?: {
|
|
89
|
+
description: string;
|
|
90
|
+
status: "soon" | "beta" | "live";
|
|
91
|
+
tagline: string;
|
|
92
|
+
iconKey: "spark" | "target" | "activity" | "factory" | "chart" | "shield" | "trending";
|
|
93
|
+
order?: number | undefined;
|
|
94
|
+
ctaHref?: string | undefined;
|
|
95
|
+
ctaLabel?: string | undefined;
|
|
96
|
+
} | undefined;
|
|
97
|
+
deploy?: z.objectOutputType<{
|
|
98
|
+
region: z.ZodOptional<z.ZodString>;
|
|
99
|
+
serviceName: z.ZodOptional<z.ZodString>;
|
|
100
|
+
}, z.ZodTypeAny, "passthrough"> | undefined;
|
|
101
|
+
}, {
|
|
102
|
+
name: string;
|
|
103
|
+
slug: string;
|
|
104
|
+
runtime: "nextjs" | "node-api";
|
|
105
|
+
$schema?: string | undefined;
|
|
106
|
+
tenantId?: string | undefined;
|
|
107
|
+
publish?: {
|
|
108
|
+
description: string;
|
|
109
|
+
status: "soon" | "beta" | "live";
|
|
110
|
+
tagline: string;
|
|
111
|
+
iconKey: "spark" | "target" | "activity" | "factory" | "chart" | "shield" | "trending";
|
|
112
|
+
order?: number | undefined;
|
|
113
|
+
ctaHref?: string | undefined;
|
|
114
|
+
ctaLabel?: string | undefined;
|
|
115
|
+
} | undefined;
|
|
116
|
+
deploy?: z.objectInputType<{
|
|
117
|
+
region: z.ZodOptional<z.ZodString>;
|
|
118
|
+
serviceName: z.ZodOptional<z.ZodString>;
|
|
119
|
+
}, z.ZodTypeAny, "passthrough"> | undefined;
|
|
120
|
+
}>;
|
|
121
|
+
export type NeetruConfig = z.infer<typeof neetruConfigSchema>;
|
|
122
|
+
export type PublishBlock = z.infer<typeof publishBlockSchema>;
|
|
123
|
+
export declare const catalogUpsertPayloadSchema: z.ZodObject<{
|
|
124
|
+
slug: z.ZodString;
|
|
125
|
+
name: z.ZodString;
|
|
126
|
+
tagline: z.ZodString;
|
|
127
|
+
description: z.ZodString;
|
|
128
|
+
iconKey: z.ZodEnum<["activity", "factory", "chart", "shield", "spark", "target", "trending"]>;
|
|
129
|
+
status: z.ZodEnum<["live", "soon", "beta"]>;
|
|
130
|
+
order: z.ZodNumber;
|
|
131
|
+
published: z.ZodBoolean;
|
|
132
|
+
ctaHref: z.ZodOptional<z.ZodString>;
|
|
133
|
+
ctaLabel: z.ZodOptional<z.ZodString>;
|
|
134
|
+
}, "strip", z.ZodTypeAny, {
|
|
135
|
+
description: string;
|
|
136
|
+
name: string;
|
|
137
|
+
status: "soon" | "beta" | "live";
|
|
138
|
+
slug: string;
|
|
139
|
+
published: boolean;
|
|
140
|
+
tagline: string;
|
|
141
|
+
iconKey: "spark" | "target" | "activity" | "factory" | "chart" | "shield" | "trending";
|
|
142
|
+
order: number;
|
|
143
|
+
ctaHref?: string | undefined;
|
|
144
|
+
ctaLabel?: string | undefined;
|
|
145
|
+
}, {
|
|
146
|
+
description: string;
|
|
147
|
+
name: string;
|
|
148
|
+
status: "soon" | "beta" | "live";
|
|
149
|
+
slug: string;
|
|
150
|
+
published: boolean;
|
|
151
|
+
tagline: string;
|
|
152
|
+
iconKey: "spark" | "target" | "activity" | "factory" | "chart" | "shield" | "trending";
|
|
153
|
+
order: number;
|
|
154
|
+
ctaHref?: string | undefined;
|
|
155
|
+
ctaLabel?: string | undefined;
|
|
156
|
+
}>;
|
|
157
|
+
export type CatalogUpsertPayload = z.infer<typeof catalogUpsertPayloadSchema>;
|
|
158
|
+
export declare const catalogUnpublishPayloadSchema: z.ZodObject<{
|
|
159
|
+
slug: z.ZodString;
|
|
160
|
+
}, "strip", z.ZodTypeAny, {
|
|
161
|
+
slug: string;
|
|
162
|
+
}, {
|
|
163
|
+
slug: string;
|
|
164
|
+
}>;
|
|
165
|
+
export type CatalogUnpublishPayload = z.infer<typeof catalogUnpublishPayloadSchema>;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export const PUBLIC_PRODUCT_ICON_KEYS = [
|
|
3
|
+
'activity',
|
|
4
|
+
'factory',
|
|
5
|
+
'chart',
|
|
6
|
+
'shield',
|
|
7
|
+
'spark',
|
|
8
|
+
'target',
|
|
9
|
+
'trending',
|
|
10
|
+
];
|
|
11
|
+
export const PUBLIC_PRODUCT_STATUSES = ['live', 'soon', 'beta'];
|
|
12
|
+
export const RUNTIMES = ['nextjs', 'node-api'];
|
|
13
|
+
export const slugSchema = z
|
|
14
|
+
.string()
|
|
15
|
+
.min(2, 'slug deve ter pelo menos 2 caracteres')
|
|
16
|
+
.max(64, 'slug deve ter no máximo 64 caracteres')
|
|
17
|
+
.regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/, 'slug deve estar em kebab-case (lowercase, dígitos, hífens)');
|
|
18
|
+
export const publishBlockSchema = z.object({
|
|
19
|
+
tagline: z.string().min(2).max(120),
|
|
20
|
+
description: z.string().min(10).max(2000),
|
|
21
|
+
iconKey: z.enum(PUBLIC_PRODUCT_ICON_KEYS),
|
|
22
|
+
status: z.enum(PUBLIC_PRODUCT_STATUSES),
|
|
23
|
+
order: z.number().int().nonnegative().optional(),
|
|
24
|
+
ctaHref: z.string().url().optional(),
|
|
25
|
+
ctaLabel: z.string().min(1).max(60).optional(),
|
|
26
|
+
});
|
|
27
|
+
export const deployBlockSchema = z
|
|
28
|
+
.object({
|
|
29
|
+
region: z.string().optional(),
|
|
30
|
+
serviceName: z.string().optional(),
|
|
31
|
+
})
|
|
32
|
+
.passthrough();
|
|
33
|
+
export const neetruConfigSchema = z.object({
|
|
34
|
+
$schema: z.string().optional(),
|
|
35
|
+
slug: slugSchema,
|
|
36
|
+
name: z.string().min(2).max(80),
|
|
37
|
+
runtime: z.enum(RUNTIMES),
|
|
38
|
+
tenantId: z.string().optional(),
|
|
39
|
+
publish: publishBlockSchema.optional(),
|
|
40
|
+
deploy: deployBlockSchema.optional(),
|
|
41
|
+
});
|
|
42
|
+
export const catalogUpsertPayloadSchema = z.object({
|
|
43
|
+
slug: slugSchema,
|
|
44
|
+
name: z.string().min(2).max(80),
|
|
45
|
+
tagline: z.string().min(2).max(120),
|
|
46
|
+
description: z.string().min(10).max(2000),
|
|
47
|
+
iconKey: z.enum(PUBLIC_PRODUCT_ICON_KEYS),
|
|
48
|
+
status: z.enum(PUBLIC_PRODUCT_STATUSES),
|
|
49
|
+
order: z.number().int().nonnegative(),
|
|
50
|
+
published: z.boolean(),
|
|
51
|
+
ctaHref: z.string().url().optional(),
|
|
52
|
+
ctaLabel: z.string().min(1).max(60).optional(),
|
|
53
|
+
});
|
|
54
|
+
export const catalogUnpublishPayloadSchema = z.object({
|
|
55
|
+
slug: slugSchema,
|
|
56
|
+
});
|
|
57
|
+
//# sourceMappingURL=config-schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-schema.js","sourceRoot":"","sources":["../../src/lib/config-schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import Conf from 'conf';
|
|
2
|
+
interface NeetruConfig {
|
|
3
|
+
anthropicApiKey?: string;
|
|
4
|
+
openaiApiKey?: string;
|
|
5
|
+
geminiApiKey?: string;
|
|
6
|
+
neetruApiKey?: string;
|
|
7
|
+
neetruApiUrl: string;
|
|
8
|
+
defaultModel: 'claude' | 'openai' | 'gemini' | 'auto';
|
|
9
|
+
projectName?: string;
|
|
10
|
+
'telemetry.enabled'?: boolean;
|
|
11
|
+
}
|
|
12
|
+
export declare const config: Conf<NeetruConfig>;
|
|
13
|
+
export declare function getKey(name: keyof NeetruConfig): string | boolean | undefined;
|
|
14
|
+
export declare function requireKey(name: 'anthropicApiKey' | 'openaiApiKey' | 'geminiApiKey' | 'neetruApiKey'): string;
|
|
15
|
+
export {};
|