@semacode/cli 2.3.0 → 2.3.1

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/LICENSE +39 -39
  2. package/README.md +251 -228
  3. package/dist/agentEntryPoints.js +551 -550
  4. package/dist/angular-consumer-standalone.d.ts +3 -1
  5. package/dist/angular-consumer-standalone.js +12 -8
  6. package/dist/drift.part01.d.ts +32 -2
  7. package/dist/drift.part01.js +2 -0
  8. package/dist/drift.part04.d.ts +3 -2
  9. package/dist/drift.part04.js +6 -3
  10. package/dist/drift.part05.d.ts +2 -1
  11. package/dist/drift.part05.js +4 -3
  12. package/dist/drift.part06.d.ts +2 -1
  13. package/dist/drift.part06.js +9 -5
  14. package/dist/drift.part07.d.ts +11 -10
  15. package/dist/drift.part07.js +40 -30
  16. package/dist/drift.part08.d.ts +2 -1
  17. package/dist/drift.part08.js +4 -3
  18. package/dist/drift.part11.js +71 -6
  19. package/dist/drift.part12.js +14 -1
  20. package/dist/drift.part13.d.ts +42 -7
  21. package/dist/drift.part13.js +660 -36
  22. package/dist/driftCache.d.ts +49 -0
  23. package/dist/driftCache.js +311 -0
  24. package/dist/driftCacheIncremental.d.ts +98 -0
  25. package/dist/driftCacheIncremental.js +596 -0
  26. package/dist/driftCatalogo.d.ts +91 -0
  27. package/dist/driftCatalogo.js +657 -0
  28. package/dist/driftCatalogoPersistente.d.ts +8 -0
  29. package/dist/driftCatalogoPersistente.js +77 -0
  30. package/dist/driftEscopo.d.ts +23 -0
  31. package/dist/driftEscopo.js +563 -0
  32. package/dist/driftEscopoReferencias.d.ts +4 -0
  33. package/dist/driftEscopoReferencias.js +265 -0
  34. package/dist/driftOrcamento.d.ts +12 -0
  35. package/dist/driftOrcamento.js +19 -3
  36. package/dist/execucoesExternas.js +5 -19
  37. package/dist/iaPrompts.js +310 -310
  38. package/dist/index.part01.d.ts +16 -1
  39. package/dist/index.part01.js +80 -4
  40. package/dist/index.part02.js +21 -21
  41. package/dist/index.part03.d.ts +2 -2
  42. package/dist/index.part03.js +14 -3
  43. package/dist/index.part04.d.ts +2 -2
  44. package/dist/index.part04.js +113 -101
  45. package/dist/index.part05.d.ts +1 -1
  46. package/dist/index.part05.js +99 -22
  47. package/dist/index.part06.js +3 -2
  48. package/dist/index.part07.js +24 -24
  49. package/dist/index.part08.js +1 -1
  50. package/dist/init/templates.part01.js +393 -393
  51. package/dist/init/templates.part02.js +189 -189
  52. package/dist/initTemplatesBackend.js +73 -73
  53. package/dist/initTemplatesBase.js +81 -81
  54. package/dist/initTemplatesFlutter.js +137 -137
  55. package/dist/initTemplatesRuntime.js +350 -350
  56. package/dist/initTemplatesWeb.js +309 -309
  57. package/dist/pipelineConteudo/command.js +1 -36
  58. package/dist/projeto.d.ts +1 -1
  59. package/dist/projetoCarregar.d.ts +2 -2
  60. package/dist/projetoCarregar.js +47 -24
  61. package/dist/projetoCatalogo.d.ts +7 -0
  62. package/dist/projetoCatalogo.js +125 -0
  63. package/dist/projetoTipos.d.ts +14 -5
  64. package/dist/sync/index.js +35 -35
  65. package/docs/README.md +34 -34
  66. package/docs/ai-integration.md +1 -7
  67. package/docs/ai-onboarding.md +62 -62
  68. package/docs/ai-workflow.md +4 -0
  69. package/docs/auth.md +26 -26
  70. package/docs/cli.md +79 -79
  71. package/docs/commands.md +16 -13
  72. package/docs/database.md +15 -15
  73. package/docs/deploy.md +41 -41
  74. package/docs/descoberta-capacidades.md +106 -106
  75. package/docs/documentation.md +37 -46
  76. package/docs/env.md +16 -16
  77. package/docs/frontend.md +41 -41
  78. package/docs/getting-started.md +57 -57
  79. package/docs/i18n.md +15 -15
  80. package/docs/pipeline-conteudo.md +246 -246
  81. package/docs/profiles.md +54 -54
  82. package/docs/repositories.md +43 -43
  83. package/docs/rollback.md +31 -31
  84. package/docs/security.md +32 -32
  85. package/docs/sistemas-interativos.md +373 -378
  86. package/docs/support.md +8 -8
  87. package/docs/testing.md +51 -44
  88. package/docs/vocabulary.md +29 -29
  89. package/exemplos/agendamento.sema +1 -1
  90. package/exemplos/assinatura.sema +1 -1
  91. package/exemplos/auditoria.sema +1 -1
  92. package/exemplos/autenticacao.sema +1 -1
  93. package/exemplos/author_obra_comum.sema +1 -1
  94. package/exemplos/author_tema_sensivel.sema +1 -1
  95. package/exemplos/automacao.sema +1 -1
  96. package/exemplos/cadastro_usuario.sema +1 -1
  97. package/exemplos/calculadora.sema +1 -1
  98. package/exemplos/crud_simples.sema +1 -1
  99. package/exemplos/estoque.sema +1 -1
  100. package/exemplos/exportacao.sema +1 -1
  101. package/exemplos/fila.sema +1 -1
  102. package/exemplos/integracao_externa.sema +1 -1
  103. package/exemplos/multi_tenant.sema +1 -1
  104. package/exemplos/notificacao.sema +1 -1
  105. package/exemplos/operacao_estrategia.sema +132 -132
  106. package/exemplos/operacao_estrategia_discovery.sema +220 -220
  107. package/exemplos/operacao_estrategia_fluxo.sema +114 -114
  108. package/exemplos/operacao_estrategia_gates.sema +106 -106
  109. package/exemplos/operacao_estrategia_quarentena.sema +133 -133
  110. package/exemplos/operacao_estrategia_rollout.sema +124 -124
  111. package/exemplos/pagamento.sema +1 -1
  112. package/exemplos/pagamento_dominio.sema +1 -1
  113. package/exemplos/pedido.sema +1 -1
  114. package/exemplos/permissao.sema +1 -1
  115. package/exemplos/persistencia_vendor_first.sema +1 -1
  116. package/exemplos/pipeline-conteudo/README.md +44 -44
  117. package/exemplos/pipeline-conteudo/alvos.json +23 -23
  118. package/exemplos/pipeline-conteudo/definicao.json +136 -136
  119. package/exemplos/profile_conversas.sema +165 -165
  120. package/exemplos/profile_game.sema +1 -1
  121. package/exemplos/profile_legal.sema +1 -1
  122. package/exemplos/profile_ops.sema +1 -1
  123. package/exemplos/profile_research.sema +1 -1
  124. package/exemplos/profile_simulation.sema +211 -211
  125. package/exemplos/profile_software.sema +1 -1
  126. package/exemplos/profile_workflow_n8n.sema +1 -1
  127. package/exemplos/relatorio.sema +1 -1
  128. package/exemplos/replica_analitica_erp.sema +1 -1
  129. package/exemplos/sistemas-interativos/README.md +100 -100
  130. package/exemplos/sistemas-interativos/advanced/acceptance-context-evaluate-valid.json +5 -5
  131. package/exemplos/sistemas-interativos/advanced/acceptance-lock-valid.json +16 -16
  132. package/exemplos/sistemas-interativos/advanced/asset-provenance-valid.json +32 -32
  133. package/exemplos/sistemas-interativos/advanced/autonomy-repair-valid.json +93 -93
  134. package/exemplos/sistemas-interativos/advanced/control-run-definition-valid.json +78 -78
  135. package/exemplos/sistemas-interativos/advanced/control-run-valid.json +27 -27
  136. package/exemplos/sistemas-interativos/advanced/distributed-workers-valid.json +79 -79
  137. package/exemplos/sistemas-interativos/advanced/editor-state-valid.json +42 -42
  138. package/exemplos/sistemas-interativos/advanced/engine-snapshot-after-valid.json +32 -32
  139. package/exemplos/sistemas-interativos/advanced/engine-snapshot-before-valid.json +23 -23
  140. package/exemplos/sistemas-interativos/advanced/job-orchestration-valid.json +39 -39
  141. package/exemplos/sistemas-interativos/advanced/multimodal-evidence-valid.json +46 -46
  142. package/exemplos/sistemas-interativos/advanced/multiplayer-authority-valid.json +39 -39
  143. package/exemplos/sistemas-interativos/advanced/playtest-fuzz-valid.json +37 -37
  144. package/exemplos/sistemas-interativos/advanced/portability-valid.json +104 -104
  145. package/exemplos/sistemas-interativos/advanced/temporal-evidence-valid.json +27 -27
  146. package/exemplos/sistemas-interativos/advanced/temporal-valid.json +118 -118
  147. package/exemplos/sistemas-interativos/experience-ir-valid.json +459 -459
  148. package/exemplos/sistemas-interativos/game-2d.json +83 -83
  149. package/exemplos/sistemas-interativos/game-3d-human.json +81 -81
  150. package/exemplos/sistemas-interativos/game-pixel-16-bit.json +97 -97
  151. package/exemplos/sistemas-interativos/game-pixel-8-bit.json +94 -94
  152. package/exemplos/sistemas-interativos/game-xr-human.json +80 -80
  153. package/exemplos/sistemas-interativos/hybrid-2-5d.json +108 -108
  154. package/exemplos/sistemas-interativos/protocol-mutating-rollback-valid.json +75 -75
  155. package/exemplos/sistemas-interativos/protocol-read-only-valid.json +58 -58
  156. package/exemplos/sistemas-interativos/simulation-2d-controlled.json +97 -97
  157. package/exemplos/sistemas-interativos/simulation-3d-calibrated-autonomous.json +141 -141
  158. package/exemplos/sistemas-interativos/simulation-headless-autonomous-batch.json +112 -112
  159. package/exemplos/sistemas-interativos/simulation-pixel-16-bit.json +103 -103
  160. package/exemplos/sistemas-interativos/simulation-text-controlled.json +95 -95
  161. package/exemplos/testes_embutidos.sema +1 -1
  162. package/exemplos/tratamento_erro.sema +1 -1
  163. package/exemplos/upload_arquivo.sema +1 -1
  164. package/exemplos/webhook.sema +1 -1
  165. package/node_modules/@sema/gerador-cpp/dist/index.js +176 -176
  166. package/node_modules/@sema/gerador-cpp/package.json +1 -1
  167. package/node_modules/@sema/gerador-css/dist/index.part01.js +10 -10
  168. package/node_modules/@sema/gerador-css/dist/index.part02.js +460 -460
  169. package/node_modules/@sema/gerador-dotnet/dist/index.js +169 -169
  170. package/node_modules/@sema/gerador-dotnet/package.json +1 -1
  171. package/node_modules/@sema/gerador-html/dist/index.js +17 -17
  172. package/node_modules/@sema/gerador-lua/dist/index.js +51 -51
  173. package/node_modules/@sema/gerador-php/dist/index.js +113 -113
  174. package/node_modules/@sema/gerador-python/dist/index.part02.js +3 -3
  175. package/node_modules/@sema/gerador-typescript/dist/index.part02.js +11 -11
  176. package/node_modules/@sema/nucleo/dist/diagnosticos/melhorador.js +42 -42
  177. package/package.json +3 -3
@@ -120,43 +120,43 @@ function coletarTiposExternos(modulo) {
120
120
  function gerarClasseDados(nome, campos) {
121
121
  const classe = paraPascalCase(nome);
122
122
  if (campos.length === 0) {
123
- return `final class ${classe}
124
- {
125
- public function __construct()
126
- {
127
- }
128
- }
123
+ return `final class ${classe}
124
+ {
125
+ public function __construct()
126
+ {
127
+ }
128
+ }
129
129
  `;
130
130
  }
131
131
  const parametros = ordenarCamposConstrutor(campos).map((campo) => {
132
132
  const tipo = tipoParametroPhp(campo);
133
133
  const padrao = campo.modificadores.includes("required") ? "" : ` = ${valorPadraoPhp(campo)}`;
134
- return ` /** @var ${tipoDocPhp(campo)} */
134
+ return ` /** @var ${tipoDocPhp(campo)} */
135
135
  public ${tipo} $${campo.nome}${padrao}`;
136
136
  }).join(",\n");
137
- return `final class ${classe}
138
- {
139
- public function __construct(
140
- ${parametros}
141
- ) {
142
- }
143
- }
137
+ return `final class ${classe}
138
+ {
139
+ public function __construct(
140
+ ${parametros}
141
+ ) {
142
+ }
143
+ }
144
144
  `;
145
145
  }
146
146
  function gerarEnum(enumeracao) {
147
147
  const constantes = enumeracao.valores.map((valor) => ` public const ${paraConstantePhp(valor)} = ${literalPhp(valor)};`).join("\n");
148
- return `final class ${paraPascalCase(enumeracao.nome)}
149
- {
150
- ${constantes || " public const VAZIO = \"\";"}
151
- }
148
+ return `final class ${paraPascalCase(enumeracao.nome)}
149
+ {
150
+ ${constantes || " public const VAZIO = \"\";"}
151
+ }
152
152
  `;
153
153
  }
154
154
  function gerarLiteralCamposPhp(campos) {
155
155
  if (campos.length === 0) {
156
156
  return "[]";
157
157
  }
158
- return `[
159
- ${campos.map((campo) => ` ["nome" => ${literalPhp(campo.nome)}, "tipo" => ${literalPhp(campo.tipo)}, "obrigatorio" => ${campo.modificadores.includes("required") ? "true" : "false"}],`).join("\n")}
158
+ return `[
159
+ ${campos.map((campo) => ` ["nome" => ${literalPhp(campo.nome)}, "tipo" => ${literalPhp(campo.tipo)}, "obrigatorio" => ${campo.modificadores.includes("required") ? "true" : "false"}],`).join("\n")}
160
160
  ]`;
161
161
  }
162
162
  function gerarArrayStringsPhp(valores) {
@@ -170,8 +170,8 @@ function gerarMapaErrosPhp(erros) {
170
170
  if (entradas.length === 0) {
171
171
  return "[]";
172
172
  }
173
- return `[
174
- ${entradas.map(([codigo, mensagem]) => ` ${literalPhp(codigo)} => ${literalPhp(mensagem)},`).join("\n")}
173
+ return `[
174
+ ${entradas.map(([codigo, mensagem]) => ` ${literalPhp(codigo)} => ${literalPhp(mensagem)},`).join("\n")}
175
175
  ]`;
176
176
  }
177
177
  function resolverReferenciaPhp(referencia, variavel) {
@@ -248,15 +248,15 @@ function gerarValidacoes(task) {
248
248
  const linhas = [
249
249
  ...task.input
250
250
  .filter((campo) => campo.modificadores.includes("required"))
251
- .map((campo) => ` if ($entrada->${campo.nome} === null) {
252
- throw new \\InvalidArgumentException(${literalPhp(`Campo obrigatorio ausente: ${campo.nome}`)});
251
+ .map((campo) => ` if ($entrada->${campo.nome} === null) {
252
+ throw new \\InvalidArgumentException(${literalPhp(`Campo obrigatorio ausente: ${campo.nome}`)});
253
253
  }`),
254
254
  ...task.regrasEstruturadas.map((regra) => {
255
255
  if (regra.tipo === "predicado") {
256
256
  return ` // Predicado declarado em Sema: ${regra.textoOriginal}`;
257
257
  }
258
- return ` if (!(${resolverExpressaoPhp(regra, camposEntrada, "entrada")})) {
259
- throw new \\InvalidArgumentException(${literalPhp(`Regra violada: ${regra.textoOriginal}`)});
258
+ return ` if (!(${resolverExpressaoPhp(regra, camposEntrada, "entrada")})) {
259
+ throw new \\InvalidArgumentException(${literalPhp(`Regra violada: ${regra.textoOriginal}`)});
260
260
  }`;
261
261
  }),
262
262
  ...task.rules
@@ -276,8 +276,8 @@ function gerarGarantias(task) {
276
276
  if (!garantiaComparacaoExecutavel(garantia, camposSaidaMap)) {
277
277
  return ` // Garantia condicional declarada em Sema: ${garantia.textoOriginal}`;
278
278
  }
279
- return ` if (!(${resolverExpressaoPhp(garantia, camposSaida, "saida")})) {
280
- throw new \\RuntimeException(${literalPhp(`Garantia violada: ${garantia.textoOriginal}`)});
279
+ return ` if (!(${resolverExpressaoPhp(garantia, camposSaida, "saida")})) {
280
+ throw new \\RuntimeException(${literalPhp(`Garantia violada: ${garantia.textoOriginal}`)});
281
281
  }`;
282
282
  }),
283
283
  ...task.guarantees
@@ -300,33 +300,33 @@ function classeErroTask(task, codigo) {
300
300
  return `${paraPascalCase(task.nome)}${paraPascalCase(codigo)}Erro`;
301
301
  }
302
302
  function gerarClassesErro(task) {
303
- return [...coletarErrosTask(task).entries()].map(([codigo, mensagem]) => `final class ${classeErroTask(task, codigo)} extends \\RuntimeException
304
- {
305
- public string $codigo = ${literalPhp(codigo)};
306
-
307
- public function __construct()
308
- {
309
- parent::__construct(${literalPhp(mensagem)});
310
- }
311
- }
303
+ return [...coletarErrosTask(task).entries()].map(([codigo, mensagem]) => `final class ${classeErroTask(task, codigo)} extends \\RuntimeException
304
+ {
305
+ public string $codigo = ${literalPhp(codigo)};
306
+
307
+ public function __construct()
308
+ {
309
+ parent::__construct(${literalPhp(mensagem)});
310
+ }
311
+ }
312
312
  `).join("\n");
313
313
  }
314
314
  function gerarMetadadosTask(task) {
315
315
  const nome = normalizarNomeParaSimbolo(task.nome);
316
316
  const efeitos = task.efeitosEstruturados.map((efeito) => `${efeito.categoria}:${efeito.alvo}${efeito.detalhe ? `:${efeito.detalhe}` : ""}`);
317
317
  const impl = task.implementacoesExternas.map((item) => `${item.origem}:${item.caminho}[${item.statusImpl ?? "nao_verificado"}]`);
318
- return `function contrato_${nome}(): array
319
- {
320
- return [
321
- "nome" => ${literalPhp(task.nome)},
322
- "input" => ${gerarLiteralCamposPhp(task.input)},
323
- "output" => ${gerarLiteralCamposPhp(task.output)},
324
- "effects" => ${gerarArrayStringsPhp(efeitos)},
325
- "impl" => ${gerarArrayStringsPhp(impl)},
326
- "errors" => ${gerarMapaErrosPhp(Object.fromEntries(coletarErrosTask(task)))},
327
- "guarantees" => ${gerarArrayStringsPhp(task.guarantees)},
328
- ];
329
- }
318
+ return `function contrato_${nome}(): array
319
+ {
320
+ return [
321
+ "nome" => ${literalPhp(task.nome)},
322
+ "input" => ${gerarLiteralCamposPhp(task.input)},
323
+ "output" => ${gerarLiteralCamposPhp(task.output)},
324
+ "effects" => ${gerarArrayStringsPhp(efeitos)},
325
+ "impl" => ${gerarArrayStringsPhp(impl)},
326
+ "errors" => ${gerarMapaErrosPhp(Object.fromEntries(coletarErrosTask(task)))},
327
+ "guarantees" => ${gerarArrayStringsPhp(task.guarantees)},
328
+ ];
329
+ }
330
330
  `;
331
331
  }
332
332
  function gerarPreparacaoSaida(task) {
@@ -348,37 +348,37 @@ function gerarPreparacaoSaida(task) {
348
348
  function gerarTask(task) {
349
349
  const nome = normalizarNomeParaSimbolo(task.nome);
350
350
  const erros = [...coletarErrosTask(task).keys()];
351
- const blocosErroContexto = erros.map((codigo) => ` if (($contexto["erro_esperado"] ?? null) === ${literalPhp(codigo)}) {
352
- throw new ${classeErroTask(task, codigo)}();
351
+ const blocosErroContexto = erros.map((codigo) => ` if (($contexto["erro_esperado"] ?? null) === ${literalPhp(codigo)}) {
352
+ throw new ${classeErroTask(task, codigo)}();
353
353
  }`).join("\n");
354
354
  const efeitos = task.efeitosEstruturados.length > 0
355
355
  ? task.efeitosEstruturados.map((efeito) => ` // Efeito estruturado: categoria=${efeito.categoria} alvo=${efeito.alvo}${efeito.detalhe ? ` detalhe=${efeito.detalhe}` : ""}${efeito.criticidade ? ` criticidade=${efeito.criticidade}` : ""}`).join("\n")
356
356
  : task.effects.map((efeito) => ` // Efeito declarado: ${efeito}`).join("\n") || " // Nenhum efeito declarado.";
357
- return `
358
- ${gerarClasseDados(`${task.nome}_entrada`, task.input)}
359
- ${gerarClasseDados(`${task.nome}_saida`, task.output)}
360
- ${gerarClassesErro(task)}
361
- ${gerarMetadadosTask(task)}
362
-
363
- function validar_${nome}(${paraPascalCase(`${task.nome}_entrada`)} $entrada): void
364
- {
365
- ${gerarValidacoes(task)}
366
- }
367
-
368
- function verificar_garantias_${nome}(${paraPascalCase(`${task.nome}_saida`)} $saida): void
369
- {
370
- ${gerarGarantias(task)}
371
- }
372
-
373
- function executar_${nome}(${paraPascalCase(`${task.nome}_entrada`)} $entrada, array $contexto = []): ${paraPascalCase(`${task.nome}_saida`)}
374
- {
375
- ${blocosErroContexto ? `${blocosErroContexto}\n` : ""} validar_${nome}($entrada);
376
- ${task.stateContract ? ` // Vinculo de estado: ${task.stateContract.nomeEstado ?? "nao_definido"}\n // Transicoes declaradas: ${task.stateContract.transicoes.map((transicao) => `${transicao.origem}->${transicao.destino}`).join(", ") || "nenhuma"}\n` : ""}${task.implementacoesExternas.map((impl) => ` // Implementacao externa: origem=${impl.origem} caminho=${impl.caminho} status=${impl.statusImpl ?? "nao_verificado"}`).join("\n")}
377
- ${efeitos}
378
- ${gerarPreparacaoSaida(task)}
379
- verificar_garantias_${nome}($saida);
380
- return $saida;
381
- }
357
+ return `
358
+ ${gerarClasseDados(`${task.nome}_entrada`, task.input)}
359
+ ${gerarClasseDados(`${task.nome}_saida`, task.output)}
360
+ ${gerarClassesErro(task)}
361
+ ${gerarMetadadosTask(task)}
362
+
363
+ function validar_${nome}(${paraPascalCase(`${task.nome}_entrada`)} $entrada): void
364
+ {
365
+ ${gerarValidacoes(task)}
366
+ }
367
+
368
+ function verificar_garantias_${nome}(${paraPascalCase(`${task.nome}_saida`)} $saida): void
369
+ {
370
+ ${gerarGarantias(task)}
371
+ }
372
+
373
+ function executar_${nome}(${paraPascalCase(`${task.nome}_entrada`)} $entrada, array $contexto = []): ${paraPascalCase(`${task.nome}_saida`)}
374
+ {
375
+ ${blocosErroContexto ? `${blocosErroContexto}\n` : ""} validar_${nome}($entrada);
376
+ ${task.stateContract ? ` // Vinculo de estado: ${task.stateContract.nomeEstado ?? "nao_definido"}\n // Transicoes declaradas: ${task.stateContract.transicoes.map((transicao) => `${transicao.origem}->${transicao.destino}`).join(", ") || "nenhuma"}\n` : ""}${task.implementacoesExternas.map((impl) => ` // Implementacao externa: origem=${impl.origem} caminho=${impl.caminho} status=${impl.statusImpl ?? "nao_verificado"}`).join("\n")}
377
+ ${efeitos}
378
+ ${gerarPreparacaoSaida(task)}
379
+ verificar_garantias_${nome}($saida);
380
+ return $saida;
381
+ }
382
382
  `;
383
383
  }
384
384
  function formatarLiteralTestePhp(valor, tipoDeclarado) {
@@ -453,45 +453,45 @@ function gerarTestesPhp(modulo, arquivoModulo) {
453
453
  const entrada = gerarInstanciaEntradaTeste(task, caso.given);
454
454
  const tipoErro = caso.error?.campos.find((campo) => campo.nome === "tipo")?.tipo ?? caso.error?.campos[0]?.tipo;
455
455
  if (tipoErro) {
456
- return `function ${nomeTeste}(): void
457
- {
458
- try {
459
- executar_${normalizarNomeParaSimbolo(task.nome)}(${entrada}, ["erro_esperado" => ${literalPhp(tipoErro)}]);
460
- } catch (${classeErroTask(task, tipoErro)} $erro) {
461
- assert_sema($erro->codigo === ${literalPhp(tipoErro)}, "codigo de erro inesperado");
462
- return;
463
- }
464
- throw new \\RuntimeException(${literalPhp(`Caso ${caso.nome} deveria falhar com ${tipoErro}`)});
456
+ return `function ${nomeTeste}(): void
457
+ {
458
+ try {
459
+ executar_${normalizarNomeParaSimbolo(task.nome)}(${entrada}, ["erro_esperado" => ${literalPhp(tipoErro)}]);
460
+ } catch (${classeErroTask(task, tipoErro)} $erro) {
461
+ assert_sema($erro->codigo === ${literalPhp(tipoErro)}, "codigo de erro inesperado");
462
+ return;
463
+ }
464
+ throw new \\RuntimeException(${literalPhp(`Caso ${caso.nome} deveria falhar com ${tipoErro}`)});
465
465
  }`;
466
466
  }
467
- return `function ${nomeTeste}(): void
468
- {
469
- $resultado = executar_${normalizarNomeParaSimbolo(task.nome)}(${entrada});
470
- assert_sema($resultado !== null, ${literalPhp(`Caso ${caso.nome} nao retornou resultado`)});
467
+ return `function ${nomeTeste}(): void
468
+ {
469
+ $resultado = executar_${normalizarNomeParaSimbolo(task.nome)}(${entrada});
470
+ assert_sema($resultado !== null, ${literalPhp(`Caso ${caso.nome} nao retornou resultado`)});
471
471
  }`;
472
472
  });
473
473
  const lista = testes.map(({ task, caso, indice }) => ` [${literalPhp(caso.nome)}, "test_${normalizarNomeParaSimbolo(task.nome)}_${indice + 1}"],`).join("\n");
474
- return `${gerarCabecalhoSemaPhp(modulo, "teste")}require_once __DIR__ . "/${path.posix.basename(arquivoModulo)}";
475
-
476
- function assert_sema(bool $condicao, string $mensagem): void
477
- {
478
- if (!$condicao) {
479
- throw new \\RuntimeException($mensagem);
480
- }
481
- }
482
-
483
- ${funcoes.join("\n\n")}
484
-
485
- $testes = [
486
- ${lista}
487
- ];
488
-
489
- foreach ($testes as [$nome, $funcao]) {
490
- fwrite(STDOUT, "test " . $nome . PHP_EOL);
491
- $funcao();
492
- }
493
-
494
- fwrite(STDOUT, "ok " . count($testes) . " testes" . PHP_EOL);
474
+ return `${gerarCabecalhoSemaPhp(modulo, "teste")}require_once __DIR__ . "/${path.posix.basename(arquivoModulo)}";
475
+
476
+ function assert_sema(bool $condicao, string $mensagem): void
477
+ {
478
+ if (!$condicao) {
479
+ throw new \\RuntimeException($mensagem);
480
+ }
481
+ }
482
+
483
+ ${funcoes.join("\n\n")}
484
+
485
+ $testes = [
486
+ ${lista}
487
+ ];
488
+
489
+ foreach ($testes as [$nome, $funcao]) {
490
+ fwrite(STDOUT, "test " . $nome . PHP_EOL);
491
+ $funcao();
492
+ }
493
+
494
+ fwrite(STDOUT, "ok " . count($testes) . " testes" . PHP_EOL);
495
495
  `;
496
496
  }
497
497
  function gerarCabecalhoSemaPhp(modulo, tipo = "contrato") {
@@ -516,9 +516,9 @@ export function gerarPhp(modulo) {
516
516
  const nomeBase = normalizarNomeModulo(modulo.nome).replace(/\./g, "_");
517
517
  const estrutura = descreverEstruturaModulo(modulo.nome);
518
518
  const interops = modulo.interoperabilidades.map((interop) => `// Interop externo ${interop.origem}: ${interop.caminho}`).join("\n");
519
- const tiposExternos = coletarTiposExternos(modulo).map((tipo) => `final class ${paraPascalCase(tipo)}
520
- {
521
- }
519
+ const tiposExternos = coletarTiposExternos(modulo).map((tipo) => `final class ${paraPascalCase(tipo)}
520
+ {
521
+ }
522
522
  `).join("\n");
523
523
  const tipos = modulo.types.map((tipo) => gerarClasseDados(tipo.nome, tipo.definicao.campos)).join("\n");
524
524
  const entidades = modulo.entities.map((entity) => gerarClasseDados(entity.nome, entity.campos)).join("\n");
@@ -333,9 +333,9 @@ def ${normalizarNomeParaSimbolo(route.nome)}(entrada: ${schemaEntrada}):
333
333
  return `${gerarCabecalhoSemaPython(modulo, "router")}${imports.join("\n")}${rotas}\n`;
334
334
  }
335
335
  export function gerarFastApiTests(modulo, caminhoRouter) {
336
- return `${gerarCabecalhoSemaPython(modulo, "teste")}from fastapi.testclient import TestClient
337
- from ${caminhoRouter} import router
338
- from fastapi import FastAPI
336
+ return `${gerarCabecalhoSemaPython(modulo, "teste")}from fastapi.testclient import TestClient
337
+ from ${caminhoRouter} import router
338
+ from fastapi import FastAPI
339
339
 
340
340
  app = FastAPI()
341
341
  app.include_router(router)
@@ -321,10 +321,10 @@ ${task.implementacoesExternas.length > 0 ? task.implementacoesExternas.map((impl
321
321
  .map((route) => ` async ${normalizarNomeParaSimbolo(route.nome)}(entrada: ${route.nome}EntradaPublica): Promise<${route.nome}RespostaPublica> {
322
322
  return adaptar_${normalizarNomeParaSimbolo(route.nome)}(entrada);
323
323
  }`).join("\n\n");
324
- return `${gerarCabecalhoSemaTypeScript(modulo, "service")}${imports.join("\n")}
325
-
326
- @Injectable()
327
- export class ${nomeClasse} {
324
+ return `${gerarCabecalhoSemaTypeScript(modulo, "service")}${imports.join("\n")}
325
+
326
+ @Injectable()
327
+ export class ${nomeClasse} {
328
328
  ${metodosTask}${metodosTask && metodosRota ? "\n\n" : ""}${metodosRota}
329
329
  }
330
330
  `;
@@ -373,10 +373,10 @@ export function gerarNestJsController(modulo, caminhoDto, caminhoService) {
373
373
  const contratosImportados = [...new Set(modulo.routes
374
374
  .filter((route) => route.task)
375
375
  .map((route) => `type ${route.nome}RespostaPublica`))];
376
- return `${gerarCabecalhoSemaTypeScript(modulo, "controller")}import { ${[...decoratorsImport].join(", ")} } from "@nestjs/common";
377
- import { ${nomeService} } from "${caminhoService}";
378
- ${dtosImportados.length > 0 ? `import { ${dtosImportados.join(", ")} } from "${caminhoDto}";` : ""}
379
- ${contratosImportados.length > 0 ? `import { ${contratosImportados.join(", ")} } from "./${descreverEstruturaModulo(modulo.nome).nomeArquivo}.contract";` : ""}
376
+ return `${gerarCabecalhoSemaTypeScript(modulo, "controller")}import { ${[...decoratorsImport].join(", ")} } from "@nestjs/common";
377
+ import { ${nomeService} } from "${caminhoService}";
378
+ ${dtosImportados.length > 0 ? `import { ${dtosImportados.join(", ")} } from "${caminhoDto}";` : ""}
379
+ ${contratosImportados.length > 0 ? `import { ${contratosImportados.join(", ")} } from "./${descreverEstruturaModulo(modulo.nome).nomeArquivo}.contract";` : ""}
380
380
 
381
381
  @Controller()
382
382
  export class ${nomeClasse} {
@@ -390,9 +390,9 @@ export function gerarNestJsSpec(modulo, caminhoService, caminhoController) {
390
390
  const nomeArquivo = descreverEstruturaModulo(modulo.nome).nomeArquivo;
391
391
  const nomeService = `${paraPascalCase(nomeArquivo)}Service`;
392
392
  const nomeController = `${paraPascalCase(nomeArquivo)}Controller`;
393
- return `${gerarCabecalhoSemaTypeScript(modulo, "spec")}import { describe, it } from "@jest/globals";
394
- import { ${nomeService} } from "${caminhoService}";
395
- import { ${nomeController} } from "${caminhoController}";
393
+ return `${gerarCabecalhoSemaTypeScript(modulo, "spec")}import { describe, it } from "@jest/globals";
394
+ import { ${nomeService} } from "${caminhoService}";
395
+ import { ${nomeController} } from "${caminhoController}";
396
396
 
397
397
  describe("${nomeController}", () => {
398
398
  it("mantem o scaffold inicial em pe", () => {
@@ -3,43 +3,43 @@
3
3
  // Melhoria de mensagens de erro SEM0xx
4
4
  // Contrato: cli_melhoria_erros.sema
5
5
  const SNIPPETS_CORRECAO = {
6
- SEM094: (nome) => ` auth {
7
- modo: obrigatorio // ou: anonimo, opcional
6
+ SEM094: (nome) => ` auth {
7
+ modo: obrigatorio // ou: anonimo, opcional
8
8
  }`,
9
- SEM095: (nome) => ` authz {
10
- escopo: ${nome.toLowerCase().replace(/_/g, '.')}.executar
11
- papeis: [admin, editor] // ajuste conforme necessario
9
+ SEM095: (nome) => ` authz {
10
+ escopo: ${nome.toLowerCase().replace(/_/g, '.')}.executar
11
+ papeis: [admin, editor] // ajuste conforme necessario
12
12
  }`,
13
- SEM096: (nome) => ` dados {
14
- classificacao_padrao: interno // ou: publico, pii, financeiro, segredo
15
- input {
16
- campo1: interno
17
- campo2: publico
18
- }
19
- output {
20
- resultado: publico
21
- }
13
+ SEM096: (nome) => ` dados {
14
+ classificacao_padrao: interno // ou: publico, pii, financeiro, segredo
15
+ input {
16
+ campo1: interno
17
+ campo2: publico
18
+ }
19
+ output {
20
+ resultado: publico
21
+ }
22
22
  }`,
23
- SEM097: (nome) => ` audit {
24
- evento: ${nome.toLowerCase().replace(/_/g, '.')}.executado
25
- ator: auth.usuario
26
- correlacao: request_id
27
- retencao: "90d"
28
- motivo: obrigatorio
23
+ SEM097: (nome) => ` audit {
24
+ evento: ${nome.toLowerCase().replace(/_/g, '.')}.executado
25
+ ator: auth.usuario
26
+ correlacao: request_id
27
+ retencao: "90d"
28
+ motivo: obrigatorio
29
29
  }`,
30
- SEM071: (nome) => ` execucao {
31
- idempotencia: verdadeiro // ou: falso
32
- timeout: "30s" // ajuste conforme necessidade
33
- retry: "ate 3 tentativas com backoff"
34
- compensacao: "descricao do rollback"
35
- criticidade_operacional: alta // ou: media, baixa
30
+ SEM071: (nome) => ` execucao {
31
+ idempotencia: verdadeiro // ou: falso
32
+ timeout: "30s" // ajuste conforme necessidade
33
+ retry: "ate 3 tentativas com backoff"
34
+ compensacao: "descricao do rollback"
35
+ criticidade_operacional: alta // ou: media, baixa
36
36
  }`,
37
- SEM072: (nome) => ` impl {
38
- ts: pacote.src.modulo.${nome} // ajuste o caminho
39
- }
40
- vinculos {
41
- arquivo: "src/modulo/arquivo.ts"
42
- simbolo: pacote.src.modulo.${nome}
37
+ SEM072: (nome) => ` impl {
38
+ ts: pacote.src.modulo.${nome} // ajuste o caminho
39
+ }
40
+ vinculos {
41
+ arquivo: "src/modulo/arquivo.ts"
42
+ simbolo: pacote.src.modulo.${nome}
43
43
  }`
44
44
  };
45
45
  const EXPLICACOES = {
@@ -84,16 +84,16 @@ export function melhorarMensagemErro(erroOriginal, nomeElemento, tipoElemento) {
84
84
  };
85
85
  }
86
86
  export function formatarErroMelhorado(erro, mensagemMelhorada) {
87
- return `
88
- ❌ ${erro.codigo}: ${mensagemMelhorada.mensagemMelhorada}
89
-
90
- 📝 Snippet de correcao:
91
- ${mensagemMelhorada.snippetCorrecao}
92
-
93
- 💡 ${mensagemMelhorada.explicacao}
94
-
95
- 📖 Documentacao: ${mensagemMelhorada.documentacaoLink}
96
- 📍 ${erro.localizacao?.arquivo ?? erro.arquivo}:${erro.localizacao?.linha ?? erro.linha}:${erro.localizacao?.coluna ?? erro.coluna}
87
+ return `
88
+ ❌ ${erro.codigo}: ${mensagemMelhorada.mensagemMelhorada}
89
+
90
+ 📝 Snippet de correcao:
91
+ ${mensagemMelhorada.snippetCorrecao}
92
+
93
+ 💡 ${mensagemMelhorada.explicacao}
94
+
95
+ 📖 Documentacao: ${mensagemMelhorada.documentacaoLink}
96
+ 📍 ${erro.localizacao?.arquivo ?? erro.arquivo}:${erro.localizacao?.linha ?? erro.linha}:${erro.localizacao?.coluna ?? erro.coluna}
97
97
  `;
98
98
  }
99
99
  //# sourceMappingURL=melhorador.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@semacode/cli",
3
- "version": "2.3.0",
3
+ "version": "2.3.1",
4
4
  "description": "Codex-native local semantic governance CLI for contracts, drift, impact, documentation gates, and code generation.",
5
5
  "type": "module",
6
6
  "icon": "logo.png",
@@ -63,8 +63,8 @@
63
63
  "@sema/gerador-html": "1.5.53",
64
64
  "@sema/gerador-css": "1.5.53",
65
65
  "@sema/gerador-php": "1.5.55",
66
- "@sema/gerador-dotnet": "2.1.0",
67
- "@sema/gerador-cpp": "2.1.0",
66
+ "@sema/gerador-dotnet": "2.3.1",
67
+ "@sema/gerador-cpp": "2.3.1",
68
68
  "@sema/padroes": "1.5.53",
69
69
  "typescript": "^5.8.3"
70
70
  },