@semacode/cli 1.5.30 → 1.5.32
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/AGENTS.md +294 -0
- package/AGENT_CONTEXT_PACK.json +164 -0
- package/LICENSE +22 -0
- package/README.md +85 -144
- package/SEMA_BRIEF.curto.txt +11 -0
- package/SEMA_BRIEF.md +616 -0
- package/SEMA_BRIEF.micro.txt +9 -0
- package/SEMA_INDEX.json +9393 -0
- package/dist/billing/index.d.ts +46 -0
- package/dist/billing/index.js +143 -0
- package/dist/billing/index.js.map +1 -0
- package/dist/comandos.js +33 -0
- package/dist/comandos.js.map +1 -1
- package/dist/controleComercialSupabase.d.ts +7 -0
- package/dist/controleComercialSupabase.js +6 -0
- package/dist/controleComercialSupabase.js.map +1 -0
- package/dist/controleComercialSupabaseAdmin.d.ts +7 -0
- package/dist/controleComercialSupabaseAdmin.js +138 -0
- package/dist/controleComercialSupabaseAdmin.js.map +1 -0
- package/dist/controleComercialSupabaseCadastro.d.ts +4 -0
- package/dist/controleComercialSupabaseCadastro.js +85 -0
- package/dist/controleComercialSupabaseCadastro.js.map +1 -0
- package/dist/controleComercialSupabaseConstantes.d.ts +28 -0
- package/dist/controleComercialSupabaseConstantes.js +44 -0
- package/dist/controleComercialSupabaseConstantes.js.map +1 -0
- package/dist/controleComercialSupabaseConsumo.d.ts +2 -0
- package/dist/controleComercialSupabaseConsumo.js +77 -0
- package/dist/controleComercialSupabaseConsumo.js.map +1 -0
- package/dist/controleComercialSupabaseConta.d.ts +11 -0
- package/dist/controleComercialSupabaseConta.js +157 -0
- package/dist/controleComercialSupabaseConta.js.map +1 -0
- package/dist/controleComercialSupabaseProfiles.d.ts +4 -0
- package/dist/controleComercialSupabaseProfiles.js +55 -0
- package/dist/controleComercialSupabaseProfiles.js.map +1 -0
- package/dist/controleComercialSupabaseTipos.d.ts +3 -0
- package/dist/controleComercialSupabaseTipos.js +2 -0
- package/dist/controleComercialSupabaseTipos.js.map +1 -0
- package/dist/controleComercialSupabaseTiposAdmin.d.ts +152 -0
- package/dist/controleComercialSupabaseTiposAdmin.js +2 -0
- package/dist/controleComercialSupabaseTiposAdmin.js.map +1 -0
- package/dist/controleComercialSupabaseTiposBase.d.ts +169 -0
- package/dist/controleComercialSupabaseTiposBase.js +2 -0
- package/dist/controleComercialSupabaseTiposBase.js.map +1 -0
- package/dist/controleComercialSupabaseTiposConta.d.ts +220 -0
- package/dist/controleComercialSupabaseTiposConta.js +2 -0
- package/dist/controleComercialSupabaseTiposConta.js.map +1 -0
- package/dist/dev/index.d.ts +18 -0
- package/dist/dev/index.js +143 -0
- package/dist/dev/index.js.map +1 -0
- package/dist/index.js +222 -46
- package/dist/index.js.map +1 -1
- package/dist/init/index.d.ts +23 -0
- package/dist/init/index.js +112 -0
- package/dist/init/index.js.map +1 -0
- package/dist/init/templates.d.ts +11 -0
- package/dist/init/templates.js +660 -0
- package/dist/init/templates.js.map +1 -0
- package/dist/runnerValidacaoRemota.d.ts +9 -0
- package/dist/runnerValidacaoRemota.js +9 -0
- package/dist/runnerValidacaoRemota.js.map +1 -0
- package/dist/runnerValidacaoRemotaBateria.d.ts +10 -0
- package/dist/runnerValidacaoRemotaBateria.js +115 -0
- package/dist/runnerValidacaoRemotaBateria.js.map +1 -0
- package/dist/runnerValidacaoRemotaCli.d.ts +4 -0
- package/dist/runnerValidacaoRemotaCli.js +86 -0
- package/dist/runnerValidacaoRemotaCli.js.map +1 -0
- package/dist/runnerValidacaoRemotaComandos.d.ts +7 -0
- package/dist/runnerValidacaoRemotaComandos.js +123 -0
- package/dist/runnerValidacaoRemotaComandos.js.map +1 -0
- package/dist/runnerValidacaoRemotaEscopo.d.ts +4 -0
- package/dist/runnerValidacaoRemotaEscopo.js +79 -0
- package/dist/runnerValidacaoRemotaEscopo.js.map +1 -0
- package/dist/runnerValidacaoRemotaExecucao.d.ts +2 -0
- package/dist/runnerValidacaoRemotaExecucao.js +102 -0
- package/dist/runnerValidacaoRemotaExecucao.js.map +1 -0
- package/dist/runnerValidacaoRemotaRelatorio.d.ts +3 -0
- package/dist/runnerValidacaoRemotaRelatorio.js +93 -0
- package/dist/runnerValidacaoRemotaRelatorio.js.map +1 -0
- package/dist/runnerValidacaoRemotaServidor.d.ts +3 -0
- package/dist/runnerValidacaoRemotaServidor.js +157 -0
- package/dist/runnerValidacaoRemotaServidor.js.map +1 -0
- package/dist/runnerValidacaoRemotaSnapshot.d.ts +10 -0
- package/dist/runnerValidacaoRemotaSnapshot.js +217 -0
- package/dist/runnerValidacaoRemotaSnapshot.js.map +1 -0
- package/dist/runnerValidacaoRemotaTipos.d.ts +158 -0
- package/dist/runnerValidacaoRemotaTipos.js +35 -0
- package/dist/runnerValidacaoRemotaTipos.js.map +1 -0
- package/dist/runnerValidacaoRemotaUtil.d.ts +3 -0
- package/dist/runnerValidacaoRemotaUtil.js +18 -0
- package/dist/runnerValidacaoRemotaUtil.js.map +1 -0
- package/dist/runnerValidacaoRemotaWorkspace.d.ts +2 -0
- package/dist/runnerValidacaoRemotaWorkspace.js +110 -0
- package/dist/runnerValidacaoRemotaWorkspace.js.map +1 -0
- package/dist/sync/index.d.ts +24 -0
- package/dist/sync/index.js +174 -0
- package/dist/sync/index.js.map +1 -0
- package/docs/AGENT_STARTER.md +109 -0
- package/docs/api.md +82 -0
- package/docs/cli.md +93 -0
- package/docs/como-ensinar-a-sema-para-ia.md +30 -0
- package/docs/deploy.md +45 -0
- package/docs/documentacao.md +88 -0
- package/docs/env.md +115 -0
- package/docs/extensao-vscode.md +42 -0
- package/docs/fluxo-pratico-ia-sema.md +187 -0
- package/docs/instalacao-e-primeiro-uso.md +48 -0
- package/docs/integracao-com-ia.md +24 -0
- package/docs/mcp.md +48 -0
- package/docs/pagamento-ponta-a-ponta.md +171 -0
- package/docs/persistencia-vendor-first.md +151 -0
- package/docs/prompt-base-ia-sema.md +111 -0
- package/docs/repositories.md +69 -0
- package/docs/rollback.md +24 -0
- package/docs/seguranca.md +126 -0
- package/docs/sintaxe.md +218 -0
- package/exemplos/profile_conversas.sema +165 -0
- package/llms-full.txt +35 -0
- package/llms.txt +18 -0
- package/node_modules/@sema/gerador-css/package.json +7 -14
- package/node_modules/@sema/gerador-dart/package.json +7 -14
- package/node_modules/@sema/gerador-html/package.json +7 -14
- package/node_modules/@sema/gerador-javascript/package.json +7 -14
- package/node_modules/@sema/gerador-lua/package.json +7 -14
- package/node_modules/@sema/gerador-python/package.json +7 -14
- package/node_modules/@sema/gerador-typescript/package.json +7 -14
- package/node_modules/@sema/nucleo/dist/diagnosticos/melhorador.d.ts +22 -0
- package/node_modules/@sema/nucleo/dist/diagnosticos/melhorador.js +97 -0
- package/node_modules/@sema/nucleo/dist/diagnosticos/melhorador.js.map +1 -0
- package/node_modules/@sema/nucleo/dist/index.d.ts +1 -0
- package/node_modules/@sema/nucleo/dist/index.js +1 -0
- package/node_modules/@sema/nucleo/dist/index.js.map +1 -1
- package/node_modules/@sema/nucleo/package.json +7 -10
- package/node_modules/@sema/padroes/package.json +7 -10
- package/package.json +75 -74
- package/exemplos/.prepack-generated +0 -1
- package/node_modules/@sema/gerador-css/src/index.ts +0 -605
- package/node_modules/@sema/gerador-css/tsconfig.json +0 -13
- package/node_modules/@sema/gerador-css/tsconfig.tsbuildinfo +0 -1
- package/node_modules/@sema/gerador-dart/src/index.ts +0 -52
- package/node_modules/@sema/gerador-dart/tsconfig.json +0 -13
- package/node_modules/@sema/gerador-dart/tsconfig.tsbuildinfo +0 -1
- package/node_modules/@sema/gerador-html/src/index.ts +0 -185
- package/node_modules/@sema/gerador-html/tsconfig.json +0 -13
- package/node_modules/@sema/gerador-html/tsconfig.tsbuildinfo +0 -1
- package/node_modules/@sema/gerador-javascript/src/index.ts +0 -461
- package/node_modules/@sema/gerador-javascript/tsconfig.json +0 -13
- package/node_modules/@sema/gerador-javascript/tsconfig.tsbuildinfo +0 -1
- package/node_modules/@sema/gerador-lua/src/index.ts +0 -359
- package/node_modules/@sema/gerador-lua/tsconfig.json +0 -13
- package/node_modules/@sema/gerador-lua/tsconfig.tsbuildinfo +0 -1
- package/node_modules/@sema/gerador-python/src/index.ts +0 -850
- package/node_modules/@sema/gerador-python/tsconfig.json +0 -13
- package/node_modules/@sema/gerador-python/tsconfig.tsbuildinfo +0 -1
- package/node_modules/@sema/gerador-typescript/src/index.ts +0 -876
- package/node_modules/@sema/gerador-typescript/tsconfig.json +0 -13
- package/node_modules/@sema/gerador-typescript/tsconfig.tsbuildinfo +0 -1
- package/node_modules/@sema/nucleo/src/ast/tipos.ts +0 -207
- package/node_modules/@sema/nucleo/src/diagnosticos/index.ts +0 -43
- package/node_modules/@sema/nucleo/src/formatador/index.ts +0 -530
- package/node_modules/@sema/nucleo/src/index.ts +0 -183
- package/node_modules/@sema/nucleo/src/ir/conversor.ts +0 -1037
- package/node_modules/@sema/nucleo/src/ir/modelos.ts +0 -403
- package/node_modules/@sema/nucleo/src/lexer/lexer.ts +0 -166
- package/node_modules/@sema/nucleo/src/lexer/tokens.ts +0 -79
- package/node_modules/@sema/nucleo/src/parser/gramatica.ebnf +0 -41
- package/node_modules/@sema/nucleo/src/parser/parser.ts +0 -936
- package/node_modules/@sema/nucleo/src/persistencia/contratos.ts +0 -379
- package/node_modules/@sema/nucleo/src/semantico/analisador.ts +0 -3126
- package/node_modules/@sema/nucleo/src/semantico/estruturas.ts +0 -665
- package/node_modules/@sema/nucleo/src/semantico/seguranca.ts +0 -362
- package/node_modules/@sema/nucleo/src/util/arquivos.ts +0 -28
- package/node_modules/@sema/nucleo/tsconfig.json +0 -9
- package/node_modules/@sema/nucleo/tsconfig.tsbuildinfo +0 -1
- package/node_modules/@sema/padroes/src/index.ts +0 -382
- package/node_modules/@sema/padroes/tsconfig.json +0 -9
- package/node_modules/@sema/padroes/tsconfig.tsbuildinfo +0 -1
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import type { Server } from "node:http";
|
|
2
|
+
export type ModoVerificacaoRemota = "CONTRATOS_APENAS" | "CODIGO_SELECIONADO" | "CODIGO_COMPLETO";
|
|
3
|
+
export type StatusJobVerificacao = "APROVADO" | "BLOQUEADO" | "FALHOU";
|
|
4
|
+
export type AmbienteRunner = "VPS" | "WORKER_CONTAINER" | "WORKTREE_ISOLADO";
|
|
5
|
+
export interface ArquivoSnapshotRemoto {
|
|
6
|
+
caminho: string;
|
|
7
|
+
conteudo: string;
|
|
8
|
+
tipo?: string;
|
|
9
|
+
hash?: string;
|
|
10
|
+
}
|
|
11
|
+
export interface ComandoProjetoRemoto {
|
|
12
|
+
comando: string;
|
|
13
|
+
args?: string[];
|
|
14
|
+
}
|
|
15
|
+
export interface SnapshotProjetoRemoto {
|
|
16
|
+
origem: string;
|
|
17
|
+
tenant: string;
|
|
18
|
+
modo: ModoVerificacaoRemota;
|
|
19
|
+
contratos: ArquivoSnapshotRemoto[];
|
|
20
|
+
codigo: ArquivoSnapshotRemoto[];
|
|
21
|
+
documentacao: ArquivoSnapshotRemoto[];
|
|
22
|
+
indice: string[];
|
|
23
|
+
segredos_detectados: string[];
|
|
24
|
+
politica_segredos: string;
|
|
25
|
+
contrato_alvo?: string;
|
|
26
|
+
comandos_projeto: ComandoProjetoRemoto[];
|
|
27
|
+
}
|
|
28
|
+
export interface WorkspaceRunner {
|
|
29
|
+
id: string;
|
|
30
|
+
ambiente: AmbienteRunner;
|
|
31
|
+
caminho: string;
|
|
32
|
+
tenant: string;
|
|
33
|
+
isolamento: string;
|
|
34
|
+
expira_em: string;
|
|
35
|
+
}
|
|
36
|
+
export interface ArtefatoVerificacaoRemota {
|
|
37
|
+
nome: string;
|
|
38
|
+
tipo: string;
|
|
39
|
+
caminho: string;
|
|
40
|
+
hash: string;
|
|
41
|
+
publico: boolean;
|
|
42
|
+
}
|
|
43
|
+
export interface ComandoExecutadoRunner {
|
|
44
|
+
nome: string;
|
|
45
|
+
args: string[];
|
|
46
|
+
codigoSaida: number;
|
|
47
|
+
stdoutArquivo: string;
|
|
48
|
+
stderrArquivo: string;
|
|
49
|
+
duracaoMs: number;
|
|
50
|
+
sucesso: boolean;
|
|
51
|
+
}
|
|
52
|
+
export type EscopoDriftRunner = "projeto" | "nao_executado";
|
|
53
|
+
export interface EscopoEvidenciaRemota {
|
|
54
|
+
origem_snapshot: string;
|
|
55
|
+
tenant: string;
|
|
56
|
+
workspace_id: string;
|
|
57
|
+
workspace_caminho: string;
|
|
58
|
+
modo_verificacao: ModoVerificacaoRemota;
|
|
59
|
+
contrato_alvo: string | null;
|
|
60
|
+
entrada_sema: string;
|
|
61
|
+
escopo_drift: EscopoDriftRunner;
|
|
62
|
+
fontes_conclusao: string[];
|
|
63
|
+
codigo_verificado: boolean;
|
|
64
|
+
testes_projeto_executados: boolean;
|
|
65
|
+
comando_drift: string;
|
|
66
|
+
conclusao_limpa_autorizada: boolean;
|
|
67
|
+
ressalva_escopo: string;
|
|
68
|
+
}
|
|
69
|
+
export interface RelatorioVerificacaoRemota {
|
|
70
|
+
job_id: string;
|
|
71
|
+
modo: ModoVerificacaoRemota;
|
|
72
|
+
status: StatusJobVerificacao;
|
|
73
|
+
score_semantico: number;
|
|
74
|
+
diagnosticos: string[];
|
|
75
|
+
avisos_alta_severidade: string[];
|
|
76
|
+
comandos_executados: ComandoExecutadoRunner[];
|
|
77
|
+
artefatos: ArtefatoVerificacaoRemota[];
|
|
78
|
+
escopo_evidencia: EscopoEvidenciaRemota;
|
|
79
|
+
resumo_ia: string;
|
|
80
|
+
}
|
|
81
|
+
export interface ResultadoRecebimentoSnapshot {
|
|
82
|
+
snapshot: SnapshotProjetoRemoto;
|
|
83
|
+
modo_verificacao: ModoVerificacaoRemota;
|
|
84
|
+
pronto_para_workspace: boolean;
|
|
85
|
+
bloqueios: string[];
|
|
86
|
+
}
|
|
87
|
+
export interface ResultadoProvisionamentoWorkspace {
|
|
88
|
+
workspace: WorkspaceRunner;
|
|
89
|
+
isolamento_ok: boolean;
|
|
90
|
+
limpeza_agendada: boolean;
|
|
91
|
+
bloqueios: string[];
|
|
92
|
+
}
|
|
93
|
+
export interface ResultadoPublicacaoRelatorio {
|
|
94
|
+
resumo_ia: string;
|
|
95
|
+
url_relatorio: string;
|
|
96
|
+
artefatos_publicados: ArtefatoVerificacaoRemota[];
|
|
97
|
+
redacao_ok: boolean;
|
|
98
|
+
bloqueios: string[];
|
|
99
|
+
}
|
|
100
|
+
export interface ResultadoFechamentoJob {
|
|
101
|
+
concluido: boolean;
|
|
102
|
+
pode_liberar: boolean;
|
|
103
|
+
decisao_agente: "continuar" | "continuar_com_ressalva" | "parar" | "chamar_humano";
|
|
104
|
+
proximas_acoes: string[];
|
|
105
|
+
bloqueios: string[];
|
|
106
|
+
}
|
|
107
|
+
export interface ResultadoRunnerValidacaoRemota {
|
|
108
|
+
comando: "runner validar-remoto";
|
|
109
|
+
sucesso: boolean;
|
|
110
|
+
status: StatusJobVerificacao;
|
|
111
|
+
podeLiberar: boolean;
|
|
112
|
+
jobId: string;
|
|
113
|
+
modo: ModoVerificacaoRemota;
|
|
114
|
+
snapshot: {
|
|
115
|
+
origem: string;
|
|
116
|
+
tenant: string;
|
|
117
|
+
contratos: number;
|
|
118
|
+
codigo: number;
|
|
119
|
+
documentacao: number;
|
|
120
|
+
};
|
|
121
|
+
workspace: WorkspaceRunner | null;
|
|
122
|
+
workspaceRemovido: boolean;
|
|
123
|
+
relatorio: RelatorioVerificacaoRemota;
|
|
124
|
+
publicacao: ResultadoPublicacaoRelatorio;
|
|
125
|
+
fechamento: ResultadoFechamentoJob;
|
|
126
|
+
relatorioArquivo: string;
|
|
127
|
+
}
|
|
128
|
+
export interface OpcoesRunnerValidacaoRemota {
|
|
129
|
+
saida: string;
|
|
130
|
+
cwd: string;
|
|
131
|
+
manterWorkspace: boolean;
|
|
132
|
+
modoOverride?: ModoVerificacaoRemota;
|
|
133
|
+
contratoAlvo?: string;
|
|
134
|
+
timeoutMs?: number;
|
|
135
|
+
}
|
|
136
|
+
export interface OpcoesServidorRunnerValidacaoRemota {
|
|
137
|
+
cwd: string;
|
|
138
|
+
host: string;
|
|
139
|
+
porta: number;
|
|
140
|
+
saida: string;
|
|
141
|
+
token?: string;
|
|
142
|
+
}
|
|
143
|
+
export interface ServidorRunnerValidacaoRemota {
|
|
144
|
+
server: Server;
|
|
145
|
+
host: string;
|
|
146
|
+
porta: number;
|
|
147
|
+
url: string;
|
|
148
|
+
authObrigatoria: boolean;
|
|
149
|
+
}
|
|
150
|
+
export interface EntradaSnapshotRemoto {
|
|
151
|
+
[key: string]: unknown;
|
|
152
|
+
}
|
|
153
|
+
export declare const MODOS_VALIDOS: Set<ModoVerificacaoRemota>;
|
|
154
|
+
export declare const AMBIENTE_PADRAO: AmbienteRunner;
|
|
155
|
+
export declare const TIMEOUT_COMANDO_PADRAO_MS = 120000;
|
|
156
|
+
export declare const PREFIXO_WORKSPACE = "sema-runner-";
|
|
157
|
+
export declare const DIRETORIOS_PROIBIDOS: Set<string>;
|
|
158
|
+
export declare const COMANDOS_PROJETO_PERMITIDOS: Set<string>;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export const MODOS_VALIDOS = new Set(["CONTRATOS_APENAS", "CODIGO_SELECIONADO", "CODIGO_COMPLETO"]);
|
|
2
|
+
export const AMBIENTE_PADRAO = "WORKTREE_ISOLADO";
|
|
3
|
+
export const TIMEOUT_COMANDO_PADRAO_MS = 120_000;
|
|
4
|
+
export const PREFIXO_WORKSPACE = "sema-runner-";
|
|
5
|
+
export const DIRETORIOS_PROIBIDOS = new Set([
|
|
6
|
+
".git",
|
|
7
|
+
".hg",
|
|
8
|
+
".svn",
|
|
9
|
+
".next",
|
|
10
|
+
".nuxt",
|
|
11
|
+
".turbo",
|
|
12
|
+
".cache",
|
|
13
|
+
".pytest_cache",
|
|
14
|
+
".venv",
|
|
15
|
+
"build",
|
|
16
|
+
"coverage",
|
|
17
|
+
"dist",
|
|
18
|
+
"node_modules",
|
|
19
|
+
"vendor",
|
|
20
|
+
]);
|
|
21
|
+
export const COMANDOS_PROJETO_PERMITIDOS = new Set([
|
|
22
|
+
"npm",
|
|
23
|
+
"pnpm",
|
|
24
|
+
"yarn",
|
|
25
|
+
"node",
|
|
26
|
+
"python",
|
|
27
|
+
"py",
|
|
28
|
+
"pytest",
|
|
29
|
+
"go",
|
|
30
|
+
"cargo",
|
|
31
|
+
"dotnet",
|
|
32
|
+
"mvn",
|
|
33
|
+
"gradle",
|
|
34
|
+
]);
|
|
35
|
+
//# sourceMappingURL=runnerValidacaoRemotaTipos.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runnerValidacaoRemotaTipos.js","sourceRoot":"","sources":["../src/runnerValidacaoRemotaTipos.ts"],"names":[],"mappings":"AA4KA,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,GAAG,CAAwB,CAAC,kBAAkB,EAAE,oBAAoB,EAAE,iBAAiB,CAAC,CAAC,CAAC;AAC3H,MAAM,CAAC,MAAM,eAAe,GAAmB,kBAAkB,CAAC;AAClE,MAAM,CAAC,MAAM,yBAAyB,GAAG,OAAO,CAAC;AACjD,MAAM,CAAC,MAAM,iBAAiB,GAAG,cAAc,CAAC;AAEhD,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAC;IAC1C,MAAM;IACN,KAAK;IACL,MAAM;IACN,OAAO;IACP,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,eAAe;IACf,OAAO;IACP,OAAO;IACP,UAAU;IACV,MAAM;IACN,cAAc;IACd,QAAQ;CACT,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,2BAA2B,GAAG,IAAI,GAAG,CAAC;IACjD,KAAK;IACL,MAAM;IACN,MAAM;IACN,MAAM;IACN,QAAQ;IACR,IAAI;IACJ,QAAQ;IACR,IAAI;IACJ,OAAO;IACP,QAAQ;IACR,KAAK;IACL,QAAQ;CACT,CAAC,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { readFile, stat } from "node:fs/promises";
|
|
3
|
+
export function hashTexto(texto) {
|
|
4
|
+
return createHash("sha256").update(texto).digest("hex");
|
|
5
|
+
}
|
|
6
|
+
export async function hashArquivo(caminho) {
|
|
7
|
+
return hashTexto(await readFile(caminho, "utf8"));
|
|
8
|
+
}
|
|
9
|
+
export async function verificarArquivoExiste(caminho) {
|
|
10
|
+
try {
|
|
11
|
+
await stat(caminho);
|
|
12
|
+
return true;
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=runnerValidacaoRemotaUtil.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runnerValidacaoRemotaUtil.js","sourceRoot":"","sources":["../src/runnerValidacaoRemotaUtil.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAElD,MAAM,UAAU,SAAS,CAAC,KAAa;IACrC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAe;IAC/C,OAAO,SAAS,CAAC,MAAM,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,OAAe;IAC1D,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,OAAO,CAAC,CAAC;QACpB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { type AmbienteRunner, type ResultadoProvisionamentoWorkspace, type SnapshotProjetoRemoto } from "./runnerValidacaoRemotaTipos.js";
|
|
2
|
+
export declare function provisionarWorkspaceRunner(snapshot: SnapshotProjetoRemoto, ambiente?: AmbienteRunner): Promise<ResultadoProvisionamentoWorkspace>;
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { mkdir, mkdtemp, writeFile } from "node:fs/promises";
|
|
3
|
+
import os from "node:os";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import { AMBIENTE_PADRAO, PREFIXO_WORKSPACE } from "./runnerValidacaoRemotaTipos.js";
|
|
6
|
+
import { dedupe } from "./runnerValidacaoRemotaSnapshot.js";
|
|
7
|
+
import { hashTexto } from "./runnerValidacaoRemotaUtil.js";
|
|
8
|
+
async function escreverArquivoRelativoSeguro(base, arquivo) {
|
|
9
|
+
const destino = path.resolve(base, ...arquivo.caminho.split("/"));
|
|
10
|
+
const relativo = path.relative(base, destino);
|
|
11
|
+
if (relativo.startsWith("..") || path.isAbsolute(relativo)) {
|
|
12
|
+
throw new Error(`Caminho fora do workspace recusado: ${arquivo.caminho}`);
|
|
13
|
+
}
|
|
14
|
+
await mkdir(path.dirname(destino), { recursive: true });
|
|
15
|
+
await writeFile(destino, arquivo.conteudo, "utf8");
|
|
16
|
+
}
|
|
17
|
+
function inferirOrigensContratos(contratos) {
|
|
18
|
+
const origens = contratos.map((arquivo) => {
|
|
19
|
+
const partes = arquivo.caminho.split("/");
|
|
20
|
+
if (partes[0] === "contratos" || partes[0] === "contracts" || partes[0] === "sema") {
|
|
21
|
+
return `./${partes[0]}`;
|
|
22
|
+
}
|
|
23
|
+
const dir = path.posix.dirname(arquivo.caminho);
|
|
24
|
+
return dir === "." ? "." : `./${dir}`;
|
|
25
|
+
});
|
|
26
|
+
return dedupe(origens);
|
|
27
|
+
}
|
|
28
|
+
function inferirDiretoriosCodigoSnapshot(codigo) {
|
|
29
|
+
const dirs = codigo.map((arquivo) => {
|
|
30
|
+
const partes = arquivo.caminho.split("/");
|
|
31
|
+
return partes.length > 1 ? `./${partes[0]}` : ".";
|
|
32
|
+
});
|
|
33
|
+
return dedupe(dirs);
|
|
34
|
+
}
|
|
35
|
+
function inferirFontesLegadoSnapshot(codigo) {
|
|
36
|
+
const fontes = new Set();
|
|
37
|
+
for (const arquivo of codigo) {
|
|
38
|
+
const caminho = arquivo.caminho.toLowerCase();
|
|
39
|
+
if (/\.(ts|tsx|js|jsx|mjs|cjs)$/.test(caminho)) {
|
|
40
|
+
fontes.add("typescript");
|
|
41
|
+
}
|
|
42
|
+
if (caminho.endsWith(".py")) {
|
|
43
|
+
fontes.add("python");
|
|
44
|
+
}
|
|
45
|
+
if (caminho.endsWith(".dart")) {
|
|
46
|
+
fontes.add("dart");
|
|
47
|
+
}
|
|
48
|
+
if (caminho.endsWith(".lua")) {
|
|
49
|
+
fontes.add("lua");
|
|
50
|
+
}
|
|
51
|
+
if (caminho.endsWith(".cs")) {
|
|
52
|
+
fontes.add("dotnet");
|
|
53
|
+
}
|
|
54
|
+
if (caminho.endsWith(".java")) {
|
|
55
|
+
fontes.add("java");
|
|
56
|
+
}
|
|
57
|
+
if (caminho.endsWith(".go")) {
|
|
58
|
+
fontes.add("go");
|
|
59
|
+
}
|
|
60
|
+
if (caminho.endsWith(".rs")) {
|
|
61
|
+
fontes.add("rust");
|
|
62
|
+
}
|
|
63
|
+
if (/\.(cpp|cc|cxx|hpp|h)$/.test(caminho)) {
|
|
64
|
+
fontes.add("cpp");
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return [...fontes].sort((a, b) => a.localeCompare(b, "pt-BR"));
|
|
68
|
+
}
|
|
69
|
+
export async function provisionarWorkspaceRunner(snapshot, ambiente = AMBIENTE_PADRAO) {
|
|
70
|
+
const caminho = await mkdtemp(path.join(os.tmpdir(), PREFIXO_WORKSPACE));
|
|
71
|
+
const workspace = {
|
|
72
|
+
id: randomUUID(),
|
|
73
|
+
ambiente,
|
|
74
|
+
caminho,
|
|
75
|
+
tenant: snapshot.tenant,
|
|
76
|
+
isolamento: "tmpdir_efemero_sem_home_host_sem_docker_socket",
|
|
77
|
+
expira_em: new Date(Date.now() + 60 * 60 * 1000).toISOString(),
|
|
78
|
+
};
|
|
79
|
+
for (const arquivo of [...snapshot.contratos, ...snapshot.codigo, ...snapshot.documentacao]) {
|
|
80
|
+
await escreverArquivoRelativoSeguro(caminho, arquivo);
|
|
81
|
+
}
|
|
82
|
+
await mkdir(path.join(caminho, ".sema-runner"), { recursive: true });
|
|
83
|
+
await writeFile(path.join(caminho, ".sema-runner", "snapshot.json"), `${JSON.stringify({
|
|
84
|
+
origem: snapshot.origem,
|
|
85
|
+
tenant: snapshot.tenant,
|
|
86
|
+
modo: snapshot.modo,
|
|
87
|
+
indice: snapshot.indice,
|
|
88
|
+
contratos: snapshot.contratos.map((arquivo) => ({ caminho: arquivo.caminho, hash: hashTexto(arquivo.conteudo) })),
|
|
89
|
+
codigo: snapshot.codigo.map((arquivo) => ({ caminho: arquivo.caminho, hash: hashTexto(arquivo.conteudo) })),
|
|
90
|
+
documentacao: snapshot.documentacao.map((arquivo) => ({ caminho: arquivo.caminho, hash: hashTexto(arquivo.conteudo) })),
|
|
91
|
+
}, null, 2)}\n`, "utf8");
|
|
92
|
+
await writeFile(path.join(caminho, "sema.config.json"), `${JSON.stringify({
|
|
93
|
+
origens: inferirOrigensContratos(snapshot.contratos),
|
|
94
|
+
saida: "./generated",
|
|
95
|
+
alvos: ["typescript"],
|
|
96
|
+
alvoPadrao: "typescript",
|
|
97
|
+
framework: "base",
|
|
98
|
+
estruturaSaida: "modulos",
|
|
99
|
+
diretoriosCodigo: inferirDiretoriosCodigoSnapshot(snapshot.codigo),
|
|
100
|
+
fontesLegado: inferirFontesLegadoSnapshot(snapshot.codigo),
|
|
101
|
+
modoAdocao: "incremental",
|
|
102
|
+
}, null, 2)}\n`, "utf8");
|
|
103
|
+
return {
|
|
104
|
+
workspace,
|
|
105
|
+
isolamento_ok: true,
|
|
106
|
+
limpeza_agendada: true,
|
|
107
|
+
bloqueios: [],
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=runnerValidacaoRemotaWorkspace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runnerValidacaoRemotaWorkspace.js","sourceRoot":"","sources":["../src/runnerValidacaoRemotaWorkspace.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export interface MapeamentoTipo {
|
|
2
|
+
semaTipo: string;
|
|
3
|
+
prismaTipo: string;
|
|
4
|
+
atributosPrisma: string[];
|
|
5
|
+
}
|
|
6
|
+
export declare function mapearTiposSemaPrisma(): {
|
|
7
|
+
mapeamentos: MapeamentoTipo[];
|
|
8
|
+
cobertura: number;
|
|
9
|
+
};
|
|
10
|
+
export declare function gerarSchemaPrisma(pastaContratos: string, saidaSchema: string, datasourceProvider?: string): Promise<{
|
|
11
|
+
schemaGerado: string;
|
|
12
|
+
modelsGerados: number;
|
|
13
|
+
enumsGerados: number;
|
|
14
|
+
}>;
|
|
15
|
+
export declare function importarSchemaPrisma(caminhoSchema: string, pastaSaida: string, nomeModulo: string): Promise<{
|
|
16
|
+
contratosGerados: string[];
|
|
17
|
+
entitiesCriadas: number;
|
|
18
|
+
}>;
|
|
19
|
+
export declare function compararDivergencias(pastaContratos: string, caminhoSchema: string): Promise<{
|
|
20
|
+
divergencias: string[];
|
|
21
|
+
total: number;
|
|
22
|
+
breaking: number;
|
|
23
|
+
}>;
|
|
24
|
+
export declare function comandoSyncPrisma(args: string[]): Promise<void>;
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
// Sync Sema ↔ Prisma
|
|
2
|
+
// Contrato: cli_sync_prisma.sema
|
|
3
|
+
import * as fs from 'fs';
|
|
4
|
+
import * as path from 'path';
|
|
5
|
+
const MAPEAMENTO_TIPOS = [
|
|
6
|
+
{ semaTipo: 'Id', prismaTipo: 'String', atributosPrisma: ['@id', '@default(uuid())'] },
|
|
7
|
+
{ semaTipo: 'Texto', prismaTipo: 'String', atributosPrisma: [] },
|
|
8
|
+
{ semaTipo: 'Email', prismaTipo: 'String', atributosPrisma: [] },
|
|
9
|
+
{ semaTipo: 'Decimal', prismaTipo: 'Decimal', atributosPrisma: [] },
|
|
10
|
+
{ semaTipo: 'Inteiro', prismaTipo: 'Int', atributosPrisma: [] },
|
|
11
|
+
{ semaTipo: 'Booleano', prismaTipo: 'Boolean', atributosPrisma: [] },
|
|
12
|
+
{ semaTipo: 'Timestamp', prismaTipo: 'DateTime', atributosPrisma: [] },
|
|
13
|
+
{ semaTipo: 'Lista', prismaTipo: 'String[]', atributosPrisma: [] },
|
|
14
|
+
{ semaTipo: 'Mapa', prismaTipo: 'Json', atributosPrisma: [] },
|
|
15
|
+
];
|
|
16
|
+
export function mapearTiposSemaPrisma() {
|
|
17
|
+
return {
|
|
18
|
+
mapeamentos: MAPEAMENTO_TIPOS,
|
|
19
|
+
cobertura: 0.85
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
function semaParaPrismaTipo(semaTipo) {
|
|
23
|
+
const mapeamento = MAPEAMENTO_TIPOS.find(m => m.semaTipo === semaTipo);
|
|
24
|
+
if (!mapeamento)
|
|
25
|
+
return 'String'; // fallback
|
|
26
|
+
const atributos = mapeamento.atributosPrisma.length > 0
|
|
27
|
+
? ' ' + mapeamento.atributosPrisma.join(' ')
|
|
28
|
+
: '';
|
|
29
|
+
return `${mapeamento.prismaTipo}${atributos}`;
|
|
30
|
+
}
|
|
31
|
+
export async function gerarSchemaPrisma(pastaContratos, saidaSchema, datasourceProvider = 'postgresql') {
|
|
32
|
+
// Verificar pasta
|
|
33
|
+
if (!fs.existsSync(pastaContratos)) {
|
|
34
|
+
throw new Error(`Pasta nao existe: ${pastaContratos}`);
|
|
35
|
+
}
|
|
36
|
+
const arquivos = fs.readdirSync(pastaContratos);
|
|
37
|
+
const contratos = arquivos.filter(f => f.endsWith('.sema'));
|
|
38
|
+
if (contratos.length === 0) {
|
|
39
|
+
throw new Error('Nenhum contrato .sema encontrado');
|
|
40
|
+
}
|
|
41
|
+
// Gerar schema basico
|
|
42
|
+
let models = '';
|
|
43
|
+
let modelCount = 0;
|
|
44
|
+
for (const contrato of contratos) {
|
|
45
|
+
const nomeModel = path.basename(contrato, '.sema').replace(/\./g, '_');
|
|
46
|
+
// Schema simplificado - em producao, fazer parsing real do contrato
|
|
47
|
+
models += `\nmodel ${nomeModel.charAt(0).toUpperCase() + nomeModel.slice(1)} {
|
|
48
|
+
id String @id @default(uuid())
|
|
49
|
+
criadoEm DateTime @default(now())
|
|
50
|
+
// Gerado a partir de: ${contrato}
|
|
51
|
+
// TODO: Adicionar campos do contrato Sema
|
|
52
|
+
}\n`;
|
|
53
|
+
modelCount++;
|
|
54
|
+
}
|
|
55
|
+
const schema = `// Gerado automaticamente pelo Sema
|
|
56
|
+
// Fonte: ${pastaContratos}
|
|
57
|
+
|
|
58
|
+
generator client {
|
|
59
|
+
provider = "prisma-client-js"
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
datasource db {
|
|
63
|
+
provider = "${datasourceProvider}"
|
|
64
|
+
url = env("DATABASE_URL")
|
|
65
|
+
}
|
|
66
|
+
${models}`;
|
|
67
|
+
// Salvar
|
|
68
|
+
fs.writeFileSync(saidaSchema, schema, 'utf-8');
|
|
69
|
+
return {
|
|
70
|
+
schemaGerado: schema,
|
|
71
|
+
modelsGerados: modelCount,
|
|
72
|
+
enumsGerados: 0
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
export async function importarSchemaPrisma(caminhoSchema, pastaSaida, nomeModulo) {
|
|
76
|
+
if (!fs.existsSync(caminhoSchema)) {
|
|
77
|
+
throw new Error(`Schema nao existe: ${caminhoSchema}`);
|
|
78
|
+
}
|
|
79
|
+
const schema = fs.readFileSync(caminhoSchema, 'utf-8');
|
|
80
|
+
// Extrair models (regex simplificado)
|
|
81
|
+
const modelMatches = schema.match(/model\s+(\w+)\s*\{([^}]+)\}/g) || [];
|
|
82
|
+
const contratos = [];
|
|
83
|
+
for (const match of modelMatches) {
|
|
84
|
+
const nomeMatch = match.match(/model\s+(\w+)/);
|
|
85
|
+
if (!nomeMatch)
|
|
86
|
+
continue;
|
|
87
|
+
const nomeModel = nomeMatch[1];
|
|
88
|
+
const nomeContrato = `${nomeModel.toLowerCase()}.sema`;
|
|
89
|
+
const caminhoContrato = path.join(pastaSaida, nomeContrato);
|
|
90
|
+
// Gerar contrato basico
|
|
91
|
+
const conteudo = `module ${nomeModulo}.${nomeModel.toLowerCase()} {
|
|
92
|
+
entity ${nomeModel} {
|
|
93
|
+
fields {
|
|
94
|
+
id: Id
|
|
95
|
+
// TODO: Mapear campos do schema Prisma
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
task criar_${nomeModel.toLowerCase()} {
|
|
100
|
+
input {
|
|
101
|
+
// TODO: Definir inputs
|
|
102
|
+
}
|
|
103
|
+
output {
|
|
104
|
+
${nomeModel.toLowerCase()}: ${nomeModel}
|
|
105
|
+
}
|
|
106
|
+
effects {
|
|
107
|
+
persistencia ${nomeModel}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}`;
|
|
111
|
+
fs.writeFileSync(caminhoContrato, conteudo, 'utf-8');
|
|
112
|
+
contratos.push(caminhoContrato);
|
|
113
|
+
}
|
|
114
|
+
return {
|
|
115
|
+
contratosGerados: contratos,
|
|
116
|
+
entitiesCriadas: modelMatches.length
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
export async function compararDivergencias(pastaContratos, caminhoSchema) {
|
|
120
|
+
// Implementacao simplificada
|
|
121
|
+
const divergencias = [];
|
|
122
|
+
// Verificar se ambos existem
|
|
123
|
+
if (!fs.existsSync(pastaContratos)) {
|
|
124
|
+
divergencias.push('Pasta de contratos nao existe');
|
|
125
|
+
}
|
|
126
|
+
if (!fs.existsSync(caminhoSchema)) {
|
|
127
|
+
divergencias.push('Schema Prisma nao existe');
|
|
128
|
+
}
|
|
129
|
+
return {
|
|
130
|
+
divergencias,
|
|
131
|
+
total: divergencias.length,
|
|
132
|
+
breaking: 0
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
// Handlers CLI
|
|
136
|
+
export async function comandoSyncPrisma(args) {
|
|
137
|
+
const gerarIdx = args.indexOf('--gerar');
|
|
138
|
+
const importarIdx = args.indexOf('--importar');
|
|
139
|
+
const compararIdx = args.indexOf('--comparar');
|
|
140
|
+
if (gerarIdx !== -1) {
|
|
141
|
+
const pasta = args[gerarIdx + 1] || 'contratos/';
|
|
142
|
+
const saida = args[gerarIdx + 2] || 'prisma/schema.prisma';
|
|
143
|
+
const resultado = await gerarSchemaPrisma(pasta, saida);
|
|
144
|
+
console.log(`\n✅ Schema gerado: ${saida}`);
|
|
145
|
+
console.log(` Models: ${resultado.modelsGerados}`);
|
|
146
|
+
}
|
|
147
|
+
else if (importarIdx !== -1) {
|
|
148
|
+
const schema = args[importarIdx + 1];
|
|
149
|
+
const saida = args[importarIdx + 2] || 'contratos/importados/';
|
|
150
|
+
const modulo = args[importarIdx + 3] || 'legacy';
|
|
151
|
+
if (!schema) {
|
|
152
|
+
console.error('Uso: sema sync prisma --importar <schema.prisma> [saida] [modulo]');
|
|
153
|
+
process.exit(1);
|
|
154
|
+
}
|
|
155
|
+
fs.mkdirSync(saida, { recursive: true });
|
|
156
|
+
const resultado = await importarSchemaPrisma(schema, saida, modulo);
|
|
157
|
+
console.log(`\n✅ Importado: ${resultado.contratosGerados.length} contratos`);
|
|
158
|
+
}
|
|
159
|
+
else if (compararIdx !== -1) {
|
|
160
|
+
const pasta = args[compararIdx + 1] || 'contratos/';
|
|
161
|
+
const schema = args[compararIdx + 2] || 'prisma/schema.prisma';
|
|
162
|
+
const resultado = await compararDivergencias(pasta, schema);
|
|
163
|
+
console.log(`\n📊 Divergencias: ${resultado.total}`);
|
|
164
|
+
if (resultado.divergencias.length > 0) {
|
|
165
|
+
resultado.divergencias.forEach(d => console.log(` - ${d}`));
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
console.log('Uso: sema sync prisma --gerar [pasta] [saida]');
|
|
170
|
+
console.log(' sema sync prisma --importar <schema> [saida] [modulo]');
|
|
171
|
+
console.log(' sema sync prisma --comparar [pasta] [schema]');
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sync/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
# AGENT_STARTER
|
|
2
|
+
|
|
3
|
+
<!-- sema:i18n -->
|
|
4
|
+
> EN: English first. The canonical operational body below may still be in Portuguese until full translation lands.
|
|
5
|
+
> PT: Português depois, com acentos preservados.
|
|
6
|
+
> ES: Español al final; não traduza comandos, rotas nem sómbolos `.sema` sem contrato.
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
Use este texto como starter curto para qualquer IA antes de editar `.sema`.
|
|
10
|
+
|
|
11
|
+
Ordem canonica de entrada no repo:
|
|
12
|
+
|
|
13
|
+
1. `llms.txt`
|
|
14
|
+
2. `SEMA_BRIEF.md`
|
|
15
|
+
3. `SEMA_INDEX.json`
|
|
16
|
+
4. `AGENTS.md`
|
|
17
|
+
5. `README.md`
|
|
18
|
+
|
|
19
|
+
Roteamento por capacidade:
|
|
20
|
+
|
|
21
|
+
- IA pequena ou gratuita: `llms.txt` -> `SEMA_BRIEF.micro.txt` -> `SEMA_INDEX.json`
|
|
22
|
+
- IA média: `llms.txt` -> `SEMA_BRIEF.curto.txt` -> `SEMA_INDEX.json` -> `README.md`
|
|
23
|
+
- IA grande ou com tool use: `llms-full.txt` -> `SEMA_BRIEF.md` -> `SEMA_INDEX.json` -> `AGENTS.md` -> `README.md`
|
|
24
|
+
|
|
25
|
+
Tres modos de uso da Sema:
|
|
26
|
+
|
|
27
|
+
- projeto novo: modele, valide, compile e verifique antes de subir código derivado
|
|
28
|
+
- projeto já semantizado: inspecione, leia resumo, rode drift e gere contexto antes de editar
|
|
29
|
+
- legado sem Sema: importe, revise o rascunho, formate, valide e use drift como arbitro da adoção incremental
|
|
30
|
+
|
|
31
|
+
Para manter os artefatos gerados da raiz sincronizados:
|
|
32
|
+
|
|
33
|
+
- `sema sync-ai-entrypoints --json`
|
|
34
|
+
|
|
35
|
+
```text
|
|
36
|
+
Voce esta trabalhando com Sema, um contrato semantico IA-first para agentes operarem software vivo em backend e front consumer.
|
|
37
|
+
|
|
38
|
+
Importante:
|
|
39
|
+
- a Sema e protocolo de governanca semantica desenhado para IA, nao para ergonomia humana
|
|
40
|
+
- humanos sao autores/aprovadores; agentes sao os consumidores primarios do contrato
|
|
41
|
+
- a Sema funciona como camada de navegacao operacional para agente, nao como runtime magico
|
|
42
|
+
- leitura humana e bonus toleravel, nao centro do produto
|
|
43
|
+
- a Sema modela contratos, estados, fluxos, erros, efeitos, garantias, vinculos e execucao
|
|
44
|
+
- a Sema gera codigo e scaffolding real para TypeScript, Python e Dart
|
|
45
|
+
- a Sema usa `importar` para bootstrap revisavel, nao para contrato final automatico
|
|
46
|
+
- a Sema usa `drift` para medir diferenca entre contrato e codigo vivo
|
|
47
|
+
- a Sema usa `impl` para ligar task a simbolo real do runtime
|
|
48
|
+
- a Sema usa `resumo` e `prompt-curto` para IA pequena ou gratuita
|
|
49
|
+
- a Sema pode servir de base para interfaces graficas elegantes e coerentes
|
|
50
|
+
- a primeira onda consumer oficial agora cobre `Next.js consumer`, `React/Vite consumer`, `Angular consumer` e `flutter-consumer`
|
|
51
|
+
- esses slices oficiais cobrem `consumer bridge + superficies rastreaveis`, nao geracao completa de UI
|
|
52
|
+
- a proxima camada semantica de front (`screen`, `action`, `query`, `form`, `navigation`) esta documentada como roadmap, nao como sintaxe oficial ja suportada
|
|
53
|
+
- trate a Sema como cerebro semantico da aplicacao, nao como gerador magico de front-end pronto
|
|
54
|
+
- nao cobre da Sema persistencia real, runtime ou smoke test automatico; isso continua sendo engenharia viva
|
|
55
|
+
- se a tarefa envolver UI, priorize `appRoutes`, `consumerSurfaces` e `consumerBridges` antes de abrir arquivo aleatorio
|
|
56
|
+
- evite pedir HTML unico solto quando a intencao for testar a Sema de verdade
|
|
57
|
+
|
|
58
|
+
Regras:
|
|
59
|
+
- nao invente sintaxe fora da gramatica e dos exemplos oficiais
|
|
60
|
+
- se a IA for pequena, comece em `sema resumo` e `briefing.min.json`
|
|
61
|
+
- trate `ir --json` como fonte de verdade semantica
|
|
62
|
+
- trate `diagnosticos --json` como fonte de correcao
|
|
63
|
+
- use `sema formatar` como fonte unica de estilo
|
|
64
|
+
- preserve a intencao do contrato
|
|
65
|
+
- nao cobre da Sema adivinhacao de negocio que nao esta no contrato nem no codigo
|
|
66
|
+
|
|
67
|
+
Comandos essenciais:
|
|
68
|
+
- resumo por capacidade: `sema resumo <arquivo-ou-pasta> [--micro|--curto|--medio] [--para <resumo|onboarding|review|mudanca|bug|arquitetura>]`
|
|
69
|
+
- prompt curto: `sema prompt-curto <arquivo-ou-pasta> [--micro|--curto|--medio] [--para <resumo|onboarding|review|mudanca|bug|arquitetura>]`
|
|
70
|
+
- contexto completo do modulo: `sema contexto-ia <arquivo.sema>`
|
|
71
|
+
- estrutura sintatica: `sema ast <arquivo.sema> --json`
|
|
72
|
+
- estrutura semantica: `sema ir <arquivo.sema> --json`
|
|
73
|
+
- validacao: `sema validar <arquivo.sema> --json`
|
|
74
|
+
- diagnosticos: `sema diagnosticos <arquivo.sema> --json`
|
|
75
|
+
- formatacao: `sema formatar <arquivo.sema>`
|
|
76
|
+
- importacao assistida de legado: `sema importar <nestjs|fastapi|flask|nextjs|nextjs-consumer|react-vite-consumer|angular-consumer|flutter-consumer|firebase|typescript|python|dart|dotnet|java|go|rust|cpp> <diretorio> --saida <diretorio>`
|
|
77
|
+
- geracao de codigo: `sema compilar <arquivo-ou-pasta> --alvo <typescript|python|dart> --saida <diretorio>`
|
|
78
|
+
- verificacao final: `sema verificar <arquivo-ou-pasta> [--json]`
|
|
79
|
+
|
|
80
|
+
Regra pratica de ouro:
|
|
81
|
+
- se a tarefa pedir codigo derivado, `sema compilar` e obrigatorio
|
|
82
|
+
- se a tarefa partir de projeto que nao nasceu com Sema, `sema importar` deve entrar antes da lapidacao semantica
|
|
83
|
+
- se a tarefa pedir apenas leitura ou correcao sem gerar codigo, `sema compilar` pode ficar fora
|
|
84
|
+
|
|
85
|
+
Antes de editar:
|
|
86
|
+
1. leia README, docs de IA e um exemplo oficial parecido
|
|
87
|
+
2. se a IA for pequena, rode `sema resumo <arquivo> --micro`
|
|
88
|
+
3. se a tarefa pedir contexto mais rico, consulte `drift`, `briefing.min.json` e depois AST/IR
|
|
89
|
+
|
|
90
|
+
Depois de editar:
|
|
91
|
+
1. rode `sema formatar`
|
|
92
|
+
2. rode `sema validar --json`
|
|
93
|
+
3. se houver falha, use `diagnosticos --json`
|
|
94
|
+
4. se a tarefa pedir codigo derivado, rode `sema compilar`
|
|
95
|
+
5. feche com `sema verificar <arquivo-ou-pasta> --json`
|
|
96
|
+
|
|
97
|
+
Priorize sempre:
|
|
98
|
+
- exemplos oficiais
|
|
99
|
+
- JSON da CLI
|
|
100
|
+
- consistencia semantica
|
|
101
|
+
|
|
102
|
+
Nao improvise quando faltar contexto.
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
Documentos de apoio:
|
|
106
|
+
|
|
107
|
+
- [como-ensinar-a-sema-para-ia.md](./como-ensinar-a-sema-para-ia.md)
|
|
108
|
+
- [prompt-base-ia-sema.md](./prompt-base-ia-sema.md)
|
|
109
|
+
- [fluxo-pratico-ia-sema.md](./fluxo-pratico-ia-sema.md)
|