@semacode/cli 2.3.1 → 3.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +265 -217
- package/dist/agentContextPack.js +14 -10
- package/dist/agentEntryPoints.d.ts +5 -0
- package/dist/agentEntryPoints.js +592 -568
- package/dist/angular-consumer-standalone.js +1 -1
- package/dist/bin.d.ts +6 -0
- package/dist/bin.js +130 -0
- package/dist/cliArgs.js +4 -4
- package/dist/cliControlError.d.ts +12 -0
- package/dist/cliControlError.js +47 -0
- package/dist/cliGrammar.d.ts +11 -0
- package/dist/cliGrammar.js +551 -0
- package/dist/cliHelp.d.ts +13 -0
- package/dist/cliHelp.js +19 -0
- package/dist/cliHelpTexto.d.ts +3 -0
- package/dist/cliHelpTexto.js +168 -0
- package/dist/cliRuntime.d.ts +2 -0
- package/dist/cliRuntime.js +31 -0
- package/dist/comandos.js +9 -22
- package/dist/contexto.js +5 -5
- package/dist/dev/index.d.ts +1 -0
- package/dist/dev/index.js +51 -9
- package/dist/discovery/catalog.js +3 -3
- package/dist/distribuicao/filesystemGlobal.d.ts +63 -0
- package/dist/distribuicao/filesystemGlobal.js +701 -0
- package/dist/distribuicao/index.d.ts +7 -0
- package/dist/distribuicao/index.js +227 -0
- package/dist/distribuicao/launcherGlobal.d.ts +53 -0
- package/dist/distribuicao/launcherGlobal.js +643 -0
- package/dist/distribuicao/launcherWindows.d.ts +28 -0
- package/dist/distribuicao/launcherWindows.js +326 -0
- package/dist/distribuicao/lockContextGlobal.d.ts +10 -0
- package/dist/distribuicao/lockContextGlobal.js +17 -0
- package/dist/distribuicao/lockGlobal.d.ts +6 -0
- package/dist/distribuicao/lockGlobal.js +520 -0
- package/dist/distribuicao/skillGlobal.d.ts +48 -0
- package/dist/distribuicao/skillGlobal.js +652 -0
- package/dist/distribuicao/skillIntentPolicy.d.ts +21 -0
- package/dist/distribuicao/skillIntentPolicy.js +115 -0
- package/dist/distribuicao/tipos.d.ts +50 -0
- package/dist/distribuicao/tipos.js +10 -0
- package/dist/distribuicao/versaoSemantica.d.ts +3 -0
- package/dist/distribuicao/versaoSemantica.js +62 -0
- package/dist/docs.part01.d.ts +4 -1
- package/dist/docs.part01.js +8 -0
- package/dist/docs.part02.js +9 -1
- package/dist/drift.part01.d.ts +33 -25
- package/dist/drift.part01.js +2 -1
- package/dist/drift.part04.d.ts +26 -5
- package/dist/drift.part04.js +123 -19
- package/dist/drift.part05.d.ts +2 -2
- package/dist/drift.part05.js +8 -6
- package/dist/drift.part06.d.ts +2 -2
- package/dist/drift.part06.js +113 -26
- package/dist/drift.part07.d.ts +11 -11
- package/dist/drift.part07.js +261 -265
- package/dist/drift.part08.d.ts +2 -2
- package/dist/drift.part08.js +35 -26
- package/dist/drift.part09.d.ts +2 -2
- package/dist/drift.part09.js +10 -3
- package/dist/drift.part11.js +261 -58
- package/dist/drift.part12.d.ts +1 -1
- package/dist/drift.part12.js +193 -21
- package/dist/drift.part13.d.ts +20 -39
- package/dist/drift.part13.js +601 -647
- package/dist/drift.part14.js +23 -7
- package/dist/driftCacheCas.d.ts +43 -0
- package/dist/driftCacheCas.js +351 -0
- package/dist/driftCacheFilesystem.d.ts +64 -0
- package/dist/driftCacheFilesystem.js +313 -0
- package/dist/driftCacheModes.d.ts +38 -0
- package/dist/driftCacheModes.js +147 -0
- package/dist/driftCacheStore.d.ts +80 -0
- package/dist/driftCacheStore.js +603 -0
- package/dist/driftCatalogo.d.ts +2 -28
- package/dist/driftCatalogo.js +143 -284
- package/dist/driftEscopo.d.ts +1 -3
- package/dist/driftEscopo.js +235 -151
- package/dist/driftEscopoReferencias.d.ts +5 -1
- package/dist/driftEscopoReferencias.js +375 -28
- package/dist/driftOrcamento.d.ts +0 -6
- package/dist/driftOrcamento.js +2 -1
- package/dist/execucoesExternas.js +19 -5
- package/dist/exemplosOficiais.d.ts +2 -1
- package/dist/exemplosOficiais.js +9 -3
- package/dist/geracaoCore.d.ts +1 -0
- package/dist/geracaoCore.js +6 -6
- package/dist/iaPrompts.d.ts +3 -3
- package/dist/iaPrompts.js +312 -313
- package/dist/importador.part01.d.ts +1 -1
- package/dist/importador.part06.d.ts +2 -0
- package/dist/importador.part06.js +87 -1
- package/dist/importador.part09.js +7 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.js +6 -25
- package/dist/index.part01.d.ts +20 -28
- package/dist/index.part01.js +16 -237
- package/dist/index.part02.js +36 -22
- package/dist/index.part03.d.ts +24 -2
- package/dist/index.part03.js +83 -19
- package/dist/index.part04.d.ts +10 -2
- package/dist/index.part04.js +152 -123
- package/dist/index.part05.js +80 -78
- package/dist/index.part06.js +34 -17
- package/dist/index.part07.d.ts +8 -2
- package/dist/index.part07.js +153 -7
- package/dist/index.part08.d.ts +1 -1
- package/dist/index.part08.js +25 -30
- package/dist/initCommand.d.ts +1 -0
- package/dist/initCommand.js +20 -4
- package/dist/initTemplatesBase.js +6 -4
- package/dist/pipelineConteudo/command.d.ts +1 -0
- package/dist/pipelineConteudo/command.js +9 -2
- package/dist/pipelineConteudo/help.d.ts +2 -0
- package/dist/pipelineConteudo/help.js +33 -0
- package/dist/profileAuthorCommand.js +3 -7
- package/dist/profileCommand.js +3 -7
- package/dist/projetoCarregar.js +35 -17
- package/dist/projetoCatalogo.d.ts +1 -0
- package/dist/projetoCatalogo.js +64 -25
- package/dist/projetoConfig.js +2 -0
- package/dist/projetoLegado.js +18 -0
- package/dist/projetoOrigens.d.ts +2 -0
- package/dist/projetoOrigens.js +65 -9
- package/dist/projetoTipos.d.ts +1 -0
- package/dist/resultadoCli.d.ts +20 -0
- package/dist/resultadoCli.js +57 -0
- package/dist/saidaCli.d.ts +35 -0
- package/dist/saidaCli.js +118 -0
- package/dist/sistemasInterativos/acceptanceEvidence.d.ts +22 -0
- package/dist/sistemasInterativos/acceptanceEvidence.js +345 -0
- package/dist/sistemasInterativos/engineObservation.d.ts +12 -0
- package/dist/sistemasInterativos/engineObservation.js +438 -0
- package/dist/sistemasInterativos/jobOrchestration.d.ts +2 -0
- package/dist/sistemasInterativos/jobOrchestration.js +204 -0
- package/dist/sistemasInterativos/operationPrimitives.d.ts +21 -0
- package/dist/sistemasInterativos/operationPrimitives.js +194 -0
- package/dist/sistemasInterativos/operations.d.ts +4 -39
- package/dist/sistemasInterativos/operations.js +5 -1164
- package/dist/skillCommand.d.ts +5 -0
- package/dist/skillCommand.js +88 -0
- package/dist/tipos.d.ts +1 -1
- package/dist/typescript-http-modelos.d.ts +1 -1
- package/dist/typescript-http-rotas.d.ts +1 -0
- package/dist/typescript-http-rotas.js +93 -0
- package/dist/typescript-http.d.ts +1 -1
- package/dist/typescript-http.js +1 -1
- package/dist/verificacaoCache.d.ts +25 -0
- package/dist/verificacaoCache.js +80 -0
- package/docs/README.md +34 -30
- package/docs/ai-integration.md +25 -12
- package/docs/ai-onboarding.md +37 -18
- package/docs/ai-workflow.md +9 -7
- package/docs/cli.md +125 -7
- package/docs/commands.md +41 -20
- package/docs/deploy.md +21 -8
- package/docs/descoberta-capacidades.md +106 -106
- package/docs/documentation.md +49 -39
- package/docs/drift-cache.md +108 -0
- package/docs/getting-started.md +43 -18
- package/docs/pipeline-conteudo.md +246 -246
- package/docs/profiles.md +54 -54
- package/docs/repositories.md +19 -2
- package/docs/rollback.md +15 -8
- package/docs/security.md +25 -3
- package/docs/sistemas-interativos.md +379 -374
- package/docs/syntax.md +14 -0
- package/docs/testing.md +139 -40
- package/exemplos/express_crud.sema +139 -0
- package/exemplos/fastify_crud.sema +146 -0
- package/exemplos/pipeline-conteudo/README.md +44 -44
- package/exemplos/pipeline-conteudo/alvos.json +23 -23
- package/exemplos/pipeline-conteudo/definicao.json +136 -136
- package/exemplos/profile_simulation.sema +211 -211
- package/exemplos/sistemas-interativos/README.md +100 -100
- package/exemplos/sistemas-interativos/advanced/acceptance-context-evaluate-valid.json +5 -5
- package/exemplos/sistemas-interativos/advanced/acceptance-lock-valid.json +16 -16
- package/exemplos/sistemas-interativos/advanced/asset-provenance-valid.json +32 -32
- package/exemplos/sistemas-interativos/advanced/autonomy-repair-valid.json +93 -93
- package/exemplos/sistemas-interativos/advanced/control-run-definition-valid.json +78 -78
- package/exemplos/sistemas-interativos/advanced/control-run-valid.json +27 -27
- package/exemplos/sistemas-interativos/advanced/distributed-workers-valid.json +79 -79
- package/exemplos/sistemas-interativos/advanced/editor-state-valid.json +42 -42
- package/exemplos/sistemas-interativos/advanced/engine-snapshot-after-valid.json +32 -32
- package/exemplos/sistemas-interativos/advanced/engine-snapshot-before-valid.json +23 -23
- package/exemplos/sistemas-interativos/advanced/job-orchestration-valid.json +39 -39
- package/exemplos/sistemas-interativos/advanced/multimodal-evidence-valid.json +46 -46
- package/exemplos/sistemas-interativos/advanced/multiplayer-authority-valid.json +39 -39
- package/exemplos/sistemas-interativos/advanced/playtest-fuzz-valid.json +37 -37
- package/exemplos/sistemas-interativos/advanced/portability-valid.json +104 -104
- package/exemplos/sistemas-interativos/advanced/temporal-evidence-valid.json +27 -27
- package/exemplos/sistemas-interativos/advanced/temporal-valid.json +118 -118
- package/exemplos/sistemas-interativos/experience-ir-valid.json +459 -459
- package/exemplos/sistemas-interativos/game-2d.json +83 -83
- package/exemplos/sistemas-interativos/game-3d-human.json +81 -81
- package/exemplos/sistemas-interativos/game-pixel-16-bit.json +97 -97
- package/exemplos/sistemas-interativos/game-pixel-8-bit.json +94 -94
- package/exemplos/sistemas-interativos/game-xr-human.json +80 -80
- package/exemplos/sistemas-interativos/hybrid-2-5d.json +108 -108
- package/exemplos/sistemas-interativos/protocol-mutating-rollback-valid.json +75 -75
- package/exemplos/sistemas-interativos/protocol-read-only-valid.json +58 -58
- package/exemplos/sistemas-interativos/simulation-2d-controlled.json +97 -97
- package/exemplos/sistemas-interativos/simulation-3d-calibrated-autonomous.json +141 -141
- package/exemplos/sistemas-interativos/simulation-headless-autonomous-batch.json +112 -112
- package/exemplos/sistemas-interativos/simulation-pixel-16-bit.json +103 -103
- package/exemplos/sistemas-interativos/simulation-text-controlled.json +95 -95
- package/node_modules/@sema/gerador-cpp/package.json +1 -1
- package/node_modules/@sema/gerador-dotnet/package.json +1 -1
- package/node_modules/@sema/gerador-lua/dist/index.js +51 -51
- package/node_modules/@sema/gerador-php/dist/index.js +113 -113
- package/node_modules/@sema/nucleo/dist/ir/conversor.part01.js +37 -38
- package/node_modules/@sema/nucleo/dist/ir/modelos.d.ts +1 -0
- package/node_modules/@sema/nucleo/dist/semantico/analisador.d.ts +1 -0
- package/node_modules/@sema/nucleo/dist/semantico/analisador.js +1 -0
- package/node_modules/@sema/nucleo/dist/semantico/analisador.part01.d.ts +7 -0
- package/node_modules/@sema/nucleo/dist/semantico/analisador.part01.js +33 -10
- package/package.json +9 -4
- package/scripts/postinstall.mjs +148 -0
- package/skills/sema/SKILL.md +199 -0
- package/skills/sema/agents/openai.yaml +4 -0
- package/dist/driftCache.d.ts +0 -49
- package/dist/driftCache.js +0 -311
- package/dist/driftCacheIncremental.d.ts +0 -98
- package/dist/driftCacheIncremental.js +0 -596
- package/dist/driftCatalogoPersistente.d.ts +0 -8
- package/dist/driftCatalogoPersistente.js +0 -77
- package/node_modules/@sema/gerador-cpp/dist/index.js.map +0 -1
- package/node_modules/@sema/gerador-css/dist/index.js.map +0 -1
- package/node_modules/@sema/gerador-css/dist/index.part01.js.map +0 -1
- package/node_modules/@sema/gerador-css/dist/index.part02.js.map +0 -1
- package/node_modules/@sema/gerador-dart/dist/index.js.map +0 -1
- package/node_modules/@sema/gerador-dotnet/dist/index.js.map +0 -1
- package/node_modules/@sema/gerador-html/dist/index.js.map +0 -1
- package/node_modules/@sema/gerador-javascript/dist/index.js.map +0 -1
- package/node_modules/@sema/gerador-lua/dist/index.js.map +0 -1
- package/node_modules/@sema/gerador-php/dist/index.js.map +0 -1
- package/node_modules/@sema/gerador-python/dist/index.js.map +0 -1
- package/node_modules/@sema/gerador-python/dist/index.part01.js.map +0 -1
- package/node_modules/@sema/gerador-python/dist/index.part02.js.map +0 -1
- package/node_modules/@sema/gerador-typescript/dist/index.js.map +0 -1
- package/node_modules/@sema/gerador-typescript/dist/index.part01.js.map +0 -1
- package/node_modules/@sema/gerador-typescript/dist/index.part02.js.map +0 -1
- package/node_modules/@sema/gerador-typescript/dist/index.part03.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/ast/tipos.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/diagnosticos/index.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/diagnosticos/melhorador.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/diagnosticos/snippets.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/formatador/index.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/formatador/index.part01.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/formatador/index.part02.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/index.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/ir/conversor.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/ir/conversor.part01.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/ir/conversor.part02.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/ir/conversor.part03.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/ir/modelos.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/lexer/lexer.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/lexer/tokens.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/parser/parser.declaracoes.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/parser/parser.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/parser/parser.modulo.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/parser/parser.part01.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/parser/parser.part02.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/parser/parser.part03.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/persistencia/contratos.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/semantico/analisador.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/semantico/analisador.part01.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/semantico/analisador.part02.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/semantico/analisador.part03.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/semantico/analisador.part04.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/semantico/analisador.part05.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/semantico/analisador.part06.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/semantico/analisador.part07.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/semantico/analisador.part08.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/semantico/estruturas.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/semantico/estruturas.part01.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/semantico/estruturas.part02.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/semantico/orcamentoSemantico.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/semantico/seguranca.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/util/arquivos.js.map +0 -1
- package/node_modules/@sema/padroes/dist/index.js.map +0 -1
|
@@ -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");
|
|
@@ -242,53 +242,52 @@ export function converterDatabase(database) {
|
|
|
242
242
|
.filter((item) => Boolean(item)),
|
|
243
243
|
};
|
|
244
244
|
}
|
|
245
|
+
const ORIGENS_INTEROP_IMPLEMENTACAO = {
|
|
246
|
+
ts: "ts",
|
|
247
|
+
typescript: "ts",
|
|
248
|
+
js: "js",
|
|
249
|
+
javascript: "js",
|
|
250
|
+
py: "py",
|
|
251
|
+
python: "py",
|
|
252
|
+
dart: "dart",
|
|
253
|
+
lua: "lua",
|
|
254
|
+
cs: "cs",
|
|
255
|
+
csharp: "cs",
|
|
256
|
+
dotnet: "cs",
|
|
257
|
+
java: "java",
|
|
258
|
+
go: "go",
|
|
259
|
+
golang: "go",
|
|
260
|
+
rust: "rust",
|
|
261
|
+
rs: "rust",
|
|
262
|
+
cpp: "cpp",
|
|
263
|
+
cxx: "cpp",
|
|
264
|
+
cc: "cpp",
|
|
265
|
+
"c++": "cpp",
|
|
266
|
+
php: "php",
|
|
267
|
+
};
|
|
268
|
+
const PAPEIS_IMPLEMENTACAO_IR = new Set(["rota", "servico", "persistencia", "repositorio"]);
|
|
245
269
|
export function converterImplementacoes(bloco) {
|
|
246
270
|
const implementacoes = [];
|
|
247
271
|
for (const campo of bloco?.campos ?? []) {
|
|
248
|
-
const
|
|
249
|
-
if (
|
|
250
|
-
implementacoes.push({ origem: "ts", caminho: campo.valor, resolucaoImpl: campo.valor, statusImpl: "nao_verificado" });
|
|
272
|
+
const segmentos = campo.nome.toLowerCase().split("_");
|
|
273
|
+
if (segmentos.length > 2) {
|
|
251
274
|
continue;
|
|
252
275
|
}
|
|
253
|
-
|
|
254
|
-
|
|
276
|
+
const origem = ORIGENS_INTEROP_IMPLEMENTACAO[segmentos[0] ?? ""];
|
|
277
|
+
if (!origem) {
|
|
255
278
|
continue;
|
|
256
279
|
}
|
|
257
|
-
|
|
258
|
-
|
|
280
|
+
const papel = segmentos[1];
|
|
281
|
+
if (papel !== undefined && !PAPEIS_IMPLEMENTACAO_IR.has(papel)) {
|
|
259
282
|
continue;
|
|
260
283
|
}
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
}
|
|
269
|
-
if (origem === "cs" || origem === "csharp" || origem === "dotnet") {
|
|
270
|
-
implementacoes.push({ origem: "cs", caminho: campo.valor, resolucaoImpl: campo.valor, statusImpl: "nao_verificado" });
|
|
271
|
-
continue;
|
|
272
|
-
}
|
|
273
|
-
if (origem === "java") {
|
|
274
|
-
implementacoes.push({ origem: "java", caminho: campo.valor, resolucaoImpl: campo.valor, statusImpl: "nao_verificado" });
|
|
275
|
-
continue;
|
|
276
|
-
}
|
|
277
|
-
if (origem === "go" || origem === "golang") {
|
|
278
|
-
implementacoes.push({ origem: "go", caminho: campo.valor, resolucaoImpl: campo.valor, statusImpl: "nao_verificado" });
|
|
279
|
-
continue;
|
|
280
|
-
}
|
|
281
|
-
if (origem === "rust" || origem === "rs") {
|
|
282
|
-
implementacoes.push({ origem: "rust", caminho: campo.valor, resolucaoImpl: campo.valor, statusImpl: "nao_verificado" });
|
|
283
|
-
continue;
|
|
284
|
-
}
|
|
285
|
-
if (origem === "cpp" || origem === "cxx" || origem === "cc" || origem === "c++") {
|
|
286
|
-
implementacoes.push({ origem: "cpp", caminho: campo.valor, resolucaoImpl: campo.valor, statusImpl: "nao_verificado" });
|
|
287
|
-
continue;
|
|
288
|
-
}
|
|
289
|
-
if (origem === "php") {
|
|
290
|
-
implementacoes.push({ origem: "php", caminho: campo.valor, resolucaoImpl: campo.valor, statusImpl: "nao_verificado" });
|
|
291
|
-
}
|
|
284
|
+
implementacoes.push({
|
|
285
|
+
origem,
|
|
286
|
+
papel: papel,
|
|
287
|
+
caminho: campo.valor,
|
|
288
|
+
resolucaoImpl: campo.valor,
|
|
289
|
+
statusImpl: "nao_verificado",
|
|
290
|
+
});
|
|
292
291
|
}
|
|
293
292
|
return implementacoes;
|
|
294
293
|
}
|
|
@@ -24,6 +24,7 @@ export interface IrCampo {
|
|
|
24
24
|
export interface IrImplementacaoTask {
|
|
25
25
|
origem: "ts" | "js" | "py" | "dart" | "lua" | "cs" | "java" | "go" | "rust" | "cpp" | "php";
|
|
26
26
|
caminho: string;
|
|
27
|
+
papel?: "rota" | "servico" | "persistencia" | "repositorio";
|
|
27
28
|
origemArquivo?: string;
|
|
28
29
|
origemSimbolo?: string;
|
|
29
30
|
resolucaoImpl?: string;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
export { SimboloSemantico, CampoSemantico, ErroSemanticoTask, ResumoTaskSemantico, InteropSemantico, ImplementacaoTaskSemantica, ContextoSemantico, ResultadoSemantico, OpcoesAnaliseSemantica } from "./analisador.part01.js";
|
|
2
2
|
export { criarContextoLocal, validarTesteSemanticoForte, emitirDiagnosticosContratoFrouxo } from "./analisador.part07.js";
|
|
3
|
+
export { listarCandidatosUseRelativo } from "./analisador.part04.js";
|
|
3
4
|
export { analisarSemantica } from "./analisador.part08.js";
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
export { criarContextoLocal, validarTesteSemanticoForte, emitirDiagnosticosContratoFrouxo } from "./analisador.part07.js";
|
|
2
|
+
export { listarCandidatosUseRelativo } from "./analisador.part04.js";
|
|
2
3
|
export { analisarSemantica } from "./analisador.part08.js";
|
|
3
4
|
//# sourceMappingURL=analisador.js.map
|
|
@@ -32,6 +32,7 @@ export interface InteropSemantico {
|
|
|
32
32
|
export interface ImplementacaoTaskSemantica {
|
|
33
33
|
origem: "ts" | "js" | "py" | "dart" | "lua" | "cs" | "java" | "go" | "rust" | "cpp" | "php";
|
|
34
34
|
caminho: string;
|
|
35
|
+
papel?: "rota" | "servico" | "persistencia" | "repositorio";
|
|
35
36
|
}
|
|
36
37
|
export interface ContextoSemantico {
|
|
37
38
|
modulo: string;
|
|
@@ -83,6 +84,12 @@ export declare function converterCampoSemantico(campo: CampoAst): CampoSemantico
|
|
|
83
84
|
export declare function indicesCampos(campos: CampoSemantico[]): Map<string, CampoSemantico>;
|
|
84
85
|
export declare function indiceErros(erros: ErroSemanticoTask[]): Map<string, ErroSemanticoTask>;
|
|
85
86
|
export declare function coletarErrosTask(task: TaskAst): ErroSemanticoTask[];
|
|
87
|
+
export declare const PAPEIS_IMPLEMENTACAO_SUPORTADOS: Set<"servico" | "persistencia" | "rota" | "repositorio">;
|
|
88
|
+
export interface NomeCampoImplementacao {
|
|
89
|
+
origem: ImplementacaoTaskSemantica["origem"];
|
|
90
|
+
papel?: ImplementacaoTaskSemantica["papel"];
|
|
91
|
+
}
|
|
92
|
+
export declare function normalizarNomeCampoImplementacao(valor: string): NomeCampoImplementacao | undefined;
|
|
86
93
|
export declare function coletarResumoTask(task: TaskAst): ResumoTaskSemantico;
|
|
87
94
|
export declare function validarImplementacoesTask(task: TaskAst, diagnosticos: Diagnostico[]): void;
|
|
88
95
|
export declare function validarVinculos(bloco: BlocoGenericoAst | undefined, diagnosticos: Diagnostico[], contexto: string): void;
|
|
@@ -236,6 +236,25 @@ export function coletarErrosTask(task) {
|
|
|
236
236
|
}
|
|
237
237
|
return [...erros.values()];
|
|
238
238
|
}
|
|
239
|
+
export const PAPEIS_IMPLEMENTACAO_SUPORTADOS = new Set(["rota", "servico", "persistencia", "repositorio"]);
|
|
240
|
+
export function normalizarNomeCampoImplementacao(valor) {
|
|
241
|
+
const segmentos = valor.toLowerCase().split("_");
|
|
242
|
+
if (segmentos.length > 2) {
|
|
243
|
+
return undefined;
|
|
244
|
+
}
|
|
245
|
+
const origem = normalizarOrigemImplementacao(segmentos[0] ?? "");
|
|
246
|
+
if (!origem) {
|
|
247
|
+
return undefined;
|
|
248
|
+
}
|
|
249
|
+
const papel = segmentos[1];
|
|
250
|
+
if (papel === undefined) {
|
|
251
|
+
return { origem };
|
|
252
|
+
}
|
|
253
|
+
if (!PAPEIS_IMPLEMENTACAO_SUPORTADOS.has(papel)) {
|
|
254
|
+
return undefined;
|
|
255
|
+
}
|
|
256
|
+
return { origem, papel: papel };
|
|
257
|
+
}
|
|
239
258
|
export function coletarResumoTask(task) {
|
|
240
259
|
return {
|
|
241
260
|
input: (task.input?.campos ?? []).map(converterCampoSemantico),
|
|
@@ -244,8 +263,10 @@ export function coletarResumoTask(task) {
|
|
|
244
263
|
guarantees: (task.guarantees?.linhas ?? []).map((linha) => linha.conteudo),
|
|
245
264
|
implementacoes: (task.impl?.campos ?? [])
|
|
246
265
|
.map((campo) => {
|
|
247
|
-
const
|
|
248
|
-
return
|
|
266
|
+
const nome = normalizarNomeCampoImplementacao(campo.nome);
|
|
267
|
+
return nome
|
|
268
|
+
? { origem: nome.origem, ...(nome.papel ? { papel: nome.papel } : {}), caminho: campo.valor }
|
|
269
|
+
: undefined;
|
|
249
270
|
})
|
|
250
271
|
.filter((item) => Boolean(item)),
|
|
251
272
|
};
|
|
@@ -254,20 +275,22 @@ export function validarImplementacoesTask(task, diagnosticos) {
|
|
|
254
275
|
if (!task.impl) {
|
|
255
276
|
return;
|
|
256
277
|
}
|
|
257
|
-
const
|
|
278
|
+
const chaves = new Set();
|
|
258
279
|
for (const campo of task.impl.campos) {
|
|
259
|
-
const
|
|
260
|
-
if (!
|
|
261
|
-
diagnosticos.push(criarDiagnostico("SEM059", `Task "${task.nome}" declarou implementacao externa invalida em impl: "${campo.nome}".`, "erro", campo.intervalo, "Use
|
|
280
|
+
const nome = normalizarNomeCampoImplementacao(campo.nome);
|
|
281
|
+
if (!nome) {
|
|
282
|
+
diagnosticos.push(criarDiagnostico("SEM059", `Task "${task.nome}" declarou implementacao externa invalida em impl: "${campo.nome}".`, "erro", campo.intervalo, "Use ts, js, py, dart, lua, cs, java, go, rust, cpp ou php, opcionalmente com papel: ts_rota, ts_servico, ts_persistencia ou ts_repositorio."));
|
|
262
283
|
continue;
|
|
263
284
|
}
|
|
264
|
-
|
|
265
|
-
|
|
285
|
+
const rotulo = nome.papel ? `${nome.origem}_${nome.papel}` : nome.origem;
|
|
286
|
+
const chave = `${nome.origem}:${nome.papel ?? "-"}`;
|
|
287
|
+
if (chaves.has(chave)) {
|
|
288
|
+
diagnosticos.push(criarDiagnostico("SEM060", `Task "${task.nome}" declarou mais de uma implementacao ${rotulo} no bloco impl.`, "erro", campo.intervalo, "Cada combinacao de origem e papel deve aparecer no maximo uma vez; use papeis distintos como ts_rota e ts_servico para camadas diferentes."));
|
|
266
289
|
continue;
|
|
267
290
|
}
|
|
268
|
-
|
|
291
|
+
chaves.add(chave);
|
|
269
292
|
if (!PADRAO_CAMINHO_INTEROP.test(campo.valor)) {
|
|
270
|
-
diagnosticos.push(criarDiagnostico("SEM061", `Task "${task.nome}" declarou caminho invalido para impl ${
|
|
293
|
+
diagnosticos.push(criarDiagnostico("SEM061", `Task "${task.nome}" declarou caminho invalido para impl ${rotulo}: "${campo.valor}".`, "erro", campo.intervalo, "Use um identificador de implementacao como pacote.modulo.funcao ou app.servico.metodo."));
|
|
271
294
|
}
|
|
272
295
|
}
|
|
273
296
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@semacode/cli",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "3.5.0",
|
|
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",
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
"access": "public"
|
|
35
35
|
},
|
|
36
36
|
"bin": {
|
|
37
|
-
"sema": "dist/
|
|
37
|
+
"sema": "dist/bin.js"
|
|
38
38
|
},
|
|
39
39
|
"main": "dist/index.js",
|
|
40
40
|
"types": "dist/index.d.ts",
|
|
@@ -45,10 +45,15 @@
|
|
|
45
45
|
"default": "./dist/index.js"
|
|
46
46
|
}
|
|
47
47
|
},
|
|
48
|
+
"scripts": {
|
|
49
|
+
"postinstall": "node scripts/postinstall.mjs"
|
|
50
|
+
},
|
|
48
51
|
"files": [
|
|
49
52
|
"dist",
|
|
50
53
|
"docs",
|
|
51
54
|
"exemplos",
|
|
55
|
+
"skills",
|
|
56
|
+
"scripts/postinstall.mjs",
|
|
52
57
|
"logo.png",
|
|
53
58
|
"README.md",
|
|
54
59
|
"LICENSE"
|
|
@@ -63,8 +68,8 @@
|
|
|
63
68
|
"@sema/gerador-html": "1.5.53",
|
|
64
69
|
"@sema/gerador-css": "1.5.53",
|
|
65
70
|
"@sema/gerador-php": "1.5.55",
|
|
66
|
-
"@sema/gerador-dotnet": "2.
|
|
67
|
-
"@sema/gerador-cpp": "2.
|
|
71
|
+
"@sema/gerador-dotnet": "2.1.0",
|
|
72
|
+
"@sema/gerador-cpp": "2.1.0",
|
|
68
73
|
"@sema/padroes": "1.5.53",
|
|
69
74
|
"typescript": "^5.8.3"
|
|
70
75
|
},
|