@neetru/cli 2.8.0 → 2.9.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/CHANGELOG.md +96 -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 +267 -63
- 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 +15 -0
- 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 +136 -22
- package/dist/commands/workspaces.js.map +1 -1
- package/dist/index.js +276 -4
- package/dist/index.js.map +1 -1
- package/dist/lib/config-schema.d.ts +8 -8
- package/dist/lib/pickers.d.ts +12 -0
- package/dist/lib/pickers.js +34 -0
- package/dist/lib/pickers.js.map +1 -1
- package/package.json +5 -2
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,102 @@
|
|
|
2
2
|
|
|
3
3
|
Convenção: [Keep a Changelog](https://keepachangelog.com/) + [SemVer](https://semver.org/).
|
|
4
4
|
|
|
5
|
+
## [2.9.1] — 2026-05-25 (security: 5 HIGH fixes)
|
|
6
|
+
|
|
7
|
+
### Corrigido (segurança)
|
|
8
|
+
|
|
9
|
+
- **HIGH-1 — `db apply --json` selecionava o primeiro banco silenciosamente com múltiplos bancos.**
|
|
10
|
+
Em modo não-interativo (`--json` ou `--yes` sem TTY), se `.neetru/db.json` tiver N > 1 bancos
|
|
11
|
+
e `--db` não for passado, o CLI agora emite erro estruturado em vez de aplicar no primeiro banco.
|
|
12
|
+
Saída JSON: `{ ok: false, error: "db_required", message: "...", available: [...] }`.
|
|
13
|
+
Em CI isso evitava migração silenciosa no banco errado.
|
|
14
|
+
|
|
15
|
+
- **HIGH-2 — Abertura de URL no Windows usava `cmd /c start` sem validação de protocolo.**
|
|
16
|
+
URLs derivadas de config podiam conter caracteres de injeção de shell (`& malicious.exe`).
|
|
17
|
+
Nova função `safeOpenUrl` valida `^https?://` antes de qualquer chamada de sistema e usa
|
|
18
|
+
`rundll32 url.dll,FileProtocolHandler` (sem shell) no Windows. Aplica em `open.ts` e
|
|
19
|
+
`workspaces.ts` (que agora delega para `safeOpenUrl`).
|
|
20
|
+
|
|
21
|
+
- **HIGH-3 — `db init` gravava stub local em `.neetru/db.json` antes de registrar no Core.**
|
|
22
|
+
Falha de rede/400 do Core deixava entrada órfã e re-rodar `db init` adicionava banco duplicado.
|
|
23
|
+
Agora o registro no Core acontece primeiro; `.neetru/db.json` só é escrito após sucesso.
|
|
24
|
+
|
|
25
|
+
- **HIGH-4 — `marketplace sdk add <template>` aceitava path traversal.**
|
|
26
|
+
`path.join(templatesDir, templateName)` aceitava `../../etc/passwd` como nome.
|
|
27
|
+
Adicionada whitelist `ALLOWED_SDK_TEMPLATES` e verificação `startsWith(resolve(templatesDir) + sep)`
|
|
28
|
+
como defesa em profundidade.
|
|
29
|
+
|
|
30
|
+
- **HIGH-5 — `docs publish` usava path absoluto Windows como slug.**
|
|
31
|
+
Path como `C:/Users/dev/projeto/docs/intro.md` virava slug `C:/Users/dev/projeto/docs/intro`,
|
|
32
|
+
expondo estrutura de filesystem. `deriveSlugFromPath` agora converte para relativo via
|
|
33
|
+
`path.relative(cwd, file)` e rejeita slugs com `:`, `..` ou `/` inicial.
|
|
34
|
+
|
|
35
|
+
## [2.8.2] — 2026-05-25 (fix UX slug conflict + docs open)
|
|
36
|
+
|
|
37
|
+
### Corrigido
|
|
38
|
+
|
|
39
|
+
- **Bug #31 — `neetru new` não falha seco em conflito de slug.**
|
|
40
|
+
Quando o Core retorna 400 com "Já existe um produto com o slug X", o CLI
|
|
41
|
+
agora exibe o produto existente (nome, ID, status) e oferece um prompt
|
|
42
|
+
interativo com três opções:
|
|
43
|
+
1. Vincular este projeto local ao produto existente (escreve `.neetru/config.json`
|
|
44
|
+
apontando para o `productId`).
|
|
45
|
+
2. Criar com slug diferente — lista sugestões (`gestovendas-v2`, `-2`, etc.)
|
|
46
|
+
ou permite digitar um slug livre.
|
|
47
|
+
3. Cancelar.
|
|
48
|
+
Removida a mensagem "Tente manualmente: neetru products create --slug <mesmo-slug>"
|
|
49
|
+
que sugeria repetir exatamente o comando que vai falhar de novo.
|
|
50
|
+
O fallback genérico cobre qualquer 400 cujo `message` contenha "Já existe",
|
|
51
|
+
"slug", "already exists" ou "duplicate".
|
|
52
|
+
|
|
53
|
+
- **Bug #26 — `neetru docs` não abria documentação ao vivo.**
|
|
54
|
+
O comando `neetru docs` era exclusivamente um registry CRUD (publish/list/get/delete)
|
|
55
|
+
e não tinha forma de acessar a documentação pública. Adicionado:
|
|
56
|
+
- `neetru docs open [topic]` — abre `https://core.neetru.com/docs` (ou seção
|
|
57
|
+
específica) no browser padrão. Tópicos: `sdk`, `cli`, `db`, `webhooks`, `auth`,
|
|
58
|
+
`billing`, `observability`, `infra`, `dns`, `deploy`, `architecture`.
|
|
59
|
+
- `neetru docs open` sem argumento — abre o índice geral.
|
|
60
|
+
- Argumentos desconhecidos abrem busca: `core.neetru.com/docs?q=<query>`.
|
|
61
|
+
- No menu interativo (`neetru ui`), "Docs live" agora exibe "Abrir documentação
|
|
62
|
+
no navegador" como primeira opção antes das opções de registry.
|
|
63
|
+
|
|
64
|
+
### Notas de uso
|
|
65
|
+
|
|
66
|
+
```
|
|
67
|
+
neetru docs open # abre core.neetru.com/docs
|
|
68
|
+
neetru docs open sdk # vai direto pra referência do SDK
|
|
69
|
+
neetru docs open webhooks # manual de runtime/webhooks
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## [2.8.1] — 2026-05-25 (marketplace)
|
|
73
|
+
|
|
74
|
+
### Adicionado
|
|
75
|
+
|
|
76
|
+
- **`neetru marketplace`** — central de artefatos do ecossistema Neetru.
|
|
77
|
+
- `neetru marketplace skills install` — clona `Neetru/neetru-libs` em
|
|
78
|
+
`~/.neetru/marketplace-cache/` e instala skills em `~/.claude/skills/`.
|
|
79
|
+
Linux/macOS: symlink (atualizações automáticas via git pull).
|
|
80
|
+
Windows: cópia recursiva (sem exigir Developer Mode).
|
|
81
|
+
- `neetru marketplace skills update` — git pull no cache + re-copia skills
|
|
82
|
+
instaladas como cópia (symlinks já são atualizados pelo pull).
|
|
83
|
+
- `neetru marketplace skills list` — tabela com nome, versão, status e
|
|
84
|
+
descrição de cada skill disponível no cache local.
|
|
85
|
+
- `neetru marketplace skills uninstall` — remove skills de `~/.claude/skills/`
|
|
86
|
+
com confirmação interativa (bypass via `--yes`).
|
|
87
|
+
- `neetru marketplace sdk init` — adiciona `@neetru/sdk@^2.1.0` ao
|
|
88
|
+
`package.json` do projeto atual e cria `src/neetru.ts` com boilerplate
|
|
89
|
+
de `createNeetruClient`. Idempotente — não sobrescreve arquivo existente.
|
|
90
|
+
- `neetru marketplace sdk templates` — lista templates disponíveis em
|
|
91
|
+
`templates/` da instalação do CLI.
|
|
92
|
+
- `neetru marketplace sdk add <template>` — copia template de feature
|
|
93
|
+
(auth/billing/usage/support/users) pra `src/` do projeto atual.
|
|
94
|
+
- `neetru marketplace browse` — abre `https://github.com/Neetru/neetru-libs`
|
|
95
|
+
no browser (start/open/xdg-open por plataforma).
|
|
96
|
+
- **Menu interativo** — item **"Marketplace"** adicionado ao menu principal
|
|
97
|
+
(entre Suporte e Docs live) com sub-menu completo: skills (instalar /
|
|
98
|
+
atualizar / listar / remover) + SDK (init / add template / listar / docs)
|
|
99
|
+
+ abrir no GitHub.
|
|
100
|
+
|
|
5
101
|
## [2.7.5] — 2026-05-20 (fix do crash no upgrade)
|
|
6
102
|
|
|
7
103
|
### Corrigido
|
|
@@ -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>;
|
|
@@ -0,0 +1,419 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `neetru bug report|list|show|claim|resolve|comment`
|
|
3
|
+
*
|
|
4
|
+
* Controle de bugs e ocorrências via CLI. Permite que agentes Claude,
|
|
5
|
+
* staff e automações reportem bugs no Core e acompanhem a resolução.
|
|
6
|
+
*
|
|
7
|
+
* Endpoints (todos /api/cli/v1/bugs/...):
|
|
8
|
+
* POST / — criar bug report
|
|
9
|
+
* GET / — listar bugs
|
|
10
|
+
* GET /[id] — detalhe
|
|
11
|
+
* PATCH /[id]/claim — assumir investigação
|
|
12
|
+
* PATCH /[id]/resolve — encerrar (resolved/wont_fix/duplicate)
|
|
13
|
+
* POST /[id]/comment — adicionar comentário
|
|
14
|
+
*/
|
|
15
|
+
import chalk from 'chalk';
|
|
16
|
+
import ora from 'ora';
|
|
17
|
+
import inquirer from 'inquirer';
|
|
18
|
+
import { apiRequest } from '../lib/api-client.js';
|
|
19
|
+
import { requireToken, handleApiError } from '../lib/cli-read.js';
|
|
20
|
+
import { printWriteResult } from '../lib/cli-write.js';
|
|
21
|
+
import { renderTable, fmtTimestamp } from '../lib/render.js';
|
|
22
|
+
import { log } from '../utils/logger.js';
|
|
23
|
+
// ─── Formatação ──────────────────────────────────────────────────────────────
|
|
24
|
+
function colorStatus(s) {
|
|
25
|
+
if (!s)
|
|
26
|
+
return chalk.dim('—');
|
|
27
|
+
if (s === 'open')
|
|
28
|
+
return chalk.red(s);
|
|
29
|
+
if (s === 'triaged')
|
|
30
|
+
return chalk.yellow(s);
|
|
31
|
+
if (s === 'in_progress')
|
|
32
|
+
return chalk.cyan(s);
|
|
33
|
+
if (s === 'resolved')
|
|
34
|
+
return chalk.green(s);
|
|
35
|
+
return chalk.dim(s);
|
|
36
|
+
}
|
|
37
|
+
function colorSeverity(s) {
|
|
38
|
+
if (!s)
|
|
39
|
+
return chalk.dim('—');
|
|
40
|
+
if (s === 'critical')
|
|
41
|
+
return chalk.bgRed.white.bold(` ${s} `);
|
|
42
|
+
if (s === 'high')
|
|
43
|
+
return chalk.red(s);
|
|
44
|
+
if (s === 'medium')
|
|
45
|
+
return chalk.yellow(s);
|
|
46
|
+
return chalk.dim(s);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Cria um bug report interativo (ou one-shot via flags).
|
|
50
|
+
*
|
|
51
|
+
* Modo interativo: prompts inquirer para title/body/category/severity.
|
|
52
|
+
* Modo one-shot: --title + --body obrigatórios; demais com defaults.
|
|
53
|
+
*
|
|
54
|
+
* Exemplo interativo:
|
|
55
|
+
* neetru bug report
|
|
56
|
+
*
|
|
57
|
+
* Exemplo one-shot (para agentes Claude):
|
|
58
|
+
* neetru bug report --title "neetru deploy trava" --body "Stack trace..." \
|
|
59
|
+
* --category cli --severity high --actor-type agent_claude
|
|
60
|
+
*/
|
|
61
|
+
export async function runBugReport(opts) {
|
|
62
|
+
const token = await requireToken(opts.json);
|
|
63
|
+
let title = opts.title?.trim() ?? '';
|
|
64
|
+
let description = opts.body?.trim() ?? '';
|
|
65
|
+
let category = opts.category?.trim() ?? '';
|
|
66
|
+
let severity = opts.severity?.trim() ?? '';
|
|
67
|
+
const interactive = !opts.json && (!title || !description);
|
|
68
|
+
if (interactive) {
|
|
69
|
+
const answers = await inquirer.prompt([
|
|
70
|
+
{
|
|
71
|
+
type: 'input',
|
|
72
|
+
name: 'title',
|
|
73
|
+
message: 'Título do bug (curto, objetivo):',
|
|
74
|
+
when: !title,
|
|
75
|
+
validate: (v) => v.trim().length > 0 || 'Obrigatório.',
|
|
76
|
+
default: title || undefined,
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
type: 'editor',
|
|
80
|
+
name: 'description',
|
|
81
|
+
message: 'Descrição completa (abre editor):',
|
|
82
|
+
when: !description,
|
|
83
|
+
validate: (v) => v.trim().length > 0 || 'Obrigatório.',
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
type: 'list',
|
|
87
|
+
name: 'category',
|
|
88
|
+
message: 'Categoria:',
|
|
89
|
+
when: !category,
|
|
90
|
+
choices: [
|
|
91
|
+
{ name: 'CLI', value: 'cli' },
|
|
92
|
+
{ name: 'SDK', value: 'sdk' },
|
|
93
|
+
{ name: 'Core (painel)', value: 'core' },
|
|
94
|
+
{ name: 'Agente Linux', value: 'agent' },
|
|
95
|
+
{ name: 'Libs internas', value: 'libs' },
|
|
96
|
+
{ name: 'Docs', value: 'docs' },
|
|
97
|
+
{ name: 'Infra / GCP', value: 'infra' },
|
|
98
|
+
{ name: 'Outro', value: 'other' },
|
|
99
|
+
],
|
|
100
|
+
default: 'other',
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
type: 'list',
|
|
104
|
+
name: 'severity',
|
|
105
|
+
message: 'Severidade:',
|
|
106
|
+
when: !severity,
|
|
107
|
+
choices: [
|
|
108
|
+
{ name: 'Crítico — bloqueia produção completamente', value: 'critical' },
|
|
109
|
+
{ name: 'Alto — funcionalidade principal quebrada', value: 'high' },
|
|
110
|
+
{ name: 'Médio — degradação parcial', value: 'medium' },
|
|
111
|
+
{ name: 'Baixo — cosmético / melhoria', value: 'low' },
|
|
112
|
+
],
|
|
113
|
+
default: 'medium',
|
|
114
|
+
},
|
|
115
|
+
]);
|
|
116
|
+
title = title || answers.title;
|
|
117
|
+
description = description || answers.description;
|
|
118
|
+
category = category || answers.category;
|
|
119
|
+
severity = severity || answers.severity;
|
|
120
|
+
}
|
|
121
|
+
category = category || 'other';
|
|
122
|
+
severity = severity || 'medium';
|
|
123
|
+
const spinner = opts.json ? null : ora({ text: 'Criando bug report…', color: 'blue' }).start();
|
|
124
|
+
let res;
|
|
125
|
+
try {
|
|
126
|
+
res = await apiRequest('/api/cli/v1/bugs', {
|
|
127
|
+
method: 'POST',
|
|
128
|
+
token,
|
|
129
|
+
body: {
|
|
130
|
+
title,
|
|
131
|
+
description,
|
|
132
|
+
category,
|
|
133
|
+
severity,
|
|
134
|
+
productId: opts.product || undefined,
|
|
135
|
+
reproductionSteps: opts.steps || undefined,
|
|
136
|
+
expectedBehavior: opts.expected || undefined,
|
|
137
|
+
actualBehavior: opts.actual || undefined,
|
|
138
|
+
actorType: opts.actorType || 'cli_principal',
|
|
139
|
+
},
|
|
140
|
+
});
|
|
141
|
+
spinner?.stop();
|
|
142
|
+
}
|
|
143
|
+
catch (error) {
|
|
144
|
+
spinner?.fail('Falha ao criar bug report.');
|
|
145
|
+
handleApiError(error, opts.json);
|
|
146
|
+
}
|
|
147
|
+
printWriteResult({ id: res.id, status: res.status }, `Bug reportado com sucesso. ID: ${chalk.cyan(res.id)}`, opts.json);
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Lista bugs com filtros opcionais.
|
|
151
|
+
*
|
|
152
|
+
* Exemplo (para agentes Claude puxarem bugs abertos):
|
|
153
|
+
* neetru bug list --status open --json
|
|
154
|
+
*/
|
|
155
|
+
export async function runBugList(opts) {
|
|
156
|
+
const token = await requireToken(opts.json);
|
|
157
|
+
const qs = new URLSearchParams();
|
|
158
|
+
if (opts.status)
|
|
159
|
+
qs.set('status', opts.status);
|
|
160
|
+
if (opts.category)
|
|
161
|
+
qs.set('category', opts.category);
|
|
162
|
+
if (opts.assignedTo)
|
|
163
|
+
qs.set('assignedTo', opts.assignedTo);
|
|
164
|
+
if (opts.product)
|
|
165
|
+
qs.set('productId', opts.product);
|
|
166
|
+
if (opts.limit)
|
|
167
|
+
qs.set('limit', opts.limit);
|
|
168
|
+
const q = qs.toString();
|
|
169
|
+
const spinner = opts.json ? null : ora({ text: 'Buscando bugs…', color: 'blue' }).start();
|
|
170
|
+
let res;
|
|
171
|
+
try {
|
|
172
|
+
res = await apiRequest(`/api/cli/v1/bugs${q ? `?${q}` : ''}`, { token });
|
|
173
|
+
spinner?.stop();
|
|
174
|
+
}
|
|
175
|
+
catch (error) {
|
|
176
|
+
spinner?.fail('Falha ao listar bugs.');
|
|
177
|
+
handleApiError(error, opts.json);
|
|
178
|
+
}
|
|
179
|
+
if (opts.json) {
|
|
180
|
+
console.log(JSON.stringify(res));
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
log.heading(`Bugs e ocorrências (${res.count})`);
|
|
184
|
+
if (res.count === 0) {
|
|
185
|
+
log.dim('Nenhuma ocorrência no escopo dos filtros.');
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
renderTable([
|
|
189
|
+
{ header: 'ID', value: (b) => b.id, maxWidth: 24 },
|
|
190
|
+
{ header: 'TÍTULO', value: (b) => b.title ?? '—', maxWidth: 40 },
|
|
191
|
+
{ header: 'STATUS', value: (b) => colorStatus(b.status) },
|
|
192
|
+
{ header: 'SEV', value: (b) => colorSeverity(b.severity) },
|
|
193
|
+
{ header: 'CATEGORIA', value: (b) => b.category ?? '—', maxWidth: 10 },
|
|
194
|
+
{ header: 'RESPONSÁVEL', value: (b) => b.assignedTo ?? chalk.dim('—'), maxWidth: 24 },
|
|
195
|
+
{ header: 'REPORTADO', value: (b) => fmtTimestamp(b.reportedAt), maxWidth: 14 },
|
|
196
|
+
], res.reports);
|
|
197
|
+
console.log();
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Mostra detalhe completo de um bug.
|
|
201
|
+
*
|
|
202
|
+
* Exemplo:
|
|
203
|
+
* neetru bug show bug_abc123
|
|
204
|
+
*/
|
|
205
|
+
export async function runBugShow(id, opts) {
|
|
206
|
+
if (!id) {
|
|
207
|
+
log.error('Uso: neetru bug show <id>');
|
|
208
|
+
process.exit(1);
|
|
209
|
+
}
|
|
210
|
+
const token = await requireToken(opts.json);
|
|
211
|
+
const spinner = opts.json ? null : ora({ text: `Buscando bug ${id}…`, color: 'blue' }).start();
|
|
212
|
+
let res;
|
|
213
|
+
try {
|
|
214
|
+
res = await apiRequest(`/api/cli/v1/bugs/${encodeURIComponent(id)}`, { token });
|
|
215
|
+
spinner?.stop();
|
|
216
|
+
}
|
|
217
|
+
catch (error) {
|
|
218
|
+
spinner?.fail('Falha ao buscar bug.');
|
|
219
|
+
handleApiError(error, opts.json);
|
|
220
|
+
}
|
|
221
|
+
if (opts.json) {
|
|
222
|
+
console.log(JSON.stringify(res));
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
const b = res.report;
|
|
226
|
+
const row = (k, v) => console.log(` ${chalk.dim(k.padEnd(20))} ${v}`);
|
|
227
|
+
log.heading(`Bug ${b.id}`);
|
|
228
|
+
row('Título', b.title ?? '—');
|
|
229
|
+
row('Status', colorStatus(b.status));
|
|
230
|
+
row('Severidade', colorSeverity(b.severity));
|
|
231
|
+
row('Categoria', b.category ?? '—');
|
|
232
|
+
row('Responsável', b.assignedTo ?? chalk.dim('sem responsável'));
|
|
233
|
+
row('Reportado por', b.reportedBy?.email ?? b.reportedBy?.actorId ?? '—');
|
|
234
|
+
row('Tipo de actor', b.reportedBy?.actorType ?? '—');
|
|
235
|
+
if (b.productId)
|
|
236
|
+
row('Produto', b.productId);
|
|
237
|
+
row('Reportado em', fmtTimestamp(b.reportedAt));
|
|
238
|
+
if (b.updatedAt)
|
|
239
|
+
row('Atualizado em', fmtTimestamp(b.updatedAt));
|
|
240
|
+
if (b.environment) {
|
|
241
|
+
if (b.environment.cliVersion)
|
|
242
|
+
row('CLI', b.environment.cliVersion);
|
|
243
|
+
if (b.environment.nodeVersion)
|
|
244
|
+
row('Node', b.environment.nodeVersion);
|
|
245
|
+
if (b.environment.os)
|
|
246
|
+
row('OS', b.environment.os);
|
|
247
|
+
}
|
|
248
|
+
if (b.description) {
|
|
249
|
+
console.log();
|
|
250
|
+
console.log(chalk.dim(' Descrição:'));
|
|
251
|
+
console.log(` ${b.description.replace(/\n/g, '\n ')}`);
|
|
252
|
+
}
|
|
253
|
+
if (b.reproductionSteps) {
|
|
254
|
+
console.log();
|
|
255
|
+
console.log(chalk.dim(' Passos para reproduzir:'));
|
|
256
|
+
console.log(` ${b.reproductionSteps.replace(/\n/g, '\n ')}`);
|
|
257
|
+
}
|
|
258
|
+
if (b.resolution) {
|
|
259
|
+
console.log();
|
|
260
|
+
console.log(chalk.dim(' Resolução:'));
|
|
261
|
+
console.log(` ${b.resolution.summary}`);
|
|
262
|
+
if (b.resolution.commitSha)
|
|
263
|
+
console.log(` commit: ${chalk.cyan(b.resolution.commitSha)}`);
|
|
264
|
+
}
|
|
265
|
+
if (Array.isArray(b.comments) && b.comments.length > 0) {
|
|
266
|
+
console.log();
|
|
267
|
+
console.log(chalk.dim(` Comentários (${b.comments.length}):`));
|
|
268
|
+
for (const c of b.comments) {
|
|
269
|
+
const ts = fmtTimestamp(c.at);
|
|
270
|
+
console.log(` [${chalk.cyan(c.author)}] ${chalk.dim(ts)}`);
|
|
271
|
+
console.log(` ${c.body}`);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
console.log();
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* Assume a investigação de um bug.
|
|
278
|
+
*
|
|
279
|
+
* Exemplo:
|
|
280
|
+
* neetru bug claim bug_abc123
|
|
281
|
+
*/
|
|
282
|
+
export async function runBugClaim(id, opts) {
|
|
283
|
+
if (!id) {
|
|
284
|
+
log.error('Uso: neetru bug claim <id>');
|
|
285
|
+
process.exit(1);
|
|
286
|
+
}
|
|
287
|
+
const token = await requireToken(opts.json);
|
|
288
|
+
const spinner = opts.json ? null : ora({ text: `Assumindo bug ${id}…`, color: 'blue' }).start();
|
|
289
|
+
let res;
|
|
290
|
+
try {
|
|
291
|
+
res = await apiRequest(`/api/cli/v1/bugs/${encodeURIComponent(id)}/claim`, {
|
|
292
|
+
method: 'PATCH',
|
|
293
|
+
token,
|
|
294
|
+
body: opts.assignedTo ? { assignedTo: opts.assignedTo } : {},
|
|
295
|
+
});
|
|
296
|
+
spinner?.stop();
|
|
297
|
+
}
|
|
298
|
+
catch (error) {
|
|
299
|
+
spinner?.fail('Falha ao assumir bug.');
|
|
300
|
+
handleApiError(error, opts.json);
|
|
301
|
+
}
|
|
302
|
+
printWriteResult({ id: res.id, assignedTo: res.assignedTo, status: res.status }, `Bug ${res.id} assumido por ${res.assignedTo} (status: ${res.status}).`, opts.json);
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Marca bug como resolvido, wont_fix ou duplicate.
|
|
306
|
+
*
|
|
307
|
+
* Exemplo:
|
|
308
|
+
* neetru bug resolve bug_abc123 --summary "Corrigido em deploy X" --commit abc1234
|
|
309
|
+
*/
|
|
310
|
+
export async function runBugResolve(id, opts) {
|
|
311
|
+
if (!id) {
|
|
312
|
+
log.error('Uso: neetru bug resolve <id> --summary "<texto>"');
|
|
313
|
+
process.exit(1);
|
|
314
|
+
}
|
|
315
|
+
let summary = opts.summary?.trim() ?? '';
|
|
316
|
+
let status = (opts.status ?? 'resolved').trim();
|
|
317
|
+
let duplicateOf = opts.duplicateOf?.trim() ?? '';
|
|
318
|
+
if (!opts.json && !summary) {
|
|
319
|
+
const ans = await inquirer.prompt([
|
|
320
|
+
{
|
|
321
|
+
type: 'editor',
|
|
322
|
+
name: 'summary',
|
|
323
|
+
message: 'Resumo da resolução:',
|
|
324
|
+
validate: (v) => v.trim().length > 0 || 'Obrigatório.',
|
|
325
|
+
},
|
|
326
|
+
{
|
|
327
|
+
type: 'list',
|
|
328
|
+
name: 'status',
|
|
329
|
+
message: 'Resultado:',
|
|
330
|
+
choices: [
|
|
331
|
+
{ name: 'Resolvido', value: 'resolved' },
|
|
332
|
+
{ name: 'Não corrigir (wont_fix)', value: 'wont_fix' },
|
|
333
|
+
{ name: 'Duplicado', value: 'duplicate' },
|
|
334
|
+
],
|
|
335
|
+
default: 'resolved',
|
|
336
|
+
},
|
|
337
|
+
{
|
|
338
|
+
type: 'input',
|
|
339
|
+
name: 'duplicateOf',
|
|
340
|
+
message: 'ID do bug original:',
|
|
341
|
+
when: (a) => a.status === 'duplicate',
|
|
342
|
+
validate: (v) => v.trim().length > 0 || 'Obrigatório quando duplicate.',
|
|
343
|
+
},
|
|
344
|
+
]);
|
|
345
|
+
summary = ans.summary;
|
|
346
|
+
status = ans.status;
|
|
347
|
+
duplicateOf = ans.duplicateOf ?? '';
|
|
348
|
+
}
|
|
349
|
+
if (!summary) {
|
|
350
|
+
log.error('--summary é obrigatório');
|
|
351
|
+
process.exit(1);
|
|
352
|
+
}
|
|
353
|
+
const token = await requireToken(opts.json);
|
|
354
|
+
const spinner = opts.json ? null : ora({ text: `Encerrando bug ${id}…`, color: 'blue' }).start();
|
|
355
|
+
let res;
|
|
356
|
+
try {
|
|
357
|
+
res = await apiRequest(`/api/cli/v1/bugs/${encodeURIComponent(id)}/resolve`, {
|
|
358
|
+
method: 'PATCH',
|
|
359
|
+
token,
|
|
360
|
+
body: {
|
|
361
|
+
summary,
|
|
362
|
+
status,
|
|
363
|
+
commitSha: opts.commit?.trim() || undefined,
|
|
364
|
+
duplicateOf: duplicateOf || undefined,
|
|
365
|
+
},
|
|
366
|
+
});
|
|
367
|
+
spinner?.stop();
|
|
368
|
+
}
|
|
369
|
+
catch (error) {
|
|
370
|
+
spinner?.fail('Falha ao encerrar bug.');
|
|
371
|
+
handleApiError(error, opts.json);
|
|
372
|
+
}
|
|
373
|
+
printWriteResult({ id: res.id, status: res.status }, `Bug ${res.id} encerrado como "${res.status}".`, opts.json);
|
|
374
|
+
}
|
|
375
|
+
/**
|
|
376
|
+
* Adiciona comentário em um bug.
|
|
377
|
+
*
|
|
378
|
+
* Exemplo (agente Claude):
|
|
379
|
+
* neetru bug comment bug_abc123 --body "Testei em Node 22 — reproduzível."
|
|
380
|
+
*/
|
|
381
|
+
export async function runBugComment(id, opts) {
|
|
382
|
+
if (!id) {
|
|
383
|
+
log.error('Uso: neetru bug comment <id> --body "<texto>"');
|
|
384
|
+
process.exit(1);
|
|
385
|
+
}
|
|
386
|
+
let body = opts.body?.trim() ?? '';
|
|
387
|
+
if (!opts.json && !body) {
|
|
388
|
+
const ans = await inquirer.prompt([
|
|
389
|
+
{
|
|
390
|
+
type: 'editor',
|
|
391
|
+
name: 'body',
|
|
392
|
+
message: 'Comentário:',
|
|
393
|
+
validate: (v) => v.trim().length > 0 || 'Obrigatório.',
|
|
394
|
+
},
|
|
395
|
+
]);
|
|
396
|
+
body = ans.body;
|
|
397
|
+
}
|
|
398
|
+
if (!body) {
|
|
399
|
+
log.error('--body é obrigatório');
|
|
400
|
+
process.exit(1);
|
|
401
|
+
}
|
|
402
|
+
const token = await requireToken(opts.json);
|
|
403
|
+
const spinner = opts.json ? null : ora({ text: `Comentando bug ${id}…`, color: 'blue' }).start();
|
|
404
|
+
let res;
|
|
405
|
+
try {
|
|
406
|
+
res = await apiRequest(`/api/cli/v1/bugs/${encodeURIComponent(id)}/comment`, {
|
|
407
|
+
method: 'POST',
|
|
408
|
+
token,
|
|
409
|
+
body: { body },
|
|
410
|
+
});
|
|
411
|
+
spinner?.stop();
|
|
412
|
+
}
|
|
413
|
+
catch (error) {
|
|
414
|
+
spinner?.fail('Falha ao comentar.');
|
|
415
|
+
handleApiError(error, opts.json);
|
|
416
|
+
}
|
|
417
|
+
printWriteResult({ id: res.id, commentCount: res.commentCount }, `Comentário adicionado. Total: ${res.commentCount}.`, opts.json);
|
|
418
|
+
}
|
|
419
|
+
//# sourceMappingURL=bug.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bug.js","sourceRoot":"","sources":["../../src/commands/bug.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface CustomersListOptions {
|
|
2
|
+
status?: string;
|
|
3
|
+
search?: string;
|
|
4
|
+
json?: boolean;
|
|
5
|
+
}
|
|
6
|
+
export declare function runCustomersList(opts?: CustomersListOptions): Promise<void>;
|
|
7
|
+
export interface CustomersGetOptions {
|
|
8
|
+
json?: boolean;
|
|
9
|
+
}
|
|
10
|
+
export declare function runCustomersGet(id: string, opts?: CustomersGetOptions): Promise<void>;
|
|
11
|
+
export interface CustomersCreateOptions {
|
|
12
|
+
name?: string;
|
|
13
|
+
email?: string;
|
|
14
|
+
taxId?: string;
|
|
15
|
+
json?: boolean;
|
|
16
|
+
}
|
|
17
|
+
export declare function runCustomersCreate(opts?: CustomersCreateOptions): Promise<void>;
|