@semacode/cli 2.2.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.
- package/LICENSE +39 -39
- package/README.md +251 -141
- package/dist/agentContext.d.ts +1 -1
- package/dist/agentContextPack.js +6 -1
- package/dist/agentContextTipos.d.ts +4 -2
- package/dist/agentContextTipos.js +7 -0
- package/dist/agentEntryPoints.js +551 -499
- package/dist/angular-consumer-standalone.d.ts +3 -1
- package/dist/angular-consumer-standalone.js +12 -8
- package/dist/comandos.js +4 -0
- package/dist/discovery/catalog.d.ts +11 -0
- package/dist/discovery/catalog.js +521 -0
- package/dist/discovery/command.d.ts +11 -0
- package/dist/discovery/command.js +226 -0
- package/dist/discovery/index.d.ts +5 -0
- package/dist/discovery/index.js +8 -0
- package/dist/discovery/ranker.d.ts +3 -0
- package/dist/discovery/ranker.js +310 -0
- package/dist/discovery/redaction.d.ts +2 -0
- package/dist/discovery/redaction.js +21 -0
- package/dist/discovery/render.d.ts +2 -0
- package/dist/discovery/render.js +100 -0
- package/dist/discovery/types.d.ts +119 -0
- package/dist/discovery/types.js +13 -0
- package/dist/drift.part01.d.ts +32 -2
- package/dist/drift.part01.js +2 -0
- package/dist/drift.part04.d.ts +3 -2
- package/dist/drift.part04.js +6 -3
- package/dist/drift.part05.d.ts +2 -1
- package/dist/drift.part05.js +4 -3
- package/dist/drift.part06.d.ts +2 -1
- package/dist/drift.part06.js +9 -5
- package/dist/drift.part07.d.ts +11 -10
- package/dist/drift.part07.js +40 -30
- package/dist/drift.part08.d.ts +2 -1
- package/dist/drift.part08.js +4 -3
- package/dist/drift.part11.js +71 -6
- package/dist/drift.part12.js +14 -1
- package/dist/drift.part13.d.ts +42 -7
- package/dist/drift.part13.js +660 -36
- package/dist/driftCache.d.ts +49 -0
- package/dist/driftCache.js +311 -0
- package/dist/driftCacheIncremental.d.ts +98 -0
- package/dist/driftCacheIncremental.js +596 -0
- package/dist/driftCatalogo.d.ts +91 -0
- package/dist/driftCatalogo.js +657 -0
- package/dist/driftCatalogoPersistente.d.ts +8 -0
- package/dist/driftCatalogoPersistente.js +77 -0
- package/dist/driftEscopo.d.ts +23 -0
- package/dist/driftEscopo.js +563 -0
- package/dist/driftEscopoReferencias.d.ts +4 -0
- package/dist/driftEscopoReferencias.js +265 -0
- package/dist/driftOrcamento.d.ts +12 -0
- package/dist/driftOrcamento.js +19 -3
- package/dist/execucoesExternas.js +5 -19
- package/dist/exemplosOficiais.js +29 -8
- package/dist/iaPrompts.d.ts +1 -1
- package/dist/iaPrompts.js +310 -307
- package/dist/index.d.ts +2 -0
- package/dist/index.js +23 -5
- package/dist/index.part01.d.ts +17 -2
- package/dist/index.part01.js +119 -8
- package/dist/index.part02.js +21 -21
- package/dist/index.part03.d.ts +2 -2
- package/dist/index.part03.js +14 -3
- package/dist/index.part04.d.ts +2 -2
- package/dist/index.part04.js +113 -101
- package/dist/index.part05.d.ts +1 -1
- package/dist/index.part05.js +99 -22
- package/dist/index.part06.js +6 -2
- package/dist/index.part07.js +24 -24
- package/dist/index.part08.js +1 -1
- package/dist/init/templates.part01.js +393 -393
- package/dist/init/templates.part02.js +189 -189
- package/dist/initTemplatesBackend.js +73 -73
- package/dist/initTemplatesBase.js +81 -80
- package/dist/initTemplatesFlutter.js +137 -137
- package/dist/initTemplatesRuntime.js +350 -350
- package/dist/initTemplatesWeb.js +309 -309
- package/dist/pipelineConteudo/command.js +1 -36
- package/dist/profileArtefatoValidadores.d.ts +3 -2
- package/dist/profileArtefatoValidadores.js +81 -0
- package/dist/profileAuthorTipos.d.ts +4 -3
- package/dist/profileCatalogo.d.ts +5 -5
- package/dist/profileCatalogo.js +30 -0
- package/dist/profileCommand.d.ts +8 -2
- package/dist/profileCommand.js +15 -5
- package/dist/profileRegras.d.ts +5 -5
- package/dist/profileRegras.js +13 -1
- package/dist/profileRulePacks.js +68 -0
- package/dist/projeto.d.ts +1 -1
- package/dist/projetoCarregar.d.ts +2 -2
- package/dist/projetoCarregar.js +47 -24
- package/dist/projetoCatalogo.d.ts +7 -0
- package/dist/projetoCatalogo.js +125 -0
- package/dist/projetoTipos.d.ts +14 -5
- package/dist/sistemasInterativos/adapterProtocol.d.ts +3 -0
- package/dist/sistemasInterativos/adapterProtocol.js +240 -0
- package/dist/sistemasInterativos/advancedCatalog.d.ts +5 -0
- package/dist/sistemasInterativos/advancedCatalog.js +442 -0
- package/dist/sistemasInterativos/autonomy.d.ts +230 -0
- package/dist/sistemasInterativos/autonomy.js +753 -0
- package/dist/sistemasInterativos/canonical.d.ts +3 -0
- package/dist/sistemasInterativos/canonical.js +43 -0
- package/dist/sistemasInterativos/catalog.d.ts +116 -0
- package/dist/sistemasInterativos/catalog.js +543 -0
- package/dist/sistemasInterativos/command.d.ts +7 -0
- package/dist/sistemasInterativos/command.js +311 -0
- package/dist/sistemasInterativos/controlRun.d.ts +56 -0
- package/dist/sistemasInterativos/controlRun.js +391 -0
- package/dist/sistemasInterativos/evidence.d.ts +5 -0
- package/dist/sistemasInterativos/evidence.js +306 -0
- package/dist/sistemasInterativos/experienceIr.d.ts +12 -0
- package/dist/sistemasInterativos/experienceIr.js +895 -0
- package/dist/sistemasInterativos/experienceIrSemantics.d.ts +30 -0
- package/dist/sistemasInterativos/experienceIrSemantics.js +368 -0
- package/dist/sistemasInterativos/experienceIrTypes.d.ts +370 -0
- package/dist/sistemasInterativos/experienceIrTypes.js +5 -0
- package/dist/sistemasInterativos/extensionCommand.d.ts +391 -0
- package/dist/sistemasInterativos/extensionCommand.js +383 -0
- package/dist/sistemasInterativos/index.d.ts +19 -0
- package/dist/sistemasInterativos/index.js +22 -0
- package/dist/sistemasInterativos/operations.d.ts +40 -0
- package/dist/sistemasInterativos/operations.js +1167 -0
- package/dist/sistemasInterativos/operationsTypes.d.ts +297 -0
- package/dist/sistemasInterativos/operationsTypes.js +11 -0
- package/dist/sistemasInterativos/planner.d.ts +2 -0
- package/dist/sistemasInterativos/planner.js +159 -0
- package/dist/sistemasInterativos/portability.d.ts +164 -0
- package/dist/sistemasInterativos/portability.js +539 -0
- package/dist/sistemasInterativos/render.d.ts +3 -0
- package/dist/sistemasInterativos/render.js +179 -0
- package/dist/sistemasInterativos/temporal.d.ts +183 -0
- package/dist/sistemasInterativos/temporal.js +543 -0
- package/dist/sistemasInterativos/types.d.ts +215 -0
- package/dist/sistemasInterativos/types.js +4 -0
- package/dist/sistemasInterativos/validator.d.ts +2 -0
- package/dist/sistemasInterativos/validator.js +305 -0
- package/dist/sync/index.js +35 -35
- package/docs/README.md +34 -28
- package/docs/ai-onboarding.md +62 -62
- package/docs/ai-workflow.md +9 -4
- package/docs/auth.md +26 -26
- package/docs/cli.md +79 -79
- package/docs/commands.md +47 -2
- package/docs/database.md +15 -15
- package/docs/deploy.md +41 -41
- package/docs/descoberta-capacidades.md +106 -0
- package/docs/documentation.md +39 -39
- package/docs/env.md +16 -16
- package/docs/frontend.md +41 -41
- package/docs/getting-started.md +57 -57
- package/docs/i18n.md +15 -15
- package/docs/pipeline-conteudo.md +246 -246
- package/docs/profiles.md +54 -45
- package/docs/repositories.md +43 -43
- package/docs/rollback.md +31 -31
- package/docs/security.md +32 -32
- package/docs/sistemas-interativos.md +376 -0
- package/docs/support.md +8 -8
- package/docs/testing.md +51 -35
- 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/pipeline-conteudo/README.md +44 -44
- package/exemplos/pipeline-conteudo/alvos.json +23 -23
- package/exemplos/pipeline-conteudo/definicao.json +136 -136
- 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_simulation.sema +211 -0
- 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/sistemas-interativos/README.md +100 -0
- package/exemplos/sistemas-interativos/advanced/acceptance-context-evaluate-valid.json +5 -0
- package/exemplos/sistemas-interativos/advanced/acceptance-lock-valid.json +16 -0
- package/exemplos/sistemas-interativos/advanced/asset-provenance-valid.json +32 -0
- package/exemplos/sistemas-interativos/advanced/autonomy-repair-valid.json +93 -0
- package/exemplos/sistemas-interativos/advanced/control-run-definition-valid.json +78 -0
- package/exemplos/sistemas-interativos/advanced/control-run-valid.json +27 -0
- package/exemplos/sistemas-interativos/advanced/distributed-workers-valid.json +79 -0
- package/exemplos/sistemas-interativos/advanced/editor-state-valid.json +42 -0
- package/exemplos/sistemas-interativos/advanced/engine-snapshot-after-valid.json +32 -0
- package/exemplos/sistemas-interativos/advanced/engine-snapshot-before-valid.json +23 -0
- package/exemplos/sistemas-interativos/advanced/job-orchestration-valid.json +39 -0
- package/exemplos/sistemas-interativos/advanced/multimodal-evidence-valid.json +46 -0
- package/exemplos/sistemas-interativos/advanced/multiplayer-authority-valid.json +39 -0
- package/exemplos/sistemas-interativos/advanced/playtest-fuzz-valid.json +37 -0
- package/exemplos/sistemas-interativos/advanced/portability-valid.json +104 -0
- package/exemplos/sistemas-interativos/advanced/temporal-evidence-valid.json +27 -0
- package/exemplos/sistemas-interativos/advanced/temporal-valid.json +118 -0
- package/exemplos/sistemas-interativos/experience-ir-valid.json +459 -0
- package/exemplos/sistemas-interativos/game-2d.json +83 -0
- package/exemplos/sistemas-interativos/game-3d-human.json +81 -0
- package/exemplos/sistemas-interativos/game-pixel-16-bit.json +97 -0
- package/exemplos/sistemas-interativos/game-pixel-8-bit.json +94 -0
- package/exemplos/sistemas-interativos/game-xr-human.json +80 -0
- package/exemplos/sistemas-interativos/hybrid-2-5d.json +108 -0
- package/exemplos/sistemas-interativos/protocol-mutating-rollback-valid.json +75 -0
- package/exemplos/sistemas-interativos/protocol-read-only-valid.json +58 -0
- package/exemplos/sistemas-interativos/simulation-2d-controlled.json +97 -0
- package/exemplos/sistemas-interativos/simulation-3d-calibrated-autonomous.json +141 -0
- package/exemplos/sistemas-interativos/simulation-headless-autonomous-batch.json +112 -0
- package/exemplos/sistemas-interativos/simulation-pixel-16-bit.json +103 -0
- package/exemplos/sistemas-interativos/simulation-text-controlled.json +95 -0
- 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-cpp/package.json +1 -1
- 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-dotnet/package.json +1 -1
- package/node_modules/@sema/gerador-html/dist/index.js +17 -17
- package/node_modules/@sema/gerador-lua/dist/index.js +76 -47
- package/node_modules/@sema/gerador-lua/dist/index.js.map +1 -1
- package/node_modules/@sema/gerador-php/dist/index.js +113 -113
- 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/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
|
package/dist/driftOrcamento.d.ts
CHANGED
|
@@ -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[]>;
|
package/dist/driftOrcamento.js
CHANGED
|
@@ -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
|
|
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 =
|
|
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
|
|
2
|
-
//
|
|
3
|
-
//
|
|
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
|
-
|
|
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")) {
|
package/dist/exemplosOficiais.js
CHANGED
|
@@ -6,6 +6,32 @@ import { fileURLToPath } from "node:url";
|
|
|
6
6
|
import { caminhoEhDiretorio } from "./fsGovernado.js";
|
|
7
7
|
import { escreverArquivoWorkspaceSeguro, validarDestinosEscritaWorkspace, } from "./workspaceWrite.js";
|
|
8
8
|
const DIRETORIO_CLI_ATUAL = path.dirname(fileURLToPath(import.meta.url));
|
|
9
|
+
const EXTENSOES_EXEMPLOS_OFICIAIS = new Set([".sema", ".json", ".md"]);
|
|
10
|
+
async function listarArquivosExemplosOficiais(origem, diretorioAtual = origem) {
|
|
11
|
+
const arquivos = [];
|
|
12
|
+
const entradas = await readdir(diretorioAtual, { withFileTypes: true });
|
|
13
|
+
for (const entrada of entradas) {
|
|
14
|
+
const origemArquivo = path.join(diretorioAtual, entrada.name);
|
|
15
|
+
const relativoOrigem = path.relative(origem, origemArquivo);
|
|
16
|
+
if (entrada.isSymbolicLink()) {
|
|
17
|
+
throw new Error(`Exemplo oficial nao pode atravessar symlink ou junction: ${relativoOrigem}`);
|
|
18
|
+
}
|
|
19
|
+
if (entrada.isDirectory()) {
|
|
20
|
+
arquivos.push(...await listarArquivosExemplosOficiais(origem, origemArquivo));
|
|
21
|
+
continue;
|
|
22
|
+
}
|
|
23
|
+
if (!entrada.isFile() ||
|
|
24
|
+
!EXTENSOES_EXEMPLOS_OFICIAIS.has(path.extname(entrada.name).toLowerCase())) {
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
arquivos.push({
|
|
28
|
+
nome: relativoOrigem,
|
|
29
|
+
origemArquivo,
|
|
30
|
+
caminhoRelativo: path.join("exemplos", relativoOrigem),
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
return arquivos;
|
|
34
|
+
}
|
|
9
35
|
export async function localizarDiretorioExemplosOficiais() {
|
|
10
36
|
const candidatos = [
|
|
11
37
|
path.resolve(DIRETORIO_CLI_ATUAL, "..", "exemplos"),
|
|
@@ -23,16 +49,11 @@ export async function planejarExemplosOficiais() {
|
|
|
23
49
|
if (!origem) {
|
|
24
50
|
return { origem: undefined, arquivos: [] };
|
|
25
51
|
}
|
|
26
|
-
const
|
|
27
|
-
|
|
28
|
-
.sort((a, b) => a.name.localeCompare(b.name, "pt-BR"));
|
|
52
|
+
const arquivos = await listarArquivosExemplosOficiais(origem);
|
|
53
|
+
arquivos.sort((a, b) => a.caminhoRelativo.localeCompare(b.caminhoRelativo, "pt-BR"));
|
|
29
54
|
return {
|
|
30
55
|
origem,
|
|
31
|
-
arquivos
|
|
32
|
-
nome: entrada.name,
|
|
33
|
-
origemArquivo: path.join(origem, entrada.name),
|
|
34
|
-
caminhoRelativo: path.join("exemplos", entrada.name),
|
|
35
|
-
})),
|
|
56
|
+
arquivos,
|
|
36
57
|
};
|
|
37
58
|
}
|
|
38
59
|
export async function materializarExemplosOficiais(baseProjeto = process.cwd(), preservarExistentes = true) {
|
package/dist/iaPrompts.d.ts
CHANGED
|
@@ -3,4 +3,4 @@ export declare const PROMPT_BASE_IA = "Voce esta trabalhando com Sema, um contra
|
|
|
3
3
|
export declare const PROMPT_IA_UI = "Atue como Engenheiro de Software Senior e UX/UI Designer de elite.\n\nQuero que voce trabalhe com Sema como fonte de verdade semantica do sistema e com React + TypeScript como camada de interface.\n\nEntregue obrigatoriamente duas partes integradas:\n1. os arquivos `.sema` do dominio\n2. a proposta ou implementacao da interface em React + TypeScript\n\nRegras:\n- nao entregue apenas HTML solto em arquivo unico\n- nao trate a Sema como enfeite conceitual\n- a interface deve nascer do contrato semantico definido em Sema\n- use os exemplos oficiais da Sema como referencia de estilo e semantica\n- nao invente sintaxe fora da gramatica suportada\n\nA Sema deve modelar, quando fizer sentido:\n- `module`\n- `use`\n- `entity`\n- `enum`\n- `state`\n- `task`\n- `flow`\n- `route`\n- `effects`\n- `error`\n- `guarantees`\n- `tests`\n- `docs`\n\nA interface deve refletir visualmente:\n- `state` como status e progresso observavel\n- `flow` como etapas ou orquestracao visivel\n- `error` como falhas tratadas com clareza\n- `effects` como operacoes relevantes para usuario ou operacao\n- `guarantees` como confianca, confirmacao ou consistencia final\n\nEstruture a entrega assim:\n1. visao do produto\n2. dominio modelado em Sema\n3. arquitetura de pastas em React + TypeScript\n4. componentes principais\n5. estrategia visual\n6. codigo principal da interface\n7. explicacao curta de como a UI conversa com a semantica da Sema\n\nSe a tarefa envolver app visual, a Sema governa o significado e o React renderiza a experiencia. Nao atropele essa separacao.\n";
|
|
4
4
|
export declare const PROMPT_IA_REACT = "Crie uma solucao com Sema + React + TypeScript.\n\nRegras principais:\n- a Sema deve ser a fonte de verdade semantica do dominio\n- React + TypeScript deve ser a camada de interface e experiencia\n- nao entregue HTML unico solto\n- nao trate a Sema como enfeite\n\nEntregue obrigatoriamente:\n1. arquivos `.sema` do dominio\n2. arquitetura de pastas do frontend\n3. componentes React principais\n4. contratos e tipos derivados da semantica\n5. interface elegante e implementavel\n\nA modelagem Sema deve cobrir, quando fizer sentido:\n- `entity`\n- `enum`\n- `state`\n- `task`\n- `flow`\n- `route`\n- `effects`\n- `error`\n- `guarantees`\n- `tests`\n\nA interface React deve tornar visiveis:\n- estado atual e transicoes relevantes\n- fluxo operacional\n- erros publicos\n- efeitos operacionais importantes\n- garantias ou confirmacoes finais\n\nEstruture a entrega assim:\n1. visao do produto\n2. arquivos `.sema`\n3. arquitetura React + TypeScript\n4. componentes e telas\n5. codigo principal\n6. explicacao de como a UI deriva da semantica da Sema\n\nSe houver duvida, siga os exemplos oficiais e mantenha a separacao:\n- Sema governa o significado\n- React governa a apresentacao\n";
|
|
5
5
|
export declare const PROMPT_IA_SEMA_PRIMEIRO = "Quero que voce trabalhe no modo \"Sema primeiro\".\n\nRegra principal:\n- modele primeiro o dominio em arquivos `.sema`\n- se a intencao mudar, crie, edite ou remova o contrato antes de qualquer acao operacional\n- so depois proponha ou gere codigo de aplicacao derivado disso\n\nFluxo obrigatorio:\n1. entender o dominio pedido\n2. modelar o contrato em Sema\n3. validar coerencia entre `task`, `route`, `state`, `flow`, `error`, `effects` e `guarantees`\n4. so depois gerar TypeScript, Python, React ou outra camada de implementacao\n\nNao entregue apenas codigo de interface ou codigo imperativo direto sem antes entregar a camada semantica.\n\nA modelagem em Sema deve:\n- preservar a intencao do dominio\n- explicitar entradas, saidas, erros, efeitos e garantias\n- usar apenas blocos e sintaxe oficiais\n- incluir testes embutidos quando fizer sentido\n\nSe houver interface grafica:\n- entregue a modelagem Sema primeiro\n- depois explique como a interface deve refletir a semantica\n- se gerar UI, use React + TypeScript em vez de HTML unico solto\n\nSe houver backend:\n- entregue a modelagem Sema primeiro\n- depois gere a borda publica e a implementacao derivada\n\nNao pule a etapa semantica. A camada `.sema` e a ancora principal da solucao.\n";
|
|
6
|
-
export declare const EXEMPLOS_PROMPT_IA = "Exemplos de prompt oficial para trabalhar com Sema\n\n1. Sema primeiro\n\nCrie uma solucao seguindo a estrategia \"Sema primeiro\".\nEntregue primeiro os arquivos `.sema` do dominio e so depois a implementacao derivada.\nNao entregue apenas codigo imperativo.\nUse Sema como fonte de verdade para contratos, estados, erros, efeitos e garantias.\n\n2. Sema + React + TypeScript\n\nCrie um projeto com Sema + React + TypeScript.\nEntregue:\n- os arquivos `.sema` do dominio\n- a arquitetura de pastas do frontend\n- componentes React que reflitam `state`, `flow`, `error`, `effects` e `guarantees`\n- uma interface elegante e implementavel\n- nao entregue HTML solto em arquivo unico\n\n3. Revisar ou corrigir um modulo Sema\n\nRevise e corrija um modulo `.sema`.\nAntes de editar:\n- leia os exemplos oficiais parecidos\n- consulte AST e IR\nDepois de editar:\n- rode `sema formatar`\n- rode `sema validar --json`\n- use `diagnosticos --json` se houver falha\n- feche com `sema verificar`\n\n4. Caso de UI sem perder a semantica\n\nQuero uma interface premium para este dominio, mas a solucao deve continuar ancorada em Sema.\nModele primeiro o dominio em `.sema`.\nDepois proponha uma interface em React + TypeScript que torne visiveis:\n- estado\n- fluxo\n- erros\n- efeitos\n- garantias\nNao transforme isso em um `index.html` solto.\n\nComandos uteis da CLI para esse fluxo:\n- `sema starter-ia`\n- `sema ajuda-ia`\n- `sema resumo <arquivo-ou-pasta>`\n- `sema prompt-curto <arquivo-ou-pasta>`\n- `sema prompt-ia`\n- `sema prompt-ia-ui`\n- `sema prompt-ia-react`\n- `sema prompt-ia-sema-primeiro`\n- `sema contexto-ia <arquivo.sema>`\n";
|
|
6
|
+
export declare const EXEMPLOS_PROMPT_IA = "Exemplos de prompt oficial para trabalhar com Sema\n\n1. Sema primeiro\n\nCrie uma solucao seguindo a estrategia \"Sema primeiro\".\nEntregue primeiro os arquivos `.sema` do dominio e so depois a implementacao derivada.\nNao entregue apenas codigo imperativo.\nUse Sema como fonte de verdade para contratos, estados, erros, efeitos e garantias.\n\n2. Sema + React + TypeScript\n\nCrie um projeto com Sema + React + TypeScript.\nEntregue:\n- os arquivos `.sema` do dominio\n- a arquitetura de pastas do frontend\n- componentes React que reflitam `state`, `flow`, `error`, `effects` e `guarantees`\n- uma interface elegante e implementavel\n- nao entregue HTML solto em arquivo unico\n\n3. Revisar ou corrigir um modulo Sema\n\nRevise e corrija um modulo `.sema`.\nAntes de editar:\n- leia os exemplos oficiais parecidos\n- consulte AST e IR\nDepois de editar:\n- rode `sema formatar`\n- rode `sema validar --json`\n- use `diagnosticos --json` se houver falha\n- feche com `sema verificar`\n\n4. Caso de UI sem perder a semantica\n\nQuero uma interface premium para este dominio, mas a solucao deve continuar ancorada em Sema.\nModele primeiro o dominio em `.sema`.\nDepois proponha uma interface em React + TypeScript que torne visiveis:\n- estado\n- fluxo\n- erros\n- efeitos\n- garantias\nNao transforme isso em um `index.html` solto.\n\nComandos uteis da CLI para esse fluxo:\n- `sema starter-ia`\n- `sema ajuda-ia`\n- `sema descobrir catalogo --json`\n- `sema descobrir recomendar --intencao \"<objetivo>\" --json`\n- `sema interativo pipelines --json`\n- `sema resumo <arquivo-ou-pasta>`\n- `sema prompt-curto <arquivo-ou-pasta>`\n- `sema prompt-ia`\n- `sema prompt-ia-ui`\n- `sema prompt-ia-react`\n- `sema prompt-ia-sema-primeiro`\n- `sema contexto-ia <arquivo.sema>`\n";
|