@semacode/cli 1.2.11 → 1.2.17

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/dist/index.js CHANGED
@@ -97,21 +97,24 @@ Superficies que a IA deve enxergar como first-class:
97
97
 
98
98
  Nao improvise quando faltar contexto.
99
99
  `;
100
- const PROMPT_BASE_IA = `Voce esta trabalhando com Sema, um Protocolo de Governanca de Intencao orientado a contrato, desenhado para operacao por IA.
101
-
102
- Trate a Sema como camada semantica e linguagem de especificacao executavel feita para IA, nao para leitura humana confortavel. Nao invente sintaxe, palavras-chave ou blocos fora da gramatica e dos exemplos oficiais.
103
-
104
- Fontes de verdade, em ordem:
105
- 1. README do projeto
106
- 2. gramatica e documentacao de sintaxe da Sema
107
- 3. especificacao semantica da linguagem
108
- 4. exemplos oficiais, com prioridade para o vertical de pagamento
109
- 5. \`sema resumo\` e \`briefing.min.json\` quando a IA for pequena
110
- 6. AST, IR e diagnosticos exportados pela CLI em JSON quando a capacidade aguentar
111
-
112
- Regras de operacao:
113
- - preserve o significado semantico
114
- - use o formatador oficial da Sema como fonte unica de estilo
100
+ const PROMPT_BASE_IA = `Voce esta trabalhando com Sema, um Protocolo de Governanca de Intencao orientado a contrato, desenhado para operacao por IA.
101
+
102
+ Trate a Sema como camada semantica e linguagem de especificacao executavel feita para IA, nao para leitura humana confortavel. Nao invente sintaxe, palavras-chave ou blocos fora da gramatica e dos exemplos oficiais.
103
+
104
+ Fontes de verdade, em ordem:
105
+ 1. se o projeto expuser \`SEMA_CONTEXT.md\`, comece por ele
106
+ 2. \`SEMA_BRIEF.md\`
107
+ 3. \`SEMA_INDEX.json\`
108
+ 4. README do projeto
109
+ 5. gramatica e documentacao de sintaxe da Sema
110
+ 6. especificacao semantica da linguagem
111
+ 7. exemplos oficiais, com prioridade para o vertical de pagamento
112
+ 8. \`sema resumo\` e \`briefing.min.json\` quando a IA for pequena
113
+ 9. AST, IR e diagnosticos exportados pela CLI em JSON quando a capacidade aguentar
114
+
115
+ Regras de operacao:
116
+ - preserve o significado semantico
117
+ - use o formatador oficial da Sema como fonte unica de estilo
115
118
  - use diagnosticos estruturados como contrato de correcao
116
119
  - use a IR como fonte de verdade semantica quando houver duvida
117
120
  - nao conclua uma alteracao sem validar e verificar o modulo
@@ -766,6 +769,33 @@ function executarTestesGerados(alvo, baseSaida, arquivos, silencioso = false) {
766
769
  saidaErro: typeof execucao.stderr === "string" ? execucao.stderr : "",
767
770
  };
768
771
  }
772
+ function resolverConfiguracaoVerificacaoPorAlvo(alvo, configCarregada) {
773
+ const framework = resolverFrameworkPadrao(undefined, configCarregada);
774
+ const incompatibilidade = validarCompatibilidadeFramework(alvo, framework);
775
+ const estrutura = resolverEstruturaSaidaPadrao(undefined, framework, configCarregada);
776
+ return {
777
+ framework,
778
+ estrutura,
779
+ incompatibilidade,
780
+ };
781
+ }
782
+ function executarTestesParaVerificacao(alvo, baseSaida, arquivos, framework, silencioso = false) {
783
+ if (framework !== "base") {
784
+ return {
785
+ execucao: {
786
+ codigoSaida: 0,
787
+ quantidadeTestes: 0,
788
+ saidaPadrao: "",
789
+ saidaErro: "",
790
+ },
791
+ testesExecutados: false,
792
+ };
793
+ }
794
+ return {
795
+ execucao: executarTestesGerados(alvo, baseSaida, arquivos, silencioso),
796
+ testesExecutados: true,
797
+ };
798
+ }
769
799
  function nomeSubpastaModulo(caminhoArquivo) {
770
800
  return path.basename(caminhoArquivo, ".sema");
771
801
  }
@@ -3557,7 +3587,7 @@ function imprimirResumoVerificacao(resumos) {
3557
3587
  totalArquivos += alvo.arquivosGerados;
3558
3588
  totalTestes += alvo.quantidadeTestes;
3559
3589
  totalAlvos += 1;
3560
- console.log(` alvo=${alvo.alvo} status=${alvo.sucesso ? "ok" : "falhou"} arquivos=${alvo.arquivosGerados} testes=${alvo.quantidadeTestes} saida=${alvo.pastaSaida}`);
3590
+ console.log(` alvo=${alvo.alvo} framework=${alvo.framework} estrutura=${alvo.estrutura} status=${alvo.sucesso ? "ok" : "falhou"} arquivos=${alvo.arquivosGerados} testes=${alvo.quantidadeTestes}${alvo.testesExecutados ? "" : " (skip)"} saida=${alvo.pastaSaida}`);
3561
3591
  }
3562
3592
  }
3563
3593
  console.log(`Totais: modulos=${resumos.length} alvos=${totalAlvos} arquivos=${totalArquivos} testes=${totalTestes}`);
@@ -3571,6 +3601,15 @@ async function comandoVerificar(entrada, baseSaida, cwd = process.cwd()) {
3571
3601
  return 1;
3572
3602
  }
3573
3603
  const alvos = resolverAlvosVerificacao(contextoProjeto.configCarregada);
3604
+ const configuracoesAlvo = alvos.map((alvo) => ({
3605
+ alvo,
3606
+ ...resolverConfiguracaoVerificacaoPorAlvo(alvo, contextoProjeto.configCarregada),
3607
+ }));
3608
+ const incompatibilidade = configuracoesAlvo.find((item) => item.incompatibilidade);
3609
+ if (incompatibilidade?.incompatibilidade) {
3610
+ console.error(incompatibilidade.incompatibilidade);
3611
+ return 1;
3612
+ }
3574
3613
  const resumos = [];
3575
3614
  for (const modulo of modulos) {
3576
3615
  const ir = garantirIr(modulo.resultado, modulo.caminho);
@@ -3580,18 +3619,21 @@ async function comandoVerificar(entrada, baseSaida, cwd = process.cwd()) {
3580
3619
  arquivoFonte: modulo.caminho,
3581
3620
  alvos: [],
3582
3621
  };
3583
- for (const alvo of alvos) {
3622
+ for (const configuracaoAlvo of configuracoesAlvo) {
3623
+ const { alvo, framework, estrutura } = configuracaoAlvo;
3584
3624
  const pastaAlvo = path.join(baseSaida, alvo, nomeSubpastaModulo(modulo.caminho));
3585
- const framework = alvo === "typescript" ? "base" : alvo === "python" ? "base" : "base";
3586
- const arquivos = gerarArquivosPorAlvo(ir, alvo, framework);
3625
+ const arquivos = aplicarEstruturaSaida(gerarArquivosPorAlvo(ir, alvo, framework), ir, estrutura);
3587
3626
  await escreverArquivos(pastaAlvo, arquivos);
3588
- const execucao = executarTestesGerados(alvo, pastaAlvo, arquivos);
3627
+ const { execucao, testesExecutados } = executarTestesParaVerificacao(alvo, pastaAlvo, arquivos, framework);
3589
3628
  resumoModulo.alvos.push({
3590
3629
  alvo,
3591
3630
  arquivosGerados: arquivos.length,
3592
3631
  quantidadeTestes: execucao.quantidadeTestes,
3593
3632
  pastaSaida: pastaAlvo,
3594
3633
  sucesso: execucao.codigoSaida === 0,
3634
+ framework,
3635
+ estrutura,
3636
+ testesExecutados,
3595
3637
  });
3596
3638
  if (execucao.codigoSaida !== 0) {
3597
3639
  imprimirResumoVerificacao([...resumos, resumoModulo]);
@@ -3620,6 +3662,21 @@ async function comandoVerificarJson(entrada, baseSaida, cwd = process.cwd()) {
3620
3662
  return 1;
3621
3663
  }
3622
3664
  const alvos = resolverAlvosVerificacao(contextoProjeto.configCarregada);
3665
+ const configuracoesAlvo = alvos.map((alvo) => ({
3666
+ alvo,
3667
+ ...resolverConfiguracaoVerificacaoPorAlvo(alvo, contextoProjeto.configCarregada),
3668
+ }));
3669
+ const incompatibilidade = configuracoesAlvo.find((item) => item.incompatibilidade);
3670
+ if (incompatibilidade?.incompatibilidade) {
3671
+ console.log(JSON.stringify({
3672
+ comando: "verificar",
3673
+ sucesso: false,
3674
+ erro: incompatibilidade.incompatibilidade,
3675
+ modulos: [],
3676
+ totais: { modulos: 0, alvos: 0, arquivos: 0, testes: 0 },
3677
+ }, null, 2));
3678
+ return 1;
3679
+ }
3623
3680
  const resumos = [];
3624
3681
  let codigoSaida = 0;
3625
3682
  for (const modulo of modulos) {
@@ -3630,17 +3687,21 @@ async function comandoVerificarJson(entrada, baseSaida, cwd = process.cwd()) {
3630
3687
  alvos: [],
3631
3688
  saidaTestes: [],
3632
3689
  };
3633
- for (const alvo of alvos) {
3690
+ for (const configuracaoAlvo of configuracoesAlvo) {
3691
+ const { alvo, framework, estrutura } = configuracaoAlvo;
3634
3692
  const pastaAlvo = path.join(baseSaida, alvo, nomeSubpastaModulo(modulo.caminho));
3635
- const arquivos = gerarArquivosPorAlvo(ir, alvo, "base");
3693
+ const arquivos = aplicarEstruturaSaida(gerarArquivosPorAlvo(ir, alvo, framework), ir, estrutura);
3636
3694
  await escreverArquivos(pastaAlvo, arquivos);
3637
- const execucao = executarTestesGerados(alvo, pastaAlvo, arquivos, true);
3695
+ const { execucao, testesExecutados } = executarTestesParaVerificacao(alvo, pastaAlvo, arquivos, framework, true);
3638
3696
  resumoModulo.alvos.push({
3639
3697
  alvo,
3640
3698
  arquivosGerados: arquivos.length,
3641
3699
  quantidadeTestes: execucao.quantidadeTestes,
3642
3700
  pastaSaida: pastaAlvo,
3643
3701
  sucesso: execucao.codigoSaida === 0,
3702
+ framework,
3703
+ estrutura,
3704
+ testesExecutados,
3644
3705
  });
3645
3706
  resumoModulo.saidaTestes.push({ alvo, stdout: execucao.saidaPadrao, stderr: execucao.saidaErro });
3646
3707
  if (execucao.codigoSaida !== 0) {