@semacode/cli 2.3.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (267) hide show
  1. package/LICENSE +39 -39
  2. package/README.md +112 -41
  3. package/dist/agentContextPack.js +14 -10
  4. package/dist/agentEntryPoints.d.ts +5 -0
  5. package/dist/agentEntryPoints.js +102 -91
  6. package/dist/angular-consumer-standalone.d.ts +3 -1
  7. package/dist/angular-consumer-standalone.js +12 -8
  8. package/dist/bin.d.ts +6 -0
  9. package/dist/bin.js +130 -0
  10. package/dist/cliArgs.js +4 -4
  11. package/dist/cliControlError.d.ts +12 -0
  12. package/dist/cliControlError.js +47 -0
  13. package/dist/cliGrammar.d.ts +11 -0
  14. package/dist/cliGrammar.js +551 -0
  15. package/dist/cliHelp.d.ts +13 -0
  16. package/dist/cliHelp.js +19 -0
  17. package/dist/cliHelpTexto.d.ts +3 -0
  18. package/dist/cliHelpTexto.js +168 -0
  19. package/dist/cliRuntime.d.ts +2 -0
  20. package/dist/cliRuntime.js +31 -0
  21. package/dist/comandos.js +9 -22
  22. package/dist/contexto.js +5 -5
  23. package/dist/dev/index.d.ts +1 -0
  24. package/dist/dev/index.js +51 -9
  25. package/dist/discovery/catalog.js +3 -3
  26. package/dist/distribuicao/filesystemGlobal.d.ts +63 -0
  27. package/dist/distribuicao/filesystemGlobal.js +701 -0
  28. package/dist/distribuicao/index.d.ts +7 -0
  29. package/dist/distribuicao/index.js +227 -0
  30. package/dist/distribuicao/launcherGlobal.d.ts +53 -0
  31. package/dist/distribuicao/launcherGlobal.js +643 -0
  32. package/dist/distribuicao/launcherWindows.d.ts +28 -0
  33. package/dist/distribuicao/launcherWindows.js +326 -0
  34. package/dist/distribuicao/lockContextGlobal.d.ts +10 -0
  35. package/dist/distribuicao/lockContextGlobal.js +17 -0
  36. package/dist/distribuicao/lockGlobal.d.ts +6 -0
  37. package/dist/distribuicao/lockGlobal.js +520 -0
  38. package/dist/distribuicao/skillGlobal.d.ts +48 -0
  39. package/dist/distribuicao/skillGlobal.js +652 -0
  40. package/dist/distribuicao/skillIntentPolicy.d.ts +21 -0
  41. package/dist/distribuicao/skillIntentPolicy.js +115 -0
  42. package/dist/distribuicao/tipos.d.ts +50 -0
  43. package/dist/distribuicao/tipos.js +10 -0
  44. package/dist/distribuicao/versaoSemantica.d.ts +3 -0
  45. package/dist/distribuicao/versaoSemantica.js +62 -0
  46. package/dist/drift.part01.d.ts +34 -2
  47. package/dist/drift.part01.js +3 -0
  48. package/dist/drift.part04.d.ts +12 -2
  49. package/dist/drift.part04.js +89 -15
  50. package/dist/drift.part05.d.ts +2 -1
  51. package/dist/drift.part05.js +9 -6
  52. package/dist/drift.part06.d.ts +2 -1
  53. package/dist/drift.part06.js +115 -24
  54. package/dist/drift.part07.d.ts +11 -10
  55. package/dist/drift.part07.js +261 -255
  56. package/dist/drift.part08.d.ts +2 -1
  57. package/dist/drift.part08.js +35 -25
  58. package/dist/drift.part11.js +279 -32
  59. package/dist/drift.part12.d.ts +1 -1
  60. package/dist/drift.part12.js +196 -11
  61. package/dist/drift.part13.d.ts +18 -2
  62. package/dist/drift.part13.js +654 -76
  63. package/dist/drift.part14.js +21 -7
  64. package/dist/driftCacheCas.d.ts +43 -0
  65. package/dist/driftCacheCas.js +351 -0
  66. package/dist/driftCacheFilesystem.d.ts +64 -0
  67. package/dist/driftCacheFilesystem.js +313 -0
  68. package/dist/driftCacheModes.d.ts +38 -0
  69. package/dist/driftCacheModes.js +147 -0
  70. package/dist/driftCacheStore.d.ts +80 -0
  71. package/dist/driftCacheStore.js +603 -0
  72. package/dist/driftCatalogo.d.ts +65 -0
  73. package/dist/driftCatalogo.js +516 -0
  74. package/dist/driftEscopo.d.ts +21 -0
  75. package/dist/driftEscopo.js +647 -0
  76. package/dist/driftEscopoReferencias.d.ts +8 -0
  77. package/dist/driftEscopoReferencias.js +612 -0
  78. package/dist/driftOrcamento.d.ts +6 -0
  79. package/dist/driftOrcamento.js +20 -3
  80. package/dist/geracaoCore.js +4 -6
  81. package/dist/iaPrompts.d.ts +3 -3
  82. package/dist/iaPrompts.js +13 -14
  83. package/dist/index.d.ts +4 -1
  84. package/dist/index.js +6 -25
  85. package/dist/index.part01.d.ts +21 -14
  86. package/dist/index.part01.js +20 -165
  87. package/dist/index.part02.js +57 -43
  88. package/dist/index.part03.d.ts +23 -1
  89. package/dist/index.part03.js +83 -8
  90. package/dist/index.part04.d.ts +10 -2
  91. package/dist/index.part04.js +48 -14
  92. package/dist/index.part05.d.ts +1 -1
  93. package/dist/index.part05.js +109 -30
  94. package/dist/index.part06.js +34 -16
  95. package/dist/index.part07.js +31 -27
  96. package/dist/index.part08.d.ts +1 -1
  97. package/dist/index.part08.js +23 -28
  98. package/dist/init/templates.part01.js +393 -393
  99. package/dist/init/templates.part02.js +189 -189
  100. package/dist/initCommand.js +5 -1
  101. package/dist/initTemplatesBackend.js +73 -73
  102. package/dist/initTemplatesBase.js +7 -5
  103. package/dist/initTemplatesFlutter.js +137 -137
  104. package/dist/initTemplatesRuntime.js +350 -350
  105. package/dist/initTemplatesWeb.js +309 -309
  106. package/dist/pipelineConteudo/command.d.ts +1 -0
  107. package/dist/pipelineConteudo/command.js +4 -32
  108. package/dist/pipelineConteudo/help.d.ts +2 -0
  109. package/dist/pipelineConteudo/help.js +33 -0
  110. package/dist/profileAuthorCommand.js +3 -7
  111. package/dist/profileCommand.js +3 -7
  112. package/dist/projeto.d.ts +1 -1
  113. package/dist/projetoCarregar.d.ts +2 -2
  114. package/dist/projetoCarregar.js +69 -28
  115. package/dist/projetoCatalogo.d.ts +8 -0
  116. package/dist/projetoCatalogo.js +164 -0
  117. package/dist/projetoOrigens.d.ts +2 -0
  118. package/dist/projetoOrigens.js +65 -9
  119. package/dist/projetoTipos.d.ts +15 -5
  120. package/dist/resultadoCli.d.ts +20 -0
  121. package/dist/resultadoCli.js +57 -0
  122. package/dist/saidaCli.d.ts +35 -0
  123. package/dist/saidaCli.js +118 -0
  124. package/dist/sistemasInterativos/acceptanceEvidence.d.ts +22 -0
  125. package/dist/sistemasInterativos/acceptanceEvidence.js +345 -0
  126. package/dist/sistemasInterativos/engineObservation.d.ts +12 -0
  127. package/dist/sistemasInterativos/engineObservation.js +438 -0
  128. package/dist/sistemasInterativos/jobOrchestration.d.ts +2 -0
  129. package/dist/sistemasInterativos/jobOrchestration.js +204 -0
  130. package/dist/sistemasInterativos/operationPrimitives.d.ts +21 -0
  131. package/dist/sistemasInterativos/operationPrimitives.js +194 -0
  132. package/dist/sistemasInterativos/operations.d.ts +4 -39
  133. package/dist/sistemasInterativos/operations.js +5 -1164
  134. package/dist/skillCommand.d.ts +5 -0
  135. package/dist/skillCommand.js +88 -0
  136. package/dist/sync/index.js +35 -35
  137. package/docs/README.md +11 -7
  138. package/docs/ai-integration.md +18 -11
  139. package/docs/ai-onboarding.md +81 -62
  140. package/docs/ai-workflow.md +10 -4
  141. package/docs/auth.md +26 -26
  142. package/docs/cli.md +197 -79
  143. package/docs/commands.md +30 -6
  144. package/docs/database.md +15 -15
  145. package/docs/deploy.md +54 -41
  146. package/docs/documentation.md +11 -10
  147. package/docs/drift-cache.md +108 -0
  148. package/docs/env.md +16 -16
  149. package/docs/frontend.md +41 -41
  150. package/docs/getting-started.md +82 -57
  151. package/docs/i18n.md +15 -15
  152. package/docs/repositories.md +60 -43
  153. package/docs/rollback.md +38 -31
  154. package/docs/security.md +54 -32
  155. package/docs/sistemas-interativos.md +27 -27
  156. package/docs/support.md +8 -8
  157. package/docs/testing.md +123 -17
  158. package/docs/vocabulary.md +29 -29
  159. package/exemplos/agendamento.sema +1 -1
  160. package/exemplos/assinatura.sema +1 -1
  161. package/exemplos/auditoria.sema +1 -1
  162. package/exemplos/autenticacao.sema +1 -1
  163. package/exemplos/author_obra_comum.sema +1 -1
  164. package/exemplos/author_tema_sensivel.sema +1 -1
  165. package/exemplos/automacao.sema +1 -1
  166. package/exemplos/cadastro_usuario.sema +1 -1
  167. package/exemplos/calculadora.sema +1 -1
  168. package/exemplos/crud_simples.sema +1 -1
  169. package/exemplos/estoque.sema +1 -1
  170. package/exemplos/exportacao.sema +1 -1
  171. package/exemplos/fila.sema +1 -1
  172. package/exemplos/integracao_externa.sema +1 -1
  173. package/exemplos/multi_tenant.sema +1 -1
  174. package/exemplos/notificacao.sema +1 -1
  175. package/exemplos/operacao_estrategia.sema +132 -132
  176. package/exemplos/operacao_estrategia_discovery.sema +220 -220
  177. package/exemplos/operacao_estrategia_fluxo.sema +114 -114
  178. package/exemplos/operacao_estrategia_gates.sema +106 -106
  179. package/exemplos/operacao_estrategia_quarentena.sema +133 -133
  180. package/exemplos/operacao_estrategia_rollout.sema +124 -124
  181. package/exemplos/pagamento.sema +1 -1
  182. package/exemplos/pagamento_dominio.sema +1 -1
  183. package/exemplos/pedido.sema +1 -1
  184. package/exemplos/permissao.sema +1 -1
  185. package/exemplos/persistencia_vendor_first.sema +1 -1
  186. package/exemplos/profile_conversas.sema +165 -165
  187. package/exemplos/profile_game.sema +1 -1
  188. package/exemplos/profile_legal.sema +1 -1
  189. package/exemplos/profile_ops.sema +1 -1
  190. package/exemplos/profile_research.sema +1 -1
  191. package/exemplos/profile_software.sema +1 -1
  192. package/exemplos/profile_workflow_n8n.sema +1 -1
  193. package/exemplos/relatorio.sema +1 -1
  194. package/exemplos/replica_analitica_erp.sema +1 -1
  195. package/exemplos/testes_embutidos.sema +1 -1
  196. package/exemplos/tratamento_erro.sema +1 -1
  197. package/exemplos/upload_arquivo.sema +1 -1
  198. package/exemplos/webhook.sema +1 -1
  199. package/node_modules/@sema/gerador-cpp/dist/index.js +176 -176
  200. package/node_modules/@sema/gerador-css/dist/index.part01.js +10 -10
  201. package/node_modules/@sema/gerador-css/dist/index.part02.js +460 -460
  202. package/node_modules/@sema/gerador-dotnet/dist/index.js +169 -169
  203. package/node_modules/@sema/gerador-html/dist/index.js +17 -17
  204. package/node_modules/@sema/gerador-python/dist/index.part02.js +3 -3
  205. package/node_modules/@sema/gerador-typescript/dist/index.part02.js +11 -11
  206. package/node_modules/@sema/nucleo/dist/diagnosticos/melhorador.js +42 -42
  207. package/node_modules/@sema/nucleo/dist/semantico/analisador.d.ts +1 -0
  208. package/node_modules/@sema/nucleo/dist/semantico/analisador.js +1 -0
  209. package/package.json +7 -2
  210. package/scripts/postinstall.mjs +148 -0
  211. package/skills/sema/SKILL.md +199 -0
  212. package/skills/sema/agents/openai.yaml +4 -0
  213. package/node_modules/@sema/gerador-cpp/dist/index.js.map +0 -1
  214. package/node_modules/@sema/gerador-css/dist/index.js.map +0 -1
  215. package/node_modules/@sema/gerador-css/dist/index.part01.js.map +0 -1
  216. package/node_modules/@sema/gerador-css/dist/index.part02.js.map +0 -1
  217. package/node_modules/@sema/gerador-dart/dist/index.js.map +0 -1
  218. package/node_modules/@sema/gerador-dotnet/dist/index.js.map +0 -1
  219. package/node_modules/@sema/gerador-html/dist/index.js.map +0 -1
  220. package/node_modules/@sema/gerador-javascript/dist/index.js.map +0 -1
  221. package/node_modules/@sema/gerador-lua/dist/index.js.map +0 -1
  222. package/node_modules/@sema/gerador-php/dist/index.js.map +0 -1
  223. package/node_modules/@sema/gerador-python/dist/index.js.map +0 -1
  224. package/node_modules/@sema/gerador-python/dist/index.part01.js.map +0 -1
  225. package/node_modules/@sema/gerador-python/dist/index.part02.js.map +0 -1
  226. package/node_modules/@sema/gerador-typescript/dist/index.js.map +0 -1
  227. package/node_modules/@sema/gerador-typescript/dist/index.part01.js.map +0 -1
  228. package/node_modules/@sema/gerador-typescript/dist/index.part02.js.map +0 -1
  229. package/node_modules/@sema/gerador-typescript/dist/index.part03.js.map +0 -1
  230. package/node_modules/@sema/nucleo/dist/ast/tipos.js.map +0 -1
  231. package/node_modules/@sema/nucleo/dist/diagnosticos/index.js.map +0 -1
  232. package/node_modules/@sema/nucleo/dist/diagnosticos/melhorador.js.map +0 -1
  233. package/node_modules/@sema/nucleo/dist/diagnosticos/snippets.js.map +0 -1
  234. package/node_modules/@sema/nucleo/dist/formatador/index.js.map +0 -1
  235. package/node_modules/@sema/nucleo/dist/formatador/index.part01.js.map +0 -1
  236. package/node_modules/@sema/nucleo/dist/formatador/index.part02.js.map +0 -1
  237. package/node_modules/@sema/nucleo/dist/index.js.map +0 -1
  238. package/node_modules/@sema/nucleo/dist/ir/conversor.js.map +0 -1
  239. package/node_modules/@sema/nucleo/dist/ir/conversor.part01.js.map +0 -1
  240. package/node_modules/@sema/nucleo/dist/ir/conversor.part02.js.map +0 -1
  241. package/node_modules/@sema/nucleo/dist/ir/conversor.part03.js.map +0 -1
  242. package/node_modules/@sema/nucleo/dist/ir/modelos.js.map +0 -1
  243. package/node_modules/@sema/nucleo/dist/lexer/lexer.js.map +0 -1
  244. package/node_modules/@sema/nucleo/dist/lexer/tokens.js.map +0 -1
  245. package/node_modules/@sema/nucleo/dist/parser/parser.declaracoes.js.map +0 -1
  246. package/node_modules/@sema/nucleo/dist/parser/parser.js.map +0 -1
  247. package/node_modules/@sema/nucleo/dist/parser/parser.modulo.js.map +0 -1
  248. package/node_modules/@sema/nucleo/dist/parser/parser.part01.js.map +0 -1
  249. package/node_modules/@sema/nucleo/dist/parser/parser.part02.js.map +0 -1
  250. package/node_modules/@sema/nucleo/dist/parser/parser.part03.js.map +0 -1
  251. package/node_modules/@sema/nucleo/dist/persistencia/contratos.js.map +0 -1
  252. package/node_modules/@sema/nucleo/dist/semantico/analisador.js.map +0 -1
  253. package/node_modules/@sema/nucleo/dist/semantico/analisador.part01.js.map +0 -1
  254. package/node_modules/@sema/nucleo/dist/semantico/analisador.part02.js.map +0 -1
  255. package/node_modules/@sema/nucleo/dist/semantico/analisador.part03.js.map +0 -1
  256. package/node_modules/@sema/nucleo/dist/semantico/analisador.part04.js.map +0 -1
  257. package/node_modules/@sema/nucleo/dist/semantico/analisador.part05.js.map +0 -1
  258. package/node_modules/@sema/nucleo/dist/semantico/analisador.part06.js.map +0 -1
  259. package/node_modules/@sema/nucleo/dist/semantico/analisador.part07.js.map +0 -1
  260. package/node_modules/@sema/nucleo/dist/semantico/analisador.part08.js.map +0 -1
  261. package/node_modules/@sema/nucleo/dist/semantico/estruturas.js.map +0 -1
  262. package/node_modules/@sema/nucleo/dist/semantico/estruturas.part01.js.map +0 -1
  263. package/node_modules/@sema/nucleo/dist/semantico/estruturas.part02.js.map +0 -1
  264. package/node_modules/@sema/nucleo/dist/semantico/orcamentoSemantico.js.map +0 -1
  265. package/node_modules/@sema/nucleo/dist/semantico/seguranca.js.map +0 -1
  266. package/node_modules/@sema/nucleo/dist/util/arquivos.js.map +0 -1
  267. package/node_modules/@sema/padroes/dist/index.js.map +0 -1
@@ -1,8 +1,8 @@
1
1
  // SEMA-GOVERNED: sema.governanca_ia_contexto
2
2
  // Descricao: CLI particionada; consulte contratos/sema/governanca_ia_contexto.sema antes de editar.
3
- import { readFile } from "node:fs/promises";
3
+ import { lstat, open, readdir, realpath } from "node:fs/promises";
4
4
  import path from "node:path";
5
- import { listarArquivosRecursivos, paraIdentificadorModulo } from "./drift.part04.js";
5
+ import { paraIdentificadorModulo } from "./drift.part04.js";
6
6
  import { definirDiretoriosIgnoradosAtivos, obterDiretoriosIgnoradosAtivos, normalizarFragmentoArquivo, quebrarTermosEscopo, resolverDiretoriosIgnoradosAtivos, resolverOpcoesDrift } from "./drift.part01.js";
7
7
  import { filtrarCaminhosEscopoReal, resolverDiretoriosCodigoEscopoReal, textoCombinaEscopo } from "./drift.part02.js";
8
8
  import { analisarDriftLegado } from "./drift.part11.js";
@@ -97,11 +97,164 @@ export function registrarArquivoImpactado(mapa, arquivo, linhas, motivos) {
97
97
  motivos: [...new Set(motivos)],
98
98
  });
99
99
  }
100
- export async function listarArquivosImpacto(contexto, opcoes) {
100
+ function chaveCaminhoImpacto(caminho) {
101
+ const absoluto = path.normalize(path.resolve(caminho));
102
+ return process.platform === "win32" ? absoluto.toLowerCase() : absoluto;
103
+ }
104
+ function caminhoImpactoEstaDentro(raiz, alvo) {
105
+ const relativo = path.relative(path.resolve(raiz), path.resolve(alvo));
106
+ return relativo === "" || (relativo !== ".."
107
+ && !relativo.startsWith(`..${path.sep}`)
108
+ && !path.isAbsolute(relativo));
109
+ }
110
+ function identidadeArquivoImpactoEstavel(a, b) {
111
+ return a.isFile()
112
+ && b.isFile()
113
+ && !a.isSymbolicLink()
114
+ && !b.isSymbolicLink()
115
+ && a.dev === b.dev
116
+ && a.ino === b.ino
117
+ && a.size === b.size
118
+ && a.mtimeNs === b.mtimeNs
119
+ && a.ctimeNs === b.ctimeNs;
120
+ }
121
+ function identidadeDiretorioImpactoEstavel(a, b) {
122
+ return a.isDirectory()
123
+ && b.isDirectory()
124
+ && !a.isSymbolicLink()
125
+ && !b.isSymbolicLink()
126
+ && a.dev === b.dev
127
+ && a.ino === b.ino
128
+ && a.mtimeNs === b.mtimeNs
129
+ && a.ctimeNs === b.ctimeNs;
130
+ }
131
+ function erroImpactoConfinamento(codigo) {
132
+ return new Error(`impacto_confinamento:${codigo}`);
133
+ }
134
+ async function lerArquivoImpactoConfinado(baseProjeto, baseProjetoReal, arquivo) {
135
+ const absoluto = path.resolve(arquivo);
136
+ if (!caminhoImpactoEstaDentro(baseProjeto, absoluto)) {
137
+ throw erroImpactoConfinamento("fora_workspace");
138
+ }
139
+ const informacaoAntes = await lstat(absoluto, { bigint: true });
140
+ if (!informacaoAntes.isFile() || informacaoAntes.isSymbolicLink()) {
141
+ throw erroImpactoConfinamento("arquivo_irregular");
142
+ }
143
+ const caminhoRealAntes = await realpath(absoluto);
144
+ if (!caminhoImpactoEstaDentro(baseProjetoReal, caminhoRealAntes)) {
145
+ throw erroImpactoConfinamento("fora_workspace_real");
146
+ }
147
+ const handle = await open(absoluto, "r");
148
+ try {
149
+ const informacaoHandleAntes = await handle.stat({ bigint: true });
150
+ const [informacaoCaminhoAberto, caminhoRealAberto] = await Promise.all([
151
+ lstat(absoluto, { bigint: true }),
152
+ realpath(absoluto),
153
+ ]);
154
+ if (!caminhoImpactoEstaDentro(baseProjetoReal, caminhoRealAberto)
155
+ || !identidadeArquivoImpactoEstavel(informacaoAntes, informacaoHandleAntes)
156
+ || !identidadeArquivoImpactoEstavel(informacaoHandleAntes, informacaoCaminhoAberto)) {
157
+ throw erroImpactoConfinamento("arquivo_alterado_antes_leitura");
158
+ }
159
+ const conteudo = await handle.readFile();
160
+ const [informacaoHandleDepois, informacaoCaminhoDepois, caminhoRealDepois] = await Promise.all([
161
+ handle.stat({ bigint: true }),
162
+ lstat(absoluto, { bigint: true }),
163
+ realpath(absoluto),
164
+ ]);
165
+ if (!caminhoImpactoEstaDentro(baseProjetoReal, caminhoRealDepois)
166
+ || !identidadeArquivoImpactoEstavel(informacaoHandleAntes, informacaoHandleDepois)
167
+ || !identidadeArquivoImpactoEstavel(informacaoHandleDepois, informacaoCaminhoDepois)) {
168
+ throw erroImpactoConfinamento("arquivo_alterado_durante_leitura");
169
+ }
170
+ return conteudo.toString("utf8");
171
+ }
172
+ finally {
173
+ await handle.close().catch(() => undefined);
174
+ }
175
+ }
176
+ async function listarDiretorioImpactoConfinado(diretorio, baseProjeto, baseProjetoReal, visitados) {
177
+ const absoluto = path.resolve(diretorio);
178
+ if (!caminhoImpactoEstaDentro(baseProjeto, absoluto)) {
179
+ return [];
180
+ }
181
+ let informacaoAntes;
182
+ try {
183
+ informacaoAntes = await lstat(absoluto, { bigint: true });
184
+ }
185
+ catch (erro) {
186
+ if (["ENOENT", "ENOTDIR"].includes(erro.code ?? "")) {
187
+ return [];
188
+ }
189
+ throw erro;
190
+ }
191
+ if (!informacaoAntes.isDirectory() || informacaoAntes.isSymbolicLink()) {
192
+ return [];
193
+ }
194
+ const caminhoRealAntes = await realpath(absoluto);
195
+ if (!caminhoImpactoEstaDentro(baseProjetoReal, caminhoRealAntes)) {
196
+ return [];
197
+ }
198
+ const chaveReal = chaveCaminhoImpacto(caminhoRealAntes);
199
+ if (visitados.has(chaveReal)) {
200
+ return [];
201
+ }
202
+ visitados.add(chaveReal);
203
+ const entradas = await readdir(absoluto, { withFileTypes: true, encoding: "utf8" });
204
+ const [informacaoDepois, caminhoRealDepois] = await Promise.all([
205
+ lstat(absoluto, { bigint: true }),
206
+ realpath(absoluto),
207
+ ]);
208
+ if (!caminhoImpactoEstaDentro(baseProjetoReal, caminhoRealDepois)
209
+ || !identidadeDiretorioImpactoEstavel(informacaoAntes, informacaoDepois)) {
210
+ throw erroImpactoConfinamento("diretorio_alterado_durante_listagem");
211
+ }
212
+ const ignorados = obterDiretoriosIgnoradosAtivos();
213
+ const encontrados = [];
214
+ for (const entrada of entradas) {
215
+ if (ignorados.has(entrada.name.toLowerCase()) || entrada.isSymbolicLink()) {
216
+ continue;
217
+ }
218
+ const caminhoAtual = path.join(absoluto, entrada.name);
219
+ if (entrada.isDirectory()) {
220
+ encontrados.push(...await listarDiretorioImpactoConfinado(caminhoAtual, baseProjeto, baseProjetoReal, visitados));
221
+ continue;
222
+ }
223
+ if (entrada.isFile() && EXTENSOES_BUSCA_IMPACTO.some((extensao) => entrada.name.toLowerCase().endsWith(extensao))) {
224
+ encontrados.push(caminhoAtual);
225
+ }
226
+ }
227
+ return encontrados;
228
+ }
229
+ export async function listarArquivosImpacto(contexto, opcoes, arquivosPlanejados = []) {
101
230
  const opcoesResolvidas = resolverOpcoesDrift(opcoes);
102
- const arquivos = new Set(filtrarCaminhosEscopoReal(contexto.arquivosProjeto, contexto, opcoesResolvidas));
231
+ const baseProjeto = path.resolve(contexto.baseProjeto);
232
+ const contratos = opcoesResolvidas.escopo === "projeto"
233
+ ? contexto.arquivosProjeto
234
+ : contexto.modulosSelecionados.map((modulo) => modulo.caminho);
235
+ const arquivos = new Set();
236
+ for (const arquivo of filtrarCaminhosEscopoReal(contratos, contexto, opcoesResolvidas)) {
237
+ const absoluto = path.resolve(arquivo);
238
+ if (caminhoImpactoEstaDentro(baseProjeto, absoluto)) {
239
+ arquivos.add(absoluto);
240
+ }
241
+ }
242
+ if (opcoesResolvidas.escopo !== "projeto") {
243
+ for (const arquivo of arquivosPlanejados) {
244
+ if (arquivo.startsWith("[fora_do_workspace]/")) {
245
+ continue;
246
+ }
247
+ const absoluto = path.resolve(baseProjeto, arquivo);
248
+ if (caminhoImpactoEstaDentro(baseProjeto, absoluto)) {
249
+ arquivos.add(absoluto);
250
+ }
251
+ }
252
+ return [...arquivos].sort((a, b) => a.localeCompare(b, "pt-BR"));
253
+ }
254
+ const baseProjetoReal = await realpath(baseProjeto);
255
+ const visitados = new Set();
103
256
  for (const diretorio of resolverDiretoriosCodigoEscopoReal(contexto, opcoesResolvidas)) {
104
- for (const arquivo of await listarArquivosRecursivos(diretorio, EXTENSOES_BUSCA_IMPACTO)) {
257
+ for (const arquivo of await listarDiretorioImpactoConfinado(diretorio, baseProjeto, baseProjetoReal, visitados)) {
105
258
  arquivos.add(arquivo);
106
259
  }
107
260
  }
@@ -162,9 +315,11 @@ export async function gerarMapaImpactoSemantico(contexto, alvoSemantico, mudanca
162
315
  const variantes = construirVariantesSemanticas(alvoSemantico);
163
316
  const termos = [...new Set([...quebrarTermosEscopo(alvoSemantico), ...drift.escopo_aplicado.termosEscopo])];
164
317
  const arquivosImpactados = new Map();
165
- const arquivosBusca = await listarArquivosImpacto(contexto, opcoesResolvidas);
318
+ const arquivosBusca = await listarArquivosImpacto(contexto, opcoesResolvidas, drift.escopo_aplicado.arquivosPlanejados);
319
+ const arquivosBuscaPorChave = new Set(arquivosBusca.map(chaveCaminhoImpacto));
320
+ const baseProjetoReal = await realpath(path.resolve(contexto.baseProjeto));
166
321
  for (const arquivo of arquivosBusca) {
167
- const codigo = await readFile(arquivo, "utf8");
322
+ const codigo = await lerArquivoImpactoConfinado(contexto.baseProjeto, baseProjetoReal, arquivo);
168
323
  const linhas = extrairLinhasComVariantes(codigo, variantes);
169
324
  if (linhas.length > 0) {
170
325
  registrarArquivoImpactado(arquivosImpactados, arquivo, linhas, ["token_semantico_encontrado"]);
@@ -197,21 +352,29 @@ export async function gerarMapaImpactoSemantico(contexto, alvoSemantico, mudanca
197
352
  }
198
353
  for (const task of drift.tasks.filter((item) => tasksAfetadas.has(`${item.modulo}.${item.task}`))) {
199
354
  for (const arquivo of task.arquivosProvaveisEditar) {
200
- registrarArquivoImpactado(arquivosImpactados, arquivo, [], ["arquivo_relacionado_por_drift"]);
355
+ if (arquivosBuscaPorChave.has(chaveCaminhoImpacto(arquivo))) {
356
+ registrarArquivoImpactado(arquivosImpactados, arquivo, [], ["arquivo_relacionado_por_drift"]);
357
+ }
201
358
  }
202
359
  }
203
360
  for (const item of drift.persistencia_real) {
204
361
  if (textoIrCombinaTermos(`${item.alvo} ${item.task} ${item.colunas.join(" ")}`, termos)) {
205
362
  persistenciaAfetada.add(`${item.task}:${item.alvo}`);
206
363
  for (const arquivo of [...item.arquivos, ...item.repositorios]) {
207
- registrarArquivoImpactado(arquivosImpactados, arquivo, [], ["persistencia_relacionada"]);
364
+ if (arquivosBuscaPorChave.has(chaveCaminhoImpacto(arquivo))) {
365
+ registrarArquivoImpactado(arquivosImpactados, arquivo, [], ["persistencia_relacionada"]);
366
+ }
208
367
  }
209
368
  }
210
369
  }
211
370
  const contratosAfetados = ordenarArquivosImpacto([...arquivosImpactados.values()].filter((arquivo) => arquivo.tipo === "contrato")).map((arquivo) => arquivo.arquivo);
371
+ const driftPermiteImpacto = (drift.escopo_aplicado.bloqueios?.length ?? 0) === 0
372
+ && drift.escopo_aplicado.cobertura !== "parcial"
373
+ && drift.vinculos_quebrados.length === 0;
212
374
  return {
213
375
  comando: "impacto",
214
- sucesso: arquivosImpactados.size > 0 || tasksAfetadas.size > 0 || persistenciaAfetada.size > 0,
376
+ sucesso: driftPermiteImpacto
377
+ && (arquivosImpactados.size > 0 || tasksAfetadas.size > 0 || persistenciaAfetada.size > 0),
215
378
  escopo: drift.escopo_aplicado.escopo,
216
379
  alvoSemantico,
217
380
  mudancaProposta,
@@ -240,6 +403,27 @@ export async function gerarMapaImpactoSemantico(contexto, alvoSemantico, mudanca
240
403
  }
241
404
  export async function assistirRenomeacaoSemantica(contexto, nomeAtual, nomeNovo, opcoes) {
242
405
  const impacto = await gerarMapaImpactoSemantico(contexto, nomeAtual, `renomear ${nomeAtual} para ${nomeNovo}`, opcoes);
406
+ if (!impacto.sucesso) {
407
+ return {
408
+ comando: "renomear-semantico",
409
+ sucesso: false,
410
+ escopo: impacto.escopo,
411
+ de: nomeAtual,
412
+ para: nomeNovo,
413
+ arquivos: impacto.arquivos,
414
+ sugestoes: [],
415
+ ordemOperacional: [
416
+ "Renomear primeiro no contrato .sema e nos campos publicos derivados.",
417
+ "Ajustar repositorios, payloads e bridges que materializam o nome antigo.",
418
+ "Rodar sema drift e revisar sugestoes restantes antes de fechar a troca.",
419
+ ],
420
+ validacoes: [
421
+ "Rodar sema validar no contrato renomeado.",
422
+ "Rodar sema drift para confirmar que payload e superficie nao ficaram misturados.",
423
+ "Reexecutar testes e checar snapshots ou fixtures afetados.",
424
+ ],
425
+ };
426
+ }
243
427
  const variantesAntigas = construirVariantesSemanticas(nomeAtual);
244
428
  const variantesNovas = construirVariantesSemanticas(nomeNovo);
245
429
  const mapaSubstituicao = new Map();
@@ -247,8 +431,9 @@ export async function assistirRenomeacaoSemantica(contexto, nomeAtual, nomeNovo,
247
431
  mapaSubstituicao.set(antiga, variantesNovas[indice] ?? nomeNovo);
248
432
  });
249
433
  const sugestoes = [];
434
+ const baseProjetoReal = await realpath(path.resolve(contexto.baseProjeto));
250
435
  for (const arquivo of impacto.arquivos) {
251
- const codigo = await readFile(arquivo.arquivo, "utf8");
436
+ const codigo = await lerArquivoImpactoConfinado(contexto.baseProjeto, baseProjetoReal, arquivo.arquivo);
252
437
  const linhas = codigo.split(/\r?\n/);
253
438
  for (let indice = 0; indice < linhas.length; indice += 1) {
254
439
  const linha = linhas[indice];
@@ -1,8 +1,20 @@
1
1
  import type { ContextoProjetoCarregado } from "./projeto.js";
2
- import type { ConfiguracaoEscopoDriftAplicada, RecursoResolvido, RotaResolvida, SimboloResolvido } from "./drift.part01.js";
2
+ import { type ConfiguracaoEscopoDriftAplicada, type EstadoCacheDriftAplicado, type RecursoResolvido, type RotaResolvida, type SimboloResolvido } from "./drift.part01.js";
3
3
  import { indexarTypeScript } from "./drift.part06.js";
4
4
  import { indexarDart } from "./drift.part07.js";
5
5
  import { indexarPersistenciaDetalhada } from "./drift.part08.js";
6
+ import { type MetricasCatalogoDrift, type ObservadorOperacaoDrift } from "./driftCatalogo.js";
7
+ import { type PlanoEscopoDrift } from "./driftEscopo.js";
8
+ import type { AvisoModoCacheDrift, ModoCacheDrift } from "./driftCacheModes.js";
9
+ export interface LeitorArquivosPlanejadosDrift {
10
+ contem(caminho: string): boolean;
11
+ lerTexto(caminho: string): Promise<string>;
12
+ }
13
+ export interface OpcoesPrepararIndicesDrift {
14
+ observador?: ObservadorOperacaoDrift;
15
+ modoCache?: ModoCacheDrift;
16
+ avisosModoCache?: readonly AvisoModoCacheDrift[];
17
+ }
6
18
  export interface IndicesDriftPreparados {
7
19
  detalhesPersistencia: Awaited<ReturnType<typeof indexarPersistenciaDetalhada>>;
8
20
  indexDart: Awaited<ReturnType<typeof indexarDart>>;
@@ -13,5 +25,9 @@ export interface IndicesDriftPreparados {
13
25
  todosArquivosConhecidos: string[];
14
26
  todosRecursos: RecursoResolvido[];
15
27
  todosSimbolos: SimboloResolvido[];
28
+ planoEscopo: PlanoEscopoDrift;
29
+ cache: EstadoCacheDriftAplicado;
30
+ catalogo: MetricasCatalogoDrift;
31
+ leitorArquivosPlanejados: LeitorArquivosPlanejadosDrift;
16
32
  }
17
- export declare function prepararIndicesDrift(contexto: ContextoProjetoCarregado, configuracaoEscopo: ConfiguracaoEscopoDriftAplicada): Promise<IndicesDriftPreparados>;
33
+ export declare function prepararIndicesDrift(contexto: ContextoProjetoCarregado, configuracaoEscopo: ConfiguracaoEscopoDriftAplicada, opcoes?: OpcoesPrepararIndicesDrift): Promise<IndicesDriftPreparados>;