@semacode/cli 1.5.42 → 1.5.44

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 (71) hide show
  1. package/AGENTS.md +19 -17
  2. package/AGENT_CONTEXT_PACK.json +11 -11
  3. package/README.md +41 -57
  4. package/SEMA_BRIEF.curto.txt +5 -5
  5. package/SEMA_BRIEF.md +18 -4
  6. package/SEMA_BRIEF.micro.txt +4 -4
  7. package/SEMA_INDEX.json +336 -126
  8. package/dist/agentContextPack.js +11 -11
  9. package/dist/agentContextPack.js.map +1 -1
  10. package/dist/agentEntryPoints.js +11 -11
  11. package/dist/bridge.js +2 -1
  12. package/dist/bridge.js.map +1 -1
  13. package/dist/comandos.js +2 -2
  14. package/dist/comandos.js.map +1 -1
  15. package/dist/drift.contrato.d.ts +5 -0
  16. package/dist/drift.contrato.js +9 -1
  17. package/dist/drift.contrato.js.map +1 -1
  18. package/dist/drift.js +1 -1
  19. package/dist/drift.js.map +1 -1
  20. package/dist/drift.part01.d.ts +9 -1
  21. package/dist/drift.part01.js.map +1 -1
  22. package/dist/drift.part04.d.ts +2 -1
  23. package/dist/drift.part04.js +13 -3
  24. package/dist/drift.part04.js.map +1 -1
  25. package/dist/drift.part11.js +28 -7
  26. package/dist/drift.part11.js.map +1 -1
  27. package/dist/driftScore.d.ts +24 -0
  28. package/dist/driftScore.js +57 -0
  29. package/dist/driftScore.js.map +1 -0
  30. package/dist/fsGovernado.d.ts +12 -1
  31. package/dist/fsGovernado.js +32 -5
  32. package/dist/fsGovernado.js.map +1 -1
  33. package/dist/iaPrompts.d.ts +1 -1
  34. package/dist/iaPrompts.js +3 -3
  35. package/dist/index.part01.js +3 -3
  36. package/dist/index.part01.js.map +1 -1
  37. package/dist/index.part05.js +7 -2
  38. package/dist/index.part05.js.map +1 -1
  39. package/dist/index.part06.js +9 -3
  40. package/dist/index.part06.js.map +1 -1
  41. package/dist/index.part07.js +17 -4
  42. package/dist/index.part07.js.map +1 -1
  43. package/dist/projetoTipos.d.ts +4 -0
  44. package/dist/runnerValidacaoRemotaServidor.d.ts +1 -0
  45. package/dist/runnerValidacaoRemotaServidor.js +30 -2
  46. package/dist/runnerValidacaoRemotaServidor.js.map +1 -1
  47. package/docs/AGENT_STARTER.md +2 -2
  48. package/docs/agentes-por-capacidade.md +2 -2
  49. package/docs/cli.md +12 -2
  50. package/docs/como-ensinar-a-sema-para-ia.md +3 -3
  51. package/docs/deploy.md +3 -3
  52. package/docs/documentacao.md +71 -91
  53. package/docs/env.md +13 -9
  54. package/docs/extensao-vscode.md +38 -40
  55. package/docs/fluxo-pratico-ia-sema.md +6 -3
  56. package/docs/instalacao-e-primeiro-uso.md +3 -3
  57. package/docs/integracao-com-ia.md +3 -3
  58. package/docs/mcp.md +6 -3
  59. package/docs/repositories.md +3 -3
  60. package/node_modules/@sema/gerador-css/package.json +1 -1
  61. package/node_modules/@sema/gerador-dart/package.json +1 -1
  62. package/node_modules/@sema/gerador-html/package.json +1 -1
  63. package/node_modules/@sema/gerador-javascript/package.json +1 -1
  64. package/node_modules/@sema/gerador-lua/dist/index.js +36 -3
  65. package/node_modules/@sema/gerador-lua/dist/index.js.map +1 -1
  66. package/node_modules/@sema/gerador-lua/package.json +1 -1
  67. package/node_modules/@sema/gerador-python/package.json +1 -1
  68. package/node_modules/@sema/gerador-typescript/package.json +1 -1
  69. package/node_modules/@sema/nucleo/package.json +1 -1
  70. package/node_modules/@sema/padroes/package.json +1 -1
  71. package/package.json +10 -10
@@ -1,94 +1,74 @@
1
- # Documentation Governance
2
-
3
- ## English
4
-
5
- Sema treats documentation as part of the change, not as a polite afterthought. Before an AI edits a contract, code, configuration, workflow, deploy, Author text, game rule, legal note, research note, or operational runbook, it must resolve the documentation that explains the intended change.
6
-
7
- Public documentation follows the exact order defined in [i18n.md](./i18n.md): English, Português, Español. Portuguese and Spanish must keep proper accents. Code blocks, identifiers, paths, command names, and `.sema` symbols are preserved unless a semantic rename contract says otherwise.
8
-
9
- ### Operational Gate
10
-
11
- ```bash
12
- sema docs-impacto --intencao "criar rota de pagamento" --arquivo contratos/pagamento.sema --json
13
- ```
14
-
15
- If the command reports missing docs, create or complete those docs before changing code, contracts, deploy, or configuration.
16
-
17
- ### Required Reading
18
-
19
- The `docs-impacto` result returns:
20
-
21
- - `leituraObrigatoria`: docs, readmes, and contracts that must be read.
22
- - `docsAusentes`: docs that block the action.
23
- - `docsCriadas`: docs created automatically when authorized.
24
- - `bloqueios`: severity 4 diagnostics.
25
-
26
- Automatically created docs are scaffolds, not proof. The agent must replace the generic template with real procedure, validation, and rollback before `finalizar-mudanca` can pass.
27
-
28
- Before declaring the work done, the agent must run:
29
-
30
- ```bash
31
- sema finalizar-mudanca --intencao "criar rota de pagamento" --doc-lida README.md --doc-lida docs/documentacao.md --json
32
- ```
33
-
34
- ## Português
35
-
36
- A Sema trata documentação como parte da mudança, não como pós-escrito simpático para alguém lembrar depois. Antes de uma IA editar contrato, código, configuração, workflow, deploy, texto Author, regra de jogo, nota jurídica, pesquisa ou runbook operacional, ela precisa resolver a documentação que explica a intenção da mudança.
37
-
38
- A documentação pública segue a ordem exata definida em [i18n.md](./i18n.md): English, Português, Español. Português e espanhol precisam preservar acentos. Blocos de código, identificadores, caminhos, nomes de comando e símbolos `.sema` são preservados, exceto quando houver contrato de renomeação semântica.
39
-
40
- ### Gate Operacional
41
-
42
- ```bash
43
- sema docs-impacto --intencao "criar rota de pagamento" --arquivo contratos/pagamento.sema --json
44
- ```
45
-
46
- Se o comando apontar docs ausentes, crie ou complete essas docs antes de mudar código, contratos, deploy ou configuração.
47
-
48
- ### Leitura Obrigatória
49
-
50
- O resultado de `docs-impacto` retorna:
51
-
52
- - `leituraObrigatoria`: docs, readmes e contratos que precisam ser lidos.
53
- - `docsAusentes`: docs que bloqueiam a ação.
54
- - `docsCriadas`: docs criadas automaticamente quando autorizado.
1
+ # Governança De Documentação
2
+
3
+ A Sema trata documentação como parte da mudança. README, runbook, contrato,
4
+ instrução para IA, guia de CLI, deploy e rollback não são enfeites: são
5
+ superfícies governadas.
6
+
7
+ Antes de uma IA editar contrato, código, configuração, workflow, deploy, texto
8
+ Author, regra de jogo, nota jurídica, pesquisa, operação ou README, ela precisa
9
+ resolver qual documentação explica a intenção da mudança.
10
+
11
+ ## Idioma
12
+
13
+ Documentação interna da Sema é em PT-BR por padrão, com acentos preservados e
14
+ sem mojibake. Inglês e espanhol não são obrigatórios em documento privado.
15
+
16
+ Documentação multilíngue só entra quando a superfície for externa ou quando o
17
+ contrato pedir explicitamente outro idioma. Comandos, identificadores, caminhos,
18
+ variáveis, endpoints, pacotes e símbolos `.sema` continuam literais.
19
+
20
+ ## Trava Operacional
21
+
22
+ ```bash
23
+ sema docs-impacto --intencao "criar rota de pagamento" --arquivo contratos/pagamento.sema --json
24
+ ```
25
+
26
+ O resultado informa:
27
+
28
+ - `leituraObrigatoria`: documentos, READMEs e contratos que precisam ser lidos;
29
+ - `docsAusentes`: documentação que bloqueia a mudança;
30
+ - `docsCriadas`: esqueletos criados automaticamente quando autorizado;
55
31
  - `bloqueios`: diagnósticos de severidade 4.
56
32
 
57
- Docs criadas automaticamente são esqueletos, não prova. A IA precisa trocar o template genérico por procedimento, validação e rollback reais antes de `finalizar-mudanca` passar.
58
-
59
- Antes de dizer que o trabalho terminou, o agente precisa rodar:
60
-
61
- ```bash
62
- sema finalizar-mudanca --intencao "criar rota de pagamento" --doc-lida README.md --doc-lida docs/documentacao.md --json
63
- ```
64
-
65
- ## Español
66
-
67
- Sema trata la documentación como parte del cambio, no como una nota amable para recordar después. Antes de que una IA edite contrato, código, configuración, workflow, deploy, texto Author, regla de juego, nota legal, investigación o runbook operativo, debe resolver la documentación que explica la intención del cambio.
68
-
69
- La documentación pública sigue el orden exacto definido en [i18n.md](./i18n.md): English, Português, Español. Portugués y español deben conservar sus acentos. Bloques de código, identificadores, rutas, nombres de comando y símbolos `.sema` se preservan, excepto cuando exista un contrato de renombrado semántico.
70
-
71
- ### Gate Operativo
72
-
73
- ```bash
74
- sema docs-impacto --intencao "criar rota de pagamento" --arquivo contratos/pagamento.sema --json
75
- ```
76
-
77
- Si el comando informa docs ausentes, crea o completa esas docs antes de cambiar código, contratos, deploy o configuración.
78
-
79
- ### Lectura Obligatoria
80
-
81
- El resultado de `docs-impacto` devuelve:
82
-
83
- - `leituraObrigatoria`: docs, readmes y contratos que deben leerse.
84
- - `docsAusentes`: docs que bloquean la acción.
85
- - `docsCriadas`: docs creadas automáticamente cuando se autoriza.
86
- - `bloqueios`: diagnósticos de severidad 4.
87
-
88
- Los documentos creados automáticamente son esqueletos, no prueba. El agente debe reemplazar el template genérico con procedimiento, validación y rollback reales antes de que `finalizar-mudanca` pueda aprobar.
89
-
90
- Antes de decir que el trabajo terminó, el agente debe ejecutar:
91
-
92
- ```bash
93
- sema finalizar-mudanca --intencao "criar rota de pagamento" --doc-lida README.md --doc-lida docs/documentacao.md --json
33
+ Documento criado automaticamente é rascunho. A IA precisa trocar template
34
+ genérico por procedimento real, validação real e rollback real antes de
35
+ considerar a mudança fechada.
36
+
37
+ ## Fechamento
38
+
39
+ Antes de dizer que terminou, o agente roda:
40
+
41
+ ```bash
42
+ sema finalizar-mudanca \
43
+ --intencao "criar rota de pagamento" \
44
+ --doc-lida README.md \
45
+ --doc-lida docs/documentacao.md \
46
+ --json
94
47
  ```
48
+
49
+ Se houver leitura obrigatória não comprovada, documento ausente, template cru ou
50
+ diagnóstico de severidade 4, a mudança não está concluída.
51
+
52
+ ## Regra Para README
53
+
54
+ O README principal deste repositório é manual interno. Ele deve explicar o Sema
55
+ com profundidade suficiente para uma IA local operar sem inventar fluxo:
56
+
57
+ - superfície CLI local;
58
+ - superfície MCP remoto;
59
+ - pré-checagem e SEMAS;
60
+ - contratos `.sema`;
61
+ - desvio semântico e impacto;
62
+ - geração automática de código;
63
+ - importação de legado;
64
+ - templates de projeto novo;
65
+ - contexto IA;
66
+ - profiles;
67
+ - Author;
68
+ - documentação como trava;
69
+ - comandos de sanidade;
70
+ - fronteira privada.
71
+
72
+ Se uma função importante existe na CLI, o README deve descrevê-la ou apontar
73
+ para a documentação específica. README curto demais vira convite para IA
74
+ apressada fazer besteira com confiança.
package/docs/env.md CHANGED
@@ -24,13 +24,13 @@ Ambiente necessário para publicar a Sema.
24
24
  No PowerShell, o instalador recebe a versão por parametro:
25
25
 
26
26
  ```powershell
27
- .\install-sema.ps1 -Version 1.5.35 -WithVSCode
27
+ .\install-sema.ps1 -Version 1.5.44 -WithVSCode
28
28
  ```
29
29
 
30
30
  No shell:
31
31
 
32
32
  ```bash
33
- SEMA_VERSION=1.5.35 ./install-sema.sh --with-vscode
33
+ SEMA_VERSION=1.5.44 ./install-sema.sh --with-vscode
34
34
  ```
35
35
 
36
36
  ## Credenciais
@@ -71,10 +71,13 @@ Variaveis usadas pelo servidor MCP privado quando roda em modo HTTP:
71
71
  - `MCP_PORT`: porta HTTP. Quando ausente, o MCP roda em `stdio`.
72
72
  - `MCP_HOST`: host de bind. Padrão: `0.0.0.0`.
73
73
  - `SEMA_MCP_PUBLIC_BASE_URL`: URL pública HTTPS usada nos metadados OAuth do ChatGPT.
74
- - `SEMA_MCP_OAUTH_SECRET`: segredo usado para assinar access/refresh tokens OAuth.
75
- - `SEMA_MCP_OAUTH_PASSCODE`: passcode privado digitado no login OAuth do ChatGPT.
74
+ - `SEMA_MCP_OAUTH_SECRET`: segredo usado para assinar access/refresh tokens OAuth.
75
+ - `SEMA_MCP_OAUTH_PASSCODE`: fallback local/laboratorio; em MCP publico ou `production`, bloqueia o boot.
76
76
  - `SEMA_MCP_PROJECT_ROOTS`: raizes permitidas para projetos, separadas por `;`.
77
- - `SEMA_MCP_CORS_ORIGIN`: origem CORS permitida, `*` ou lista separada por `;`.
77
+ - `SEMA_MCP_CORS_ORIGIN`: origem CORS permitida, lista separada por `;`. Nao use `*` em MCP publico ou `production`.
78
+ - `SEMA_SUPABASE_URL`: URL do control plane Supabase usado para OAuth e billing.
79
+ - `SEMA_SUPABASE_ANON_KEY` ou `SEMA_SUPABASE_PUBLISHABLE_KEY`: chave publica do Supabase para RPCs de OAuth/billing.
80
+ - `SEMA_MCP_BILLING_DISABLED`: somente laboratorio local; em MCP publico ou `production`, bloqueia o boot.
78
81
  - `SEMA_MCP_MAX_CONTRACT_FILE_BYTES`: limite por contrato `.sema` enviado por snapshot ou conteudo inline. Padrao: `262144`.
79
82
  - `SEMA_MCP_MAX_CODE_FILE_BYTES`: limite por arquivo de codigo selecionado enviado por snapshot. Padrao: `262144`.
80
83
  - `SEMA_MCP_MAX_DOC_FILE_BYTES`: limite por arquivo de documentacao enviado por snapshot. Padrao: `262144`.
@@ -84,17 +87,18 @@ Variaveis usadas pelo servidor MCP privado quando roda em modo HTTP:
84
87
  Exemplo operacional privado:
85
88
 
86
89
  ```bash
87
- MCP_PORT=3333 \
88
- SEMA_MCP_PUBLIC_BASE_URL="https://sema.exemplo.com" \
90
+ MCP_PORT=3333 \
91
+ SEMA_MCP_PUBLIC_BASE_URL="https://sema.exemplo.com" \
89
92
  SEMA_MCP_OAUTH_SECRET="segredo-longo-para-oauth" \
90
- SEMA_MCP_OAUTH_PASSCODE="passcode-privado-chatgpt" \
93
+ SEMA_SUPABASE_URL="https://projeto.supabase.co" \
94
+ SEMA_SUPABASE_PUBLISHABLE_KEY="sb_publishable_..." \
91
95
  SEMA_MCP_PROJECT_ROOTS="/srv/sema/projetos" \
92
96
  SEMA_MCP_MAX_CONTRACT_FILE_BYTES=262144 \
93
97
  SEMA_MCP_MAX_CODE_FILE_BYTES=262144 \
94
98
  SEMA_MCP_MAX_DOC_FILE_BYTES=262144
95
99
  ```
96
100
 
97
- Nunca publique `/mcp` ou `/sse` na internet sem chave comercial bearer por request ou OAuth configurado, raiz restrita e HTTPS no proxy. Nunca registre chaves `sema_mcp_*`, OAuth secret ou passcode em docs publicas, logs, release notes ou screenshots.
101
+ Nunca publique `/mcp` ou `/sse` na internet sem billing habilitado, Supabase de billing configurado, chave comercial bearer por request ou OAuth com conta Sema, raiz restrita e HTTPS no proxy. Nunca registre chaves `sema_mcp_*`, OAuth secret ou passcode em docs publicas, logs, release notes ou screenshots.
98
102
 
99
103
  O limite de bytes e validado antes de gravar espelhos remotos ou executar contratos inline. Clientes MCP devem respeitar o limite anunciado no schema da ferramenta e dividir snapshots grandes em arquivos focados, sem enviar repositorio inteiro.
100
104
 
@@ -1,42 +1,40 @@
1
1
  # Extensão VS Code
2
2
 
3
- <!-- sema:i18n -->
4
- > EN: English first.
5
- > PT: Português depois, com acentos preservados.
6
- > ES: Español al final.
7
-
8
- ## English
9
-
10
- The VS Code extension is part of the private Sema workflow. It should help local IDE agents read `AGENTS.md`, run the governed CLI runtime installed from `@semacode/cli`, install MCP keys safely, and synchronize AI entry points without exposing secrets.
11
-
12
- Smoke test:
13
-
14
- 1. Open a project with `.sema` contracts.
15
- 2. Confirm the language server starts.
16
- 3. Run the Sema CLI diagnostic command.
17
- 4. Install an MCP key from the panel without passing the secret as a process argument.
18
- 5. Synchronize AI entry points.
19
-
20
- ## Português
21
-
22
- A extensão VS Code faz parte do fluxo privado da Sema. Ela deve ajudar agentes em IDE local a ler `AGENTS.md`, rodar o runtime governado da CLI instalada por `@semacode/cli`, instalar chaves MCP com segurança e sincronizar entrypoints IA sem expor segredos.
23
-
24
- Smoke test:
25
-
26
- 1. Abra um projeto com contratos `.sema`.
27
- 2. Confirme que o language server inicia.
28
- 3. Rode o diagnóstico da CLI Sema.
29
- 4. Instale uma chave MCP do painel sem passar o segredo como argumento de processo.
30
- 5. Sincronize entrypoints IA.
31
-
32
- ## Español
33
-
34
- La extensión VS Code forma parte del flujo privado de Sema. Debe ayudar a agentes en IDE local a leer `AGENTS.md`, ejecutar el runtime gobernado de la CLI instalada desde `@semacode/cli`, instalar claves MCP con seguridad y sincronizar entrypoints IA sin exponer secretos.
35
-
36
- Smoke test:
37
-
38
- 1. Abre un proyecto con contratos `.sema`.
39
- 2. Confirma que el language server inicia.
40
- 3. Ejecuta el diagnóstico de la CLI Sema.
41
- 4. Instala una clave MCP del panel sin pasar el secreto como argumento de proceso.
42
- 5. Sincroniza entrypoints IA.
3
+ A extensão VS Code faz parte do fluxo privado da Sema. Ela ajuda humanos e IAs
4
+ em IDE local a escrever contratos `.sema`, receber feedback rápido e manter o
5
+ projeto preso ao fluxo correto: CLI local primeiro, contrato antes de código e
6
+ fechamento governado.
7
+
8
+ Ela não substitui o painel, a chave local, a CLI, o MCP remoto nem a validação
9
+ final.
10
+
11
+ ## Fluxo Obrigatório
12
+
13
+ 1. Abrir o projeto no VS Code.
14
+ 2. Ler `AGENTS.md`.
15
+ 3. Rodar `sema --version`.
16
+ 4. Se o comando não existir, parar. A IA não acessa o painel Sema: peça ao
17
+ humano para abrir o painel e rodar o instalador de chave/CLI.
18
+ 5. Rodar `sema preflight resumo --json` e exigir `use_cli_local`.
19
+ 6. Editar ou criar o contrato `.sema` aplicável antes de alterar código.
20
+ 7. Usar a extensão para autoria, snippets, hover, formatação e diagnóstico.
21
+ 8. Fechar pela CLI com `validar`, `drift`, `impacto`, testes e
22
+ `finalizar-mudanca`.
23
+
24
+ ## Empacotar E Instalar Localmente
25
+
26
+ ```bash
27
+ npm run extensao:empacotar
28
+ code --install-extension .tmp/editor-vscode/sema-language-tools-1.5.44.vsix --force
29
+ ```
30
+
31
+ ## Limites
32
+
33
+ A extensão não deve:
34
+
35
+ - instalar chave sozinha;
36
+ - consultar o painel como se fosse humano;
37
+ - usar MCP remoto para ler workspace local;
38
+ - publicar pacote;
39
+ - dizer que uma mudança está concluída sem CLI;
40
+ - substituir contrato por README ou comentário de código.
@@ -24,7 +24,7 @@ Regra de timeout: timeout local do agente não é falha do Sema. Se `sema resumo
24
24
 
25
25
  ## Superfície obrigatória
26
26
 
27
- 1. IDE local com workspace no disco: rode `sema preflight resumo --json`. Se `decisao` não for `use_cli_local`, pare bloqueado.
27
+ 1. IDE local com workspace no disco: rode `sema --version`; se falhar, pare. A IA não acessa o painel Sema: peça ao humano para instalar pelo painel. Depois rode `sema preflight resumo --json`. Se `decisao` não for `use_cli_local`, pare bloqueado.
28
28
  2. IDE local autorizada: use somente a CLI local para `resumo`, `docs-impacto`, `inspecionar`, `drift`, `impacto`, `validar`, `verificar` e `finalizar-mudanca`.
29
29
  3. IDE local proibida: não chame MCP remoto, `sema_sync`, `sema_contratos_sincronizar` nem `sema mcp-client` para ler o workspace local.
30
30
  4. Web/chat/remoto sem workspace local: use `sema_chat_contexto`, depois `sema_sync` inline com contrato `.sema`, código selecionado, documentação operacional e índice; use o `projeto` retornado.
@@ -33,7 +33,7 @@ Regra de timeout: timeout local do agente não é falha do Sema. Se `sema resumo
33
33
  ## Fluxo curto
34
34
 
35
35
  1. identificar a superfície: CLI local ou MCP remoto web/chat
36
- 2. em IDE local, rodar `sema preflight resumo --json` e parar se não retornar `use_cli_local`
36
+ 2. em IDE local, rodar `sema --version`; se falhar, parar. A IA não acessa o painel Sema: pedir ao humano para instalar pelo painel; depois rodar `sema preflight resumo --json` e parar se não retornar `use_cli_local`
37
37
  3. ler contexto do projeto
38
38
  4. identificar a capacidade da IA
39
39
  5. identificar o módulo alvo
@@ -86,6 +86,7 @@ Regra pratica:
86
86
  Antes de alterar, a IA deve executar:
87
87
 
88
88
  ```bash
89
+ sema --version
89
90
  sema preflight resumo --json
90
91
  sema resumo caminho/arquivo.sema --curto --para mudanca
91
92
  sema ast caminho/arquivo.sema --json
@@ -142,7 +143,7 @@ Se a tarefa não for só editar contrato, mas também gerar base de implementaca
142
143
  sema compilar caminho/arquivo.sema --alvo typescript --saida ./saida/typescript
143
144
  ```
144
145
 
145
- Ou trocar o alvo para `python` ou `dart`, conforme o caso.
146
+ Ou trocar o alvo para `python`, `dart`, `lua`, `javascript`, `html` ou `css`, conforme o caso.
146
147
 
147
148
  Regra pratica:
148
149
 
@@ -162,6 +163,7 @@ sema verificar arquivo-ou-pasta --json --saida ./.tmp/verificacao-ia
162
163
  Se voce quiser o menor fluxo aceitavel para uma IA fraca:
163
164
 
164
165
  ```bash
166
+ sema --version
165
167
  sema preflight resumo --json
166
168
  sema resumo caminho/arquivo.sema --micro --para mudanca
167
169
  sema formatar caminho/arquivo.sema
@@ -173,6 +175,7 @@ Mas, sendo sincero, o fluxo bom mesmo e fechar com `verificar`.
173
175
  Se a tarefa envolver código derivado, o fluxo mínimo aceitavel vira:
174
176
 
175
177
  ```bash
178
+ sema --version
176
179
  sema preflight resumo --json
177
180
  sema ir caminho/arquivo.sema --json
178
181
  sema formatar caminho/arquivo.sema
@@ -9,7 +9,7 @@
9
9
 
10
10
  Sema is private. Local IDEs use the complete Sema CLI. Web/chat clients without local workspace access use the remote MCP.
11
11
 
12
- In a local IDE, install the CLI and key, keep `AGENTS.md` in the project root, run `sema preflight resumo --json`, and stop unless `decisao` is `use_cli_local`. After that, use local CLI commands: `sema resumo`, `sema docs-impacto`, `sema inspecionar`, `sema drift`, `sema impacto`, `sema validar`, and `sema finalizar-mudanca`.
12
+ In a local IDE, keep `AGENTS.md` in the project root and run `sema --version`. If the command is missing, stop and ask the human to open the Sema panel, download/run the key installer, and repeat `sema --version`. Then run `sema preflight resumo --json` and stop unless `decisao` is `use_cli_local`. After that, use local CLI commands: `sema resumo`, `sema docs-impacto`, `sema inspecionar`, `sema drift`, `sema impacto`, `sema validar`, and `sema finalizar-mudanca`.
13
13
 
14
14
  Do not call remote MCP, `sema_sync`, `sema_contratos_sincronizar`, or `sema mcp-client` to read a local workspace. Those paths are forbidden for local IDE work when the CLI is operational.
15
15
 
@@ -27,7 +27,7 @@ The MCP server remains the private web/chat surface. Do not install the MCP from
27
27
 
28
28
  A Sema é privada. IDE local usa a CLI completa da Sema. Cliente web/chat sem acesso ao workspace local usa MCP remoto.
29
29
 
30
- Em IDE local, instale a CLI e a chave, mantenha `AGENTS.md` na raiz do projeto, rode `sema preflight resumo --json` e pare se `decisao` não for `use_cli_local`. Depois disso, use comandos locais da CLI: `sema resumo`, `sema docs-impacto`, `sema inspecionar`, `sema drift`, `sema impacto`, `sema validar` e `sema finalizar-mudanca`.
30
+ Em IDE local, o agente deve manter `AGENTS.md` na raiz e rodar `sema --version`. Se o comando não existir, ele deve parar. A IA não acessa o painel Sema: peça ao humano para abrir o painel, baixar/rodar o instalador de chave e repetir `sema --version`. Depois disso, rode `sema preflight resumo --json` e pare se `decisao` não for `use_cli_local`. Com CLI autorizada, use comandos locais da CLI: `sema resumo`, `sema docs-impacto`, `sema inspecionar`, `sema drift`, `sema impacto`, `sema validar` e `sema finalizar-mudanca`.
31
31
 
32
32
  Não chame MCP remoto, `sema_sync`, `sema_contratos_sincronizar` nem `sema mcp-client` para ler workspace local. Esses caminhos são proibidos em IDE local quando a CLI está operacional.
33
33
 
@@ -45,7 +45,7 @@ O servidor MCP continua sendo a superfície privada para web/chat. Não instale
45
45
 
46
46
  Sema es privada. Una IDE local usa la CLI completa de Sema. Un cliente web/chat sin acceso al workspace local usa el MCP remoto.
47
47
 
48
- En una IDE local, instala la CLI y la clave, deja `AGENTS.md` en la raíz del proyecto, ejecuta `sema preflight resumo --json` y para si `decisao` no es `use_cli_local`. Después usa comandos locales de la CLI: `sema resumo`, `sema docs-impacto`, `sema inspecionar`, `sema drift`, `sema impacto`, `sema validar` y `sema finalizar-mudanca`.
48
+ En una IDE local, deja `AGENTS.md` en la raíz del proyecto y ejecuta `sema --version`. Si el comando no existe, para y pide al humano que abra el panel Sema, descargue/ejecute el instalador de clave y repita `sema --version`. Después ejecuta `sema preflight resumo --json` y para si `decisao` no es `use_cli_local`. Después usa comandos locales de la CLI: `sema resumo`, `sema docs-impacto`, `sema inspecionar`, `sema drift`, `sema impacto`, `sema validar` y `sema finalizar-mudanca`.
49
49
 
50
50
  No llames el MCP remoto, `sema_sync`, `sema_contratos_sincronizar` ni `sema mcp-client` para leer un workspace local. Esos caminos están prohibidos en una IDE local cuando la CLI está operacional.
51
51
 
@@ -23,7 +23,7 @@ Sema pode usar palavras-chave de DSL em ASCII. A IA não deve copiar essa estét
23
23
 
24
24
  Sema exists for AI agents operating live systems. The agent should ask Sema for preflight, summary, docs impact, drift, impact, profile validation, and finalization instead of guessing from raw code.
25
25
 
26
- In local IDEs, confirm `AGENTS.md` exists, install the complete Sema CLI, run `sema preflight resumo --json`, and stop unless the decision is `use_cli_local`. Then use local CLI commands: `sema resumo`, `sema docs-impacto`, `sema inspecionar`, `sema drift`, `sema impacto`, `sema validar`, and `sema finalizar-mudanca`. Do not call remote MCP, `sema_sync`, `sema_contratos_sincronizar`, or `sema mcp-client` to read a local workspace.
26
+ In local IDEs, confirm `AGENTS.md` exists and run `sema --version`. If the command is missing, stop and ask the human to open the Sema panel and run the key installer. Then run `sema preflight resumo --json` and stop unless the decision is `use_cli_local`. Then use local CLI commands: `sema resumo`, `sema docs-impacto`, `sema inspecionar`, `sema drift`, `sema impacto`, `sema validar`, and `sema finalizar-mudanca`. Do not call remote MCP, `sema_sync`, `sema_contratos_sincronizar`, or `sema mcp-client` to read a local workspace.
27
27
 
28
28
  In web chats without workspace access, use `sema_chat_contexto` first, then `sema_sync` with contract, selected code, documentation, and index; then use the returned `projeto`. The CLI and MCP use the same commercial control plane and SEMAS account.
29
29
 
@@ -31,7 +31,7 @@ In web chats without workspace access, use `sema_chat_contexto` first, then `sem
31
31
 
32
32
  A Sema existe para agentes de IA operarem sistemas vivos. O agente deve pedir preflight, resumo, impacto documental, drift, impacto, validação de profile e finalização para a Sema em vez de adivinhar pelo código cru.
33
33
 
34
- Em IDE local, confirme que `AGENTS.md` existe, instale a CLI completa da Sema, rode `sema preflight resumo --json` e pare se a decisão não for `use_cli_local`. Depois use comandos locais da CLI: `sema resumo`, `sema docs-impacto`, `sema inspecionar`, `sema drift`, `sema impacto`, `sema validar` e `sema finalizar-mudanca`. Não chame MCP remoto, `sema_sync`, `sema_contratos_sincronizar` nem `sema mcp-client` para ler workspace local.
34
+ Em IDE local, confirme que `AGENTS.md` existe e rode `sema --version`. Se o comando não existir, pare. A IA não acessa o painel Sema: peça ao humano para abrir o painel e rodar o instalador de chave. Depois rode `sema preflight resumo --json` e pare se a decisão não for `use_cli_local`. Depois use comandos locais da CLI: `sema resumo`, `sema docs-impacto`, `sema inspecionar`, `sema drift`, `sema impacto`, `sema validar` e `sema finalizar-mudanca`. Não chame MCP remoto, `sema_sync`, `sema_contratos_sincronizar` nem `sema mcp-client` para ler workspace local.
35
35
 
36
36
  Em chats web sem acesso ao workspace, use primeiro `sema_chat_contexto`, depois `sema_sync` com contrato, código selecionado, documentação e índice; depois use o `projeto` retornado. CLI e MCP usam o mesmo control plane comercial e a mesma conta de SEMAS.
37
37
 
@@ -39,6 +39,6 @@ Em chats web sem acesso ao workspace, use primeiro `sema_chat_contexto`, depois
39
39
 
40
40
  Sema existe para agentes de IA que operan sistemas vivos. El agente debe pedir preflight, resumen, impacto documental, drift, impacto, validación de profile y finalización a Sema en vez de adivinar desde código crudo.
41
41
 
42
- En una IDE local, confirma que `AGENTS.md` existe, instala la CLI completa de Sema, ejecuta `sema preflight resumo --json` y para si la decisión no es `use_cli_local`. Después usa comandos locales de la CLI: `sema resumo`, `sema docs-impacto`, `sema inspecionar`, `sema drift`, `sema impacto`, `sema validar` y `sema finalizar-mudanca`. No llames el MCP remoto, `sema_sync`, `sema_contratos_sincronizar` ni `sema mcp-client` para leer un workspace local.
42
+ En una IDE local, confirma que `AGENTS.md` existe y ejecuta `sema --version`. Si el comando no existe, para y pide al humano que abra el panel Sema y ejecute el instalador de clave. Después ejecuta `sema preflight resumo --json` y para si la decisión no es `use_cli_local`. Después usa comandos locales de la CLI: `sema resumo`, `sema docs-impacto`, `sema inspecionar`, `sema drift`, `sema impacto`, `sema validar` y `sema finalizar-mudanca`. No llames el MCP remoto, `sema_sync`, `sema_contratos_sincronizar` ni `sema mcp-client` para leer un workspace local.
43
43
 
44
44
  En chats web sin acceso al workspace, usa primero `sema_chat_contexto`, después `sema_sync` con contrato, código seleccionado, documentación e índice; después usa el `projeto` devuelto. CLI y MCP usan el mismo control plane comercial y la misma cuenta de SEMAS.
package/docs/mcp.md CHANGED
@@ -10,8 +10,9 @@
10
10
  The Sema MCP is the private coordinator for agents. It authenticates clients, selects the project or mirror, charges SEMAS, chooses profiles/pipelines, asks the CLI to read or execute, and returns a traceable decision.
11
11
 
12
12
  It must stay compatible with web chats. For ChatGPT, Lovable, GPTs, and similar clients, the MCP runs on the VPS and uses the governed CLI installed there against authorized mirrors such as `/srv/sema/projetos/...`.
13
+ When the MCP is public or runs as `production`, it fails closed unless billing is enabled, Supabase billing is configured, legacy bearer is absent, OAuth passcode fallback is absent, and CORS is not wildcard. A remote tool call must not execute if SEMAS billing is disabled.
13
14
 
14
- Local IDEs should not use remote MCP, `sema_sync`, `sema_contratos_sincronizar`, or `sema mcp-client` to read a local workspace. In that mode, install the complete Sema CLI, save the local key, run `sema preflight resumo --json`, and continue locally only when the decision is `use_cli_local`.
15
+ Local IDEs should not use remote MCP, `sema_sync`, `sema_contratos_sincronizar`, or `sema mcp-client` to read a local workspace. In that mode, the agent must run `sema --version` locally. If the command is missing, the agent must stop and ask the human to open the Sema panel, download/run the key installer, and then repeat `sema --version`. After that, run `sema preflight resumo --json` and continue locally only when the decision is `use_cli_local`.
15
16
 
16
17
  The MCP must never pretend that a local Windows path exists on the Linux server. If a local IDE asks the remote MCP to read that path, the next action is to use the local CLI. If a web/chat client has no workspace, the next action is to request or create a mirror/snapshot.
17
18
 
@@ -30,8 +31,9 @@ Scores, findings, and agent decisions are useful signals, not proof by themselve
30
31
  O MCP da Sema é o coordenador privado dos agentes. Ele autentica clientes, escolhe o projeto ou espelho, cobra SEMAS, seleciona profiles/pipelines, pede para a CLI ler ou executar e devolve uma decisão rastreável.
31
32
 
32
33
  Ele precisa continuar compatível com chats web. Para ChatGPT, Lovable, GPTs e clientes parecidos, o MCP roda na VPS e usa a CLI governada instalada lá contra espelhos autorizados como `/srv/sema/projetos/...`.
34
+ Quando o MCP é publico ou roda como `production`, ele falha fechado se billing nao estiver habilitado, Supabase de billing nao estiver configurado, bearer legado existir, fallback por passcode OAuth existir ou CORS estiver em wildcard. Chamada remota de ferramenta nao deve executar se a cobranca SEMAS estiver desabilitada.
33
35
 
34
- IDEs locais não devem usar MCP remoto, `sema_sync`, `sema_contratos_sincronizar` nem `sema mcp-client` para ler workspace local. Nesse modo, instale a CLI completa da Sema, grave a chave local, rode `sema preflight resumo --json` e continue localmente somente quando a decisão for `use_cli_local`.
36
+ IDEs locais não devem usar MCP remoto, `sema_sync`, `sema_contratos_sincronizar` nem `sema mcp-client` para ler workspace local. Nesse modo, o agente deve rodar `sema --version` localmente. Se o comando não existir, o agente deve parar e pedir ao humano para abrir o painel Sema, baixar/rodar o instalador de chave e repetir `sema --version`. Depois disso, rode `sema preflight resumo --json` e continue localmente somente quando a decisão for `use_cli_local`.
35
37
 
36
38
  O MCP nunca deve fingir que um caminho Windows local existe no servidor Linux. Se uma IDE local pedir ao MCP remoto para ler esse caminho, a próxima ação é usar a CLI local. Se um cliente web/chat não tiver workspace, a próxima ação é pedir ou criar um espelho/snapshot.
37
39
 
@@ -50,8 +52,9 @@ Scores, achados e decisoes do agente sao sinais uteis, nao prova isolada. O MCP
50
52
  El MCP de Sema es el coordinador privado de los agentes. Autentica clientes, elige el proyecto o espejo, cobra SEMAS, selecciona profiles/pipelines, pide a la CLI que lea o ejecute y devuelve una decisión trazable.
51
53
 
52
54
  Debe seguir compatible con chats web. Para ChatGPT, Lovable, GPTs y clientes similares, el MCP corre en la VPS y usa la CLI gobernada instalada allí contra espejos autorizados como `/srv/sema/projetos/...`.
55
+ Cuando el MCP es publico o corre como `production`, falla cerrado si billing no esta habilitado, Supabase de billing no esta configurado, bearer legado existe, fallback por passcode OAuth existe o CORS esta en wildcard. Una llamada remota de herramienta no debe ejecutar si la cobranza SEMAS esta deshabilitada.
53
56
 
54
- Las IDEs locales no deben usar el MCP remoto, `sema_sync`, `sema_contratos_sincronizar` ni `sema mcp-client` para leer un workspace local. En ese modo, instala la CLI completa de Sema, guarda la clave local, ejecuta `sema preflight resumo --json` y continúa localmente solo cuando la decisión sea `use_cli_local`.
57
+ Las IDEs locales no deben usar el MCP remoto, `sema_sync`, `sema_contratos_sincronizar` ni `sema mcp-client` para leer un workspace local. En ese modo, el agente debe ejecutar `sema --version` localmente. Si el comando no existe, el agente debe parar y pedir al humano que abra el panel Sema, descargue/ejecute el instalador de clave y repita `sema --version`. Después ejecuta `sema preflight resumo --json` y continúa localmente solo cuando la decisión sea `use_cli_local`.
55
58
 
56
59
  El MCP nunca debe fingir que una ruta local de Windows existe en el servidor Linux. Si una IDE local pide al MCP remoto leer esa ruta, la siguiente acción es usar la CLI local. Si un cliente web/chat no tiene workspace, la siguiente acción es pedir o crear un espejo/snapshot.
57
60
 
@@ -14,7 +14,7 @@ The active tree lives at the repository root: `contratos/`, `pacotes/`, `mcp/`,
14
14
  The operating model is:
15
15
 
16
16
  - The CLI is distributed through the npm installer/client `@semacode/cli`, then acts as the governed local executor for IDEs: it reads contracts, validates, checks drift, builds AI-first context, and runs `sema preflight resumo --json` against the SEMAS control plane before local action.
17
- - Local IDEs use the complete CLI and a local key. Stop unless `decisao=use_cli_local`. Do not use remote MCP, `sema_sync`, `sema_contratos_sincronizar`, or `sema mcp-client` to read a local workspace.
17
+ - Local IDEs use the complete CLI and a local key. The agent must run `sema --version`; if missing, it asks the human to install from the Sema panel. Stop unless `decisao=use_cli_local`. Do not use remote MCP, `sema_sync`, `sema_contratos_sincronizar`, or `sema mcp-client` to read a local workspace.
18
18
  - The private MCP is the web/chat coordinator: it authenticates remote clients, selects the right server project or mirror, charges SEMAS, decides the required contract/profile flow, and returns the operational verdict.
19
19
  - Web chats remain supported because the private MCP keeps a CLI installed on the VPS and runs it against authorized mirrors under `/srv/sema/projetos/...`.
20
20
 
@@ -35,7 +35,7 @@ A árvore ativa vive na raiz do repositório: `contratos/`, `pacotes/`, `mcp/`,
35
35
  O modelo operacional é:
36
36
 
37
37
  - A CLI é distribuída pelo instalador/cliente npm `@semacode/cli` e depois atua como executor local governado para IDEs: lê contratos, valida, mede drift, monta contexto IA-first e roda `sema preflight resumo --json` contra o control plane de SEMAS antes de agir localmente.
38
- - IDEs locais usam a CLI completa e uma chave local. Pare se `decisao` não for `use_cli_local`. Não use MCP remoto, `sema_sync`, `sema_contratos_sincronizar` nem `sema mcp-client` para ler workspace local.
38
+ - IDEs locais usam a CLI completa e uma chave local. O agente deve rodar `sema --version`; se faltar, deve pedir ao humano para instalar pelo painel Sema. Pare se `decisao` não for `use_cli_local`. Não use MCP remoto, `sema_sync`, `sema_contratos_sincronizar` nem `sema mcp-client` para ler workspace local.
39
39
  - O MCP privado é o coordenador web/chat: autentica clientes remotos, escolhe o projeto ou espelho de servidor correto, cobra SEMAS, decide o fluxo de contrato/profile obrigatório e devolve o veredito operacional.
40
40
  - Chats web continuam suportados porque o MCP privado mantém uma CLI instalada na VPS e executa contra espelhos autorizados em `/srv/sema/projetos/...`.
41
41
 
@@ -56,7 +56,7 @@ El árbol activo vive en la raíz del repositorio: `contratos/`, `pacotes/`, `mc
56
56
  El modelo operativo es:
57
57
 
58
58
  - La CLI se distribuye por el instalador/cliente npm `@semacode/cli` y luego actúa como ejecutor local gobernado para IDEs: lee contratos, valida, mide drift, prepara contexto IA-first y ejecuta `sema preflight resumo --json` contra el control plane de SEMAS antes de actuar localmente.
59
- - Las IDEs locales usan la CLI completa y una clave local. Para si `decisao` no es `use_cli_local`. No uses el MCP remoto, `sema_sync`, `sema_contratos_sincronizar` ni `sema mcp-client` para leer un workspace local.
59
+ - Las IDEs locales usan la CLI completa y una clave local. El agente debe ejecutar `sema --version`; si falta, debe pedir al humano que instale desde el panel Sema. Para si `decisao` no es `use_cli_local`. No uses el MCP remoto, `sema_sync`, `sema_contratos_sincronizar` ni `sema mcp-client` para leer un workspace local.
60
60
  - El MCP privado es el coordinador web/chat: autentica clientes remotos, elige el proyecto o espejo de servidor correcto, cobra SEMAS, decide el flujo obligatorio de contrato/profile y devuelve el veredicto operativo.
61
61
  - Los chats web siguen soportados porque el MCP privado mantiene una CLI instalada en la VPS y la ejecuta contra espejos autorizados en `/srv/sema/projetos/...`.
62
62
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sema/gerador-css",
3
- "version": "1.5.42",
3
+ "version": "1.5.44",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sema/gerador-dart",
3
- "version": "1.5.42",
3
+ "version": "1.5.44",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sema/gerador-html",
3
- "version": "1.5.42",
3
+ "version": "1.5.44",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sema/gerador-javascript",
3
- "version": "1.5.42",
3
+ "version": "1.5.44",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts"
@@ -108,7 +108,20 @@ function gerarExpressaoLua(expressao, camposConhecidos, variavel) {
108
108
  return `(not ${gerarExpressaoLua(expressao.termo, camposConhecidos, variavel)})`;
109
109
  }
110
110
  }
111
+ function gerarValidacaoPredicadoLua(texto, camposEntrada) {
112
+ const diferenteDe = /^([A-Za-z_][A-Za-z0-9_]*)\s+deve_ser\s+diferente_de\s+([A-Za-z0-9_-]+)$/u.exec(texto);
113
+ if (diferenteDe?.[1] && diferenteDe[2] && camposEntrada.has(diferenteDe[1])) {
114
+ return ` if entrada[${JSON.stringify(diferenteDe[1])}] == ${JSON.stringify(diferenteDe[2])} then return nil end`;
115
+ }
116
+ const umDe = /^([A-Za-z_][A-Za-z0-9_]*)\s+deve_ser\s+um_de\s+\[\s*([^\]]+?)\s*\]$/u.exec(texto);
117
+ if (umDe?.[1] && umDe[2] && camposEntrada.has(umDe[1])) {
118
+ const valores = umDe[2].split(",").flatMap((parte) => parte.trim().split(/\s+/u)).filter(Boolean);
119
+ return ` if not contem({ ${valores.map((valor) => JSON.stringify(valor)).join(", ")} }, entrada[${JSON.stringify(umDe[1])}]) then return nil end`;
120
+ }
121
+ return undefined;
122
+ }
111
123
  function gerarValidacoes(task) {
124
+ const camposEntrada = new Set(task.input.map((campo) => campo.nome));
112
125
  const linhas = [
113
126
  ...task.input
114
127
  .filter((campo) => campo.modificadores.includes("required"))
@@ -116,9 +129,9 @@ function gerarValidacoes(task) {
116
129
  ...task.regrasEstruturadas.map((regra) => {
117
130
  switch (regra.tipo) {
118
131
  case "predicado":
119
- return ` -- Predicado declarado em Sema: ${regra.textoOriginal}`;
132
+ return [gerarValidacaoPredicadoLua(regra.textoOriginal, camposEntrada), ` -- Predicado declarado em Sema: ${regra.textoOriginal}`].filter(Boolean).join("\n");
120
133
  default:
121
- return ` if not (${gerarExpressaoLua(regra, new Set(task.input.map((campo) => campo.nome)), "entrada")}) then error("Regra violada: ${regra.textoOriginal}") end`;
134
+ return ` if not (${gerarExpressaoLua(regra, camposEntrada, "entrada")}) then error("Regra violada: ${regra.textoOriginal}") end`;
122
135
  }
123
136
  }),
124
137
  ...task.rules
@@ -146,8 +159,28 @@ function gerarGarantias(task) {
146
159
  }
147
160
  function gerarPreparacaoSaida(task) {
148
161
  const camposSaida = new Set(task.output.map((campo) => campo.nome));
162
+ const camposEntrada = new Set(task.input.map((campo) => campo.nome));
149
163
  const inicializacao = task.output.map((campo) => ` ${campo.nome} = ${valorPadraoLua(campo)},`).join("\n");
150
164
  const ajustes = [];
165
+ const precondicoes = [];
166
+ const campoArtefatoI18n = ["artefato_ui", "artefato_real"].find((campo) => camposEntrada.has(campo));
167
+ const campoContratoI18n = ["contrato_alvo", "contrato"].find((campo) => camposEntrada.has(campo));
168
+ if (campoArtefatoI18n && (camposEntrada.has("idioma") || campoContratoI18n)) {
169
+ precondicoes.push(` local artefato_ui = tostring(entrada[${JSON.stringify(campoArtefatoI18n)}] or "")`);
170
+ precondicoes.push(` local contrato_i18n = tostring(entrada[${JSON.stringify(campoContratoI18n ?? "")}] or ""):lower()`);
171
+ precondicoes.push(` local idioma = tostring(entrada["idioma"] or ""):lower()`);
172
+ precondicoes.push(` if idioma == "" and (contrato_i18n:find("i18n_ptbr", 1, true) or contrato_i18n:find("pt-br", 1, true)) then idioma = "pt-br" end`);
173
+ precondicoes.push(` if idioma == "" and contrato_i18n:find("i18n_es", 1, true) then idioma = "es" end`);
174
+ precondicoes.push(` if idioma == "" and contrato_i18n:find("i18n", 1, true) then return nil end`);
175
+ precondicoes.push(` if (idioma == "pt-br" or idioma == "ptbr" or idioma == "pt") and artefato_ui:find("Descricao", 1, true) then return nil end`);
176
+ precondicoes.push(` if idioma == "es" and artefato_ui:find("Descripcion", 1, true) then return nil end`);
177
+ if (camposSaida.has("garantia_observavel")) {
178
+ ajustes.push(` saida["garantia_observavel"] = true`);
179
+ }
180
+ if (camposSaida.has("diacriticos_preservados")) {
181
+ ajustes.push(` saida["diacriticos_preservados"] = true`);
182
+ }
183
+ }
151
184
  for (const garantia of task.garantiasEstruturadas) {
152
185
  if (garantia.tipo === "pertencimento" && garantia.valores && camposSaida.has(garantia.alvo)) {
153
186
  ajustes.push(` saida[${JSON.stringify(garantia.alvo)}] = ${formatarValorLua(garantia.valores[0] ?? "", camposSaida, "saida")}`);
@@ -170,7 +203,7 @@ function gerarPreparacaoSaida(task) {
170
203
  }
171
204
  }
172
205
  }
173
- return ` local saida = {\n${inicializacao}\n }\n${ajustes.join("\n")}`;
206
+ return `${precondicoes.length ? `${precondicoes.join("\n")}\n` : ""} local saida = {\n${inicializacao}\n }\n${ajustes.join("\n")}`;
174
207
  }
175
208
  function formatarLiteralTesteLua(valor, tipoDeclarado) {
176
209
  if (["Texto", "Id", "Email", "Url", "Data", "DataHora"].includes(tipoDeclarado ?? "")) {