@semacode/cli 2.3.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +39 -39
- package/README.md +112 -41
- package/dist/agentContextPack.js +14 -10
- package/dist/agentEntryPoints.d.ts +5 -0
- package/dist/agentEntryPoints.js +102 -91
- package/dist/angular-consumer-standalone.d.ts +3 -1
- package/dist/angular-consumer-standalone.js +12 -8
- package/dist/bin.d.ts +6 -0
- package/dist/bin.js +130 -0
- package/dist/cliArgs.js +4 -4
- package/dist/cliControlError.d.ts +12 -0
- package/dist/cliControlError.js +47 -0
- package/dist/cliGrammar.d.ts +11 -0
- package/dist/cliGrammar.js +551 -0
- package/dist/cliHelp.d.ts +13 -0
- package/dist/cliHelp.js +19 -0
- package/dist/cliHelpTexto.d.ts +3 -0
- package/dist/cliHelpTexto.js +168 -0
- package/dist/cliRuntime.d.ts +2 -0
- package/dist/cliRuntime.js +31 -0
- package/dist/comandos.js +9 -22
- package/dist/contexto.js +5 -5
- package/dist/dev/index.d.ts +1 -0
- package/dist/dev/index.js +51 -9
- package/dist/discovery/catalog.js +3 -3
- package/dist/distribuicao/filesystemGlobal.d.ts +63 -0
- package/dist/distribuicao/filesystemGlobal.js +701 -0
- package/dist/distribuicao/index.d.ts +7 -0
- package/dist/distribuicao/index.js +227 -0
- package/dist/distribuicao/launcherGlobal.d.ts +53 -0
- package/dist/distribuicao/launcherGlobal.js +643 -0
- package/dist/distribuicao/launcherWindows.d.ts +28 -0
- package/dist/distribuicao/launcherWindows.js +326 -0
- package/dist/distribuicao/lockContextGlobal.d.ts +10 -0
- package/dist/distribuicao/lockContextGlobal.js +17 -0
- package/dist/distribuicao/lockGlobal.d.ts +6 -0
- package/dist/distribuicao/lockGlobal.js +520 -0
- package/dist/distribuicao/skillGlobal.d.ts +48 -0
- package/dist/distribuicao/skillGlobal.js +652 -0
- package/dist/distribuicao/skillIntentPolicy.d.ts +21 -0
- package/dist/distribuicao/skillIntentPolicy.js +115 -0
- package/dist/distribuicao/tipos.d.ts +50 -0
- package/dist/distribuicao/tipos.js +10 -0
- package/dist/distribuicao/versaoSemantica.d.ts +3 -0
- package/dist/distribuicao/versaoSemantica.js +62 -0
- package/dist/drift.part01.d.ts +34 -2
- package/dist/drift.part01.js +3 -0
- package/dist/drift.part04.d.ts +12 -2
- package/dist/drift.part04.js +89 -15
- package/dist/drift.part05.d.ts +2 -1
- package/dist/drift.part05.js +9 -6
- package/dist/drift.part06.d.ts +2 -1
- package/dist/drift.part06.js +115 -24
- package/dist/drift.part07.d.ts +11 -10
- package/dist/drift.part07.js +261 -255
- package/dist/drift.part08.d.ts +2 -1
- package/dist/drift.part08.js +35 -25
- package/dist/drift.part11.js +279 -32
- package/dist/drift.part12.d.ts +1 -1
- package/dist/drift.part12.js +196 -11
- package/dist/drift.part13.d.ts +18 -2
- package/dist/drift.part13.js +654 -76
- package/dist/drift.part14.js +21 -7
- package/dist/driftCacheCas.d.ts +43 -0
- package/dist/driftCacheCas.js +351 -0
- package/dist/driftCacheFilesystem.d.ts +64 -0
- package/dist/driftCacheFilesystem.js +313 -0
- package/dist/driftCacheModes.d.ts +38 -0
- package/dist/driftCacheModes.js +147 -0
- package/dist/driftCacheStore.d.ts +80 -0
- package/dist/driftCacheStore.js +603 -0
- package/dist/driftCatalogo.d.ts +65 -0
- package/dist/driftCatalogo.js +516 -0
- package/dist/driftEscopo.d.ts +21 -0
- package/dist/driftEscopo.js +647 -0
- package/dist/driftEscopoReferencias.d.ts +8 -0
- package/dist/driftEscopoReferencias.js +612 -0
- package/dist/driftOrcamento.d.ts +6 -0
- package/dist/driftOrcamento.js +20 -3
- package/dist/geracaoCore.js +4 -6
- package/dist/iaPrompts.d.ts +3 -3
- package/dist/iaPrompts.js +13 -14
- package/dist/index.d.ts +4 -1
- package/dist/index.js +6 -25
- package/dist/index.part01.d.ts +21 -14
- package/dist/index.part01.js +20 -165
- package/dist/index.part02.js +57 -43
- package/dist/index.part03.d.ts +23 -1
- package/dist/index.part03.js +83 -8
- package/dist/index.part04.d.ts +10 -2
- package/dist/index.part04.js +48 -14
- package/dist/index.part05.d.ts +1 -1
- package/dist/index.part05.js +109 -30
- package/dist/index.part06.js +34 -16
- package/dist/index.part07.js +31 -27
- package/dist/index.part08.d.ts +1 -1
- package/dist/index.part08.js +23 -28
- package/dist/init/templates.part01.js +393 -393
- package/dist/init/templates.part02.js +189 -189
- package/dist/initCommand.js +5 -1
- package/dist/initTemplatesBackend.js +73 -73
- package/dist/initTemplatesBase.js +7 -5
- package/dist/initTemplatesFlutter.js +137 -137
- package/dist/initTemplatesRuntime.js +350 -350
- package/dist/initTemplatesWeb.js +309 -309
- package/dist/pipelineConteudo/command.d.ts +1 -0
- package/dist/pipelineConteudo/command.js +4 -32
- package/dist/pipelineConteudo/help.d.ts +2 -0
- package/dist/pipelineConteudo/help.js +33 -0
- package/dist/profileAuthorCommand.js +3 -7
- package/dist/profileCommand.js +3 -7
- package/dist/projeto.d.ts +1 -1
- package/dist/projetoCarregar.d.ts +2 -2
- package/dist/projetoCarregar.js +69 -28
- package/dist/projetoCatalogo.d.ts +8 -0
- package/dist/projetoCatalogo.js +164 -0
- package/dist/projetoOrigens.d.ts +2 -0
- package/dist/projetoOrigens.js +65 -9
- package/dist/projetoTipos.d.ts +15 -5
- package/dist/resultadoCli.d.ts +20 -0
- package/dist/resultadoCli.js +57 -0
- package/dist/saidaCli.d.ts +35 -0
- package/dist/saidaCli.js +118 -0
- package/dist/sistemasInterativos/acceptanceEvidence.d.ts +22 -0
- package/dist/sistemasInterativos/acceptanceEvidence.js +345 -0
- package/dist/sistemasInterativos/engineObservation.d.ts +12 -0
- package/dist/sistemasInterativos/engineObservation.js +438 -0
- package/dist/sistemasInterativos/jobOrchestration.d.ts +2 -0
- package/dist/sistemasInterativos/jobOrchestration.js +204 -0
- package/dist/sistemasInterativos/operationPrimitives.d.ts +21 -0
- package/dist/sistemasInterativos/operationPrimitives.js +194 -0
- package/dist/sistemasInterativos/operations.d.ts +4 -39
- package/dist/sistemasInterativos/operations.js +5 -1164
- package/dist/skillCommand.d.ts +5 -0
- package/dist/skillCommand.js +88 -0
- package/dist/sync/index.js +35 -35
- package/docs/README.md +11 -7
- package/docs/ai-integration.md +18 -11
- package/docs/ai-onboarding.md +81 -62
- package/docs/ai-workflow.md +10 -4
- package/docs/auth.md +26 -26
- package/docs/cli.md +197 -79
- package/docs/commands.md +30 -6
- package/docs/database.md +15 -15
- package/docs/deploy.md +54 -41
- package/docs/documentation.md +11 -10
- package/docs/drift-cache.md +108 -0
- package/docs/env.md +16 -16
- package/docs/frontend.md +41 -41
- package/docs/getting-started.md +82 -57
- package/docs/i18n.md +15 -15
- package/docs/repositories.md +60 -43
- package/docs/rollback.md +38 -31
- package/docs/security.md +54 -32
- package/docs/sistemas-interativos.md +27 -27
- package/docs/support.md +8 -8
- package/docs/testing.md +123 -17
- package/docs/vocabulary.md +29 -29
- package/exemplos/agendamento.sema +1 -1
- package/exemplos/assinatura.sema +1 -1
- package/exemplos/auditoria.sema +1 -1
- package/exemplos/autenticacao.sema +1 -1
- package/exemplos/author_obra_comum.sema +1 -1
- package/exemplos/author_tema_sensivel.sema +1 -1
- package/exemplos/automacao.sema +1 -1
- package/exemplos/cadastro_usuario.sema +1 -1
- package/exemplos/calculadora.sema +1 -1
- package/exemplos/crud_simples.sema +1 -1
- package/exemplos/estoque.sema +1 -1
- package/exemplos/exportacao.sema +1 -1
- package/exemplos/fila.sema +1 -1
- package/exemplos/integracao_externa.sema +1 -1
- package/exemplos/multi_tenant.sema +1 -1
- package/exemplos/notificacao.sema +1 -1
- package/exemplos/operacao_estrategia.sema +132 -132
- package/exemplos/operacao_estrategia_discovery.sema +220 -220
- package/exemplos/operacao_estrategia_fluxo.sema +114 -114
- package/exemplos/operacao_estrategia_gates.sema +106 -106
- package/exemplos/operacao_estrategia_quarentena.sema +133 -133
- package/exemplos/operacao_estrategia_rollout.sema +124 -124
- package/exemplos/pagamento.sema +1 -1
- package/exemplos/pagamento_dominio.sema +1 -1
- package/exemplos/pedido.sema +1 -1
- package/exemplos/permissao.sema +1 -1
- package/exemplos/persistencia_vendor_first.sema +1 -1
- package/exemplos/profile_conversas.sema +165 -165
- package/exemplos/profile_game.sema +1 -1
- package/exemplos/profile_legal.sema +1 -1
- package/exemplos/profile_ops.sema +1 -1
- package/exemplos/profile_research.sema +1 -1
- package/exemplos/profile_software.sema +1 -1
- package/exemplos/profile_workflow_n8n.sema +1 -1
- package/exemplos/relatorio.sema +1 -1
- package/exemplos/replica_analitica_erp.sema +1 -1
- package/exemplos/testes_embutidos.sema +1 -1
- package/exemplos/tratamento_erro.sema +1 -1
- package/exemplos/upload_arquivo.sema +1 -1
- package/exemplos/webhook.sema +1 -1
- package/node_modules/@sema/gerador-cpp/dist/index.js +176 -176
- package/node_modules/@sema/gerador-css/dist/index.part01.js +10 -10
- package/node_modules/@sema/gerador-css/dist/index.part02.js +460 -460
- package/node_modules/@sema/gerador-dotnet/dist/index.js +169 -169
- package/node_modules/@sema/gerador-html/dist/index.js +17 -17
- package/node_modules/@sema/gerador-python/dist/index.part02.js +3 -3
- package/node_modules/@sema/gerador-typescript/dist/index.part02.js +11 -11
- package/node_modules/@sema/nucleo/dist/diagnosticos/melhorador.js +42 -42
- package/node_modules/@sema/nucleo/dist/semantico/analisador.d.ts +1 -0
- package/node_modules/@sema/nucleo/dist/semantico/analisador.js +1 -0
- package/package.json +7 -2
- package/scripts/postinstall.mjs +148 -0
- package/skills/sema/SKILL.md +199 -0
- package/skills/sema/agents/openai.yaml +4 -0
- package/node_modules/@sema/gerador-cpp/dist/index.js.map +0 -1
- package/node_modules/@sema/gerador-css/dist/index.js.map +0 -1
- package/node_modules/@sema/gerador-css/dist/index.part01.js.map +0 -1
- package/node_modules/@sema/gerador-css/dist/index.part02.js.map +0 -1
- package/node_modules/@sema/gerador-dart/dist/index.js.map +0 -1
- package/node_modules/@sema/gerador-dotnet/dist/index.js.map +0 -1
- package/node_modules/@sema/gerador-html/dist/index.js.map +0 -1
- package/node_modules/@sema/gerador-javascript/dist/index.js.map +0 -1
- package/node_modules/@sema/gerador-lua/dist/index.js.map +0 -1
- package/node_modules/@sema/gerador-php/dist/index.js.map +0 -1
- package/node_modules/@sema/gerador-python/dist/index.js.map +0 -1
- package/node_modules/@sema/gerador-python/dist/index.part01.js.map +0 -1
- package/node_modules/@sema/gerador-python/dist/index.part02.js.map +0 -1
- package/node_modules/@sema/gerador-typescript/dist/index.js.map +0 -1
- package/node_modules/@sema/gerador-typescript/dist/index.part01.js.map +0 -1
- package/node_modules/@sema/gerador-typescript/dist/index.part02.js.map +0 -1
- package/node_modules/@sema/gerador-typescript/dist/index.part03.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/ast/tipos.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/diagnosticos/index.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/diagnosticos/melhorador.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/diagnosticos/snippets.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/formatador/index.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/formatador/index.part01.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/formatador/index.part02.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/index.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/ir/conversor.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/ir/conversor.part01.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/ir/conversor.part02.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/ir/conversor.part03.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/ir/modelos.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/lexer/lexer.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/lexer/tokens.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/parser/parser.declaracoes.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/parser/parser.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/parser/parser.modulo.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/parser/parser.part01.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/parser/parser.part02.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/parser/parser.part03.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/persistencia/contratos.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/semantico/analisador.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/semantico/analisador.part01.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/semantico/analisador.part02.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/semantico/analisador.part03.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/semantico/analisador.part04.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/semantico/analisador.part05.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/semantico/analisador.part06.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/semantico/analisador.part07.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/semantico/analisador.part08.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/semantico/estruturas.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/semantico/estruturas.part01.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/semantico/estruturas.part02.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/semantico/orcamentoSemantico.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/semantico/seguranca.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/util/arquivos.js.map +0 -1
- package/node_modules/@sema/padroes/dist/index.js.map +0 -1
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
export { criarAjudaPipelineConteudo } from "./help.js";
|
|
1
2
|
import { HEAD_GENESIS_LEDGER_CONTEUDO } from "./ledger.js";
|
|
2
3
|
export declare function comandoPipelineConteudo(_posicionaisGlobais: string[], args: string[], emJson: boolean): Promise<number>;
|
|
3
4
|
export { HEAD_GENESIS_LEDGER_CONTEUDO };
|
|
@@ -1,8 +1,10 @@
|
|
|
1
|
-
// SEMA-GOVERNED: sema.produto.pipeline_conteudo.cli
|
|
1
|
+
// SEMA-GOVERNED: sema.produto.pipeline_conteudo.cli, sema.produto.cli_invocacao_publica
|
|
2
2
|
// Descrição: CLI declarativa do pipeline de conteúdo; não executa agentes, ferramentas ou publicação.
|
|
3
3
|
import { appendFile, mkdir, readFile, writeFile } from "node:fs/promises";
|
|
4
4
|
import { existsSync, realpathSync } from "node:fs";
|
|
5
5
|
import path from "node:path";
|
|
6
|
+
import { criarAjudaPipelineConteudo } from "./help.js";
|
|
7
|
+
export { criarAjudaPipelineConteudo } from "./help.js";
|
|
6
8
|
import { digestEnvelopeConteudo, hashCanonicoConteudo, } from "./canonical.js";
|
|
7
9
|
import { CAPABILITIES_CONTEUDO_PADRAO, } from "./adapters.js";
|
|
8
10
|
import { anexarEventoLedgerConteudo, HEAD_GENESIS_LEDGER_CONTEUDO, validarLedgerConteudo, validarPayloadEventoConteudo, } from "./ledger.js";
|
|
@@ -35,36 +37,6 @@ const SUBCOMANDOS_CONTEUDO = new Set([
|
|
|
35
37
|
"status",
|
|
36
38
|
"projetar",
|
|
37
39
|
]);
|
|
38
|
-
const USOS_PIPELINE_CONTEUDO = [
|
|
39
|
-
"sema conteudo capabilities --json",
|
|
40
|
-
"sema conteudo validar <definition.json> --json",
|
|
41
|
-
"sema conteudo planejar <definition.json> --alvos-arquivo <targets.json> --json",
|
|
42
|
-
"sema conteudo validar-envelope --envelope-arquivo <envelope.json> --confianca-arquivo <trust.json> --trust-root-digest <sha256:...> --revocation-digest <sha256:...> --payload-type <type> --json",
|
|
43
|
-
"sema conteudo registrar <ledger.ndjson> --envelope-arquivo <envelope.json> --politica-arquivo <policy-envelope.json> --confianca-arquivo <trust.json> --trust-root-digest <sha256:...> --revocation-digest <sha256:...> --ledger-id <id> --expected-head <sha256:...> --json",
|
|
44
|
-
"sema conteudo status <definition.json> --politica-arquivo <policy-envelope.json> --confianca-arquivo <trust.json> --trust-root-digest <sha256:...> --revocation-digest <sha256:...> --ledger-arquivo <ledger.ndjson> --expected-head <sha256:...> --json",
|
|
45
|
-
"sema conteudo projetar <definition.json> --politica-arquivo <policy-envelope.json> --confianca-arquivo <trust.json> --trust-root-digest <sha256:...> --revocation-digest <sha256:...> --ledger-arquivo <ledger.ndjson> --expected-head <sha256:...> --saida <manifest.json> --json",
|
|
46
|
-
];
|
|
47
|
-
function ajudaPipelineConteudo() {
|
|
48
|
-
const mensagem = [
|
|
49
|
-
"Sema Content Pipeline — controle AI-native multicanal e multiformato.",
|
|
50
|
-
"",
|
|
51
|
-
"Uso:",
|
|
52
|
-
...USOS_PIPELINE_CONTEUDO.map((uso) => ` ${uso}`),
|
|
53
|
-
"",
|
|
54
|
-
"O runner é externo e avança somente pelos nextActions derivados pelo Sema.",
|
|
55
|
-
"Evidências entram como envelopes assinados; vereditos e transições não são escritos manualmente.",
|
|
56
|
-
"Não existe revisão humana nativa. Chaves privadas permanecem nos processos signatários independentes.",
|
|
57
|
-
].join("\n");
|
|
58
|
-
return {
|
|
59
|
-
sucesso: true,
|
|
60
|
-
comando: "ajuda",
|
|
61
|
-
mensagem,
|
|
62
|
-
usos: USOS_PIPELINE_CONTEUDO,
|
|
63
|
-
nativeHumanReview: false,
|
|
64
|
-
runner: "external",
|
|
65
|
-
canonicalState: "signed_hash_chained_ledger",
|
|
66
|
-
};
|
|
67
|
-
}
|
|
68
40
|
const CAUSAS_PUBLICAS_CONTEUDO = [
|
|
69
41
|
"expected_head_divergente",
|
|
70
42
|
"trust_root_digest_divergente",
|
|
@@ -401,7 +373,7 @@ export async function comandoPipelineConteudo(_posicionaisGlobais, args, emJson)
|
|
|
401
373
|
let payload;
|
|
402
374
|
switch (subcomando) {
|
|
403
375
|
case "ajuda":
|
|
404
|
-
payload =
|
|
376
|
+
payload = criarAjudaPipelineConteudo();
|
|
405
377
|
break;
|
|
406
378
|
case "capabilities":
|
|
407
379
|
payload = {
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export declare const USOS_PIPELINE_CONTEUDO: readonly ["sema conteudo capabilities --json", "sema conteudo validar <definition.json> --json", "sema conteudo planejar <definition.json> --alvos-arquivo <targets.json> --json", "sema conteudo validar-envelope --envelope-arquivo <envelope.json> --confianca-arquivo <trust.json> --trust-root-digest <sha256:...> --revocation-digest <sha256:...> --payload-type <type> --json", "sema conteudo registrar <ledger.ndjson> --envelope-arquivo <envelope.json> --politica-arquivo <policy-envelope.json> --confianca-arquivo <trust.json> --trust-root-digest <sha256:...> --revocation-digest <sha256:...> --ledger-id <id> --expected-head <sha256:...> --json", "sema conteudo status <definition.json> --politica-arquivo <policy-envelope.json> --confianca-arquivo <trust.json> --trust-root-digest <sha256:...> --revocation-digest <sha256:...> --ledger-arquivo <ledger.ndjson> --expected-head <sha256:...> --json", "sema conteudo projetar <definition.json> --politica-arquivo <policy-envelope.json> --confianca-arquivo <trust.json> --trust-root-digest <sha256:...> --revocation-digest <sha256:...> --ledger-arquivo <ledger.ndjson> --expected-head <sha256:...> --saida <manifest.json> --json"];
|
|
2
|
+
export declare function criarAjudaPipelineConteudo(): Record<string, unknown>;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
// SEMA-GOVERNED: sema.produto.pipeline_conteudo.cli, sema.produto.cli_invocacao_publica
|
|
2
|
+
// Descrição: renderiza a ajuda pública do pipeline de conteúdo sem carregar o runtime operacional.
|
|
3
|
+
export const USOS_PIPELINE_CONTEUDO = [
|
|
4
|
+
"sema conteudo capabilities --json",
|
|
5
|
+
"sema conteudo validar <definition.json> --json",
|
|
6
|
+
"sema conteudo planejar <definition.json> --alvos-arquivo <targets.json> --json",
|
|
7
|
+
"sema conteudo validar-envelope --envelope-arquivo <envelope.json> --confianca-arquivo <trust.json> --trust-root-digest <sha256:...> --revocation-digest <sha256:...> --payload-type <type> --json",
|
|
8
|
+
"sema conteudo registrar <ledger.ndjson> --envelope-arquivo <envelope.json> --politica-arquivo <policy-envelope.json> --confianca-arquivo <trust.json> --trust-root-digest <sha256:...> --revocation-digest <sha256:...> --ledger-id <id> --expected-head <sha256:...> --json",
|
|
9
|
+
"sema conteudo status <definition.json> --politica-arquivo <policy-envelope.json> --confianca-arquivo <trust.json> --trust-root-digest <sha256:...> --revocation-digest <sha256:...> --ledger-arquivo <ledger.ndjson> --expected-head <sha256:...> --json",
|
|
10
|
+
"sema conteudo projetar <definition.json> --politica-arquivo <policy-envelope.json> --confianca-arquivo <trust.json> --trust-root-digest <sha256:...> --revocation-digest <sha256:...> --ledger-arquivo <ledger.ndjson> --expected-head <sha256:...> --saida <manifest.json> --json",
|
|
11
|
+
];
|
|
12
|
+
export function criarAjudaPipelineConteudo() {
|
|
13
|
+
const mensagem = [
|
|
14
|
+
"Sema Content Pipeline — controle AI-native multicanal e multiformato.",
|
|
15
|
+
"",
|
|
16
|
+
"Uso:",
|
|
17
|
+
...USOS_PIPELINE_CONTEUDO.map((uso) => ` ${uso}`),
|
|
18
|
+
"",
|
|
19
|
+
"O runner é externo e avança somente pelos nextActions derivados pelo Sema.",
|
|
20
|
+
"Evidências entram como envelopes assinados; vereditos e transições não são escritos manualmente.",
|
|
21
|
+
"Não existe revisão humana nativa. Chaves privadas permanecem nos processos signatários independentes.",
|
|
22
|
+
].join("\n");
|
|
23
|
+
return {
|
|
24
|
+
sucesso: true,
|
|
25
|
+
comando: "ajuda",
|
|
26
|
+
mensagem,
|
|
27
|
+
usos: USOS_PIPELINE_CONTEUDO,
|
|
28
|
+
nativeHumanReview: false,
|
|
29
|
+
runner: "external",
|
|
30
|
+
canonicalState: "signed_hash_chained_ledger",
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=help.js.map
|
|
@@ -1,9 +1,5 @@
|
|
|
1
|
-
// SEMA-GOVERNED: sema.governanca_ia_contexto
|
|
2
|
-
//
|
|
3
|
-
// SEMA-GOVERNED
|
|
4
|
-
// M?dulo: sema.produto.orcamento_semantico
|
|
5
|
-
// Contrato: contratos/sema/orcamento_semantico.sema
|
|
6
|
-
// Descricao: comandos de profiles semanticos e Author, com gates de score e decis?o de agente.
|
|
1
|
+
// SEMA-GOVERNED: sema.governanca_ia_contexto, sema.produto.governanca_ia.drift.cache.modos
|
|
2
|
+
// Descrição: comando Author com próximos passos explícitos de drift fresh.
|
|
7
3
|
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
8
4
|
import path from "node:path";
|
|
9
5
|
import { formatarDiagnosticos, temErros } from "@sema/nucleo";
|
|
@@ -123,7 +119,7 @@ export async function criarAuthorBriefing(entrada, preset = null) {
|
|
|
123
119
|
"sema author validar-narrativa <arquivo> --texto <texto> --json",
|
|
124
120
|
"sema author validar-proibicoes <arquivo> --texto <texto> --json",
|
|
125
121
|
"sema validar <arquivo> --json",
|
|
126
|
-
"sema drift <arquivo> --json",
|
|
122
|
+
"sema drift <arquivo> --cache fresh --json",
|
|
127
123
|
],
|
|
128
124
|
diagnosticos: escolhido.resultado.diagnosticos,
|
|
129
125
|
};
|
package/dist/profileCommand.js
CHANGED
|
@@ -1,9 +1,5 @@
|
|
|
1
|
-
// SEMA-GOVERNED: sema.
|
|
2
|
-
//
|
|
3
|
-
// SEMA-GOVERNED
|
|
4
|
-
// M?dulo: sema.produto.orcamento_semantico
|
|
5
|
-
// Contrato: contratos/sema/orcamento_semantico.sema
|
|
6
|
-
// Descricao: comando profile da CLI e renderiza??o de valida??o sem?ntica por profile.
|
|
1
|
+
// SEMA-GOVERNED: sema.produto.orquestracao_profiles, sema.produto.governanca_ia.drift.cache.modos
|
|
2
|
+
// Descrição: comando de profiles com fechamento explícito por drift fresh.
|
|
7
3
|
import { readFile } from "node:fs/promises";
|
|
8
4
|
import path from "node:path";
|
|
9
5
|
import { temErros } from "@sema/nucleo";
|
|
@@ -98,7 +94,7 @@ export async function validarProfileSemantico(entrada, profile, opcoes) {
|
|
|
98
94
|
checks: [
|
|
99
95
|
`sema profile validar ${profile} <arquivo> --preset ${preset ?? "<opcional>"} --artefato-arquivo <artefato> --json`,
|
|
100
96
|
"sema validar <arquivo> --json",
|
|
101
|
-
"sema drift <arquivo> --escopo modulo --json",
|
|
97
|
+
"sema drift <arquivo> --escopo modulo --cache fresh --json",
|
|
102
98
|
"sema contexto-ia <arquivo>",
|
|
103
99
|
],
|
|
104
100
|
diagnosticos: escolhido.resultado.diagnosticos,
|
package/dist/projeto.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export type { ConfiguracaoPersistenciaProjeto, ConfiguracaoProjetoCarregada, ContextoProjetoCarregado, SemaConfigProjeto, } from './projetoTipos.js';
|
|
1
|
+
export type { ConfiguracaoPersistenciaProjeto, ConfiguracaoProjetoCarregada, ContextoProjetoCarregado, EscopoCarregamentoProjeto, ModuloProjetoCarregado, OpcoesCarregarProjeto, SemaConfigProjeto, } from './projetoTipos.js';
|
|
2
2
|
export { carregarConfiguracaoProjeto, localizarConfiguracaoProjeto, normalizarEstruturaSaida, normalizarFrameworkGeracao, } from './projetoConfig.js';
|
|
3
3
|
export { carregarProjeto } from './projetoCarregar.js';
|
|
4
4
|
export { resolverAlvoPadrao, resolverAlvosVerificacao, resolverEstruturaSaidaPadrao, resolverFrameworkPadrao, resolverSaidaPadrao, } from './projetoResolucao.js';
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import type { ContextoProjetoCarregado } from './projetoTipos.js';
|
|
2
|
-
export declare function carregarProjeto(entrada: string | undefined, cwd: string): Promise<ContextoProjetoCarregado>;
|
|
1
|
+
import type { ContextoProjetoCarregado, OpcoesCarregarProjeto } from './projetoTipos.js';
|
|
2
|
+
export declare function carregarProjeto(entrada: string | undefined, cwd: string, opcoes?: OpcoesCarregarProjeto): Promise<ContextoProjetoCarregado>;
|
package/dist/projetoCarregar.js
CHANGED
|
@@ -1,50 +1,91 @@
|
|
|
1
|
-
// SEMA-GOVERNED: sema.produto.governanca_ia.contexto
|
|
2
|
-
// Descrição: orquestra leitura de contratos,
|
|
1
|
+
// SEMA-GOVERNED: sema.produto.governanca_ia.contexto, sema.produto.governanca_ia.drift.cache.modos
|
|
2
|
+
// Descrição: orquestra leitura de contratos, compilação e seleção de módulos do projeto.
|
|
3
3
|
import { stat } from 'node:fs/promises';
|
|
4
4
|
import path from 'node:path';
|
|
5
|
-
import { compilarProjeto,
|
|
6
|
-
import {
|
|
5
|
+
import { compilarProjeto, listarArquivosSema } from '@sema/nucleo';
|
|
6
|
+
import { canonicalizarContratosNoProjeto, carregarFechamentoContratosSema, carregarFontesContratos, } from './projetoCatalogo.js';
|
|
7
|
+
import { carregarConfiguracaoProjeto, normalizarFonteLegado, normalizarModoAdocao } from './projetoConfig.js';
|
|
7
8
|
import { inferirFontesLegado } from './projetoLegado.js';
|
|
8
|
-
import { inferirDiretoriosCodigo, listarArquivosDeOrigens, resolverBaseProjeto, resolverEntradaPadrao, resolverOrigensProjeto, } from './projetoOrigens.js';
|
|
9
|
-
|
|
9
|
+
import { inferirDiretoriosCodigo, listarArquivosDeOrigens, resolverBaseProjeto, resolverDiretoriosCodigoConfigurados, resolverEntradaPadrao, resolverOrigensProjeto, resolverRaizesLogicasCodigoSemCaminhada, } from './projetoOrigens.js';
|
|
10
|
+
async function resolverDiretoriosCodigoSemCaminhada(baseProjeto, configCarregada) {
|
|
11
|
+
const declarados = await resolverDiretoriosCodigoConfigurados(baseProjeto, configCarregada);
|
|
12
|
+
return declarados.length > 0
|
|
13
|
+
? declarados
|
|
14
|
+
: resolverRaizesLogicasCodigoSemCaminhada(baseProjeto);
|
|
15
|
+
}
|
|
16
|
+
function resolverFontesLegadoDeclaradas(configCarregada) {
|
|
17
|
+
return [...new Set((configCarregada?.config.fontesLegado ?? [])
|
|
18
|
+
.map((fonte) => normalizarFonteLegado(fonte))
|
|
19
|
+
.filter((fonte) => Boolean(fonte)))]
|
|
20
|
+
.sort((a, b) => a.localeCompare(b, "pt-BR"));
|
|
21
|
+
}
|
|
22
|
+
export async function carregarProjeto(entrada, cwd, opcoes = {}) {
|
|
10
23
|
const entradaBase = entrada ? path.resolve(cwd, entrada) : cwd;
|
|
11
24
|
const configCarregada = await carregarConfiguracaoProjeto(entradaBase);
|
|
12
25
|
const entradaResolvida = entrada ? path.resolve(cwd, entrada) : await resolverEntradaPadrao(cwd, configCarregada);
|
|
13
26
|
const baseProjeto = await resolverBaseProjeto(entradaResolvida, configCarregada);
|
|
14
27
|
const infoEntrada = await stat(entradaResolvida);
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
const diretoriosCodigo = await inferirDiretoriosCodigo(baseProjeto, configCarregada);
|
|
18
|
-
const fontesLegado = await inferirFontesLegado(diretoriosCodigo, baseProjeto, configCarregada);
|
|
19
|
-
const modoAdocao = normalizarModoAdocao(configCarregada?.config.modoAdocao);
|
|
20
|
-
const arquivosSelecionados = infoEntrada.isFile()
|
|
21
|
-
? new Set([path.resolve(entradaResolvida)])
|
|
22
|
-
: new Set((configCarregada && path.resolve(entradaResolvida) === path.resolve(configCarregada.baseDiretorio)
|
|
23
|
-
? arquivosProjeto
|
|
24
|
-
: await listarArquivosSema(entradaResolvida)).map((arquivo) => path.resolve(arquivo)));
|
|
25
|
-
const fontes = [];
|
|
26
|
-
for (const arquivo of arquivosProjeto) {
|
|
27
|
-
const codigo = await lerArquivoTexto(arquivo);
|
|
28
|
-
fontes.push({ caminho: arquivo, codigo });
|
|
28
|
+
if (infoEntrada.isFile() && path.extname(entradaResolvida).toLowerCase() !== ".sema") {
|
|
29
|
+
throw new Error(`Entrada de contrato precisa terminar em .sema: ${entradaResolvida}`);
|
|
29
30
|
}
|
|
31
|
+
const escopo = opcoes.escopo ?? (infoEntrada.isFile() ? "modulo" : "projeto");
|
|
32
|
+
const carregarProjetoCompleto = !infoEntrada.isFile() || escopo === "projeto";
|
|
33
|
+
const origensBase = infoEntrada.isFile()
|
|
34
|
+
? await resolverOrigensProjeto(baseProjeto, baseProjeto, configCarregada)
|
|
35
|
+
: await resolverOrigensProjeto(baseProjeto, entradaResolvida, configCarregada);
|
|
36
|
+
const origensProjeto = [...new Set([
|
|
37
|
+
...origensBase,
|
|
38
|
+
...(infoEntrada.isFile() ? [path.dirname(entradaResolvida)] : []),
|
|
39
|
+
].map((origem) => path.resolve(origem)))]
|
|
40
|
+
.sort((a, b) => a.localeCompare(b, "pt-BR"));
|
|
41
|
+
const arquivosDescobertosSet = new Set(await listarArquivosDeOrigens(origensProjeto));
|
|
42
|
+
if (infoEntrada.isFile()) {
|
|
43
|
+
arquivosDescobertosSet.add(path.resolve(entradaResolvida));
|
|
44
|
+
}
|
|
45
|
+
const arquivosDescobertos = await canonicalizarContratosNoProjeto(baseProjeto, [...arquivosDescobertosSet]);
|
|
46
|
+
const entradaContrato = infoEntrada.isFile()
|
|
47
|
+
? (await canonicalizarContratosNoProjeto(baseProjeto, [entradaResolvida]))[0]
|
|
48
|
+
: undefined;
|
|
49
|
+
// Escopos estreitos recebem apenas raizes logicas declaradas (ou a raiz local)
|
|
50
|
+
// para que o planner decida o que pode ser tocado antes de qualquer caminhada.
|
|
51
|
+
const adiarDescobertaCodigo = opcoes.adiarDescobertaCodigo === true;
|
|
52
|
+
const diretoriosCodigo = adiarDescobertaCodigo
|
|
53
|
+
? await resolverDiretoriosCodigoSemCaminhada(baseProjeto, configCarregada)
|
|
54
|
+
: await inferirDiretoriosCodigo(baseProjeto, configCarregada);
|
|
55
|
+
const fontesLegado = adiarDescobertaCodigo
|
|
56
|
+
? resolverFontesLegadoDeclaradas(configCarregada)
|
|
57
|
+
: await inferirFontesLegado(diretoriosCodigo, baseProjeto, configCarregada);
|
|
58
|
+
const modoAdocao = normalizarModoAdocao(configCarregada?.config.modoAdocao);
|
|
59
|
+
const arquivosSelecionados = carregarProjetoCompleto && escopo === "projeto"
|
|
60
|
+
? new Set(arquivosDescobertos.map((arquivo) => path.resolve(arquivo)))
|
|
61
|
+
: infoEntrada.isFile()
|
|
62
|
+
? new Set([entradaContrato])
|
|
63
|
+
: new Set((configCarregada && path.resolve(entradaResolvida) === path.resolve(configCarregada.baseDiretorio)
|
|
64
|
+
? arquivosDescobertos
|
|
65
|
+
: await listarArquivosSema(entradaResolvida)).map((arquivo) => path.resolve(arquivo)));
|
|
66
|
+
const fontes = carregarProjetoCompleto
|
|
67
|
+
? await carregarFontesContratos(arquivosDescobertos)
|
|
68
|
+
: (await carregarFechamentoContratosSema([entradaContrato], arquivosDescobertos)).fontes;
|
|
30
69
|
const resultadoProjeto = compilarProjeto(fontes);
|
|
31
70
|
const resultados = new Map(resultadoProjeto.modulos.map((modulo) => [path.resolve(modulo.caminho), modulo]));
|
|
71
|
+
const modulosCarregados = fontes.map((fonte) => ({
|
|
72
|
+
caminho: fonte.caminho,
|
|
73
|
+
codigo: fonte.codigo,
|
|
74
|
+
resultado: resultados.get(path.resolve(fonte.caminho)),
|
|
75
|
+
}));
|
|
32
76
|
return {
|
|
33
77
|
entradaResolvida,
|
|
34
78
|
baseProjeto,
|
|
35
79
|
configCarregada,
|
|
36
|
-
arquivosProjeto,
|
|
80
|
+
arquivosProjeto: fontes.map((fonte) => fonte.caminho),
|
|
81
|
+
arquivosDescobertos,
|
|
37
82
|
origensProjeto,
|
|
38
83
|
diretoriosCodigo,
|
|
39
84
|
fontesLegado,
|
|
40
85
|
modoAdocao,
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
.
|
|
44
|
-
caminho: fonte.caminho,
|
|
45
|
-
codigo: fonte.codigo,
|
|
46
|
-
resultado: resultados.get(path.resolve(fonte.caminho)),
|
|
47
|
-
})),
|
|
86
|
+
modulosCarregados,
|
|
87
|
+
modulosSelecionados: modulosCarregados
|
|
88
|
+
.filter((modulo) => arquivosSelecionados.has(path.resolve(modulo.caminho))),
|
|
48
89
|
};
|
|
49
90
|
}
|
|
50
91
|
//# sourceMappingURL=projetoCarregar.js.map
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type FonteProjeto } from "@sema/nucleo";
|
|
2
|
+
export interface FechamentoContratosSema {
|
|
3
|
+
fontes: FonteProjeto[];
|
|
4
|
+
dependenciasNaoResolvidas: string[];
|
|
5
|
+
}
|
|
6
|
+
export declare function canonicalizarContratosNoProjeto(baseProjeto: string, arquivos: string[]): Promise<string[]>;
|
|
7
|
+
export declare function carregarFontesContratos(arquivos: string[]): Promise<FonteProjeto[]>;
|
|
8
|
+
export declare function carregarFechamentoContratosSema(arquivosAlvo: string[], arquivosDescobertos: string[]): Promise<FechamentoContratosSema>;
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
// SEMA-GOVERNED: sema.produto.governanca_ia.contexto
|
|
2
|
+
// Descricao: descobre contratos por caminho e carrega apenas o fechamento transitivo de uses do alvo.
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { realpath } from "node:fs/promises";
|
|
5
|
+
import { listarCandidatosUseRelativo, lerArquivoTexto, parsear, tokenizar, } from "@sema/nucleo";
|
|
6
|
+
function caminhoEstaContido(base, alvo) {
|
|
7
|
+
const relativo = path.relative(base, alvo);
|
|
8
|
+
return relativo === "" || (relativo !== ".."
|
|
9
|
+
&& !relativo.startsWith(`..${path.sep}`)
|
|
10
|
+
&& !path.isAbsolute(relativo));
|
|
11
|
+
}
|
|
12
|
+
function chaveCaminhoReal(caminho) {
|
|
13
|
+
return process.platform === "win32" ? caminho.toLocaleLowerCase("en-US") : caminho;
|
|
14
|
+
}
|
|
15
|
+
export async function canonicalizarContratosNoProjeto(baseProjeto, arquivos) {
|
|
16
|
+
const baseReal = await realpath(path.resolve(baseProjeto));
|
|
17
|
+
const canonicos = new Map();
|
|
18
|
+
for (const arquivo of arquivos) {
|
|
19
|
+
const caminhoReal = await realpath(path.resolve(arquivo));
|
|
20
|
+
if (!caminhoEstaContido(baseReal, caminhoReal)) {
|
|
21
|
+
throw new Error(`Contrato resolve fora da base do projeto: ${arquivo}`);
|
|
22
|
+
}
|
|
23
|
+
if (path.extname(caminhoReal).toLowerCase() !== ".sema") {
|
|
24
|
+
throw new Error(`Entrada de contrato precisa terminar em .sema: ${arquivo}`);
|
|
25
|
+
}
|
|
26
|
+
canonicos.set(chaveCaminhoReal(caminhoReal), caminhoReal);
|
|
27
|
+
}
|
|
28
|
+
return [...canonicos.values()].sort((a, b) => a.localeCompare(b, "pt-BR"));
|
|
29
|
+
}
|
|
30
|
+
function normalizarChaveArquivo(valor) {
|
|
31
|
+
return valor
|
|
32
|
+
.normalize("NFD")
|
|
33
|
+
.replace(/[\u0300-\u036f]/g, "")
|
|
34
|
+
.toLowerCase()
|
|
35
|
+
.replace(/[^a-z0-9]+/g, "_")
|
|
36
|
+
.replace(/^_+|_+$/g, "");
|
|
37
|
+
}
|
|
38
|
+
function chavesSufixoModulo(nomeModulo) {
|
|
39
|
+
const partes = nomeModulo.split(".").map(normalizarChaveArquivo).filter(Boolean);
|
|
40
|
+
return partes.map((_, indice) => partes.slice(indice).join("_"));
|
|
41
|
+
}
|
|
42
|
+
function criarIndiceSufixos(arquivos) {
|
|
43
|
+
const indice = new Map();
|
|
44
|
+
for (const arquivo of arquivos) {
|
|
45
|
+
const chave = normalizarChaveArquivo(path.basename(arquivo, path.extname(arquivo)));
|
|
46
|
+
const atuais = indice.get(chave) ?? [];
|
|
47
|
+
atuais.push(path.resolve(arquivo));
|
|
48
|
+
indice.set(chave, atuais);
|
|
49
|
+
}
|
|
50
|
+
for (const caminhos of indice.values()) {
|
|
51
|
+
caminhos.sort((a, b) => a.localeCompare(b, "pt-BR"));
|
|
52
|
+
}
|
|
53
|
+
return indice;
|
|
54
|
+
}
|
|
55
|
+
export async function carregarFontesContratos(arquivos) {
|
|
56
|
+
const fontes = [];
|
|
57
|
+
for (const arquivo of arquivos) {
|
|
58
|
+
const caminho = path.resolve(arquivo);
|
|
59
|
+
fontes.push({ caminho, codigo: await lerArquivoTexto(caminho) });
|
|
60
|
+
}
|
|
61
|
+
return fontes;
|
|
62
|
+
}
|
|
63
|
+
export async function carregarFechamentoContratosSema(arquivosAlvo, arquivosDescobertos) {
|
|
64
|
+
const descobertos = [...new Set(arquivosDescobertos.map((arquivo) => path.resolve(arquivo)))]
|
|
65
|
+
.sort((a, b) => a.localeCompare(b, "pt-BR"));
|
|
66
|
+
const indiceSufixos = criarIndiceSufixos(descobertos);
|
|
67
|
+
const leituras = new Map();
|
|
68
|
+
const caminhosPorModulo = new Map();
|
|
69
|
+
const lerContrato = (arquivo) => {
|
|
70
|
+
const caminho = path.resolve(arquivo);
|
|
71
|
+
const existente = leituras.get(caminho);
|
|
72
|
+
if (existente) {
|
|
73
|
+
return existente;
|
|
74
|
+
}
|
|
75
|
+
const leitura = (async () => {
|
|
76
|
+
const codigo = await lerArquivoTexto(caminho);
|
|
77
|
+
const resultadoLexer = tokenizar(codigo, caminho);
|
|
78
|
+
const resultadoParser = parsear(resultadoLexer.tokens);
|
|
79
|
+
if (resultadoParser.modulo) {
|
|
80
|
+
const caminhos = caminhosPorModulo.get(resultadoParser.modulo.nome) ?? new Set();
|
|
81
|
+
caminhos.add(caminho);
|
|
82
|
+
caminhosPorModulo.set(resultadoParser.modulo.nome, caminhos);
|
|
83
|
+
}
|
|
84
|
+
return {
|
|
85
|
+
fonte: { caminho, codigo },
|
|
86
|
+
modulo: resultadoParser.modulo,
|
|
87
|
+
};
|
|
88
|
+
})();
|
|
89
|
+
leituras.set(caminho, leitura);
|
|
90
|
+
return leitura;
|
|
91
|
+
};
|
|
92
|
+
const resolverArquivoModulo = async (nomeModulo, moduloAtual) => {
|
|
93
|
+
const nomesCandidatos = [
|
|
94
|
+
nomeModulo,
|
|
95
|
+
...listarCandidatosUseRelativo(moduloAtual, nomeModulo),
|
|
96
|
+
];
|
|
97
|
+
for (const nomeCandidato of nomesCandidatos) {
|
|
98
|
+
const tentados = new Set();
|
|
99
|
+
const encontrados = new Set(caminhosPorModulo.get(nomeCandidato) ?? []);
|
|
100
|
+
for (const chave of chavesSufixoModulo(nomeCandidato)) {
|
|
101
|
+
for (const candidato of indiceSufixos.get(chave) ?? []) {
|
|
102
|
+
tentados.add(candidato);
|
|
103
|
+
const contrato = await lerContrato(candidato);
|
|
104
|
+
if (contrato.modulo?.nome === nomeCandidato) {
|
|
105
|
+
encontrados.add(candidato);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// Fallback raro para workspaces que nao seguem a convencao modulo -> nome do arquivo.
|
|
110
|
+
// Ele so acontece quando o indice deterministico nao encontrou o modulo desta prioridade.
|
|
111
|
+
if (encontrados.size === 0) {
|
|
112
|
+
for (const candidato of descobertos) {
|
|
113
|
+
if (tentados.has(candidato)) {
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
const contrato = await lerContrato(candidato);
|
|
117
|
+
if (contrato.modulo?.nome === nomeCandidato) {
|
|
118
|
+
encontrados.add(candidato);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
if (encontrados.size > 1) {
|
|
123
|
+
const caminhos = [...encontrados].sort((a, b) => a.localeCompare(b, "pt-BR"));
|
|
124
|
+
throw new Error(`Modulo Sema ambiguo "${nomeCandidato}" em: ${caminhos.join(", ")}`);
|
|
125
|
+
}
|
|
126
|
+
if (encontrados.size === 1) {
|
|
127
|
+
return [...encontrados][0];
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return undefined;
|
|
131
|
+
};
|
|
132
|
+
const fila = arquivosAlvo.map((arquivo) => path.resolve(arquivo));
|
|
133
|
+
const carregados = new Set();
|
|
134
|
+
const fontes = [];
|
|
135
|
+
const dependenciasNaoResolvidas = new Set();
|
|
136
|
+
while (fila.length > 0) {
|
|
137
|
+
const arquivo = fila.shift();
|
|
138
|
+
if (carregados.has(arquivo)) {
|
|
139
|
+
continue;
|
|
140
|
+
}
|
|
141
|
+
carregados.add(arquivo);
|
|
142
|
+
const contrato = await lerContrato(arquivo);
|
|
143
|
+
fontes.push(contrato.fonte);
|
|
144
|
+
const usesSema = contrato.modulo?.uses
|
|
145
|
+
.filter((use) => use.origem === "sema")
|
|
146
|
+
.map((use) => use.caminho) ?? [];
|
|
147
|
+
for (const use of usesSema) {
|
|
148
|
+
const dependencia = await resolverArquivoModulo(use, contrato.modulo.nome);
|
|
149
|
+
if (!dependencia) {
|
|
150
|
+
dependenciasNaoResolvidas.add(use);
|
|
151
|
+
continue;
|
|
152
|
+
}
|
|
153
|
+
if (!carregados.has(dependencia)) {
|
|
154
|
+
fila.push(dependencia);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
return {
|
|
159
|
+
fontes,
|
|
160
|
+
dependenciasNaoResolvidas: [...dependenciasNaoResolvidas]
|
|
161
|
+
.sort((a, b) => a.localeCompare(b, "pt-BR")),
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=projetoCatalogo.js.map
|
package/dist/projetoOrigens.d.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import type { ConfiguracaoProjetoCarregada } from './projetoTipos.js';
|
|
2
|
+
export declare function resolverRaizesLogicasCodigoSemCaminhada(baseProjeto: string): string[];
|
|
3
|
+
export declare function resolverDiretoriosCodigoConfigurados(baseProjeto: string, configCarregada?: ConfiguracaoProjetoCarregada): Promise<string[]>;
|
|
2
4
|
export declare function resolverEntradaPadrao(cwd: string, configCarregada?: ConfiguracaoProjetoCarregada): Promise<string>;
|
|
3
5
|
export declare function listarArquivosDeOrigens(origens: string[]): Promise<string[]>;
|
|
4
6
|
export declare function resolverBaseProjeto(entradaResolvida: string, configCarregada?: ConfiguracaoProjetoCarregada): Promise<string>;
|
package/dist/projetoOrigens.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// SEMA-GOVERNED: sema.produto.governanca_ia.contexto
|
|
2
2
|
// Descrição: resolve base, origens de contratos e diret?rios de c?digo do projeto.
|
|
3
|
-
import { readdir, stat } from 'node:fs/promises';
|
|
3
|
+
import { readdir, realpath, stat } from 'node:fs/promises';
|
|
4
4
|
import path from 'node:path';
|
|
5
5
|
import { listarArquivosSema } from '@sema/nucleo';
|
|
6
6
|
import { caminhoExiste, DIRETORIOS_CODIGO_IGNORADOS, EXTENSOES_CODIGO, listarDiretoriosFilhos, } from './projetoBusca.js';
|
|
@@ -10,7 +10,12 @@ const DIRETORIOS_CODIGO_FIXOS = [
|
|
|
10
10
|
"app",
|
|
11
11
|
"apps",
|
|
12
12
|
"backend",
|
|
13
|
+
"frontend",
|
|
14
|
+
"client",
|
|
15
|
+
"web",
|
|
13
16
|
"lib",
|
|
17
|
+
"packages",
|
|
18
|
+
"pacotes",
|
|
14
19
|
"api",
|
|
15
20
|
"server",
|
|
16
21
|
"services",
|
|
@@ -21,6 +26,59 @@ const DIRETORIOS_CODIGO_FIXOS = [
|
|
|
21
26
|
"functions",
|
|
22
27
|
"scripts",
|
|
23
28
|
];
|
|
29
|
+
export function resolverRaizesLogicasCodigoSemCaminhada(baseProjeto) {
|
|
30
|
+
return [path.resolve(baseProjeto), ...DIRETORIOS_CODIGO_FIXOS
|
|
31
|
+
.map((segmento) => path.resolve(baseProjeto, segmento))];
|
|
32
|
+
}
|
|
33
|
+
function caminhoEstaDentro(raiz, alvo) {
|
|
34
|
+
const relativo = path.relative(path.resolve(raiz), path.resolve(alvo));
|
|
35
|
+
return relativo === "" || (relativo !== ".."
|
|
36
|
+
&& !relativo.startsWith(`..${path.sep}`)
|
|
37
|
+
&& !path.isAbsolute(relativo));
|
|
38
|
+
}
|
|
39
|
+
function erroEhAusencia(erro) {
|
|
40
|
+
return ["ENOENT", "ENOTDIR"].includes(erro.code ?? "");
|
|
41
|
+
}
|
|
42
|
+
async function resolverDiretoriosConfiguradosConfinados(baseProjeto, baseConfiguracao, declarados, campo) {
|
|
43
|
+
const baseLogica = path.resolve(baseProjeto);
|
|
44
|
+
const baseReal = await realpath(baseLogica);
|
|
45
|
+
const resolvidos = new Map();
|
|
46
|
+
for (const [indice, declarado] of declarados.entries()) {
|
|
47
|
+
const identificadorSeguro = `${campo}[${indice}]`;
|
|
48
|
+
const absoluto = path.resolve(baseConfiguracao, declarado);
|
|
49
|
+
if (!caminhoEstaDentro(baseLogica, absoluto)) {
|
|
50
|
+
throw new Error(`${identificadorSeguro} aponta para fora da base do projeto`);
|
|
51
|
+
}
|
|
52
|
+
let canonico = absoluto;
|
|
53
|
+
try {
|
|
54
|
+
const [real, informacao] = await Promise.all([realpath(absoluto), stat(absoluto)]);
|
|
55
|
+
if (!informacao.isDirectory()) {
|
|
56
|
+
throw new Error(`${identificadorSeguro} nao e diretorio`);
|
|
57
|
+
}
|
|
58
|
+
if (!caminhoEstaDentro(baseReal, real)) {
|
|
59
|
+
throw new Error(`${identificadorSeguro} resolve fora da base do projeto`);
|
|
60
|
+
}
|
|
61
|
+
canonico = real;
|
|
62
|
+
}
|
|
63
|
+
catch (erro) {
|
|
64
|
+
if (!erroEhAusencia(erro)) {
|
|
65
|
+
throw erro;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
const chave = process.platform === "win32" ? canonico.toLowerCase() : canonico;
|
|
69
|
+
if (!resolvidos.has(chave)) {
|
|
70
|
+
resolvidos.set(chave, canonico);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return [...resolvidos.values()].sort((a, b) => a.localeCompare(b, "pt-BR"));
|
|
74
|
+
}
|
|
75
|
+
export async function resolverDiretoriosCodigoConfigurados(baseProjeto, configCarregada) {
|
|
76
|
+
const declarados = configCarregada?.config.diretoriosCodigo ?? [];
|
|
77
|
+
if (declarados.length === 0) {
|
|
78
|
+
return [];
|
|
79
|
+
}
|
|
80
|
+
return resolverDiretoriosConfiguradosConfinados(baseProjeto, configCarregada.baseDiretorio, declarados, "diretoriosCodigo");
|
|
81
|
+
}
|
|
24
82
|
export async function resolverEntradaPadrao(cwd, configCarregada) {
|
|
25
83
|
if (configCarregada) {
|
|
26
84
|
return configCarregada.baseDiretorio;
|
|
@@ -100,18 +158,19 @@ async function descobrirOrigemPadrao(baseProjeto, entradaResolvida) {
|
|
|
100
158
|
}
|
|
101
159
|
export async function resolverOrigensProjeto(baseProjeto, entradaResolvida, configCarregada) {
|
|
102
160
|
if (configCarregada) {
|
|
161
|
+
const confinar = (origens) => resolverDiretoriosConfiguradosConfinados(baseProjeto, configCarregada.baseDiretorio, origens, "origens");
|
|
103
162
|
const infoEntrada = await stat(entradaResolvida);
|
|
104
163
|
if (infoEntrada.isFile()) {
|
|
105
|
-
return [path.
|
|
164
|
+
return confinar([path.dirname(entradaResolvida)]);
|
|
106
165
|
}
|
|
107
166
|
if (path.resolve(entradaResolvida) !== path.resolve(configCarregada.baseDiretorio)) {
|
|
108
|
-
return [
|
|
167
|
+
return confinar([entradaResolvida]);
|
|
109
168
|
}
|
|
110
169
|
const declaradas = configCarregada.config.origens ?? (configCarregada.config.origem ? [configCarregada.config.origem] : []);
|
|
111
170
|
if (declaradas.length > 0) {
|
|
112
|
-
return declaradas
|
|
171
|
+
return confinar(declaradas);
|
|
113
172
|
}
|
|
114
|
-
return [configCarregada.baseDiretorio];
|
|
173
|
+
return confinar([configCarregada.baseDiretorio]);
|
|
115
174
|
}
|
|
116
175
|
const infoEntrada = await stat(entradaResolvida);
|
|
117
176
|
if (infoEntrada.isFile()) {
|
|
@@ -149,10 +208,7 @@ async function diretorioTemArquivosCodigo(diretorioBase, profundidadeMaxima = 4)
|
|
|
149
208
|
}
|
|
150
209
|
export async function inferirDiretoriosCodigo(baseProjeto, configCarregada) {
|
|
151
210
|
if (configCarregada?.config.diretoriosCodigo?.length) {
|
|
152
|
-
return
|
|
153
|
-
.map((diretorio) => path.resolve(configCarregada.baseDiretorio, diretorio))
|
|
154
|
-
.filter(Boolean))]
|
|
155
|
-
.sort((a, b) => a.localeCompare(b, "pt-BR"));
|
|
211
|
+
return resolverDiretoriosCodigoConfigurados(baseProjeto, configCarregada);
|
|
156
212
|
}
|
|
157
213
|
const candidatosFixos = DIRETORIOS_CODIGO_FIXOS
|
|
158
214
|
.map((segmento) => path.join(baseProjeto, segmento));
|
package/dist/projetoTipos.d.ts
CHANGED
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
import type { EngineBanco, ResultadoCompilacaoProjetoModulo } from '@sema/nucleo';
|
|
2
2
|
import type { AlvoGeracao, FrameworkGeracao } from '@sema/padroes';
|
|
3
3
|
import type { EstruturaSaida, FonteLegado, ModoAdocao } from './tipos.js';
|
|
4
|
+
export type EscopoCarregamentoProjeto = "arquivo" | "modulo" | "projeto";
|
|
5
|
+
export interface OpcoesCarregarProjeto {
|
|
6
|
+
escopo?: EscopoCarregamentoProjeto;
|
|
7
|
+
adiarDescobertaCodigo?: boolean;
|
|
8
|
+
}
|
|
4
9
|
export interface ConfiguracaoPersistenciaProjeto {
|
|
5
10
|
enginesHabilitados?: EngineBanco[];
|
|
6
11
|
adaptersPorEngine?: Partial<Record<EngineBanco, string>>;
|
|
@@ -30,18 +35,23 @@ export interface ConfiguracaoProjetoCarregada {
|
|
|
30
35
|
baseDiretorio: string;
|
|
31
36
|
config: SemaConfigProjeto;
|
|
32
37
|
}
|
|
38
|
+
export interface ModuloProjetoCarregado {
|
|
39
|
+
caminho: string;
|
|
40
|
+
codigo: string;
|
|
41
|
+
resultado: ResultadoCompilacaoProjetoModulo;
|
|
42
|
+
}
|
|
33
43
|
export interface ContextoProjetoCarregado {
|
|
34
44
|
entradaResolvida: string;
|
|
35
45
|
baseProjeto: string;
|
|
36
46
|
configCarregada?: ConfiguracaoProjetoCarregada;
|
|
47
|
+
/** Contratos efetivamente lidos e compilados nesta execucao. */
|
|
37
48
|
arquivosProjeto: string[];
|
|
49
|
+
/** Contratos encontrados nas origens, inclusive os que ficaram fora do escopo carregado. */
|
|
50
|
+
arquivosDescobertos: string[];
|
|
38
51
|
origensProjeto: string[];
|
|
39
52
|
diretoriosCodigo: string[];
|
|
40
53
|
fontesLegado: FonteLegado[];
|
|
41
54
|
modoAdocao: ModoAdocao;
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
codigo: string;
|
|
45
|
-
resultado: ResultadoCompilacaoProjetoModulo;
|
|
46
|
-
}>;
|
|
55
|
+
modulosCarregados: ModuloProjetoCarregado[];
|
|
56
|
+
modulosSelecionados: ModuloProjetoCarregado[];
|
|
47
57
|
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export declare const SCHEMA_RESULTADO_CLI_V1: "sema.cli.result/v1";
|
|
2
|
+
export declare const CODIGO_SAIDA_FATAL_RUNTIME_CLI: 70;
|
|
3
|
+
export type TipoResultadoCliV1 = "SUCCESS" | "DOMAIN_ERROR";
|
|
4
|
+
export interface EnvelopeResultadoCliV1 {
|
|
5
|
+
readonly schemaVersion: typeof SCHEMA_RESULTADO_CLI_V1;
|
|
6
|
+
readonly ok: boolean;
|
|
7
|
+
readonly kind: TipoResultadoCliV1;
|
|
8
|
+
readonly command: string;
|
|
9
|
+
readonly code: "CLI_SUCCESS" | "CLI_DOMAIN_ERROR";
|
|
10
|
+
readonly message: string | null;
|
|
11
|
+
readonly exitCode: number;
|
|
12
|
+
readonly payload: unknown;
|
|
13
|
+
}
|
|
14
|
+
export interface EntradaEnvelopeResultadoCliV1 {
|
|
15
|
+
readonly comando: string;
|
|
16
|
+
readonly codigoSaida: number;
|
|
17
|
+
readonly stdout: string;
|
|
18
|
+
}
|
|
19
|
+
export declare function interpretarPayloadRuntimeCli(stdout: string): unknown;
|
|
20
|
+
export declare function criarEnvelopeResultadoCliV1(entrada: EntradaEnvelopeResultadoCliV1): EnvelopeResultadoCliV1;
|