@semacode/cli 2.3.0 → 2.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (177) hide show
  1. package/LICENSE +39 -39
  2. package/README.md +251 -228
  3. package/dist/agentEntryPoints.js +551 -550
  4. package/dist/angular-consumer-standalone.d.ts +3 -1
  5. package/dist/angular-consumer-standalone.js +12 -8
  6. package/dist/drift.part01.d.ts +32 -2
  7. package/dist/drift.part01.js +2 -0
  8. package/dist/drift.part04.d.ts +3 -2
  9. package/dist/drift.part04.js +6 -3
  10. package/dist/drift.part05.d.ts +2 -1
  11. package/dist/drift.part05.js +4 -3
  12. package/dist/drift.part06.d.ts +2 -1
  13. package/dist/drift.part06.js +9 -5
  14. package/dist/drift.part07.d.ts +11 -10
  15. package/dist/drift.part07.js +40 -30
  16. package/dist/drift.part08.d.ts +2 -1
  17. package/dist/drift.part08.js +4 -3
  18. package/dist/drift.part11.js +71 -6
  19. package/dist/drift.part12.js +14 -1
  20. package/dist/drift.part13.d.ts +42 -7
  21. package/dist/drift.part13.js +660 -36
  22. package/dist/driftCache.d.ts +49 -0
  23. package/dist/driftCache.js +311 -0
  24. package/dist/driftCacheIncremental.d.ts +98 -0
  25. package/dist/driftCacheIncremental.js +596 -0
  26. package/dist/driftCatalogo.d.ts +91 -0
  27. package/dist/driftCatalogo.js +657 -0
  28. package/dist/driftCatalogoPersistente.d.ts +8 -0
  29. package/dist/driftCatalogoPersistente.js +77 -0
  30. package/dist/driftEscopo.d.ts +23 -0
  31. package/dist/driftEscopo.js +563 -0
  32. package/dist/driftEscopoReferencias.d.ts +4 -0
  33. package/dist/driftEscopoReferencias.js +265 -0
  34. package/dist/driftOrcamento.d.ts +12 -0
  35. package/dist/driftOrcamento.js +19 -3
  36. package/dist/execucoesExternas.js +5 -19
  37. package/dist/iaPrompts.js +310 -310
  38. package/dist/index.part01.d.ts +16 -1
  39. package/dist/index.part01.js +80 -4
  40. package/dist/index.part02.js +21 -21
  41. package/dist/index.part03.d.ts +2 -2
  42. package/dist/index.part03.js +14 -3
  43. package/dist/index.part04.d.ts +2 -2
  44. package/dist/index.part04.js +113 -101
  45. package/dist/index.part05.d.ts +1 -1
  46. package/dist/index.part05.js +99 -22
  47. package/dist/index.part06.js +3 -2
  48. package/dist/index.part07.js +24 -24
  49. package/dist/index.part08.js +1 -1
  50. package/dist/init/templates.part01.js +393 -393
  51. package/dist/init/templates.part02.js +189 -189
  52. package/dist/initTemplatesBackend.js +73 -73
  53. package/dist/initTemplatesBase.js +81 -81
  54. package/dist/initTemplatesFlutter.js +137 -137
  55. package/dist/initTemplatesRuntime.js +350 -350
  56. package/dist/initTemplatesWeb.js +309 -309
  57. package/dist/pipelineConteudo/command.js +1 -36
  58. package/dist/projeto.d.ts +1 -1
  59. package/dist/projetoCarregar.d.ts +2 -2
  60. package/dist/projetoCarregar.js +47 -24
  61. package/dist/projetoCatalogo.d.ts +7 -0
  62. package/dist/projetoCatalogo.js +125 -0
  63. package/dist/projetoTipos.d.ts +14 -5
  64. package/dist/sync/index.js +35 -35
  65. package/docs/README.md +34 -34
  66. package/docs/ai-integration.md +1 -7
  67. package/docs/ai-onboarding.md +62 -62
  68. package/docs/ai-workflow.md +4 -0
  69. package/docs/auth.md +26 -26
  70. package/docs/cli.md +79 -79
  71. package/docs/commands.md +16 -13
  72. package/docs/database.md +15 -15
  73. package/docs/deploy.md +41 -41
  74. package/docs/descoberta-capacidades.md +106 -106
  75. package/docs/documentation.md +37 -46
  76. package/docs/env.md +16 -16
  77. package/docs/frontend.md +41 -41
  78. package/docs/getting-started.md +57 -57
  79. package/docs/i18n.md +15 -15
  80. package/docs/pipeline-conteudo.md +246 -246
  81. package/docs/profiles.md +54 -54
  82. package/docs/repositories.md +43 -43
  83. package/docs/rollback.md +31 -31
  84. package/docs/security.md +32 -32
  85. package/docs/sistemas-interativos.md +373 -378
  86. package/docs/support.md +8 -8
  87. package/docs/testing.md +51 -44
  88. package/docs/vocabulary.md +29 -29
  89. package/exemplos/agendamento.sema +1 -1
  90. package/exemplos/assinatura.sema +1 -1
  91. package/exemplos/auditoria.sema +1 -1
  92. package/exemplos/autenticacao.sema +1 -1
  93. package/exemplos/author_obra_comum.sema +1 -1
  94. package/exemplos/author_tema_sensivel.sema +1 -1
  95. package/exemplos/automacao.sema +1 -1
  96. package/exemplos/cadastro_usuario.sema +1 -1
  97. package/exemplos/calculadora.sema +1 -1
  98. package/exemplos/crud_simples.sema +1 -1
  99. package/exemplos/estoque.sema +1 -1
  100. package/exemplos/exportacao.sema +1 -1
  101. package/exemplos/fila.sema +1 -1
  102. package/exemplos/integracao_externa.sema +1 -1
  103. package/exemplos/multi_tenant.sema +1 -1
  104. package/exemplos/notificacao.sema +1 -1
  105. package/exemplos/operacao_estrategia.sema +132 -132
  106. package/exemplos/operacao_estrategia_discovery.sema +220 -220
  107. package/exemplos/operacao_estrategia_fluxo.sema +114 -114
  108. package/exemplos/operacao_estrategia_gates.sema +106 -106
  109. package/exemplos/operacao_estrategia_quarentena.sema +133 -133
  110. package/exemplos/operacao_estrategia_rollout.sema +124 -124
  111. package/exemplos/pagamento.sema +1 -1
  112. package/exemplos/pagamento_dominio.sema +1 -1
  113. package/exemplos/pedido.sema +1 -1
  114. package/exemplos/permissao.sema +1 -1
  115. package/exemplos/persistencia_vendor_first.sema +1 -1
  116. package/exemplos/pipeline-conteudo/README.md +44 -44
  117. package/exemplos/pipeline-conteudo/alvos.json +23 -23
  118. package/exemplos/pipeline-conteudo/definicao.json +136 -136
  119. package/exemplos/profile_conversas.sema +165 -165
  120. package/exemplos/profile_game.sema +1 -1
  121. package/exemplos/profile_legal.sema +1 -1
  122. package/exemplos/profile_ops.sema +1 -1
  123. package/exemplos/profile_research.sema +1 -1
  124. package/exemplos/profile_simulation.sema +211 -211
  125. package/exemplos/profile_software.sema +1 -1
  126. package/exemplos/profile_workflow_n8n.sema +1 -1
  127. package/exemplos/relatorio.sema +1 -1
  128. package/exemplos/replica_analitica_erp.sema +1 -1
  129. package/exemplos/sistemas-interativos/README.md +100 -100
  130. package/exemplos/sistemas-interativos/advanced/acceptance-context-evaluate-valid.json +5 -5
  131. package/exemplos/sistemas-interativos/advanced/acceptance-lock-valid.json +16 -16
  132. package/exemplos/sistemas-interativos/advanced/asset-provenance-valid.json +32 -32
  133. package/exemplos/sistemas-interativos/advanced/autonomy-repair-valid.json +93 -93
  134. package/exemplos/sistemas-interativos/advanced/control-run-definition-valid.json +78 -78
  135. package/exemplos/sistemas-interativos/advanced/control-run-valid.json +27 -27
  136. package/exemplos/sistemas-interativos/advanced/distributed-workers-valid.json +79 -79
  137. package/exemplos/sistemas-interativos/advanced/editor-state-valid.json +42 -42
  138. package/exemplos/sistemas-interativos/advanced/engine-snapshot-after-valid.json +32 -32
  139. package/exemplos/sistemas-interativos/advanced/engine-snapshot-before-valid.json +23 -23
  140. package/exemplos/sistemas-interativos/advanced/job-orchestration-valid.json +39 -39
  141. package/exemplos/sistemas-interativos/advanced/multimodal-evidence-valid.json +46 -46
  142. package/exemplos/sistemas-interativos/advanced/multiplayer-authority-valid.json +39 -39
  143. package/exemplos/sistemas-interativos/advanced/playtest-fuzz-valid.json +37 -37
  144. package/exemplos/sistemas-interativos/advanced/portability-valid.json +104 -104
  145. package/exemplos/sistemas-interativos/advanced/temporal-evidence-valid.json +27 -27
  146. package/exemplos/sistemas-interativos/advanced/temporal-valid.json +118 -118
  147. package/exemplos/sistemas-interativos/experience-ir-valid.json +459 -459
  148. package/exemplos/sistemas-interativos/game-2d.json +83 -83
  149. package/exemplos/sistemas-interativos/game-3d-human.json +81 -81
  150. package/exemplos/sistemas-interativos/game-pixel-16-bit.json +97 -97
  151. package/exemplos/sistemas-interativos/game-pixel-8-bit.json +94 -94
  152. package/exemplos/sistemas-interativos/game-xr-human.json +80 -80
  153. package/exemplos/sistemas-interativos/hybrid-2-5d.json +108 -108
  154. package/exemplos/sistemas-interativos/protocol-mutating-rollback-valid.json +75 -75
  155. package/exemplos/sistemas-interativos/protocol-read-only-valid.json +58 -58
  156. package/exemplos/sistemas-interativos/simulation-2d-controlled.json +97 -97
  157. package/exemplos/sistemas-interativos/simulation-3d-calibrated-autonomous.json +141 -141
  158. package/exemplos/sistemas-interativos/simulation-headless-autonomous-batch.json +112 -112
  159. package/exemplos/sistemas-interativos/simulation-pixel-16-bit.json +103 -103
  160. package/exemplos/sistemas-interativos/simulation-text-controlled.json +95 -95
  161. package/exemplos/testes_embutidos.sema +1 -1
  162. package/exemplos/tratamento_erro.sema +1 -1
  163. package/exemplos/upload_arquivo.sema +1 -1
  164. package/exemplos/webhook.sema +1 -1
  165. package/node_modules/@sema/gerador-cpp/dist/index.js +176 -176
  166. package/node_modules/@sema/gerador-cpp/package.json +1 -1
  167. package/node_modules/@sema/gerador-css/dist/index.part01.js +10 -10
  168. package/node_modules/@sema/gerador-css/dist/index.part02.js +460 -460
  169. package/node_modules/@sema/gerador-dotnet/dist/index.js +169 -169
  170. package/node_modules/@sema/gerador-dotnet/package.json +1 -1
  171. package/node_modules/@sema/gerador-html/dist/index.js +17 -17
  172. package/node_modules/@sema/gerador-lua/dist/index.js +51 -51
  173. package/node_modules/@sema/gerador-php/dist/index.js +113 -113
  174. package/node_modules/@sema/gerador-python/dist/index.part02.js +3 -3
  175. package/node_modules/@sema/gerador-typescript/dist/index.part02.js +11 -11
  176. package/node_modules/@sema/nucleo/dist/diagnosticos/melhorador.js +42 -42
  177. package/package.json +3 -3
@@ -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