@semacode/cli 1.5.54 → 2.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.
Files changed (63) hide show
  1. package/README.md +51 -7
  2. package/dist/agentContext.d.ts +1 -1
  3. package/dist/agentContext.js +3 -3
  4. package/dist/agentContextPack.js +33 -92
  5. package/dist/agentContextTipos.d.ts +6 -9
  6. package/dist/agentContextTipos.js +5 -4
  7. package/dist/agentEntryPoints.d.ts +22 -2
  8. package/dist/agentEntryPoints.js +232 -129
  9. package/dist/docs.part01.js +1 -1
  10. package/dist/docs.part02.js +21 -10
  11. package/dist/doctorCommand.d.ts +4 -4
  12. package/dist/doctorCommand.js +21 -10
  13. package/dist/exemplosOficiais.d.ts +10 -0
  14. package/dist/exemplosOficiais.js +32 -22
  15. package/dist/fsGovernado.js +8 -6
  16. package/dist/geracaoCore.js +49 -2
  17. package/dist/iaPrompts.d.ts +2 -2
  18. package/dist/iaPrompts.js +5 -5
  19. package/dist/index.part01.d.ts +1 -1
  20. package/dist/index.part01.js +9 -9
  21. package/dist/index.part02.js +1 -1
  22. package/dist/index.part03.d.ts +1 -0
  23. package/dist/index.part03.js +26 -12
  24. package/dist/index.part04.d.ts +1 -0
  25. package/dist/index.part04.js +49 -21
  26. package/dist/index.part05.js +1 -1
  27. package/dist/index.part06.d.ts +1 -1
  28. package/dist/index.part06.js +28 -19
  29. package/dist/index.part07.js +20 -20
  30. package/dist/index.part08.js +4 -8
  31. package/dist/initCommand.d.ts +3 -1
  32. package/dist/initCommand.js +41 -12
  33. package/dist/initTemplatesBase.js +9 -11
  34. package/dist/projetoConfig.js +1 -1
  35. package/dist/workspaceWrite.d.ts +22 -0
  36. package/dist/workspaceWrite.js +332 -0
  37. package/docs/README.md +10 -4
  38. package/docs/ai-integration.md +31 -12
  39. package/docs/ai-onboarding.md +43 -14
  40. package/docs/ai-workflow.md +23 -40
  41. package/docs/auth.md +13 -3
  42. package/docs/cli.md +21 -8
  43. package/docs/commands.md +10 -11
  44. package/docs/deploy.md +27 -4
  45. package/docs/documentation.md +2 -2
  46. package/docs/env.md +3 -1
  47. package/docs/getting-started.md +27 -3
  48. package/docs/repositories.md +18 -2
  49. package/docs/rollback.md +23 -5
  50. package/docs/security.md +8 -0
  51. package/docs/syntax.md +8 -9
  52. package/docs/testing.md +15 -4
  53. package/docs/vocabulary.md +2 -1
  54. package/node_modules/@sema/gerador-php/dist/index.d.ts +3 -0
  55. package/node_modules/@sema/gerador-php/dist/index.js +538 -0
  56. package/node_modules/@sema/gerador-php/dist/index.js.map +1 -0
  57. package/node_modules/@sema/gerador-php/package.json +7 -0
  58. package/node_modules/@sema/padroes/dist/index.d.ts +2 -1
  59. package/node_modules/@sema/padroes/dist/index.js +31 -0
  60. package/node_modules/@sema/padroes/dist/index.js.map +1 -1
  61. package/package.json +22 -12
  62. package/dist/billing/index.d.ts +0 -17
  63. package/dist/billing/index.js +0 -74
@@ -1,8 +1,9 @@
1
- // SEMA-GOVERNED: sema.governanca_ia_contexto
2
- // Descricao: CLI particionada; consulte contratos/sema/governanca_ia_contexto.sema antes de editar.
3
- import { mkdir, readFile, writeFile } from "node:fs/promises";
1
+ // SEMA-GOVERNED: sema.produto.governanca_ia.documentacao, sema.produto.escrita_segura_workspace
2
+ // Descricao: resolve e cria documentacao obrigatoria sem escapar do workspace nem gravar lotes parcialmente.
3
+ import { readFile } from "node:fs/promises";
4
4
  import path from "node:path";
5
5
  import { emitirDiagnosticosArquivosOrcamento } from "./driftOrcamento.js";
6
+ import { escreverArquivoWorkspaceSeguro, validarDestinosEscritaWorkspace, } from "./workspaceWrite.js";
6
7
  import { REGRAS_DOCUMENTACAO, adicionarDocsRaizExistentes, adicionarReadmesDeArquivos, caminhoEstaDentro, caminhoExiste, criarTemplateDoc, documentoPareceTemplateCriadoPelaSema, inferirCategorias, listarArquivosRecursivo, normalizarRelativo, normalizarTexto, resumoConteudo, termosRelacionamentoContratos } from "./docs.part01.js";
7
8
  export async function adicionarContratosRelacionados(baseProjeto, intencao, arquivosAlvo, registrar) {
8
9
  const pastaContratos = path.join(baseProjeto, "contratos");
@@ -55,17 +56,27 @@ export async function resolverDocumentacaoObrigatoria(opcoes) {
55
56
  }
56
57
  await adicionarReadmesDeArquivos(baseProjeto, arquivosAlvo, registrar);
57
58
  await adicionarContratosRelacionados(baseProjeto, intencao, arquivosAlvo, registrar);
58
- const leituraObrigatoria = [];
59
- for (const doc of docs) {
59
+ const documentosPreparados = await Promise.all(docs.map(async (doc) => {
60
60
  const caminho = path.resolve(baseProjeto, doc.relativo);
61
- let existe = await caminhoExiste(caminho);
61
+ return {
62
+ doc,
63
+ caminho,
64
+ existe: await caminhoExiste(caminho),
65
+ template: criarTemplateDoc(doc, intencao, categorias, arquivosAlvo),
66
+ };
67
+ }));
68
+ if (documentosPreparados.length > 0) {
69
+ await validarDestinosEscritaWorkspace(baseProjeto, documentosPreparados.map(({ doc }) => doc.relativo));
70
+ }
71
+ const leituraObrigatoria = [];
72
+ for (const preparado of documentosPreparados) {
73
+ const { doc, caminho, template } = preparado;
74
+ let existe = preparado.existe;
62
75
  let criado = false;
63
- const template = criarTemplateDoc(doc, intencao, categorias, arquivosAlvo);
64
76
  if (!existe && opcoes.criarAusentes && doc.permitirCriacao) {
65
- await mkdir(path.dirname(caminho), { recursive: true });
66
- await writeFile(caminho, template, "utf8");
77
+ const resultado = await escreverArquivoWorkspaceSeguro(baseProjeto, doc.relativo, template);
67
78
  existe = true;
68
- criado = true;
79
+ criado = resultado.status === "criado";
69
80
  }
70
81
  const item = {
71
82
  caminho,
@@ -9,7 +9,7 @@ interface DependenciaComandoDoctor {
9
9
  comando: string;
10
10
  itens: ItemDependenciaComando[];
11
11
  }
12
- interface PreflightVerificacao {
12
+ interface VerificacaoDependencias {
13
13
  ok: boolean;
14
14
  dependencias: DependenciaComandoDoctor[];
15
15
  faltando: Array<{
@@ -18,10 +18,10 @@ interface PreflightVerificacao {
18
18
  detalhe?: string;
19
19
  }>;
20
20
  }
21
- export declare function avaliarPreflightVerificacao(configuracoesAlvo: Array<{
21
+ export declare function avaliarDependenciasVerificacao(configuracoesAlvo: Array<{
22
22
  alvo: AlvoGeracao;
23
23
  framework: FrameworkGeracao;
24
- }>): PreflightVerificacao;
25
- export declare function imprimirPreflightVerificacao(preflight: PreflightVerificacao): void;
24
+ }>): VerificacaoDependencias;
25
+ export declare function imprimirFalhaDependenciasVerificacao(verificacao: VerificacaoDependencias): void;
26
26
  export declare function comandoDoctor(): Promise<number>;
27
27
  export {};
@@ -1,7 +1,7 @@
1
1
  // SEMA-GOVERNED
2
- // M?dulo: sema.produto.orcamento_semantico
3
- // Contrato: contratos/sema/orcamento_semantico.sema
4
- // Descri??o: comando doctor e preflight de depend?ncias externas por alvo de gera??o.
2
+ // Módulo: sema.produto.cli_toolchain_local
3
+ // Contrato: contratos/sema/cli_toolchain_local.sema
4
+ // Descrição: comando doctor e verificação local de dependências por alvo de geração.
5
5
  import { comandoDisponivel, resolverExecucaoPython, resolverExecucaoPytest, TSX_EXECUTOR_CLI, TSX_IMPORTADOR_CLI, } from "./execucoesExternas.js";
6
6
  function criarItemDependencia(nome, ok, detalhe, obrigatoria = true) {
7
7
  return { nome, ok, detalhe, obrigatoria };
@@ -14,8 +14,8 @@ function coletarDependenciasDoctor() {
14
14
  comando: "base",
15
15
  itens: [
16
16
  criarItemDependencia("node", comandoDisponivel("node"), "runtime principal da CLI"),
17
- criarItemDependencia("npm", comandoDisponivel("npm"), "instalacao, pack e publish"),
18
- criarItemDependencia("python", Boolean(python), python?.rotulo ? `resolvido via ${python.rotulo}` : "python ou py"),
17
+ criarItemDependencia("npm", comandoDisponivel("npm"), "instalacao, pack e publish", false),
18
+ criarItemDependencia("python", Boolean(python), python?.rotulo ? `resolvido via ${python.rotulo}` : "python ou py", false),
19
19
  criarItemDependencia("dotnet", comandoDisponivel("dotnet"), "ecosistema ASP.NET", false),
20
20
  criarItemDependencia("go", comandoDisponivel("go"), "ecosistema Go", false),
21
21
  criarItemDependencia("cargo", comandoDisponivel("cargo"), "ecosistema Rust", false),
@@ -53,6 +53,12 @@ function coletarDependenciasDoctor() {
53
53
  criarItemDependencia("lua", comandoDisponivel("lua", ["-v"]), "runner de testes Lua"),
54
54
  ],
55
55
  },
56
+ {
57
+ comando: "verificar/php",
58
+ itens: [
59
+ criarItemDependencia("php", comandoDisponivel("php", ["-v"]), "runner de testes PHP"),
60
+ ],
61
+ },
56
62
  ];
57
63
  }
58
64
  function renderizarCaixaAscii(linhas) {
@@ -64,7 +70,7 @@ function renderizarCaixaAscii(linhas) {
64
70
  borda,
65
71
  ].join("\n");
66
72
  }
67
- export function avaliarPreflightVerificacao(configuracoesAlvo) {
73
+ export function avaliarDependenciasVerificacao(configuracoesAlvo) {
68
74
  const dependencias = [];
69
75
  const faltando = [];
70
76
  const registrar = (comando, itens) => {
@@ -81,7 +87,6 @@ export function avaliarPreflightVerificacao(configuracoesAlvo) {
81
87
  };
82
88
  registrar("base", [
83
89
  criarItemDependencia("node", comandoDisponivel("node"), "runtime principal da CLI"),
84
- criarItemDependencia("npm", comandoDisponivel("npm"), "instalacao e empacotamento"),
85
90
  ]);
86
91
  for (const configuracao of configuracoesAlvo) {
87
92
  if (configuracao.framework !== "base") {
@@ -117,6 +122,12 @@ export function avaliarPreflightVerificacao(configuracoesAlvo) {
117
122
  registrar("verificar/lua", [
118
123
  criarItemDependencia("lua", comandoDisponivel("lua", ["-v"]), "runner de testes Lua"),
119
124
  ]);
125
+ continue;
126
+ }
127
+ if (configuracao.alvo === "php") {
128
+ registrar("verificar/php", [
129
+ criarItemDependencia("php", comandoDisponivel("php", ["-v"]), "runner de testes PHP"),
130
+ ]);
120
131
  }
121
132
  }
122
133
  return {
@@ -134,12 +145,12 @@ function imprimirDependenciasDoctor(dependencias) {
134
145
  }
135
146
  }
136
147
  }
137
- export function imprimirPreflightVerificacao(preflight) {
148
+ export function imprimirFalhaDependenciasVerificacao(verificacao) {
138
149
  console.error(renderizarCaixaAscii([
139
- "Preflight de verificacao falhou",
150
+ "Verificacao de dependencias falhou",
140
151
  "a CLI sabe o que falta antes de gerar e testar",
141
152
  ]));
142
- for (const item of preflight.faltando) {
153
+ for (const item of verificacao.faltando) {
143
154
  const detalhe = item.detalhe ? ` (${item.detalhe})` : "";
144
155
  console.error(`- ${item.comando}: ${item.nome} faltando${detalhe}`);
145
156
  }
@@ -4,7 +4,17 @@ export interface ResultadoMaterializacaoExemplos {
4
4
  destino: string;
5
5
  criados: string[];
6
6
  preservados: string[];
7
+ destinosExemplosPrevalidados: boolean;
7
8
  erro?: string;
8
9
  }
10
+ export interface PlanoExemplosOficiais {
11
+ origem: string | undefined;
12
+ arquivos: Array<{
13
+ nome: string;
14
+ origemArquivo: string;
15
+ caminhoRelativo: string;
16
+ }>;
17
+ }
9
18
  export declare function localizarDiretorioExemplosOficiais(): Promise<string | undefined>;
19
+ export declare function planejarExemplosOficiais(): Promise<PlanoExemplosOficiais>;
10
20
  export declare function materializarExemplosOficiais(baseProjeto?: string, preservarExistentes?: boolean): Promise<ResultadoMaterializacaoExemplos>;
@@ -1,13 +1,10 @@
1
- // SEMA-GOVERNED: sema.governanca_ia_contexto
2
- // Descricao: codigo governado pelo Sema; consulte contratos/sema/governanca_ia_contexto.sema antes de editar.
3
- // SEMA-GOVERNED
4
- // M?dulo: sema.produto.orcamento_semantico
5
- // Contrato: contratos/sema/orcamento_semantico.sema
6
- // Descricao: localiza??o e materializa??o dos exemplos oficiais sem depender de caminho local externo.
7
- import { mkdir, readFile, readdir, writeFile } from "node:fs/promises";
1
+ // SEMA-GOVERNED: sema.governanca_ia_contexto, sema.produto.escrita_segura_workspace
2
+ // Descrição: localiza e materializa exemplos oficiais sem sobrescrever ou escapar do workspace.
3
+ import { readFile, readdir } from "node:fs/promises";
8
4
  import path from "node:path";
9
5
  import { fileURLToPath } from "node:url";
10
- import { caminhoEhDiretorio, caminhoExiste } from "./fsGovernado.js";
6
+ import { caminhoEhDiretorio } from "./fsGovernado.js";
7
+ import { escreverArquivoWorkspaceSeguro, validarDestinosEscritaWorkspace, } from "./workspaceWrite.js";
11
8
  const DIRETORIO_CLI_ATUAL = path.dirname(fileURLToPath(import.meta.url));
12
9
  export async function localizarDiretorioExemplosOficiais() {
13
10
  const candidatos = [
@@ -21,8 +18,26 @@ export async function localizarDiretorioExemplosOficiais() {
21
18
  }
22
19
  return undefined;
23
20
  }
24
- export async function materializarExemplosOficiais(baseProjeto = process.cwd(), preservarExistentes = true) {
21
+ export async function planejarExemplosOficiais() {
25
22
  const origem = await localizarDiretorioExemplosOficiais();
23
+ if (!origem) {
24
+ return { origem: undefined, arquivos: [] };
25
+ }
26
+ const entradas = (await readdir(origem, { withFileTypes: true }))
27
+ .filter((entrada) => entrada.isFile() && entrada.name.endsWith(".sema"))
28
+ .sort((a, b) => a.name.localeCompare(b.name, "pt-BR"));
29
+ return {
30
+ origem,
31
+ arquivos: entradas.map((entrada) => ({
32
+ nome: entrada.name,
33
+ origemArquivo: path.join(origem, entrada.name),
34
+ caminhoRelativo: path.join("exemplos", entrada.name),
35
+ })),
36
+ };
37
+ }
38
+ export async function materializarExemplosOficiais(baseProjeto = process.cwd(), preservarExistentes = true) {
39
+ const plano = await planejarExemplosOficiais();
40
+ const origem = plano.origem;
26
41
  const destino = path.resolve(baseProjeto, "exemplos");
27
42
  if (!origem) {
28
43
  return {
@@ -31,26 +46,20 @@ export async function materializarExemplosOficiais(baseProjeto = process.cwd(),
31
46
  destino,
32
47
  criados: [],
33
48
  preservados: [],
49
+ destinosExemplosPrevalidados: false,
34
50
  erro: "Diretorio de exemplos oficiais nao foi encontrado no pacote da CLI.",
35
51
  };
36
52
  }
37
- await mkdir(destino, { recursive: true });
38
53
  const criados = [];
39
54
  const preservados = [];
40
- const entradas = await readdir(origem, { withFileTypes: true });
41
- for (const entrada of entradas.sort((a, b) => a.name.localeCompare(b.name, "pt-BR"))) {
42
- if (!entrada.isFile() || !entrada.name.endsWith(".sema")) {
43
- continue;
44
- }
45
- const origemArquivo = path.join(origem, entrada.name);
46
- const destinoArquivo = path.join(destino, entrada.name);
47
- const jaExiste = await caminhoExiste(destinoArquivo);
48
- if (jaExiste && preservarExistentes) {
49
- preservados.push(entrada.name);
55
+ await validarDestinosEscritaWorkspace(baseProjeto, plano.arquivos.map((arquivo) => arquivo.caminhoRelativo));
56
+ for (const arquivo of plano.arquivos) {
57
+ const resultado = await escreverArquivoWorkspaceSeguro(baseProjeto, arquivo.caminhoRelativo, await readFile(arquivo.origemArquivo, "utf8"), { sobrescrever: !preservarExistentes });
58
+ if (resultado.status === "preservado") {
59
+ preservados.push(arquivo.nome);
50
60
  continue;
51
61
  }
52
- await writeFile(destinoArquivo, await readFile(origemArquivo, "utf8"), "utf8");
53
- criados.push(entrada.name);
62
+ criados.push(arquivo.nome);
54
63
  }
55
64
  return {
56
65
  sucesso: true,
@@ -58,6 +67,7 @@ export async function materializarExemplosOficiais(baseProjeto = process.cwd(),
58
67
  destino,
59
68
  criados,
60
69
  preservados,
70
+ destinosExemplosPrevalidados: true,
61
71
  };
62
72
  }
63
73
  //# sourceMappingURL=exemplosOficiais.js.map
@@ -1,7 +1,8 @@
1
- // SEMA-GOVERNED: sema.produto.orcamento_semantico
2
- // Descricao: escrita governada de arquivos da CLI; consulte contratos/sema/orcamento_semantico.sema antes de editar.
3
- import { mkdir, stat, writeFile } from "node:fs/promises";
1
+ // SEMA-GOVERNED: sema.produto.orcamento_semantico, sema.produto.escrita_segura_workspace
2
+ // Descrição: escrita governada e contida no workspace; consulte os contratos aplicáveis antes de editar.
3
+ import { mkdir, stat } from "node:fs/promises";
4
4
  import path from "node:path";
5
+ import { escreverArquivoWorkspaceSeguro, validarDestinosEscritaWorkspace, } from "./workspaceWrite.js";
5
6
  import { avaliarOrcamentoArquivo, conteudoTemCabecalhoSemaGoverned, contarLinhasConteudo, exemploCabecalhoCodigoGovernado, LIMITE_BLOQUEIO_LINHAS_ORCAMENTO_SEMANTICO, tipoArquivoOrcamento, } from "./driftOrcamento.js";
6
7
  export async function caminhoExiste(caminhoAlvo) {
7
8
  try {
@@ -32,6 +33,7 @@ export async function escreverArquivos(base, arquivos, opcoes = {}) {
32
33
  artefatosGeradosAcimaDoLimite: [],
33
34
  };
34
35
  await mkdir(base, { recursive: true });
36
+ await validarDestinosEscritaWorkspace(base, arquivos.map((arquivo) => arquivo.caminhoRelativo));
35
37
  for (const arquivo of arquivos) {
36
38
  const deveInserirCabecalho = opcoes.inserirCabecalhoGovernado
37
39
  && tipoArquivoOrcamento(arquivo.caminhoRelativo) === "codigo"
@@ -59,9 +61,9 @@ export async function escreverArquivos(base, arquivos, opcoes = {}) {
59
61
  if (diagnosticoBloqueante) {
60
62
  throw new Error(diagnosticoBloqueante.mensagem);
61
63
  }
62
- const destino = path.join(base, arquivo.caminhoRelativo);
63
- await mkdir(path.dirname(destino), { recursive: true });
64
- await writeFile(destino, conteudo, "utf8");
64
+ await escreverArquivoWorkspaceSeguro(base, arquivo.caminhoRelativo, conteudo, {
65
+ sobrescrever: true,
66
+ });
65
67
  resultado.arquivosEscritos += 1;
66
68
  }
67
69
  return resultado;
@@ -13,6 +13,7 @@ import { gerarTypeScript } from "@sema/gerador-typescript";
13
13
  import { gerarJavaScript } from "@sema/gerador-javascript";
14
14
  import { gerarHtml } from "@sema/gerador-html";
15
15
  import { gerarCss } from "@sema/gerador-css";
16
+ import { gerarPhp } from "@sema/gerador-php";
16
17
  import { comandoDisponivel, resolverExecucaoPytest, TSX_EXECUTOR_CLI } from "./execucoesExternas.js";
17
18
  import { resolverEstruturaSaidaPadrao, resolverFrameworkPadrao, } from "./projeto.js";
18
19
  export function validarCompatibilidadeFramework(alvo, framework) {
@@ -25,7 +26,7 @@ export function validarCompatibilidadeFramework(alvo, framework) {
25
26
  if (framework === "fastapi" && alvo !== "python") {
26
27
  return `Framework "${framework}" so pode ser usado com o alvo python.`;
27
28
  }
28
- if (alvo === "dart" || alvo === "lua" || alvo === "javascript" || alvo === "html" || alvo === "css") {
29
+ if (alvo === "dart" || alvo === "lua" || alvo === "javascript" || alvo === "html" || alvo === "css" || alvo === "php") {
29
30
  return `Framework "${framework}" nao e suportado para o alvo ${alvo}.`;
30
31
  }
31
32
  return undefined;
@@ -147,6 +148,9 @@ export function gerarArquivosPorAlvo(ir, alvo, framework) {
147
148
  if (alvo === "css") {
148
149
  return gerarCss(ir);
149
150
  }
151
+ if (alvo === "php") {
152
+ return gerarPhp(ir);
153
+ }
150
154
  return gerarTypeScript(ir, { framework });
151
155
  }
152
156
  export function aplicarEstruturaSaida(arquivos, ir, estrutura) {
@@ -198,6 +202,13 @@ export function aplicarEstruturaSaida(arquivos, ir, estrutura) {
198
202
  else if (basename === `${nomeBaseAntigo}.css`) {
199
203
  novoBasename = `${nomeArquivo}.css`;
200
204
  }
205
+ else if (basename === `${nomeBaseAntigo}.php`) {
206
+ novoBasename = `${nomeArquivo}.php`;
207
+ }
208
+ else if (basename === `test_${nomeBaseAntigo}.php`) {
209
+ novoBasename = `test_${nomeArquivo}.php`;
210
+ conteudo = conteudo.replace(`/${nomeBaseAntigo}.php`, `/${nomeArquivo}.php`);
211
+ }
201
212
  return {
202
213
  caminhoRelativo: pastaModulo ? path.join(pastaModulo, novoBasename) : novoBasename,
203
214
  conteudo,
@@ -208,6 +219,13 @@ export function contarCasosDeTesteGerados(alvo, arquivos) {
208
219
  if (alvo === "dart" || alvo === "html" || alvo === "css") {
209
220
  return 0;
210
221
  }
222
+ if (alvo === "php") {
223
+ const arquivoTeste = arquivos.find((item) => path.basename(item.caminhoRelativo).startsWith("test_") && item.caminhoRelativo.endsWith(".php"));
224
+ if (!arquivoTeste) {
225
+ return 0;
226
+ }
227
+ return (arquivoTeste.conteudo.match(/\bfunction test_/g) ?? []).length;
228
+ }
211
229
  if (alvo === "lua") {
212
230
  const arquivoTeste = arquivos.find((item) => path.basename(item.caminhoRelativo).startsWith("test_") && item.caminhoRelativo.endsWith(".lua"));
213
231
  if (!arquivoTeste) {
@@ -239,7 +257,7 @@ export function executarTestesGerados(alvo, baseSaida, arquivos, silencioso = fa
239
257
  const quantidadeTestes = contarCasosDeTesteGerados(alvo, arquivos);
240
258
  if (quantidadeTestes === 0) {
241
259
  if (!silencioso) {
242
- const nomesAlvo = { typescript: "TypeScript", python: "Python", lua: "Lua", dart: "Dart", javascript: "JavaScript", html: "HTML", css: "CSS" };
260
+ const nomesAlvo = { typescript: "TypeScript", python: "Python", lua: "Lua", dart: "Dart", javascript: "JavaScript", html: "HTML", css: "CSS", php: "PHP" };
243
261
  console.log(`Nenhum teste ${nomesAlvo[alvo] ?? alvo} foi gerado.`);
244
262
  }
245
263
  return { codigoSaida: 0, quantidadeTestes, saidaPadrao: "", saidaErro: "" };
@@ -323,6 +341,35 @@ export function executarTestesGerados(alvo, baseSaida, arquivos, silencioso = fa
323
341
  saidaErro: typeof execucao.stderr === "string" ? execucao.stderr : "",
324
342
  };
325
343
  }
344
+ if (alvo === "php") {
345
+ const arquivoTeste = arquivos.find((item) => path.basename(item.caminhoRelativo).startsWith("test_") && item.caminhoRelativo.endsWith(".php"))?.caminhoRelativo;
346
+ if (!arquivoTeste) {
347
+ if (!silencioso) {
348
+ console.log("Nenhum teste PHP foi gerado.");
349
+ }
350
+ return { codigoSaida: 0, quantidadeTestes, saidaPadrao: "", saidaErro: "" };
351
+ }
352
+ if (!comandoDisponivel("php", ["-v"])) {
353
+ return {
354
+ codigoSaida: 1,
355
+ quantidadeTestes,
356
+ saidaPadrao: "",
357
+ saidaErro: "Nao foi possivel localizar o runner php para executar os testes gerados.",
358
+ };
359
+ }
360
+ const execucao = spawnSync("php", [arquivoTeste], {
361
+ stdio: silencioso ? "pipe" : "inherit",
362
+ cwd: baseSaida,
363
+ encoding: silencioso ? "utf8" : undefined,
364
+ shell: process.platform === "win32",
365
+ });
366
+ return {
367
+ codigoSaida: execucao.status ?? 1,
368
+ quantidadeTestes,
369
+ saidaPadrao: typeof execucao.stdout === "string" ? execucao.stdout : "",
370
+ saidaErro: typeof execucao.stderr === "string" ? execucao.stderr : "",
371
+ };
372
+ }
326
373
  const arquivoTeste = arquivos.find((item) => path.basename(item.caminhoRelativo).startsWith("test_"))?.caminhoRelativo;
327
374
  if (!arquivoTeste) {
328
375
  if (!silencioso) {
@@ -1,5 +1,5 @@
1
- export declare const STARTER_IA = "Voce esta trabalhando com Sema, um contrato semantico IA-first para agentes operarem software vivo em backend e front consumer.\n\nImportante:\n- a Sema se apresenta publicamente como protocolo e funciona tecnicamente como linguagem de intencao\n- a Sema e protocolo de governanca semantica desenhado para IA, nao para ergonomia humana\n- humanos sao autores/aprovadores; agentes sao os consumidores primarios do contrato\n- leitura humana e bonus toleravel, nao objetivo de produto\n- a Sema nao e gerador magico que deveria fazer tudo\n- a Sema modela contratos, estados, fluxos, erros, efeitos, garantias, vinculos e execucao\n- a Sema gera codigo e scaffolding real para TypeScript, Python, Dart, Lua, JavaScript, HTML e CSS\n- a Sema usa `importar` para bootstrap revisavel, nao para contrato final automatico\n- a Sema usa `impl` para ligar task a simbolo real do runtime\n- a Sema usa `vinculos` para ligar contrato a arquivo, simbolo, recurso e superficie real\n- a Sema usa `execucao` para explicitar timeout, retry, compensacao e criticidade\n- a Sema usa `drift` para medir diferenca entre contrato e codigo vivo com score, confianca e lacunas\n- a Sema usa `resumo` e `prompt-curto` para IA fraca, gratuita ou com pouco contexto\n- a Sema usa `contexto-ia` para gerar `ast.json`, `ir.json`, `drift.json`, `briefing.json` e artefatos compactos antes da edicao\n- timeout definido pelo agente nao e falha do Sema; aumente o timeout e tente de novo antes de concluir falha\n- a Sema pode servir de base para interfaces graficas elegantes e coerentes\n- a Sema gera artefatos HTML/CSS derivados, mas nao substitui sozinha uma interface completa de produto\n- trate a Sema como cerebro semantico da aplicacao, nao como gerador magico de front-end pronto\n- se a tarefa envolver UI, prefira pedir Sema + React + TypeScript ou Sema + arquitetura de front-end\n- evite pedir HTML unico solto quando a intencao for testar a Sema de verdade\n\nRegras:\n- nao invente sintaxe fora da gramatica e dos exemplos oficiais\n- antes de qualquer acao, crie, edite ou remova o contrato .sema aplicavel; isso vale para Software, Author, Workflow, Ops, Game, Legal e Research\n- se a IA for fraca, nao tente abrir tudo de uma vez\n- use `sema resumo` e `briefing.min.json` antes de subir para o pacote completo\n- se `sema resumo . --micro` estourar timeout local, repita com timeout maior ou escopo menor; nao avance com codigo\n- trate `ir --json` como fonte de verdade semantica\n- trate `briefing.json` como plano de intervencao antes de editar projeto vivo\n- trate `diagnosticos --json` como fonte de correcao\n- use `sema formatar` como fonte unica de estilo\n- preserve a intencao do contrato\n- nao cobre da Sema adivinhacao de negocio que nao esta no contrato nem no codigo\n\nComandos essenciais:\n- resumo compacto por capacidade: `sema resumo <arquivo-ou-pasta> [--micro|--curto|--medio] [--para <resumo|onboarding|review|mudanca|bug|arquitetura>]`\n- prompt curto para IA fraca: `sema prompt-curto <arquivo-ou-pasta> [--micro|--curto|--medio] [--para <resumo|onboarding|review|mudanca|bug|arquitetura>]`\n- descoberta do projeto: `sema inspecionar [arquivo-ou-pasta] --json`\n- auditoria do contrato vivo: `sema drift <arquivo-ou-pasta> [--escopo <arquivo|modulo|projeto>] [--json]`\n- mapa de impacto: `sema impacto <arquivo-ou-pasta> --alvo <token> [--mudanca <descricao>] [--json]`\n- renomeacao assistida: `sema renomear-semantico <arquivo-ou-pasta> --de <nome-atual> --para <nome-novo> [--json]`\n- contexto completo do modulo: `sema contexto-ia <arquivo.sema>`\n- estrutura sintatica: `sema ast <arquivo.sema> --json`\n- estrutura semantica: `sema ir <arquivo.sema> --json`\n- validacao: `sema validar <arquivo.sema> --json`\n- diagnosticos: `sema diagnosticos <arquivo.sema> --json`\n- formatacao: `sema formatar <arquivo.sema>`\n- importacao assistida de legado: `sema importar <nestjs|fastapi|flask|nextjs|nextjs-consumer|react-vite-consumer|angular-consumer|flutter-consumer|firebase|dotnet|java|go|rust|cpp|php|typescript|python|dart> <diretorio> --saida <diretorio>`\n- exemplos oficiais no projeto: `sema instalar-exemplos`\n- geracao de codigo: `sema compilar <arquivo-ou-pasta> --alvo <typescript|python|dart|lua|javascript|html|css> --saida <diretorio>`\n- verificacao final: `sema verificar <arquivo-ou-pasta> [--json]`\n\nAntes de editar:\n1. leia README, docs de IA e um exemplo oficial parecido\n2. se a IA for fraca, rode `sema resumo <arquivo> --micro` e leia `briefing.min.json`\n - se timeout local estourar, aumente o timeout e tente de novo; timeout nao significa Sema inativo\n3. se a IA aguentar mais, rode `sema drift` para medir impls, vinculos, rotas, score e lacunas\n4. se a tarefa for pesada, rode `sema contexto-ia` e leia `briefing.json`\n5. consulte AST e IR do modulo alvo so quando a capacidade realmente aguentar\n\nDepois de editar:\n1. rode `sema formatar`\n2. rode `sema validar --json`\n3. se houver falha, use `diagnosticos --json`\n4. rode `sema drift` de novo quando mexer em codigo vivo\n5. se a tarefa pedir codigo derivado, rode `sema compilar`\n6. feche com `sema verificar <arquivo-ou-pasta> --json`\n\nPriorize sempre:\n- exemplos oficiais\n- JSON da CLI\n- o menor artefato que resolva a tarefa da IA atual\n- score, confianca e lacunas do `drift`\n- `briefing.json` como guia de mudanca\n- consistencia semantica\n\nSuperficies que a IA deve enxergar como first-class:\n- `route`\n- `worker`\n- `evento`\n- `fila`\n- `cron`\n- `webhook`\n- `cache`\n- `storage`\n- `policy`\n\nNao improvise quando faltar contexto.\n";
2
- export declare const PROMPT_BASE_IA = "Voce esta trabalhando com Sema, um contrato semantico IA-first para agentes operarem software vivo.\n\nTrate a Sema como protocolo de governanca semantica e linguagem de intencao feita para IA, nao para leitura humana confortavel. Humanos escrevem e aprovam; agentes consomem. Nao invente sintaxe, palavras-chave ou blocos fora da gramatica e dos exemplos oficiais.\n\nFontes de verdade, em ordem:\n1. se o projeto expuser `SEMA_CONTEXT.md`, comece por ele\n2. `AGENT_CONTEXT_PACK.json`\n3. `SEMA_BRIEF.md`\n4. `SEMA_INDEX.json`\n5. `AGENTS.md`\n6. README do projeto\n7. gramatica e documentacao de sintaxe da Sema\n8. exemplos oficiais, com prioridade para o vertical de pagamento\n9. `sema resumo` e `briefing.min.json` quando a IA for fraca\n10. AST, IR e diagnosticos exportados pela CLI em JSON quando a capacidade aguentar\n\nRegras de operacao:\n- contrato vem antes da acao: crie, edite ou remova o .sema aplicavel antes de codigo, docs operacionais, texto Author, workflow, jogo, pesquisa, legal ou ops\n- preserve o significado semantico\n- use o formatador oficial da Sema como fonte unica de estilo\n- use diagnosticos estruturados como contrato de correcao\n- use a IR como fonte de verdade semantica quando houver duvida\n- use predicados canonicos como normalizacao opcional, preservando a forma original\n- nao conclua uma alteracao sem validar e verificar o modulo\n- comece pelo menor artefato semantico que resolva a tarefa\n\nAntes de editar `.sema`, entenda:\n- o module alvo\n- os contratos de task, route, error, effects, guarantees, state e flow\n- os exemplos oficiais relacionados\n\nDepois de editar `.sema`, execute este fluxo:\n1. formatar\n2. validar\n3. diagnosticar, se houver falha\n4. verificar\n\nSe houver conflito entre texto livre e IR/diagnosticos, priorize a IR e os diagnosticos da CLI.\n\nSe algo nao estiver claro, siga a forma ja usada nos exemplos oficiais. Nao improvise sem base.\n";
1
+ export declare const STARTER_IA = "Voce esta trabalhando com Sema, um contrato semantico IA-first para agentes operarem software vivo em backend e front consumer.\n\nImportante:\n- a Sema se apresenta publicamente como protocolo e funciona tecnicamente como linguagem de intencao\n- a Sema e protocolo de governanca semantica desenhado para IA, nao para ergonomia humana\n- humanos sao autores/aprovadores; agentes sao os consumidores primarios do contrato\n- leitura humana e bonus toleravel, nao objetivo de produto\n- a Sema nao e gerador magico que deveria fazer tudo\n- a Sema modela contratos, estados, fluxos, erros, efeitos, garantias, vinculos e execucao\n- a Sema gera codigo e scaffolding real para TypeScript, Python, PHP, Dart, Lua, JavaScript, HTML e CSS\n- a Sema usa `importar` para bootstrap revisavel, nao para contrato final automatico\n- a Sema usa `impl` para ligar task a simbolo real do runtime\n- a Sema usa `vinculos` para ligar contrato a arquivo, simbolo, recurso e superficie real\n- a Sema usa `execucao` para explicitar timeout, retry, compensacao e criticidade\n- a Sema usa `drift` para medir diferenca entre contrato e codigo vivo com score, confianca e lacunas\n- a Sema usa `resumo` e `prompt-curto` para IA fraca, gratuita ou com pouco contexto\n- a Sema usa `contexto-ia` para gerar `ast.json`, `ir.json`, `drift.json`, `briefing.json` e artefatos compactos antes da edicao\n- timeout definido pelo agente nao e falha do Sema; aumente o timeout e tente de novo antes de concluir falha\n- a Sema pode servir de base para interfaces graficas elegantes e coerentes\n- a Sema gera artefatos HTML/CSS derivados, mas nao substitui sozinha uma interface completa de produto\n- trate a Sema como cerebro semantico da aplicacao, nao como gerador magico de front-end pronto\n- se a tarefa envolver UI, prefira pedir Sema + React + TypeScript ou Sema + arquitetura de front-end\n- evite pedir HTML unico solto quando a intencao for testar a Sema de verdade\n\nRegras:\n- nao invente sintaxe fora da gramatica e dos exemplos oficiais\n- antes de qualquer acao, crie, edite ou remova o contrato .sema aplicavel; isso vale para Software, Author, Workflow, Ops, Game, Legal e Research\n- se a IA for fraca, nao tente abrir tudo de uma vez\n- use `sema resumo <arquivo> --micro --json` pelo stdout antes de subir para o pacote completo\n- se `sema resumo . --micro` estourar timeout local, repita com timeout maior ou escopo menor; nao avance com codigo\n- trate `ir --json` como fonte de verdade semantica\n- trate `briefing.json` como plano de intervencao antes de editar projeto vivo\n- trate `diagnosticos --json` como fonte de correcao\n- use `sema formatar` como fonte unica de estilo\n- preserve a intencao do contrato\n- nao cobre da Sema adivinhacao de negocio que nao esta no contrato nem no codigo\n\nComandos essenciais:\n- resumo compacto por capacidade: `sema resumo <arquivo-ou-pasta> [--micro|--curto|--medio] [--para <resumo|onboarding|review|mudanca|bug|arquitetura>]`\n- prompt curto para IA fraca: `sema prompt-curto <arquivo-ou-pasta> [--micro|--curto|--medio] [--para <resumo|onboarding|review|mudanca|bug|arquitetura>]`\n- descoberta do projeto: `sema inspecionar [arquivo-ou-pasta] --json`\n- auditoria do contrato vivo: `sema drift <arquivo-ou-pasta> [--escopo <arquivo|modulo|projeto>] [--json]`\n- mapa de impacto: `sema impacto <arquivo-ou-pasta> --alvo <token> [--mudanca <descricao>] [--json]`\n- renomeacao assistida: `sema renomear-semantico <arquivo-ou-pasta> --de <nome-atual> --para <nome-novo> [--json]`\n- contexto completo do modulo: `sema contexto-ia <arquivo.sema>`\n- estrutura sintatica: `sema ast <arquivo.sema> --json`\n- estrutura semantica: `sema ir <arquivo.sema> --json`\n- validacao: `sema validar <arquivo.sema> --json`\n- diagnosticos: `sema diagnosticos <arquivo.sema> --json`\n- formatacao: `sema formatar <arquivo.sema>`\n- importacao assistida de legado: `sema importar <nestjs|fastapi|flask|nextjs|nextjs-consumer|react-vite-consumer|angular-consumer|flutter-consumer|firebase|dotnet|java|go|rust|cpp|php|typescript|python|dart> <diretorio> --saida <diretorio>`\n- exemplos oficiais no projeto: `sema instalar-exemplos`\n- geracao de codigo: `sema compilar <arquivo-ou-pasta> --alvo <typescript|python|php|dart|lua|javascript|html|css> --saida <diretorio>`\n- verificacao final: `sema verificar <arquivo-ou-pasta> [--json]`\n\nAntes de editar:\n1. leia README, docs de IA e um exemplo oficial parecido\n2. se a IA for fraca, rode `sema resumo <arquivo> --micro --json` e use o stdout compacto\n - se timeout local estourar, aumente o timeout e tente de novo; timeout nao significa Sema inativo\n3. se a IA aguentar mais, rode `sema drift` para medir impls, vinculos, rotas, score e lacunas\n4. se a tarefa for pesada, rode `sema contexto-ia` e leia `briefing.json`\n5. consulte AST e IR do modulo alvo so quando a capacidade realmente aguentar\n\nDepois de editar:\n1. rode `sema formatar`\n2. rode `sema validar --json`\n3. se houver falha, use `diagnosticos --json`\n4. rode `sema drift` de novo quando mexer em codigo vivo\n5. se a tarefa pedir codigo derivado, rode `sema compilar`\n6. feche com `sema verificar <arquivo-ou-pasta> --json`\n\nPriorize sempre:\n- exemplos oficiais\n- JSON da CLI\n- o menor artefato que resolva a tarefa da IA atual\n- score, confianca e lacunas do `drift`\n- `briefing.json` como guia de mudanca\n- consistencia semantica\n\nSuperficies que a IA deve enxergar como first-class:\n- `route`\n- `worker`\n- `evento`\n- `fila`\n- `cron`\n- `webhook`\n- `cache`\n- `storage`\n- `policy`\n\nNao improvise quando faltar contexto.\n";
2
+ export declare const PROMPT_BASE_IA = "Voce esta trabalhando com Sema, um contrato semantico IA-first para agentes operarem software vivo.\n\nTrate a Sema como protocolo de governanca semantica e linguagem de intencao feita para IA, nao para leitura humana confortavel. Humanos escrevem e aprovam; agentes consomem. Nao invente sintaxe, palavras-chave ou blocos fora da gramatica e dos exemplos oficiais.\n\nFontes de verdade, em ordem:\n1. se o projeto expuser `SEMA_CONTEXT.md`, comece por ele\n2. `AGENT_CONTEXT_PACK.json`\n3. `SEMA_BRIEF.md`\n4. `SEMA_INDEX.json`\n5. `AGENTS.md`\n6. README do projeto\n7. gramatica e documentacao de sintaxe da Sema\n8. exemplos oficiais, com prioridade para o vertical de pagamento\n9. `sema resumo <arquivo> --micro --json` e o stdout compacto quando a IA for fraca\n10. AST, IR e diagnosticos exportados pela CLI em JSON quando a capacidade aguentar\n\nRegras de operacao:\n- contrato vem antes da acao: crie, edite ou remova o .sema aplicavel antes de codigo, docs operacionais, texto Author, workflow, jogo, pesquisa, legal ou ops\n- preserve o significado semantico\n- use o formatador oficial da Sema como fonte unica de estilo\n- use diagnosticos estruturados como contrato de correcao\n- use a IR como fonte de verdade semantica quando houver duvida\n- use predicados canonicos como normalizacao opcional, preservando a forma original\n- nao conclua uma alteracao sem validar e verificar o modulo\n- comece pelo menor artefato semantico que resolva a tarefa\n\nAntes de editar `.sema`, entenda:\n- o module alvo\n- os contratos de task, route, error, effects, guarantees, state e flow\n- os exemplos oficiais relacionados\n\nDepois de editar `.sema`, execute este fluxo:\n1. formatar\n2. validar\n3. diagnosticar, se houver falha\n4. verificar\n\nSe houver conflito entre texto livre e IR/diagnosticos, priorize a IR e os diagnosticos da CLI.\n\nSe algo nao estiver claro, siga a forma ja usada nos exemplos oficiais. Nao improvise sem base.\n";
3
3
  export declare const PROMPT_IA_UI = "Atue como Engenheiro de Software Senior e UX/UI Designer de elite.\n\nQuero que voce trabalhe com Sema como fonte de verdade semantica do sistema e com React + TypeScript como camada de interface.\n\nEntregue obrigatoriamente duas partes integradas:\n1. os arquivos `.sema` do dominio\n2. a proposta ou implementacao da interface em React + TypeScript\n\nRegras:\n- nao entregue apenas HTML solto em arquivo unico\n- nao trate a Sema como enfeite conceitual\n- a interface deve nascer do contrato semantico definido em Sema\n- use os exemplos oficiais da Sema como referencia de estilo e semantica\n- nao invente sintaxe fora da gramatica suportada\n\nA Sema deve modelar, quando fizer sentido:\n- `module`\n- `use`\n- `entity`\n- `enum`\n- `state`\n- `task`\n- `flow`\n- `route`\n- `effects`\n- `error`\n- `guarantees`\n- `tests`\n- `docs`\n\nA interface deve refletir visualmente:\n- `state` como status e progresso observavel\n- `flow` como etapas ou orquestracao visivel\n- `error` como falhas tratadas com clareza\n- `effects` como operacoes relevantes para usuario ou operacao\n- `guarantees` como confianca, confirmacao ou consistencia final\n\nEstruture a entrega assim:\n1. visao do produto\n2. dominio modelado em Sema\n3. arquitetura de pastas em React + TypeScript\n4. componentes principais\n5. estrategia visual\n6. codigo principal da interface\n7. explicacao curta de como a UI conversa com a semantica da Sema\n\nSe a tarefa envolver app visual, a Sema governa o significado e o React renderiza a experiencia. Nao atropele essa separacao.\n";
4
4
  export declare const PROMPT_IA_REACT = "Crie uma solucao com Sema + React + TypeScript.\n\nRegras principais:\n- a Sema deve ser a fonte de verdade semantica do dominio\n- React + TypeScript deve ser a camada de interface e experiencia\n- nao entregue HTML unico solto\n- nao trate a Sema como enfeite\n\nEntregue obrigatoriamente:\n1. arquivos `.sema` do dominio\n2. arquitetura de pastas do frontend\n3. componentes React principais\n4. contratos e tipos derivados da semantica\n5. interface elegante e implementavel\n\nA modelagem Sema deve cobrir, quando fizer sentido:\n- `entity`\n- `enum`\n- `state`\n- `task`\n- `flow`\n- `route`\n- `effects`\n- `error`\n- `guarantees`\n- `tests`\n\nA interface React deve tornar visiveis:\n- estado atual e transicoes relevantes\n- fluxo operacional\n- erros publicos\n- efeitos operacionais importantes\n- garantias ou confirmacoes finais\n\nEstruture a entrega assim:\n1. visao do produto\n2. arquivos `.sema`\n3. arquitetura React + TypeScript\n4. componentes e telas\n5. codigo principal\n6. explicacao de como a UI deriva da semantica da Sema\n\nSe houver duvida, siga os exemplos oficiais e mantenha a separacao:\n- Sema governa o significado\n- React governa a apresentacao\n";
5
5
  export declare const PROMPT_IA_SEMA_PRIMEIRO = "Quero que voce trabalhe no modo \"Sema primeiro\".\n\nRegra principal:\n- modele primeiro o dominio em arquivos `.sema`\n- se a intencao mudar, crie, edite ou remova o contrato antes de qualquer acao operacional\n- so depois proponha ou gere codigo de aplicacao derivado disso\n\nFluxo obrigatorio:\n1. entender o dominio pedido\n2. modelar o contrato em Sema\n3. validar coerencia entre `task`, `route`, `state`, `flow`, `error`, `effects` e `guarantees`\n4. so depois gerar TypeScript, Python, React ou outra camada de implementacao\n\nNao entregue apenas codigo de interface ou codigo imperativo direto sem antes entregar a camada semantica.\n\nA modelagem em Sema deve:\n- preservar a intencao do dominio\n- explicitar entradas, saidas, erros, efeitos e garantias\n- usar apenas blocos e sintaxe oficiais\n- incluir testes embutidos quando fizer sentido\n\nSe houver interface grafica:\n- entregue a modelagem Sema primeiro\n- depois explique como a interface deve refletir a semantica\n- se gerar UI, use React + TypeScript em vez de HTML unico solto\n\nSe houver backend:\n- entregue a modelagem Sema primeiro\n- depois gere a borda publica e a implementacao derivada\n\nNao pule a etapa semantica. A camada `.sema` e a ancora principal da solucao.\n";
package/dist/iaPrompts.js CHANGED
@@ -11,7 +11,7 @@ Importante:
11
11
  - leitura humana e bonus toleravel, nao objetivo de produto
12
12
  - a Sema nao e gerador magico que deveria fazer tudo
13
13
  - a Sema modela contratos, estados, fluxos, erros, efeitos, garantias, vinculos e execucao
14
- - a Sema gera codigo e scaffolding real para TypeScript, Python, Dart, Lua, JavaScript, HTML e CSS
14
+ - a Sema gera codigo e scaffolding real para TypeScript, Python, PHP, Dart, Lua, JavaScript, HTML e CSS
15
15
  - a Sema usa \`importar\` para bootstrap revisavel, nao para contrato final automatico
16
16
  - a Sema usa \`impl\` para ligar task a simbolo real do runtime
17
17
  - a Sema usa \`vinculos\` para ligar contrato a arquivo, simbolo, recurso e superficie real
@@ -30,7 +30,7 @@ Regras:
30
30
  - nao invente sintaxe fora da gramatica e dos exemplos oficiais
31
31
  - antes de qualquer acao, crie, edite ou remova o contrato .sema aplicavel; isso vale para Software, Author, Workflow, Ops, Game, Legal e Research
32
32
  - se a IA for fraca, nao tente abrir tudo de uma vez
33
- - use \`sema resumo\` e \`briefing.min.json\` antes de subir para o pacote completo
33
+ - use \`sema resumo <arquivo> --micro --json\` pelo stdout antes de subir para o pacote completo
34
34
  - se \`sema resumo . --micro\` estourar timeout local, repita com timeout maior ou escopo menor; nao avance com codigo
35
35
  - trate \`ir --json\` como fonte de verdade semantica
36
36
  - trate \`briefing.json\` como plano de intervencao antes de editar projeto vivo
@@ -54,12 +54,12 @@ Comandos essenciais:
54
54
  - formatacao: \`sema formatar <arquivo.sema>\`
55
55
  - importacao assistida de legado: \`sema importar <nestjs|fastapi|flask|nextjs|nextjs-consumer|react-vite-consumer|angular-consumer|flutter-consumer|firebase|dotnet|java|go|rust|cpp|php|typescript|python|dart> <diretorio> --saida <diretorio>\`
56
56
  - exemplos oficiais no projeto: \`sema instalar-exemplos\`
57
- - geracao de codigo: \`sema compilar <arquivo-ou-pasta> --alvo <typescript|python|dart|lua|javascript|html|css> --saida <diretorio>\`
57
+ - geracao de codigo: \`sema compilar <arquivo-ou-pasta> --alvo <typescript|python|php|dart|lua|javascript|html|css> --saida <diretorio>\`
58
58
  - verificacao final: \`sema verificar <arquivo-ou-pasta> [--json]\`
59
59
 
60
60
  Antes de editar:
61
61
  1. leia README, docs de IA e um exemplo oficial parecido
62
- 2. se a IA for fraca, rode \`sema resumo <arquivo> --micro\` e leia \`briefing.min.json\`
62
+ 2. se a IA for fraca, rode \`sema resumo <arquivo> --micro --json\` e use o stdout compacto
63
63
  - se timeout local estourar, aumente o timeout e tente de novo; timeout nao significa Sema inativo
64
64
  3. se a IA aguentar mais, rode \`sema drift\` para medir impls, vinculos, rotas, score e lacunas
65
65
  4. se a tarefa for pesada, rode \`sema contexto-ia\` e leia \`briefing.json\`
@@ -107,7 +107,7 @@ Fontes de verdade, em ordem:
107
107
  6. README do projeto
108
108
  7. gramatica e documentacao de sintaxe da Sema
109
109
  8. exemplos oficiais, com prioridade para o vertical de pagamento
110
- 9. \`sema resumo\` e \`briefing.min.json\` quando a IA for fraca
110
+ 9. \`sema resumo <arquivo> --micro --json\` e o stdout compacto quando a IA for fraca
111
111
  10. AST, IR e diagnosticos exportados pela CLI em JSON quando a capacidade aguentar
112
112
 
113
113
  Regras de operacao:
@@ -2,7 +2,7 @@ import { compilarCodigo, type IrModulo } from "@sema/nucleo";
2
2
  import { analisarDriftLegado, type OpcoesDriftLegado } from "./drift.js";
3
3
  import { type GuiaCapacidadeIaMap } from './agentContextTipos.js';
4
4
  import { criarBriefingAgente, resumirDriftPorModulo } from "./index.part03.js";
5
- export type Comando = "iniciar" | "init" | "dev" | "sync" | "author" | "profile" | "validar" | "ast" | "ir" | "compilar" | "gerar" | "testar" | "diagnosticos" | "verificar" | "inspecionar" | "drift" | "impacto" | "renomear-semantico" | "importar" | "doctor" | "formatar" | "ajuda-ia" | "starter-ia" | "sync-ai-entrypoints" | "instalar-exemplos" | "preflight" | "rule-packs" | "docs-impacto" | "finalizar-mudanca" | "resumo" | "prompt-curto" | "prompt-ia" | "prompt-ia-ui" | "prompt-ia-react" | "prompt-ia-sema-primeiro" | "exemplos-prompt-ia" | "contexto-ia";
5
+ export type Comando = "iniciar" | "init" | "dev" | "sync" | "author" | "profile" | "validar" | "ast" | "ir" | "compilar" | "gerar" | "testar" | "diagnosticos" | "verificar" | "inspecionar" | "drift" | "impacto" | "renomear-semantico" | "importar" | "doctor" | "formatar" | "ajuda-ia" | "starter-ia" | "sync-codex" | "instalar-exemplos" | "rule-packs" | "docs-impacto" | "finalizar-mudanca" | "resumo" | "prompt-curto" | "prompt-ia" | "prompt-ia-ui" | "prompt-ia-react" | "prompt-ia-sema-primeiro" | "exemplos-prompt-ia" | "contexto-ia";
6
6
  export interface ResultadoFormatacaoArquivo {
7
7
  caminho: string;
8
8
  alterado: boolean;
@@ -34,9 +34,10 @@ export function ajuda() {
34
34
  "",
35
35
  renderizarSecaoAscii("Fluxos rápidos", [
36
36
  "[1] Projeto novo / produção inicial",
37
- "sema iniciar --template <base|nestjs|fastapi|nextjs-api|nextjs-consumer|react-vite-consumer|angular-consumer|flutter-consumer>",
37
+ "sema iniciar --template <base|nestjs|fastapi|nextjs-api|nextjs-consumer|react-vite-consumer|angular-consumer|flutter-consumer> [--force]",
38
+ "Arquivos existentes sao preservados; use --force somente para sobrescrita explicita.",
38
39
  "sema validar contratos/<modulo>.sema --json",
39
- "sema compilar <arquivo-ou-pasta> --alvo <typescript|python|dart|lua|javascript|html|css> --saida <diretorio>",
40
+ "sema compilar <arquivo-ou-pasta> --alvo <typescript|python|php|dart|lua|javascript|html|css> --saida <diretorio>",
40
41
  "sema verificar <arquivo-ou-pasta> --json",
41
42
  "",
42
43
  "[2] Editar projeto que já usa Sema",
@@ -73,9 +74,9 @@ export function ajuda() {
73
74
  ]),
74
75
  "",
75
76
  renderizarSecaoAscii("IA por capacidade", [
76
- "fraca: sema resumo --micro + briefing.min.json + prompt-curto.txt",
77
- "média: sema resumo --curto + drift.json + briefing.min.json",
78
- "forte: sema contexto-ia + briefing.json + ir.json + ast.json",
77
+ "fraca: sema resumo <arquivo> --micro --json (stdout compacto)",
78
+ "média: sema resumo <arquivo> --curto --json + sema drift <arquivo> --json",
79
+ "forte: sema contexto-ia <arquivo.sema> --saida <diretorio> --json",
79
80
  ]),
80
81
  "",
81
82
  renderizarSecaoAscii("Comandos principais", [
@@ -86,8 +87,8 @@ export function ajuda() {
86
87
  "importação: sema importar <nestjs|fastapi|flask|nextjs|nextjs-consumer|react-vite-consumer|angular-consumer|flutter-consumer|firebase|dotnet|java|go|rust|cpp|php|typescript|python|dart> <diretorio> [--saida <diretorio>] [--namespace <base>] [--json]",
87
88
  "validação: sema validar <arquivo-ou-pasta> [--json]",
88
89
  "diagnóstico: sema diagnosticos <arquivo.sema> [--json]",
89
- "geração: sema compilar <arquivo-ou-pasta> --alvo <typescript|python|dart|lua|javascript|html|css> --saida <diretorio> [--estrutura <flat|modulos|backend>] [--framework <base|nestjs|fastapi>]",
90
- "teste local: sema testar <arquivo.sema> --alvo <typescript|python|dart|lua|javascript|html|css> --saida <diretorio-temporario> [--estrutura <flat|modulos|backend>] [--framework <base|nestjs|fastapi>]",
90
+ "geração: sema compilar <arquivo-ou-pasta> --alvo <typescript|python|php|dart|lua|javascript|html|css> --saida <diretorio> [--estrutura <flat|modulos|backend>] [--framework <base|nestjs|fastapi>]",
91
+ "teste local: sema testar <arquivo.sema> --alvo <typescript|python|php|dart|lua|javascript|html|css> --saida <diretorio-temporario> [--estrutura <flat|modulos|backend>] [--framework <base|nestjs|fastapi>]",
91
92
  "verificação final: sema verificar <arquivo-ou-pasta> [--saida <diretorio-base>] [--json]",
92
93
  "formatação: sema formatar <arquivo-ou-pasta> [--check] [--json]",
93
94
  "author: sema author <iniciar|validar|briefing|revisar-cliches|validar-narrativa|validar-proibicoes> [arquivo] [--tema-sensivel] [--preset conto|romance|roteiro|lore|campanha] [--saida <arquivo>] [--texto <texto>] [--json]",
@@ -107,9 +108,8 @@ export function ajuda() {
107
108
  "sema prompt-ia-sema-primeiro",
108
109
  "sema exemplos-prompt-ia",
109
110
  "sema contexto-ia <arquivo.sema> [--saida <diretorio>] [--json]",
110
- "sema sync-ai-entrypoints [--json]",
111
+ "sema sync-codex [--json]",
111
112
  "sema instalar-exemplos [--json]",
112
- "sema preflight [comando] [--operation-code <codigo>] [--json]",
113
113
  "sema docs-impacto --intencao <acao> [--arquivo <caminho>] [--criar-ausentes] [--json]",
114
114
  "sema finalizar-mudanca --intencao <acao> [--arquivo <caminho>] [--doc-lida <caminho>] [--json]",
115
115
  "sema author briefing <arquivo.sema> [--json]",
@@ -331,7 +331,7 @@ Regras:
331
331
  - não invente sintaxe nem bloco fora da gramática oficial
332
332
  - preserve a intenção do contrato
333
333
  - use este resumo como fonte compacta inicial
334
- - se a tarefa pedir mais contexto, suba para \`briefing.min.json\`, \`drift.json\` e depois \`ir.json\`
334
+ - se a tarefa pedir mais contexto, rode \`sema contexto-ia <arquivo.sema> --saida <diretorio> --json\` e então abra \`briefing.min.json\`, \`drift.json\` e \`ir.json\` nessa saída
335
335
  - não saia editando software vivo sem olhar risco, lacuna e checks sugeridos
336
336
  - se abrir código com \`SEMA-GOVERNED\`, volte ao contrato e chame Sema antes de editar
337
337
  - não crie nem conclua código governado acima de ${LIMITE_BLOQUEIO_LINHAS_CODIGO_GOVERNADO} linhas; acima de ${LIMITE_AVISO_LINHAS_CODIGO_GOVERNADO}, planeje divisão; documentação Markdown não entra nesse limite de código
@@ -53,6 +53,7 @@ export declare function criarBriefingAgente(arquivo: string, modulo: string, ir:
53
53
  testesMinimos: string[];
54
54
  };
55
55
  export declare function carregarContextoModuloIa(arquivoEntrada: string): Promise<PacoteContextoModuloIa>;
56
+ export declare const ARQUIVOS_RESUMO_MODULO_IA: readonly ["SEMA_BOOT.md", "SEMA_SMALL_MODEL.md", "agent-context-pack.json", "resumo.micro.txt", "resumo.curto.txt", "resumo.md", "briefing.min.json", "prompt-curto.txt"];
56
57
  export declare function gerarArquivosResumoModuloIa(contexto: PacoteContextoModuloIa, pastaBase: string): Promise<{
57
58
  artefatosCompactos: string[];
58
59
  guiaPorCapacidade: GuiaCapacidadeIaMap;