@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.
Files changed (281) hide show
  1. package/README.md +265 -217
  2. package/dist/agentContextPack.js +14 -10
  3. package/dist/agentEntryPoints.d.ts +5 -0
  4. package/dist/agentEntryPoints.js +592 -568
  5. package/dist/angular-consumer-standalone.js +1 -1
  6. package/dist/bin.d.ts +6 -0
  7. package/dist/bin.js +130 -0
  8. package/dist/cliArgs.js +4 -4
  9. package/dist/cliControlError.d.ts +12 -0
  10. package/dist/cliControlError.js +47 -0
  11. package/dist/cliGrammar.d.ts +11 -0
  12. package/dist/cliGrammar.js +551 -0
  13. package/dist/cliHelp.d.ts +13 -0
  14. package/dist/cliHelp.js +19 -0
  15. package/dist/cliHelpTexto.d.ts +3 -0
  16. package/dist/cliHelpTexto.js +168 -0
  17. package/dist/cliRuntime.d.ts +2 -0
  18. package/dist/cliRuntime.js +31 -0
  19. package/dist/comandos.js +9 -22
  20. package/dist/contexto.js +5 -5
  21. package/dist/dev/index.d.ts +1 -0
  22. package/dist/dev/index.js +51 -9
  23. package/dist/discovery/catalog.js +3 -3
  24. package/dist/distribuicao/filesystemGlobal.d.ts +63 -0
  25. package/dist/distribuicao/filesystemGlobal.js +701 -0
  26. package/dist/distribuicao/index.d.ts +7 -0
  27. package/dist/distribuicao/index.js +227 -0
  28. package/dist/distribuicao/launcherGlobal.d.ts +53 -0
  29. package/dist/distribuicao/launcherGlobal.js +643 -0
  30. package/dist/distribuicao/launcherWindows.d.ts +28 -0
  31. package/dist/distribuicao/launcherWindows.js +326 -0
  32. package/dist/distribuicao/lockContextGlobal.d.ts +10 -0
  33. package/dist/distribuicao/lockContextGlobal.js +17 -0
  34. package/dist/distribuicao/lockGlobal.d.ts +6 -0
  35. package/dist/distribuicao/lockGlobal.js +520 -0
  36. package/dist/distribuicao/skillGlobal.d.ts +48 -0
  37. package/dist/distribuicao/skillGlobal.js +652 -0
  38. package/dist/distribuicao/skillIntentPolicy.d.ts +21 -0
  39. package/dist/distribuicao/skillIntentPolicy.js +115 -0
  40. package/dist/distribuicao/tipos.d.ts +50 -0
  41. package/dist/distribuicao/tipos.js +10 -0
  42. package/dist/distribuicao/versaoSemantica.d.ts +3 -0
  43. package/dist/distribuicao/versaoSemantica.js +62 -0
  44. package/dist/docs.part01.d.ts +4 -1
  45. package/dist/docs.part01.js +8 -0
  46. package/dist/docs.part02.js +9 -1
  47. package/dist/drift.part01.d.ts +33 -25
  48. package/dist/drift.part01.js +2 -1
  49. package/dist/drift.part04.d.ts +26 -5
  50. package/dist/drift.part04.js +123 -19
  51. package/dist/drift.part05.d.ts +2 -2
  52. package/dist/drift.part05.js +8 -6
  53. package/dist/drift.part06.d.ts +2 -2
  54. package/dist/drift.part06.js +113 -26
  55. package/dist/drift.part07.d.ts +11 -11
  56. package/dist/drift.part07.js +261 -265
  57. package/dist/drift.part08.d.ts +2 -2
  58. package/dist/drift.part08.js +35 -26
  59. package/dist/drift.part09.d.ts +2 -2
  60. package/dist/drift.part09.js +10 -3
  61. package/dist/drift.part11.js +261 -58
  62. package/dist/drift.part12.d.ts +1 -1
  63. package/dist/drift.part12.js +193 -21
  64. package/dist/drift.part13.d.ts +20 -39
  65. package/dist/drift.part13.js +601 -647
  66. package/dist/drift.part14.js +23 -7
  67. package/dist/driftCacheCas.d.ts +43 -0
  68. package/dist/driftCacheCas.js +351 -0
  69. package/dist/driftCacheFilesystem.d.ts +64 -0
  70. package/dist/driftCacheFilesystem.js +313 -0
  71. package/dist/driftCacheModes.d.ts +38 -0
  72. package/dist/driftCacheModes.js +147 -0
  73. package/dist/driftCacheStore.d.ts +80 -0
  74. package/dist/driftCacheStore.js +603 -0
  75. package/dist/driftCatalogo.d.ts +2 -28
  76. package/dist/driftCatalogo.js +143 -284
  77. package/dist/driftEscopo.d.ts +1 -3
  78. package/dist/driftEscopo.js +235 -151
  79. package/dist/driftEscopoReferencias.d.ts +5 -1
  80. package/dist/driftEscopoReferencias.js +375 -28
  81. package/dist/driftOrcamento.d.ts +0 -6
  82. package/dist/driftOrcamento.js +2 -1
  83. package/dist/execucoesExternas.js +19 -5
  84. package/dist/exemplosOficiais.d.ts +2 -1
  85. package/dist/exemplosOficiais.js +9 -3
  86. package/dist/geracaoCore.d.ts +1 -0
  87. package/dist/geracaoCore.js +6 -6
  88. package/dist/iaPrompts.d.ts +3 -3
  89. package/dist/iaPrompts.js +312 -313
  90. package/dist/importador.part01.d.ts +1 -1
  91. package/dist/importador.part06.d.ts +2 -0
  92. package/dist/importador.part06.js +87 -1
  93. package/dist/importador.part09.js +7 -1
  94. package/dist/index.d.ts +4 -1
  95. package/dist/index.js +6 -25
  96. package/dist/index.part01.d.ts +20 -28
  97. package/dist/index.part01.js +16 -237
  98. package/dist/index.part02.js +36 -22
  99. package/dist/index.part03.d.ts +24 -2
  100. package/dist/index.part03.js +83 -19
  101. package/dist/index.part04.d.ts +10 -2
  102. package/dist/index.part04.js +152 -123
  103. package/dist/index.part05.js +80 -78
  104. package/dist/index.part06.js +34 -17
  105. package/dist/index.part07.d.ts +8 -2
  106. package/dist/index.part07.js +153 -7
  107. package/dist/index.part08.d.ts +1 -1
  108. package/dist/index.part08.js +25 -30
  109. package/dist/initCommand.d.ts +1 -0
  110. package/dist/initCommand.js +20 -4
  111. package/dist/initTemplatesBase.js +6 -4
  112. package/dist/pipelineConteudo/command.d.ts +1 -0
  113. package/dist/pipelineConteudo/command.js +9 -2
  114. package/dist/pipelineConteudo/help.d.ts +2 -0
  115. package/dist/pipelineConteudo/help.js +33 -0
  116. package/dist/profileAuthorCommand.js +3 -7
  117. package/dist/profileCommand.js +3 -7
  118. package/dist/projetoCarregar.js +35 -17
  119. package/dist/projetoCatalogo.d.ts +1 -0
  120. package/dist/projetoCatalogo.js +64 -25
  121. package/dist/projetoConfig.js +2 -0
  122. package/dist/projetoLegado.js +18 -0
  123. package/dist/projetoOrigens.d.ts +2 -0
  124. package/dist/projetoOrigens.js +65 -9
  125. package/dist/projetoTipos.d.ts +1 -0
  126. package/dist/resultadoCli.d.ts +20 -0
  127. package/dist/resultadoCli.js +57 -0
  128. package/dist/saidaCli.d.ts +35 -0
  129. package/dist/saidaCli.js +118 -0
  130. package/dist/sistemasInterativos/acceptanceEvidence.d.ts +22 -0
  131. package/dist/sistemasInterativos/acceptanceEvidence.js +345 -0
  132. package/dist/sistemasInterativos/engineObservation.d.ts +12 -0
  133. package/dist/sistemasInterativos/engineObservation.js +438 -0
  134. package/dist/sistemasInterativos/jobOrchestration.d.ts +2 -0
  135. package/dist/sistemasInterativos/jobOrchestration.js +204 -0
  136. package/dist/sistemasInterativos/operationPrimitives.d.ts +21 -0
  137. package/dist/sistemasInterativos/operationPrimitives.js +194 -0
  138. package/dist/sistemasInterativos/operations.d.ts +4 -39
  139. package/dist/sistemasInterativos/operations.js +5 -1164
  140. package/dist/skillCommand.d.ts +5 -0
  141. package/dist/skillCommand.js +88 -0
  142. package/dist/tipos.d.ts +1 -1
  143. package/dist/typescript-http-modelos.d.ts +1 -1
  144. package/dist/typescript-http-rotas.d.ts +1 -0
  145. package/dist/typescript-http-rotas.js +93 -0
  146. package/dist/typescript-http.d.ts +1 -1
  147. package/dist/typescript-http.js +1 -1
  148. package/dist/verificacaoCache.d.ts +25 -0
  149. package/dist/verificacaoCache.js +80 -0
  150. package/docs/README.md +34 -30
  151. package/docs/ai-integration.md +25 -12
  152. package/docs/ai-onboarding.md +37 -18
  153. package/docs/ai-workflow.md +9 -7
  154. package/docs/cli.md +125 -7
  155. package/docs/commands.md +41 -20
  156. package/docs/deploy.md +21 -8
  157. package/docs/descoberta-capacidades.md +106 -106
  158. package/docs/documentation.md +49 -39
  159. package/docs/drift-cache.md +108 -0
  160. package/docs/getting-started.md +43 -18
  161. package/docs/pipeline-conteudo.md +246 -246
  162. package/docs/profiles.md +54 -54
  163. package/docs/repositories.md +19 -2
  164. package/docs/rollback.md +15 -8
  165. package/docs/security.md +25 -3
  166. package/docs/sistemas-interativos.md +379 -374
  167. package/docs/syntax.md +14 -0
  168. package/docs/testing.md +139 -40
  169. package/exemplos/express_crud.sema +139 -0
  170. package/exemplos/fastify_crud.sema +146 -0
  171. package/exemplos/pipeline-conteudo/README.md +44 -44
  172. package/exemplos/pipeline-conteudo/alvos.json +23 -23
  173. package/exemplos/pipeline-conteudo/definicao.json +136 -136
  174. package/exemplos/profile_simulation.sema +211 -211
  175. package/exemplos/sistemas-interativos/README.md +100 -100
  176. package/exemplos/sistemas-interativos/advanced/acceptance-context-evaluate-valid.json +5 -5
  177. package/exemplos/sistemas-interativos/advanced/acceptance-lock-valid.json +16 -16
  178. package/exemplos/sistemas-interativos/advanced/asset-provenance-valid.json +32 -32
  179. package/exemplos/sistemas-interativos/advanced/autonomy-repair-valid.json +93 -93
  180. package/exemplos/sistemas-interativos/advanced/control-run-definition-valid.json +78 -78
  181. package/exemplos/sistemas-interativos/advanced/control-run-valid.json +27 -27
  182. package/exemplos/sistemas-interativos/advanced/distributed-workers-valid.json +79 -79
  183. package/exemplos/sistemas-interativos/advanced/editor-state-valid.json +42 -42
  184. package/exemplos/sistemas-interativos/advanced/engine-snapshot-after-valid.json +32 -32
  185. package/exemplos/sistemas-interativos/advanced/engine-snapshot-before-valid.json +23 -23
  186. package/exemplos/sistemas-interativos/advanced/job-orchestration-valid.json +39 -39
  187. package/exemplos/sistemas-interativos/advanced/multimodal-evidence-valid.json +46 -46
  188. package/exemplos/sistemas-interativos/advanced/multiplayer-authority-valid.json +39 -39
  189. package/exemplos/sistemas-interativos/advanced/playtest-fuzz-valid.json +37 -37
  190. package/exemplos/sistemas-interativos/advanced/portability-valid.json +104 -104
  191. package/exemplos/sistemas-interativos/advanced/temporal-evidence-valid.json +27 -27
  192. package/exemplos/sistemas-interativos/advanced/temporal-valid.json +118 -118
  193. package/exemplos/sistemas-interativos/experience-ir-valid.json +459 -459
  194. package/exemplos/sistemas-interativos/game-2d.json +83 -83
  195. package/exemplos/sistemas-interativos/game-3d-human.json +81 -81
  196. package/exemplos/sistemas-interativos/game-pixel-16-bit.json +97 -97
  197. package/exemplos/sistemas-interativos/game-pixel-8-bit.json +94 -94
  198. package/exemplos/sistemas-interativos/game-xr-human.json +80 -80
  199. package/exemplos/sistemas-interativos/hybrid-2-5d.json +108 -108
  200. package/exemplos/sistemas-interativos/protocol-mutating-rollback-valid.json +75 -75
  201. package/exemplos/sistemas-interativos/protocol-read-only-valid.json +58 -58
  202. package/exemplos/sistemas-interativos/simulation-2d-controlled.json +97 -97
  203. package/exemplos/sistemas-interativos/simulation-3d-calibrated-autonomous.json +141 -141
  204. package/exemplos/sistemas-interativos/simulation-headless-autonomous-batch.json +112 -112
  205. package/exemplos/sistemas-interativos/simulation-pixel-16-bit.json +103 -103
  206. package/exemplos/sistemas-interativos/simulation-text-controlled.json +95 -95
  207. package/node_modules/@sema/gerador-cpp/package.json +1 -1
  208. package/node_modules/@sema/gerador-dotnet/package.json +1 -1
  209. package/node_modules/@sema/gerador-lua/dist/index.js +51 -51
  210. package/node_modules/@sema/gerador-php/dist/index.js +113 -113
  211. package/node_modules/@sema/nucleo/dist/ir/conversor.part01.js +37 -38
  212. package/node_modules/@sema/nucleo/dist/ir/modelos.d.ts +1 -0
  213. package/node_modules/@sema/nucleo/dist/semantico/analisador.d.ts +1 -0
  214. package/node_modules/@sema/nucleo/dist/semantico/analisador.js +1 -0
  215. package/node_modules/@sema/nucleo/dist/semantico/analisador.part01.d.ts +7 -0
  216. package/node_modules/@sema/nucleo/dist/semantico/analisador.part01.js +33 -10
  217. package/package.json +9 -4
  218. package/scripts/postinstall.mjs +148 -0
  219. package/skills/sema/SKILL.md +199 -0
  220. package/skills/sema/agents/openai.yaml +4 -0
  221. package/dist/driftCache.d.ts +0 -49
  222. package/dist/driftCache.js +0 -311
  223. package/dist/driftCacheIncremental.d.ts +0 -98
  224. package/dist/driftCacheIncremental.js +0 -596
  225. package/dist/driftCatalogoPersistente.d.ts +0 -8
  226. package/dist/driftCatalogoPersistente.js +0 -77
  227. package/node_modules/@sema/gerador-cpp/dist/index.js.map +0 -1
  228. package/node_modules/@sema/gerador-css/dist/index.js.map +0 -1
  229. package/node_modules/@sema/gerador-css/dist/index.part01.js.map +0 -1
  230. package/node_modules/@sema/gerador-css/dist/index.part02.js.map +0 -1
  231. package/node_modules/@sema/gerador-dart/dist/index.js.map +0 -1
  232. package/node_modules/@sema/gerador-dotnet/dist/index.js.map +0 -1
  233. package/node_modules/@sema/gerador-html/dist/index.js.map +0 -1
  234. package/node_modules/@sema/gerador-javascript/dist/index.js.map +0 -1
  235. package/node_modules/@sema/gerador-lua/dist/index.js.map +0 -1
  236. package/node_modules/@sema/gerador-php/dist/index.js.map +0 -1
  237. package/node_modules/@sema/gerador-python/dist/index.js.map +0 -1
  238. package/node_modules/@sema/gerador-python/dist/index.part01.js.map +0 -1
  239. package/node_modules/@sema/gerador-python/dist/index.part02.js.map +0 -1
  240. package/node_modules/@sema/gerador-typescript/dist/index.js.map +0 -1
  241. package/node_modules/@sema/gerador-typescript/dist/index.part01.js.map +0 -1
  242. package/node_modules/@sema/gerador-typescript/dist/index.part02.js.map +0 -1
  243. package/node_modules/@sema/gerador-typescript/dist/index.part03.js.map +0 -1
  244. package/node_modules/@sema/nucleo/dist/ast/tipos.js.map +0 -1
  245. package/node_modules/@sema/nucleo/dist/diagnosticos/index.js.map +0 -1
  246. package/node_modules/@sema/nucleo/dist/diagnosticos/melhorador.js.map +0 -1
  247. package/node_modules/@sema/nucleo/dist/diagnosticos/snippets.js.map +0 -1
  248. package/node_modules/@sema/nucleo/dist/formatador/index.js.map +0 -1
  249. package/node_modules/@sema/nucleo/dist/formatador/index.part01.js.map +0 -1
  250. package/node_modules/@sema/nucleo/dist/formatador/index.part02.js.map +0 -1
  251. package/node_modules/@sema/nucleo/dist/index.js.map +0 -1
  252. package/node_modules/@sema/nucleo/dist/ir/conversor.js.map +0 -1
  253. package/node_modules/@sema/nucleo/dist/ir/conversor.part01.js.map +0 -1
  254. package/node_modules/@sema/nucleo/dist/ir/conversor.part02.js.map +0 -1
  255. package/node_modules/@sema/nucleo/dist/ir/conversor.part03.js.map +0 -1
  256. package/node_modules/@sema/nucleo/dist/ir/modelos.js.map +0 -1
  257. package/node_modules/@sema/nucleo/dist/lexer/lexer.js.map +0 -1
  258. package/node_modules/@sema/nucleo/dist/lexer/tokens.js.map +0 -1
  259. package/node_modules/@sema/nucleo/dist/parser/parser.declaracoes.js.map +0 -1
  260. package/node_modules/@sema/nucleo/dist/parser/parser.js.map +0 -1
  261. package/node_modules/@sema/nucleo/dist/parser/parser.modulo.js.map +0 -1
  262. package/node_modules/@sema/nucleo/dist/parser/parser.part01.js.map +0 -1
  263. package/node_modules/@sema/nucleo/dist/parser/parser.part02.js.map +0 -1
  264. package/node_modules/@sema/nucleo/dist/parser/parser.part03.js.map +0 -1
  265. package/node_modules/@sema/nucleo/dist/persistencia/contratos.js.map +0 -1
  266. package/node_modules/@sema/nucleo/dist/semantico/analisador.js.map +0 -1
  267. package/node_modules/@sema/nucleo/dist/semantico/analisador.part01.js.map +0 -1
  268. package/node_modules/@sema/nucleo/dist/semantico/analisador.part02.js.map +0 -1
  269. package/node_modules/@sema/nucleo/dist/semantico/analisador.part03.js.map +0 -1
  270. package/node_modules/@sema/nucleo/dist/semantico/analisador.part04.js.map +0 -1
  271. package/node_modules/@sema/nucleo/dist/semantico/analisador.part05.js.map +0 -1
  272. package/node_modules/@sema/nucleo/dist/semantico/analisador.part06.js.map +0 -1
  273. package/node_modules/@sema/nucleo/dist/semantico/analisador.part07.js.map +0 -1
  274. package/node_modules/@sema/nucleo/dist/semantico/analisador.part08.js.map +0 -1
  275. package/node_modules/@sema/nucleo/dist/semantico/estruturas.js.map +0 -1
  276. package/node_modules/@sema/nucleo/dist/semantico/estruturas.part01.js.map +0 -1
  277. package/node_modules/@sema/nucleo/dist/semantico/estruturas.part02.js.map +0 -1
  278. package/node_modules/@sema/nucleo/dist/semantico/orcamentoSemantico.js.map +0 -1
  279. package/node_modules/@sema/nucleo/dist/semantico/seguranca.js.map +0 -1
  280. package/node_modules/@sema/nucleo/dist/util/arquivos.js.map +0 -1
  281. package/node_modules/@sema/padroes/dist/index.js.map +0 -1
@@ -1,6 +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 { CatalogoDrift } from "./driftCatalogo.js";
3
+ import { type AdaptadorLeituraCompartilhadaDrift } from "./drift.part04.js";
4
4
  export declare function registrarRepositorioPersistenciaDrift(repositorios: Map<string, RegistroRepositorioPersistenciaDrift>, origem: OrigemRecursoDrift, recurso: string, arquivo: string): void;
5
5
  export declare function extrairColunasSqlDetalhadas(arquivo: string, codigo: string): RegistroColunaPersistenciaDrift[];
6
6
  export declare function extrairColunasPrismaDetalhadas(arquivo: string, codigo: string): RegistroColunaPersistenciaDrift[];
@@ -8,7 +8,7 @@ export declare function extrairCamposMongoDetalhados(arquivo: string, codigo: st
8
8
  export declare function extrairCamposRedisDetalhados(arquivo: string, codigo: string): RegistroColunaPersistenciaDrift[];
9
9
  export declare function extrairCamposArquivoLocalDetalhados(arquivo: string, codigo: string): RegistroColunaPersistenciaDrift[];
10
10
  export declare function registrarRepositoriosPorRecursos(repositorios: Map<string, RegistroRepositorioPersistenciaDrift>, arquivo: string, codigo: string, recursos: RecursoResolvido[]): void;
11
- export declare function indexarPersistenciaDetalhada(diretorios: string[], catalogo?: CatalogoDrift): Promise<{
11
+ export declare function indexarPersistenciaDetalhada(diretorios: string[], adaptadorLeitura?: AdaptadorLeituraCompartilhadaDrift): Promise<{
12
12
  colunas: RegistroColunaPersistenciaDrift[];
13
13
  repositorios: RegistroRepositorioPersistenciaDrift[];
14
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,39 +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, catalogo) {
176
- catalogo?.emitir("extractor.run");
175
+ export async function indexarPersistenciaDetalhada(diretorios, adaptadorLeitura) {
176
+ adaptadorLeitura?.emitir?.("extractor.run");
177
177
  const colunas = new Map();
178
178
  const repositorios = new Map();
179
- for (const diretorio of diretorios) {
179
+ const arquivosUnicos = new Map();
180
+ for (const diretorio of deduplicarRaizesSobrepostasDrift(diretorios)) {
180
181
  const arquivos = await listarArquivosRecursivos(diretorio, [
181
182
  ".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs",
182
183
  ".py", ".dart", ".lua", ".cs", ".java", ".go", ".rs", ".cpp", ".cc", ".cxx", ".hpp", ".h", ".php",
183
184
  ".sql", ".psql", ".ddl", ".prisma",
184
- ], catalogo);
185
+ ], adaptadorLeitura);
185
186
  for (const arquivo of arquivos) {
186
- const codigo = catalogo ? await catalogo.lerTexto(arquivo) : await readFile(arquivo, "utf8");
187
- const recursos = arquivo.endsWith(".prisma")
188
- ? extrairRecursosPrisma(arquivo, codigo)
189
- : extrairRecursosPersistenciaCodigoVivo(arquivo, codigo);
190
- for (const coluna of extrairColunasSqlDetalhadas(arquivo, codigo)) {
191
- 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);
192
190
  }
193
- for (const coluna of extrairColunasPrismaDetalhadas(arquivo, codigo)) {
194
- registrarColunaPersistenciaDrift(colunas, coluna.origem, coluna.recurso, coluna.coluna, coluna.arquivo);
195
- }
196
- for (const coluna of extrairCamposMongoDetalhados(arquivo, codigo)) {
197
- registrarColunaPersistenciaDrift(colunas, coluna.origem, coluna.recurso, coluna.coluna, coluna.arquivo);
198
- }
199
- for (const coluna of extrairCamposRedisDetalhados(arquivo, codigo)) {
200
- registrarColunaPersistenciaDrift(colunas, coluna.origem, coluna.recurso, coluna.coluna, coluna.arquivo);
201
- }
202
- for (const coluna of extrairCamposArquivoLocalDetalhados(arquivo, codigo)) {
203
- registrarColunaPersistenciaDrift(colunas, coluna.origem, coluna.recurso, coluna.coluna, coluna.arquivo);
204
- }
205
- registrarRepositoriosPorRecursos(repositorios, arquivo, codigo, recursos);
206
191
  }
207
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
+ }
208
217
  return {
209
218
  colunas: [...colunas.values()],
210
219
  repositorios: [...repositorios.values()],
@@ -5,7 +5,7 @@ import { OpcoesDriftLegado, OrigemCodigoDrift, RecursoResolvido, RegistroPersist
5
5
  import { indexarPersistenciaDetalhada } from "./drift.part08.js";
6
6
  export declare function analisarPersistenciaReal(contexto: ContextoProjetoCarregado, mapaRecursos?: Map<string, RecursoResolvido[]>, detalhesPersistencia?: Awaited<ReturnType<typeof indexarPersistenciaDetalhada>>, opcoes?: OpcoesDriftLegado, mapaImpl?: Map<string, SimboloResolvido>): Promise<RegistroPersistenciaRealDrift[]>;
7
7
  export declare function normalizarCaminhoRota(caminho?: string): string;
8
- export declare function extrairFontesHttpTypeScript(fontesLegado: FonteLegado[]): Array<"nestjs" | "nextjs" | "firebase">;
8
+ export declare function extrairFontesHttpTypeScript(fontesLegado: FonteLegado[]): Array<"nestjs" | "nextjs" | "firebase" | "express" | "fastify">;
9
9
  export declare function extrairFontesHttpBackend(fontesLegado: FonteLegado[]): Array<"dotnet" | "java" | "go" | "rust" | "php">;
10
10
  export declare function ultimoSegmentoSimbolico(caminho: string): string;
11
11
  export declare function pontuarCandidatoDeclarado(candidato: SimboloResolvido, origem: OrigemCodigoDrift, caminhoDeclarado: string): SimboloCandidatoDrift | undefined;
@@ -14,7 +14,7 @@ export declare function deduplicarCandidatos(candidatos: SimboloCandidatoDrift[]
14
14
  export declare function ordenarCandidatos(candidatos: SimboloCandidatoDrift[]): SimboloCandidatoDrift[];
15
15
  export declare function sugerirCandidatosParaImpl(simbolos: SimboloResolvido[], origem: OrigemCodigoDrift, caminhoDeclarado: string): SimboloCandidatoDrift[];
16
16
  export declare function sugerirCandidatosParaTaskSemImpl(simbolos: SimboloResolvido[], nomeTask: string): SimboloCandidatoDrift[];
17
- export declare function escolherRotasEsperadas(task: IrTask, fontesLegado: FonteLegado[]): Array<"nestjs" | "fastapi" | "flask" | "nextjs" | "firebase" | "dotnet" | "java" | "go" | "rust" | "php">;
17
+ export declare function escolherRotasEsperadas(task: IrTask, fontesLegado: FonteLegado[]): Array<"nestjs" | "express" | "fastify" | "fastapi" | "flask" | "nextjs" | "firebase" | "dotnet" | "java" | "go" | "rust" | "php">;
18
18
  export declare function taskEhBridgeFirebase(task: IrTask): boolean;
19
19
  export declare function tiposAceitosParaRecursoPersistencia(recurso: IrRecursoPersistencia): TipoRecursoDrift[];
20
20
  export declare function nomesRecursoPersistencia(recurso: IrRecursoPersistencia): string[];
@@ -80,13 +80,14 @@ export function normalizarCaminhoRota(caminho) {
80
80
  if (!caminho) {
81
81
  return "/";
82
82
  }
83
- const limpo = normalizarCaminhoFlask(caminho.trim().replace(/\s*\/\s*/g, "/"));
83
+ const limpo = normalizarCaminhoFlask(caminho.trim().replace(/\s*\/\s*/g, "/"))
84
+ .replace(/:([A-Za-z_]\w*)/g, "{$1}");
84
85
  const comBarra = limpo.startsWith("/") ? limpo : `/${limpo}`;
85
86
  const normalizado = comBarra.replace(/\/+/g, "/");
86
87
  return normalizado.endsWith("/") && normalizado !== "/" ? normalizado.slice(0, -1) : normalizado;
87
88
  }
88
89
  export function extrairFontesHttpTypeScript(fontesLegado) {
89
- return fontesLegado.filter((fonte) => fonte === "nestjs" || fonte === "nextjs" || fonte === "firebase");
90
+ return fontesLegado.filter((fonte) => fonte === "nestjs" || fonte === "nextjs" || fonte === "firebase" || fonte === "express" || fonte === "fastify");
90
91
  }
91
92
  export function extrairFontesHttpBackend(fontesLegado) {
92
93
  return fontesLegado.filter((fonte) => fonte === "dotnet" || fonte === "java" || fonte === "go" || fonte === "rust" || fonte === "php");
@@ -227,13 +228,19 @@ export function escolherRotasEsperadas(task, fontesLegado) {
227
228
  if (fontesTs.includes("firebase") && /(apps\.worker|worker|sema_contract_bridge|health)/i.test(implTsOuJs.caminho)) {
228
229
  esperadas.add("firebase");
229
230
  }
231
+ if (/\bexpress\b|\broutes?\b|\brouter\b/i.test(implTsOuJs.caminho) && fontesTs.includes("express")) {
232
+ esperadas.add("express");
233
+ }
234
+ if (/\bfastify\b/i.test(implTsOuJs.caminho) && fontesTs.includes("fastify")) {
235
+ esperadas.add("fastify");
236
+ }
230
237
  if (esperadas.size > 0) {
231
238
  return [...esperadas];
232
239
  }
233
240
  if (fontesTs.length > 0) {
234
241
  return fontesTs;
235
242
  }
236
- return ["nestjs", "nextjs", "firebase"];
243
+ return ["nestjs", "nextjs", "firebase", "express", "fastify"];
237
244
  }
238
245
  if (task.implementacoesExternas.some((impl) => impl.origem === "py")) {
239
246
  const fontesPython = fontesLegado.filter((fonte) => fonte === "fastapi" || fonte === "flask");
@@ -1,16 +1,124 @@
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 { resolverAlvoPadrao, resolverEstruturaSaidaPadrao, resolverFrameworkPadrao } from "./projeto.js";
4
5
  import { emitirDiagnosticosArquivosOrcamento, workspaceExigeCabecalhoCodigoGovernado, } from "./driftOrcamento.js";
5
6
  import { definirDiretoriosIgnoradosAtivos, obterDiretoriosIgnoradosAtivos, extrairTermosEscopoDrift, resolverDiretoriosIgnoradosAtivos, resolverOpcoesDrift } from "./drift.part01.js";
6
7
  import { construirContextoRelevanciaConsumer, filtrarConsumerSurfacesPorEscopo } from "./drift.part02.js";
7
8
  import { inferirConsumerFrameworkPrincipal } from "./drift.part06.js";
8
- import { calcularConfiancaTask, calcularRiscoOperacional, calcularScoreTask, resumirLacunasTask, resumirOperacional } from "./drift.part04.js";
9
- import { analisarPersistenciaReal } from "./drift.part09.js";
9
+ import { calcularConfiancaTask, calcularRiscoOperacional, calcularScoreTask, carregarEvidenciaVerificacaoDrift, chaveCaminhoCanonicoDrift, encontrarCandidatosFisicosImplementacaoDrift, resumirLacunasTask, resumirOperacional } from "./drift.part04.js";
10
+ import { analisarPersistenciaReal, ordenarCandidatos } from "./drift.part09.js";
10
11
  import { simboloEhBridgeConsumer } from "./drift.part05.js";
11
12
  import { prepararIndicesDrift } from "./drift.part13.js";
12
13
  import { analisarModulosSelecionadosDrift } from "./drift.part14.js";
13
14
  import { resolverPoliticaPontuacaoSemantica } from "./driftScore.js";
15
+ function arquivosVinculadosFisicamenteDrift(contexto, modulo, task) {
16
+ const arquivos = new Set();
17
+ for (const vinculo of [...modulo.vinculos, ...task.vinculos]) {
18
+ const arquivo = vinculo.arquivo
19
+ ?? (vinculo.tipo === "arquivo" ? vinculo.valor : undefined);
20
+ if (arquivo) {
21
+ arquivos.add(chaveCaminhoCanonicoDrift(path.resolve(contexto.baseProjeto, arquivo)));
22
+ }
23
+ }
24
+ return arquivos;
25
+ }
26
+ function prepararMapaImplementacoesHonestoDrift(contexto, mapaImpl, todosSimbolos) {
27
+ const mapaImplHonesto = new Map(mapaImpl);
28
+ const usosPorOrigemECaminho = new Map();
29
+ for (const item of contexto.modulosSelecionados) {
30
+ const ir = item.resultado.ir;
31
+ if (!ir) {
32
+ continue;
33
+ }
34
+ for (const task of ir.tasks) {
35
+ const arquivosVinculados = arquivosVinculadosFisicamenteDrift(contexto, ir, task);
36
+ for (const impl of task.implementacoesExternas) {
37
+ const candidatos = encontrarCandidatosFisicosImplementacaoDrift(todosSimbolos, impl.origem, impl.caminho);
38
+ const candidatosVinculados = candidatos.filter((candidato) => arquivosVinculados.has(chaveCaminhoCanonicoDrift(candidato.arquivo)));
39
+ const resolvido = candidatos.length === 1
40
+ ? candidatos[0]
41
+ : candidatosVinculados.length === 1
42
+ ? candidatosVinculados[0]
43
+ : undefined;
44
+ const uso = {
45
+ modulo: ir.nome,
46
+ task: task.nome,
47
+ origem: impl.origem,
48
+ caminho: impl.caminho,
49
+ implementacao: impl,
50
+ candidatos,
51
+ resolvido,
52
+ ambiguo: candidatos.length > 1 && candidatosVinculados.length !== 1,
53
+ };
54
+ const chaveGrupo = `${impl.origem}\u0000${impl.caminho}`;
55
+ const usos = usosPorOrigemECaminho.get(chaveGrupo) ?? [];
56
+ usos.push(uso);
57
+ usosPorOrigemECaminho.set(chaveGrupo, usos);
58
+ }
59
+ }
60
+ }
61
+ const ambiguidades = [];
62
+ const gruposPorCaminho = new Map();
63
+ for (const usos of usosPorOrigemECaminho.values()) {
64
+ const caminho = usos[0].caminho;
65
+ const resolvidos = new Map();
66
+ for (const uso of usos) {
67
+ if (uso.resolvido) {
68
+ resolvidos.set(chaveCaminhoCanonicoDrift(uso.resolvido.arquivo), uso.resolvido);
69
+ }
70
+ }
71
+ const conflitoEntreUsos = resolvidos.size > 1;
72
+ const deveFalharFechado = usos.some((uso) => uso.ambiguo || !uso.resolvido)
73
+ || conflitoEntreUsos;
74
+ if (deveFalharFechado && (usos.some((uso) => uso.ambiguo) || conflitoEntreUsos)) {
75
+ const candidatosDoGrupo = [...new Map(usos.flatMap((uso) => uso.candidatos).map((candidato) => [
76
+ chaveCaminhoCanonicoDrift(candidato.arquivo),
77
+ candidato,
78
+ ])).values()];
79
+ for (const uso of usos) {
80
+ ambiguidades.push({
81
+ ...uso,
82
+ candidatos: uso.candidatos.length > 1 ? uso.candidatos : candidatosDoGrupo,
83
+ ambiguo: true,
84
+ });
85
+ }
86
+ }
87
+ const grupos = gruposPorCaminho.get(caminho) ?? [];
88
+ grupos.push({
89
+ usos,
90
+ resolvido: deveFalharFechado ? undefined : resolvidos.values().next().value,
91
+ });
92
+ gruposPorCaminho.set(caminho, grupos);
93
+ }
94
+ const substituicoesCaminho = [];
95
+ let sequenciaCaminhoTemporario = 0;
96
+ for (const [caminho, grupos] of gruposPorCaminho) {
97
+ mapaImplHonesto.delete(caminho);
98
+ const gruposResolvidos = grupos.filter((grupo) => grupo.resolvido);
99
+ const resolucoesDistintas = new Map();
100
+ for (const grupo of gruposResolvidos) {
101
+ const resolvido = grupo.resolvido;
102
+ resolucoesDistintas.set(`${resolvido.origem}:${chaveCaminhoCanonicoDrift(resolvido.arquivo)}:${resolvido.caminho}`, resolvido);
103
+ }
104
+ if (gruposResolvidos.length === grupos.length && resolucoesDistintas.size === 1) {
105
+ mapaImplHonesto.set(caminho, resolucoesDistintas.values().next().value);
106
+ continue;
107
+ }
108
+ for (const grupo of gruposResolvidos) {
109
+ for (const uso of grupo.usos) {
110
+ const temporario = `__sema_impl_${sequenciaCaminhoTemporario++}`;
111
+ mapaImplHonesto.set(temporario, uso.resolvido);
112
+ substituicoesCaminho.push({
113
+ implementacao: uso.implementacao,
114
+ original: uso.caminho,
115
+ temporario,
116
+ });
117
+ }
118
+ }
119
+ }
120
+ return { mapaImplHonesto, ambiguidades, substituicoesCaminho };
121
+ }
14
122
  export async function analisarDriftLegado(contexto, opcoes) {
15
123
  const opcoesResolvidas = resolverOpcoesDrift(opcoes);
16
124
  const configuracaoEscopo = {
@@ -23,14 +131,16 @@ export async function analisarDriftLegado(contexto, opcoes) {
23
131
  definirDiretoriosIgnoradosAtivos(resolverDiretoriosIgnoradosAtivos(opcoesResolvidas));
24
132
  try {
25
133
  const indicesPreparados = await prepararIndicesDrift(contexto, configuracaoEscopo, {
26
- politicaCache: opcoesResolvidas.cache,
27
134
  observador: opcoesResolvidas.observador,
135
+ modoCache: opcoesResolvidas.modoCache,
136
+ avisosModoCache: opcoesResolvidas.avisosModoCache,
28
137
  });
29
- const { arquivosOrcamentoAvaliados, detalhesPersistencia, diagnosticosOrcamento: diagnosticosOrcamentoPrecalculados, indexDart, indexTs, mapaImpl, mapaRecursos, todasRotasIndexadas, todosArquivosConhecidos, todosRecursos, todosSimbolos, planoEscopo, cache: estadoCache, catalogo: metricasCatalogo, } = indicesPreparados;
30
- const leitorArquivosPlanejados = indicesPreparados.leitorArquivosPlanejados;
138
+ const { detalhesPersistencia, indexDart, indexTs, mapaImpl, mapaRecursos, todasRotasIndexadas, todosArquivosConhecidos, todosRecursos, todosSimbolos, planoEscopo, cache: estadoCache, catalogo: metricasCatalogo, leitorArquivosPlanejados, } = indicesPreparados;
31
139
  const relativoEscopo = (arquivo) => {
32
140
  const relativo = path.relative(contexto.baseProjeto, arquivo).replace(/\\/g, "/");
33
- return relativo && !relativo.startsWith("../") ? relativo : arquivo.replace(/\\/g, "/");
141
+ return relativo && !relativo.startsWith("../")
142
+ ? relativo
143
+ : arquivo.replace(/\\/g, "/");
34
144
  };
35
145
  configuracaoEscopo.estrategia = planoEscopo.estrategia;
36
146
  configuracaoEscopo.cobertura = planoEscopo.cobertura;
@@ -38,9 +148,11 @@ export async function analisarDriftLegado(contexto, opcoes) {
38
148
  configuracaoEscopo.arquivosDeclarados = planoEscopo.arquivosDeclarados.map(relativoEscopo);
39
149
  configuracaoEscopo.arquivosInferidos = planoEscopo.arquivosInferidos.map(relativoEscopo);
40
150
  configuracaoEscopo.arquivosAusentes = planoEscopo.arquivosAusentes.map(relativoEscopo);
41
- configuracaoEscopo.bloqueios = [...planoEscopo.bloqueios];
42
- configuracaoEscopo.cache = estadoCache;
151
+ const bloqueiosAnalise = new Set(planoEscopo.bloqueios);
152
+ configuracaoEscopo.bloqueios = [...bloqueiosAnalise];
43
153
  configuracaoEscopo.catalogo = metricasCatalogo;
154
+ configuracaoEscopo.cache = estadoCache;
155
+ const { mapaImplHonesto, ambiguidades, substituicoesCaminho } = prepararMapaImplementacoesHonestoDrift(contexto, mapaImpl, todosSimbolos);
44
156
  const implsValidos = [];
45
157
  const implsQuebrados = [];
46
158
  const vinculosValidos = [];
@@ -49,12 +161,41 @@ export async function analisarDriftLegado(contexto, opcoes) {
49
161
  const recursosValidos = [];
50
162
  const recursosDivergentes = [];
51
163
  const diagnosticos = [];
164
+ const moduloDiagnostico = contexto.modulosSelecionados[0]?.resultado.ir?.nome
165
+ ?? contexto.modulosSelecionados[0]?.resultado.modulo?.nome
166
+ ?? "projeto";
167
+ for (const arquivoAusente of planoEscopo.arquivosAusentes) {
168
+ const arquivo = relativoEscopo(arquivoAusente);
169
+ diagnosticos.push({
170
+ tipo: "vinculo_quebrado",
171
+ modulo: moduloDiagnostico,
172
+ arquivo,
173
+ severidade: "erro",
174
+ mensagem: `O arquivo planejado "${arquivo}" não existe no workspace; a cobertura do drift ficou parcial.`,
175
+ });
176
+ }
177
+ if (planoEscopo.cobertura === "parcial" && planoEscopo.arquivosAusentes.length === 0) {
178
+ diagnosticos.push({
179
+ tipo: "vinculo_quebrado",
180
+ modulo: moduloDiagnostico,
181
+ severidade: "erro",
182
+ mensagem: "A cobertura do drift ficou parcial e não permite declarar a análise como bem-sucedida.",
183
+ });
184
+ }
52
185
  if (planoEscopo.bloqueios.includes("escopo_estreito_sem_vinculos")) {
53
186
  diagnosticos.push({
54
187
  tipo: "escopo_estreito_sem_vinculos",
55
- modulo: contexto.modulosSelecionados[0]?.resultado.ir?.nome ?? "projeto",
188
+ modulo: moduloDiagnostico,
189
+ severidade: "erro",
190
+ mensagem: "Escopo de arquivo ou módulo sem arquivo vinculado nem implementação resolvível. Declare `vinculos { arquivo: ... }` ou execute explicitamente com `--escopo projeto`.",
191
+ });
192
+ }
193
+ if (planoEscopo.bloqueios.includes("escopo_estreito_ambiguo")) {
194
+ diagnosticos.push({
195
+ tipo: "escopo_estreito_ambiguo",
196
+ modulo: moduloDiagnostico,
56
197
  severidade: "erro",
57
- mensagem: "Escopo arquivo/modulo sem arquivo vinculado ou implementação resolvível. Declare vinculos { arquivo: ... } ou execute explicitamente com --escopo projeto.",
198
+ mensagem: "Mais de um arquivo pode implementar o mesmo símbolo. Declare um vínculo de arquivo inequívoco antes do drift.",
58
199
  });
59
200
  }
60
201
  const tasksResumo = [];
@@ -62,28 +203,97 @@ export async function analisarDriftLegado(contexto, opcoes) {
62
203
  const guardrailsPorTask = new Map();
63
204
  const resumoVinculosPorTask = new Map();
64
205
  const arquivosAncoraHerdadosPorTask = new Map();
65
- analisarModulosSelecionadosDrift({
66
- contexto,
67
- mapaImpl,
68
- todosSimbolos,
69
- mapaRecursos,
70
- todosRecursos,
71
- todasRotasIndexadas,
72
- todosArquivosConhecidos,
73
- implsValidos,
74
- implsQuebrados,
75
- vinculosValidos,
76
- vinculosQuebrados,
77
- rotasDivergentes,
78
- recursosValidos,
79
- recursosDivergentes,
80
- diagnosticos,
81
- tasksResumo,
82
- taskPorChave,
83
- guardrailsPorTask,
84
- resumoVinculosPorTask,
85
- arquivosAncoraHerdadosPorTask,
86
- });
206
+ // O analisador legado consulta implementações apenas pelo caminho. Chaves efêmeras
207
+ // mantêm resoluções de origens distintas isoladas durante essa chamada e são restauradas logo depois.
208
+ for (const substituicao of substituicoesCaminho) {
209
+ substituicao.implementacao.caminho = substituicao.temporario;
210
+ }
211
+ try {
212
+ analisarModulosSelecionadosDrift({
213
+ contexto,
214
+ mapaImpl: mapaImplHonesto,
215
+ todosSimbolos,
216
+ mapaRecursos,
217
+ todosRecursos,
218
+ todasRotasIndexadas,
219
+ todosArquivosConhecidos,
220
+ implsValidos,
221
+ implsQuebrados,
222
+ vinculosValidos,
223
+ vinculosQuebrados,
224
+ rotasDivergentes,
225
+ recursosValidos,
226
+ recursosDivergentes,
227
+ diagnosticos,
228
+ tasksResumo,
229
+ taskPorChave,
230
+ guardrailsPorTask,
231
+ resumoVinculosPorTask,
232
+ arquivosAncoraHerdadosPorTask,
233
+ });
234
+ }
235
+ finally {
236
+ for (const substituicao of substituicoesCaminho) {
237
+ substituicao.implementacao.caminho = substituicao.original;
238
+ }
239
+ }
240
+ const caminhoOriginalPorTemporario = new Map(substituicoesCaminho.map((substituicao) => [substituicao.temporario, substituicao.original]));
241
+ for (const registro of [...implsValidos, ...implsQuebrados]) {
242
+ registro.caminho = caminhoOriginalPorTemporario.get(registro.caminho) ?? registro.caminho;
243
+ }
244
+ for (const ambiguidade of ambiguidades) {
245
+ const candidatos = ambiguidade.candidatos.map((candidato) => ({
246
+ origem: candidato.origem,
247
+ caminho: candidato.caminho,
248
+ arquivo: candidato.arquivo,
249
+ simbolo: candidato.simbolo,
250
+ confianca: "alta",
251
+ motivo: `Arquivo físico candidato à implementação ambígua "${ambiguidade.origem}:${ambiguidade.caminho}".`,
252
+ }));
253
+ const registro = implsQuebrados.find((impl) => impl.modulo === ambiguidade.modulo
254
+ && impl.task === ambiguidade.task
255
+ && impl.origem === ambiguidade.origem
256
+ && impl.caminho === ambiguidade.caminho);
257
+ if (registro) {
258
+ registro.candidatos = candidatos;
259
+ }
260
+ const resumo = tasksResumo.find((task) => task.modulo === ambiguidade.modulo && task.task === ambiguidade.task);
261
+ if (resumo) {
262
+ const arquivosCandidatos = new Set(candidatos.map((candidato) => chaveCaminhoCanonicoDrift(candidato.arquivo)));
263
+ const candidatosRestantes = resumo.candidatosImpl.filter((candidato) => !arquivosCandidatos.has(chaveCaminhoCanonicoDrift(candidato.arquivo)));
264
+ resumo.candidatosImpl = [
265
+ ...candidatos,
266
+ ...ordenarCandidatos(candidatosRestantes),
267
+ ].slice(0, 5);
268
+ }
269
+ diagnosticos.push({
270
+ tipo: "escopo_estreito_ambiguo",
271
+ modulo: ambiguidade.modulo,
272
+ task: ambiguidade.task,
273
+ severidade: "erro",
274
+ 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.`,
275
+ });
276
+ bloqueiosAnalise.add("escopo_estreito_ambiguo");
277
+ }
278
+ configuracaoEscopo.bloqueios = [...bloqueiosAnalise];
279
+ const evidenciaPorModulo = new Map();
280
+ for (const item of contexto.modulosSelecionados) {
281
+ const nomeModulo = item.resultado.ir?.nome;
282
+ if (!nomeModulo) {
283
+ continue;
284
+ }
285
+ const frameworkVerificacao = resolverFrameworkPadrao(undefined, contexto.configCarregada);
286
+ const evidencia = await carregarEvidenciaVerificacaoDrift({
287
+ caminhoContrato: item.caminho,
288
+ nomeModulo,
289
+ alvo: resolverAlvoPadrao(undefined, contexto.configCarregada),
290
+ framework: frameworkVerificacao,
291
+ estrutura: resolverEstruturaSaidaPadrao(undefined, frameworkVerificacao, contexto.configCarregada),
292
+ });
293
+ if (evidencia) {
294
+ evidenciaPorModulo.set(nomeModulo, evidencia);
295
+ }
296
+ }
87
297
  for (const resumo of tasksResumo) {
88
298
  const chaveTask = `${resumo.modulo}:${resumo.task}`;
89
299
  const task = taskPorChave.get(chaveTask);
@@ -113,8 +323,10 @@ export async function analisarDriftLegado(contexto, opcoes) {
113
323
  }
114
324
  resumo.confiancaVinculo = calcularConfiancaTask(task, resumo.implsValidos, resumo.implsQuebrados, resumoVinculos.validos, resumoVinculos.quebrados);
115
325
  resumo.riscoOperacional = calcularRiscoOperacional(task);
116
- resumo.lacunas = resumirLacunasTask(task, resumo.semImplementacao, resumo.implsQuebrados, resumoVinculos.quebrados, guardrails);
117
- resumo.scoreSemantico = calcularScoreTask(task, resumo.implsValidos, resumo.implsQuebrados, resumoVinculos.validos, resumoVinculos.quebrados, resumo.semImplementacao);
326
+ const evidenciaVerificada = evidenciaPorModulo.get(resumo.modulo);
327
+ resumo.lacunas = resumirLacunasTask(task, resumo.semImplementacao, resumo.implsQuebrados, resumoVinculos.quebrados, guardrails, evidenciaVerificada);
328
+ resumo.scoreSemantico = calcularScoreTask(task, resumo.implsValidos, resumo.implsQuebrados, resumoVinculos.validos, resumoVinculos.quebrados, resumo.semImplementacao, evidenciaVerificada);
329
+ resumo.evidenciaVerificacao = evidenciaVerificada;
118
330
  resumo.ancoragemVinculo = task.vinculos.length > 0
119
331
  ? "propria"
120
332
  : arquivosAncoraHerdados.length > 0
@@ -230,7 +442,7 @@ export async function analisarDriftLegado(contexto, opcoes) {
230
442
  const appRoutes = [...new Set(consumerSurfaces.map((surface) => surface.rota))]
231
443
  .sort((a, b) => a.localeCompare(b, "pt-BR"));
232
444
  const consumerFramework = inferirConsumerFrameworkPrincipal(contexto.fontesLegado, consumerSurfaces, consumerBridges);
233
- const persistenciaReal = await analisarPersistenciaReal(contexto, mapaRecursos, detalhesPersistencia, opcoesResolvidas, mapaImpl);
445
+ const persistenciaReal = await analisarPersistenciaReal(contexto, mapaRecursos, detalhesPersistencia, opcoesResolvidas, mapaImplHonesto);
234
446
  for (const item of persistenciaReal) {
235
447
  if (item.status === "divergente") {
236
448
  diagnosticos.push({
@@ -284,42 +496,31 @@ export async function analisarDriftLegado(contexto, opcoes) {
284
496
  chaveArquivoOrcamento(modulo.caminho),
285
497
  modulo.codigo,
286
498
  ]));
287
- const arquivosPlanejados = new Set((planoEscopo.estrategia === "projeto"
288
- ? todosArquivosConhecidos
289
- : planoEscopo.arquivos).map(chaveArquivoOrcamento));
290
- const arquivosAvaliados = new Set(arquivosOrcamentoAvaliados.map(chaveArquivoOrcamento));
291
- const arquivosSolicitadosOrcamento = new Set([...arquivosOrcamento].map(chaveArquivoOrcamento));
292
499
  const leitorArquivosOrcamento = {
293
500
  contem: (arquivo) => {
294
501
  const chave = chaveArquivoOrcamento(arquivo);
295
- if (contratosJaCarregados.has(chave)) {
296
- return true;
297
- }
298
- return arquivosPlanejados.has(chave)
299
- && leitorArquivosPlanejados?.contem(arquivo) === true;
502
+ return contratosJaCarregados.has(chave)
503
+ || leitorArquivosPlanejados.contem(arquivo);
300
504
  },
301
505
  lerTexto: async (arquivo) => {
302
- const chave = chaveArquivoOrcamento(arquivo);
303
- const contrato = contratosJaCarregados.get(chave);
506
+ const contrato = contratosJaCarregados.get(chaveArquivoOrcamento(arquivo));
304
507
  if (contrato !== undefined) {
305
508
  return contrato;
306
509
  }
307
- if (!arquivosPlanejados.has(chave) || !leitorArquivosPlanejados?.contem(arquivo)) {
308
- throw new Error(`Arquivo fora do catalogo planejado do drift: ${arquivo}`);
510
+ if (!leitorArquivosPlanejados.contem(arquivo)) {
511
+ throw new Error(`Arquivo fora do catálogo planejado do drift: ${arquivo}`);
309
512
  }
310
513
  return leitorArquivosPlanejados.lerTexto(arquivo);
311
514
  },
312
515
  };
313
- const diagnosticosOrcamentoCalculadosAgora = await emitirDiagnosticosArquivosOrcamento({
516
+ const arquivosOrcamentoPlanejados = [...arquivosOrcamento]
517
+ .filter((arquivo) => leitorArquivosOrcamento.contem(arquivo));
518
+ const diagnosticosOrcamento = await emitirDiagnosticosArquivosOrcamento({
314
519
  baseProjeto: contexto.baseProjeto,
315
- arquivos: [...arquivosOrcamento].filter((arquivo) => !arquivosAvaliados.has(chaveArquivoOrcamento(arquivo))),
520
+ arquivos: arquivosOrcamentoPlanejados,
316
521
  exigirCabecalhoCodigoGovernado: exigeCabecalhoCodigoGovernado,
317
522
  leitorArquivos: leitorArquivosOrcamento,
318
523
  });
319
- const diagnosticosOrcamento = [
320
- ...diagnosticosOrcamentoPrecalculados.filter((diagnostico) => arquivosSolicitadosOrcamento.has(chaveArquivoOrcamento(diagnostico.arquivo))),
321
- ...diagnosticosOrcamentoCalculadosAgora,
322
- ];
323
524
  for (const diagnostico of diagnosticosOrcamento) {
324
525
  diagnosticos.push({
325
526
  tipo: diagnostico.tipo,
@@ -338,7 +539,9 @@ export async function analisarDriftLegado(contexto, opcoes) {
338
539
  && recursosDivergentes.length === 0
339
540
  && vinculosQuebrados.length === 0
340
541
  && persistenciaReal.every((item) => item.status !== "divergente" && item.compatibilidade !== "invalido")
341
- && planoEscopo.bloqueios.length === 0
542
+ && planoEscopo.cobertura === "completa"
543
+ && planoEscopo.arquivosAusentes.length === 0
544
+ && bloqueiosAnalise.size === 0
342
545
  && !possuiBloqueioOrcamento;
343
546
  const payloadBase = {
344
547
  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;