@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
@@ -0,0 +1,265 @@
1
+ // SEMA-GOVERNED: sema.produto.governanca_ia.drift
2
+ // Descricao: extrai e resolve candidatos exatos de dependencias locais sem caminhada de filesystem.
3
+ import path from "node:path";
4
+ const EXTENSOES_DEPENDENCIA_CODIGO = [
5
+ ".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs", ".py", ".dart", ".lua", ".cs", ".java",
6
+ ".go", ".rs", ".php", ".cpp", ".cc", ".cxx", ".hpp", ".h",
7
+ ".sql", ".psql", ".ddl", ".prisma", ".html", ".htm", ".css",
8
+ ];
9
+ const EXTENSOES_TYPESCRIPT_DEPENDENCIA = [
10
+ ".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs", ".html", ".htm", ".css",
11
+ ];
12
+ const PREFIXO_REFERENCIA_PYTHON = "python:";
13
+ function chaveCaminho(caminho) {
14
+ const absoluto = path.normalize(path.resolve(caminho));
15
+ return process.platform === "win32" ? absoluto.toLowerCase() : absoluto;
16
+ }
17
+ function caminhoEstaDentro(raiz, alvo) {
18
+ const relativo = path.relative(path.resolve(raiz), path.resolve(alvo));
19
+ return relativo === "" || (relativo !== ".."
20
+ && !relativo.startsWith(`..${path.sep}`)
21
+ && !path.isAbsolute(relativo));
22
+ }
23
+ function mascararIntervalo(codigo, saida, inicio, fim) {
24
+ for (let indice = inicio; indice < fim; indice += 1) {
25
+ if (codigo[indice] !== "\n" && codigo[indice] !== "\r") {
26
+ saida[indice] = " ";
27
+ }
28
+ }
29
+ }
30
+ /** Remove comentarios/docstrings sem alterar offsets ou caminhos em literais de imports reais. */
31
+ function removerComentariosDependencias(codigo) {
32
+ const saida = [...codigo];
33
+ let indice = 0;
34
+ while (indice < codigo.length) {
35
+ const atual = codigo[indice];
36
+ const proximo = codigo[indice + 1];
37
+ if ((atual === "'" || atual === '"') && codigo.slice(indice, indice + 3) === atual.repeat(3)) {
38
+ const delimitador = atual.repeat(3);
39
+ const fimEncontrado = codigo.indexOf(delimitador, indice + 3);
40
+ const fim = fimEncontrado < 0 ? codigo.length : fimEncontrado + 3;
41
+ mascararIntervalo(codigo, saida, indice, fim);
42
+ indice = fim;
43
+ continue;
44
+ }
45
+ if (atual === "`") {
46
+ const inicio = indice;
47
+ indice += 1;
48
+ while (indice < codigo.length) {
49
+ if (codigo[indice] === "\\") {
50
+ indice += 2;
51
+ continue;
52
+ }
53
+ if (codigo[indice] === "`") {
54
+ indice += 1;
55
+ break;
56
+ }
57
+ indice += 1;
58
+ }
59
+ mascararIntervalo(codigo, saida, inicio, indice);
60
+ continue;
61
+ }
62
+ if (atual === "'" || atual === '"') {
63
+ const delimitador = atual;
64
+ indice += 1;
65
+ while (indice < codigo.length) {
66
+ if (codigo[indice] === "\\") {
67
+ indice += 2;
68
+ continue;
69
+ }
70
+ if (codigo[indice] === delimitador) {
71
+ indice += 1;
72
+ break;
73
+ }
74
+ indice += 1;
75
+ }
76
+ continue;
77
+ }
78
+ if (atual === "/" && proximo === "/") {
79
+ const fimLinha = codigo.indexOf("\n", indice + 2);
80
+ const fim = fimLinha < 0 ? codigo.length : fimLinha;
81
+ mascararIntervalo(codigo, saida, indice, fim);
82
+ indice = fim;
83
+ continue;
84
+ }
85
+ if (atual === "/" && proximo === "*") {
86
+ const fimEncontrado = codigo.indexOf("*/", indice + 2);
87
+ const fim = fimEncontrado < 0 ? codigo.length : fimEncontrado + 2;
88
+ mascararIntervalo(codigo, saida, indice, fim);
89
+ indice = fim;
90
+ continue;
91
+ }
92
+ if (atual === "#") {
93
+ const inicioLinha = codigo.lastIndexOf("\n", indice - 1) + 1;
94
+ const prefixoLinha = codigo.slice(inicioLinha, indice);
95
+ if (/^\s*$/u.test(prefixoLinha) && codigo.slice(indice).startsWith("#include")) {
96
+ indice += 1;
97
+ continue;
98
+ }
99
+ const fimLinha = codigo.indexOf("\n", indice + 1);
100
+ const fim = fimLinha < 0 ? codigo.length : fimLinha;
101
+ mascararIntervalo(codigo, saida, indice, fim);
102
+ indice = fim;
103
+ continue;
104
+ }
105
+ indice += 1;
106
+ }
107
+ return saida.join("");
108
+ }
109
+ function referenciaTypescriptLocal(referencia) {
110
+ return referencia.startsWith(".") || referencia.startsWith("@/");
111
+ }
112
+ function adicionarImportacoesPython(codigo, referencias) {
113
+ const adicionarModulo = (modulo) => {
114
+ const normalizado = modulo.trim();
115
+ if (/^\.*[A-Za-z_][A-Za-z0-9_.]*$/u.test(normalizado)) {
116
+ referencias.add(`${PREFIXO_REFERENCIA_PYTHON}${normalizado}`);
117
+ }
118
+ };
119
+ for (const ocorrencia of codigo.matchAll(/^\s*import\s+([^\r\n;]+)$/gmu)) {
120
+ for (const item of (ocorrencia[1] ?? "").split(",")) {
121
+ adicionarModulo(item.trim().split(/\s+as\s+/iu)[0] ?? "");
122
+ }
123
+ }
124
+ for (const ocorrencia of codigo.matchAll(/^\s*from\s+(\.*[A-Za-z_][A-Za-z0-9_.]*|\.+)\s+import\s+([^\r\n;]+)$/gmu)) {
125
+ const modulo = ocorrencia[1] ?? "";
126
+ adicionarModulo(modulo);
127
+ const importados = (ocorrencia[2] ?? "").replace(/[()\\]/gu, "");
128
+ for (const item of importados.split(",")) {
129
+ const nome = item.trim().split(/\s+as\s+/iu)[0] ?? "";
130
+ if (nome && nome !== "*" && /^[A-Za-z_][A-Za-z0-9_]*$/u.test(nome)) {
131
+ adicionarModulo(`${modulo}${modulo.endsWith(".") ? "" : "."}${nome}`);
132
+ }
133
+ }
134
+ }
135
+ }
136
+ export function extrairReferenciasLocaisDrift(codigo) {
137
+ const referencias = new Set();
138
+ const codigoExecutavel = removerComentariosDependencias(codigo);
139
+ const padroesTypescript = [
140
+ /^\s*(?:import|export)\s+(?:type\s+)?(?:[A-Za-z_$][\w$]*\s*,\s*)?\{[^}]*\}\s+from\s+["'`]([^"'`\r\n]+)["'`]/gmu,
141
+ /^\s*(?:import|export)\s+(?:type\s+)?(?:[^;"'`\r\n]*?\s+from\s+)?["'`]([^"'`\r\n]+)["'`]/gmu,
142
+ /\b(?:import|require)\s*\(\s*["'`]([^"'`\r\n]+)["'`]\s*\)/gu,
143
+ /\b(?:templateUrl|styleUrls?)\s*:\s*(?:\[\s*)?["'`]([^"'`\r\n]+)["'`]/gu,
144
+ /^\s*@import\s+(?:url\(\s*)?["'`]([^"'`\r\n]+)["'`]/gmu,
145
+ ];
146
+ for (const padrao of padroesTypescript) {
147
+ for (const ocorrencia of codigoExecutavel.matchAll(padrao)) {
148
+ const referencia = ocorrencia[1]?.trim();
149
+ if (referencia && referenciaTypescriptLocal(referencia)) {
150
+ referencias.add(referencia);
151
+ }
152
+ }
153
+ }
154
+ for (const ocorrencia of codigoExecutavel.matchAll(/^\s*#include\s+["']([^"'\r\n]+)["']/gmu)) {
155
+ const referencia = ocorrencia[1]?.trim();
156
+ if (referencia && !referencia.includes(":")) {
157
+ referencias.add(referencia);
158
+ }
159
+ }
160
+ for (const ocorrencia of codigoExecutavel.matchAll(/\b(?:require|include)(?:_once)?\s*\(?\s*["']([^"'\r\n]+)["']/gu)) {
161
+ const referencia = ocorrencia[1]?.trim();
162
+ const extensao = path.posix.extname(referencia ?? "").toLowerCase();
163
+ if (referencia
164
+ && !referencia.includes(":")
165
+ && (referencia.startsWith(".") || EXTENSOES_DEPENDENCIA_CODIGO.includes(extensao))) {
166
+ referencias.add(referencia);
167
+ }
168
+ }
169
+ adicionarImportacoesPython(codigoExecutavel, referencias);
170
+ return [...referencias];
171
+ }
172
+ export function raizesCodigoLogicasDrift(contexto) {
173
+ const candidatas = contexto.diretoriosCodigo.length > 0
174
+ ? contexto.diretoriosCodigo
175
+ : [contexto.baseProjeto];
176
+ return [...new Map(candidatas
177
+ .map((raiz) => path.resolve(raiz))
178
+ .filter((raiz) => caminhoEstaDentro(contexto.baseProjeto, raiz))
179
+ .map((raiz) => [chaveCaminho(raiz), raiz])).values()];
180
+ }
181
+ function adicionarVariantesArquivo(candidatos, base, extensoesPermitidas) {
182
+ const extensao = path.extname(base).toLowerCase();
183
+ const extensaoConhecida = extensoesPermitidas.includes(extensao);
184
+ const adicionar = (caminho) => {
185
+ const absoluto = path.resolve(caminho);
186
+ const chave = chaveCaminho(absoluto);
187
+ if (!candidatos.has(chave)) {
188
+ candidatos.set(chave, absoluto);
189
+ }
190
+ };
191
+ adicionar(base);
192
+ if ([".js", ".jsx", ".mjs", ".cjs"].includes(extensao)) {
193
+ const semExtensao = base.slice(0, -extensao.length);
194
+ for (const alternativa of [".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs"]) {
195
+ adicionar(`${semExtensao}${alternativa}`);
196
+ }
197
+ }
198
+ else if (!extensaoConhecida) {
199
+ for (const alternativa of extensoesPermitidas) {
200
+ adicionar(`${base}${alternativa}`);
201
+ adicionar(path.join(base, `index${alternativa}`));
202
+ }
203
+ }
204
+ }
205
+ function candidatosModuloPython(contexto, arquivoOrigem, moduloDeclarado) {
206
+ const candidatos = new Map();
207
+ const correspondencia = /^(\.*)(.*)$/u.exec(moduloDeclarado);
208
+ const prefixoRelativo = correspondencia?.[1] ?? "";
209
+ const modulo = correspondencia?.[2] ?? "";
210
+ const segmentos = modulo.split(".").filter(Boolean);
211
+ const bases = new Map();
212
+ const adicionarBase = (base, segmentosBase) => {
213
+ const caminhoModulo = path.resolve(base, ...segmentosBase);
214
+ bases.set(chaveCaminho(caminhoModulo), caminhoModulo);
215
+ };
216
+ if (prefixoRelativo.length > 0) {
217
+ let baseRelativa = path.dirname(arquivoOrigem);
218
+ for (let nivel = 1; nivel < prefixoRelativo.length; nivel += 1) {
219
+ baseRelativa = path.dirname(baseRelativa);
220
+ }
221
+ adicionarBase(baseRelativa, segmentos);
222
+ }
223
+ else {
224
+ const raizes = raizesCodigoLogicasDrift(contexto);
225
+ for (const base of [path.dirname(arquivoOrigem), contexto.baseProjeto, ...raizes]) {
226
+ adicionarBase(base, segmentos);
227
+ const nomeBase = path.basename(base).toLowerCase();
228
+ if (segmentos[0]?.toLowerCase() === nomeBase) {
229
+ adicionarBase(base, segmentos.slice(1));
230
+ }
231
+ }
232
+ }
233
+ for (const base of bases.values()) {
234
+ const arquivoModulo = `${base}.py`;
235
+ candidatos.set(chaveCaminho(arquivoModulo), arquivoModulo);
236
+ const inicializador = path.join(base, "__init__.py");
237
+ candidatos.set(chaveCaminho(inicializador), inicializador);
238
+ }
239
+ return [...candidatos.values()];
240
+ }
241
+ export function candidatosReferenciaLocalDrift(contexto, arquivoOrigem, referencia) {
242
+ if (referencia.startsWith(PREFIXO_REFERENCIA_PYTHON)) {
243
+ if (path.extname(arquivoOrigem).toLowerCase() !== ".py") {
244
+ return [];
245
+ }
246
+ return candidatosModuloPython(contexto, arquivoOrigem, referencia.slice(PREFIXO_REFERENCIA_PYTHON.length));
247
+ }
248
+ const candidatos = new Map();
249
+ if (referencia.startsWith("@/")) {
250
+ const relativoAlias = referencia.slice(2);
251
+ const raizes = raizesCodigoLogicasDrift(contexto).sort((a, b) => {
252
+ const aContemOrigem = caminhoEstaDentro(a, arquivoOrigem) ? 1 : 0;
253
+ const bContemOrigem = caminhoEstaDentro(b, arquivoOrigem) ? 1 : 0;
254
+ return bContemOrigem - aContemOrigem || b.length - a.length || a.localeCompare(b, "pt-BR");
255
+ });
256
+ for (const raiz of raizes) {
257
+ adicionarVariantesArquivo(candidatos, path.resolve(raiz, relativoAlias), EXTENSOES_TYPESCRIPT_DEPENDENCIA);
258
+ }
259
+ }
260
+ else {
261
+ adicionarVariantesArquivo(candidatos, path.resolve(path.dirname(arquivoOrigem), referencia), EXTENSOES_DEPENDENCIA_CODIGO);
262
+ }
263
+ return [...candidatos.values()];
264
+ }
265
+ //# sourceMappingURL=driftEscopoReferencias.js.map
@@ -4,6 +4,7 @@ export declare const LIMITE_AVISO_LINHAS_CONTRATO_SEMA = 300;
4
4
  export declare const LIMITE_BLOQUEIO_LINHAS_CONTRATO_SEMA = 500;
5
5
  export declare const LIMITE_AVISO_LINHAS_ORCAMENTO_SEMANTICO = 1000;
6
6
  export declare const LIMITE_BLOQUEIO_LINHAS_ORCAMENTO_SEMANTICO = 2000;
7
+ export declare function workspaceExigeCabecalhoCodigoGovernado(baseProjeto: string, modoEstrito: boolean): Promise<boolean>;
7
8
  export type TipoArquivoOrcamento = "contrato" | "codigo" | "documentacao" | "gerado" | "migracao_historica";
8
9
  export type SeveridadeOrcamentoSemantico = "ok" | "aviso" | "erro";
9
10
  export type TipoDiagnosticoOrcamento = "contrato_monolitico" | "codigo_monolitico" | "codigo_governado_sem_cabecalho";
@@ -35,6 +36,16 @@ export interface DiagnosticoOrcamentoArquivo {
35
36
  limite_aviso_linhas: number;
36
37
  limite_bloqueio_linhas: number;
37
38
  }
39
+ /**
40
+ * Leitor limitado a um conjunto de arquivos previamente catalogado.
41
+ *
42
+ * Quando fornecido, o gate de orcamento nao faz fallback para o filesystem:
43
+ * um caminho fora do leitor e simplesmente ignorado nesta etapa.
44
+ */
45
+ export interface LeitorArquivosOrcamento {
46
+ contem(caminho: string): boolean;
47
+ lerTexto(caminho: string): Promise<string>;
48
+ }
38
49
  export interface LimitesOrcamentoSemantico {
39
50
  aviso: number;
40
51
  bloqueio: number;
@@ -76,4 +87,5 @@ export declare function emitirDiagnosticosArquivosOrcamento(opcoes: {
76
87
  arquivos: string[];
77
88
  baseProjeto?: string;
78
89
  exigirCabecalhoCodigoGovernado?: boolean;
90
+ leitorArquivos?: LeitorArquivosOrcamento;
79
91
  }): Promise<DiagnosticoOrcamentoArquivo[]>;
@@ -2,7 +2,7 @@
2
2
  // Módulo: sema.produto.orcamento_semantico
3
3
  // Contrato: contratos/sema/orcamento_semantico.sema
4
4
  // Descrição: centraliza os gates de linhas e cabeçalho Sema para drift, finalização e snapshots.
5
- import { readFile } from "node:fs/promises";
5
+ import { lstat, readFile } from "node:fs/promises";
6
6
  import path from "node:path";
7
7
  export const LIMITE_AVISO_LINHAS_CODIGO_GOVERNADO = 1000;
8
8
  export const LIMITE_BLOQUEIO_LINHAS_CODIGO_GOVERNADO = 2000;
@@ -10,6 +10,16 @@ export const LIMITE_AVISO_LINHAS_CONTRATO_SEMA = 300;
10
10
  export const LIMITE_BLOQUEIO_LINHAS_CONTRATO_SEMA = 500;
11
11
  export const LIMITE_AVISO_LINHAS_ORCAMENTO_SEMANTICO = LIMITE_AVISO_LINHAS_CODIGO_GOVERNADO;
12
12
  export const LIMITE_BLOQUEIO_LINHAS_ORCAMENTO_SEMANTICO = LIMITE_BLOQUEIO_LINHAS_CODIGO_GOVERNADO;
13
+ export async function workspaceExigeCabecalhoCodigoGovernado(baseProjeto, modoEstrito) {
14
+ if (!modoEstrito)
15
+ return false;
16
+ try {
17
+ return (await lstat(path.resolve(baseProjeto, "AGENTS.md"))).isFile();
18
+ }
19
+ catch {
20
+ return false;
21
+ }
22
+ }
13
23
  const EXTENSOES_CODIGO_GOVERNAVEL = new Set([
14
24
  ".ts",
15
25
  ".tsx",
@@ -289,13 +299,19 @@ export async function emitirDiagnosticosArquivosOrcamento(opcoes) {
289
299
  const absoluto = path.isAbsolute(arquivoInformado)
290
300
  ? arquivoInformado
291
301
  : path.resolve(baseProjeto, arquivoInformado);
292
- const chave = path.resolve(absoluto);
302
+ const resolvido = path.resolve(absoluto);
303
+ const chave = process.platform === "win32" ? resolvido.toLowerCase() : resolvido;
293
304
  if (vistos.has(chave)) {
294
305
  continue;
295
306
  }
296
307
  vistos.add(chave);
308
+ if (opcoes.leitorArquivos && !opcoes.leitorArquivos.contem(absoluto)) {
309
+ continue;
310
+ }
297
311
  try {
298
- const conteudo = await readFile(absoluto, "utf8");
312
+ const conteudo = opcoes.leitorArquivos
313
+ ? await opcoes.leitorArquivos.lerTexto(absoluto)
314
+ : await readFile(absoluto, "utf8");
299
315
  const relativo = path.relative(baseProjeto, absoluto).replace(/\\/g, "/") || arquivoInformado.replace(/\\/g, "/");
300
316
  diagnosticos.push(...avaliarOrcamentoArquivo({
301
317
  arquivo: relativo,
@@ -1,6 +1,7 @@
1
- // SEMA-GOVERNED: sema.produto.cli_toolchain_local
2
- // Contrato: contratos/sema/cli_toolchain_local.sema
3
- // Descrição: detecção de comandos externos usados por doctor, testes gerados e runners opcionais.
1
+ // SEMA-GOVERNED
2
+ // M?dulo: sema.produto.orcamento_semantico
3
+ // Contrato: contratos/sema/orcamento_semantico.sema
4
+ // Descri??o: detec??o de comandos externos usados por doctor, testes gerados e runners opcionais.
4
5
  import { spawnSync } from "node:child_process";
5
6
  import { createRequire } from "node:module";
6
7
  const requireRuntimeCli = createRequire(import.meta.url);
@@ -15,29 +16,14 @@ function resolverImportadorNodeOpcional(especificador) {
15
16
  export const TSX_IMPORTADOR_CLI = resolverImportadorNodeOpcional("tsx");
16
17
  export const TSX_EXECUTOR_CLI = resolverImportadorNodeOpcional("tsx/cli");
17
18
  const TIMEOUT_CHECAGEM_COMANDO_MS = 5_000;
18
- const disponibilidadeComandosNoProcesso = new Map();
19
19
  export function comandoDisponivel(comando, argumentos = ["--version"]) {
20
- const chaveSondagem = JSON.stringify({
21
- comando,
22
- argumentos,
23
- cwd: process.cwd(),
24
- path: process.env.PATH ?? "",
25
- pathExt: process.env.PATHEXT ?? "",
26
- comSpec: process.env.COMSPEC ?? "",
27
- });
28
- const resultadoMemorizado = disponibilidadeComandosNoProcesso.get(chaveSondagem);
29
- if (resultadoMemorizado !== undefined) {
30
- return resultadoMemorizado;
31
- }
32
20
  const execucao = spawnSync(comando, argumentos, {
33
21
  stdio: "ignore",
34
22
  shell: process.platform === "win32",
35
23
  timeout: TIMEOUT_CHECAGEM_COMANDO_MS,
36
24
  windowsHide: true,
37
25
  });
38
- const disponivel = !execucao.error && execucao.signal === null && (execucao.status ?? 1) === 0;
39
- disponibilidadeComandosNoProcesso.set(chaveSondagem, disponivel);
40
- return disponivel;
26
+ return !execucao.error && execucao.signal === null && (execucao.status ?? 1) === 0;
41
27
  }
42
28
  export function resolverExecucaoPython() {
43
29
  if (comandoDisponivel("python")) {