@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.
- package/LICENSE +39 -39
- package/README.md +112 -41
- package/dist/agentContextPack.js +14 -10
- package/dist/agentEntryPoints.d.ts +5 -0
- package/dist/agentEntryPoints.js +102 -91
- package/dist/angular-consumer-standalone.d.ts +3 -1
- package/dist/angular-consumer-standalone.js +12 -8
- package/dist/bin.d.ts +6 -0
- package/dist/bin.js +130 -0
- package/dist/cliArgs.js +4 -4
- package/dist/cliControlError.d.ts +12 -0
- package/dist/cliControlError.js +47 -0
- package/dist/cliGrammar.d.ts +11 -0
- package/dist/cliGrammar.js +551 -0
- package/dist/cliHelp.d.ts +13 -0
- package/dist/cliHelp.js +19 -0
- package/dist/cliHelpTexto.d.ts +3 -0
- package/dist/cliHelpTexto.js +168 -0
- package/dist/cliRuntime.d.ts +2 -0
- package/dist/cliRuntime.js +31 -0
- package/dist/comandos.js +9 -22
- package/dist/contexto.js +5 -5
- package/dist/dev/index.d.ts +1 -0
- package/dist/dev/index.js +51 -9
- package/dist/discovery/catalog.js +3 -3
- package/dist/distribuicao/filesystemGlobal.d.ts +63 -0
- package/dist/distribuicao/filesystemGlobal.js +701 -0
- package/dist/distribuicao/index.d.ts +7 -0
- package/dist/distribuicao/index.js +227 -0
- package/dist/distribuicao/launcherGlobal.d.ts +53 -0
- package/dist/distribuicao/launcherGlobal.js +643 -0
- package/dist/distribuicao/launcherWindows.d.ts +28 -0
- package/dist/distribuicao/launcherWindows.js +326 -0
- package/dist/distribuicao/lockContextGlobal.d.ts +10 -0
- package/dist/distribuicao/lockContextGlobal.js +17 -0
- package/dist/distribuicao/lockGlobal.d.ts +6 -0
- package/dist/distribuicao/lockGlobal.js +520 -0
- package/dist/distribuicao/skillGlobal.d.ts +48 -0
- package/dist/distribuicao/skillGlobal.js +652 -0
- package/dist/distribuicao/skillIntentPolicy.d.ts +21 -0
- package/dist/distribuicao/skillIntentPolicy.js +115 -0
- package/dist/distribuicao/tipos.d.ts +50 -0
- package/dist/distribuicao/tipos.js +10 -0
- package/dist/distribuicao/versaoSemantica.d.ts +3 -0
- package/dist/distribuicao/versaoSemantica.js +62 -0
- package/dist/drift.part01.d.ts +34 -2
- package/dist/drift.part01.js +3 -0
- package/dist/drift.part04.d.ts +12 -2
- package/dist/drift.part04.js +89 -15
- package/dist/drift.part05.d.ts +2 -1
- package/dist/drift.part05.js +9 -6
- package/dist/drift.part06.d.ts +2 -1
- package/dist/drift.part06.js +115 -24
- package/dist/drift.part07.d.ts +11 -10
- package/dist/drift.part07.js +261 -255
- package/dist/drift.part08.d.ts +2 -1
- package/dist/drift.part08.js +35 -25
- package/dist/drift.part11.js +279 -32
- package/dist/drift.part12.d.ts +1 -1
- package/dist/drift.part12.js +196 -11
- package/dist/drift.part13.d.ts +18 -2
- package/dist/drift.part13.js +654 -76
- package/dist/drift.part14.js +21 -7
- package/dist/driftCacheCas.d.ts +43 -0
- package/dist/driftCacheCas.js +351 -0
- package/dist/driftCacheFilesystem.d.ts +64 -0
- package/dist/driftCacheFilesystem.js +313 -0
- package/dist/driftCacheModes.d.ts +38 -0
- package/dist/driftCacheModes.js +147 -0
- package/dist/driftCacheStore.d.ts +80 -0
- package/dist/driftCacheStore.js +603 -0
- package/dist/driftCatalogo.d.ts +65 -0
- package/dist/driftCatalogo.js +516 -0
- package/dist/driftEscopo.d.ts +21 -0
- package/dist/driftEscopo.js +647 -0
- package/dist/driftEscopoReferencias.d.ts +8 -0
- package/dist/driftEscopoReferencias.js +612 -0
- package/dist/driftOrcamento.d.ts +6 -0
- package/dist/driftOrcamento.js +20 -3
- package/dist/geracaoCore.js +4 -6
- package/dist/iaPrompts.d.ts +3 -3
- package/dist/iaPrompts.js +13 -14
- package/dist/index.d.ts +4 -1
- package/dist/index.js +6 -25
- package/dist/index.part01.d.ts +21 -14
- package/dist/index.part01.js +20 -165
- package/dist/index.part02.js +57 -43
- package/dist/index.part03.d.ts +23 -1
- package/dist/index.part03.js +83 -8
- package/dist/index.part04.d.ts +10 -2
- package/dist/index.part04.js +48 -14
- package/dist/index.part05.d.ts +1 -1
- package/dist/index.part05.js +109 -30
- package/dist/index.part06.js +34 -16
- package/dist/index.part07.js +31 -27
- package/dist/index.part08.d.ts +1 -1
- package/dist/index.part08.js +23 -28
- package/dist/init/templates.part01.js +393 -393
- package/dist/init/templates.part02.js +189 -189
- package/dist/initCommand.js +5 -1
- package/dist/initTemplatesBackend.js +73 -73
- package/dist/initTemplatesBase.js +7 -5
- package/dist/initTemplatesFlutter.js +137 -137
- package/dist/initTemplatesRuntime.js +350 -350
- package/dist/initTemplatesWeb.js +309 -309
- package/dist/pipelineConteudo/command.d.ts +1 -0
- package/dist/pipelineConteudo/command.js +4 -32
- package/dist/pipelineConteudo/help.d.ts +2 -0
- package/dist/pipelineConteudo/help.js +33 -0
- package/dist/profileAuthorCommand.js +3 -7
- package/dist/profileCommand.js +3 -7
- package/dist/projeto.d.ts +1 -1
- package/dist/projetoCarregar.d.ts +2 -2
- package/dist/projetoCarregar.js +69 -28
- package/dist/projetoCatalogo.d.ts +8 -0
- package/dist/projetoCatalogo.js +164 -0
- package/dist/projetoOrigens.d.ts +2 -0
- package/dist/projetoOrigens.js +65 -9
- package/dist/projetoTipos.d.ts +15 -5
- package/dist/resultadoCli.d.ts +20 -0
- package/dist/resultadoCli.js +57 -0
- package/dist/saidaCli.d.ts +35 -0
- package/dist/saidaCli.js +118 -0
- package/dist/sistemasInterativos/acceptanceEvidence.d.ts +22 -0
- package/dist/sistemasInterativos/acceptanceEvidence.js +345 -0
- package/dist/sistemasInterativos/engineObservation.d.ts +12 -0
- package/dist/sistemasInterativos/engineObservation.js +438 -0
- package/dist/sistemasInterativos/jobOrchestration.d.ts +2 -0
- package/dist/sistemasInterativos/jobOrchestration.js +204 -0
- package/dist/sistemasInterativos/operationPrimitives.d.ts +21 -0
- package/dist/sistemasInterativos/operationPrimitives.js +194 -0
- package/dist/sistemasInterativos/operations.d.ts +4 -39
- package/dist/sistemasInterativos/operations.js +5 -1164
- package/dist/skillCommand.d.ts +5 -0
- package/dist/skillCommand.js +88 -0
- package/dist/sync/index.js +35 -35
- package/docs/README.md +11 -7
- package/docs/ai-integration.md +18 -11
- package/docs/ai-onboarding.md +81 -62
- package/docs/ai-workflow.md +10 -4
- package/docs/auth.md +26 -26
- package/docs/cli.md +197 -79
- package/docs/commands.md +30 -6
- package/docs/database.md +15 -15
- package/docs/deploy.md +54 -41
- package/docs/documentation.md +11 -10
- package/docs/drift-cache.md +108 -0
- package/docs/env.md +16 -16
- package/docs/frontend.md +41 -41
- package/docs/getting-started.md +82 -57
- package/docs/i18n.md +15 -15
- package/docs/repositories.md +60 -43
- package/docs/rollback.md +38 -31
- package/docs/security.md +54 -32
- package/docs/sistemas-interativos.md +27 -27
- package/docs/support.md +8 -8
- package/docs/testing.md +123 -17
- package/docs/vocabulary.md +29 -29
- package/exemplos/agendamento.sema +1 -1
- package/exemplos/assinatura.sema +1 -1
- package/exemplos/auditoria.sema +1 -1
- package/exemplos/autenticacao.sema +1 -1
- package/exemplos/author_obra_comum.sema +1 -1
- package/exemplos/author_tema_sensivel.sema +1 -1
- package/exemplos/automacao.sema +1 -1
- package/exemplos/cadastro_usuario.sema +1 -1
- package/exemplos/calculadora.sema +1 -1
- package/exemplos/crud_simples.sema +1 -1
- package/exemplos/estoque.sema +1 -1
- package/exemplos/exportacao.sema +1 -1
- package/exemplos/fila.sema +1 -1
- package/exemplos/integracao_externa.sema +1 -1
- package/exemplos/multi_tenant.sema +1 -1
- package/exemplos/notificacao.sema +1 -1
- package/exemplos/operacao_estrategia.sema +132 -132
- package/exemplos/operacao_estrategia_discovery.sema +220 -220
- package/exemplos/operacao_estrategia_fluxo.sema +114 -114
- package/exemplos/operacao_estrategia_gates.sema +106 -106
- package/exemplos/operacao_estrategia_quarentena.sema +133 -133
- package/exemplos/operacao_estrategia_rollout.sema +124 -124
- package/exemplos/pagamento.sema +1 -1
- package/exemplos/pagamento_dominio.sema +1 -1
- package/exemplos/pedido.sema +1 -1
- package/exemplos/permissao.sema +1 -1
- package/exemplos/persistencia_vendor_first.sema +1 -1
- package/exemplos/profile_conversas.sema +165 -165
- package/exemplos/profile_game.sema +1 -1
- package/exemplos/profile_legal.sema +1 -1
- package/exemplos/profile_ops.sema +1 -1
- package/exemplos/profile_research.sema +1 -1
- package/exemplos/profile_software.sema +1 -1
- package/exemplos/profile_workflow_n8n.sema +1 -1
- package/exemplos/relatorio.sema +1 -1
- package/exemplos/replica_analitica_erp.sema +1 -1
- package/exemplos/testes_embutidos.sema +1 -1
- package/exemplos/tratamento_erro.sema +1 -1
- package/exemplos/upload_arquivo.sema +1 -1
- package/exemplos/webhook.sema +1 -1
- package/node_modules/@sema/gerador-cpp/dist/index.js +176 -176
- package/node_modules/@sema/gerador-css/dist/index.part01.js +10 -10
- package/node_modules/@sema/gerador-css/dist/index.part02.js +460 -460
- package/node_modules/@sema/gerador-dotnet/dist/index.js +169 -169
- package/node_modules/@sema/gerador-html/dist/index.js +17 -17
- package/node_modules/@sema/gerador-python/dist/index.part02.js +3 -3
- package/node_modules/@sema/gerador-typescript/dist/index.part02.js +11 -11
- package/node_modules/@sema/nucleo/dist/diagnosticos/melhorador.js +42 -42
- package/node_modules/@sema/nucleo/dist/semantico/analisador.d.ts +1 -0
- package/node_modules/@sema/nucleo/dist/semantico/analisador.js +1 -0
- package/package.json +7 -2
- package/scripts/postinstall.mjs +148 -0
- package/skills/sema/SKILL.md +199 -0
- package/skills/sema/agents/openai.yaml +4 -0
- package/node_modules/@sema/gerador-cpp/dist/index.js.map +0 -1
- package/node_modules/@sema/gerador-css/dist/index.js.map +0 -1
- package/node_modules/@sema/gerador-css/dist/index.part01.js.map +0 -1
- package/node_modules/@sema/gerador-css/dist/index.part02.js.map +0 -1
- package/node_modules/@sema/gerador-dart/dist/index.js.map +0 -1
- package/node_modules/@sema/gerador-dotnet/dist/index.js.map +0 -1
- package/node_modules/@sema/gerador-html/dist/index.js.map +0 -1
- package/node_modules/@sema/gerador-javascript/dist/index.js.map +0 -1
- package/node_modules/@sema/gerador-lua/dist/index.js.map +0 -1
- package/node_modules/@sema/gerador-php/dist/index.js.map +0 -1
- package/node_modules/@sema/gerador-python/dist/index.js.map +0 -1
- package/node_modules/@sema/gerador-python/dist/index.part01.js.map +0 -1
- package/node_modules/@sema/gerador-python/dist/index.part02.js.map +0 -1
- package/node_modules/@sema/gerador-typescript/dist/index.js.map +0 -1
- package/node_modules/@sema/gerador-typescript/dist/index.part01.js.map +0 -1
- package/node_modules/@sema/gerador-typescript/dist/index.part02.js.map +0 -1
- package/node_modules/@sema/gerador-typescript/dist/index.part03.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/ast/tipos.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/diagnosticos/index.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/diagnosticos/melhorador.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/diagnosticos/snippets.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/formatador/index.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/formatador/index.part01.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/formatador/index.part02.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/index.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/ir/conversor.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/ir/conversor.part01.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/ir/conversor.part02.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/ir/conversor.part03.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/ir/modelos.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/lexer/lexer.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/lexer/tokens.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/parser/parser.declaracoes.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/parser/parser.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/parser/parser.modulo.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/parser/parser.part01.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/parser/parser.part02.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/parser/parser.part03.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/persistencia/contratos.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/semantico/analisador.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/semantico/analisador.part01.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/semantico/analisador.part02.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/semantico/analisador.part03.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/semantico/analisador.part04.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/semantico/analisador.part05.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/semantico/analisador.part06.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/semantico/analisador.part07.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/semantico/analisador.part08.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/semantico/estruturas.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/semantico/estruturas.part01.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/semantico/estruturas.part02.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/semantico/orcamentoSemantico.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/semantico/seguranca.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/util/arquivos.js.map +0 -1
- package/node_modules/@sema/padroes/dist/index.js.map +0 -1
package/dist/drift.part12.js
CHANGED
|
@@ -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 {
|
|
3
|
+
import { lstat, open, readdir, realpath } from "node:fs/promises";
|
|
4
4
|
import path from "node:path";
|
|
5
|
-
import {
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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:
|
|
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
|
|
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];
|
package/dist/drift.part13.d.ts
CHANGED
|
@@ -1,8 +1,20 @@
|
|
|
1
1
|
import type { ContextoProjetoCarregado } from "./projeto.js";
|
|
2
|
-
import type
|
|
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>;
|