@neetru/cli 2.29.0 → 2.31.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 +52 -0
- package/README.md +61 -17
- package/dist/commands/deploy.d.ts +45 -0
- package/dist/commands/deploy.js +134 -1
- package/dist/commands/deploy.js.map +1 -1
- package/dist/commands/dev-up.d.ts +7 -5
- package/dist/commands/dev-up.js +24 -23
- package/dist/commands/dev-up.js.map +1 -1
- package/dist/commands/docs-produto.d.ts +65 -0
- package/dist/commands/docs-produto.js +322 -0
- package/dist/commands/docs-produto.js.map +1 -0
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.js +7 -0
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/new.d.ts +2 -0
- package/dist/commands/new.js +2 -0
- package/dist/commands/new.js.map +1 -1
- package/dist/index.js +72 -6
- package/dist/index.js.map +1 -1
- package/dist/lib/api-client.d.ts +8 -1
- package/dist/lib/api-client.js +20 -2
- package/dist/lib/api-client.js.map +1 -1
- package/dist/lib/compose-generator.d.ts +13 -9
- package/dist/lib/compose-generator.js +28 -60
- package/dist/lib/compose-generator.js.map +1 -1
- package/dist/lib/config-schema.d.ts +40 -6
- package/dist/lib/config-schema.js +11 -0
- package/dist/lib/config-schema.js.map +1 -1
- package/dist/lib/product-docs/check.d.ts +62 -0
- package/dist/lib/product-docs/check.js +489 -0
- package/dist/lib/product-docs/check.js.map +1 -0
- package/dist/lib/product-docs/config.d.ts +66 -0
- package/dist/lib/product-docs/config.js +234 -0
- package/dist/lib/product-docs/config.js.map +1 -0
- package/dist/lib/product-docs/dates.d.ts +17 -0
- package/dist/lib/product-docs/dates.js +41 -0
- package/dist/lib/product-docs/dates.js.map +1 -0
- package/dist/lib/product-docs/frontmatter.d.ts +43 -0
- package/dist/lib/product-docs/frontmatter.js +302 -0
- package/dist/lib/product-docs/frontmatter.js.map +1 -0
- package/dist/lib/product-docs/git.d.ts +16 -0
- package/dist/lib/product-docs/git.js +92 -0
- package/dist/lib/product-docs/git.js.map +1 -0
- package/dist/lib/product-docs/markdown.d.ts +27 -0
- package/dist/lib/product-docs/markdown.js +98 -0
- package/dist/lib/product-docs/markdown.js.map +1 -0
- package/dist/lib/product-docs/ops.d.ts +133 -0
- package/dist/lib/product-docs/ops.js +975 -0
- package/dist/lib/product-docs/ops.js.map +1 -0
- package/dist/lib/product-docs/structure.d.ts +61 -0
- package/dist/lib/product-docs/structure.js +239 -0
- package/dist/lib/product-docs/structure.js.map +1 -0
- package/dist/lib/product-docs/sync.d.ts +101 -0
- package/dist/lib/product-docs/sync.js +313 -0
- package/dist/lib/product-docs/sync.js.map +1 -0
- package/dist/lib/product-docs/taxonomy.d.ts +46 -0
- package/dist/lib/product-docs/taxonomy.js +163 -0
- package/dist/lib/product-docs/taxonomy.js.map +1 -0
- package/dist/lib/product-docs/templates.d.ts +53 -0
- package/dist/lib/product-docs/templates.js +245 -0
- package/dist/lib/product-docs/templates.js.map +1 -0
- package/dist/lib/public-secret-scan.d.ts +76 -0
- package/dist/lib/public-secret-scan.js +446 -0
- package/dist/lib/public-secret-scan.js.map +1 -0
- package/package.json +1 -1
- package/templates/dev/Dockerfile.agent +0 -39
- package/templates/dev/agent-entrypoint.sh +0 -41
- package/templates/dev/docker-compose.dev.yml +0 -63
package/dist/index.js
CHANGED
|
@@ -157,6 +157,7 @@ program
|
|
|
157
157
|
.option('--force', 'sobrescreve arquivos existentes em conflito (cuidado!)')
|
|
158
158
|
// -y padronizado com bootstrap (`-y, --yes`) — muscle-memory (auditoria UX 2026-09).
|
|
159
159
|
.option('-y, --yes', 'modo non-interactive (assume defaults, sai com erro se conflito sem flag)')
|
|
160
|
+
.option('--sem-docs', 'não cria o docs/ do produto (o padrão é rodar `neetru docs init`)')
|
|
160
161
|
.action(async (name, opts) => {
|
|
161
162
|
const { runInit } = await import('./commands/init.js');
|
|
162
163
|
await runInit({
|
|
@@ -166,6 +167,7 @@ program
|
|
|
166
167
|
path: opts.path,
|
|
167
168
|
force: opts.force,
|
|
168
169
|
yes: opts.yes,
|
|
170
|
+
semDocs: !!opts.semDocs,
|
|
169
171
|
});
|
|
170
172
|
});
|
|
171
173
|
// ── neetru new (macro end-to-end) ─────────────────────────────────────
|
|
@@ -181,6 +183,7 @@ program
|
|
|
181
183
|
.option('--open', 'abre o browser após criar o workspace (opt-in)')
|
|
182
184
|
.option('--skip-open', '(obsoleto — browser não abre por default; use --open para abrir)')
|
|
183
185
|
.option('--skip-db-init', 'pula o 5º passo de inicialização do banco de dados')
|
|
186
|
+
.option('--sem-docs', 'não cria o docs/ do produto no scaffold')
|
|
184
187
|
.option('--json', 'saída em JSON (machine-readable)')
|
|
185
188
|
.action(async (name, opts) => {
|
|
186
189
|
const { runNewMacro } = await import('./commands/new.js');
|
|
@@ -193,6 +196,7 @@ program
|
|
|
193
196
|
open: !!opts.open,
|
|
194
197
|
skipOpen: !!opts.skipOpen,
|
|
195
198
|
skipDbInit: !!opts.skipDbInit,
|
|
199
|
+
semDocs: !!opts.semDocs,
|
|
196
200
|
json: !!opts.json,
|
|
197
201
|
});
|
|
198
202
|
});
|
|
@@ -309,11 +313,11 @@ program
|
|
|
309
313
|
// ── neetru dev ────────────────────────────────────────────────────────
|
|
310
314
|
// `neetru dev` (sem subcomando) = banco local Docker + watch de schema (M1
|
|
311
315
|
// GAP-M1-4) — comportamento legado preservado (action + options intactos).
|
|
312
|
-
// `neetru dev up` =
|
|
316
|
+
// `neetru dev up` = banco do produto em container via Docker Compose.
|
|
313
317
|
// Subcomando aditivo: a action de `dev` só dispara quando nenhum subcomando casa.
|
|
314
318
|
const devCmd = program
|
|
315
319
|
.command('dev')
|
|
316
|
-
.description('Ambiente de dev local — banco Docker (default) ou
|
|
320
|
+
.description('Ambiente de dev local — banco Docker + watch de schema (default) ou só o banco (`dev up`)')
|
|
317
321
|
.option('--db <name>', 'banco alvo do .neetru/db.json (default: único registrado)')
|
|
318
322
|
.option('--schema <path>', 'caminho do arquivo de schema (default: db/schema.ts)')
|
|
319
323
|
.action(async (opts) => {
|
|
@@ -322,8 +326,8 @@ const devCmd = program
|
|
|
322
326
|
});
|
|
323
327
|
devCmd
|
|
324
328
|
.command('up')
|
|
325
|
-
.description('Sobe o
|
|
326
|
-
.option('--core-port <port>', 'porta do app
|
|
329
|
+
.description('Sobe o banco do produto em container (Docker Compose) e mostra a conexão')
|
|
330
|
+
.option('--core-port <port>', 'porta do app local mostrada nas instruções (default 3000)')
|
|
327
331
|
.action(async (opts) => {
|
|
328
332
|
const { runDevUp } = await import('./commands/dev-up.js');
|
|
329
333
|
await runDevUp({
|
|
@@ -449,6 +453,9 @@ program
|
|
|
449
453
|
.option('--non-interactive', 'falha em vez de perguntar (modo CI)')
|
|
450
454
|
.option('--force', 'ignora o gate de schema e prossegue mesmo com divergência de fingerprint')
|
|
451
455
|
.option('--skip-health-probe', 'NÃO faz o GET de saúde a https://<domain>/api/health?deep=1 pós-deploy (default: sempre faz; use só em serviço sem HTTP)')
|
|
456
|
+
.option('--allow-public-secret <motivo>', 'EMERGÊNCIA: deploya mesmo com segredo (nrt_/npk_/chave privada/env pública sensível) no pacote público. ' +
|
|
457
|
+
'Motivo obrigatório; fica registrado no deploy. Rotacione a chave depois.')
|
|
458
|
+
.option('--sem-docs', 'pula a checagem dos docs (só aviso) e a publicação automática (docs.publishOnDeploy)')
|
|
452
459
|
.option('--json', 'saída em JSON estruturado (implica --non-interactive)')
|
|
453
460
|
.action(async (opts) => {
|
|
454
461
|
const { runDeploy } = await import('./commands/deploy.js');
|
|
@@ -474,6 +481,8 @@ program
|
|
|
474
481
|
force: !!opts.force,
|
|
475
482
|
skipHealthProbe: !!opts.skipHealthProbe,
|
|
476
483
|
mfaToken: opts.mfaToken,
|
|
484
|
+
allowPublicSecret: opts.allowPublicSecret,
|
|
485
|
+
semDocs: !!opts.semDocs,
|
|
477
486
|
json: !!opts.json,
|
|
478
487
|
});
|
|
479
488
|
});
|
|
@@ -1648,7 +1657,7 @@ program
|
|
|
1648
1657
|
.option('--channel <channel>', 'filtrar por channel (stdout | stderr | app)')
|
|
1649
1658
|
.option('--correlation-id <id>', 'filtrar por correlationId (UUID)')
|
|
1650
1659
|
.option('--json', 'saída em JSON (NDJSON linha a linha, útil para pipes)')
|
|
1651
|
-
.option('--local [path]', 'ler NDJSON local do
|
|
1660
|
+
.option('--local [path]', 'ler NDJSON local (coletor do Core local) em vez do Core; default .neetru/dev/logs.ndjson')
|
|
1652
1661
|
.action(async (opts) => {
|
|
1653
1662
|
const { runLogs } = await import('./commands/logs.js');
|
|
1654
1663
|
await runLogs({
|
|
@@ -2769,7 +2778,7 @@ drCmd
|
|
|
2769
2778
|
// entrada pra quem quer LER docs, não publicar.
|
|
2770
2779
|
const docsCmd = program
|
|
2771
2780
|
.command('docs')
|
|
2772
|
-
.description('
|
|
2781
|
+
.description('Docs do produto (init/new/check/sync) + registry de docs do Core em gs://neetru-docs');
|
|
2773
2782
|
docsCmd
|
|
2774
2783
|
.command('open [topic]')
|
|
2775
2784
|
.description('Abrir documentação no browser (ex: sdk, cli, db, webhooks, auth)')
|
|
@@ -2837,6 +2846,63 @@ docsCmd
|
|
|
2837
2846
|
json: !!opts.json,
|
|
2838
2847
|
});
|
|
2839
2848
|
});
|
|
2849
|
+
// ── neetru docs init|new|check|sync — docs do PRODUTO ─────────────────
|
|
2850
|
+
// PROTOCOLO_DOCS_PRODUTOS_SAAS v1 (2026-10-03). Os subcomandos acima são o
|
|
2851
|
+
// control plane dos docs do Core; estes cuidam do `docs/` do repo do produto.
|
|
2852
|
+
docsCmd
|
|
2853
|
+
.command('init')
|
|
2854
|
+
.description('Criar o mínimo do primeiro dia do docs/ do produto (idempotente; nunca sobrescreve)')
|
|
2855
|
+
.option('--com-api', 'inclui docs/api/API_V1.md (produto expõe /api/v1) e grava docs.api=true')
|
|
2856
|
+
.option('--migrar', 'repo que já tem docs: só acrescenta frontmatter inferido + relatório (não move nem renomeia nada)')
|
|
2857
|
+
.option('--dry-run', 'mostra o que faria, sem escrever')
|
|
2858
|
+
.option('--json', 'saída em JSON')
|
|
2859
|
+
.action(async (opts) => {
|
|
2860
|
+
const { runDocsInit } = await import('./commands/docs-produto.js');
|
|
2861
|
+
await runDocsInit({ comApi: !!opts.comApi, migrar: !!opts.migrar, dryRun: !!opts.dryRun, json: !!opts.json });
|
|
2862
|
+
});
|
|
2863
|
+
docsCmd
|
|
2864
|
+
.command('new <tipo> <titulo>')
|
|
2865
|
+
.description('Criar doc a partir do modelo (guia|referencia|arquitetura|adr|runbook|norma|plano|relatorio|incidente|ata|rfc|spec|politica|ameacas)')
|
|
2866
|
+
.option('--categoria <categoria>', 'categoria da taxonomia (ex.: "Integrações")')
|
|
2867
|
+
.option('--subcategoria <subcategoria>', 'subcategoria da categoria (ex.: marketplaces)')
|
|
2868
|
+
.option('--audience <audience>', 'dev-produto | staff | publico (padrão: o da pasta)')
|
|
2869
|
+
.option('--descricao <frase>', 'description (uma frase de 40 a 200 caracteres)')
|
|
2870
|
+
.option('--data <AAAA-MM-DD>', 'data do registro (relatório, incidente, ata); padrão hoje')
|
|
2871
|
+
.option('--dry-run', 'mostra o que faria, sem escrever')
|
|
2872
|
+
.option('--json', 'saída em JSON')
|
|
2873
|
+
.action(async (tipo, titulo, opts) => {
|
|
2874
|
+
const { runDocsNew } = await import('./commands/docs-produto.js');
|
|
2875
|
+
await runDocsNew(tipo, titulo, {
|
|
2876
|
+
categoria: opts.categoria,
|
|
2877
|
+
subcategoria: opts.subcategoria,
|
|
2878
|
+
audience: opts.audience,
|
|
2879
|
+
descricao: opts.descricao,
|
|
2880
|
+
data: opts.data,
|
|
2881
|
+
dryRun: !!opts.dryRun,
|
|
2882
|
+
json: !!opts.json,
|
|
2883
|
+
});
|
|
2884
|
+
});
|
|
2885
|
+
docsCmd
|
|
2886
|
+
.command('check')
|
|
2887
|
+
.description('Validar os docs do produto (offline; mesmos códigos do Core + PR001–PR004)')
|
|
2888
|
+
.option('--changed', 'só os arquivos alterados contra a branch principal (catraca)')
|
|
2889
|
+
.option('--strict', 'aviso também falha')
|
|
2890
|
+
.option('--offline', 'não consulta a taxonomia do Core (usa a embutida)')
|
|
2891
|
+
.option('--json', 'saída em JSON')
|
|
2892
|
+
.action(async (opts) => {
|
|
2893
|
+
const { runDocsCheck } = await import('./commands/docs-produto.js');
|
|
2894
|
+
await runDocsCheck({ changed: !!opts.changed, strict: !!opts.strict, offline: !!opts.offline, json: !!opts.json });
|
|
2895
|
+
});
|
|
2896
|
+
docsCmd
|
|
2897
|
+
.command('sync')
|
|
2898
|
+
.description('Publicar os docs do produto no Core (só os sem erro; nada é apagado)')
|
|
2899
|
+
.option('--dry-run', 'mostra o que enviaria, sem enviar')
|
|
2900
|
+
.option('--offline', 'checa com a taxonomia embutida (o envio continua precisando do Core)')
|
|
2901
|
+
.option('--json', 'saída em JSON')
|
|
2902
|
+
.action(async (opts) => {
|
|
2903
|
+
const { runDocsSync } = await import('./commands/docs-produto.js');
|
|
2904
|
+
await runDocsSync({ dryRun: !!opts.dryRun, offline: !!opts.offline, json: !!opts.json });
|
|
2905
|
+
});
|
|
2840
2906
|
// ── neetru webhooks ──────────────────────────────────────────────────
|
|
2841
2907
|
// Produtos SaaS registram endpoints de webhook pra receber eventos do Core.
|
|
2842
2908
|
const webhooksCmd = program
|