@semacode/cli 2.0.1 → 2.2.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 +141 -121
- package/dist/agentEntryPoints.js +499 -499
- package/dist/comandos.js +2 -0
- package/dist/doctorCommand.js +28 -0
- package/dist/execucoesExternas.js +19 -5
- package/dist/geracaoCore.js +97 -1
- package/dist/iaPrompts.d.ts +1 -1
- package/dist/iaPrompts.js +307 -307
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/index.part01.d.ts +1 -1
- package/dist/index.part01.js +14 -4
- package/dist/index.part02.js +21 -21
- package/dist/index.part04.js +96 -96
- package/dist/index.part06.js +1 -1
- package/dist/index.part07.js +35 -24
- 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 -81
- package/dist/initTemplatesFlutter.js +137 -137
- package/dist/initTemplatesRuntime.js +350 -350
- package/dist/initTemplatesWeb.js +309 -309
- package/dist/nativeToolchains.d.ts +15 -0
- package/dist/nativeToolchains.js +132 -0
- package/dist/pipelineConteudo/adapters.d.ts +84 -0
- package/dist/pipelineConteudo/adapters.js +449 -0
- package/dist/pipelineConteudo/canonical.d.ts +18 -0
- package/dist/pipelineConteudo/canonical.js +107 -0
- package/dist/pipelineConteudo/command.d.ts +3 -0
- package/dist/pipelineConteudo/command.js +572 -0
- package/dist/pipelineConteudo/index.d.ts +9 -0
- package/dist/pipelineConteudo/index.js +12 -0
- package/dist/pipelineConteudo/ledger.d.ts +68 -0
- package/dist/pipelineConteudo/ledger.js +732 -0
- package/dist/pipelineConteudo/planner.d.ts +12 -0
- package/dist/pipelineConteudo/planner.js +366 -0
- package/dist/pipelineConteudo/projection.d.ts +16 -0
- package/dist/pipelineConteudo/projection.js +57 -0
- package/dist/pipelineConteudo/state.d.ts +23 -0
- package/dist/pipelineConteudo/state.js +615 -0
- package/dist/pipelineConteudo/trust.d.ts +17 -0
- package/dist/pipelineConteudo/trust.js +750 -0
- package/dist/pipelineConteudo/types.d.ts +331 -0
- package/dist/pipelineConteudo/types.js +4 -0
- package/dist/projetoConfig.js +7 -1
- package/dist/projetoResolucao.js +21 -6
- package/dist/sync/index.js +35 -35
- package/docs/README.md +28 -25
- package/docs/ai-onboarding.md +62 -62
- package/docs/ai-workflow.md +1 -1
- package/docs/auth.md +26 -26
- package/docs/cli.md +79 -72
- package/docs/commands.md +1 -1
- package/docs/database.md +15 -15
- package/docs/deploy.md +41 -36
- 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 -0
- package/docs/profiles.md +45 -43
- package/docs/repositories.md +43 -43
- package/docs/rollback.md +31 -31
- package/docs/security.md +32 -32
- package/docs/support.md +8 -8
- package/docs/syntax.md +1 -1
- package/docs/testing.md +35 -28
- 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 -0
- package/exemplos/pipeline-conteudo/alvos.json +23 -0
- package/exemplos/pipeline-conteudo/definicao.json +136 -0
- 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.d.ts +3 -0
- package/node_modules/@sema/gerador-cpp/dist/index.js +859 -0
- package/node_modules/@sema/gerador-cpp/dist/index.js.map +1 -0
- package/node_modules/@sema/gerador-cpp/package.json +7 -0
- 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.d.ts +3 -0
- package/node_modules/@sema/gerador-dotnet/dist/index.js +828 -0
- package/node_modules/@sema/gerador-dotnet/dist/index.js.map +1 -0
- package/node_modules/@sema/gerador-dotnet/package.json +7 -0
- package/node_modules/@sema/gerador-html/dist/index.js +17 -17
- package/node_modules/@sema/gerador-lua/dist/index.js +53 -8
- package/node_modules/@sema/gerador-lua/dist/index.js.map +1 -1
- package/node_modules/@sema/gerador-php/dist/index.js +121 -113
- package/node_modules/@sema/gerador-php/dist/index.js.map +1 -1
- 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/padroes/dist/index.d.ts +1 -1
- package/package.json +12 -1
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { type KeyLike } from "node:crypto";
|
|
2
|
+
import type { EnvelopeAssinadoConteudo, EnvelopeAssinavelConteudo } from "./types.js";
|
|
3
|
+
/**
|
|
4
|
+
* Serializa somente o subconjunto JSON, ordenando chaves recursivamente.
|
|
5
|
+
* Valores que JSON descartaria silenciosamente sao rejeitados para evitar
|
|
6
|
+
* assinaturas ambiguas.
|
|
7
|
+
*/
|
|
8
|
+
export declare function canonicalizarJson(valor: unknown): string;
|
|
9
|
+
export declare function digestSha256(conteudo: string | Uint8Array): string;
|
|
10
|
+
export declare function digestJsonCanonico(valor: unknown): string;
|
|
11
|
+
/** Alias de dominio usado por planner, ledger e projecoes. */
|
|
12
|
+
export declare const hashCanonicoConteudo: typeof digestJsonCanonico;
|
|
13
|
+
export declare function dadosAssinaveisEnvelopeConteudo<TPayload>(envelope: EnvelopeAssinavelConteudo<TPayload>): EnvelopeAssinavelConteudo<TPayload>;
|
|
14
|
+
export declare function serializarEnvelopeAssinavelConteudo<TPayload>(envelope: EnvelopeAssinavelConteudo<TPayload>): string;
|
|
15
|
+
/** A chave privada e usada somente nesta chamada e jamais integra o retorno. */
|
|
16
|
+
export declare function assinarEnvelopeConteudo<TPayload>(envelope: EnvelopeAssinavelConteudo<TPayload>, privateKey: KeyLike): EnvelopeAssinadoConteudo<TPayload>;
|
|
17
|
+
export declare function verificarAssinaturaEnvelopeConteudo<TPayload>(envelope: EnvelopeAssinadoConteudo<TPayload>, publicKey: KeyLike): boolean;
|
|
18
|
+
export declare function digestEnvelopeConteudo(envelope: EnvelopeAssinadoConteudo<unknown>): string;
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
// SEMA-GOVERNED: sema.produto.pipeline_conteudo.confianca
|
|
2
|
+
// Descricao: serializacao JSON deterministica, digests SHA-256 e envelopes Ed25519 sem persistir chave privada.
|
|
3
|
+
import { createHash, sign, verify } from "node:crypto";
|
|
4
|
+
function falharCanonico(motivo, _caminho) {
|
|
5
|
+
throw new TypeError(`json_canonico_invalido:${motivo}`);
|
|
6
|
+
}
|
|
7
|
+
function serializarCanonico(valor, caminho, visitados) {
|
|
8
|
+
if (valor === null)
|
|
9
|
+
return "null";
|
|
10
|
+
if (typeof valor === "string" || typeof valor === "boolean") {
|
|
11
|
+
return JSON.stringify(valor);
|
|
12
|
+
}
|
|
13
|
+
if (typeof valor === "number") {
|
|
14
|
+
if (!Number.isFinite(valor))
|
|
15
|
+
falharCanonico("numero_nao_finito", caminho);
|
|
16
|
+
return Object.is(valor, -0) ? "0" : JSON.stringify(valor);
|
|
17
|
+
}
|
|
18
|
+
if (typeof valor !== "object") {
|
|
19
|
+
return falharCanonico(`tipo_${typeof valor}_nao_suportado`, caminho);
|
|
20
|
+
}
|
|
21
|
+
if (visitados.has(valor))
|
|
22
|
+
falharCanonico("referencia_ciclica", caminho);
|
|
23
|
+
visitados.add(valor);
|
|
24
|
+
try {
|
|
25
|
+
if (Array.isArray(valor)) {
|
|
26
|
+
const itens = [];
|
|
27
|
+
for (let indice = 0; indice < valor.length; indice += 1) {
|
|
28
|
+
if (!Object.hasOwn(valor, indice))
|
|
29
|
+
falharCanonico("array_esparso", `${caminho}[${indice}]`);
|
|
30
|
+
itens.push(serializarCanonico(valor[indice], `${caminho}[${indice}]`, visitados));
|
|
31
|
+
}
|
|
32
|
+
return `[${itens.join(",")}]`;
|
|
33
|
+
}
|
|
34
|
+
const prototipo = Object.getPrototypeOf(valor);
|
|
35
|
+
if (prototipo !== Object.prototype && prototipo !== null) {
|
|
36
|
+
return falharCanonico("objeto_nao_plano", caminho);
|
|
37
|
+
}
|
|
38
|
+
const objeto = valor;
|
|
39
|
+
const campos = Object.keys(objeto)
|
|
40
|
+
.sort()
|
|
41
|
+
.map((chave) => `${JSON.stringify(chave)}:${serializarCanonico(objeto[chave], `${caminho}.${chave}`, visitados)}`);
|
|
42
|
+
return `{${campos.join(",")}}`;
|
|
43
|
+
}
|
|
44
|
+
finally {
|
|
45
|
+
visitados.delete(valor);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Serializa somente o subconjunto JSON, ordenando chaves recursivamente.
|
|
50
|
+
* Valores que JSON descartaria silenciosamente sao rejeitados para evitar
|
|
51
|
+
* assinaturas ambiguas.
|
|
52
|
+
*/
|
|
53
|
+
export function canonicalizarJson(valor) {
|
|
54
|
+
return serializarCanonico(valor, "$", new Set());
|
|
55
|
+
}
|
|
56
|
+
export function digestSha256(conteudo) {
|
|
57
|
+
return `sha256:${createHash("sha256").update(conteudo).digest("hex")}`;
|
|
58
|
+
}
|
|
59
|
+
export function digestJsonCanonico(valor) {
|
|
60
|
+
return digestSha256(canonicalizarJson(valor));
|
|
61
|
+
}
|
|
62
|
+
/** Alias de dominio usado por planner, ledger e projecoes. */
|
|
63
|
+
export const hashCanonicoConteudo = digestJsonCanonico;
|
|
64
|
+
export function dadosAssinaveisEnvelopeConteudo(envelope) {
|
|
65
|
+
return {
|
|
66
|
+
schemaVersion: envelope.schemaVersion,
|
|
67
|
+
payloadType: envelope.payloadType,
|
|
68
|
+
payload: envelope.payload,
|
|
69
|
+
principalId: envelope.principalId,
|
|
70
|
+
keyId: envelope.keyId,
|
|
71
|
+
issuedAt: envelope.issuedAt,
|
|
72
|
+
nonce: envelope.nonce,
|
|
73
|
+
signatureAlgorithm: envelope.signatureAlgorithm,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
export function serializarEnvelopeAssinavelConteudo(envelope) {
|
|
77
|
+
return canonicalizarJson(dadosAssinaveisEnvelopeConteudo(envelope));
|
|
78
|
+
}
|
|
79
|
+
/** A chave privada e usada somente nesta chamada e jamais integra o retorno. */
|
|
80
|
+
export function assinarEnvelopeConteudo(envelope, privateKey) {
|
|
81
|
+
if (envelope.signatureAlgorithm !== "Ed25519") {
|
|
82
|
+
throw new TypeError("algoritmo_assinatura_nao_suportado");
|
|
83
|
+
}
|
|
84
|
+
const mensagem = Buffer.from(serializarEnvelopeAssinavelConteudo(envelope), "utf8");
|
|
85
|
+
const signature = sign(null, mensagem, privateKey).toString("base64");
|
|
86
|
+
return { ...dadosAssinaveisEnvelopeConteudo(envelope), signature };
|
|
87
|
+
}
|
|
88
|
+
export function verificarAssinaturaEnvelopeConteudo(envelope, publicKey) {
|
|
89
|
+
if (envelope.signatureAlgorithm !== "Ed25519")
|
|
90
|
+
return false;
|
|
91
|
+
if (!/^[A-Za-z0-9+/]+={0,2}$/.test(envelope.signature))
|
|
92
|
+
return false;
|
|
93
|
+
try {
|
|
94
|
+
const assinatura = Buffer.from(envelope.signature, "base64");
|
|
95
|
+
if (assinatura.length !== 64 || assinatura.toString("base64") !== envelope.signature)
|
|
96
|
+
return false;
|
|
97
|
+
const mensagem = Buffer.from(serializarEnvelopeAssinavelConteudo(envelope), "utf8");
|
|
98
|
+
return verify(null, mensagem, publicKey, assinatura);
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
return false;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
export function digestEnvelopeConteudo(envelope) {
|
|
105
|
+
return digestJsonCanonico(envelope);
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=canonical.js.map
|