@semacode/cli 2.3.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (267) hide show
  1. package/LICENSE +39 -39
  2. package/README.md +112 -41
  3. package/dist/agentContextPack.js +14 -10
  4. package/dist/agentEntryPoints.d.ts +5 -0
  5. package/dist/agentEntryPoints.js +102 -91
  6. package/dist/angular-consumer-standalone.d.ts +3 -1
  7. package/dist/angular-consumer-standalone.js +12 -8
  8. package/dist/bin.d.ts +6 -0
  9. package/dist/bin.js +130 -0
  10. package/dist/cliArgs.js +4 -4
  11. package/dist/cliControlError.d.ts +12 -0
  12. package/dist/cliControlError.js +47 -0
  13. package/dist/cliGrammar.d.ts +11 -0
  14. package/dist/cliGrammar.js +551 -0
  15. package/dist/cliHelp.d.ts +13 -0
  16. package/dist/cliHelp.js +19 -0
  17. package/dist/cliHelpTexto.d.ts +3 -0
  18. package/dist/cliHelpTexto.js +168 -0
  19. package/dist/cliRuntime.d.ts +2 -0
  20. package/dist/cliRuntime.js +31 -0
  21. package/dist/comandos.js +9 -22
  22. package/dist/contexto.js +5 -5
  23. package/dist/dev/index.d.ts +1 -0
  24. package/dist/dev/index.js +51 -9
  25. package/dist/discovery/catalog.js +3 -3
  26. package/dist/distribuicao/filesystemGlobal.d.ts +63 -0
  27. package/dist/distribuicao/filesystemGlobal.js +701 -0
  28. package/dist/distribuicao/index.d.ts +7 -0
  29. package/dist/distribuicao/index.js +227 -0
  30. package/dist/distribuicao/launcherGlobal.d.ts +53 -0
  31. package/dist/distribuicao/launcherGlobal.js +643 -0
  32. package/dist/distribuicao/launcherWindows.d.ts +28 -0
  33. package/dist/distribuicao/launcherWindows.js +326 -0
  34. package/dist/distribuicao/lockContextGlobal.d.ts +10 -0
  35. package/dist/distribuicao/lockContextGlobal.js +17 -0
  36. package/dist/distribuicao/lockGlobal.d.ts +6 -0
  37. package/dist/distribuicao/lockGlobal.js +520 -0
  38. package/dist/distribuicao/skillGlobal.d.ts +48 -0
  39. package/dist/distribuicao/skillGlobal.js +652 -0
  40. package/dist/distribuicao/skillIntentPolicy.d.ts +21 -0
  41. package/dist/distribuicao/skillIntentPolicy.js +115 -0
  42. package/dist/distribuicao/tipos.d.ts +50 -0
  43. package/dist/distribuicao/tipos.js +10 -0
  44. package/dist/distribuicao/versaoSemantica.d.ts +3 -0
  45. package/dist/distribuicao/versaoSemantica.js +62 -0
  46. package/dist/drift.part01.d.ts +34 -2
  47. package/dist/drift.part01.js +3 -0
  48. package/dist/drift.part04.d.ts +12 -2
  49. package/dist/drift.part04.js +89 -15
  50. package/dist/drift.part05.d.ts +2 -1
  51. package/dist/drift.part05.js +9 -6
  52. package/dist/drift.part06.d.ts +2 -1
  53. package/dist/drift.part06.js +115 -24
  54. package/dist/drift.part07.d.ts +11 -10
  55. package/dist/drift.part07.js +261 -255
  56. package/dist/drift.part08.d.ts +2 -1
  57. package/dist/drift.part08.js +35 -25
  58. package/dist/drift.part11.js +279 -32
  59. package/dist/drift.part12.d.ts +1 -1
  60. package/dist/drift.part12.js +196 -11
  61. package/dist/drift.part13.d.ts +18 -2
  62. package/dist/drift.part13.js +654 -76
  63. package/dist/drift.part14.js +21 -7
  64. package/dist/driftCacheCas.d.ts +43 -0
  65. package/dist/driftCacheCas.js +351 -0
  66. package/dist/driftCacheFilesystem.d.ts +64 -0
  67. package/dist/driftCacheFilesystem.js +313 -0
  68. package/dist/driftCacheModes.d.ts +38 -0
  69. package/dist/driftCacheModes.js +147 -0
  70. package/dist/driftCacheStore.d.ts +80 -0
  71. package/dist/driftCacheStore.js +603 -0
  72. package/dist/driftCatalogo.d.ts +65 -0
  73. package/dist/driftCatalogo.js +516 -0
  74. package/dist/driftEscopo.d.ts +21 -0
  75. package/dist/driftEscopo.js +647 -0
  76. package/dist/driftEscopoReferencias.d.ts +8 -0
  77. package/dist/driftEscopoReferencias.js +612 -0
  78. package/dist/driftOrcamento.d.ts +6 -0
  79. package/dist/driftOrcamento.js +20 -3
  80. package/dist/geracaoCore.js +4 -6
  81. package/dist/iaPrompts.d.ts +3 -3
  82. package/dist/iaPrompts.js +13 -14
  83. package/dist/index.d.ts +4 -1
  84. package/dist/index.js +6 -25
  85. package/dist/index.part01.d.ts +21 -14
  86. package/dist/index.part01.js +20 -165
  87. package/dist/index.part02.js +57 -43
  88. package/dist/index.part03.d.ts +23 -1
  89. package/dist/index.part03.js +83 -8
  90. package/dist/index.part04.d.ts +10 -2
  91. package/dist/index.part04.js +48 -14
  92. package/dist/index.part05.d.ts +1 -1
  93. package/dist/index.part05.js +109 -30
  94. package/dist/index.part06.js +34 -16
  95. package/dist/index.part07.js +31 -27
  96. package/dist/index.part08.d.ts +1 -1
  97. package/dist/index.part08.js +23 -28
  98. package/dist/init/templates.part01.js +393 -393
  99. package/dist/init/templates.part02.js +189 -189
  100. package/dist/initCommand.js +5 -1
  101. package/dist/initTemplatesBackend.js +73 -73
  102. package/dist/initTemplatesBase.js +7 -5
  103. package/dist/initTemplatesFlutter.js +137 -137
  104. package/dist/initTemplatesRuntime.js +350 -350
  105. package/dist/initTemplatesWeb.js +309 -309
  106. package/dist/pipelineConteudo/command.d.ts +1 -0
  107. package/dist/pipelineConteudo/command.js +4 -32
  108. package/dist/pipelineConteudo/help.d.ts +2 -0
  109. package/dist/pipelineConteudo/help.js +33 -0
  110. package/dist/profileAuthorCommand.js +3 -7
  111. package/dist/profileCommand.js +3 -7
  112. package/dist/projeto.d.ts +1 -1
  113. package/dist/projetoCarregar.d.ts +2 -2
  114. package/dist/projetoCarregar.js +69 -28
  115. package/dist/projetoCatalogo.d.ts +8 -0
  116. package/dist/projetoCatalogo.js +164 -0
  117. package/dist/projetoOrigens.d.ts +2 -0
  118. package/dist/projetoOrigens.js +65 -9
  119. package/dist/projetoTipos.d.ts +15 -5
  120. package/dist/resultadoCli.d.ts +20 -0
  121. package/dist/resultadoCli.js +57 -0
  122. package/dist/saidaCli.d.ts +35 -0
  123. package/dist/saidaCli.js +118 -0
  124. package/dist/sistemasInterativos/acceptanceEvidence.d.ts +22 -0
  125. package/dist/sistemasInterativos/acceptanceEvidence.js +345 -0
  126. package/dist/sistemasInterativos/engineObservation.d.ts +12 -0
  127. package/dist/sistemasInterativos/engineObservation.js +438 -0
  128. package/dist/sistemasInterativos/jobOrchestration.d.ts +2 -0
  129. package/dist/sistemasInterativos/jobOrchestration.js +204 -0
  130. package/dist/sistemasInterativos/operationPrimitives.d.ts +21 -0
  131. package/dist/sistemasInterativos/operationPrimitives.js +194 -0
  132. package/dist/sistemasInterativos/operations.d.ts +4 -39
  133. package/dist/sistemasInterativos/operations.js +5 -1164
  134. package/dist/skillCommand.d.ts +5 -0
  135. package/dist/skillCommand.js +88 -0
  136. package/dist/sync/index.js +35 -35
  137. package/docs/README.md +11 -7
  138. package/docs/ai-integration.md +18 -11
  139. package/docs/ai-onboarding.md +81 -62
  140. package/docs/ai-workflow.md +10 -4
  141. package/docs/auth.md +26 -26
  142. package/docs/cli.md +197 -79
  143. package/docs/commands.md +30 -6
  144. package/docs/database.md +15 -15
  145. package/docs/deploy.md +54 -41
  146. package/docs/documentation.md +11 -10
  147. package/docs/drift-cache.md +108 -0
  148. package/docs/env.md +16 -16
  149. package/docs/frontend.md +41 -41
  150. package/docs/getting-started.md +82 -57
  151. package/docs/i18n.md +15 -15
  152. package/docs/repositories.md +60 -43
  153. package/docs/rollback.md +38 -31
  154. package/docs/security.md +54 -32
  155. package/docs/sistemas-interativos.md +27 -27
  156. package/docs/support.md +8 -8
  157. package/docs/testing.md +123 -17
  158. package/docs/vocabulary.md +29 -29
  159. package/exemplos/agendamento.sema +1 -1
  160. package/exemplos/assinatura.sema +1 -1
  161. package/exemplos/auditoria.sema +1 -1
  162. package/exemplos/autenticacao.sema +1 -1
  163. package/exemplos/author_obra_comum.sema +1 -1
  164. package/exemplos/author_tema_sensivel.sema +1 -1
  165. package/exemplos/automacao.sema +1 -1
  166. package/exemplos/cadastro_usuario.sema +1 -1
  167. package/exemplos/calculadora.sema +1 -1
  168. package/exemplos/crud_simples.sema +1 -1
  169. package/exemplos/estoque.sema +1 -1
  170. package/exemplos/exportacao.sema +1 -1
  171. package/exemplos/fila.sema +1 -1
  172. package/exemplos/integracao_externa.sema +1 -1
  173. package/exemplos/multi_tenant.sema +1 -1
  174. package/exemplos/notificacao.sema +1 -1
  175. package/exemplos/operacao_estrategia.sema +132 -132
  176. package/exemplos/operacao_estrategia_discovery.sema +220 -220
  177. package/exemplos/operacao_estrategia_fluxo.sema +114 -114
  178. package/exemplos/operacao_estrategia_gates.sema +106 -106
  179. package/exemplos/operacao_estrategia_quarentena.sema +133 -133
  180. package/exemplos/operacao_estrategia_rollout.sema +124 -124
  181. package/exemplos/pagamento.sema +1 -1
  182. package/exemplos/pagamento_dominio.sema +1 -1
  183. package/exemplos/pedido.sema +1 -1
  184. package/exemplos/permissao.sema +1 -1
  185. package/exemplos/persistencia_vendor_first.sema +1 -1
  186. package/exemplos/profile_conversas.sema +165 -165
  187. package/exemplos/profile_game.sema +1 -1
  188. package/exemplos/profile_legal.sema +1 -1
  189. package/exemplos/profile_ops.sema +1 -1
  190. package/exemplos/profile_research.sema +1 -1
  191. package/exemplos/profile_software.sema +1 -1
  192. package/exemplos/profile_workflow_n8n.sema +1 -1
  193. package/exemplos/relatorio.sema +1 -1
  194. package/exemplos/replica_analitica_erp.sema +1 -1
  195. package/exemplos/testes_embutidos.sema +1 -1
  196. package/exemplos/tratamento_erro.sema +1 -1
  197. package/exemplos/upload_arquivo.sema +1 -1
  198. package/exemplos/webhook.sema +1 -1
  199. package/node_modules/@sema/gerador-cpp/dist/index.js +176 -176
  200. package/node_modules/@sema/gerador-css/dist/index.part01.js +10 -10
  201. package/node_modules/@sema/gerador-css/dist/index.part02.js +460 -460
  202. package/node_modules/@sema/gerador-dotnet/dist/index.js +169 -169
  203. package/node_modules/@sema/gerador-html/dist/index.js +17 -17
  204. package/node_modules/@sema/gerador-python/dist/index.part02.js +3 -3
  205. package/node_modules/@sema/gerador-typescript/dist/index.part02.js +11 -11
  206. package/node_modules/@sema/nucleo/dist/diagnosticos/melhorador.js +42 -42
  207. package/node_modules/@sema/nucleo/dist/semantico/analisador.d.ts +1 -0
  208. package/node_modules/@sema/nucleo/dist/semantico/analisador.js +1 -0
  209. package/package.json +7 -2
  210. package/scripts/postinstall.mjs +148 -0
  211. package/skills/sema/SKILL.md +199 -0
  212. package/skills/sema/agents/openai.yaml +4 -0
  213. package/node_modules/@sema/gerador-cpp/dist/index.js.map +0 -1
  214. package/node_modules/@sema/gerador-css/dist/index.js.map +0 -1
  215. package/node_modules/@sema/gerador-css/dist/index.part01.js.map +0 -1
  216. package/node_modules/@sema/gerador-css/dist/index.part02.js.map +0 -1
  217. package/node_modules/@sema/gerador-dart/dist/index.js.map +0 -1
  218. package/node_modules/@sema/gerador-dotnet/dist/index.js.map +0 -1
  219. package/node_modules/@sema/gerador-html/dist/index.js.map +0 -1
  220. package/node_modules/@sema/gerador-javascript/dist/index.js.map +0 -1
  221. package/node_modules/@sema/gerador-lua/dist/index.js.map +0 -1
  222. package/node_modules/@sema/gerador-php/dist/index.js.map +0 -1
  223. package/node_modules/@sema/gerador-python/dist/index.js.map +0 -1
  224. package/node_modules/@sema/gerador-python/dist/index.part01.js.map +0 -1
  225. package/node_modules/@sema/gerador-python/dist/index.part02.js.map +0 -1
  226. package/node_modules/@sema/gerador-typescript/dist/index.js.map +0 -1
  227. package/node_modules/@sema/gerador-typescript/dist/index.part01.js.map +0 -1
  228. package/node_modules/@sema/gerador-typescript/dist/index.part02.js.map +0 -1
  229. package/node_modules/@sema/gerador-typescript/dist/index.part03.js.map +0 -1
  230. package/node_modules/@sema/nucleo/dist/ast/tipos.js.map +0 -1
  231. package/node_modules/@sema/nucleo/dist/diagnosticos/index.js.map +0 -1
  232. package/node_modules/@sema/nucleo/dist/diagnosticos/melhorador.js.map +0 -1
  233. package/node_modules/@sema/nucleo/dist/diagnosticos/snippets.js.map +0 -1
  234. package/node_modules/@sema/nucleo/dist/formatador/index.js.map +0 -1
  235. package/node_modules/@sema/nucleo/dist/formatador/index.part01.js.map +0 -1
  236. package/node_modules/@sema/nucleo/dist/formatador/index.part02.js.map +0 -1
  237. package/node_modules/@sema/nucleo/dist/index.js.map +0 -1
  238. package/node_modules/@sema/nucleo/dist/ir/conversor.js.map +0 -1
  239. package/node_modules/@sema/nucleo/dist/ir/conversor.part01.js.map +0 -1
  240. package/node_modules/@sema/nucleo/dist/ir/conversor.part02.js.map +0 -1
  241. package/node_modules/@sema/nucleo/dist/ir/conversor.part03.js.map +0 -1
  242. package/node_modules/@sema/nucleo/dist/ir/modelos.js.map +0 -1
  243. package/node_modules/@sema/nucleo/dist/lexer/lexer.js.map +0 -1
  244. package/node_modules/@sema/nucleo/dist/lexer/tokens.js.map +0 -1
  245. package/node_modules/@sema/nucleo/dist/parser/parser.declaracoes.js.map +0 -1
  246. package/node_modules/@sema/nucleo/dist/parser/parser.js.map +0 -1
  247. package/node_modules/@sema/nucleo/dist/parser/parser.modulo.js.map +0 -1
  248. package/node_modules/@sema/nucleo/dist/parser/parser.part01.js.map +0 -1
  249. package/node_modules/@sema/nucleo/dist/parser/parser.part02.js.map +0 -1
  250. package/node_modules/@sema/nucleo/dist/parser/parser.part03.js.map +0 -1
  251. package/node_modules/@sema/nucleo/dist/persistencia/contratos.js.map +0 -1
  252. package/node_modules/@sema/nucleo/dist/semantico/analisador.js.map +0 -1
  253. package/node_modules/@sema/nucleo/dist/semantico/analisador.part01.js.map +0 -1
  254. package/node_modules/@sema/nucleo/dist/semantico/analisador.part02.js.map +0 -1
  255. package/node_modules/@sema/nucleo/dist/semantico/analisador.part03.js.map +0 -1
  256. package/node_modules/@sema/nucleo/dist/semantico/analisador.part04.js.map +0 -1
  257. package/node_modules/@sema/nucleo/dist/semantico/analisador.part05.js.map +0 -1
  258. package/node_modules/@sema/nucleo/dist/semantico/analisador.part06.js.map +0 -1
  259. package/node_modules/@sema/nucleo/dist/semantico/analisador.part07.js.map +0 -1
  260. package/node_modules/@sema/nucleo/dist/semantico/analisador.part08.js.map +0 -1
  261. package/node_modules/@sema/nucleo/dist/semantico/estruturas.js.map +0 -1
  262. package/node_modules/@sema/nucleo/dist/semantico/estruturas.part01.js.map +0 -1
  263. package/node_modules/@sema/nucleo/dist/semantico/estruturas.part02.js.map +0 -1
  264. package/node_modules/@sema/nucleo/dist/semantico/orcamentoSemantico.js.map +0 -1
  265. package/node_modules/@sema/nucleo/dist/semantico/seguranca.js.map +0 -1
  266. package/node_modules/@sema/nucleo/dist/util/arquivos.js.map +0 -1
  267. package/node_modules/@sema/padroes/dist/index.js.map +0 -1
@@ -1,5 +1,6 @@
1
1
  import type { IrBancoDados, IrModulo, IrTask } from "@sema/nucleo";
2
2
  import { OrigemRecursoDrift, RecursoEsperadoDrift, RecursoResolvido, RegistroColunaPersistenciaDrift, RegistroPersistenciaRealDrift, RegistroRepositorioPersistenciaDrift, SimboloResolvido, TipoRecursoDrift } from "./drift.part01.js";
3
+ import { type AdaptadorLeituraCompartilhadaDrift } from "./drift.part04.js";
3
4
  export declare function registrarRepositorioPersistenciaDrift(repositorios: Map<string, RegistroRepositorioPersistenciaDrift>, origem: OrigemRecursoDrift, recurso: string, arquivo: string): void;
4
5
  export declare function extrairColunasSqlDetalhadas(arquivo: string, codigo: string): RegistroColunaPersistenciaDrift[];
5
6
  export declare function extrairColunasPrismaDetalhadas(arquivo: string, codigo: string): RegistroColunaPersistenciaDrift[];
@@ -7,7 +8,7 @@ export declare function extrairCamposMongoDetalhados(arquivo: string, codigo: st
7
8
  export declare function extrairCamposRedisDetalhados(arquivo: string, codigo: string): RegistroColunaPersistenciaDrift[];
8
9
  export declare function extrairCamposArquivoLocalDetalhados(arquivo: string, codigo: string): RegistroColunaPersistenciaDrift[];
9
10
  export declare function registrarRepositoriosPorRecursos(repositorios: Map<string, RegistroRepositorioPersistenciaDrift>, arquivo: string, codigo: string, recursos: RecursoResolvido[]): void;
10
- export declare function indexarPersistenciaDetalhada(diretorios: string[]): Promise<{
11
+ export declare function indexarPersistenciaDetalhada(diretorios: string[], adaptadorLeitura?: AdaptadorLeituraCompartilhadaDrift): Promise<{
11
12
  colunas: RegistroColunaPersistenciaDrift[];
12
13
  repositorios: RegistroRepositorioPersistenciaDrift[];
13
14
  }>;
@@ -1,11 +1,11 @@
1
- // SEMA-GOVERNED: sema.governanca_ia_contexto
2
- // Descricao: CLI particionada; consulte contratos/sema/governanca_ia_contexto.sema antes de editar.
1
+ // SEMA-GOVERNED: sema.produto.governanca_ia.drift
2
+ // Descricao: indexa persistencia detalhada reutilizando o catalogo fisico do drift.
3
3
  import { readFile } from "node:fs/promises";
4
4
  import { categorizarPersistenciaPorOrigem, normalizarFragmentoArquivo, quebrarTermosEscopo } from "./drift.part01.js";
5
5
  import { fecharPrefixoRecurso, limparLiteralRecurso, normalizarNomeRecursoDrift } from "./drift.part02.js";
6
6
  import { extrairRecursosArquivoLocal, extrairRecursosMongoDb, extrairRecursosPersistenciaCodigoVivo, extrairRecursosPrisma, inferirMotoresRelacionais, variantesNomeRecursoDrift } from "./drift.part03.js";
7
7
  import { normalizarOrigemParaEngine, registrarColunaPersistenciaDrift } from "./drift.part07.js";
8
- import { listarArquivosRecursivos } from "./drift.part04.js";
8
+ import { chaveCaminhoCanonicoDrift, deduplicarRaizesSobrepostasDrift, listarArquivosRecursivos, } from "./drift.part04.js";
9
9
  import { recursoResolvidoCombinaEsperado } from "./drift.part10.js";
10
10
  import { recursoPersistenciaCombinaAlvo } from "./drift.part09.js";
11
11
  export function registrarRepositorioPersistenciaDrift(repositorios, origem, recurso, arquivo) {
@@ -172,38 +172,48 @@ export function registrarRepositoriosPorRecursos(repositorios, arquivo, codigo,
172
172
  registrarRepositorioPersistenciaDrift(repositorios, recurso.origem, recurso.nome, arquivo);
173
173
  }
174
174
  }
175
- export async function indexarPersistenciaDetalhada(diretorios) {
175
+ export async function indexarPersistenciaDetalhada(diretorios, adaptadorLeitura) {
176
+ adaptadorLeitura?.emitir?.("extractor.run");
176
177
  const colunas = new Map();
177
178
  const repositorios = new Map();
178
- for (const diretorio of diretorios) {
179
+ const arquivosUnicos = new Map();
180
+ for (const diretorio of deduplicarRaizesSobrepostasDrift(diretorios)) {
179
181
  const arquivos = await listarArquivosRecursivos(diretorio, [
180
182
  ".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs",
181
183
  ".py", ".dart", ".lua", ".cs", ".java", ".go", ".rs", ".cpp", ".cc", ".cxx", ".hpp", ".h", ".php",
182
184
  ".sql", ".psql", ".ddl", ".prisma",
183
- ]);
185
+ ], adaptadorLeitura);
184
186
  for (const arquivo of arquivos) {
185
- const codigo = await readFile(arquivo, "utf8");
186
- const recursos = arquivo.endsWith(".prisma")
187
- ? extrairRecursosPrisma(arquivo, codigo)
188
- : extrairRecursosPersistenciaCodigoVivo(arquivo, codigo);
189
- for (const coluna of extrairColunasSqlDetalhadas(arquivo, codigo)) {
190
- registrarColunaPersistenciaDrift(colunas, coluna.origem, coluna.recurso, coluna.coluna, coluna.arquivo);
187
+ const chave = chaveCaminhoCanonicoDrift(arquivo);
188
+ if (!arquivosUnicos.has(chave)) {
189
+ arquivosUnicos.set(chave, arquivo);
191
190
  }
192
- for (const coluna of extrairColunasPrismaDetalhadas(arquivo, codigo)) {
193
- registrarColunaPersistenciaDrift(colunas, coluna.origem, coluna.recurso, coluna.coluna, coluna.arquivo);
194
- }
195
- for (const coluna of extrairCamposMongoDetalhados(arquivo, codigo)) {
196
- registrarColunaPersistenciaDrift(colunas, coluna.origem, coluna.recurso, coluna.coluna, coluna.arquivo);
197
- }
198
- for (const coluna of extrairCamposRedisDetalhados(arquivo, codigo)) {
199
- registrarColunaPersistenciaDrift(colunas, coluna.origem, coluna.recurso, coluna.coluna, coluna.arquivo);
200
- }
201
- for (const coluna of extrairCamposArquivoLocalDetalhados(arquivo, codigo)) {
202
- registrarColunaPersistenciaDrift(colunas, coluna.origem, coluna.recurso, coluna.coluna, coluna.arquivo);
203
- }
204
- registrarRepositoriosPorRecursos(repositorios, arquivo, codigo, recursos);
205
191
  }
206
192
  }
193
+ for (const arquivo of arquivosUnicos.values()) {
194
+ const codigo = adaptadorLeitura
195
+ ? await adaptadorLeitura.lerTexto(arquivo)
196
+ : await readFile(arquivo, "utf8");
197
+ const recursos = arquivo.endsWith(".prisma")
198
+ ? extrairRecursosPrisma(arquivo, codigo)
199
+ : extrairRecursosPersistenciaCodigoVivo(arquivo, codigo);
200
+ for (const coluna of extrairColunasSqlDetalhadas(arquivo, codigo)) {
201
+ registrarColunaPersistenciaDrift(colunas, coluna.origem, coluna.recurso, coluna.coluna, coluna.arquivo);
202
+ }
203
+ for (const coluna of extrairColunasPrismaDetalhadas(arquivo, codigo)) {
204
+ registrarColunaPersistenciaDrift(colunas, coluna.origem, coluna.recurso, coluna.coluna, coluna.arquivo);
205
+ }
206
+ for (const coluna of extrairCamposMongoDetalhados(arquivo, codigo)) {
207
+ registrarColunaPersistenciaDrift(colunas, coluna.origem, coluna.recurso, coluna.coluna, coluna.arquivo);
208
+ }
209
+ for (const coluna of extrairCamposRedisDetalhados(arquivo, codigo)) {
210
+ registrarColunaPersistenciaDrift(colunas, coluna.origem, coluna.recurso, coluna.coluna, coluna.arquivo);
211
+ }
212
+ for (const coluna of extrairCamposArquivoLocalDetalhados(arquivo, codigo)) {
213
+ registrarColunaPersistenciaDrift(colunas, coluna.origem, coluna.recurso, coluna.coluna, coluna.arquivo);
214
+ }
215
+ registrarRepositoriosPorRecursos(repositorios, arquivo, codigo, recursos);
216
+ }
207
217
  return {
208
218
  colunas: [...colunas.values()],
209
219
  repositorios: [...repositorios.values()],
@@ -1,16 +1,123 @@
1
- // SEMA-GOVERNED: sema.governanca_ia_contexto
2
- // Descricao: CLI particionada; consulte contratos/sema/governanca_ia_contexto.sema antes de editar.
1
+ // SEMA-GOVERNED: sema.governanca_ia_contexto, sema.produto.governanca_ia.drift.cache.store
2
+ // Descrição: integra índices calculados ou reutilizados e sempre recalcula o resultado final do drift.
3
3
  import path from "node:path";
4
- import { emitirDiagnosticosArquivosOrcamento } from "./driftOrcamento.js";
4
+ import { emitirDiagnosticosArquivosOrcamento, workspaceExigeCabecalhoCodigoGovernado, } from "./driftOrcamento.js";
5
5
  import { definirDiretoriosIgnoradosAtivos, obterDiretoriosIgnoradosAtivos, extrairTermosEscopoDrift, resolverDiretoriosIgnoradosAtivos, resolverOpcoesDrift } from "./drift.part01.js";
6
6
  import { construirContextoRelevanciaConsumer, filtrarConsumerSurfacesPorEscopo } from "./drift.part02.js";
7
7
  import { inferirConsumerFrameworkPrincipal } from "./drift.part06.js";
8
- import { calcularConfiancaTask, calcularRiscoOperacional, calcularScoreTask, resumirLacunasTask, resumirOperacional } from "./drift.part04.js";
9
- import { analisarPersistenciaReal } from "./drift.part09.js";
8
+ import { calcularConfiancaTask, calcularRiscoOperacional, calcularScoreTask, chaveCaminhoCanonicoDrift, encontrarCandidatosFisicosImplementacaoDrift, resumirLacunasTask, resumirOperacional } from "./drift.part04.js";
9
+ import { analisarPersistenciaReal, ordenarCandidatos } from "./drift.part09.js";
10
10
  import { simboloEhBridgeConsumer } from "./drift.part05.js";
11
11
  import { prepararIndicesDrift } from "./drift.part13.js";
12
12
  import { analisarModulosSelecionadosDrift } from "./drift.part14.js";
13
13
  import { resolverPoliticaPontuacaoSemantica } from "./driftScore.js";
14
+ function arquivosVinculadosFisicamenteDrift(contexto, modulo, task) {
15
+ const arquivos = new Set();
16
+ for (const vinculo of [...modulo.vinculos, ...task.vinculos]) {
17
+ const arquivo = vinculo.arquivo
18
+ ?? (vinculo.tipo === "arquivo" ? vinculo.valor : undefined);
19
+ if (arquivo) {
20
+ arquivos.add(chaveCaminhoCanonicoDrift(path.resolve(contexto.baseProjeto, arquivo)));
21
+ }
22
+ }
23
+ return arquivos;
24
+ }
25
+ function prepararMapaImplementacoesHonestoDrift(contexto, mapaImpl, todosSimbolos) {
26
+ const mapaImplHonesto = new Map(mapaImpl);
27
+ const usosPorOrigemECaminho = new Map();
28
+ for (const item of contexto.modulosSelecionados) {
29
+ const ir = item.resultado.ir;
30
+ if (!ir) {
31
+ continue;
32
+ }
33
+ for (const task of ir.tasks) {
34
+ const arquivosVinculados = arquivosVinculadosFisicamenteDrift(contexto, ir, task);
35
+ for (const impl of task.implementacoesExternas) {
36
+ const candidatos = encontrarCandidatosFisicosImplementacaoDrift(todosSimbolos, impl.origem, impl.caminho);
37
+ const candidatosVinculados = candidatos.filter((candidato) => arquivosVinculados.has(chaveCaminhoCanonicoDrift(candidato.arquivo)));
38
+ const resolvido = candidatos.length === 1
39
+ ? candidatos[0]
40
+ : candidatosVinculados.length === 1
41
+ ? candidatosVinculados[0]
42
+ : undefined;
43
+ const uso = {
44
+ modulo: ir.nome,
45
+ task: task.nome,
46
+ origem: impl.origem,
47
+ caminho: impl.caminho,
48
+ implementacao: impl,
49
+ candidatos,
50
+ resolvido,
51
+ ambiguo: candidatos.length > 1 && candidatosVinculados.length !== 1,
52
+ };
53
+ const chaveGrupo = `${impl.origem}\u0000${impl.caminho}`;
54
+ const usos = usosPorOrigemECaminho.get(chaveGrupo) ?? [];
55
+ usos.push(uso);
56
+ usosPorOrigemECaminho.set(chaveGrupo, usos);
57
+ }
58
+ }
59
+ }
60
+ const ambiguidades = [];
61
+ const gruposPorCaminho = new Map();
62
+ for (const usos of usosPorOrigemECaminho.values()) {
63
+ const caminho = usos[0].caminho;
64
+ const resolvidos = new Map();
65
+ for (const uso of usos) {
66
+ if (uso.resolvido) {
67
+ resolvidos.set(chaveCaminhoCanonicoDrift(uso.resolvido.arquivo), uso.resolvido);
68
+ }
69
+ }
70
+ const conflitoEntreUsos = resolvidos.size > 1;
71
+ const deveFalharFechado = usos.some((uso) => uso.ambiguo || !uso.resolvido)
72
+ || conflitoEntreUsos;
73
+ if (deveFalharFechado && (usos.some((uso) => uso.ambiguo) || conflitoEntreUsos)) {
74
+ const candidatosDoGrupo = [...new Map(usos.flatMap((uso) => uso.candidatos).map((candidato) => [
75
+ chaveCaminhoCanonicoDrift(candidato.arquivo),
76
+ candidato,
77
+ ])).values()];
78
+ for (const uso of usos) {
79
+ ambiguidades.push({
80
+ ...uso,
81
+ candidatos: uso.candidatos.length > 1 ? uso.candidatos : candidatosDoGrupo,
82
+ ambiguo: true,
83
+ });
84
+ }
85
+ }
86
+ const grupos = gruposPorCaminho.get(caminho) ?? [];
87
+ grupos.push({
88
+ usos,
89
+ resolvido: deveFalharFechado ? undefined : resolvidos.values().next().value,
90
+ });
91
+ gruposPorCaminho.set(caminho, grupos);
92
+ }
93
+ const substituicoesCaminho = [];
94
+ let sequenciaCaminhoTemporario = 0;
95
+ for (const [caminho, grupos] of gruposPorCaminho) {
96
+ mapaImplHonesto.delete(caminho);
97
+ const gruposResolvidos = grupos.filter((grupo) => grupo.resolvido);
98
+ const resolucoesDistintas = new Map();
99
+ for (const grupo of gruposResolvidos) {
100
+ const resolvido = grupo.resolvido;
101
+ resolucoesDistintas.set(`${resolvido.origem}:${chaveCaminhoCanonicoDrift(resolvido.arquivo)}:${resolvido.caminho}`, resolvido);
102
+ }
103
+ if (gruposResolvidos.length === grupos.length && resolucoesDistintas.size === 1) {
104
+ mapaImplHonesto.set(caminho, resolucoesDistintas.values().next().value);
105
+ continue;
106
+ }
107
+ for (const grupo of gruposResolvidos) {
108
+ for (const uso of grupo.usos) {
109
+ const temporario = `__sema_impl_${sequenciaCaminhoTemporario++}`;
110
+ mapaImplHonesto.set(temporario, uso.resolvido);
111
+ substituicoesCaminho.push({
112
+ implementacao: uso.implementacao,
113
+ original: uso.caminho,
114
+ temporario,
115
+ });
116
+ }
117
+ }
118
+ }
119
+ return { mapaImplHonesto, ambiguidades, substituicoesCaminho };
120
+ }
14
121
  export async function analisarDriftLegado(contexto, opcoes) {
15
122
  const opcoesResolvidas = resolverOpcoesDrift(opcoes);
16
123
  const configuracaoEscopo = {
@@ -22,7 +129,29 @@ export async function analisarDriftLegado(contexto, opcoes) {
22
129
  const diretoriosIgnoradosAnteriores = obterDiretoriosIgnoradosAtivos();
23
130
  definirDiretoriosIgnoradosAtivos(resolverDiretoriosIgnoradosAtivos(opcoesResolvidas));
24
131
  try {
25
- const { detalhesPersistencia, indexDart, indexTs, mapaImpl, mapaRecursos, todasRotasIndexadas, todosArquivosConhecidos, todosRecursos, todosSimbolos, } = await prepararIndicesDrift(contexto, configuracaoEscopo);
132
+ const indicesPreparados = await prepararIndicesDrift(contexto, configuracaoEscopo, {
133
+ observador: opcoesResolvidas.observador,
134
+ modoCache: opcoesResolvidas.modoCache,
135
+ avisosModoCache: opcoesResolvidas.avisosModoCache,
136
+ });
137
+ const { detalhesPersistencia, indexDart, indexTs, mapaImpl, mapaRecursos, todasRotasIndexadas, todosArquivosConhecidos, todosRecursos, todosSimbolos, planoEscopo, cache: estadoCache, catalogo: metricasCatalogo, leitorArquivosPlanejados, } = indicesPreparados;
138
+ const relativoEscopo = (arquivo) => {
139
+ const relativo = path.relative(contexto.baseProjeto, arquivo).replace(/\\/g, "/");
140
+ return relativo && !relativo.startsWith("../")
141
+ ? relativo
142
+ : arquivo.replace(/\\/g, "/");
143
+ };
144
+ configuracaoEscopo.estrategia = planoEscopo.estrategia;
145
+ configuracaoEscopo.cobertura = planoEscopo.cobertura;
146
+ configuracaoEscopo.arquivosPlanejados = planoEscopo.arquivos.map(relativoEscopo);
147
+ configuracaoEscopo.arquivosDeclarados = planoEscopo.arquivosDeclarados.map(relativoEscopo);
148
+ configuracaoEscopo.arquivosInferidos = planoEscopo.arquivosInferidos.map(relativoEscopo);
149
+ configuracaoEscopo.arquivosAusentes = planoEscopo.arquivosAusentes.map(relativoEscopo);
150
+ const bloqueiosAnalise = new Set(planoEscopo.bloqueios);
151
+ configuracaoEscopo.bloqueios = [...bloqueiosAnalise];
152
+ configuracaoEscopo.catalogo = metricasCatalogo;
153
+ configuracaoEscopo.cache = estadoCache;
154
+ const { mapaImplHonesto, ambiguidades, substituicoesCaminho } = prepararMapaImplementacoesHonestoDrift(contexto, mapaImpl, todosSimbolos);
26
155
  const implsValidos = [];
27
156
  const implsQuebrados = [];
28
157
  const vinculosValidos = [];
@@ -31,33 +160,121 @@ export async function analisarDriftLegado(contexto, opcoes) {
31
160
  const recursosValidos = [];
32
161
  const recursosDivergentes = [];
33
162
  const diagnosticos = [];
163
+ const moduloDiagnostico = contexto.modulosSelecionados[0]?.resultado.ir?.nome
164
+ ?? contexto.modulosSelecionados[0]?.resultado.modulo?.nome
165
+ ?? "projeto";
166
+ for (const arquivoAusente of planoEscopo.arquivosAusentes) {
167
+ const arquivo = relativoEscopo(arquivoAusente);
168
+ diagnosticos.push({
169
+ tipo: "vinculo_quebrado",
170
+ modulo: moduloDiagnostico,
171
+ arquivo,
172
+ severidade: "erro",
173
+ mensagem: `O arquivo planejado "${arquivo}" não existe no workspace; a cobertura do drift ficou parcial.`,
174
+ });
175
+ }
176
+ if (planoEscopo.cobertura === "parcial" && planoEscopo.arquivosAusentes.length === 0) {
177
+ diagnosticos.push({
178
+ tipo: "vinculo_quebrado",
179
+ modulo: moduloDiagnostico,
180
+ severidade: "erro",
181
+ mensagem: "A cobertura do drift ficou parcial e não permite declarar a análise como bem-sucedida.",
182
+ });
183
+ }
184
+ if (planoEscopo.bloqueios.includes("escopo_estreito_sem_vinculos")) {
185
+ diagnosticos.push({
186
+ tipo: "escopo_estreito_sem_vinculos",
187
+ modulo: moduloDiagnostico,
188
+ severidade: "erro",
189
+ mensagem: "Escopo de arquivo ou módulo sem arquivo vinculado nem implementação resolvível. Declare `vinculos { arquivo: ... }` ou execute explicitamente com `--escopo projeto`.",
190
+ });
191
+ }
192
+ if (planoEscopo.bloqueios.includes("escopo_estreito_ambiguo")) {
193
+ diagnosticos.push({
194
+ tipo: "escopo_estreito_ambiguo",
195
+ modulo: moduloDiagnostico,
196
+ severidade: "erro",
197
+ mensagem: "Mais de um arquivo pode implementar o mesmo símbolo. Declare um vínculo de arquivo inequívoco antes do drift.",
198
+ });
199
+ }
34
200
  const tasksResumo = [];
35
201
  const taskPorChave = new Map();
36
202
  const guardrailsPorTask = new Map();
37
203
  const resumoVinculosPorTask = new Map();
38
204
  const arquivosAncoraHerdadosPorTask = new Map();
39
- analisarModulosSelecionadosDrift({
40
- contexto,
41
- mapaImpl,
42
- todosSimbolos,
43
- mapaRecursos,
44
- todosRecursos,
45
- todasRotasIndexadas,
46
- todosArquivosConhecidos,
47
- implsValidos,
48
- implsQuebrados,
49
- vinculosValidos,
50
- vinculosQuebrados,
51
- rotasDivergentes,
52
- recursosValidos,
53
- recursosDivergentes,
54
- diagnosticos,
55
- tasksResumo,
56
- taskPorChave,
57
- guardrailsPorTask,
58
- resumoVinculosPorTask,
59
- arquivosAncoraHerdadosPorTask,
60
- });
205
+ // O analisador legado consulta implementações apenas pelo caminho. Chaves efêmeras
206
+ // mantêm resoluções de origens distintas isoladas durante essa chamada e são restauradas logo depois.
207
+ for (const substituicao of substituicoesCaminho) {
208
+ substituicao.implementacao.caminho = substituicao.temporario;
209
+ }
210
+ try {
211
+ analisarModulosSelecionadosDrift({
212
+ contexto,
213
+ mapaImpl: mapaImplHonesto,
214
+ todosSimbolos,
215
+ mapaRecursos,
216
+ todosRecursos,
217
+ todasRotasIndexadas,
218
+ todosArquivosConhecidos,
219
+ implsValidos,
220
+ implsQuebrados,
221
+ vinculosValidos,
222
+ vinculosQuebrados,
223
+ rotasDivergentes,
224
+ recursosValidos,
225
+ recursosDivergentes,
226
+ diagnosticos,
227
+ tasksResumo,
228
+ taskPorChave,
229
+ guardrailsPorTask,
230
+ resumoVinculosPorTask,
231
+ arquivosAncoraHerdadosPorTask,
232
+ });
233
+ }
234
+ finally {
235
+ for (const substituicao of substituicoesCaminho) {
236
+ substituicao.implementacao.caminho = substituicao.original;
237
+ }
238
+ }
239
+ const caminhoOriginalPorTemporario = new Map(substituicoesCaminho.map((substituicao) => [substituicao.temporario, substituicao.original]));
240
+ for (const registro of [...implsValidos, ...implsQuebrados]) {
241
+ registro.caminho = caminhoOriginalPorTemporario.get(registro.caminho) ?? registro.caminho;
242
+ }
243
+ for (const ambiguidade of ambiguidades) {
244
+ const candidatos = ambiguidade.candidatos.map((candidato) => ({
245
+ origem: candidato.origem,
246
+ caminho: candidato.caminho,
247
+ arquivo: candidato.arquivo,
248
+ simbolo: candidato.simbolo,
249
+ confianca: "alta",
250
+ motivo: `Arquivo físico candidato à implementação ambígua "${ambiguidade.origem}:${ambiguidade.caminho}".`,
251
+ }));
252
+ const registro = implsQuebrados.find((impl) => impl.modulo === ambiguidade.modulo
253
+ && impl.task === ambiguidade.task
254
+ && impl.origem === ambiguidade.origem
255
+ && impl.caminho === ambiguidade.caminho);
256
+ if (registro) {
257
+ registro.candidatos = candidatos;
258
+ }
259
+ const resumo = tasksResumo.find((task) => task.modulo === ambiguidade.modulo && task.task === ambiguidade.task);
260
+ if (resumo) {
261
+ const arquivosCandidatos = new Set(candidatos.map((candidato) => chaveCaminhoCanonicoDrift(candidato.arquivo)));
262
+ const candidatosRestantes = resumo.candidatosImpl.filter((candidato) => !arquivosCandidatos.has(chaveCaminhoCanonicoDrift(candidato.arquivo)));
263
+ resumo.candidatosImpl = [
264
+ ...candidatos,
265
+ ...ordenarCandidatos(candidatosRestantes),
266
+ ].slice(0, 5);
267
+ }
268
+ diagnosticos.push({
269
+ tipo: "escopo_estreito_ambiguo",
270
+ modulo: ambiguidade.modulo,
271
+ task: ambiguidade.task,
272
+ severidade: "erro",
273
+ mensagem: `A implementação "${ambiguidade.origem}:${ambiguidade.caminho}" é ambígua: ${candidatos.length} arquivos físicos correspondem ao mesmo caminho semântico. Declare um vínculo de arquivo inequívoco.`,
274
+ });
275
+ bloqueiosAnalise.add("escopo_estreito_ambiguo");
276
+ }
277
+ configuracaoEscopo.bloqueios = [...bloqueiosAnalise];
61
278
  for (const resumo of tasksResumo) {
62
279
  const chaveTask = `${resumo.modulo}:${resumo.task}`;
63
280
  const task = taskPorChave.get(chaveTask);
@@ -204,7 +421,7 @@ export async function analisarDriftLegado(contexto, opcoes) {
204
421
  const appRoutes = [...new Set(consumerSurfaces.map((surface) => surface.rota))]
205
422
  .sort((a, b) => a.localeCompare(b, "pt-BR"));
206
423
  const consumerFramework = inferirConsumerFrameworkPrincipal(contexto.fontesLegado, consumerSurfaces, consumerBridges);
207
- const persistenciaReal = await analisarPersistenciaReal(contexto, mapaRecursos, detalhesPersistencia, opcoesResolvidas, mapaImpl);
424
+ const persistenciaReal = await analisarPersistenciaReal(contexto, mapaRecursos, detalhesPersistencia, opcoesResolvidas, mapaImplHonesto);
208
425
  for (const item of persistenciaReal) {
209
426
  if (item.status === "divergente") {
210
427
  diagnosticos.push({
@@ -249,12 +466,39 @@ export async function analisarDriftLegado(contexto, opcoes) {
249
466
  const moduloOrcamento = contexto.modulosSelecionados[0]?.resultado.ir?.nome
250
467
  ?? contexto.modulosSelecionados[0]?.resultado.modulo?.nome
251
468
  ?? "projeto";
252
- const exigeCabecalhoCodigoGovernado = contexto.configCarregada?.config.modoEstrito === true
253
- && contexto.arquivosProjeto.some((arquivo) => path.basename(arquivo).toLowerCase() === "agents.md");
469
+ const exigeCabecalhoCodigoGovernado = await workspaceExigeCabecalhoCodigoGovernado(contexto.baseProjeto, contexto.configCarregada?.config.modoEstrito === true);
470
+ const chaveArquivoOrcamento = (arquivo) => {
471
+ const absoluto = path.resolve(contexto.baseProjeto, arquivo);
472
+ return process.platform === "win32" ? absoluto.toLowerCase() : absoluto;
473
+ };
474
+ const contratosJaCarregados = new Map(contexto.modulosCarregados.map((modulo) => [
475
+ chaveArquivoOrcamento(modulo.caminho),
476
+ modulo.codigo,
477
+ ]));
478
+ const leitorArquivosOrcamento = {
479
+ contem: (arquivo) => {
480
+ const chave = chaveArquivoOrcamento(arquivo);
481
+ return contratosJaCarregados.has(chave)
482
+ || leitorArquivosPlanejados.contem(arquivo);
483
+ },
484
+ lerTexto: async (arquivo) => {
485
+ const contrato = contratosJaCarregados.get(chaveArquivoOrcamento(arquivo));
486
+ if (contrato !== undefined) {
487
+ return contrato;
488
+ }
489
+ if (!leitorArquivosPlanejados.contem(arquivo)) {
490
+ throw new Error(`Arquivo fora do catálogo planejado do drift: ${arquivo}`);
491
+ }
492
+ return leitorArquivosPlanejados.lerTexto(arquivo);
493
+ },
494
+ };
495
+ const arquivosOrcamentoPlanejados = [...arquivosOrcamento]
496
+ .filter((arquivo) => leitorArquivosOrcamento.contem(arquivo));
254
497
  const diagnosticosOrcamento = await emitirDiagnosticosArquivosOrcamento({
255
498
  baseProjeto: contexto.baseProjeto,
256
- arquivos: [...arquivosOrcamento],
499
+ arquivos: arquivosOrcamentoPlanejados,
257
500
  exigirCabecalhoCodigoGovernado: exigeCabecalhoCodigoGovernado,
501
+ leitorArquivos: leitorArquivosOrcamento,
258
502
  });
259
503
  for (const diagnostico of diagnosticosOrcamento) {
260
504
  diagnosticos.push({
@@ -274,6 +518,9 @@ export async function analisarDriftLegado(contexto, opcoes) {
274
518
  && recursosDivergentes.length === 0
275
519
  && vinculosQuebrados.length === 0
276
520
  && persistenciaReal.every((item) => item.status !== "divergente" && item.compatibilidade !== "invalido")
521
+ && planoEscopo.cobertura === "completa"
522
+ && planoEscopo.arquivosAusentes.length === 0
523
+ && bloqueiosAnalise.size === 0
277
524
  && !possuiBloqueioOrcamento;
278
525
  const payloadBase = {
279
526
  comando: "drift",
@@ -7,7 +7,7 @@ export declare function classificarArquivoImpacto(arquivo: string): RegistroImpa
7
7
  export declare function prioridadeArquivoImpacto(tipo: RegistroImpactoSemanticoArquivo["tipo"]): RegistroImpactoSemanticoArquivo["prioridade"];
8
8
  export declare function textoIrCombinaTermos(texto: string, termos: string[]): boolean;
9
9
  export declare function registrarArquivoImpactado(mapa: Map<string, RegistroImpactoSemanticoArquivo>, arquivo: string, linhas: number[], motivos: string[]): void;
10
- export declare function listarArquivosImpacto(contexto: ContextoProjetoCarregado, opcoes?: OpcoesDriftLegado): Promise<string[]>;
10
+ export declare function listarArquivosImpacto(contexto: ContextoProjetoCarregado, opcoes?: OpcoesDriftLegado, arquivosPlanejados?: readonly string[]): Promise<string[]>;
11
11
  export declare function extrairLinhasComVariantes(codigo: string, variantes: string[]): number[];
12
12
  export declare function serializarTaskParaImpacto(task: IrTask): string;
13
13
  export declare function serializarRouteParaImpacto(route: IrRoute): string;