@semacode/cli 1.5.11 → 1.5.16

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 (177) hide show
  1. package/README.md +6 -1
  2. package/dist/index.js +446 -32
  3. package/package.json +23 -32
  4. package/semacode-cli-1.3.1.tgz +0 -0
  5. package/src/angular-consumer-standalone.ts +312 -0
  6. package/src/cpp-symbols.ts +82 -0
  7. package/src/docs.ts +535 -0
  8. package/src/dotnet-http.ts +355 -0
  9. package/src/drift.ts +4933 -0
  10. package/src/go-http.ts +118 -0
  11. package/src/importador.ts +3891 -0
  12. package/src/index.ts +5641 -0
  13. package/src/java-http.ts +247 -0
  14. package/src/lua-symbols.ts +114 -0
  15. package/src/php-symbols.ts +462 -0
  16. package/src/projeto.ts +862 -0
  17. package/src/python-http.ts +258 -0
  18. package/src/rust-http.ts +125 -0
  19. package/src/tipos.ts +24 -0
  20. package/src/typescript-http.ts +1076 -0
  21. package/tsconfig.json +20 -0
  22. package/AGENTS.md +0 -272
  23. package/LICENSE +0 -22
  24. package/SEMA_BRIEF.curto.txt +0 -9
  25. package/SEMA_BRIEF.md +0 -63
  26. package/SEMA_BRIEF.micro.txt +0 -7
  27. package/SEMA_INDEX.json +0 -799
  28. package/dist/angular-consumer-standalone.d.ts +0 -6
  29. package/dist/angular-consumer-standalone.js.map +0 -1
  30. package/dist/cpp-symbols.d.ts +0 -10
  31. package/dist/cpp-symbols.js.map +0 -1
  32. package/dist/docs.d.ts +0 -56
  33. package/dist/docs.js.map +0 -1
  34. package/dist/dotnet-http.d.ts +0 -23
  35. package/dist/dotnet-http.js.map +0 -1
  36. package/dist/drift.d.ts +0 -225
  37. package/dist/drift.js.map +0 -1
  38. package/dist/go-http.d.ts +0 -23
  39. package/dist/go-http.js.map +0 -1
  40. package/dist/importador.d.ts +0 -31
  41. package/dist/importador.js.map +0 -1
  42. package/dist/index.d.ts +0 -2
  43. package/dist/index.js.map +0 -1
  44. package/dist/java-http.d.ts +0 -23
  45. package/dist/java-http.js.map +0 -1
  46. package/dist/lua-symbols.d.ts +0 -10
  47. package/dist/lua-symbols.js.map +0 -1
  48. package/dist/php-symbols.d.ts +0 -24
  49. package/dist/php-symbols.js.map +0 -1
  50. package/dist/projeto.d.ts +0 -53
  51. package/dist/projeto.js.map +0 -1
  52. package/dist/python-http.d.ts +0 -23
  53. package/dist/python-http.js.map +0 -1
  54. package/dist/rust-http.d.ts +0 -23
  55. package/dist/rust-http.js.map +0 -1
  56. package/dist/tipos.d.ts +0 -3
  57. package/dist/tipos.js.map +0 -1
  58. package/dist/typescript-http.d.ts +0 -35
  59. package/dist/typescript-http.js.map +0 -1
  60. package/docs/AGENT_STARTER.md +0 -102
  61. package/docs/cli.md +0 -110
  62. package/docs/como-ensinar-a-sema-para-ia.md +0 -149
  63. package/docs/deploy.md +0 -70
  64. package/docs/documentacao.md +0 -63
  65. package/docs/env.md +0 -56
  66. package/docs/extensao-vscode.md +0 -45
  67. package/docs/fluxo-pratico-ia-sema.md +0 -177
  68. package/docs/instalacao-e-primeiro-uso.md +0 -112
  69. package/docs/integracao-com-ia.md +0 -101
  70. package/docs/mcp.md +0 -53
  71. package/docs/pagamento-ponta-a-ponta.md +0 -155
  72. package/docs/persistencia-vendor-first.md +0 -145
  73. package/docs/prompt-base-ia-sema.md +0 -104
  74. package/docs/rollback.md +0 -47
  75. package/docs/sintaxe.md +0 -244
  76. package/exemplos/agendamento.sema +0 -106
  77. package/exemplos/assinatura.sema +0 -136
  78. package/exemplos/auditoria.sema +0 -88
  79. package/exemplos/autenticacao.sema +0 -125
  80. package/exemplos/automacao.sema +0 -107
  81. package/exemplos/cadastro_usuario.sema +0 -54
  82. package/exemplos/calculadora.sema +0 -78
  83. package/exemplos/crud_simples.sema +0 -89
  84. package/exemplos/estoque.sema +0 -126
  85. package/exemplos/exportacao.sema +0 -94
  86. package/exemplos/fila.sema +0 -131
  87. package/exemplos/integracao_externa.sema +0 -94
  88. package/exemplos/multi_tenant.sema +0 -140
  89. package/exemplos/notificacao.sema +0 -98
  90. package/exemplos/operacao_estrategia.sema +0 -402
  91. package/exemplos/pagamento.sema +0 -222
  92. package/exemplos/pagamento_dominio.sema +0 -35
  93. package/exemplos/pedido.sema +0 -119
  94. package/exemplos/permissao.sema +0 -121
  95. package/exemplos/persistencia_vendor_first.sema +0 -86
  96. package/exemplos/relatorio.sema +0 -93
  97. package/exemplos/testes_embutidos.sema +0 -45
  98. package/exemplos/tratamento_erro.sema +0 -157
  99. package/exemplos/upload_arquivo.sema +0 -93
  100. package/exemplos/webhook.sema +0 -96
  101. package/llms-full.txt +0 -34
  102. package/llms.txt +0 -17
  103. package/node_modules/@sema/gerador-css/dist/index.d.ts +0 -3
  104. package/node_modules/@sema/gerador-css/dist/index.js +0 -592
  105. package/node_modules/@sema/gerador-css/dist/index.js.map +0 -1
  106. package/node_modules/@sema/gerador-css/package.json +0 -7
  107. package/node_modules/@sema/gerador-dart/dist/index.d.ts +0 -3
  108. package/node_modules/@sema/gerador-dart/dist/index.js +0 -44
  109. package/node_modules/@sema/gerador-dart/dist/index.js.map +0 -1
  110. package/node_modules/@sema/gerador-dart/package.json +0 -7
  111. package/node_modules/@sema/gerador-html/dist/index.d.ts +0 -3
  112. package/node_modules/@sema/gerador-html/dist/index.js +0 -163
  113. package/node_modules/@sema/gerador-html/dist/index.js.map +0 -1
  114. package/node_modules/@sema/gerador-html/package.json +0 -7
  115. package/node_modules/@sema/gerador-javascript/dist/index.d.ts +0 -3
  116. package/node_modules/@sema/gerador-javascript/dist/index.js +0 -421
  117. package/node_modules/@sema/gerador-javascript/dist/index.js.map +0 -1
  118. package/node_modules/@sema/gerador-javascript/package.json +0 -7
  119. package/node_modules/@sema/gerador-lua/dist/index.d.ts +0 -3
  120. package/node_modules/@sema/gerador-lua/dist/index.js +0 -328
  121. package/node_modules/@sema/gerador-lua/dist/index.js.map +0 -1
  122. package/node_modules/@sema/gerador-lua/package.json +0 -7
  123. package/node_modules/@sema/gerador-python/dist/index.d.ts +0 -6
  124. package/node_modules/@sema/gerador-python/dist/index.js +0 -729
  125. package/node_modules/@sema/gerador-python/dist/index.js.map +0 -1
  126. package/node_modules/@sema/gerador-python/package.json +0 -7
  127. package/node_modules/@sema/gerador-typescript/dist/index.d.ts +0 -6
  128. package/node_modules/@sema/gerador-typescript/dist/index.js +0 -793
  129. package/node_modules/@sema/gerador-typescript/dist/index.js.map +0 -1
  130. package/node_modules/@sema/gerador-typescript/package.json +0 -7
  131. package/node_modules/@sema/nucleo/dist/ast/tipos.d.ts +0 -123
  132. package/node_modules/@sema/nucleo/dist/ast/tipos.js +0 -2
  133. package/node_modules/@sema/nucleo/dist/ast/tipos.js.map +0 -1
  134. package/node_modules/@sema/nucleo/dist/diagnosticos/index.d.ts +0 -21
  135. package/node_modules/@sema/nucleo/dist/diagnosticos/index.js +0 -12
  136. package/node_modules/@sema/nucleo/dist/diagnosticos/index.js.map +0 -1
  137. package/node_modules/@sema/nucleo/dist/formatador/index.d.ts +0 -9
  138. package/node_modules/@sema/nucleo/dist/formatador/index.js +0 -460
  139. package/node_modules/@sema/nucleo/dist/formatador/index.js.map +0 -1
  140. package/node_modules/@sema/nucleo/dist/index.d.ts +0 -35
  141. package/node_modules/@sema/nucleo/dist/index.js +0 -96
  142. package/node_modules/@sema/nucleo/dist/index.js.map +0 -1
  143. package/node_modules/@sema/nucleo/dist/ir/conversor.d.ts +0 -5
  144. package/node_modules/@sema/nucleo/dist/ir/conversor.js +0 -883
  145. package/node_modules/@sema/nucleo/dist/ir/conversor.js.map +0 -1
  146. package/node_modules/@sema/nucleo/dist/ir/modelos.d.ts +0 -345
  147. package/node_modules/@sema/nucleo/dist/ir/modelos.js +0 -2
  148. package/node_modules/@sema/nucleo/dist/ir/modelos.js.map +0 -1
  149. package/node_modules/@sema/nucleo/dist/lexer/lexer.d.ts +0 -7
  150. package/node_modules/@sema/nucleo/dist/lexer/lexer.js +0 -122
  151. package/node_modules/@sema/nucleo/dist/lexer/lexer.js.map +0 -1
  152. package/node_modules/@sema/nucleo/dist/lexer/tokens.d.ts +0 -8
  153. package/node_modules/@sema/nucleo/dist/lexer/tokens.js +0 -61
  154. package/node_modules/@sema/nucleo/dist/lexer/tokens.js.map +0 -1
  155. package/node_modules/@sema/nucleo/dist/parser/parser.d.ts +0 -9
  156. package/node_modules/@sema/nucleo/dist/parser/parser.js +0 -771
  157. package/node_modules/@sema/nucleo/dist/parser/parser.js.map +0 -1
  158. package/node_modules/@sema/nucleo/dist/persistencia/contratos.d.ts +0 -39
  159. package/node_modules/@sema/nucleo/dist/persistencia/contratos.js +0 -294
  160. package/node_modules/@sema/nucleo/dist/persistencia/contratos.js.map +0 -1
  161. package/node_modules/@sema/nucleo/dist/semantico/analisador.d.ts +0 -57
  162. package/node_modules/@sema/nucleo/dist/semantico/analisador.js +0 -1617
  163. package/node_modules/@sema/nucleo/dist/semantico/analisador.js.map +0 -1
  164. package/node_modules/@sema/nucleo/dist/semantico/estruturas.d.ts +0 -104
  165. package/node_modules/@sema/nucleo/dist/semantico/estruturas.js +0 -445
  166. package/node_modules/@sema/nucleo/dist/semantico/estruturas.js.map +0 -1
  167. package/node_modules/@sema/nucleo/dist/semantico/seguranca.d.ts +0 -91
  168. package/node_modules/@sema/nucleo/dist/semantico/seguranca.js +0 -258
  169. package/node_modules/@sema/nucleo/dist/semantico/seguranca.js.map +0 -1
  170. package/node_modules/@sema/nucleo/dist/util/arquivos.d.ts +0 -2
  171. package/node_modules/@sema/nucleo/dist/util/arquivos.js +0 -25
  172. package/node_modules/@sema/nucleo/dist/util/arquivos.js.map +0 -1
  173. package/node_modules/@sema/nucleo/package.json +0 -7
  174. package/node_modules/@sema/padroes/dist/index.d.ts +0 -25
  175. package/node_modules/@sema/padroes/dist/index.js +0 -316
  176. package/node_modules/@sema/padroes/dist/index.js.map +0 -1
  177. package/node_modules/@sema/padroes/package.json +0 -7
package/README.md CHANGED
@@ -6,6 +6,9 @@ Ela valida contratos `.sema`, mede `drift` entre contrato e codigo vivo, importa
6
6
 
7
7
  Lua e suportado como alvo de geracao e como origem semantica de codigo vivo em `use`, `impl`, IR, `drift` e `sema importar`.
8
8
  PHP tambem e suportado como origem semantica de codigo vivo em `use`, `impl`, IR, `drift` e `sema importar`, incluindo controllers, funcoes, rotas Laravel/Slim e atributos Symfony/PHP 8.
9
+ `sema author` expoe o profile Author para obra, capitulos, cenas, personagens, continuidade, fontes, estilo, agents e flow editorial.
10
+ O comando tambem expoe `regrasAutomaticas` com o piso geral do Author: mostrar por evidencia, causa e consequencia, cena com dupla funcao, exposicao com atrito, dialogo com subtexto, final sem slogan e anti-cliche adaptativa.
11
+ Em pacotes de contexto e resumos de projeto, os artefatos compactos (`resumo.micro.txt`, `resumo.curto.txt`, `prompt-curto.txt`, `briefing.min.json` e `SEMA_BRIEF.*`) tambem expõem `AUTHOR_RULES_AUTO` para IA pequena nao perder essas regras.
9
12
 
10
13
  Tambem resolve documentacao obrigatoria por intencao para impedir IA de agir sem ler ou criar docs relacionadas.
11
14
 
@@ -70,7 +73,7 @@ Nesta linha, o `drift` tambem passa a resolver melhor metodos JS/TS browser-side
70
73
 
71
74
  Nesta linha, o `drift` tambem passa a enxergar `Preferences`, `localStorage` e `sessionStorage` como persistencia local real, distinguir `ancoragemVinculo` herdada do modulo e cobrir `angular-consumer` standalone mesmo quando o app nao tem `.routes`.
72
75
 
73
- Nesta linha, o pacote publico da CLI tambem deixa `tsx` fora das dependencias de runtime para evitar ruído de instalacao global no Windows.
76
+ Nesta linha, o `verificar/typescript` tambem deixa de depender de `tsx`: a CLI transpila os testes gerados com `typescript` e roda `node --test`, evitando `fsevents` e `node-gyp` na instalacao global do Windows.
74
77
 
75
78
  Cobertura publica:
76
79
 
@@ -95,6 +98,8 @@ O tarball publico da CLI inclui:
95
98
  - `sema drift <arquivo-ou-pasta> --json`
96
99
  - `sema resumo <arquivo-ou-pasta> --micro --para onboarding`
97
100
  - `sema prompt-curto <arquivo-ou-pasta> --curto --para mudanca`
101
+ - `sema author --help`
102
+ - `sema author exemplo [--sensivel] [--json]`
98
103
  - `sema contexto-ia <arquivo.sema> --saida <diretorio> --json`
99
104
  - `sema docs-impacto --intencao <acao> [--arquivo <caminho>] [--criar-ausentes] --json`
100
105
  - `sema finalizar-mudanca --intencao <acao> [--doc-lida <caminho>] --json`
package/dist/index.js CHANGED
@@ -1,9 +1,10 @@
1
1
  #!/usr/bin/env node
2
+ import { mkdirSync, rmSync, writeFileSync } from "node:fs";
2
3
  import { mkdir, readFile, readdir, stat, writeFile } from "node:fs/promises";
3
4
  import path from "node:path";
4
5
  import { spawnSync } from "node:child_process";
5
- import { createRequire } from "node:module";
6
6
  import { fileURLToPath } from "node:url";
7
+ import ts from "typescript";
7
8
  import pacoteCli from "../package.json" with { type: "json" };
8
9
  import { compilarCodigo, formatarCodigo, formatarDiagnosticos, lerArquivoTexto, temErros, } from "@sema/nucleo";
9
10
  import { descreverEstruturaModulo } from "@sema/padroes";
@@ -324,7 +325,6 @@ Comandos uteis da CLI para esse fluxo:
324
325
  `;
325
326
  const DIRETORIO_CLI_ATUAL = path.dirname(fileURLToPath(import.meta.url));
326
327
  const VERSAO_CLI = pacoteCli.version;
327
- const requireRuntimeCli = createRequire(import.meta.url);
328
328
  const ARQUIVOS_CANONICOS_IA_RAIZ = [
329
329
  "llms.txt",
330
330
  "SEMA_BRIEF.md",
@@ -348,16 +348,6 @@ const DOCUMENTOS_SUPORTE_IA = [
348
348
  "docs/rollback.md",
349
349
  "docs/extensao-vscode.md",
350
350
  ];
351
- function resolverImportadorNodeOpcional(especificador) {
352
- try {
353
- return requireRuntimeCli.resolve(especificador);
354
- }
355
- catch {
356
- return undefined;
357
- }
358
- }
359
- const TSX_IMPORTADOR_CLI = resolverImportadorNodeOpcional("tsx");
360
- const TSX_EXECUTOR_CLI = resolverImportadorNodeOpcional("tsx/cli");
361
351
  async function caminhoEhDiretorio(caminhoAlvo) {
362
352
  try {
363
353
  return (await stat(caminhoAlvo)).isDirectory();
@@ -496,6 +486,8 @@ function ajuda() {
496
486
  "sema prompt-ia-react",
497
487
  "sema prompt-ia-sema-primeiro",
498
488
  "sema exemplos-prompt-ia",
489
+ "sema author [--help]",
490
+ "sema author exemplo [--sensivel] [--json]",
499
491
  "sema contexto-ia <arquivo.sema> [--saida <diretorio>] [--json]",
500
492
  "sema sync-ai-entrypoints [--json]",
501
493
  "sema instalar-exemplos [--json]",
@@ -656,11 +648,7 @@ function coletarDependenciasDoctor() {
656
648
  comando: "verificar/typescript",
657
649
  itens: [
658
650
  criarItemDependencia("node", comandoDisponivel("node"), "execucao do runner TypeScript"),
659
- criarItemDependencia("tsx", Boolean(TSX_EXECUTOR_CLI ?? TSX_IMPORTADOR_CLI), TSX_EXECUTOR_CLI
660
- ? `runner resolvido em ${TSX_EXECUTOR_CLI}`
661
- : TSX_IMPORTADOR_CLI
662
- ? `importador resolvido em ${TSX_IMPORTADOR_CLI}`
663
- : "tsx nao foi encontrado junto da CLI"),
651
+ criarItemDependencia("typescript", typeof ts.transpileModule === "function", `transpilador runtime resolvido em typescript ${ts.version}`),
664
652
  ],
665
653
  },
666
654
  {
@@ -710,11 +698,7 @@ function avaliarPreflightVerificacao(configuracoesAlvo) {
710
698
  if (configuracao.alvo === "typescript") {
711
699
  registrar("verificar/typescript", [
712
700
  criarItemDependencia("node", comandoDisponivel("node"), "execucao do runner TypeScript"),
713
- criarItemDependencia("tsx", Boolean(TSX_EXECUTOR_CLI ?? TSX_IMPORTADOR_CLI), TSX_EXECUTOR_CLI
714
- ? `runner resolvido em ${TSX_EXECUTOR_CLI}`
715
- : TSX_IMPORTADOR_CLI
716
- ? `importador resolvido em ${TSX_IMPORTADOR_CLI}`
717
- : "tsx nao foi encontrado junto da CLI"),
701
+ criarItemDependencia("typescript", typeof ts.transpileModule === "function", `transpilador runtime resolvido em typescript ${ts.version}`),
718
702
  ]);
719
703
  continue;
720
704
  }
@@ -1001,6 +985,35 @@ function contarCasosDeTesteGerados(alvo, arquivos) {
1001
985
  }
1002
986
  return (arquivoTeste.conteudo.match(/\bdef test_/g) ?? []).length;
1003
987
  }
988
+ function reescreverImportsTypeScriptGerados(codigo) {
989
+ return codigo
990
+ .replace(/(from\s+["']\.{1,2}\/[^"']+)\.ts(["'])/g, "$1.cjs$2")
991
+ .replace(/(require\(\s*["']\.{1,2}\/[^"']+)\.ts(["']\s*\))/g, "$1.cjs$2");
992
+ }
993
+ function compilarTypeScriptGeradoParaNodeTest(baseSaida, arquivos, arquivoTeste) {
994
+ const pastaRuntime = path.join(baseSaida, ".sema-js-tests");
995
+ rmSync(pastaRuntime, { recursive: true, force: true });
996
+ for (const arquivo of arquivos) {
997
+ if (!arquivo.caminhoRelativo.endsWith(".ts")) {
998
+ continue;
999
+ }
1000
+ const caminhoRelativoJs = arquivo.caminhoRelativo.replace(/\.ts$/i, ".cjs");
1001
+ const destino = path.join(pastaRuntime, caminhoRelativoJs);
1002
+ mkdirSync(path.dirname(destino), { recursive: true });
1003
+ const transpilado = ts.transpileModule(arquivo.conteudo, {
1004
+ fileName: arquivo.caminhoRelativo,
1005
+ compilerOptions: {
1006
+ module: ts.ModuleKind.CommonJS,
1007
+ target: ts.ScriptTarget.ES2022,
1008
+ esModuleInterop: true,
1009
+ sourceMap: false,
1010
+ inlineSourceMap: false,
1011
+ },
1012
+ }).outputText;
1013
+ writeFileSync(destino, reescreverImportsTypeScriptGerados(transpilado), "utf8");
1014
+ }
1015
+ return path.join(pastaRuntime, arquivoTeste.replace(/\.ts$/i, ".cjs"));
1016
+ }
1004
1017
  function executarTestesGerados(alvo, baseSaida, arquivos, silencioso = false) {
1005
1018
  const quantidadeTestes = contarCasosDeTesteGerados(alvo, arquivos);
1006
1019
  if (quantidadeTestes === 0) {
@@ -1021,15 +1034,8 @@ function executarTestesGerados(alvo, baseSaida, arquivos, silencioso = false) {
1021
1034
  }
1022
1035
  return { codigoSaida: 0, quantidadeTestes, saidaPadrao: "", saidaErro: "" };
1023
1036
  }
1024
- if (!TSX_EXECUTOR_CLI) {
1025
- return {
1026
- codigoSaida: 1,
1027
- quantidadeTestes,
1028
- saidaPadrao: "",
1029
- saidaErro: "Nao foi possivel localizar o runner tsx junto da CLI para executar testes TypeScript.",
1030
- };
1031
- }
1032
- const execucao = spawnSync("node", [TSX_EXECUTOR_CLI, arquivoTeste], {
1037
+ const arquivoTesteJs = compilarTypeScriptGeradoParaNodeTest(baseSaida, arquivos, arquivoTeste);
1038
+ const execucao = spawnSync("node", ["--test", arquivoTesteJs], {
1033
1039
  stdio: silencioso ? "pipe" : "inherit",
1034
1040
  cwd: baseSaida,
1035
1041
  encoding: silencioso ? "utf8" : undefined,
@@ -1351,6 +1357,7 @@ function coletarResumoSemanticoModulo(contexto) {
1351
1357
  ...rotas.map((route) => `${route.metodo ?? "?"} ${route.caminho ?? route.nome}`),
1352
1358
  ]), 8),
1353
1359
  regrasCriticas: limitarLista(regrasCriticas, 8),
1360
+ regrasAuthorAutomaticas: extrairRegrasAuthorAutomaticas(ir),
1354
1361
  efeitos: limitarLista(efeitos, 8),
1355
1362
  erros: limitarLista(erros, 8),
1356
1363
  entidadesAfetadas: limitarLista(entidadesAfetadas, 8),
@@ -1369,6 +1376,19 @@ function coletarResumoSemanticoModulo(contexto) {
1369
1376
  arquivosProvaveisEditar: limitarLista(unicosOrdenados(briefing.arquivosProvaveisEditar ?? briefing.oQueTocar), 8),
1370
1377
  };
1371
1378
  }
1379
+ const NOME_REGRAS_AUTHOR_AUTOMATICAS = "regras_gerais_author";
1380
+ const LINHA_REGRAS_AUTHOR_AUTOMATICAS_COMPACTA = "AUTHOR_RULES_AUTO: regras_gerais_author ativa; aplicar evidencia concreta, causa/consequencia, cena com dupla funcao, exposicao com atrito, subtexto, acao com geografia/dano, final sem slogan, morte com peso estrutural e anti-cliche adaptativa.";
1381
+ function extrairRegrasAuthorAutomaticas(ir) {
1382
+ const regraAutomatica = ir?.author.find((item) => item.tipo === "style_rule" && item.nome === NOME_REGRAS_AUTHOR_AUTOMATICAS);
1383
+ return limitarLista(unicosOrdenados(regraAutomatica?.requisitos ?? []), 20);
1384
+ }
1385
+ function renderizarLinhaRegrasAuthorAutomaticas(ids) {
1386
+ return ids.length > 0 ? LINHA_REGRAS_AUTHOR_AUTOMATICAS_COMPACTA : null;
1387
+ }
1388
+ function renderizarLinhasRegrasAuthorAutomaticas(ids) {
1389
+ const linha = renderizarLinhaRegrasAuthorAutomaticas(ids);
1390
+ return linha ? [linha] : [];
1391
+ }
1372
1392
  function renderizarResumoModuloTexto(resumo, tamanho, modo) {
1373
1393
  const limite = tamanho === "micro" ? 2 : tamanho === "curto" ? 4 : 6;
1374
1394
  const linhas = [
@@ -1376,6 +1396,7 @@ function renderizarResumoModuloTexto(resumo, tamanho, modo) {
1376
1396
  `MODULO: ${resumo.modulo}`,
1377
1397
  `FAZ: ${resumo.faz}`,
1378
1398
  `PERFIL: ${resumo.perfilCompatibilidade}`,
1399
+ ...renderizarLinhasRegrasAuthorAutomaticas(resumo.regrasAuthorAutomaticas),
1379
1400
  `CONSUMER_FRAMEWORK: ${resumo.consumerFramework ?? "nenhum"}`,
1380
1401
  `APP_ROUTES: ${resumirListaTexto(resumo.appRoutes, limite)}`,
1381
1402
  `CONSUMER_SURFACES: ${resumirListaTexto(resumo.consumerSurfaces, limite)}`,
@@ -1400,7 +1421,8 @@ function renderizarResumoModuloTexto(resumo, tamanho, modo) {
1400
1421
  `GERADO_EM: ${resumo.geradoEm}`,
1401
1422
  ];
1402
1423
  if (tamanho === "micro") {
1403
- return `${linhas.slice(0, 12).join("\n")}\n`;
1424
+ const limiteMicro = 12 + (resumo.regrasAuthorAutomaticas.length > 0 ? 1 : 0);
1425
+ return `${linhas.slice(0, limiteMicro).join("\n")}\n`;
1404
1426
  }
1405
1427
  return `${linhas.join("\n")}\n`;
1406
1428
  }
@@ -1427,6 +1449,9 @@ function renderizarResumoModuloMarkdown(resumo, modo, guiaPorCapacidade) {
1427
1449
  `- Entradas chave: ${resumirListaTexto(resumo.entradasChave, 6)}`,
1428
1450
  `- Saidas chave: ${resumirListaTexto(resumo.saidasChave, 6)}`,
1429
1451
  `- Regras criticas: ${resumirListaTexto(resumo.regrasCriticas, 6)}`,
1452
+ ...(resumo.regrasAuthorAutomaticas.length > 0
1453
+ ? [`- Regras Author automaticas: ${resumirListaTexto(resumo.regrasAuthorAutomaticas, 20)}`]
1454
+ : []),
1430
1455
  `- Efeitos: ${resumirListaTexto(resumo.efeitos, 6)}`,
1431
1456
  `- Erros: ${resumirListaTexto(resumo.erros, 6)}`,
1432
1457
  `- Entidades afetadas: ${resumirListaTexto(resumo.entidadesAfetadas, 6)}`,
@@ -1486,6 +1511,7 @@ function criarBriefingMinimo(resumo, modo, tamanho) {
1486
1511
  entradasChave: resumo.entradasChave,
1487
1512
  saidasChave: resumo.saidasChave,
1488
1513
  regrasCriticas: resumo.regrasCriticas,
1514
+ regrasAuthorAutomaticas: resumo.regrasAuthorAutomaticas,
1489
1515
  efeitos: resumo.efeitos,
1490
1516
  erros: resumo.erros,
1491
1517
  arquivosProvaveis: resumo.arquivosProvaveis,
@@ -1526,6 +1552,7 @@ ${resumoTexto}
1526
1552
  }
1527
1553
  function renderizarResumoProjetoMarkdown(geradoEm, modulos, guiaPorCapacidade) {
1528
1554
  const entradaCanonica = criarEntradaCanonicaProjeto(guiaPorCapacidade);
1555
+ const regrasAuthorAutomaticas = unicosOrdenados(modulos.flatMap((modulo) => modulo.regrasAuthorAutomaticas));
1529
1556
  const linhas = [
1530
1557
  "# SEMA_BRIEF",
1531
1558
  "",
@@ -1540,6 +1567,9 @@ function renderizarResumoProjetoMarkdown(geradoEm, modulos, guiaPorCapacidade) {
1540
1567
  `- IA pequena: ${entradaCanonica.porCapacidade.pequena.join(" -> ")}`,
1541
1568
  `- IA media: ${entradaCanonica.porCapacidade.media.join(" -> ")}`,
1542
1569
  `- IA grande: ${entradaCanonica.porCapacidade.grande.join(" -> ")}`,
1570
+ ...(regrasAuthorAutomaticas.length > 0
1571
+ ? [`- Regras Author automaticas: ${resumirListaTexto(regrasAuthorAutomaticas, 20)}`]
1572
+ : []),
1543
1573
  "",
1544
1574
  "## Guia por capacidade",
1545
1575
  "",
@@ -1862,6 +1892,8 @@ async function gerarResumoProjetoIa(entrada, pastaSaidaOpcional, escreverNaRaiz
1862
1892
  : path.resolve(baseProjeto, ".tmp", "sema-resumo");
1863
1893
  await mkdir(pastaSaida, { recursive: true });
1864
1894
  const semaBrief = renderizarResumoProjetoMarkdown(geradoEm, modulos, guiaPorCapacidade);
1895
+ const regrasAuthorAutomaticas = unicosOrdenados(modulos.flatMap((modulo) => modulo.regrasAuthorAutomaticas));
1896
+ const linhasRegrasAuthorAutomaticas = renderizarLinhasRegrasAuthorAutomaticas(regrasAuthorAutomaticas);
1865
1897
  const indexJson = {
1866
1898
  comando: "resumo-projeto",
1867
1899
  geradoEm,
@@ -1870,12 +1902,14 @@ async function gerarResumoProjetoIa(entrada, pastaSaidaOpcional, escreverNaRaiz
1870
1902
  totalModulos: modulos.length,
1871
1903
  entradaCanonica,
1872
1904
  guiaPorCapacidade,
1905
+ regrasAuthorAutomaticas,
1873
1906
  modulos,
1874
1907
  };
1875
1908
  const micro = [
1876
1909
  `PROJETO: ${path.basename(baseProjeto)}`,
1877
1910
  `MODULOS: ${modulos.length}`,
1878
1911
  `ENTRADA_IA: ${entradaCanonica.porCapacidade.pequena.join(" -> ")}`,
1912
+ ...linhasRegrasAuthorAutomaticas,
1879
1913
  `TOP_MODULOS: ${resumirListaTexto(modulos.map((modulo) => modulo.modulo), 3)}`,
1880
1914
  `TOP_RISCOS: ${resumirListaTexto(unicosOrdenados(modulos.flatMap((modulo) => modulo.riscosPrincipais)), 3)}`,
1881
1915
  `TOP_LACUNAS: ${resumirListaTexto(unicosOrdenados(modulos.flatMap((modulo) => modulo.lacunas)), 3)}`,
@@ -1887,6 +1921,7 @@ async function gerarResumoProjetoIa(entrada, pastaSaidaOpcional, escreverNaRaiz
1887
1921
  `BASE: ${baseProjeto}`,
1888
1922
  `MODULOS: ${modulos.length}`,
1889
1923
  `ENTRADA_IA: ${entradaCanonica.porCapacidade.media.join(" -> ")}`,
1924
+ ...linhasRegrasAuthorAutomaticas,
1890
1925
  `TOP_MODULOS: ${resumirListaTexto(modulos.map((modulo) => modulo.modulo), 6)}`,
1891
1926
  `TOP_RISCOS: ${resumirListaTexto(unicosOrdenados(modulos.flatMap((modulo) => modulo.riscosPrincipais)), 6)}`,
1892
1927
  `TOP_LACUNAS: ${resumirListaTexto(unicosOrdenados(modulos.flatMap((modulo) => modulo.lacunas)), 6)}`,
@@ -3376,6 +3411,381 @@ async function comandoFinalizarMudanca(posicionais, args, emJson) {
3376
3411
  }
3377
3412
  return 1;
3378
3413
  }
3414
+ const BLOCOS_AUTHOR_CLI = [
3415
+ "work/book",
3416
+ "part/chapter/section",
3417
+ "scene/character/arc",
3418
+ "audience",
3419
+ "claim/source",
3420
+ "voice/style_rule/lexicon/motif/canon",
3421
+ "agent",
3422
+ "flow",
3423
+ ];
3424
+ const FLUXO_EDITORIAL_AUTHOR_CLI = [
3425
+ "modele a obra e seus limites em work/book",
3426
+ "declare publico, canon, personagens, linha do tempo e regras de mundo quando existirem",
3427
+ "declare style_rule para cortar cliches, ecos, muletas e repeticoes",
3428
+ "declare claim/source para material factual ou sensivel",
3429
+ "governe revisores como agents com tools, memory e policy",
3430
+ "orquestre revisao, checagem de fontes e continuidade em flow",
3431
+ "rode docs-impacto antes de mexer em capitulo importante",
3432
+ "gere contexto-ia para compactar canon, arcos e continuidade",
3433
+ "feche com finalizar-mudanca informando docs lidas",
3434
+ ];
3435
+ const REGRAS_AUTHOR_AUTOMATICAS_CLI = [
3436
+ {
3437
+ id: "mostrar_por_evidencia",
3438
+ nome: "Mostrar Por Evidência",
3439
+ aplica: "emocao, trauma, revolta e mudanca social precisam aparecer por evidencia concreta em cena",
3440
+ evitar: ["moral explicada", "emocao declarada", "simbolo sem uso concreto"],
3441
+ preferir: ["objeto alterado", "rotina quebrada", "gesto observavel", "decisao visivel"],
3442
+ },
3443
+ {
3444
+ id: "causa_e_consequencia",
3445
+ nome: "Causa E Consequência",
3446
+ aplica: "acao relevante precisa gerar consequencia proporcional",
3447
+ evitar: ["vitoria sem custo", "erro sem punicao", "revelacao sem efeito"],
3448
+ preferir: ["custo emocional", "custo fisico", "custo politico", "custo relacional"],
3449
+ },
3450
+ {
3451
+ id: "cena_com_dupla_funcao",
3452
+ nome: "Cena Com Dupla Função",
3453
+ aplica: "toda cena deve cumprir pelo menos duas funcoes narrativas sem exigir personagem novo",
3454
+ evitar: ["cena morta", "deslocamento vazio", "clima sem funcao"],
3455
+ preferir: ["avancar trama", "revelar personagem", "plantar pista", "mostrar consequencia"],
3456
+ },
3457
+ {
3458
+ id: "exposicao_com_atrito",
3459
+ nome: "Exposição Com Atrito",
3460
+ aplica: "informacao de mundo ou passado deve aparecer em situacao com tensao",
3461
+ evitar: ["palestra", "lore sem conflito", "dialogo em que todos ja sabem"],
3462
+ preferir: ["discussao", "ameaca", "documento incompleto", "erro operacional"],
3463
+ },
3464
+ {
3465
+ id: "antagonista_com_logica_interna",
3466
+ nome: "Antagonista Com Lógica Interna",
3467
+ aplica: "antagonistas precisam ter objetivo compreensivel e poder real de afetar a trama",
3468
+ evitar: ["malvadeza decorativa", "plano explicado inteiro", "incompetencia conveniente"],
3469
+ preferir: ["argumento parcialmente convincente", "vantagem estrutural", "contradicao humana"],
3470
+ },
3471
+ {
3472
+ id: "conflito_sem_solucao_limpa",
3473
+ nome: "Conflito Sem Solução Limpa",
3474
+ aplica: "problemas importantes nao devem ser resolvidos de forma perfeita ou gratuita",
3475
+ evitar: ["solucao magica", "perdao instantaneo", "plano sem imprevisto"],
3476
+ preferir: ["vitoria parcial", "dilema moral", "perda permanente", "novo problema"],
3477
+ },
3478
+ {
3479
+ id: "continuidade_de_personagens",
3480
+ nome: "Continuidade De Personagens",
3481
+ aplica: "personagem relevante precisa manter estado narrativo rastreavel",
3482
+ evitar: ["personagem sumir sem explicacao", "arco abandonado", "mudanca sem transicao"],
3483
+ preferir: ["onde esta", "o que quer", "o que sabe", "o que perdeu", "relacao alterada"],
3484
+ },
3485
+ {
3486
+ id: "misterio_em_escada",
3487
+ nome: "Mistério Em Escada",
3488
+ aplica: "revelacoes devem ser construidas por etapas",
3489
+ evitar: ["revelacao sem pista", "segredo tardio", "misterio mantido por falta de conversa"],
3490
+ preferir: ["pista", "contradicao", "interpretacao errada", "verdade parcial"],
3491
+ },
3492
+ {
3493
+ id: "dialogo_com_subtexto",
3494
+ nome: "Diálogo Com Subtexto",
3495
+ aplica: "dialogo deve carregar intencao, defesa, disputa ou tensao",
3496
+ evitar: ["fala explicativa", "todos com a mesma voz", "frase de efeito no lugar de conflito"],
3497
+ preferir: ["resposta indireta", "mentira util", "silencio significativo", "pergunta como ataque"],
3498
+ },
3499
+ {
3500
+ id: "acao_com_geografia_e_dano",
3501
+ nome: "Ação Com Geografia E Dano",
3502
+ aplica: "acao precisa ter espaco claro, objetivo concreto e consequencia depois",
3503
+ evitar: ["correria generica", "tiro para fingir ritmo", "sair ileso sem motivo"],
3504
+ preferir: ["mapa mental da cena", "obstaculo crescente", "uso do ambiente", "dano posterior"],
3505
+ },
3506
+ {
3507
+ id: "final_de_capitulo_sem_slogan",
3508
+ nome: "Final De Capítulo Sem Slogan",
3509
+ aplica: "capitulo termina com decisao, imagem, perda, ameaca ou descoberta, nao com moral de trailer",
3510
+ evitar: ["frase filosofica", "slogan sobre destino", "resumo da moral da cena"],
3511
+ preferir: ["decisao irreversivel", "imagem forte", "perda concreta", "ameaca especifica"],
3512
+ },
3513
+ {
3514
+ id: "morte_com_peso_estrutural",
3515
+ nome: "Morte Com Peso Estrutural",
3516
+ aplica: "morte importante precisa alterar relacoes, objetivo, poder, estado emocional ou rumo da obra",
3517
+ evitar: ["morte so para chocar", "luto pulado", "morte revertida sem custo"],
3518
+ preferir: ["mudanca em tres dimensoes", "custo narrativo", "consequencia no proximo capitulo"],
3519
+ },
3520
+ {
3521
+ id: "especificidade_sensorial",
3522
+ nome: "Especificidade Sensorial",
3523
+ aplica: "descricao deve trocar abstracao generica por detalhe observavel",
3524
+ evitar: ["ambiente sombrio", "dor insuportavel", "cidade caotica", "olhar triste"],
3525
+ preferir: ["som especifico", "cheiro especifico", "textura", "temperatura", "objeto fora do lugar"],
3526
+ },
3527
+ {
3528
+ id: "voz_distinta_por_personagem",
3529
+ nome: "Voz Distinta Por Personagem",
3530
+ aplica: "personagens recorrentes precisam ter forma propria de pensar, decidir e falar",
3531
+ evitar: ["todos falando como o narrador", "mesmo humor", "mesma reacao ao medo"],
3532
+ preferir: ["vocabulario proprio", "ritmo de fala", "tipo de silencio", "forma unica de mentir"],
3533
+ },
3534
+ {
3535
+ id: "anti_cliche_adaptativa",
3536
+ nome: "Anti-Clichê Adaptativa",
3537
+ aplica: "estrutura reconhecivel demais deve ser substituida por alternativa especifica",
3538
+ evitar: ["nao era sobre X, era sobre Y", "a esperanca renasceu", "o destino cobraria seu preco"],
3539
+ preferir: ["acao concreta", "consequencia", "gesto observavel", "pista plantada"],
3540
+ },
3541
+ ];
3542
+ function resumirRegrasAuthorAutomaticas() {
3543
+ return REGRAS_AUTHOR_AUTOMATICAS_CLI.map((regra) => `${regra.nome}: ${regra.aplica}`);
3544
+ }
3545
+ function criarContratoAuthorExemplo(sensivel) {
3546
+ if (sensivel) {
3547
+ return `module author.starter.sensivel {
3548
+ work obra_sensivel {
3549
+ titulo: "Guia responsavel"
3550
+ proposito: "explicar um tema sensivel sem prometer verdade clinica"
3551
+ tipo: nao_ficcao
3552
+ tema: autismo
3553
+ sensivel: verdadeiro
3554
+ }
3555
+
3556
+ audience publico_principal {
3557
+ publico: familias_educadores_pessoas_autistas
3558
+ limites: "nao substitui avaliacao clinica ou orientacao profissional"
3559
+ }
3560
+
3561
+ claim autismo_e_espectro {
3562
+ texto: "autismo e um espectro com manifestacoes variadas"
3563
+ source: fonte_principal
3564
+ confidence: alta
3565
+ }
3566
+
3567
+ source fonte_principal {
3568
+ tipo: revisao_bibliografica
3569
+ confianca: alta
3570
+ }
3571
+
3572
+ style_rule linguagem_respeitosa {
3573
+ require {
3574
+ mostrar_por_evidencia
3575
+ causa_e_consequencia
3576
+ exposicao_com_atrito
3577
+ final_de_capitulo_sem_slogan
3578
+ anti_cliche_adaptativa
3579
+ }
3580
+ proibido {
3581
+ frase: "superar o autismo"
3582
+ generalizacao: "todo autista"
3583
+ promessa: "diagnostico garantido"
3584
+ slogan: "a esperanca renasceu"
3585
+ }
3586
+ evitar {
3587
+ tom: infantilizacao
3588
+ abordagem: sensacionalismo
3589
+ estrutura: "nao era sobre X, era sobre Y"
3590
+ }
3591
+ preferir {
3592
+ evidencia: gesto_observavel
3593
+ consequencia: custo_visivel
3594
+ linguagem: detalhe_especifico
3595
+ }
3596
+ tolerancia {
3597
+ max_repeticao_palavra_por_trecho: 2
3598
+ cena_funcoes_minimas: 2
3599
+ }
3600
+ }
3601
+
3602
+ agent checador_fontes {
3603
+ role: revisor_fontes
3604
+ goal: bloquear_afirmacao_sensivel_sem_fonte
3605
+ tools {
3606
+ ler_contrato
3607
+ verificar_fontes
3608
+ analisar_trecho
3609
+ }
3610
+ memory {
3611
+ claim
3612
+ source
3613
+ style_rule
3614
+ }
3615
+ policy {
3616
+ nao_afirmar_sem_fonte
3617
+ sinalizar_incerteza
3618
+ citar_trechos_afetados
3619
+ }
3620
+ }
3621
+
3622
+ flow revisar_secao_sensivel {
3623
+ trecho: Texto
3624
+ etapa fontes usa checador_fontes com trecho = trecho
3625
+ }
3626
+ }
3627
+ `;
3628
+ }
3629
+ return `module author.starter.obra {
3630
+ work obra {
3631
+ titulo: "Projeto autoral"
3632
+ proposito: "governar continuidade, arcos, personagens e tom editorial"
3633
+ tipo: ficcao
3634
+ }
3635
+
3636
+ audience leitores {
3637
+ publico: leitores_ficcao_especulativa
3638
+ promessa: "continuidade consistente e cenas com causa e consequencia"
3639
+ }
3640
+
3641
+ character protagonista {
3642
+ funcao: protagonista
3643
+ arco: queda_e_reconstrucao
3644
+ }
3645
+
3646
+ arc arco_principal {
3647
+ inicio: "desejo claro"
3648
+ virada: "custo moral visivel"
3649
+ fim: "mudanca irreversivel"
3650
+ }
3651
+
3652
+ canon universo {
3653
+ regra: "nada muda no mundo sem custo emocional, logistico ou relacional"
3654
+ }
3655
+
3656
+ style_rule anti_texto_raso {
3657
+ require {
3658
+ mostrar_por_evidencia
3659
+ causa_e_consequencia
3660
+ cena_com_dupla_funcao
3661
+ exposicao_com_atrito
3662
+ dialogo_com_subtexto
3663
+ final_de_capitulo_sem_slogan
3664
+ anti_cliche_adaptativa
3665
+ }
3666
+ proibido {
3667
+ frase: "de alguma forma"
3668
+ cliche: "o tempo parecia parar"
3669
+ estrutura: "nao era sobre X, era sobre Y"
3670
+ slogan: "a esperanca renasceu"
3671
+ moral: "todos finalmente entenderam a verdade"
3672
+ }
3673
+ ecos {
3674
+ palavra: "silencio"
3675
+ }
3676
+ preferir {
3677
+ evidencia: gesto_concreto
3678
+ consequencia: custo_visivel
3679
+ misterio: pista_contradicao_verdade_parcial
3680
+ final: decisao_ou_imagem_concreta
3681
+ }
3682
+ tolerancia {
3683
+ max_repeticao_palavra_por_trecho: 2
3684
+ cena_funcoes_minimas: 2
3685
+ }
3686
+ }
3687
+
3688
+ agent revisor_continuidade {
3689
+ role: editor_author
3690
+ goal: preservar_canon_arcos_e_continuidade
3691
+ tools {
3692
+ ler_contrato
3693
+ analisar_trecho
3694
+ comparar_canon
3695
+ }
3696
+ memory {
3697
+ canon
3698
+ character
3699
+ arc
3700
+ style_rule
3701
+ }
3702
+ policy {
3703
+ nao_reescrever_sem_aprovacao
3704
+ citar_trechos_afetados
3705
+ registrar_decisoes_editoriais
3706
+ }
3707
+ }
3708
+
3709
+ flow revisar_capitulo {
3710
+ trecho: Texto
3711
+ etapa continuidade usa revisor_continuidade com trecho = trecho
3712
+ }
3713
+ }
3714
+ `;
3715
+ }
3716
+ function criarPayloadAuthorCli(modo, sensivel) {
3717
+ return {
3718
+ comando: "author",
3719
+ profile: "Author",
3720
+ modo,
3721
+ sensivel,
3722
+ blocos: [...BLOCOS_AUTHOR_CLI],
3723
+ fluxoEditorial: [...FLUXO_EDITORIAL_AUTHOR_CLI],
3724
+ regrasAutomaticas: REGRAS_AUTHOR_AUTOMATICAS_CLI.map((regra) => ({
3725
+ ...regra,
3726
+ evitar: [...regra.evitar],
3727
+ preferir: [...regra.preferir],
3728
+ })),
3729
+ comandos: [
3730
+ "sema author --help",
3731
+ "sema author exemplo",
3732
+ "sema author exemplo --sensivel --json",
3733
+ "sema validar contratos/<obra>.sema --json",
3734
+ "sema docs-impacto --intencao \"editar capitulo\" --arquivo contratos/<obra>.sema --criar-ausentes --json",
3735
+ "sema contexto-ia contratos/<obra>.sema --saida ./.tmp/contexto-author --json",
3736
+ "sema finalizar-mudanca --intencao \"editar capitulo\" --arquivo contratos/<obra>.sema --doc-lida docs/<doc>.md --json",
3737
+ ],
3738
+ contratoExemplo: criarContratoAuthorExemplo(sensivel),
3739
+ };
3740
+ }
3741
+ function renderizarAjudaAuthor() {
3742
+ return [
3743
+ "Sema Author",
3744
+ "",
3745
+ renderizarSecaoAscii("Uso", [
3746
+ "sema author --help",
3747
+ "sema author exemplo",
3748
+ "sema author exemplo --sensivel",
3749
+ "sema author exemplo --sensivel --json",
3750
+ ]),
3751
+ "",
3752
+ renderizarSecaoAscii("Serve para", [
3753
+ "obra, livro, capitulo, cena, personagem, arco, canon, tese, claim, fonte e continuidade",
3754
+ "ficcao, nao ficcao, livro tecnico, ensaio, biografia, pesquisa aplicada, manual e curso em livro",
3755
+ "evitar cliche, eco, muleta, generalizacao, infantilizacao e reescrita sem politica",
3756
+ ]),
3757
+ "",
3758
+ renderizarSecaoAscii("Fluxo recomendado", [...FLUXO_EDITORIAL_AUTHOR_CLI]),
3759
+ "",
3760
+ renderizarSecaoAscii("Regras automaticas", resumirRegrasAuthorAutomaticas()),
3761
+ "",
3762
+ renderizarSecaoAscii("Blocos principais", [...BLOCOS_AUTHOR_CLI]),
3763
+ "",
3764
+ renderizarSecaoAscii("Comandos que encaixam", [
3765
+ "sema docs-impacto --intencao \"editar capitulo\" --arquivo contratos/<obra>.sema --criar-ausentes --json",
3766
+ "sema contexto-ia contratos/<obra>.sema --saida ./.tmp/contexto-author --json",
3767
+ "sema finalizar-mudanca --intencao \"editar capitulo\" --arquivo contratos/<obra>.sema --doc-lida docs/<doc>.md --json",
3768
+ ]),
3769
+ ].join("\n");
3770
+ }
3771
+ async function comandoAuthor(posicionais, args, emJson) {
3772
+ const subcomando = posicionais[0];
3773
+ const sensivel = possuiFlag(args, "--sensivel") || possuiFlag(args, "--sensitive");
3774
+ const modo = subcomando === "exemplo" || subcomando === "template" || subcomando === "starter"
3775
+ ? "exemplo"
3776
+ : "ajuda";
3777
+ const payload = criarPayloadAuthorCli(modo, sensivel);
3778
+ if (emJson) {
3779
+ console.log(JSON.stringify(payload, null, 2));
3780
+ return 0;
3781
+ }
3782
+ if (modo === "exemplo") {
3783
+ console.log(payload.contratoExemplo);
3784
+ return 0;
3785
+ }
3786
+ console.log(renderizarAjudaAuthor());
3787
+ return 0;
3788
+ }
3379
3789
  async function comandoValidar(entrada) {
3380
3790
  const modulos = await carregarModulos(entrada);
3381
3791
  const diagnosticos = modulos.flatMap((item) => item.resultado.diagnosticos);
@@ -3909,6 +4319,7 @@ async function comandoAjudaIa() {
3909
4319
  "Use `sema prompt-curto <arquivo> --curto --para mudanca` para colar contexto em modelo gratuito.",
3910
4320
  "Use `sema prompt-ia`, `sema prompt-ia-ui`, `sema prompt-ia-react` e `sema prompt-ia-sema-primeiro` conforme a tarefa.",
3911
4321
  "Use `sema exemplos-prompt-ia` para pegar modelos prontos de prompt.",
4322
+ "Use `sema author` para obra, capitulos, cenas, personagens, continuidade, fontes, estilo, agents e flow editorial.",
3912
4323
  "Use `sema inspecionar` para descobrir base, codigo vivo e fontes legado.",
3913
4324
  "Use `sema drift` para medir impls, vinculos, rotas, score e lacunas.",
3914
4325
  "Use `sema docs-impacto --intencao <acao>` para ler ou criar docs obrigatorias antes de agir.",
@@ -4427,6 +4838,9 @@ async function principal() {
4427
4838
  case "finalizar-mudanca":
4428
4839
  codigoSaida = await comandoFinalizarMudanca(posicionais, resto, possuiFlag(resto, "--json"));
4429
4840
  break;
4841
+ case "author":
4842
+ codigoSaida = await comandoAuthor(posicionais, resto, possuiFlag(resto, "--json"));
4843
+ break;
4430
4844
  case "resumo":
4431
4845
  codigoSaida = await comandoResumo(posicionais[0], resto, possuiFlag(resto, "--json"));
4432
4846
  break;