@semacode/cli 2.2.0 → 2.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (252) hide show
  1. package/LICENSE +39 -39
  2. package/README.md +251 -141
  3. package/dist/agentContext.d.ts +1 -1
  4. package/dist/agentContextPack.js +6 -1
  5. package/dist/agentContextTipos.d.ts +4 -2
  6. package/dist/agentContextTipos.js +7 -0
  7. package/dist/agentEntryPoints.js +551 -499
  8. package/dist/angular-consumer-standalone.d.ts +3 -1
  9. package/dist/angular-consumer-standalone.js +12 -8
  10. package/dist/comandos.js +4 -0
  11. package/dist/discovery/catalog.d.ts +11 -0
  12. package/dist/discovery/catalog.js +521 -0
  13. package/dist/discovery/command.d.ts +11 -0
  14. package/dist/discovery/command.js +226 -0
  15. package/dist/discovery/index.d.ts +5 -0
  16. package/dist/discovery/index.js +8 -0
  17. package/dist/discovery/ranker.d.ts +3 -0
  18. package/dist/discovery/ranker.js +310 -0
  19. package/dist/discovery/redaction.d.ts +2 -0
  20. package/dist/discovery/redaction.js +21 -0
  21. package/dist/discovery/render.d.ts +2 -0
  22. package/dist/discovery/render.js +100 -0
  23. package/dist/discovery/types.d.ts +119 -0
  24. package/dist/discovery/types.js +13 -0
  25. package/dist/drift.part01.d.ts +32 -2
  26. package/dist/drift.part01.js +2 -0
  27. package/dist/drift.part04.d.ts +3 -2
  28. package/dist/drift.part04.js +6 -3
  29. package/dist/drift.part05.d.ts +2 -1
  30. package/dist/drift.part05.js +4 -3
  31. package/dist/drift.part06.d.ts +2 -1
  32. package/dist/drift.part06.js +9 -5
  33. package/dist/drift.part07.d.ts +11 -10
  34. package/dist/drift.part07.js +40 -30
  35. package/dist/drift.part08.d.ts +2 -1
  36. package/dist/drift.part08.js +4 -3
  37. package/dist/drift.part11.js +71 -6
  38. package/dist/drift.part12.js +14 -1
  39. package/dist/drift.part13.d.ts +42 -7
  40. package/dist/drift.part13.js +660 -36
  41. package/dist/driftCache.d.ts +49 -0
  42. package/dist/driftCache.js +311 -0
  43. package/dist/driftCacheIncremental.d.ts +98 -0
  44. package/dist/driftCacheIncremental.js +596 -0
  45. package/dist/driftCatalogo.d.ts +91 -0
  46. package/dist/driftCatalogo.js +657 -0
  47. package/dist/driftCatalogoPersistente.d.ts +8 -0
  48. package/dist/driftCatalogoPersistente.js +77 -0
  49. package/dist/driftEscopo.d.ts +23 -0
  50. package/dist/driftEscopo.js +563 -0
  51. package/dist/driftEscopoReferencias.d.ts +4 -0
  52. package/dist/driftEscopoReferencias.js +265 -0
  53. package/dist/driftOrcamento.d.ts +12 -0
  54. package/dist/driftOrcamento.js +19 -3
  55. package/dist/execucoesExternas.js +5 -19
  56. package/dist/exemplosOficiais.js +29 -8
  57. package/dist/iaPrompts.d.ts +1 -1
  58. package/dist/iaPrompts.js +310 -307
  59. package/dist/index.d.ts +2 -0
  60. package/dist/index.js +23 -5
  61. package/dist/index.part01.d.ts +17 -2
  62. package/dist/index.part01.js +119 -8
  63. package/dist/index.part02.js +21 -21
  64. package/dist/index.part03.d.ts +2 -2
  65. package/dist/index.part03.js +14 -3
  66. package/dist/index.part04.d.ts +2 -2
  67. package/dist/index.part04.js +113 -101
  68. package/dist/index.part05.d.ts +1 -1
  69. package/dist/index.part05.js +99 -22
  70. package/dist/index.part06.js +6 -2
  71. package/dist/index.part07.js +24 -24
  72. package/dist/index.part08.js +1 -1
  73. package/dist/init/templates.part01.js +393 -393
  74. package/dist/init/templates.part02.js +189 -189
  75. package/dist/initTemplatesBackend.js +73 -73
  76. package/dist/initTemplatesBase.js +81 -80
  77. package/dist/initTemplatesFlutter.js +137 -137
  78. package/dist/initTemplatesRuntime.js +350 -350
  79. package/dist/initTemplatesWeb.js +309 -309
  80. package/dist/pipelineConteudo/command.js +1 -36
  81. package/dist/profileArtefatoValidadores.d.ts +3 -2
  82. package/dist/profileArtefatoValidadores.js +81 -0
  83. package/dist/profileAuthorTipos.d.ts +4 -3
  84. package/dist/profileCatalogo.d.ts +5 -5
  85. package/dist/profileCatalogo.js +30 -0
  86. package/dist/profileCommand.d.ts +8 -2
  87. package/dist/profileCommand.js +15 -5
  88. package/dist/profileRegras.d.ts +5 -5
  89. package/dist/profileRegras.js +13 -1
  90. package/dist/profileRulePacks.js +68 -0
  91. package/dist/projeto.d.ts +1 -1
  92. package/dist/projetoCarregar.d.ts +2 -2
  93. package/dist/projetoCarregar.js +47 -24
  94. package/dist/projetoCatalogo.d.ts +7 -0
  95. package/dist/projetoCatalogo.js +125 -0
  96. package/dist/projetoTipos.d.ts +14 -5
  97. package/dist/sistemasInterativos/adapterProtocol.d.ts +3 -0
  98. package/dist/sistemasInterativos/adapterProtocol.js +240 -0
  99. package/dist/sistemasInterativos/advancedCatalog.d.ts +5 -0
  100. package/dist/sistemasInterativos/advancedCatalog.js +442 -0
  101. package/dist/sistemasInterativos/autonomy.d.ts +230 -0
  102. package/dist/sistemasInterativos/autonomy.js +753 -0
  103. package/dist/sistemasInterativos/canonical.d.ts +3 -0
  104. package/dist/sistemasInterativos/canonical.js +43 -0
  105. package/dist/sistemasInterativos/catalog.d.ts +116 -0
  106. package/dist/sistemasInterativos/catalog.js +543 -0
  107. package/dist/sistemasInterativos/command.d.ts +7 -0
  108. package/dist/sistemasInterativos/command.js +311 -0
  109. package/dist/sistemasInterativos/controlRun.d.ts +56 -0
  110. package/dist/sistemasInterativos/controlRun.js +391 -0
  111. package/dist/sistemasInterativos/evidence.d.ts +5 -0
  112. package/dist/sistemasInterativos/evidence.js +306 -0
  113. package/dist/sistemasInterativos/experienceIr.d.ts +12 -0
  114. package/dist/sistemasInterativos/experienceIr.js +895 -0
  115. package/dist/sistemasInterativos/experienceIrSemantics.d.ts +30 -0
  116. package/dist/sistemasInterativos/experienceIrSemantics.js +368 -0
  117. package/dist/sistemasInterativos/experienceIrTypes.d.ts +370 -0
  118. package/dist/sistemasInterativos/experienceIrTypes.js +5 -0
  119. package/dist/sistemasInterativos/extensionCommand.d.ts +391 -0
  120. package/dist/sistemasInterativos/extensionCommand.js +383 -0
  121. package/dist/sistemasInterativos/index.d.ts +19 -0
  122. package/dist/sistemasInterativos/index.js +22 -0
  123. package/dist/sistemasInterativos/operations.d.ts +40 -0
  124. package/dist/sistemasInterativos/operations.js +1167 -0
  125. package/dist/sistemasInterativos/operationsTypes.d.ts +297 -0
  126. package/dist/sistemasInterativos/operationsTypes.js +11 -0
  127. package/dist/sistemasInterativos/planner.d.ts +2 -0
  128. package/dist/sistemasInterativos/planner.js +159 -0
  129. package/dist/sistemasInterativos/portability.d.ts +164 -0
  130. package/dist/sistemasInterativos/portability.js +539 -0
  131. package/dist/sistemasInterativos/render.d.ts +3 -0
  132. package/dist/sistemasInterativos/render.js +179 -0
  133. package/dist/sistemasInterativos/temporal.d.ts +183 -0
  134. package/dist/sistemasInterativos/temporal.js +543 -0
  135. package/dist/sistemasInterativos/types.d.ts +215 -0
  136. package/dist/sistemasInterativos/types.js +4 -0
  137. package/dist/sistemasInterativos/validator.d.ts +2 -0
  138. package/dist/sistemasInterativos/validator.js +305 -0
  139. package/dist/sync/index.js +35 -35
  140. package/docs/README.md +34 -28
  141. package/docs/ai-onboarding.md +62 -62
  142. package/docs/ai-workflow.md +9 -4
  143. package/docs/auth.md +26 -26
  144. package/docs/cli.md +79 -79
  145. package/docs/commands.md +47 -2
  146. package/docs/database.md +15 -15
  147. package/docs/deploy.md +41 -41
  148. package/docs/descoberta-capacidades.md +106 -0
  149. package/docs/documentation.md +39 -39
  150. package/docs/env.md +16 -16
  151. package/docs/frontend.md +41 -41
  152. package/docs/getting-started.md +57 -57
  153. package/docs/i18n.md +15 -15
  154. package/docs/pipeline-conteudo.md +246 -246
  155. package/docs/profiles.md +54 -45
  156. package/docs/repositories.md +43 -43
  157. package/docs/rollback.md +31 -31
  158. package/docs/security.md +32 -32
  159. package/docs/sistemas-interativos.md +376 -0
  160. package/docs/support.md +8 -8
  161. package/docs/testing.md +51 -35
  162. package/docs/vocabulary.md +29 -29
  163. package/exemplos/agendamento.sema +1 -1
  164. package/exemplos/assinatura.sema +1 -1
  165. package/exemplos/auditoria.sema +1 -1
  166. package/exemplos/autenticacao.sema +1 -1
  167. package/exemplos/author_obra_comum.sema +1 -1
  168. package/exemplos/author_tema_sensivel.sema +1 -1
  169. package/exemplos/automacao.sema +1 -1
  170. package/exemplos/cadastro_usuario.sema +1 -1
  171. package/exemplos/calculadora.sema +1 -1
  172. package/exemplos/crud_simples.sema +1 -1
  173. package/exemplos/estoque.sema +1 -1
  174. package/exemplos/exportacao.sema +1 -1
  175. package/exemplos/fila.sema +1 -1
  176. package/exemplos/integracao_externa.sema +1 -1
  177. package/exemplos/multi_tenant.sema +1 -1
  178. package/exemplos/notificacao.sema +1 -1
  179. package/exemplos/operacao_estrategia.sema +132 -132
  180. package/exemplos/operacao_estrategia_discovery.sema +220 -220
  181. package/exemplos/operacao_estrategia_fluxo.sema +114 -114
  182. package/exemplos/operacao_estrategia_gates.sema +106 -106
  183. package/exemplos/operacao_estrategia_quarentena.sema +133 -133
  184. package/exemplos/operacao_estrategia_rollout.sema +124 -124
  185. package/exemplos/pagamento.sema +1 -1
  186. package/exemplos/pagamento_dominio.sema +1 -1
  187. package/exemplos/pedido.sema +1 -1
  188. package/exemplos/permissao.sema +1 -1
  189. package/exemplos/persistencia_vendor_first.sema +1 -1
  190. package/exemplos/pipeline-conteudo/README.md +44 -44
  191. package/exemplos/pipeline-conteudo/alvos.json +23 -23
  192. package/exemplos/pipeline-conteudo/definicao.json +136 -136
  193. package/exemplos/profile_conversas.sema +165 -165
  194. package/exemplos/profile_game.sema +1 -1
  195. package/exemplos/profile_legal.sema +1 -1
  196. package/exemplos/profile_ops.sema +1 -1
  197. package/exemplos/profile_research.sema +1 -1
  198. package/exemplos/profile_simulation.sema +211 -0
  199. package/exemplos/profile_software.sema +1 -1
  200. package/exemplos/profile_workflow_n8n.sema +1 -1
  201. package/exemplos/relatorio.sema +1 -1
  202. package/exemplos/replica_analitica_erp.sema +1 -1
  203. package/exemplos/sistemas-interativos/README.md +100 -0
  204. package/exemplos/sistemas-interativos/advanced/acceptance-context-evaluate-valid.json +5 -0
  205. package/exemplos/sistemas-interativos/advanced/acceptance-lock-valid.json +16 -0
  206. package/exemplos/sistemas-interativos/advanced/asset-provenance-valid.json +32 -0
  207. package/exemplos/sistemas-interativos/advanced/autonomy-repair-valid.json +93 -0
  208. package/exemplos/sistemas-interativos/advanced/control-run-definition-valid.json +78 -0
  209. package/exemplos/sistemas-interativos/advanced/control-run-valid.json +27 -0
  210. package/exemplos/sistemas-interativos/advanced/distributed-workers-valid.json +79 -0
  211. package/exemplos/sistemas-interativos/advanced/editor-state-valid.json +42 -0
  212. package/exemplos/sistemas-interativos/advanced/engine-snapshot-after-valid.json +32 -0
  213. package/exemplos/sistemas-interativos/advanced/engine-snapshot-before-valid.json +23 -0
  214. package/exemplos/sistemas-interativos/advanced/job-orchestration-valid.json +39 -0
  215. package/exemplos/sistemas-interativos/advanced/multimodal-evidence-valid.json +46 -0
  216. package/exemplos/sistemas-interativos/advanced/multiplayer-authority-valid.json +39 -0
  217. package/exemplos/sistemas-interativos/advanced/playtest-fuzz-valid.json +37 -0
  218. package/exemplos/sistemas-interativos/advanced/portability-valid.json +104 -0
  219. package/exemplos/sistemas-interativos/advanced/temporal-evidence-valid.json +27 -0
  220. package/exemplos/sistemas-interativos/advanced/temporal-valid.json +118 -0
  221. package/exemplos/sistemas-interativos/experience-ir-valid.json +459 -0
  222. package/exemplos/sistemas-interativos/game-2d.json +83 -0
  223. package/exemplos/sistemas-interativos/game-3d-human.json +81 -0
  224. package/exemplos/sistemas-interativos/game-pixel-16-bit.json +97 -0
  225. package/exemplos/sistemas-interativos/game-pixel-8-bit.json +94 -0
  226. package/exemplos/sistemas-interativos/game-xr-human.json +80 -0
  227. package/exemplos/sistemas-interativos/hybrid-2-5d.json +108 -0
  228. package/exemplos/sistemas-interativos/protocol-mutating-rollback-valid.json +75 -0
  229. package/exemplos/sistemas-interativos/protocol-read-only-valid.json +58 -0
  230. package/exemplos/sistemas-interativos/simulation-2d-controlled.json +97 -0
  231. package/exemplos/sistemas-interativos/simulation-3d-calibrated-autonomous.json +141 -0
  232. package/exemplos/sistemas-interativos/simulation-headless-autonomous-batch.json +112 -0
  233. package/exemplos/sistemas-interativos/simulation-pixel-16-bit.json +103 -0
  234. package/exemplos/sistemas-interativos/simulation-text-controlled.json +95 -0
  235. package/exemplos/testes_embutidos.sema +1 -1
  236. package/exemplos/tratamento_erro.sema +1 -1
  237. package/exemplos/upload_arquivo.sema +1 -1
  238. package/exemplos/webhook.sema +1 -1
  239. package/node_modules/@sema/gerador-cpp/dist/index.js +176 -176
  240. package/node_modules/@sema/gerador-cpp/package.json +1 -1
  241. package/node_modules/@sema/gerador-css/dist/index.part01.js +10 -10
  242. package/node_modules/@sema/gerador-css/dist/index.part02.js +460 -460
  243. package/node_modules/@sema/gerador-dotnet/dist/index.js +169 -169
  244. package/node_modules/@sema/gerador-dotnet/package.json +1 -1
  245. package/node_modules/@sema/gerador-html/dist/index.js +17 -17
  246. package/node_modules/@sema/gerador-lua/dist/index.js +76 -47
  247. package/node_modules/@sema/gerador-lua/dist/index.js.map +1 -1
  248. package/node_modules/@sema/gerador-php/dist/index.js +113 -113
  249. package/node_modules/@sema/gerador-python/dist/index.part02.js +3 -3
  250. package/node_modules/@sema/gerador-typescript/dist/index.part02.js +11 -11
  251. package/node_modules/@sema/nucleo/dist/diagnosticos/melhorador.js +42 -42
  252. package/package.json +3 -3
@@ -1,26 +1,256 @@
1
- // SEMA-GOVERNED: sema.governanca_ia_contexto
2
- // Descricao: prepara indices vivos para drift; consulte contratos/sema/governanca_ia_contexto.sema antes de editar.
3
- import { resolverDiretoriosCodigoEscopoReal } from "./drift.part02.js";
4
- import { indexarArquivosRastreaveis } from "./drift.part04.js";
1
+ // SEMA-GOVERNED: sema.produto.governanca_ia.drift
2
+ // Descricao: planeja antes de catalogar e indexa unidades incrementais com uma unica leitura fisica por arquivo.
3
+ import pacoteCli from "../package.json" with { type: "json" };
4
+ import path from "node:path";
5
+ import { performance } from "node:perf_hooks";
6
+ import ts from "typescript";
7
+ import { resolverDiretoriosIgnoradosAtivos } from "./drift.part01.js";
8
+ import { EXTENSOES_ARQUIVOS_RASTREAVEIS_DRIFT, indexarArquivosRastreaveis } from "./drift.part04.js";
5
9
  import { indexarTypeScript } from "./drift.part06.js";
6
- import { indexarCpp, indexarDart, indexarDotnet, indexarGo, indexarJava, indexarLua, indexarPersistenciaDeclarativa, indexarPhp, indexarPython, indexarRust } from "./drift.part07.js";
10
+ import { indexarCpp, indexarDart, indexarDotnet, indexarGo, indexarJava, indexarLua, indexarPersistenciaDeclarativa, indexarPhp, indexarPython, indexarRust, } from "./drift.part07.js";
7
11
  import { indexarPersistenciaDetalhada } from "./drift.part08.js";
8
12
  import { construirMapaRecursos } from "./drift.part10.js";
9
- export async function prepararIndicesDrift(contexto, configuracaoEscopo) {
10
- const diretoriosCodigoAtivos = resolverDiretoriosCodigoEscopoReal(contexto, configuracaoEscopo);
11
- const indexTs = await indexarTypeScript(diretoriosCodigoAtivos);
12
- const indexPy = await indexarPython(diretoriosCodigoAtivos);
13
- const indexDart = await indexarDart(diretoriosCodigoAtivos);
14
- const indexDotnet = await indexarDotnet(diretoriosCodigoAtivos);
15
- const indexJava = await indexarJava(diretoriosCodigoAtivos);
16
- const indexGo = await indexarGo(diretoriosCodigoAtivos);
17
- const indexRust = await indexarRust(diretoriosCodigoAtivos);
18
- const indexLua = await indexarLua(diretoriosCodigoAtivos);
19
- const indexPhp = await indexarPhp(diretoriosCodigoAtivos);
20
- const indexPersistencia = await indexarPersistenciaDeclarativa(diretoriosCodigoAtivos);
21
- const detalhesPersistencia = await indexarPersistenciaDetalhada(diretoriosCodigoAtivos);
22
- const indexCpp = await indexarCpp(diretoriosCodigoAtivos);
23
- const arquivosRastreaveis = await indexarArquivosRastreaveis(diretoriosCodigoAtivos);
13
+ import { emitirDiagnosticosArquivosOrcamento, workspaceExigeCabecalhoCodigoGovernado, } from "./driftOrcamento.js";
14
+ import { criarCatalogoPersistenteDrift } from "./driftCatalogoPersistente.js";
15
+ import { CacheIncrementalDrift, FILE_INDEX_SCHEMA, } from "./driftCacheIncremental.js";
16
+ import { expandirDependenciasPlanoDrift, extrairReferenciasLocaisDrift, mapearDependenciasCatalogadasDrift, planejarEscopoDrift, } from "./driftEscopo.js";
17
+ const EXTENSOES_ANALISE_DRIFT = new Set([
18
+ ".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs",
19
+ ".py", ".dart", ".lua", ".cs", ".java", ".go", ".rs", ".php",
20
+ ".cpp", ".cc", ".cxx", ".hpp", ".h",
21
+ ".sql", ".psql", ".ddl", ".prisma",
22
+ ]);
23
+ const EXTENSOES_TYPESCRIPT_DRIFT = new Set([
24
+ ".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs",
25
+ ]);
26
+ const EXTENSOES_DEPENDENCIA_TYPESCRIPT_DRIFT = new Set([
27
+ ...EXTENSOES_TYPESCRIPT_DRIFT,
28
+ ".html", ".htm", ".css",
29
+ ]);
30
+ function chaveCaminho(caminho) {
31
+ const absoluto = path.normalize(path.resolve(caminho));
32
+ return process.platform === "win32" ? absoluto.toLowerCase() : absoluto;
33
+ }
34
+ function chaveRelativa(caminho) {
35
+ const normalizado = caminho.replace(/\\/g, "/");
36
+ return process.platform === "win32" ? normalizado.toLowerCase() : normalizado;
37
+ }
38
+ function paraJsonCache(valor) {
39
+ return JSON.parse(JSON.stringify(valor));
40
+ }
41
+ function registroObjeto(valor) {
42
+ return typeof valor === "object" && valor !== null && !Array.isArray(valor);
43
+ }
44
+ function textoNaoVazio(valor) {
45
+ return typeof valor === "string" && valor.length > 0;
46
+ }
47
+ function pertenceAoConjunto(valor, conjunto) {
48
+ return typeof valor === "string" && conjunto.has(valor);
49
+ }
50
+ function inteiroNaoNegativo(valor) {
51
+ return typeof valor === "number" && Number.isSafeInteger(valor) && valor >= 0;
52
+ }
53
+ const ORIGENS_SIMBOLO_DRIFT = new Set([
54
+ "ts", "js", "py", "dart", "lua", "cs", "java", "go", "rust", "cpp", "php", "sql",
55
+ ]);
56
+ const ORIGENS_ROTA_DRIFT = new Set([
57
+ "nestjs", "fastapi", "flask", "nextjs", "nextjs-consumer", "react-vite-consumer",
58
+ "angular-consumer", "flutter-consumer", "firebase", "dotnet", "java", "go", "rust", "php",
59
+ ]);
60
+ const ORIGENS_RECURSO_DRIFT = new Set([
61
+ "firebase", "postgres", "mysql", "sqlite", "mongodb", "redis", "arquivo",
62
+ ]);
63
+ const TIPOS_RECURSO_DRIFT = new Set([
64
+ "colecao", "arquivo_local", "table", "view", "query", "transaction", "index", "constraint",
65
+ "relationship", "collection", "document", "keyspace", "stream", "lock", "retention", "replication",
66
+ ]);
67
+ const CATEGORIAS_PERSISTENCIA_DRIFT = new Set([
68
+ "relacional", "documental", "chave_valor", "local_arquivo", "desconhecida",
69
+ ]);
70
+ const TIPOS_DIAGNOSTICO_ORCAMENTO = new Set([
71
+ "contrato_monolitico", "codigo_monolitico", "codigo_governado_sem_cabecalho",
72
+ ]);
73
+ function simboloResolvidoValido(valor) {
74
+ return registroObjeto(valor)
75
+ && pertenceAoConjunto(valor.origem, ORIGENS_SIMBOLO_DRIFT)
76
+ && textoNaoVazio(valor.caminho)
77
+ && textoNaoVazio(valor.arquivo)
78
+ && textoNaoVazio(valor.simbolo);
79
+ }
80
+ function rotaResolvidaValida(valor) {
81
+ return registroObjeto(valor)
82
+ && pertenceAoConjunto(valor.origem, ORIGENS_ROTA_DRIFT)
83
+ && textoNaoVazio(valor.metodo)
84
+ && textoNaoVazio(valor.caminho)
85
+ && textoNaoVazio(valor.arquivo)
86
+ && textoNaoVazio(valor.simbolo);
87
+ }
88
+ function recursoResolvidoValido(valor) {
89
+ return registroObjeto(valor)
90
+ && pertenceAoConjunto(valor.origem, ORIGENS_RECURSO_DRIFT)
91
+ && textoNaoVazio(valor.nome)
92
+ && textoNaoVazio(valor.arquivo)
93
+ && (valor.simbolo === undefined || textoNaoVazio(valor.simbolo))
94
+ && pertenceAoConjunto(valor.tipo, TIPOS_RECURSO_DRIFT);
95
+ }
96
+ function consumerSurfaceValida(valor) {
97
+ return registroObjeto(valor)
98
+ && textoNaoVazio(valor.rota)
99
+ && textoNaoVazio(valor.arquivo)
100
+ && textoNaoVazio(valor.tipoArquivo);
101
+ }
102
+ function colunaPersistenciaValida(valor) {
103
+ return registroObjeto(valor)
104
+ && pertenceAoConjunto(valor.origem, ORIGENS_RECURSO_DRIFT)
105
+ && pertenceAoConjunto(valor.categoriaPersistencia, CATEGORIAS_PERSISTENCIA_DRIFT)
106
+ && textoNaoVazio(valor.recurso)
107
+ && textoNaoVazio(valor.coluna)
108
+ && textoNaoVazio(valor.arquivo);
109
+ }
110
+ function repositorioPersistenciaValido(valor) {
111
+ return registroObjeto(valor)
112
+ && pertenceAoConjunto(valor.origem, ORIGENS_RECURSO_DRIFT)
113
+ && pertenceAoConjunto(valor.categoriaPersistencia, CATEGORIAS_PERSISTENCIA_DRIFT)
114
+ && textoNaoVazio(valor.recurso)
115
+ && textoNaoVazio(valor.arquivo);
116
+ }
117
+ function diagnosticoOrcamentoValido(valor) {
118
+ return registroObjeto(valor)
119
+ && pertenceAoConjunto(valor.tipo, TIPOS_DIAGNOSTICO_ORCAMENTO)
120
+ && textoNaoVazio(valor.arquivo)
121
+ && inteiroNaoNegativo(valor.linhas)
122
+ && (valor.severidade === "aviso" || valor.severidade === "erro")
123
+ && typeof valor.bloqueia === "boolean"
124
+ && textoNaoVazio(valor.mensagem)
125
+ && inteiroNaoNegativo(valor.limite_aviso_linhas)
126
+ && inteiroNaoNegativo(valor.limite_bloqueio_linhas);
127
+ }
128
+ function listaValida(valor, validar) {
129
+ return Array.isArray(valor) && valor.every(validar);
130
+ }
131
+ function indiceLinguagemValido(valor) {
132
+ return registroObjeto(valor)
133
+ && listaValida(valor.simbolos, simboloResolvidoValido)
134
+ && listaValida(valor.rotas, rotaResolvidaValida)
135
+ && listaValida(valor.recursos, recursoResolvidoValido)
136
+ && Array.isArray(valor.consumerSurfaces)
137
+ && valor.consumerSurfaces.every(consumerSurfaceValida);
138
+ }
139
+ function validarIndicesSerializaveis(valor) {
140
+ if (!registroObjeto(valor) || !registroObjeto(valor.detalhesPersistencia)) {
141
+ return false;
142
+ }
143
+ const detalhes = valor.detalhesPersistencia;
144
+ return listaValida(detalhes.colunas, colunaPersistenciaValida)
145
+ && listaValida(detalhes.repositorios, repositorioPersistenciaValido)
146
+ && Array.isArray(valor.arquivosOrcamentoAvaliados)
147
+ && valor.arquivosOrcamentoAvaliados.every(textoNaoVazio)
148
+ && listaValida(valor.diagnosticosOrcamento, diagnosticoOrcamentoValido)
149
+ && indiceLinguagemValido(valor.indexDart)
150
+ && indiceLinguagemValido(valor.indexTs)
151
+ && listaValida(valor.todasRotasIndexadas, rotaResolvidaValida)
152
+ && Array.isArray(valor.todosArquivosConhecidos)
153
+ && valor.todosArquivosConhecidos.every(textoNaoVazio)
154
+ && listaValida(valor.todosRecursos, recursoResolvidoValido)
155
+ && listaValida(valor.todosSimbolos, simboloResolvidoValido);
156
+ }
157
+ function indicesPermanecemNoCatalogo(valor, catalogo) {
158
+ const registros = [
159
+ ...valor.detalhesPersistencia.colunas,
160
+ ...valor.detalhesPersistencia.repositorios,
161
+ ...valor.indexDart.simbolos,
162
+ ...valor.indexDart.rotas,
163
+ ...valor.indexDart.recursos,
164
+ ...valor.indexDart.consumerSurfaces,
165
+ ...valor.indexTs.simbolos,
166
+ ...valor.indexTs.rotas,
167
+ ...valor.indexTs.recursos,
168
+ ...valor.indexTs.consumerSurfaces,
169
+ ...valor.todasRotasIndexadas,
170
+ ...valor.todosRecursos,
171
+ ...valor.todosSimbolos,
172
+ ];
173
+ return registros.every((item) => catalogo.contem(item.arquivo))
174
+ && valor.todosArquivosConhecidos.every((arquivo) => catalogo.contem(arquivo))
175
+ && valor.arquivosOrcamentoAvaliados.every((arquivo) => catalogo.contem(path.resolve(catalogo.baseDiretorio, arquivo)))
176
+ && valor.diagnosticosOrcamento.every((item) => catalogo.contem(path.resolve(catalogo.baseDiretorio, item.arquivo)));
177
+ }
178
+ function reconstruirIndices(serializaveis, planoEscopo, cache, catalogo, leitorArquivosPlanejados) {
179
+ const mapaImpl = new Map(serializaveis.todosSimbolos
180
+ .filter((item) => item.origem !== "sql")
181
+ .map((item) => [item.caminho, item]));
182
+ return {
183
+ ...serializaveis,
184
+ mapaImpl,
185
+ mapaRecursos: construirMapaRecursos(serializaveis.todosRecursos),
186
+ planoEscopo,
187
+ cache,
188
+ catalogo,
189
+ leitorArquivosPlanejados,
190
+ };
191
+ }
192
+ function indicesVazios() {
193
+ return {
194
+ arquivosOrcamentoAvaliados: [],
195
+ detalhesPersistencia: { colunas: [], repositorios: [] },
196
+ diagnosticosOrcamento: [],
197
+ indexDart: { simbolos: [], rotas: [], recursos: [], consumerSurfaces: [] },
198
+ indexTs: { simbolos: [], rotas: [], recursos: [], consumerSurfaces: [] },
199
+ todasRotasIndexadas: [],
200
+ todosArquivosConhecidos: [],
201
+ todosRecursos: [],
202
+ todosSimbolos: [],
203
+ };
204
+ }
205
+ function deduplicar(itens, chave) {
206
+ return [...new Map(itens.map((item) => [chave(item), item])).values()];
207
+ }
208
+ function filtrarAoCatalogo(itens, catalogo) {
209
+ return itens.filter((item) => catalogo.contem(item.arquivo));
210
+ }
211
+ function sanitizarIndices(indices, catalogo) {
212
+ const diagnosticosOrcamento = indices.diagnosticosOrcamento.filter((item) => catalogo.contem(path.resolve(catalogo.baseDiretorio, item.arquivo)));
213
+ return {
214
+ arquivosOrcamentoAvaliados: indices.arquivosOrcamentoAvaliados.filter((arquivo) => catalogo.contem(path.resolve(catalogo.baseDiretorio, arquivo))),
215
+ detalhesPersistencia: {
216
+ colunas: filtrarAoCatalogo(indices.detalhesPersistencia.colunas, catalogo),
217
+ repositorios: filtrarAoCatalogo(indices.detalhesPersistencia.repositorios, catalogo),
218
+ },
219
+ diagnosticosOrcamento,
220
+ indexDart: {
221
+ simbolos: filtrarAoCatalogo(indices.indexDart.simbolos, catalogo),
222
+ rotas: filtrarAoCatalogo(indices.indexDart.rotas, catalogo),
223
+ recursos: filtrarAoCatalogo(indices.indexDart.recursos, catalogo),
224
+ consumerSurfaces: filtrarAoCatalogo(indices.indexDart.consumerSurfaces, catalogo),
225
+ },
226
+ indexTs: {
227
+ simbolos: filtrarAoCatalogo(indices.indexTs.simbolos, catalogo),
228
+ rotas: filtrarAoCatalogo(indices.indexTs.rotas, catalogo),
229
+ recursos: filtrarAoCatalogo(indices.indexTs.recursos, catalogo),
230
+ consumerSurfaces: filtrarAoCatalogo(indices.indexTs.consumerSurfaces, catalogo),
231
+ },
232
+ todasRotasIndexadas: filtrarAoCatalogo(indices.todasRotasIndexadas, catalogo),
233
+ todosArquivosConhecidos: indices.todosArquivosConhecidos.filter((arquivo) => catalogo.contem(arquivo)),
234
+ todosRecursos: filtrarAoCatalogo(indices.todosRecursos, catalogo),
235
+ todosSimbolos: filtrarAoCatalogo(indices.todosSimbolos, catalogo),
236
+ };
237
+ }
238
+ async function calcularIndices(diretorios, catalogo, exigirCabecalhoCodigoGovernado) {
239
+ const [indexTs, indexPy, indexDart, indexDotnet, indexJava, indexGo, indexRust, indexLua, indexPhp, indexPersistencia, detalhesPersistencia, indexCpp, arquivosRastreaveis,] = await Promise.all([
240
+ indexarTypeScript(diretorios, catalogo),
241
+ indexarPython(diretorios, catalogo),
242
+ indexarDart(diretorios, catalogo),
243
+ indexarDotnet(diretorios, catalogo),
244
+ indexarJava(diretorios, catalogo),
245
+ indexarGo(diretorios, catalogo),
246
+ indexarRust(diretorios, catalogo),
247
+ indexarLua(diretorios, catalogo),
248
+ indexarPhp(diretorios, catalogo),
249
+ indexarPersistenciaDeclarativa(diretorios, catalogo),
250
+ indexarPersistenciaDetalhada(diretorios, catalogo),
251
+ indexarCpp(diretorios, catalogo),
252
+ indexarArquivosRastreaveis(diretorios, catalogo),
253
+ ]);
24
254
  const todosSimbolos = [
25
255
  ...indexTs.simbolos,
26
256
  ...indexPy.simbolos,
@@ -34,18 +264,6 @@ export async function prepararIndicesDrift(contexto, configuracaoEscopo) {
34
264
  ...indexPhp.simbolos,
35
265
  ...indexPersistencia.simbolos,
36
266
  ];
37
- const mapaImpl = new Map([
38
- ...indexTs.simbolos.map((item) => [item.caminho, item]),
39
- ...indexPy.simbolos.map((item) => [item.caminho, item]),
40
- ...indexDart.simbolos.map((item) => [item.caminho, item]),
41
- ...indexDotnet.simbolos.map((item) => [item.caminho, item]),
42
- ...indexJava.simbolos.map((item) => [item.caminho, item]),
43
- ...indexGo.simbolos.map((item) => [item.caminho, item]),
44
- ...indexRust.simbolos.map((item) => [item.caminho, item]),
45
- ...indexLua.simbolos.map((item) => [item.caminho, item]),
46
- ...indexCpp.simbolos.map((item) => [item.caminho, item]),
47
- ...indexPhp.simbolos.map((item) => [item.caminho, item]),
48
- ]);
49
267
  const todosRecursos = [
50
268
  ...indexTs.recursos,
51
269
  ...indexPy.recursos,
@@ -59,7 +277,6 @@ export async function prepararIndicesDrift(contexto, configuracaoEscopo) {
59
277
  ...indexPhp.recursos,
60
278
  ...indexPersistencia.recursos,
61
279
  ];
62
- const mapaRecursos = construirMapaRecursos(todosRecursos);
63
280
  const todasRotasIndexadas = [
64
281
  ...indexTs.rotas,
65
282
  ...indexPy.rotas,
@@ -76,16 +293,423 @@ export async function prepararIndicesDrift(contexto, configuracaoEscopo) {
76
293
  ...todasRotasIndexadas.map((item) => item.arquivo),
77
294
  ...todosRecursos.map((item) => item.arquivo),
78
295
  ])].sort((a, b) => a.localeCompare(b, "pt-BR"));
79
- return {
296
+ const diagnosticosOrcamento = await emitirDiagnosticosArquivosOrcamento({
297
+ arquivos: catalogo.arquivosCatalogados(),
298
+ baseProjeto: catalogo.baseDiretorio,
299
+ exigirCabecalhoCodigoGovernado,
300
+ leitorArquivos: catalogo,
301
+ });
302
+ return sanitizarIndices(paraJsonCache({
303
+ arquivosOrcamentoAvaliados: catalogo.arquivosCatalogados()
304
+ .map((arquivo) => pathRelativo(catalogo.baseDiretorio, arquivo)),
80
305
  detalhesPersistencia,
306
+ diagnosticosOrcamento,
81
307
  indexDart,
82
308
  indexTs,
83
- mapaImpl,
84
- mapaRecursos,
85
309
  todasRotasIndexadas,
86
310
  todosArquivosConhecidos,
87
311
  todosRecursos,
88
312
  todosSimbolos,
313
+ }), catalogo);
314
+ }
315
+ function mesclarIndices(resumos, todosArquivosCatalogados) {
316
+ const simbolos = deduplicar(resumos.flatMap((item) => item.todosSimbolos), (item) => item.caminho);
317
+ const rotas = deduplicar(resumos.flatMap((item) => item.todasRotasIndexadas), (item) => `${item.origem}:${item.metodo}:${item.caminho}:${item.arquivo}:${item.simbolo}`);
318
+ const recursos = deduplicar(resumos.flatMap((item) => item.todosRecursos), (item) => `${item.origem}:${item.tipo}:${item.nome}:${item.arquivo}:${item.simbolo ?? ""}`);
319
+ const simbolosTs = deduplicar(resumos.flatMap((item) => item.indexTs.simbolos), (item) => item.caminho);
320
+ const rotasTs = deduplicar(resumos.flatMap((item) => item.indexTs.rotas), (item) => `${item.origem}:${item.metodo}:${item.caminho}:${item.arquivo}:${item.simbolo}`);
321
+ const recursosTs = deduplicar(resumos.flatMap((item) => item.indexTs.recursos), (item) => `${item.origem}:${item.tipo}:${item.nome}:${item.arquivo}:${item.simbolo ?? ""}`);
322
+ const surfacesTs = deduplicar(resumos.flatMap((item) => item.indexTs.consumerSurfaces), (item) => `${item.rota}:${item.arquivo}:${item.tipoArquivo}`);
323
+ const simbolosDart = deduplicar(resumos.flatMap((item) => item.indexDart.simbolos), (item) => item.caminho);
324
+ const rotasDart = deduplicar(resumos.flatMap((item) => item.indexDart.rotas), (item) => `${item.origem}:${item.metodo}:${item.caminho}:${item.arquivo}:${item.simbolo}`);
325
+ const recursosDart = deduplicar(resumos.flatMap((item) => item.indexDart.recursos), (item) => `${item.origem}:${item.tipo}:${item.nome}:${item.arquivo}:${item.simbolo ?? ""}`);
326
+ const surfacesDart = deduplicar(resumos.flatMap((item) => item.indexDart.consumerSurfaces), (item) => `${item.rota}:${item.arquivo}:${item.tipoArquivo}`);
327
+ const colunas = deduplicar(resumos.flatMap((item) => item.detalhesPersistencia.colunas), (item) => `${item.origem}:${item.recurso}:${item.coluna}:${item.arquivo}`);
328
+ const repositorios = deduplicar(resumos.flatMap((item) => item.detalhesPersistencia.repositorios), (item) => `${item.origem}:${item.recurso}:${item.arquivo}`);
329
+ const diagnosticosOrcamento = deduplicar(resumos.flatMap((item) => item.diagnosticosOrcamento), (item) => `${item.tipo}:${item.arquivo}:${item.severidade}:${item.mensagem}`);
330
+ return paraJsonCache({
331
+ arquivosOrcamentoAvaliados: [...new Set(resumos.flatMap((item) => item.arquivosOrcamentoAvaliados))].sort((a, b) => a.localeCompare(b, "pt-BR")),
332
+ detalhesPersistencia: { colunas, repositorios },
333
+ diagnosticosOrcamento,
334
+ indexDart: {
335
+ simbolos: simbolosDart,
336
+ rotas: rotasDart,
337
+ recursos: recursosDart,
338
+ consumerSurfaces: surfacesDart,
339
+ },
340
+ indexTs: {
341
+ simbolos: simbolosTs,
342
+ rotas: rotasTs,
343
+ recursos: recursosTs,
344
+ consumerSurfaces: surfacesTs,
345
+ },
346
+ todasRotasIndexadas: rotas,
347
+ todosArquivosConhecidos: [...new Set(todosArquivosCatalogados)].sort((a, b) => a.localeCompare(b, "pt-BR")),
348
+ todosRecursos: recursos,
349
+ todosSimbolos: simbolos,
350
+ });
351
+ }
352
+ class CatalogoFiltradoDrift {
353
+ origem;
354
+ baseDiretorio;
355
+ raizes;
356
+ permitidos;
357
+ constructor(origem, arquivos) {
358
+ this.origem = origem;
359
+ this.baseDiretorio = origem.baseDiretorio;
360
+ this.raizes = origem.raizes;
361
+ this.permitidos = new Set(arquivos.map(chaveCaminho));
362
+ }
363
+ listar(extensoesOuFiltro = [], raizes) {
364
+ const arquivos = Array.isArray(extensoesOuFiltro)
365
+ ? this.origem.listar(extensoesOuFiltro, raizes)
366
+ : this.origem.listar(extensoesOuFiltro);
367
+ return arquivos.filter((arquivo) => this.permitidos.has(chaveCaminho(arquivo)));
368
+ }
369
+ listarEntradas(filtro = {}) {
370
+ return this.origem.listarEntradas(filtro)
371
+ .filter((arquivo) => this.permitidos.has(chaveCaminho(arquivo.caminho)));
372
+ }
373
+ listarPorExtensoes(extensoes, raiz) {
374
+ return this.listarEntradas({ extensoes, raiz }).map((arquivo) => arquivo.caminho);
375
+ }
376
+ listarPorRaiz(raiz, extensoes) {
377
+ return this.listarEntradas({ raiz, extensoes }).map((arquivo) => arquivo.caminho);
378
+ }
379
+ arquivosCatalogados() {
380
+ return this.listar();
381
+ }
382
+ async incluir(arquivos) {
383
+ const fora = arquivos.find((arquivo) => !this.permitidos.has(chaveCaminho(arquivo)));
384
+ if (fora) {
385
+ throw new Error(`Arquivo fora da unidade incremental do drift: ${fora}`);
386
+ }
387
+ }
388
+ contem(caminho) {
389
+ return this.permitidos.has(chaveCaminho(caminho)) && this.origem.contem(caminho);
390
+ }
391
+ ler(caminho) {
392
+ return this.contem(caminho)
393
+ ? this.origem.ler(caminho)
394
+ : Promise.reject(new Error(`Arquivo fora da unidade incremental do drift: ${caminho}`));
395
+ }
396
+ async lerTexto(caminho) {
397
+ return (await this.ler(caminho)).texto;
398
+ }
399
+ async digest(caminho) {
400
+ return (await this.ler(caminho)).digest;
401
+ }
402
+ fingerprint(caminhos) {
403
+ const selecionados = (caminhos ?? this.arquivosCatalogados())
404
+ .filter((arquivo) => this.contem(arquivo));
405
+ return this.origem.fingerprint(selecionados);
406
+ }
407
+ obterFingerprint(caminhos) {
408
+ return this.fingerprint(caminhos);
409
+ }
410
+ emitir(tipo, arquivo) {
411
+ if (tipo === "ast.create") {
412
+ this.origem.emitir(tipo, arquivo);
413
+ }
414
+ }
415
+ metricas() {
416
+ return this.origem.metricas();
417
+ }
418
+ snapshot() {
419
+ const snapshot = this.origem.snapshot();
420
+ return {
421
+ ...snapshot,
422
+ arquivos: snapshot.arquivos.filter((arquivo) => this.permitidos.has(chaveCaminho(path.resolve(this.baseDiretorio, arquivo.caminho)))),
423
+ };
424
+ }
425
+ }
426
+ function extrairPerfilAgrupamentoTypeScript(arquivo, codigo) {
427
+ const relacao = arquivo.replace(/\\/g, "/");
428
+ const motivos = new Set();
429
+ if (/(?:^|\n)\s*export\s+(?:type\s+)?(?:\*|\{[\s\S]{0,4000}?\})\s+from\s*["'`][^"'`]+["'`]/mu.test(codigo)) {
430
+ motivos.add("reexportacao");
431
+ }
432
+ if (/(?:^|\/)(?:app\.)?(?:routes?|router|routing)(?:\.[^/]*)?\.(?:ts|tsx|js|jsx|mjs|cjs)$/iu.test(relacao)
433
+ || /\b(?:createBrowserRouter|useRoutes|loadChildren|loadComponent)\s*[:(]/u.test(codigo)
434
+ || /\bRouterModule\.(?:forRoot|forChild)\s*\(/u.test(codigo)
435
+ || /<Routes?\b/u.test(codigo)) {
436
+ motivos.add("roteamento_consumer");
437
+ }
438
+ if (/(?:^|\/)(?:src\/)?(?:app\/)?app\.component\.(?:ts|js)$/iu.test(relacao)) {
439
+ motivos.add("angular_standalone_raiz");
440
+ }
441
+ return {
442
+ acoplarDependencias: motivos.size > 0,
443
+ motivos: [...motivos].sort((a, b) => a.localeCompare(b, "pt-BR")),
444
+ };
445
+ }
446
+ function perfilAgrupamentoTypeScriptValido(valor) {
447
+ return registroObjeto(valor)
448
+ && typeof valor.acoplarDependencias === "boolean"
449
+ && Array.isArray(valor.motivos)
450
+ && valor.motivos.every(textoNaoVazio);
451
+ }
452
+ function construirGruposIncrementais(arquivos, dependencias, perfisTypeScript) {
453
+ const porChave = new Map(arquivos.map((arquivo) => [chaveCaminho(arquivo), arquivo]));
454
+ const analisaveis = arquivos.filter((arquivo) => EXTENSOES_ANALISE_DRIFT.has(path.extname(arquivo).toLowerCase()));
455
+ const typescript = analisaveis.filter((arquivo) => EXTENSOES_TYPESCRIPT_DRIFT.has(path.extname(arquivo).toLowerCase()));
456
+ const dependenciasPorChave = new Map();
457
+ for (const arquivo of typescript) {
458
+ const destinos = (dependencias[arquivo] ?? [])
459
+ .map((dependencia) => porChave.get(chaveCaminho(dependencia)))
460
+ .filter((dependencia) => Boolean(dependencia))
461
+ .filter((dependencia) => EXTENSOES_DEPENDENCIA_TYPESCRIPT_DRIFT.has(path.extname(dependencia).toLowerCase()));
462
+ dependenciasPorChave.set(chaveCaminho(arquivo), destinos);
463
+ }
464
+ const pai = new Map();
465
+ const encontrar = (chave) => {
466
+ const atual = pai.get(chave) ?? chave;
467
+ if (atual === chave) {
468
+ pai.set(chave, chave);
469
+ return chave;
470
+ }
471
+ const raiz = encontrar(atual);
472
+ pai.set(chave, raiz);
473
+ return raiz;
474
+ };
475
+ const unir = (a, b) => {
476
+ const raizA = encontrar(a);
477
+ const raizB = encontrar(b);
478
+ if (raizA !== raizB) {
479
+ pai.set(raizB, raizA.localeCompare(raizB, "en") <= 0 ? raizA : raizB);
480
+ pai.set(raizA, raizA.localeCompare(raizB, "en") <= 0 ? raizA : raizB);
481
+ }
89
482
  };
483
+ for (const semente of typescript) {
484
+ if (!perfisTypeScript.get(chaveCaminho(semente))?.acoplarDependencias) {
485
+ continue;
486
+ }
487
+ const chaveSemente = chaveCaminho(semente);
488
+ const fila = [chaveSemente];
489
+ const fechamento = new Set();
490
+ while (fila.length > 0) {
491
+ const atual = fila.shift();
492
+ if (fechamento.has(atual)) {
493
+ continue;
494
+ }
495
+ fechamento.add(atual);
496
+ for (const dependencia of dependenciasPorChave.get(atual) ?? []) {
497
+ const chaveDependencia = chaveCaminho(dependencia);
498
+ if (!fechamento.has(chaveDependencia)) {
499
+ fila.push(chaveDependencia);
500
+ }
501
+ }
502
+ }
503
+ for (const membro of fechamento) {
504
+ unir(chaveSemente, membro);
505
+ }
506
+ }
507
+ const gruposPorRaiz = new Map();
508
+ const usados = new Set();
509
+ for (const arquivo of arquivos) {
510
+ const chave = chaveCaminho(arquivo);
511
+ if (!pai.has(chave)) {
512
+ continue;
513
+ }
514
+ usados.add(chave);
515
+ const raiz = encontrar(chave);
516
+ const grupo = gruposPorRaiz.get(raiz) ?? [];
517
+ grupo.push(arquivo);
518
+ gruposPorRaiz.set(raiz, grupo);
519
+ }
520
+ const grupos = [...gruposPorRaiz.values()]
521
+ .map((grupo) => grupo.sort((a, b) => a.localeCompare(b, "pt-BR")));
522
+ for (const arquivo of analisaveis.sort((a, b) => a.localeCompare(b, "pt-BR"))) {
523
+ const chave = chaveCaminho(arquivo);
524
+ if (!usados.has(chave)) {
525
+ usados.add(chave);
526
+ grupos.push([arquivo]);
527
+ }
528
+ }
529
+ return grupos
530
+ .filter((grupo) => grupo.length > 0)
531
+ .sort((a, b) => a[0].localeCompare(b[0], "pt-BR"));
532
+ }
533
+ async function mapearComLimite(itens, limite, executar) {
534
+ const resultados = new Array(itens.length);
535
+ let proximo = 0;
536
+ const trabalhador = async () => {
537
+ for (;;) {
538
+ const indice = proximo;
539
+ proximo += 1;
540
+ if (indice >= itens.length) {
541
+ return;
542
+ }
543
+ resultados[indice] = await executar(itens[indice]);
544
+ }
545
+ };
546
+ await Promise.all(Array.from({ length: Math.min(limite, itens.length) }, trabalhador));
547
+ return resultados;
548
+ }
549
+ function pathRelativo(baseProjeto, alvo) {
550
+ const relativo = path.relative(baseProjeto, alvo).replace(/\\/g, "/");
551
+ return relativo || ".";
552
+ }
553
+ function criarIdentidadeCache(contexto, configuracaoEscopo, plano, exigirCabecalhoCodigoGovernado) {
554
+ const ordenarCaminhos = (caminhos) => [...new Set(caminhos.map((caminho) => path.normalize(path.resolve(caminho))))].sort((a, b) => a.localeCompare(b, "pt-BR"));
555
+ const representarDiretorios = (diretorios) => {
556
+ const fisicos = ordenarCaminhos(diretorios);
557
+ return {
558
+ fisicos,
559
+ semanticos: fisicos.map((diretorio) => pathRelativo(contexto.baseProjeto, diretorio)),
560
+ };
561
+ };
562
+ return paraJsonCache({
563
+ cliVersion: pacoteCli.version,
564
+ typescriptVersion: ts.version,
565
+ fileIndexSchema: FILE_INDEX_SCHEMA,
566
+ extractorBuild: "drift-file-index-v4-2026-07-21",
567
+ escopo: {
568
+ solicitado: configuracaoEscopo.escopo,
569
+ estrategia: plano.estrategia,
570
+ cobertura: plano.cobertura,
571
+ termos: [...configuracaoEscopo.termosEscopo].sort((a, b) => a.localeCompare(b, "pt-BR")),
572
+ modulos: [...plano.modulos].sort((a, b) => a.localeCompare(b, "pt-BR")),
573
+ arquivosFisicos: ordenarCaminhos(plano.arquivos),
574
+ arquivosSemanticos: plano.arquivos
575
+ .map((arquivo) => pathRelativo(contexto.baseProjeto, arquivo))
576
+ .sort((a, b) => a.localeCompare(b, "pt-BR")),
577
+ },
578
+ diretoriosPlano: representarDiretorios(plano.diretorios),
579
+ diretoriosContexto: representarDiretorios(contexto.diretoriosCodigo),
580
+ exigirCabecalhoCodigoGovernado,
581
+ ignorarWorktrees: configuracaoEscopo.ignorarWorktrees,
582
+ ignorarConsumidoresLaterais: configuracaoEscopo.ignorarConsumidoresLaterais,
583
+ fontesLegado: contexto.fontesLegado,
584
+ configuracao: contexto.configCarregada?.config ?? null,
585
+ });
586
+ }
587
+ export async function prepararIndicesDrift(contexto, configuracaoEscopo, opcoes = {}) {
588
+ const inicioTotal = performance.now();
589
+ let planoEscopo = await planejarEscopoDrift(contexto, configuracaoEscopo);
590
+ const fimPlanejamento = performance.now();
591
+ const politicaCache = opcoes.politicaCache ?? "auto";
592
+ if (planoEscopo.bloqueios.length > 0) {
593
+ return reconstruirIndices(indicesVazios(), planoEscopo, {
594
+ politica: politicaCache,
595
+ origem: "nao_aplicavel",
596
+ fasesMs: {
597
+ planejamento: Number((fimPlanejamento - inicioTotal).toFixed(3)),
598
+ catalogacao: 0,
599
+ dependencias: 0,
600
+ assinaturas: 0,
601
+ indexacao: 0,
602
+ total: Number((performance.now() - inicioTotal).toFixed(3)),
603
+ },
604
+ }, {
605
+ diretoriosVisitados: 0,
606
+ arquivosCatalogados: 0,
607
+ leiturasConteudo: 0,
608
+ bytesLidos: 0,
609
+ acertosMemoriaConteudo: 0,
610
+ origem: "plano_explicito",
611
+ diretoriosValidadosCache: 0,
612
+ });
613
+ }
614
+ const exigirCabecalhoCodigoGovernado = await workspaceExigeCabecalhoCodigoGovernado(contexto.baseProjeto, contexto.configCarregada?.config.modoEstrito === true);
615
+ const identidadeCache = criarIdentidadeCache(contexto, configuracaoEscopo, planoEscopo, exigirCabecalhoCodigoGovernado);
616
+ const cache = new CacheIncrementalDrift({
617
+ baseProjeto: contexto.baseProjeto,
618
+ politica: politicaCache,
619
+ identidade: identidadeCache,
620
+ observador: opcoes.observador,
621
+ });
622
+ const catalogo = await criarCatalogoPersistenteDrift({
623
+ baseDiretorio: contexto.baseProjeto,
624
+ arquivos: planoEscopo.estrategia === "arquivos_vinculados" ? planoEscopo.arquivos : [],
625
+ raizes: planoEscopo.estrategia === "projeto" ? planoEscopo.diretorios : [],
626
+ extensoes: EXTENSOES_ARQUIVOS_RASTREAVEIS_DRIFT,
627
+ diretoriosIgnorados: resolverDiretoriosIgnoradosAtivos({
628
+ escopo: configuracaoEscopo.escopo,
629
+ ignorarWorktrees: configuracaoEscopo.ignorarWorktrees,
630
+ ignorarConsumidoresLaterais: configuracaoEscopo.ignorarConsumidoresLaterais,
631
+ }),
632
+ observador: opcoes.observador,
633
+ }, { politica: politicaCache, identidade: identidadeCache });
634
+ const fimCatalogacao = performance.now();
635
+ try {
636
+ planoEscopo = await expandirDependenciasPlanoDrift(contexto, planoEscopo, catalogo, cache);
637
+ if (planoEscopo.estrategia === "projeto") {
638
+ const arquivosTypeScript = catalogo.arquivosCatalogados()
639
+ .filter((arquivo) => EXTENSOES_TYPESCRIPT_DRIFT.has(path.extname(arquivo).toLowerCase()));
640
+ planoEscopo.dependencias = await mapearDependenciasCatalogadasDrift(contexto, catalogo, cache, arquivosTypeScript);
641
+ }
642
+ const fimDependencias = performance.now();
643
+ const membrosUnicos = catalogo.arquivosCatalogados()
644
+ .filter((arquivo) => {
645
+ const extensao = path.extname(arquivo).toLowerCase();
646
+ return EXTENSOES_ANALISE_DRIFT.has(extensao)
647
+ || EXTENSOES_DEPENDENCIA_TYPESCRIPT_DRIFT.has(extensao);
648
+ });
649
+ const estados = await mapearComLimite(membrosUnicos, 8, async (arquivo) => cache.resolverArquivo({
650
+ arquivo,
651
+ analise: "dependencias-v4",
652
+ ler: () => catalogo.ler(arquivo),
653
+ extrair: (conteudo) => extrairReferenciasLocaisDrift(conteudo.texto),
654
+ validar: (valor) => Array.isArray(valor) && valor.every((item) => typeof item === "string"),
655
+ }));
656
+ const arquivosTypeScript = membrosUnicos
657
+ .filter((arquivo) => EXTENSOES_TYPESCRIPT_DRIFT.has(path.extname(arquivo).toLowerCase()));
658
+ const perfis = await mapearComLimite(arquivosTypeScript, 8, async (arquivo) => cache.resolverArquivo({
659
+ arquivo,
660
+ analise: "agrupamento-semantico-ts-v1",
661
+ ler: () => catalogo.ler(arquivo),
662
+ extrair: (conteudo) => extrairPerfilAgrupamentoTypeScript(arquivo, conteudo.texto),
663
+ validar: perfilAgrupamentoTypeScriptValido,
664
+ }));
665
+ const perfisPorArquivo = new Map(perfis.map((perfil) => [
666
+ chaveCaminho(path.resolve(contexto.baseProjeto, perfil.caminho)),
667
+ perfil.valor,
668
+ ]));
669
+ const grupos = construirGruposIncrementais(catalogo.arquivosCatalogados(), planoEscopo.dependencias, perfisPorArquivo);
670
+ const estadoPorArquivo = new Map(estados.map((estado) => [chaveRelativa(estado.caminho), estado]));
671
+ const fimAssinaturas = performance.now();
672
+ const resultadosGrupos = await mapearComLimite(grupos, 8, async (grupo) => {
673
+ const membros = grupo.map((arquivo) => {
674
+ const estado = estadoPorArquivo.get(chaveRelativa(pathRelativo(contexto.baseProjeto, arquivo)));
675
+ if (!estado) {
676
+ throw new Error(`estado_cache_arquivo_ausente:${arquivo}`);
677
+ }
678
+ return { caminho: arquivo, contentHash: estado.contentHash };
679
+ });
680
+ const catalogoGrupo = new CatalogoFiltradoDrift(catalogo, grupo);
681
+ return cache.resolverGrupo({
682
+ membros,
683
+ calcular: () => calcularIndices(planoEscopo.diretorios, catalogoGrupo, exigirCabecalhoCodigoGovernado),
684
+ validar: (valor) => (validarIndicesSerializaveis(valor)
685
+ && indicesPermanecemNoCatalogo(valor, catalogoGrupo)),
686
+ });
687
+ });
688
+ await cache.finalizar();
689
+ const fimIndexacao = performance.now();
690
+ const serializaveis = mesclarIndices(resultadosGrupos.map((resultado) => resultado.valor), catalogo.arquivosCatalogados());
691
+ const metricasIncrementais = cache.metricas();
692
+ const origem = resultadosGrupos.length > 0
693
+ && resultadosGrupos.every((resultado) => resultado.origem === "cache")
694
+ ? "cache"
695
+ : "calculado";
696
+ return reconstruirIndices(serializaveis, planoEscopo, {
697
+ politica: politicaCache,
698
+ origem,
699
+ chave: cache.identidadeDigest,
700
+ incremental: metricasIncrementais,
701
+ fasesMs: {
702
+ planejamento: Number((fimPlanejamento - inicioTotal).toFixed(3)),
703
+ catalogacao: Number((fimCatalogacao - fimPlanejamento).toFixed(3)),
704
+ dependencias: Number((fimDependencias - fimCatalogacao).toFixed(3)),
705
+ assinaturas: Number((fimAssinaturas - fimDependencias).toFixed(3)),
706
+ indexacao: Number((fimIndexacao - fimAssinaturas).toFixed(3)),
707
+ total: Number((fimIndexacao - inicioTotal).toFixed(3)),
708
+ },
709
+ }, catalogo.metricas(), catalogo);
710
+ }
711
+ finally {
712
+ await cache.finalizar();
713
+ }
90
714
  }
91
715
  //# sourceMappingURL=drift.part13.js.map