@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.
Files changed (44) hide show
  1. package/CHANGELOG.md +128 -0
  2. package/dist/commands/admin/sdk-credential.d.ts +19 -0
  3. package/dist/commands/admin/sdk-credential.js +169 -0
  4. package/dist/commands/admin/sdk-credential.js.map +1 -0
  5. package/dist/commands/bug.d.ts +87 -0
  6. package/dist/commands/bug.js +419 -0
  7. package/dist/commands/bug.js.map +1 -0
  8. package/dist/commands/customers.d.ts +17 -0
  9. package/dist/commands/customers.js +160 -0
  10. package/dist/commands/customers.js.map +1 -0
  11. package/dist/commands/db.d.ts +4 -0
  12. package/dist/commands/db.js +380 -64
  13. package/dist/commands/db.js.map +1 -1
  14. package/dist/commands/docs.d.ts +4 -0
  15. package/dist/commands/docs.js +99 -7
  16. package/dist/commands/docs.js.map +1 -1
  17. package/dist/commands/doctor.js +4 -1
  18. package/dist/commands/doctor.js.map +1 -1
  19. package/dist/commands/marketplace.d.ts +36 -0
  20. package/dist/commands/marketplace.js +584 -0
  21. package/dist/commands/marketplace.js.map +1 -0
  22. package/dist/commands/new.js +196 -37
  23. package/dist/commands/new.js.map +1 -1
  24. package/dist/commands/open.d.ts +8 -0
  25. package/dist/commands/open.js +61 -13
  26. package/dist/commands/open.js.map +1 -1
  27. package/dist/commands/products.d.ts +23 -0
  28. package/dist/commands/products.js +39 -1
  29. package/dist/commands/products.js.map +1 -1
  30. package/dist/commands/tenants.js +24 -2
  31. package/dist/commands/tenants.js.map +1 -1
  32. package/dist/commands/ui.d.ts +1 -1
  33. package/dist/commands/ui.js +172 -2
  34. package/dist/commands/ui.js.map +1 -1
  35. package/dist/commands/workspaces.d.ts +10 -1
  36. package/dist/commands/workspaces.js +145 -23
  37. package/dist/commands/workspaces.js.map +1 -1
  38. package/dist/index.js +327 -4
  39. package/dist/index.js.map +1 -1
  40. package/dist/lib/config-schema.d.ts +10 -10
  41. package/dist/lib/pickers.d.ts +25 -0
  42. package/dist/lib/pickers.js +75 -1
  43. package/dist/lib/pickers.js.map +1 -1
  44. 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>;