@neetru/cli 2.8.0 → 2.9.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +128 -0
- package/dist/commands/admin/sdk-credential.d.ts +19 -0
- package/dist/commands/admin/sdk-credential.js +169 -0
- package/dist/commands/admin/sdk-credential.js.map +1 -0
- package/dist/commands/bug.d.ts +87 -0
- package/dist/commands/bug.js +419 -0
- package/dist/commands/bug.js.map +1 -0
- package/dist/commands/customers.d.ts +17 -0
- package/dist/commands/customers.js +160 -0
- package/dist/commands/customers.js.map +1 -0
- package/dist/commands/db.d.ts +4 -0
- package/dist/commands/db.js +380 -64
- package/dist/commands/db.js.map +1 -1
- package/dist/commands/docs.d.ts +4 -0
- package/dist/commands/docs.js +99 -7
- package/dist/commands/docs.js.map +1 -1
- package/dist/commands/doctor.js +4 -1
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/marketplace.d.ts +36 -0
- package/dist/commands/marketplace.js +584 -0
- package/dist/commands/marketplace.js.map +1 -0
- package/dist/commands/new.js +196 -37
- package/dist/commands/new.js.map +1 -1
- package/dist/commands/open.d.ts +8 -0
- package/dist/commands/open.js +61 -13
- package/dist/commands/open.js.map +1 -1
- package/dist/commands/products.d.ts +23 -0
- package/dist/commands/products.js +39 -1
- package/dist/commands/products.js.map +1 -1
- package/dist/commands/tenants.js +24 -2
- package/dist/commands/tenants.js.map +1 -1
- package/dist/commands/ui.d.ts +1 -1
- package/dist/commands/ui.js +172 -2
- package/dist/commands/ui.js.map +1 -1
- package/dist/commands/workspaces.d.ts +10 -1
- package/dist/commands/workspaces.js +145 -23
- package/dist/commands/workspaces.js.map +1 -1
- package/dist/index.js +327 -4
- package/dist/index.js.map +1 -1
- package/dist/lib/config-schema.d.ts +10 -10
- package/dist/lib/pickers.d.ts +25 -0
- package/dist/lib/pickers.js +75 -1
- package/dist/lib/pickers.js.map +1 -1
- package/package.json +5 -2
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,134 @@
|
|
|
2
2
|
|
|
3
3
|
Convenção: [Keep a Changelog](https://keepachangelog.com/) + [SemVer](https://semver.org/).
|
|
4
4
|
|
|
5
|
+
## [2.9.3] — 2026-05-25 (fix HIGH: branch NoSQL no db apply — Bug 11 Fase 1)
|
|
6
|
+
|
|
7
|
+
### Corrigido
|
|
8
|
+
|
|
9
|
+
- **Bug 11 Fase 1 — `neetru db apply` era SQL-only; branch NoSQL nunca era alcançada.**
|
|
10
|
+
Adicionada detecção de engine em `runDbApply`: quando `engine ∈ {nosql-vm, firestore-instance}`,
|
|
11
|
+
o pipeline SQL (drizzle-kit + Postgres efêmero + classify) é completamente ignorado.
|
|
12
|
+
A nova função `runNoSqlApply` calcula o fingerprint SHA-256 do `schema.ts` local e envia
|
|
13
|
+
`POST /api/cli/v1/db/apply` com `schemaDefinition: null` (Fase 1 — sem JSON Schema export).
|
|
14
|
+
O Core registra o snapshot em `product_db_schema_snapshots/{id}` (implementado em commit `116f0d60`).
|
|
15
|
+
Saída interativa: spinner `"Aplicando schema NoSQL (sem rehearse — engine schemaless)…"`.
|
|
16
|
+
Saída `--json`: `{ ok, status, engine, snapshotId, fingerprint, dryRun }`.
|
|
17
|
+
`--dry-run` calcula fingerprint mas não envia ao Core (status `dry_run`).
|
|
18
|
+
O pipeline SQL para `cloud-sql-*` e `vm-*` permanece intacto — sem regressão.
|
|
19
|
+
|
|
20
|
+
## [2.9.2] — 2026-05-25 (ux: cliente padrão Neetru automático)
|
|
21
|
+
|
|
22
|
+
### Melhorado
|
|
23
|
+
|
|
24
|
+
- **`neetru workspaces create` — `--customer` agora opcional para produtos Neetru-owned.**
|
|
25
|
+
Quando o produto selecionado pertence à Neetru (`ownedBy='neetru'`, `ownerTeam='Neetru Core'`
|
|
26
|
+
ou slug na lista conhecida), o CLI detecta via API e pula o prompt de cliente automaticamente.
|
|
27
|
+
Em modo interativo exibe `"Cliente omitido — produto Neetru detectado. Usando cliente interno automaticamente."`.
|
|
28
|
+
Em modo `--json`, envia `customerId` ausente; o Core injeta o customer interno (`isNeetruInternal=true`).
|
|
29
|
+
Para produtos de terceiros, `--customer` continua obrigatório (erro acionável com instruções de criação).
|
|
30
|
+
|
|
31
|
+
- **`neetru tenants create` — mesma lógica de auto-default.**
|
|
32
|
+
Prompt de `customerId` pulado automaticamente quando produto é Neetru-owned.
|
|
33
|
+
|
|
34
|
+
- **`neetru workspaces create` — mensagem de confirmação no output.**
|
|
35
|
+
Quando `--customer` não é fornecido, exibe `"Cliente: Neetru Tecnologia (interno) — auto-detectado pelo produto Neetru."`.
|
|
36
|
+
|
|
37
|
+
## [2.9.1] — 2026-05-25 (security: 5 HIGH fixes)
|
|
38
|
+
|
|
39
|
+
### Corrigido (segurança)
|
|
40
|
+
|
|
41
|
+
- **HIGH-1 — `db apply --json` selecionava o primeiro banco silenciosamente com múltiplos bancos.**
|
|
42
|
+
Em modo não-interativo (`--json` ou `--yes` sem TTY), se `.neetru/db.json` tiver N > 1 bancos
|
|
43
|
+
e `--db` não for passado, o CLI agora emite erro estruturado em vez de aplicar no primeiro banco.
|
|
44
|
+
Saída JSON: `{ ok: false, error: "db_required", message: "...", available: [...] }`.
|
|
45
|
+
Em CI isso evitava migração silenciosa no banco errado.
|
|
46
|
+
|
|
47
|
+
- **HIGH-2 — Abertura de URL no Windows usava `cmd /c start` sem validação de protocolo.**
|
|
48
|
+
URLs derivadas de config podiam conter caracteres de injeção de shell (`& malicious.exe`).
|
|
49
|
+
Nova função `safeOpenUrl` valida `^https?://` antes de qualquer chamada de sistema e usa
|
|
50
|
+
`rundll32 url.dll,FileProtocolHandler` (sem shell) no Windows. Aplica em `open.ts` e
|
|
51
|
+
`workspaces.ts` (que agora delega para `safeOpenUrl`).
|
|
52
|
+
|
|
53
|
+
- **HIGH-3 — `db init` gravava stub local em `.neetru/db.json` antes de registrar no Core.**
|
|
54
|
+
Falha de rede/400 do Core deixava entrada órfã e re-rodar `db init` adicionava banco duplicado.
|
|
55
|
+
Agora o registro no Core acontece primeiro; `.neetru/db.json` só é escrito após sucesso.
|
|
56
|
+
|
|
57
|
+
- **HIGH-4 — `marketplace sdk add <template>` aceitava path traversal.**
|
|
58
|
+
`path.join(templatesDir, templateName)` aceitava `../../etc/passwd` como nome.
|
|
59
|
+
Adicionada whitelist `ALLOWED_SDK_TEMPLATES` e verificação `startsWith(resolve(templatesDir) + sep)`
|
|
60
|
+
como defesa em profundidade.
|
|
61
|
+
|
|
62
|
+
- **HIGH-5 — `docs publish` usava path absoluto Windows como slug.**
|
|
63
|
+
Path como `C:/Users/dev/projeto/docs/intro.md` virava slug `C:/Users/dev/projeto/docs/intro`,
|
|
64
|
+
expondo estrutura de filesystem. `deriveSlugFromPath` agora converte para relativo via
|
|
65
|
+
`path.relative(cwd, file)` e rejeita slugs com `:`, `..` ou `/` inicial.
|
|
66
|
+
|
|
67
|
+
## [2.8.2] — 2026-05-25 (fix UX slug conflict + docs open)
|
|
68
|
+
|
|
69
|
+
### Corrigido
|
|
70
|
+
|
|
71
|
+
- **Bug #31 — `neetru new` não falha seco em conflito de slug.**
|
|
72
|
+
Quando o Core retorna 400 com "Já existe um produto com o slug X", o CLI
|
|
73
|
+
agora exibe o produto existente (nome, ID, status) e oferece um prompt
|
|
74
|
+
interativo com três opções:
|
|
75
|
+
1. Vincular este projeto local ao produto existente (escreve `.neetru/config.json`
|
|
76
|
+
apontando para o `productId`).
|
|
77
|
+
2. Criar com slug diferente — lista sugestões (`gestovendas-v2`, `-2`, etc.)
|
|
78
|
+
ou permite digitar um slug livre.
|
|
79
|
+
3. Cancelar.
|
|
80
|
+
Removida a mensagem "Tente manualmente: neetru products create --slug <mesmo-slug>"
|
|
81
|
+
que sugeria repetir exatamente o comando que vai falhar de novo.
|
|
82
|
+
O fallback genérico cobre qualquer 400 cujo `message` contenha "Já existe",
|
|
83
|
+
"slug", "already exists" ou "duplicate".
|
|
84
|
+
|
|
85
|
+
- **Bug #26 — `neetru docs` não abria documentação ao vivo.**
|
|
86
|
+
O comando `neetru docs` era exclusivamente um registry CRUD (publish/list/get/delete)
|
|
87
|
+
e não tinha forma de acessar a documentação pública. Adicionado:
|
|
88
|
+
- `neetru docs open [topic]` — abre `https://core.neetru.com/docs` (ou seção
|
|
89
|
+
específica) no browser padrão. Tópicos: `sdk`, `cli`, `db`, `webhooks`, `auth`,
|
|
90
|
+
`billing`, `observability`, `infra`, `dns`, `deploy`, `architecture`.
|
|
91
|
+
- `neetru docs open` sem argumento — abre o índice geral.
|
|
92
|
+
- Argumentos desconhecidos abrem busca: `core.neetru.com/docs?q=<query>`.
|
|
93
|
+
- No menu interativo (`neetru ui`), "Docs live" agora exibe "Abrir documentação
|
|
94
|
+
no navegador" como primeira opção antes das opções de registry.
|
|
95
|
+
|
|
96
|
+
### Notas de uso
|
|
97
|
+
|
|
98
|
+
```
|
|
99
|
+
neetru docs open # abre core.neetru.com/docs
|
|
100
|
+
neetru docs open sdk # vai direto pra referência do SDK
|
|
101
|
+
neetru docs open webhooks # manual de runtime/webhooks
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
## [2.8.1] — 2026-05-25 (marketplace)
|
|
105
|
+
|
|
106
|
+
### Adicionado
|
|
107
|
+
|
|
108
|
+
- **`neetru marketplace`** — central de artefatos do ecossistema Neetru.
|
|
109
|
+
- `neetru marketplace skills install` — clona `Neetru/neetru-libs` em
|
|
110
|
+
`~/.neetru/marketplace-cache/` e instala skills em `~/.claude/skills/`.
|
|
111
|
+
Linux/macOS: symlink (atualizações automáticas via git pull).
|
|
112
|
+
Windows: cópia recursiva (sem exigir Developer Mode).
|
|
113
|
+
- `neetru marketplace skills update` — git pull no cache + re-copia skills
|
|
114
|
+
instaladas como cópia (symlinks já são atualizados pelo pull).
|
|
115
|
+
- `neetru marketplace skills list` — tabela com nome, versão, status e
|
|
116
|
+
descrição de cada skill disponível no cache local.
|
|
117
|
+
- `neetru marketplace skills uninstall` — remove skills de `~/.claude/skills/`
|
|
118
|
+
com confirmação interativa (bypass via `--yes`).
|
|
119
|
+
- `neetru marketplace sdk init` — adiciona `@neetru/sdk@^2.1.0` ao
|
|
120
|
+
`package.json` do projeto atual e cria `src/neetru.ts` com boilerplate
|
|
121
|
+
de `createNeetruClient`. Idempotente — não sobrescreve arquivo existente.
|
|
122
|
+
- `neetru marketplace sdk templates` — lista templates disponíveis em
|
|
123
|
+
`templates/` da instalação do CLI.
|
|
124
|
+
- `neetru marketplace sdk add <template>` — copia template de feature
|
|
125
|
+
(auth/billing/usage/support/users) pra `src/` do projeto atual.
|
|
126
|
+
- `neetru marketplace browse` — abre `https://github.com/Neetru/neetru-libs`
|
|
127
|
+
no browser (start/open/xdg-open por plataforma).
|
|
128
|
+
- **Menu interativo** — item **"Marketplace"** adicionado ao menu principal
|
|
129
|
+
(entre Suporte e Docs live) com sub-menu completo: skills (instalar /
|
|
130
|
+
atualizar / listar / remover) + SDK (init / add template / listar / docs)
|
|
131
|
+
+ abrir no GitHub.
|
|
132
|
+
|
|
5
133
|
## [2.7.5] — 2026-05-20 (fix do crash no upgrade)
|
|
6
134
|
|
|
7
135
|
### Corrigido
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export interface SdkCredentialCreateOptions {
|
|
2
|
+
productId?: string;
|
|
3
|
+
name?: string;
|
|
4
|
+
scopes?: string;
|
|
5
|
+
mfaToken?: string;
|
|
6
|
+
json?: boolean;
|
|
7
|
+
}
|
|
8
|
+
export declare function runSdkCredentialCreate(opts: SdkCredentialCreateOptions): Promise<void>;
|
|
9
|
+
export interface SdkCredentialListOptions {
|
|
10
|
+
productId?: string;
|
|
11
|
+
json?: boolean;
|
|
12
|
+
}
|
|
13
|
+
export declare function runSdkCredentialList(opts: SdkCredentialListOptions): Promise<void>;
|
|
14
|
+
export interface SdkCredentialRevokeOptions {
|
|
15
|
+
productId?: string;
|
|
16
|
+
mfaToken?: string;
|
|
17
|
+
json?: boolean;
|
|
18
|
+
}
|
|
19
|
+
export declare function runSdkCredentialRevoke(clientId: string | undefined, opts: SdkCredentialRevokeOptions): Promise<void>;
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `neetru admin sdk-credential` — gerenciamento de credenciais OIDC (SDK) por produto.
|
|
3
|
+
*
|
|
4
|
+
* Sub-comandos:
|
|
5
|
+
* create — cria cliente OIDC e exibe clientSecret ONE-TIME
|
|
6
|
+
* list — lista clientes OIDC de um produto
|
|
7
|
+
* revoke — revoga (desativa) um cliente OIDC
|
|
8
|
+
*
|
|
9
|
+
* Nomenclatura `sdk-credential` em vez de `oidc-client`:
|
|
10
|
+
* - Alinhado com o vocabulário do desenvolvedor do produto ("credencial SDK").
|
|
11
|
+
* - O operador não precisa saber de OIDC internamente; o que ele cria é
|
|
12
|
+
* uma credencial que o SDK Neetru usa (`NEETRU_CLIENT_ID` / `NEETRU_CLIENT_SECRET`).
|
|
13
|
+
* - Internamente, o Core persiste como `oidc_clients/{clientId}` — isso é detalhe
|
|
14
|
+
* de implementação, não precisa aparecer no CLI.
|
|
15
|
+
*
|
|
16
|
+
* Endpoints:
|
|
17
|
+
* GET /api/cli/v1/products/{productId}/oidc-clients
|
|
18
|
+
* POST /api/cli/v1/products/{productId}/oidc-clients
|
|
19
|
+
* DELETE /api/cli/v1/products/{productId}/oidc-clients/{clientId}
|
|
20
|
+
*/
|
|
21
|
+
import chalk from 'chalk';
|
|
22
|
+
import ora from 'ora';
|
|
23
|
+
import { apiRequest } from '../../lib/api-client.js';
|
|
24
|
+
import { requireToken, handleApiError } from '../../lib/cli-read.js';
|
|
25
|
+
import { renderTable } from '../../lib/render.js';
|
|
26
|
+
import { log } from '../../utils/logger.js';
|
|
27
|
+
export async function runSdkCredentialCreate(opts) {
|
|
28
|
+
const token = await requireToken(opts.json);
|
|
29
|
+
// Validações mínimas — feedback rápido antes de chamar API.
|
|
30
|
+
if (!opts.productId) {
|
|
31
|
+
if (opts.json) {
|
|
32
|
+
console.log(JSON.stringify({ ok: false, error: 'missing_param', message: '--product-id é obrigatório.' }));
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
log.error('--product-id é obrigatório.');
|
|
36
|
+
}
|
|
37
|
+
process.exit(1);
|
|
38
|
+
}
|
|
39
|
+
if (!opts.name) {
|
|
40
|
+
if (opts.json) {
|
|
41
|
+
console.log(JSON.stringify({ ok: false, error: 'missing_param', message: '--name é obrigatório.' }));
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
log.error('--name é obrigatório.');
|
|
45
|
+
}
|
|
46
|
+
process.exit(1);
|
|
47
|
+
}
|
|
48
|
+
const scopesList = opts.scopes
|
|
49
|
+
? opts.scopes.split(',').map((s) => s.trim()).filter(Boolean)
|
|
50
|
+
: undefined;
|
|
51
|
+
const body = { name: opts.name };
|
|
52
|
+
if (scopesList)
|
|
53
|
+
body.allowedScopes = scopesList;
|
|
54
|
+
const headers = {};
|
|
55
|
+
if (opts.mfaToken)
|
|
56
|
+
headers['x-neetru-mfa-token'] = opts.mfaToken;
|
|
57
|
+
const spinner = opts.json
|
|
58
|
+
? null
|
|
59
|
+
: ora({ text: 'Criando credencial OIDC…', color: 'blue' }).start();
|
|
60
|
+
let res;
|
|
61
|
+
try {
|
|
62
|
+
res = await apiRequest(`/api/cli/v1/products/${opts.productId}/oidc-clients`, { method: 'POST', body, token, headers });
|
|
63
|
+
spinner?.stop();
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
spinner?.fail('Falha ao criar credencial.');
|
|
67
|
+
handleApiError(error, opts.json);
|
|
68
|
+
}
|
|
69
|
+
if (opts.json) {
|
|
70
|
+
console.log(JSON.stringify(res));
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
// Saída humana — exibe secret one-time com destaque visual.
|
|
74
|
+
console.log();
|
|
75
|
+
log.success(`Credencial OIDC criada: ${chalk.cyan(res.clientId)}`);
|
|
76
|
+
console.log();
|
|
77
|
+
console.log(chalk.yellow.bold(' Secret (ONE-TIME — guarde agora, não pode ser recuperado):'));
|
|
78
|
+
console.log(` ${chalk.bold(res.clientSecret)}`);
|
|
79
|
+
console.log();
|
|
80
|
+
console.log(chalk.dim(` Escopos: ${res.allowedScopes.join(', ')}`));
|
|
81
|
+
console.log();
|
|
82
|
+
console.log(chalk.bold(' Use em produção:'));
|
|
83
|
+
console.log(` ${chalk.cyan('NEETRU_CLIENT_ID')}=${res.clientId}`);
|
|
84
|
+
console.log(` ${chalk.cyan('NEETRU_CLIENT_SECRET')}=${res.clientSecret}`);
|
|
85
|
+
console.log(` ${chalk.cyan('NEETRU_ENV')}=prod`);
|
|
86
|
+
console.log();
|
|
87
|
+
}
|
|
88
|
+
export async function runSdkCredentialList(opts) {
|
|
89
|
+
const token = await requireToken(opts.json);
|
|
90
|
+
if (!opts.productId) {
|
|
91
|
+
if (opts.json) {
|
|
92
|
+
console.log(JSON.stringify({ ok: false, error: 'missing_param', message: '--product-id é obrigatório.' }));
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
log.error('--product-id é obrigatório.');
|
|
96
|
+
}
|
|
97
|
+
process.exit(1);
|
|
98
|
+
}
|
|
99
|
+
const spinner = opts.json
|
|
100
|
+
? null
|
|
101
|
+
: ora({ text: 'Buscando credenciais…', color: 'blue' }).start();
|
|
102
|
+
let res;
|
|
103
|
+
try {
|
|
104
|
+
res = await apiRequest(`/api/cli/v1/products/${opts.productId}/oidc-clients`, { token });
|
|
105
|
+
spinner?.stop();
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
spinner?.fail('Falha ao buscar credenciais.');
|
|
109
|
+
handleApiError(error, opts.json);
|
|
110
|
+
}
|
|
111
|
+
if (opts.json) {
|
|
112
|
+
console.log(JSON.stringify(res));
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
log.heading(`Credenciais OIDC — produto ${opts.productId} (${res.count})`);
|
|
116
|
+
renderTable([
|
|
117
|
+
{ header: 'CLIENT ID', value: (r) => r.clientId, maxWidth: 38 },
|
|
118
|
+
{ header: 'NOME', value: (r) => r.name, maxWidth: 28 },
|
|
119
|
+
{ header: 'ESCOPOS', value: (r) => r.allowedScopes.join(', '), maxWidth: 40 },
|
|
120
|
+
{
|
|
121
|
+
header: 'STATUS',
|
|
122
|
+
value: (r) => r.status === 'active' ? chalk.green(r.status) : chalk.dim(r.status),
|
|
123
|
+
},
|
|
124
|
+
{ header: 'CRIADO EM', value: (r) => r.createdAt?.slice(0, 10) ?? '—' },
|
|
125
|
+
], res.clients);
|
|
126
|
+
}
|
|
127
|
+
export async function runSdkCredentialRevoke(clientId, opts) {
|
|
128
|
+
const token = await requireToken(opts.json);
|
|
129
|
+
if (!clientId) {
|
|
130
|
+
if (opts.json) {
|
|
131
|
+
console.log(JSON.stringify({ ok: false, error: 'missing_param', message: '<clientId> é obrigatório.' }));
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
log.error('<clientId> é obrigatório.');
|
|
135
|
+
}
|
|
136
|
+
process.exit(1);
|
|
137
|
+
}
|
|
138
|
+
if (!opts.productId) {
|
|
139
|
+
if (opts.json) {
|
|
140
|
+
console.log(JSON.stringify({ ok: false, error: 'missing_param', message: '--product-id é obrigatório.' }));
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
log.error('--product-id é obrigatório.');
|
|
144
|
+
}
|
|
145
|
+
process.exit(1);
|
|
146
|
+
}
|
|
147
|
+
const headers = {};
|
|
148
|
+
if (opts.mfaToken)
|
|
149
|
+
headers['x-neetru-mfa-token'] = opts.mfaToken;
|
|
150
|
+
const spinner = opts.json
|
|
151
|
+
? null
|
|
152
|
+
: ora({ text: `Revogando ${clientId}…`, color: 'yellow' }).start();
|
|
153
|
+
let res;
|
|
154
|
+
try {
|
|
155
|
+
res = await apiRequest(`/api/cli/v1/products/${opts.productId}/oidc-clients/${clientId}`, { method: 'DELETE', token, headers });
|
|
156
|
+
spinner?.stop();
|
|
157
|
+
}
|
|
158
|
+
catch (error) {
|
|
159
|
+
spinner?.fail('Falha ao revogar credencial.');
|
|
160
|
+
handleApiError(error, opts.json);
|
|
161
|
+
}
|
|
162
|
+
if (opts.json) {
|
|
163
|
+
console.log(JSON.stringify(res));
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
log.success(`Credencial revogada: ${chalk.dim(res.clientId)}`);
|
|
167
|
+
log.dim('O clientSecret não funcionará mais para novos tokens.');
|
|
168
|
+
}
|
|
169
|
+
//# sourceMappingURL=sdk-credential.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sdk-credential.js","sourceRoot":"","sources":["../../../src/commands/admin/sdk-credential.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
export interface BugReportOptions {
|
|
2
|
+
title?: string;
|
|
3
|
+
body?: string;
|
|
4
|
+
category?: string;
|
|
5
|
+
severity?: string;
|
|
6
|
+
product?: string;
|
|
7
|
+
steps?: string;
|
|
8
|
+
expected?: string;
|
|
9
|
+
actual?: string;
|
|
10
|
+
actorType?: string;
|
|
11
|
+
json?: boolean;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Cria um bug report interativo (ou one-shot via flags).
|
|
15
|
+
*
|
|
16
|
+
* Modo interativo: prompts inquirer para title/body/category/severity.
|
|
17
|
+
* Modo one-shot: --title + --body obrigatórios; demais com defaults.
|
|
18
|
+
*
|
|
19
|
+
* Exemplo interativo:
|
|
20
|
+
* neetru bug report
|
|
21
|
+
*
|
|
22
|
+
* Exemplo one-shot (para agentes Claude):
|
|
23
|
+
* neetru bug report --title "neetru deploy trava" --body "Stack trace..." \
|
|
24
|
+
* --category cli --severity high --actor-type agent_claude
|
|
25
|
+
*/
|
|
26
|
+
export declare function runBugReport(opts: BugReportOptions): Promise<void>;
|
|
27
|
+
export interface BugListOptions {
|
|
28
|
+
status?: string;
|
|
29
|
+
category?: string;
|
|
30
|
+
assignedTo?: string;
|
|
31
|
+
product?: string;
|
|
32
|
+
limit?: string;
|
|
33
|
+
json?: boolean;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Lista bugs com filtros opcionais.
|
|
37
|
+
*
|
|
38
|
+
* Exemplo (para agentes Claude puxarem bugs abertos):
|
|
39
|
+
* neetru bug list --status open --json
|
|
40
|
+
*/
|
|
41
|
+
export declare function runBugList(opts: BugListOptions): Promise<void>;
|
|
42
|
+
export interface BugShowOptions {
|
|
43
|
+
json?: boolean;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Mostra detalhe completo de um bug.
|
|
47
|
+
*
|
|
48
|
+
* Exemplo:
|
|
49
|
+
* neetru bug show bug_abc123
|
|
50
|
+
*/
|
|
51
|
+
export declare function runBugShow(id: string, opts: BugShowOptions): Promise<void>;
|
|
52
|
+
export interface BugClaimOptions {
|
|
53
|
+
assignedTo?: string;
|
|
54
|
+
json?: boolean;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Assume a investigação de um bug.
|
|
58
|
+
*
|
|
59
|
+
* Exemplo:
|
|
60
|
+
* neetru bug claim bug_abc123
|
|
61
|
+
*/
|
|
62
|
+
export declare function runBugClaim(id: string, opts: BugClaimOptions): Promise<void>;
|
|
63
|
+
export interface BugResolveOptions {
|
|
64
|
+
summary?: string;
|
|
65
|
+
commit?: string;
|
|
66
|
+
status?: string;
|
|
67
|
+
duplicateOf?: string;
|
|
68
|
+
json?: boolean;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Marca bug como resolvido, wont_fix ou duplicate.
|
|
72
|
+
*
|
|
73
|
+
* Exemplo:
|
|
74
|
+
* neetru bug resolve bug_abc123 --summary "Corrigido em deploy X" --commit abc1234
|
|
75
|
+
*/
|
|
76
|
+
export declare function runBugResolve(id: string, opts: BugResolveOptions): Promise<void>;
|
|
77
|
+
export interface BugCommentOptions {
|
|
78
|
+
body?: string;
|
|
79
|
+
json?: boolean;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Adiciona comentário em um bug.
|
|
83
|
+
*
|
|
84
|
+
* Exemplo (agente Claude):
|
|
85
|
+
* neetru bug comment bug_abc123 --body "Testei em Node 22 — reproduzível."
|
|
86
|
+
*/
|
|
87
|
+
export declare function runBugComment(id: string, opts: BugCommentOptions): Promise<void>;
|