@semacode/cli 1.5.10 → 1.5.14

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/README.md +6 -1
  2. package/SEMA_BRIEF.curto.txt +3 -3
  3. package/SEMA_BRIEF.md +5 -5
  4. package/SEMA_BRIEF.micro.txt +2 -2
  5. package/SEMA_INDEX.json +50 -32
  6. package/dist/drift.d.ts +3 -3
  7. package/dist/drift.js +67 -4
  8. package/dist/drift.js.map +1 -1
  9. package/dist/importador.d.ts +1 -1
  10. package/dist/importador.js +144 -1
  11. package/dist/importador.js.map +1 -1
  12. package/dist/index.js +388 -3
  13. package/dist/index.js.map +1 -1
  14. package/dist/php-symbols.d.ts +24 -0
  15. package/dist/php-symbols.js +375 -0
  16. package/dist/php-symbols.js.map +1 -0
  17. package/dist/projeto.js +14 -0
  18. package/dist/projeto.js.map +1 -1
  19. package/dist/tipos.d.ts +1 -1
  20. package/docs/cli.md +10 -1
  21. package/docs/sintaxe.md +192 -0
  22. package/node_modules/@sema/gerador-css/package.json +1 -1
  23. package/node_modules/@sema/gerador-dart/package.json +1 -1
  24. package/node_modules/@sema/gerador-html/package.json +1 -1
  25. package/node_modules/@sema/gerador-javascript/package.json +1 -1
  26. package/node_modules/@sema/gerador-lua/package.json +1 -1
  27. package/node_modules/@sema/gerador-python/package.json +1 -1
  28. package/node_modules/@sema/gerador-typescript/package.json +1 -1
  29. package/node_modules/@sema/nucleo/dist/ast/tipos.d.ts +4 -2
  30. package/node_modules/@sema/nucleo/dist/formatador/index.js +40 -13
  31. package/node_modules/@sema/nucleo/dist/formatador/index.js.map +1 -1
  32. package/node_modules/@sema/nucleo/dist/ir/conversor.js +182 -3
  33. package/node_modules/@sema/nucleo/dist/ir/conversor.js.map +1 -1
  34. package/node_modules/@sema/nucleo/dist/ir/modelos.d.ts +35 -3
  35. package/node_modules/@sema/nucleo/dist/lexer/tokens.js +21 -0
  36. package/node_modules/@sema/nucleo/dist/lexer/tokens.js.map +1 -1
  37. package/node_modules/@sema/nucleo/dist/parser/parser.js +38 -0
  38. package/node_modules/@sema/nucleo/dist/parser/parser.js.map +1 -1
  39. package/node_modules/@sema/nucleo/dist/semantico/analisador.d.ts +4 -3
  40. package/node_modules/@sema/nucleo/dist/semantico/analisador.js +310 -13
  41. package/node_modules/@sema/nucleo/dist/semantico/analisador.js.map +1 -1
  42. package/node_modules/@sema/nucleo/package.json +1 -1
  43. package/node_modules/@sema/padroes/package.json +1 -1
  44. package/package.json +14 -14
package/dist/index.js CHANGED
@@ -64,7 +64,7 @@ Comandos essenciais:
64
64
  - validacao: \`sema validar <arquivo.sema> --json\`
65
65
  - diagnosticos: \`sema diagnosticos <arquivo.sema> --json\`
66
66
  - formatacao: \`sema formatar <arquivo.sema>\`
67
- - importacao assistida de legado: \`sema importar <nestjs|fastapi|flask|nextjs|nextjs-consumer|react-vite-consumer|angular-consumer|flutter-consumer|firebase|dotnet|java|go|rust|cpp|typescript|python|dart|lua> <diretorio> --saida <diretorio>\`
67
+ - importacao assistida de legado: \`sema importar <nestjs|fastapi|flask|nextjs|nextjs-consumer|react-vite-consumer|angular-consumer|flutter-consumer|firebase|php|dotnet|java|go|rust|cpp|typescript|python|dart|lua> <diretorio> --saida <diretorio>\`
68
68
  - exemplos oficiais no projeto: \`sema instalar-exemplos\`
69
69
  - geracao de codigo: \`sema compilar <arquivo-ou-pasta> --alvo <typescript|python|dart|lua> --saida <diretorio>\`
70
70
  - verificacao final: \`sema verificar <arquivo-ou-pasta> [--json]\`
@@ -477,7 +477,7 @@ function ajuda() {
477
477
  "auditoria: sema drift <arquivo-ou-pasta> [--escopo <arquivo|modulo|projeto>] [--incluir-worktrees] [--incluir-consumidores-laterais] [--json]",
478
478
  "impacto: sema impacto <arquivo-ou-pasta> --alvo <token> [--mudanca <descricao>] [--escopo <arquivo|modulo|projeto>] [--json]",
479
479
  "renomeacao: sema renomear-semantico <arquivo-ou-pasta> --de <nome-atual> --para <nome-novo> [--escopo <arquivo|modulo|projeto>] [--json]",
480
- "importacao: sema importar <nestjs|fastapi|flask|nextjs|nextjs-consumer|react-vite-consumer|angular-consumer|flutter-consumer|firebase|dotnet|java|go|rust|cpp|typescript|python|dart|lua> <diretorio> [--saida <diretorio>] [--namespace <base>] [--json]",
480
+ "importacao: sema importar <nestjs|fastapi|flask|nextjs|nextjs-consumer|react-vite-consumer|angular-consumer|flutter-consumer|firebase|php|dotnet|java|go|rust|cpp|typescript|python|dart|lua> <diretorio> [--saida <diretorio>] [--namespace <base>] [--json]",
481
481
  "validacao: sema validar <arquivo-ou-pasta> [--json]",
482
482
  "diagnostico: sema diagnosticos <arquivo.sema> [--json]",
483
483
  "geracao: sema compilar <arquivo-ou-pasta> --alvo <python|typescript|dart|lua> --saida <diretorio> [--estrutura <flat|modulos|backend>] [--framework <base|nestjs|fastapi>]",
@@ -496,6 +496,8 @@ function ajuda() {
496
496
  "sema prompt-ia-react",
497
497
  "sema prompt-ia-sema-primeiro",
498
498
  "sema exemplos-prompt-ia",
499
+ "sema author [--help]",
500
+ "sema author exemplo [--sensivel] [--json]",
499
501
  "sema contexto-ia <arquivo.sema> [--saida <diretorio>] [--json]",
500
502
  "sema sync-ai-entrypoints [--json]",
501
503
  "sema instalar-exemplos [--json]",
@@ -844,6 +846,9 @@ function normalizarFonteImportacao(valor) {
844
846
  if (valor === "lua") {
845
847
  return "lua";
846
848
  }
849
+ if (valor === "php" || valor === "laravel" || valor === "symfony") {
850
+ return "php";
851
+ }
847
852
  if (valor === "nestjs"
848
853
  || valor === "fastapi"
849
854
  || valor === "flask"
@@ -858,6 +863,7 @@ function normalizarFonteImportacao(valor) {
858
863
  || valor === "go"
859
864
  || valor === "rust"
860
865
  || valor === "cpp"
866
+ || valor === "php"
861
867
  || valor === "typescript"
862
868
  || valor === "python"
863
869
  || valor === "dart"
@@ -3372,6 +3378,381 @@ async function comandoFinalizarMudanca(posicionais, args, emJson) {
3372
3378
  }
3373
3379
  return 1;
3374
3380
  }
3381
+ const BLOCOS_AUTHOR_CLI = [
3382
+ "work/book",
3383
+ "part/chapter/section",
3384
+ "scene/character/arc",
3385
+ "audience",
3386
+ "claim/source",
3387
+ "voice/style_rule/lexicon/motif/canon",
3388
+ "agent",
3389
+ "flow",
3390
+ ];
3391
+ const FLUXO_EDITORIAL_AUTHOR_CLI = [
3392
+ "modele a obra e seus limites em work/book",
3393
+ "declare publico, canon, personagens, linha do tempo e regras de mundo quando existirem",
3394
+ "declare style_rule para cortar cliches, ecos, muletas e repeticoes",
3395
+ "declare claim/source para material factual ou sensivel",
3396
+ "governe revisores como agents com tools, memory e policy",
3397
+ "orquestre revisao, checagem de fontes e continuidade em flow",
3398
+ "rode docs-impacto antes de mexer em capitulo importante",
3399
+ "gere contexto-ia para compactar canon, arcos e continuidade",
3400
+ "feche com finalizar-mudanca informando docs lidas",
3401
+ ];
3402
+ const REGRAS_AUTHOR_AUTOMATICAS_CLI = [
3403
+ {
3404
+ id: "mostrar_por_evidencia",
3405
+ nome: "Mostrar Por Evidencia",
3406
+ aplica: "emocao, trauma, revolta e mudanca social precisam aparecer por evidencia concreta em cena",
3407
+ evitar: ["moral explicada", "emocao declarada", "simbolo sem uso concreto"],
3408
+ preferir: ["objeto alterado", "rotina quebrada", "gesto observavel", "decisao visivel"],
3409
+ },
3410
+ {
3411
+ id: "causa_e_consequencia",
3412
+ nome: "Causa E Consequencia",
3413
+ aplica: "acao relevante precisa gerar consequencia proporcional",
3414
+ evitar: ["vitoria sem custo", "erro sem punicao", "revelacao sem efeito"],
3415
+ preferir: ["custo emocional", "custo fisico", "custo politico", "custo relacional"],
3416
+ },
3417
+ {
3418
+ id: "cena_com_dupla_funcao",
3419
+ nome: "Cena Com Dupla Funcao",
3420
+ aplica: "toda cena deve cumprir pelo menos duas funcoes narrativas sem exigir personagem novo",
3421
+ evitar: ["cena morta", "deslocamento vazio", "clima sem funcao"],
3422
+ preferir: ["avancar trama", "revelar personagem", "plantar pista", "mostrar consequencia"],
3423
+ },
3424
+ {
3425
+ id: "exposicao_com_atrito",
3426
+ nome: "Exposicao Com Atrito",
3427
+ aplica: "informacao de mundo ou passado deve aparecer em situacao com tensao",
3428
+ evitar: ["palestra", "lore sem conflito", "dialogo em que todos ja sabem"],
3429
+ preferir: ["discussao", "ameaca", "documento incompleto", "erro operacional"],
3430
+ },
3431
+ {
3432
+ id: "antagonista_com_logica_interna",
3433
+ nome: "Antagonista Com Logica Interna",
3434
+ aplica: "antagonistas precisam ter objetivo compreensivel e poder real de afetar a trama",
3435
+ evitar: ["malvadeza decorativa", "plano explicado inteiro", "incompetencia conveniente"],
3436
+ preferir: ["argumento parcialmente convincente", "vantagem estrutural", "contradicao humana"],
3437
+ },
3438
+ {
3439
+ id: "conflito_sem_solucao_limpa",
3440
+ nome: "Conflito Sem Solucao Limpa",
3441
+ aplica: "problemas importantes nao devem ser resolvidos de forma perfeita ou gratuita",
3442
+ evitar: ["solucao magica", "perdao instantaneo", "plano sem imprevisto"],
3443
+ preferir: ["vitoria parcial", "dilema moral", "perda permanente", "novo problema"],
3444
+ },
3445
+ {
3446
+ id: "continuidade_de_personagens",
3447
+ nome: "Continuidade De Personagens",
3448
+ aplica: "personagem relevante precisa manter estado narrativo rastreavel",
3449
+ evitar: ["personagem sumir sem explicacao", "arco abandonado", "mudanca sem transicao"],
3450
+ preferir: ["onde esta", "o que quer", "o que sabe", "o que perdeu", "relacao alterada"],
3451
+ },
3452
+ {
3453
+ id: "misterio_em_escada",
3454
+ nome: "Misterio Em Escada",
3455
+ aplica: "revelacoes devem ser construidas por etapas",
3456
+ evitar: ["revelacao sem pista", "segredo tardio", "misterio mantido por falta de conversa"],
3457
+ preferir: ["pista", "contradicao", "interpretacao errada", "verdade parcial"],
3458
+ },
3459
+ {
3460
+ id: "dialogo_com_subtexto",
3461
+ nome: "Dialogo Com Subtexto",
3462
+ aplica: "dialogo deve carregar intencao, defesa, disputa ou tensao",
3463
+ evitar: ["fala explicativa", "todos com a mesma voz", "frase de efeito no lugar de conflito"],
3464
+ preferir: ["resposta indireta", "mentira util", "silencio significativo", "pergunta como ataque"],
3465
+ },
3466
+ {
3467
+ id: "acao_com_geografia_e_dano",
3468
+ nome: "Acao Com Geografia E Dano",
3469
+ aplica: "acao precisa ter espaco claro, objetivo concreto e consequencia depois",
3470
+ evitar: ["correria generica", "tiro para fingir ritmo", "sair ileso sem motivo"],
3471
+ preferir: ["mapa mental da cena", "obstaculo crescente", "uso do ambiente", "dano posterior"],
3472
+ },
3473
+ {
3474
+ id: "final_de_capitulo_sem_slogan",
3475
+ nome: "Final De Capitulo Sem Slogan",
3476
+ aplica: "capitulo termina com decisao, imagem, perda, ameaca ou descoberta, nao com moral de trailer",
3477
+ evitar: ["frase filosofica", "slogan sobre destino", "resumo da moral da cena"],
3478
+ preferir: ["decisao irreversivel", "imagem forte", "perda concreta", "ameaca especifica"],
3479
+ },
3480
+ {
3481
+ id: "morte_com_peso_estrutural",
3482
+ nome: "Morte Com Peso Estrutural",
3483
+ aplica: "morte importante precisa alterar relacoes, objetivo, poder, estado emocional ou rumo da obra",
3484
+ evitar: ["morte so para chocar", "luto pulado", "morte revertida sem custo"],
3485
+ preferir: ["mudanca em tres dimensoes", "custo narrativo", "consequencia no proximo capitulo"],
3486
+ },
3487
+ {
3488
+ id: "especificidade_sensorial",
3489
+ nome: "Especificidade Sensorial",
3490
+ aplica: "descricao deve trocar abstracao generica por detalhe observavel",
3491
+ evitar: ["ambiente sombrio", "dor insuportavel", "cidade caotica", "olhar triste"],
3492
+ preferir: ["som especifico", "cheiro especifico", "textura", "temperatura", "objeto fora do lugar"],
3493
+ },
3494
+ {
3495
+ id: "voz_distinta_por_personagem",
3496
+ nome: "Voz Distinta Por Personagem",
3497
+ aplica: "personagens recorrentes precisam ter forma propria de pensar, decidir e falar",
3498
+ evitar: ["todos falando como o narrador", "mesmo humor", "mesma reacao ao medo"],
3499
+ preferir: ["vocabulario proprio", "ritmo de fala", "tipo de silencio", "forma unica de mentir"],
3500
+ },
3501
+ {
3502
+ id: "anti_cliche_adaptativa",
3503
+ nome: "Anti-Cliche Adaptativa",
3504
+ aplica: "estrutura reconhecivel demais deve ser substituida por alternativa especifica",
3505
+ evitar: ["nao era sobre X, era sobre Y", "a esperanca renasceu", "o destino cobraria seu preco"],
3506
+ preferir: ["acao concreta", "consequencia", "gesto observavel", "pista plantada"],
3507
+ },
3508
+ ];
3509
+ function resumirRegrasAuthorAutomaticas() {
3510
+ return REGRAS_AUTHOR_AUTOMATICAS_CLI.map((regra) => `${regra.nome}: ${regra.aplica}`);
3511
+ }
3512
+ function criarContratoAuthorExemplo(sensivel) {
3513
+ if (sensivel) {
3514
+ return `module author.starter.sensivel {
3515
+ work obra_sensivel {
3516
+ titulo: "Guia responsavel"
3517
+ proposito: "explicar um tema sensivel sem prometer verdade clinica"
3518
+ tipo: nao_ficcao
3519
+ tema: autismo
3520
+ sensivel: verdadeiro
3521
+ }
3522
+
3523
+ audience publico_principal {
3524
+ publico: familias_educadores_pessoas_autistas
3525
+ limites: "nao substitui avaliacao clinica ou orientacao profissional"
3526
+ }
3527
+
3528
+ claim autismo_e_espectro {
3529
+ texto: "autismo e um espectro com manifestacoes variadas"
3530
+ source: fonte_principal
3531
+ confidence: alta
3532
+ }
3533
+
3534
+ source fonte_principal {
3535
+ tipo: revisao_bibliografica
3536
+ confianca: alta
3537
+ }
3538
+
3539
+ style_rule linguagem_respeitosa {
3540
+ require {
3541
+ mostrar_por_evidencia
3542
+ causa_e_consequencia
3543
+ exposicao_com_atrito
3544
+ final_de_capitulo_sem_slogan
3545
+ anti_cliche_adaptativa
3546
+ }
3547
+ proibido {
3548
+ frase: "superar o autismo"
3549
+ generalizacao: "todo autista"
3550
+ promessa: "diagnostico garantido"
3551
+ slogan: "a esperanca renasceu"
3552
+ }
3553
+ evitar {
3554
+ tom: infantilizacao
3555
+ abordagem: sensacionalismo
3556
+ estrutura: "nao era sobre X, era sobre Y"
3557
+ }
3558
+ preferir {
3559
+ evidencia: gesto_observavel
3560
+ consequencia: custo_visivel
3561
+ linguagem: detalhe_especifico
3562
+ }
3563
+ tolerancia {
3564
+ max_repeticao_palavra_por_trecho: 2
3565
+ cena_funcoes_minimas: 2
3566
+ }
3567
+ }
3568
+
3569
+ agent checador_fontes {
3570
+ role: revisor_fontes
3571
+ goal: bloquear_afirmacao_sensivel_sem_fonte
3572
+ tools {
3573
+ ler_contrato
3574
+ verificar_fontes
3575
+ analisar_trecho
3576
+ }
3577
+ memory {
3578
+ claim
3579
+ source
3580
+ style_rule
3581
+ }
3582
+ policy {
3583
+ nao_afirmar_sem_fonte
3584
+ sinalizar_incerteza
3585
+ citar_trechos_afetados
3586
+ }
3587
+ }
3588
+
3589
+ flow revisar_secao_sensivel {
3590
+ trecho: Texto
3591
+ etapa fontes usa checador_fontes com trecho = trecho
3592
+ }
3593
+ }
3594
+ `;
3595
+ }
3596
+ return `module author.starter.obra {
3597
+ work obra {
3598
+ titulo: "Projeto autoral"
3599
+ proposito: "governar continuidade, arcos, personagens e tom editorial"
3600
+ tipo: ficcao
3601
+ }
3602
+
3603
+ audience leitores {
3604
+ publico: leitores_ficcao_especulativa
3605
+ promessa: "continuidade consistente e cenas com causa e consequencia"
3606
+ }
3607
+
3608
+ character protagonista {
3609
+ funcao: protagonista
3610
+ arco: queda_e_reconstrucao
3611
+ }
3612
+
3613
+ arc arco_principal {
3614
+ inicio: "desejo claro"
3615
+ virada: "custo moral visivel"
3616
+ fim: "mudanca irreversivel"
3617
+ }
3618
+
3619
+ canon universo {
3620
+ regra: "nada muda no mundo sem custo emocional, logistico ou relacional"
3621
+ }
3622
+
3623
+ style_rule anti_texto_raso {
3624
+ require {
3625
+ mostrar_por_evidencia
3626
+ causa_e_consequencia
3627
+ cena_com_dupla_funcao
3628
+ exposicao_com_atrito
3629
+ dialogo_com_subtexto
3630
+ final_de_capitulo_sem_slogan
3631
+ anti_cliche_adaptativa
3632
+ }
3633
+ proibido {
3634
+ frase: "de alguma forma"
3635
+ cliche: "o tempo parecia parar"
3636
+ estrutura: "nao era sobre X, era sobre Y"
3637
+ slogan: "a esperanca renasceu"
3638
+ moral: "todos finalmente entenderam a verdade"
3639
+ }
3640
+ ecos {
3641
+ palavra: "silencio"
3642
+ }
3643
+ preferir {
3644
+ evidencia: gesto_concreto
3645
+ consequencia: custo_visivel
3646
+ misterio: pista_contradicao_verdade_parcial
3647
+ final: decisao_ou_imagem_concreta
3648
+ }
3649
+ tolerancia {
3650
+ max_repeticao_palavra_por_trecho: 2
3651
+ cena_funcoes_minimas: 2
3652
+ }
3653
+ }
3654
+
3655
+ agent revisor_continuidade {
3656
+ role: editor_author
3657
+ goal: preservar_canon_arcos_e_continuidade
3658
+ tools {
3659
+ ler_contrato
3660
+ analisar_trecho
3661
+ comparar_canon
3662
+ }
3663
+ memory {
3664
+ canon
3665
+ character
3666
+ arc
3667
+ style_rule
3668
+ }
3669
+ policy {
3670
+ nao_reescrever_sem_aprovacao
3671
+ citar_trechos_afetados
3672
+ registrar_decisoes_editoriais
3673
+ }
3674
+ }
3675
+
3676
+ flow revisar_capitulo {
3677
+ trecho: Texto
3678
+ etapa continuidade usa revisor_continuidade com trecho = trecho
3679
+ }
3680
+ }
3681
+ `;
3682
+ }
3683
+ function criarPayloadAuthorCli(modo, sensivel) {
3684
+ return {
3685
+ comando: "author",
3686
+ profile: "Author",
3687
+ modo,
3688
+ sensivel,
3689
+ blocos: [...BLOCOS_AUTHOR_CLI],
3690
+ fluxoEditorial: [...FLUXO_EDITORIAL_AUTHOR_CLI],
3691
+ regrasAutomaticas: REGRAS_AUTHOR_AUTOMATICAS_CLI.map((regra) => ({
3692
+ ...regra,
3693
+ evitar: [...regra.evitar],
3694
+ preferir: [...regra.preferir],
3695
+ })),
3696
+ comandos: [
3697
+ "sema author --help",
3698
+ "sema author exemplo",
3699
+ "sema author exemplo --sensivel --json",
3700
+ "sema validar contratos/<obra>.sema --json",
3701
+ "sema docs-impacto --intencao \"editar capitulo\" --arquivo contratos/<obra>.sema --criar-ausentes --json",
3702
+ "sema contexto-ia contratos/<obra>.sema --saida ./.tmp/contexto-author --json",
3703
+ "sema finalizar-mudanca --intencao \"editar capitulo\" --arquivo contratos/<obra>.sema --doc-lida docs/<doc>.md --json",
3704
+ ],
3705
+ contratoExemplo: criarContratoAuthorExemplo(sensivel),
3706
+ };
3707
+ }
3708
+ function renderizarAjudaAuthor() {
3709
+ return [
3710
+ "Sema Author",
3711
+ "",
3712
+ renderizarSecaoAscii("Uso", [
3713
+ "sema author --help",
3714
+ "sema author exemplo",
3715
+ "sema author exemplo --sensivel",
3716
+ "sema author exemplo --sensivel --json",
3717
+ ]),
3718
+ "",
3719
+ renderizarSecaoAscii("Serve para", [
3720
+ "obra, livro, capitulo, cena, personagem, arco, canon, tese, claim, fonte e continuidade",
3721
+ "ficcao, nao ficcao, livro tecnico, ensaio, biografia, pesquisa aplicada, manual e curso em livro",
3722
+ "evitar cliche, eco, muleta, generalizacao, infantilizacao e reescrita sem politica",
3723
+ ]),
3724
+ "",
3725
+ renderizarSecaoAscii("Fluxo recomendado", [...FLUXO_EDITORIAL_AUTHOR_CLI]),
3726
+ "",
3727
+ renderizarSecaoAscii("Regras automaticas", resumirRegrasAuthorAutomaticas()),
3728
+ "",
3729
+ renderizarSecaoAscii("Blocos principais", [...BLOCOS_AUTHOR_CLI]),
3730
+ "",
3731
+ renderizarSecaoAscii("Comandos que encaixam", [
3732
+ "sema docs-impacto --intencao \"editar capitulo\" --arquivo contratos/<obra>.sema --criar-ausentes --json",
3733
+ "sema contexto-ia contratos/<obra>.sema --saida ./.tmp/contexto-author --json",
3734
+ "sema finalizar-mudanca --intencao \"editar capitulo\" --arquivo contratos/<obra>.sema --doc-lida docs/<doc>.md --json",
3735
+ ]),
3736
+ ].join("\n");
3737
+ }
3738
+ async function comandoAuthor(posicionais, args, emJson) {
3739
+ const subcomando = posicionais[0];
3740
+ const sensivel = possuiFlag(args, "--sensivel") || possuiFlag(args, "--sensitive");
3741
+ const modo = subcomando === "exemplo" || subcomando === "template" || subcomando === "starter"
3742
+ ? "exemplo"
3743
+ : "ajuda";
3744
+ const payload = criarPayloadAuthorCli(modo, sensivel);
3745
+ if (emJson) {
3746
+ console.log(JSON.stringify(payload, null, 2));
3747
+ return 0;
3748
+ }
3749
+ if (modo === "exemplo") {
3750
+ console.log(payload.contratoExemplo);
3751
+ return 0;
3752
+ }
3753
+ console.log(renderizarAjudaAuthor());
3754
+ return 0;
3755
+ }
3375
3756
  async function comandoValidar(entrada) {
3376
3757
  const modulos = await carregarModulos(entrada);
3377
3758
  const diagnosticos = modulos.flatMap((item) => item.resultado.diagnosticos);
@@ -3905,6 +4286,7 @@ async function comandoAjudaIa() {
3905
4286
  "Use `sema prompt-curto <arquivo> --curto --para mudanca` para colar contexto em modelo gratuito.",
3906
4287
  "Use `sema prompt-ia`, `sema prompt-ia-ui`, `sema prompt-ia-react` e `sema prompt-ia-sema-primeiro` conforme a tarefa.",
3907
4288
  "Use `sema exemplos-prompt-ia` para pegar modelos prontos de prompt.",
4289
+ "Use `sema author` para obra, capitulos, cenas, personagens, continuidade, fontes, estilo, agents e flow editorial.",
3908
4290
  "Use `sema inspecionar` para descobrir base, codigo vivo e fontes legado.",
3909
4291
  "Use `sema drift` para medir impls, vinculos, rotas, score e lacunas.",
3910
4292
  "Use `sema docs-impacto --intencao <acao>` para ler ou criar docs obrigatorias antes de agir.",
@@ -4392,7 +4774,7 @@ async function principal() {
4392
4774
  {
4393
4775
  const fonte = normalizarFonteImportacao(posicionais[0]);
4394
4776
  if (!fonte || !posicionais[1]) {
4395
- console.error("Uso: sema importar <nestjs|fastapi|flask|nextjs|nextjs-consumer|react-vite-consumer|angular-consumer|flutter-consumer|firebase|dotnet|java|go|rust|cpp|typescript|python|dart|lua> <diretorio> [--saida <diretorio>] [--namespace <base>] [--json]");
4777
+ console.error("Uso: sema importar <nestjs|fastapi|flask|nextjs|nextjs-consumer|react-vite-consumer|angular-consumer|flutter-consumer|firebase|php|dotnet|java|go|rust|cpp|typescript|python|dart|lua> <diretorio> [--saida <diretorio>] [--namespace <base>] [--json]");
4396
4778
  codigoSaida = 1;
4397
4779
  break;
4398
4780
  }
@@ -4423,6 +4805,9 @@ async function principal() {
4423
4805
  case "finalizar-mudanca":
4424
4806
  codigoSaida = await comandoFinalizarMudanca(posicionais, resto, possuiFlag(resto, "--json"));
4425
4807
  break;
4808
+ case "author":
4809
+ codigoSaida = await comandoAuthor(posicionais, resto, possuiFlag(resto, "--json"));
4810
+ break;
4426
4811
  case "resumo":
4427
4812
  codigoSaida = await comandoResumo(posicionais[0], resto, possuiFlag(resto, "--json"));
4428
4813
  break;