@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.
Files changed (68) hide show
  1. package/CHANGELOG.md +52 -0
  2. package/README.md +61 -17
  3. package/dist/commands/deploy.d.ts +45 -0
  4. package/dist/commands/deploy.js +134 -1
  5. package/dist/commands/deploy.js.map +1 -1
  6. package/dist/commands/dev-up.d.ts +7 -5
  7. package/dist/commands/dev-up.js +24 -23
  8. package/dist/commands/dev-up.js.map +1 -1
  9. package/dist/commands/docs-produto.d.ts +65 -0
  10. package/dist/commands/docs-produto.js +322 -0
  11. package/dist/commands/docs-produto.js.map +1 -0
  12. package/dist/commands/init.d.ts +2 -0
  13. package/dist/commands/init.js +7 -0
  14. package/dist/commands/init.js.map +1 -1
  15. package/dist/commands/new.d.ts +2 -0
  16. package/dist/commands/new.js +2 -0
  17. package/dist/commands/new.js.map +1 -1
  18. package/dist/index.js +72 -6
  19. package/dist/index.js.map +1 -1
  20. package/dist/lib/api-client.d.ts +8 -1
  21. package/dist/lib/api-client.js +20 -2
  22. package/dist/lib/api-client.js.map +1 -1
  23. package/dist/lib/compose-generator.d.ts +13 -9
  24. package/dist/lib/compose-generator.js +28 -60
  25. package/dist/lib/compose-generator.js.map +1 -1
  26. package/dist/lib/config-schema.d.ts +40 -6
  27. package/dist/lib/config-schema.js +11 -0
  28. package/dist/lib/config-schema.js.map +1 -1
  29. package/dist/lib/product-docs/check.d.ts +62 -0
  30. package/dist/lib/product-docs/check.js +489 -0
  31. package/dist/lib/product-docs/check.js.map +1 -0
  32. package/dist/lib/product-docs/config.d.ts +66 -0
  33. package/dist/lib/product-docs/config.js +234 -0
  34. package/dist/lib/product-docs/config.js.map +1 -0
  35. package/dist/lib/product-docs/dates.d.ts +17 -0
  36. package/dist/lib/product-docs/dates.js +41 -0
  37. package/dist/lib/product-docs/dates.js.map +1 -0
  38. package/dist/lib/product-docs/frontmatter.d.ts +43 -0
  39. package/dist/lib/product-docs/frontmatter.js +302 -0
  40. package/dist/lib/product-docs/frontmatter.js.map +1 -0
  41. package/dist/lib/product-docs/git.d.ts +16 -0
  42. package/dist/lib/product-docs/git.js +92 -0
  43. package/dist/lib/product-docs/git.js.map +1 -0
  44. package/dist/lib/product-docs/markdown.d.ts +27 -0
  45. package/dist/lib/product-docs/markdown.js +98 -0
  46. package/dist/lib/product-docs/markdown.js.map +1 -0
  47. package/dist/lib/product-docs/ops.d.ts +133 -0
  48. package/dist/lib/product-docs/ops.js +975 -0
  49. package/dist/lib/product-docs/ops.js.map +1 -0
  50. package/dist/lib/product-docs/structure.d.ts +61 -0
  51. package/dist/lib/product-docs/structure.js +239 -0
  52. package/dist/lib/product-docs/structure.js.map +1 -0
  53. package/dist/lib/product-docs/sync.d.ts +101 -0
  54. package/dist/lib/product-docs/sync.js +313 -0
  55. package/dist/lib/product-docs/sync.js.map +1 -0
  56. package/dist/lib/product-docs/taxonomy.d.ts +46 -0
  57. package/dist/lib/product-docs/taxonomy.js +163 -0
  58. package/dist/lib/product-docs/taxonomy.js.map +1 -0
  59. package/dist/lib/product-docs/templates.d.ts +53 -0
  60. package/dist/lib/product-docs/templates.js +245 -0
  61. package/dist/lib/product-docs/templates.js.map +1 -0
  62. package/dist/lib/public-secret-scan.d.ts +76 -0
  63. package/dist/lib/public-secret-scan.js +446 -0
  64. package/dist/lib/public-secret-scan.js.map +1 -0
  65. package/package.json +1 -1
  66. package/templates/dev/Dockerfile.agent +0 -39
  67. package/templates/dev/agent-entrypoint.sh +0 -41
  68. 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` = ambiente dev-local (banco + agente) via Docker Compose.
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 ambiente completo (`dev up`)')
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 ambiente dev-local (banco + agente) via Docker Compose')
326
- .option('--core-port <port>', 'porta do app SaaS local (default 3000)')
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 emulador (dev up) em vez do Core; default .neetru/dev/logs.ndjson')
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('Documentação + registry de docs publicados em gs://neetru-docs');
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