@semacode/cli 1.5.32 → 1.5.35

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 (31) hide show
  1. package/AGENTS.md +18 -2
  2. package/AGENT_CONTEXT_PACK.json +213 -46
  3. package/SEMA_BRIEF.curto.txt +8 -6
  4. package/SEMA_BRIEF.md +42 -19
  5. package/SEMA_BRIEF.micro.txt +7 -5
  6. package/SEMA_INDEX.json +848 -234
  7. package/dist/docs.js +72 -5
  8. package/dist/docs.js.map +1 -1
  9. package/dist/index.js +634 -153
  10. package/dist/index.js.map +1 -1
  11. package/docs/AGENT_STARTER.md +10 -8
  12. package/docs/agentes-por-capacidade.md +61 -0
  13. package/docs/env.md +3 -3
  14. package/docs/fluxo-pratico-ia-sema.md +17 -5
  15. package/docs/integracao-com-ia.md +14 -0
  16. package/docs/mcp.md +6 -0
  17. package/node_modules/@sema/gerador-css/dist/index.js +15 -7
  18. package/node_modules/@sema/gerador-css/dist/index.js.map +1 -1
  19. package/node_modules/@sema/gerador-dart/dist/index.js +11 -1
  20. package/node_modules/@sema/gerador-dart/dist/index.js.map +1 -1
  21. package/node_modules/@sema/gerador-html/dist/index.js +19 -7
  22. package/node_modules/@sema/gerador-html/dist/index.js.map +1 -1
  23. package/node_modules/@sema/gerador-javascript/dist/index.js +16 -2
  24. package/node_modules/@sema/gerador-javascript/dist/index.js.map +1 -1
  25. package/node_modules/@sema/gerador-lua/dist/index.js +19 -6
  26. package/node_modules/@sema/gerador-lua/dist/index.js.map +1 -1
  27. package/node_modules/@sema/gerador-python/dist/index.js +25 -8
  28. package/node_modules/@sema/gerador-python/dist/index.js.map +1 -1
  29. package/node_modules/@sema/gerador-typescript/dist/index.js +32 -14
  30. package/node_modules/@sema/gerador-typescript/dist/index.js.map +1 -1
  31. package/package.json +10 -10
package/dist/index.js CHANGED
@@ -36,9 +36,10 @@ Importante:
36
36
  - a Sema usa \`vinculos\` para ligar contrato a arquivo, simbolo, recurso e superficie real
37
37
  - a Sema usa \`execucao\` para explicitar timeout, retry, compensacao e criticidade
38
38
  - a Sema usa \`drift\` para medir diferenca entre contrato e codigo vivo com score, confianca e lacunas
39
- - a Sema usa \`resumo\` e \`prompt-curto\` para IA pequena ou gratuita
40
- - a Sema usa \`contexto-ia\` para gerar \`ast.json\`, \`ir.json\`, \`drift.json\`, \`briefing.json\` e artefatos compactos antes da edicao
41
- - a Sema pode servir de base para interfaces graficas elegantes e coerentes
39
+ - a Sema usa \`resumo\` e \`prompt-curto\` para IA fraca, gratuita ou com pouco contexto
40
+ - a Sema usa \`contexto-ia\` para gerar \`ast.json\`, \`ir.json\`, \`drift.json\`, \`briefing.json\` e artefatos compactos antes da edicao
41
+ - timeout definido pelo agente nao e falha do Sema; aumente o timeout e tente de novo antes de concluir falha
42
+ - a Sema pode servir de base para interfaces graficas elegantes e coerentes
42
43
  - a Sema nao gera uma interface completa sozinha no estado atual
43
44
  - trate a Sema como cerebro semantico da aplicacao, nao como gerador magico de front-end pronto
44
45
  - se a tarefa envolver UI, prefira pedir Sema + React + TypeScript ou Sema + arquitetura de front-end
@@ -47,9 +48,10 @@ Importante:
47
48
  Regras:
48
49
  - nao invente sintaxe fora da gramatica e dos exemplos oficiais
49
50
  - antes de qualquer acao, crie, edite ou remova o contrato .sema aplicavel; isso vale para Software, Author, Workflow, Ops, Game, Legal e Research
50
- - se a IA for pequena, nao tente abrir tudo de uma vez
51
- - use \`sema resumo\` e \`briefing.min.json\` antes de subir para o pacote completo
52
- - trate \`ir --json\` como fonte de verdade semantica
51
+ - se a IA for fraca, nao tente abrir tudo de uma vez
52
+ - use \`sema resumo\` e \`briefing.min.json\` antes de subir para o pacote completo
53
+ - se \`sema resumo . --micro\` estourar timeout local, repita com timeout maior ou escopo menor; nao avance com codigo
54
+ - trate \`ir --json\` como fonte de verdade semantica
53
55
  - trate \`briefing.json\` como plano de intervencao antes de editar projeto vivo
54
56
  - trate \`diagnosticos --json\` como fonte de correcao
55
57
  - use \`sema formatar\` como fonte unica de estilo
@@ -58,7 +60,7 @@ Regras:
58
60
 
59
61
  Comandos essenciais:
60
62
  - resumo compacto por capacidade: \`sema resumo <arquivo-ou-pasta> [--micro|--curto|--medio] [--para <resumo|onboarding|review|mudanca|bug|arquitetura>]\`
61
- - prompt curto para IA pequena: \`sema prompt-curto <arquivo-ou-pasta> [--micro|--curto|--medio] [--para <resumo|onboarding|review|mudanca|bug|arquitetura>]\`
63
+ - prompt curto para IA fraca: \`sema prompt-curto <arquivo-ou-pasta> [--micro|--curto|--medio] [--para <resumo|onboarding|review|mudanca|bug|arquitetura>]\`
62
64
  - descoberta do projeto: \`sema inspecionar [arquivo-ou-pasta] --json\`
63
65
  - auditoria do contrato vivo: \`sema drift <arquivo-ou-pasta> [--escopo <arquivo|modulo|projeto>] [--json]\`
64
66
  - mapa de impacto: \`sema impacto <arquivo-ou-pasta> --alvo <token> [--mudanca <descricao>] [--json]\`
@@ -74,10 +76,11 @@ Comandos essenciais:
74
76
  - geracao de codigo: \`sema compilar <arquivo-ou-pasta> --alvo <typescript|python|dart|lua> --saida <diretorio>\`
75
77
  - verificacao final: \`sema verificar <arquivo-ou-pasta> [--json]\`
76
78
 
77
- Antes de editar:
78
- 1. leia README, docs de IA e um exemplo oficial parecido
79
- 2. se a IA for pequena, rode \`sema resumo <arquivo> --micro\` e leia \`briefing.min.json\`
80
- 3. se a IA aguentar mais, rode \`sema drift\` para medir impls, vinculos, rotas, score e lacunas
79
+ Antes de editar:
80
+ 1. leia README, docs de IA e um exemplo oficial parecido
81
+ 2. se a IA for fraca, rode \`sema resumo <arquivo> --micro\` e leia \`briefing.min.json\`
82
+ - se timeout local estourar, aumente o timeout e tente de novo; timeout nao significa Sema inativo
83
+ 3. se a IA aguentar mais, rode \`sema drift\` para medir impls, vinculos, rotas, score e lacunas
81
84
  4. se a tarefa for pesada, rode \`sema contexto-ia\` e leia \`briefing.json\`
82
85
  5. consulte AST e IR do modulo alvo so quando a capacidade realmente aguentar
83
86
 
@@ -123,7 +126,7 @@ Fontes de verdade, em ordem:
123
126
  6. README do projeto
124
127
  7. gramatica e documentacao de sintaxe da Sema
125
128
  8. exemplos oficiais, com prioridade para o vertical de pagamento
126
- 9. \`sema resumo\` e \`briefing.min.json\` quando a IA for pequena
129
+ 9. \`sema resumo\` e \`briefing.min.json\` quando a IA for fraca
127
130
  10. AST, IR e diagnosticos exportados pela CLI em JSON quando a capacidade aguentar
128
131
 
129
132
  Regras de operacao:
@@ -334,17 +337,30 @@ Comandos uteis da CLI para esse fluxo:
334
337
  const DIRETORIO_CLI_ATUAL = path.dirname(fileURLToPath(import.meta.url));
335
338
  const VERSAO_CLI = pacoteCli.version;
336
339
  const requireRuntimeCli = createRequire(import.meta.url);
340
+ const ARQUIVO_SEMA_BOOT = "SEMA_BOOT.md";
341
+ const ARQUIVO_SEMA_SMALL_MODEL = "SEMA_SMALL_MODEL.md";
337
342
  const ARQUIVO_AGENT_CONTEXT_PACK = "AGENT_CONTEXT_PACK.json";
343
+ const ARQUIVO_DOC_AGENTES_CAPACIDADE = "docs/agentes-por-capacidade.md";
338
344
  const ARQUIVOS_CANONICOS_IA_RAIZ = [
345
+ ARQUIVO_SEMA_BOOT,
339
346
  "llms.txt",
340
347
  ARQUIVO_AGENT_CONTEXT_PACK,
348
+ ARQUIVO_SEMA_SMALL_MODEL,
341
349
  "SEMA_BRIEF.md",
342
350
  "SEMA_INDEX.json",
343
351
  "AGENTS.md",
344
352
  "README.md",
345
353
  "llms-full.txt",
346
354
  ];
355
+ const CAPACIDADES_IA_OPERACIONAIS = ["fraca", "media", "forte"];
356
+ const ALIASES_CAPACIDADE_IA = {
357
+ pequena: "fraca",
358
+ grande: "forte",
359
+ };
360
+ const MARCADOR_SEMA_AGENT_ENTRYPOINT_INICIO = "<!-- sema:agent-entrypoint:start -->";
361
+ const MARCADOR_SEMA_AGENT_ENTRYPOINT_FIM = "<!-- sema:agent-entrypoint:end -->";
347
362
  const DOCUMENTOS_SUPORTE_IA = [
363
+ ARQUIVO_DOC_AGENTES_CAPACIDADE,
348
364
  "docs/AGENT_STARTER.md",
349
365
  "docs/integracao-com-ia.md",
350
366
  "docs/fluxo-pratico-ia-sema.md",
@@ -465,18 +481,18 @@ function ajuda() {
465
481
  return [
466
482
  renderizarCaixaAscii([
467
483
  `Sema CLI v${VERSAO_CLI}`,
468
- "IA-first para contrato, geracao e adocao incremental",
469
- "novo projeto, edicao guiada e legado sem contrato inicial",
484
+ "IA-first para contrato, geração e adoção incremental",
485
+ "novo projeto, edição guiada e legado sem contrato inicial",
470
486
  ]),
471
487
  "",
472
- renderizarSecaoAscii("Fluxos rapidos", [
473
- "[1] Projeto novo / producao inicial",
488
+ renderizarSecaoAscii("Fluxos rápidos", [
489
+ "[1] Projeto novo / produção inicial",
474
490
  "sema iniciar --template <base|nestjs|fastapi|nextjs-api|nextjs-consumer|react-vite-consumer|angular-consumer|flutter-consumer>",
475
491
  "sema validar contratos/<modulo>.sema --json",
476
492
  "sema compilar <arquivo-ou-pasta> --alvo <typescript|python|dart|lua> --saida <diretorio>",
477
493
  "sema verificar <arquivo-ou-pasta> --json",
478
494
  "",
479
- "[2] Editar projeto que ja usa Sema",
495
+ "[2] Editar projeto que usa Sema",
480
496
  "sema inspecionar . --json",
481
497
  "sema resumo <arquivo-ou-pasta> --micro --para mudanca",
482
498
  "sema drift <arquivo-ou-pasta> --escopo modulo --json",
@@ -492,7 +508,7 @@ function ajuda() {
492
508
  "sema author validar-narrativa contratos/author.sema --texto <texto> --texto-anterior <texto> --json",
493
509
  "sema author validar-proibicoes contratos/author.sema --texto <texto> --json",
494
510
  "",
495
- "[4] Validar profiles semanticos",
511
+ "[4] Validar profiles semânticos",
496
512
  "sema profile validar workflow contratos/sema/workflow_ops.sema --maturidade production --preset webhook --artefato-arquivo workflow.md --json",
497
513
  "sema profile validar ops contratos/sema/workflow_ops.sema --maturidade critical --preset deploy --artefato-arquivo runbook.md --json",
498
514
  "sema profile validar game contratos/sema/game.sema --maturidade prototype --preset playtest --artefato-arquivo playtest.md --json",
@@ -500,7 +516,7 @@ function ajuda() {
500
516
  "sema profile capabilities --json",
501
517
  "sema rule-packs --profile legal --json",
502
518
  "",
503
- "[5] Adotar Sema em projeto que ainda nao usa",
519
+ "[5] Adotar Sema em projeto que ainda não usa",
504
520
  "sema importar <fonte> <diretorio> --saida <diretorio> --json",
505
521
  "sema formatar <arquivo-ou-pasta>",
506
522
  "sema validar <arquivo-ou-pasta> --json",
@@ -508,23 +524,23 @@ function ajuda() {
508
524
  ]),
509
525
  "",
510
526
  renderizarSecaoAscii("IA por capacidade", [
511
- "pequena: sema resumo --micro + briefing.min.json + prompt-curto.txt",
512
- "media: sema resumo --curto + drift.json + briefing.min.json",
513
- "grande: sema contexto-ia + briefing.json + ir.json + ast.json",
527
+ "fraca: sema resumo --micro + briefing.min.json + prompt-curto.txt",
528
+ "média: sema resumo --curto + drift.json + briefing.min.json",
529
+ "forte: sema contexto-ia + briefing.json + ir.json + ast.json",
514
530
  ]),
515
531
  "",
516
532
  renderizarSecaoAscii("Comandos principais", [
517
533
  "descoberta: sema inspecionar [arquivo-ou-pasta] [--json]",
518
534
  "auditoria: sema drift <arquivo-ou-pasta> [--escopo <arquivo|modulo|projeto>] [--incluir-worktrees] [--incluir-consumidores-laterais] [--json]",
519
535
  "impacto: sema impacto <arquivo-ou-pasta> --alvo <token> [--mudanca <descricao>] [--escopo <arquivo|modulo|projeto>] [--json]",
520
- "renomeacao: sema renomear-semantico <arquivo-ou-pasta> --de <nome-atual> --para <nome-novo> [--escopo <arquivo|modulo|projeto>] [--json]",
521
- "importacao: sema importar <nestjs|fastapi|flask|nextjs|nextjs-consumer|react-vite-consumer|angular-consumer|flutter-consumer|firebase|dotnet|java|go|rust|cpp|typescript|python|dart> <diretorio> [--saida <diretorio>] [--namespace <base>] [--json]",
522
- "validacao: sema validar <arquivo-ou-pasta> [--json]",
523
- "diagnostico: sema diagnosticos <arquivo.sema> [--json]",
524
- "geracao: sema compilar <arquivo-ou-pasta> --alvo <python|typescript|dart|lua> --saida <diretorio> [--estrutura <flat|modulos|backend>] [--framework <base|nestjs|fastapi>]",
536
+ "renomeação: sema renomear-semantico <arquivo-ou-pasta> --de <nome-atual> --para <nome-novo> [--escopo <arquivo|modulo|projeto>] [--json]",
537
+ "importação: sema importar <nestjs|fastapi|flask|nextjs|nextjs-consumer|react-vite-consumer|angular-consumer|flutter-consumer|firebase|dotnet|java|go|rust|cpp|typescript|python|dart> <diretorio> [--saida <diretorio>] [--namespace <base>] [--json]",
538
+ "validação: sema validar <arquivo-ou-pasta> [--json]",
539
+ "diagnóstico: sema diagnosticos <arquivo.sema> [--json]",
540
+ "geração: sema compilar <arquivo-ou-pasta> --alvo <python|typescript|dart|lua> --saida <diretorio> [--estrutura <flat|modulos|backend>] [--framework <base|nestjs|fastapi>]",
525
541
  "teste local: sema testar <arquivo.sema> --alvo <python|typescript|dart|lua> --saida <diretorio-temporario> [--estrutura <flat|modulos|backend>] [--framework <base|nestjs|fastapi>]",
526
- "verificacao final: sema verificar <arquivo-ou-pasta> [--saida <diretorio-base>] [--json]",
527
- "formatacao: sema formatar <arquivo-ou-pasta> [--check] [--json]",
542
+ "verificação final: sema verificar <arquivo-ou-pasta> [--saida <diretorio-base>] [--json]",
543
+ "formatação: sema formatar <arquivo-ou-pasta> [--check] [--json]",
528
544
  "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]",
529
545
  "profile: sema profile validar <software|workflow|ops|game|legal|research|conversas> <arquivo-ou-pasta> [--maturidade draft|prototype|production|critical] [--preset <preset>] [--artefato <texto>|--artefato-arquivo <arquivo>] [--json]",
530
546
  "capabilities: sema profile capabilities [--json]",
@@ -573,6 +589,52 @@ async function escreverArquivos(base, arquivos) {
573
589
  await writeFile(destino, arquivo.conteudo, "utf8");
574
590
  }
575
591
  }
592
+ async function statSeguro(caminho) {
593
+ try {
594
+ return await stat(caminho);
595
+ }
596
+ catch {
597
+ return null;
598
+ }
599
+ }
600
+ function pareceEntradaSemaLegada(conteudo) {
601
+ return /Sema.*Regras obrigat[oó]rias para IA/is.test(conteudo) ||
602
+ /Sema.*Regras obrigatorias para IA/is.test(conteudo) ||
603
+ /Sema.*Regras obrigatórias para IA/is.test(conteudo);
604
+ }
605
+ function montarBlocoGerenciadoSema(conteudo) {
606
+ return `${MARCADOR_SEMA_AGENT_ENTRYPOINT_INICIO}\n${conteudo.trim()}\n${MARCADOR_SEMA_AGENT_ENTRYPOINT_FIM}\n`;
607
+ }
608
+ async function escreverArquivoGerenciadoSema(caminho, conteudo, substituirLegadoSema = false) {
609
+ const bloco = montarBlocoGerenciadoSema(conteudo);
610
+ const atual = await statSeguro(caminho);
611
+ if (!atual) {
612
+ await mkdir(path.dirname(caminho), { recursive: true });
613
+ await writeFile(caminho, bloco, "utf8");
614
+ return "criado";
615
+ }
616
+ if (!atual.isFile()) {
617
+ return "preservado";
618
+ }
619
+ const textoAtual = await readFile(caminho, "utf8");
620
+ let proximo;
621
+ if (textoAtual.includes(MARCADOR_SEMA_AGENT_ENTRYPOINT_INICIO) && textoAtual.includes(MARCADOR_SEMA_AGENT_ENTRYPOINT_FIM)) {
622
+ const inicio = textoAtual.indexOf(MARCADOR_SEMA_AGENT_ENTRYPOINT_INICIO);
623
+ const fim = textoAtual.indexOf(MARCADOR_SEMA_AGENT_ENTRYPOINT_FIM, inicio) + MARCADOR_SEMA_AGENT_ENTRYPOINT_FIM.length;
624
+ proximo = `${textoAtual.slice(0, inicio)}${bloco.trimEnd()}${textoAtual.slice(fim)}`;
625
+ }
626
+ else if (substituirLegadoSema && pareceEntradaSemaLegada(textoAtual)) {
627
+ proximo = bloco;
628
+ }
629
+ else {
630
+ proximo = `${bloco}\n${textoAtual.trimStart()}`;
631
+ }
632
+ if (proximo === textoAtual) {
633
+ return "preservado";
634
+ }
635
+ await writeFile(caminho, proximo.endsWith("\n") ? proximo : `${proximo}\n`, "utf8");
636
+ return "atualizado";
637
+ }
576
638
  function obterOpcao(args, nome, padrao) {
577
639
  const nomes = [nome, ...Object.entries(ALIAS_OPCOES).filter(([, v]) => v === nome).map(([k]) => k)];
578
640
  for (const n of nomes) {
@@ -1481,81 +1543,191 @@ function descreverFazModulo(ir, modulo) {
1481
1543
  : `governa o modulo ${normalizarIdentificadorResumo(modulo)}`;
1482
1544
  }
1483
1545
  function criarGuiaCapacidadeIa() {
1546
+ const fraca = {
1547
+ descricao: "IA fraca, gratuita, local pequena ou com disciplina baixa. Leia o boot card, pare cedo e chame Sema antes de agir.",
1548
+ artefatos: [ARQUIVO_SEMA_BOOT, ARQUIVO_SEMA_SMALL_MODEL, "agent-context-pack.json", "resumo.micro.txt", "briefing.min.json", "prompt-curto.txt"],
1549
+ ordemLeitura: [ARQUIVO_SEMA_BOOT, ARQUIVO_SEMA_SMALL_MODEL, "agent-context-pack.json", "resumo.micro.txt", "briefing.min.json", "resumo.curto.txt"],
1550
+ evitar: ["ast.json", "ir.json", "diagnosticos.json"],
1551
+ };
1552
+ const media = {
1553
+ descricao: "IA média. Aguenta boot, resumo expandido, briefing mínimo, drift e documentação curta.",
1554
+ artefatos: [ARQUIVO_SEMA_BOOT, "agent-context-pack.json", "resumo.curto.txt", "briefing.min.json", "drift.json", "prompt-curto.txt"],
1555
+ ordemLeitura: [ARQUIVO_SEMA_BOOT, "agent-context-pack.json", "resumo.curto.txt", "briefing.min.json", "drift.json", "resumo.md"],
1556
+ evitar: ["ast.json"],
1557
+ };
1558
+ const forte = {
1559
+ descricao: "IA forte, com tool use bom e contexto grande. Pode consumir o pacote completo, mas ainda deve começar pelo boot e pelos gates Sema.",
1560
+ artefatos: [ARQUIVO_SEMA_BOOT, "agent-context-pack.json", "README.md", "resumo.md", "briefing.json", "drift.json", "ir.json", "ast.json"],
1561
+ ordemLeitura: [ARQUIVO_SEMA_BOOT, "agent-context-pack.json", "README.md", "resumo.md", "briefing.json", "drift.json", "ir.json", "ast.json"],
1562
+ evitar: [],
1563
+ };
1484
1564
  return {
1485
- pequena: {
1486
- descricao: "IA gratuita ou com contexto curto. Leia so o cartao semantico e o briefing minimo.",
1487
- artefatos: ["agent-context-pack.json", "resumo.micro.txt", "briefing.min.json", "prompt-curto.txt"],
1488
- ordemLeitura: ["agent-context-pack.json", "resumo.micro.txt", "briefing.min.json", "resumo.curto.txt"],
1489
- evitar: ["ast.json", "ir.json", "diagnosticos.json"],
1565
+ fraca,
1566
+ pequena: fraca,
1567
+ media,
1568
+ forte,
1569
+ grande: forte,
1570
+ };
1571
+ }
1572
+ function criarPoliticaIdiomaAgentContext() {
1573
+ return {
1574
+ regra: "A linguagem humana da resposta deve seguir o idioma do usuário e preservar acentos, cedilha, pontuação e símbolos esperados. A DSL .sema pode ter palavras-chave ASCII; isso não autoriza PT-BR sem acentos.",
1575
+ idiomaHumanoPadrao: "pt-BR quando a conversa ou o projeto estiverem em português; caso contrário, use o idioma falado pelo usuário.",
1576
+ preservarAcentos: true,
1577
+ separarDslDeTextoHumano: true,
1578
+ comandosESimbolos: "Não traduza comandos, nomes de arquivos, rotas, símbolos de código ou palavras-chave da DSL.",
1579
+ };
1580
+ }
1581
+ function criarPoliticaCodigoGovernadoAgentContext() {
1582
+ return {
1583
+ marcador: "SEMA-GOVERNED",
1584
+ regra: "Arquivos de código gerados ou governados pela Sema devem manter um cabeçalho curto com módulo de origem, lembrete para consultar o contrato .sema e descrição humana no idioma do usuário.",
1585
+ descricaoHumana: "O comentário deve orientar humanos e IAs sem duplicar o contrato inteiro dentro do código.",
1586
+ porCapacidade: {
1587
+ fraca: "Se abrir código com SEMA-GOVERNED, pare, leia SEMA_SMALL_MODEL.md e chame Sema antes de editar.",
1588
+ media: "Se abrir código com SEMA-GOVERNED, rode docs-impacto e drift antes de alterar comportamento.",
1589
+ forte: "Se abrir código com SEMA-GOVERNED, pode inspecionar AST/IR e código completo, mas mantém contrato primeiro, drift e finalizar-mudanca.",
1490
1590
  },
1491
- media: {
1492
- descricao: "IA com contexto medio. Aguenta resumo expandido, briefing minimo e drift.",
1493
- artefatos: ["agent-context-pack.json", "resumo.curto.txt", "briefing.min.json", "drift.json", "prompt-curto.txt"],
1494
- ordemLeitura: ["agent-context-pack.json", "resumo.curto.txt", "briefing.min.json", "drift.json", "resumo.md"],
1495
- evitar: ["ast.json"],
1591
+ formatosPorAlvo: {
1592
+ typescript: "// SEMA-GOVERNED",
1593
+ javascript: "// SEMA-GOVERNED",
1594
+ python: "# SEMA-GOVERNED",
1595
+ dart: "// SEMA-GOVERNED",
1596
+ lua: "-- SEMA-GOVERNED",
1597
+ html: "<!-- SEMA-GOVERNED -->",
1598
+ css: "/* SEMA-GOVERNED */",
1496
1599
  },
1497
- grande: {
1498
- descricao: "IA com contexto grande ou tool use. Pode consumir o pacote completo.",
1499
- artefatos: ["agent-context-pack.json", "README.md", "resumo.md", "briefing.json", "drift.json", "ir.json", "ast.json"],
1500
- ordemLeitura: ["agent-context-pack.json", "README.md", "resumo.md", "briefing.json", "drift.json", "ir.json", "ast.json"],
1501
- evitar: [],
1600
+ };
1601
+ }
1602
+ function criarPoliticaTimeoutResumoAgentContext() {
1603
+ return {
1604
+ regra: "Timeout definido pelo agente não é falha do Sema. Se `sema resumo`, `inspecionar`, `drift` ou `sync-ai-entrypoints` estourar por timeout local, aumente o timeout e tente de novo com escopo menor quando possível.",
1605
+ timeoutInicialSegundos: 120,
1606
+ escalonamentoSegundos: [120, 300, 600],
1607
+ timeoutDoAgenteNaoEhFalhaSema: true,
1608
+ ateQuandoTentar: "Tente de novo com timeouts maiores enquanto houver execução disponível; se o ambiente impedir continuar, pare bloqueado e não avance com código sem Sema.",
1609
+ porCapacidade: {
1610
+ fraca: "Se `resumo . --micro` estourar, tente `resumo <arquivo.sema> --micro`, depois repita com timeout maior. Timeout não autoriza editar.",
1611
+ media: "Prefira resumo escopado; se um gate Sema estourar, aumente timeout e repita antes de concluir falha.",
1612
+ forte: "Pode rodar projeto inteiro com timeout alto, mas deve distinguir lentidão de falha real e registrar evidência.",
1502
1613
  },
1503
1614
  };
1504
1615
  }
1616
+ function criarEntrypointsClientesIa() {
1617
+ return [
1618
+ {
1619
+ cliente: "copilot",
1620
+ arquivos: [".github/copilot-instructions.md", "AGENTS.md", ARQUIVO_SEMA_BOOT],
1621
+ capacidadePadrao: "media",
1622
+ observacao: "VS Code/Copilot deve receber uma instrução curta e repetida no arquivo próprio, sem depender só do AGENTS.md.",
1623
+ },
1624
+ {
1625
+ cliente: "cline",
1626
+ arquivos: [".clinerules/00-sema.md", ".clinerules", ARQUIVO_SEMA_BOOT],
1627
+ capacidadePadrao: "fraca",
1628
+ observacao: "Cline costuma obedecer melhor quando o gate Sema vem em arquivo curto; se .clinerules for arquivo legado, o Sema atualiza esse fallback.",
1629
+ },
1630
+ {
1631
+ cliente: "roo",
1632
+ arquivos: [".roo/rules/00-sema.md", "AGENTS.md", ARQUIVO_SEMA_BOOT],
1633
+ capacidadePadrao: "fraca",
1634
+ observacao: "Roo Code deve começar por uma regra dedicada em .roo/rules antes de abrir arquivos longos.",
1635
+ },
1636
+ {
1637
+ cliente: "opencode",
1638
+ arquivos: [".opencode/instructions.md", "AGENTS.md", ARQUIVO_SEMA_BOOT],
1639
+ capacidadePadrao: "media",
1640
+ observacao: "OpenCode deve receber a mesma regra curta em instructions.md quando a pasta .opencode já existir.",
1641
+ },
1642
+ {
1643
+ cliente: "generico",
1644
+ arquivos: [ARQUIVO_SEMA_BOOT, ARQUIVO_SEMA_SMALL_MODEL, ARQUIVO_AGENT_CONTEXT_PACK],
1645
+ capacidadePadrao: "fraca",
1646
+ observacao: "Qualquer agente sem integração específica começa pelo boot card e só sobe contexto se passar pelos gates.",
1647
+ },
1648
+ ];
1649
+ }
1650
+ function criarFailClosedAgentContext() {
1651
+ return [
1652
+ "Se não conseguir chamar Sema, pare e declare bloqueio em vez de editar código ou contrato.",
1653
+ "Se não houver contrato aplicável, crie ou edite o .sema antes do código.",
1654
+ "Se o MCP remoto não tiver projeto sincronizado, use sema_chat_contexto e sema_sync/conteúdo inline; não peça para ler C:\\GitHub\\Sema.",
1655
+ "Se for criar ou corrigir .sema, use sema_exemplos antes de escrever sintaxe.",
1656
+ "Se a resposta humana estiver em PT-BR, preserve acentos e símbolos mesmo que a DSL use ASCII.",
1657
+ "Se um arquivo de código tiver SEMA-GOVERNED, consulte Sema e o contrato aplicável antes de editar.",
1658
+ "Se uma chamada Sema estourar por timeout local, aumente o timeout e tente de novo; timeout do agente não libera ação sem Sema.",
1659
+ ];
1660
+ }
1505
1661
  function criarAgentContextPack(guiaPorCapacidade) {
1506
1662
  const fontes = [
1507
1663
  {
1508
- caminho: "llms.txt",
1664
+ caminho: ARQUIVO_SEMA_BOOT,
1509
1665
  tipo: "entrypoint",
1510
1666
  prioridade: 1,
1511
1667
  obrigatorio: true,
1668
+ quandoUsar: "sempre no primeiro contato de qualquer agente com o projeto",
1669
+ incluirTextoBrutoQuando: "a IA precisa de um boot curto, fail-closed e independente do tamanho de contexto",
1670
+ },
1671
+ {
1672
+ caminho: ARQUIVO_SEMA_SMALL_MODEL,
1673
+ tipo: "entrypoint",
1674
+ prioridade: 2,
1675
+ obrigatorio: true,
1676
+ quandoUsar: "IA fraca, Copilot, modelo local pequeno, Cline/Roo com pouco contexto ou tarefa curta",
1677
+ incluirTextoBrutoQuando: "a IA tende a ignorar instruções longas ou copiar a estética ASCII da DSL",
1678
+ },
1679
+ {
1680
+ caminho: "llms.txt",
1681
+ tipo: "entrypoint",
1682
+ prioridade: 3,
1683
+ obrigatorio: true,
1512
1684
  quandoUsar: "sempre no primeiro contato com o projeto",
1513
- incluirTextoBrutoQuando: "a IA precisa de orientacao compacta para operar o repositorio",
1685
+ incluirTextoBrutoQuando: "a IA precisa de orientação compacta para operar o repositório",
1514
1686
  },
1515
1687
  {
1516
1688
  caminho: ARQUIVO_AGENT_CONTEXT_PACK,
1517
1689
  tipo: "entrypoint",
1518
- prioridade: 2,
1690
+ prioridade: 4,
1519
1691
  obrigatorio: true,
1520
1692
  quandoUsar: "sempre antes de decidir quais documentos ou exemplos abrir",
1521
- incluirTextoBrutoQuando: "a IA precisa auditar regras, proibicoes, prioridades e fontes de verdade",
1693
+ incluirTextoBrutoQuando: "a IA precisa auditar regras, proibições, prioridades e fontes de verdade",
1522
1694
  },
1523
1695
  {
1524
1696
  caminho: "SEMA_BRIEF.micro.txt",
1525
1697
  tipo: "resumo",
1526
- prioridade: 3,
1698
+ prioridade: 5,
1527
1699
  obrigatorio: true,
1528
- quandoUsar: "IA pequena, onboarding, chat remoto ou primeiro triage",
1700
+ quandoUsar: "IA fraca, onboarding, chat remoto ou primeiro triage",
1529
1701
  incluirTextoBrutoQuando: "a tarefa cabe em contexto curto",
1530
1702
  },
1531
1703
  {
1532
1704
  caminho: "SEMA_BRIEF.curto.txt",
1533
1705
  tipo: "resumo",
1534
- prioridade: 4,
1706
+ prioridade: 6,
1535
1707
  obrigatorio: true,
1536
- quandoUsar: "IA media, mudanca pequena ou review rapido",
1537
- incluirTextoBrutoQuando: "o modulo alvo ainda nao esta claro pelo micro",
1708
+ quandoUsar: "IA média, mudança pequena ou review rápido",
1709
+ incluirTextoBrutoQuando: "o módulo alvo ainda não está claro pelo micro",
1538
1710
  },
1539
1711
  {
1540
1712
  caminho: "SEMA_INDEX.json",
1541
1713
  tipo: "indice",
1542
- prioridade: 5,
1714
+ prioridade: 7,
1543
1715
  obrigatorio: true,
1544
- quandoUsar: "antes de abrir codigo cru ou escolher contrato alvo",
1545
- incluirTextoBrutoQuando: "a IA precisa mapear modulos, lacunas, riscos ou arquivos provaveis",
1716
+ quandoUsar: "antes de abrir código cru ou escolher contrato alvo",
1717
+ incluirTextoBrutoQuando: "a IA precisa mapear módulos, lacunas, riscos ou arquivos prováveis",
1546
1718
  },
1547
1719
  {
1548
1720
  caminho: "AGENTS.md",
1549
1721
  tipo: "operacional",
1550
- prioridade: 6,
1722
+ prioridade: 8,
1551
1723
  obrigatorio: true,
1552
- quandoUsar: "antes de editar codigo, contrato, docs operacionais, release ou deploy",
1553
- incluirTextoBrutoQuando: "a IA precisa confirmar regras locais obrigatorias e prioridades do projeto",
1724
+ quandoUsar: "antes de editar código, contrato, docs operacionais, release ou deploy",
1725
+ incluirTextoBrutoQuando: "a IA precisa confirmar regras locais obrigatórias e prioridades do projeto",
1554
1726
  },
1555
1727
  {
1556
1728
  caminho: "exemplos/",
1557
1729
  tipo: "exemplos",
1558
- prioridade: 7,
1730
+ prioridade: 9,
1559
1731
  obrigatorio: true,
1560
1732
  quandoUsar: "antes de criar ou corrigir arquivo .sema, profile, Author, workflow, ops, game, legal ou research",
1561
1733
  incluirTextoBrutoQuando: "a IA vai escrever sintaxe Sema ou comparar um contrato com formato oficial",
@@ -1563,72 +1735,318 @@ function criarAgentContextPack(guiaPorCapacidade) {
1563
1735
  {
1564
1736
  caminho: "docs/AGENT_STARTER.md",
1565
1737
  tipo: "docs",
1566
- prioridade: 8,
1738
+ prioridade: 10,
1739
+ obrigatorio: false,
1740
+ quandoUsar: "onboarding de agente novo ou explicação curta do fluxo",
1741
+ incluirTextoBrutoQuando: "o agente remoto não conhece Sema ainda",
1742
+ },
1743
+ {
1744
+ caminho: ARQUIVO_DOC_AGENTES_CAPACIDADE,
1745
+ tipo: "docs",
1746
+ prioridade: 11,
1567
1747
  obrigatorio: false,
1568
- quandoUsar: "onboarding de agente novo ou explicacao curta do fluxo",
1569
- incluirTextoBrutoQuando: "o agente remoto nao conhece Sema ainda",
1748
+ quandoUsar: "configurar Copilot, Cline, Roo Code, OpenCode ou outro agente com disciplina variável",
1749
+ incluirTextoBrutoQuando: "a IA precisa entender tiers fraca/média/forte e política de idioma",
1570
1750
  },
1571
1751
  {
1572
1752
  caminho: "docs/sintaxe.md",
1573
1753
  tipo: "docs",
1574
- prioridade: 9,
1754
+ prioridade: 12,
1575
1755
  obrigatorio: false,
1576
- quandoUsar: "duvida de gramatica, blocos ou formato do DSL",
1577
- incluirTextoBrutoQuando: "a IA vai editar contrato e os exemplos nao bastam",
1756
+ quandoUsar: "dúvida de gramática, blocos ou formato do DSL",
1757
+ incluirTextoBrutoQuando: "a IA vai editar contrato e os exemplos não bastam",
1578
1758
  },
1579
1759
  {
1580
1760
  caminho: "contratos/",
1581
1761
  tipo: "contrato",
1582
- prioridade: 10,
1762
+ prioridade: 13,
1583
1763
  obrigatorio: true,
1584
- quandoUsar: "antes de qualquer implementacao ou alteracao de comportamento",
1764
+ quandoUsar: "antes de qualquer implementação ou alteração de comportamento",
1585
1765
  incluirTextoBrutoQuando: "a tarefa toca uma capacidade governada por contrato",
1586
1766
  },
1587
1767
  ];
1588
1768
  return {
1589
1769
  nome: "Agent Context Pack",
1590
- versao: 1,
1591
- objetivo: "Dar a agentes IA uma entrada curta, estruturada e auditavel antes de abrir codigo cru ou inventar contexto.",
1770
+ versao: 3,
1771
+ objetivo: "Dar a agentes IA uma entrada curta, estruturada e auditável antes de abrir código cru ou inventar contexto.",
1592
1772
  ordemLeitura: [
1773
+ ARQUIVO_SEMA_BOOT,
1593
1774
  "llms.txt",
1594
1775
  ARQUIVO_AGENT_CONTEXT_PACK,
1776
+ ARQUIVO_SEMA_SMALL_MODEL,
1595
1777
  "SEMA_BRIEF.micro.txt",
1596
1778
  "SEMA_INDEX.json",
1597
1779
  "AGENTS.md",
1598
1780
  "exemplos/",
1599
1781
  ],
1600
1782
  regrasObrigatorias: [
1601
- "Contrato vem antes da acao.",
1602
- "Leia AGENTS.md antes de editar codigo, contrato, docs operacionais, release ou deploy.",
1783
+ "Contrato vem antes da ação.",
1784
+ "Leia SEMA_BOOT.md antes de qualquer outro artefato de IA.",
1785
+ "Leia AGENTS.md antes de editar código, contrato, docs operacionais, release ou deploy.",
1603
1786
  "Use exemplos oficiais antes de criar ou corrigir sintaxe .sema.",
1604
- "Use SEMA_INDEX.json para escolher contrato, modulo e arquivos provaveis antes de abrir codigo cru.",
1787
+ "Use SEMA_INDEX.json para escolher contrato, módulo e arquivos prováveis antes de abrir código cru.",
1605
1788
  "Valide .sema alterado e rode drift antes de concluir.",
1606
- "Quando faltar contrato aplicavel, crie ou edite o contrato antes do codigo.",
1789
+ "Quando faltar contrato aplicável, crie ou edite o contrato antes do código.",
1790
+ "Responda no idioma do usuário e preserve acentos, cedilha, pontuação e símbolos humanos.",
1791
+ "Mantenha o cabeçalho SEMA-GOVERNED em código gerado ou governado e volte ao contrato antes de editar.",
1792
+ "Se uma chamada Sema estourar por timeout local, aumente o timeout e tente novamente; não trate lentidão como sessão inativa.",
1607
1793
  ],
1608
1794
  proibicoes: [
1609
- "Nao inventar sintaxe Sema fora da gramatica e dos exemplos oficiais.",
1610
- "Nao tratar README, texto livre ou codigo como fonte superior ao contrato.",
1611
- "Nao sincronizar segredos, .env, node_modules, builds, caches, uploads ou artefatos privados fora do escopo.",
1612
- "Nao publicar, deployar ou remover capacidade sem contrato, drift e verificacao.",
1613
- "Nao misturar repositorio publico e privado sem conferir docs de repositorios e AGENTS.md.",
1795
+ "Não inventar sintaxe Sema fora da gramática e dos exemplos oficiais.",
1796
+ "Não tratar README, texto livre ou código como fonte superior ao contrato.",
1797
+ "Não sincronizar segredos, .env, node_modules, builds, caches, uploads ou artefatos privados fora do escopo.",
1798
+ "Não publicar, deployar ou remover capacidade sem contrato, drift e verificação.",
1799
+ "Não misturar repositório público e privado sem conferir docs de repositórios e AGENTS.md.",
1800
+ "Não usar a estética ASCII da DSL como desculpa para escrever PT-BR sem acentos.",
1801
+ "Não remover SEMA-GOVERNED nem substituir drift por comentário dentro do código.",
1802
+ "Não copiar o contrato inteiro para comentário de código; mantenha descrição humana curta.",
1803
+ "Não tratar timeout definido pelo agente como falha do Sema ou permissão para pular gate.",
1614
1804
  ],
1615
1805
  prioridades: [
1616
1806
  "Menor artefato suficiente primeiro.",
1617
- "Contrato, indice e AGENTS antes de codigo cru.",
1807
+ "Contrato, índice e AGENTS antes de código cru.",
1618
1808
  "Exemplos oficiais antes de nova sintaxe.",
1619
- "Diagnostico estruturado antes de opiniao livre.",
1620
- "Se risco ou escopo estiver ambigui, parar e pedir contrato/contexto.",
1809
+ "Diagnóstico estruturado antes de opinião livre.",
1810
+ "Retry progressivo em timeout antes de declarar bloqueio.",
1811
+ "Se risco ou escopo estiver ambíguo, parar e pedir contrato/contexto.",
1621
1812
  ],
1622
1813
  fontes,
1623
1814
  exemplosOficiais: [...EXEMPLOS_OFICIAIS_AGENT_CONTEXT],
1624
1815
  textoBrutoSobDemanda: Object.fromEntries(fontes.map((fonte) => [fonte.caminho, fonte.incluirTextoBrutoQuando])),
1625
1816
  guiaPorCapacidade: {
1817
+ fraca: guiaPorCapacidade.fraca.ordemLeitura,
1626
1818
  pequena: guiaPorCapacidade.pequena.ordemLeitura,
1627
1819
  media: guiaPorCapacidade.media.ordemLeitura,
1820
+ forte: guiaPorCapacidade.forte.ordemLeitura,
1628
1821
  grande: guiaPorCapacidade.grande.ordemLeitura,
1629
1822
  },
1823
+ aliasesCapacidade: { ...ALIASES_CAPACIDADE_IA },
1824
+ entrypointsClientes: criarEntrypointsClientesIa(),
1825
+ politicaIdioma: criarPoliticaIdiomaAgentContext(),
1826
+ politicaCodigoGovernado: criarPoliticaCodigoGovernadoAgentContext(),
1827
+ politicaTimeoutResumo: criarPoliticaTimeoutResumoAgentContext(),
1828
+ failClosed: criarFailClosedAgentContext(),
1630
1829
  };
1631
1830
  }
1831
+ function renderizarSemaBoot(agentContextPack) {
1832
+ const politica = agentContextPack.politicaIdioma;
1833
+ const politicaCodigo = agentContextPack.politicaCodigoGovernado;
1834
+ const politicaTimeout = agentContextPack.politicaTimeoutResumo;
1835
+ return `# SEMA_BOOT
1836
+
1837
+ Você está em um projeto governado por Sema. O contrato semântico vem antes de qualquer ação.
1838
+
1839
+ ## Primeira ação
1840
+
1841
+ 1. Se houver MCP Sema, chame Sema antes de editar.
1842
+ 2. Em IDE local, confirme que \`AGENTS.md\` existe e chame \`sema_resumo\`.
1843
+ 3. Em chat ou MCP remoto sem workspace sincronizado, comece por \`sema_chat_contexto\` e use \`sema_sync\` ou conteúdo inline.
1844
+ 4. Antes de criar ou corrigir \`.sema\`, use \`sema_exemplos\`.
1845
+ 5. Se não conseguir chamar Sema, pare e diga que está bloqueado.
1846
+
1847
+ ## Capacidade do agente
1848
+
1849
+ - Fraca: leia \`${ARQUIVO_SEMA_SMALL_MODEL}\`, \`SEMA_BRIEF.micro.txt\`, \`${ARQUIVO_AGENT_CONTEXT_PACK}\` e só suba contexto se necessário.
1850
+ - Média: leia este boot, \`${ARQUIVO_AGENT_CONTEXT_PACK}\`, \`SEMA_BRIEF.curto.txt\`, \`SEMA_INDEX.json\` e a doc indicada pelo Sema.
1851
+ - Forte: leia este boot, \`${ARQUIVO_AGENT_CONTEXT_PACK}\`, \`SEMA_BRIEF.md\`, \`SEMA_INDEX.json\`, \`AGENTS.md\` e rode os gates completos.
1852
+
1853
+ ## Código governado
1854
+
1855
+ ${politicaCodigo.regra}
1856
+
1857
+ - Marcador: \`${politicaCodigo.marcador}\`.
1858
+ - IA fraca: ${politicaCodigo.porCapacidade.fraca}
1859
+ - IA média: ${politicaCodigo.porCapacidade.media}
1860
+ - IA forte: ${politicaCodigo.porCapacidade.forte}
1861
+
1862
+ ## Timeout e retry
1863
+
1864
+ ${politicaTimeout.regra}
1865
+
1866
+ - Timeout inicial recomendado para projeto inteiro: ${politicaTimeout.timeoutInicialSegundos}s.
1867
+ - Escalonamento: ${politicaTimeout.escalonamentoSegundos.map((segundos) => `${segundos}s`).join(" -> ")}.
1868
+ - IA fraca: ${politicaTimeout.porCapacidade.fraca}
1869
+ - IA média: ${politicaTimeout.porCapacidade.media}
1870
+ - IA forte: ${politicaTimeout.porCapacidade.forte}
1871
+ - ${politicaTimeout.ateQuandoTentar}
1872
+
1873
+ ## Idioma humano
1874
+
1875
+ ${politica.regra}
1876
+
1877
+ - Use o idioma falado pelo usuário.
1878
+ - Em PT-BR, escreva com acentos, cedilha e pontuação normal.
1879
+ - Não copie a estética ASCII da DSL para propostas, respostas, docs humanas, mensagens de erro ou textos Author.
1880
+ - Não traduza comandos, rotas, nomes de arquivos, símbolos de código nem palavras-chave da DSL.
1881
+
1882
+ ## Falha fechada
1883
+
1884
+ ${agentContextPack.failClosed.map((regra) => `- ${regra}`).join("\n")}
1885
+ `;
1886
+ }
1887
+ function renderizarSemaSmallModel(agentContextPack) {
1888
+ const politicaTimeout = agentContextPack.politicaTimeoutResumo;
1889
+ return `# SEMA_SMALL_MODEL
1890
+
1891
+ Leia isto primeiro se você tem pouco contexto, pouca memória, pouco tool use ou tendência a ignorar instruções longas.
1892
+
1893
+ 1. Não edite nada antes de chamar Sema.
1894
+ 2. Se houver MCP: use \`sema_resumo\`, \`sema_docs_impacto\`, \`sema_drift\`, \`sema_validar\` e \`sema_finalizar_mudanca\`.
1895
+ 3. Se for remoto sem workspace: não peça para ler pasta local. Use \`sema_chat_contexto\`, \`sema_sync\` ou conteúdo inline.
1896
+ 4. Se for escrever \`.sema\`: use \`sema_exemplos\` antes.
1897
+ 5. Se não houver contrato: crie ou edite o contrato antes do código.
1898
+ 6. Se não conseguir chamar Sema: pare e declare bloqueio.
1899
+ 7. Responda no idioma do usuário. Em PT-BR, use acentos e símbolos normais.
1900
+ 8. Se abrir código com \`${agentContextPack.politicaCodigoGovernado.marcador}\`: volte ao contrato, chame Sema e só então edite.
1901
+ 9. Se Sema estourar por timeout local: aumente o timeout e tente de novo. Não trate isso como falha do Sema.
1902
+
1903
+ Ordem curta:
1904
+
1905
+ - \`${ARQUIVO_SEMA_BOOT}\`
1906
+ - \`SEMA_BRIEF.micro.txt\`
1907
+ - \`${ARQUIVO_AGENT_CONTEXT_PACK}\`
1908
+ - \`SEMA_INDEX.json\`
1909
+ - \`AGENTS.md\`
1910
+
1911
+ Timeout:
1912
+
1913
+ - Timeout local do agente não é falha do Sema.
1914
+ - Projeto inteiro: comece com ${politicaTimeout.timeoutInicialSegundos}s ou mais.
1915
+ - Escalonamento: ${politicaTimeout.escalonamentoSegundos.map((segundos) => `${segundos}s`).join(" -> ")}.
1916
+ - Se o projeto inteiro for lento, escopar para \`sema resumo <arquivo.sema> --micro --para mudanca\`.
1917
+ - ${politicaTimeout.ateQuandoTentar}
1918
+
1919
+ Fail-closed:
1920
+
1921
+ ${agentContextPack.failClosed.map((regra) => `- ${regra}`).join("\n")}
1922
+ `;
1923
+ }
1924
+ function renderizarDocumentoAgentesPorCapacidade(agentContextPack) {
1925
+ return `# Agentes por capacidade
1926
+
1927
+ Sema deve funcionar em agentes fortes, médios e fracos. A diferença não é só tamanho de contexto; é disciplina operacional.
1928
+
1929
+ ## Código Governado
1930
+
1931
+ Arquivos gerados ou governados pela Sema devem manter o marcador \`${agentContextPack.politicaCodigoGovernado.marcador}\`.
1932
+
1933
+ - Fraca: ${agentContextPack.politicaCodigoGovernado.porCapacidade.fraca}
1934
+ - Média: ${agentContextPack.politicaCodigoGovernado.porCapacidade.media}
1935
+ - Forte: ${agentContextPack.politicaCodigoGovernado.porCapacidade.forte}
1936
+
1937
+ ## Fraca
1938
+
1939
+ Use para Copilot em modo simples, Cline/Roo com pouco contexto, modelos locais pequenos e agentes que ignoram instrução longa.
1940
+
1941
+ - Entrada: \`${ARQUIVO_SEMA_BOOT}\` -> \`${ARQUIVO_SEMA_SMALL_MODEL}\` -> \`SEMA_BRIEF.micro.txt\`.
1942
+ - Não abrir AST/IR completos no começo.
1943
+ - Não editar se Sema não respondeu.
1944
+ - Não pedir para MCP remoto ler pasta local.
1945
+
1946
+ ## Média
1947
+
1948
+ Use para agentes com bom contexto, mas sem garantia de seguir todos os gates.
1949
+
1950
+ - Entrada: \`${ARQUIVO_SEMA_BOOT}\` -> \`${ARQUIVO_AGENT_CONTEXT_PACK}\` -> \`SEMA_BRIEF.curto.txt\` -> \`SEMA_INDEX.json\`.
1951
+ - Rodar docs-impacto antes de agir.
1952
+ - Validar drift e contrato no fechamento.
1953
+
1954
+ ## Forte
1955
+
1956
+ Use para Codex, Claude e agentes com tool use confiável.
1957
+
1958
+ - Entrada: \`${ARQUIVO_SEMA_BOOT}\` -> \`${ARQUIVO_AGENT_CONTEXT_PACK}\` -> \`SEMA_BRIEF.md\` -> \`SEMA_INDEX.json\`.
1959
+ - Pode consumir AST/IR/drift completos.
1960
+ - Ainda deve respeitar contrato primeiro e falha fechada.
1961
+
1962
+ ## Timeout e Retry
1963
+
1964
+ ${agentContextPack.politicaTimeoutResumo.regra}
1965
+
1966
+ - Timeout inicial para resumo de projeto inteiro: ${agentContextPack.politicaTimeoutResumo.timeoutInicialSegundos}s.
1967
+ - Escalonamento recomendado: ${agentContextPack.politicaTimeoutResumo.escalonamentoSegundos.map((segundos) => `${segundos}s`).join(" -> ")}.
1968
+ - Fraca: ${agentContextPack.politicaTimeoutResumo.porCapacidade.fraca}
1969
+ - Média: ${agentContextPack.politicaTimeoutResumo.porCapacidade.media}
1970
+ - Forte: ${agentContextPack.politicaTimeoutResumo.porCapacidade.forte}
1971
+ - ${agentContextPack.politicaTimeoutResumo.ateQuandoTentar}
1972
+
1973
+ ## Idioma
1974
+
1975
+ ${agentContextPack.politicaIdioma.regra}
1976
+
1977
+ A gramática Sema pode ter palavras-chave ASCII. Isso não autoriza resposta humana sem acentos.
1978
+
1979
+ ## Clientes
1980
+
1981
+ ${agentContextPack.entrypointsClientes.map((cliente) => `- ${cliente.cliente}: ${cliente.arquivos.join(", ")}. Capacidade padrão: ${cliente.capacidadePadrao}. ${cliente.observacao}`).join("\n")}
1982
+ `;
1983
+ }
1984
+ function renderizarInstrucaoClienteSema(cliente, capacidade, agentContextPack) {
1985
+ const guia = agentContextPack.guiaPorCapacidade[capacidade];
1986
+ const politicaTimeout = agentContextPack.politicaTimeoutResumo;
1987
+ const tituloCliente = cliente === "generico" ? "agente" : cliente;
1988
+ return `# Sema para ${tituloCliente}
1989
+
1990
+ Este workspace é governado por Sema. Antes de qualquer ação em código, contrato, documentação operacional, workflow, profile ou deploy:
1991
+
1992
+ 1. Leia \`${ARQUIVO_SEMA_BOOT}\`.
1993
+ 2. Chame Sema. Se MCP estiver disponível, use \`sema_resumo\` e depois \`sema_docs_impacto\` com a intenção declarada.
1994
+ 3. Antes de editar código existente, rode \`sema_drift\`.
1995
+ 4. Antes de criar ou editar \`.sema\`, use \`sema_exemplos\` e \`sema_inspecionar\`.
1996
+ 5. Ao concluir mudança de contrato, rode \`sema_validar\`.
1997
+ 6. Antes de finalizar, use \`sema_finalizar_mudanca\` com as docs lidas.
1998
+
1999
+ Capacidade padrão deste cliente: ${capacidade}.
2000
+ Ordem de leitura: ${guia.join(" -> ")}.
2001
+
2002
+ Falha fechada:
2003
+ ${agentContextPack.failClosed.map((regra) => `- ${regra}`).join("\n")}
2004
+
2005
+ Timeout:
2006
+ - Timeout local do agente não é falha do Sema.
2007
+ - Se uma chamada Sema estourar, aumente o timeout e tente de novo antes de declarar bloqueio.
2008
+ - Para projeto inteiro, comece com ${politicaTimeout.timeoutInicialSegundos}s ou mais; se for lento, escale ${politicaTimeout.escalonamentoSegundos.map((segundos) => `${segundos}s`).join(" -> ")}.
2009
+ - Se possível, reduza escopo para \`sema resumo <arquivo.sema> --micro --para mudanca\`.
2010
+
2011
+ Código governado:
2012
+ - Mantenha o marcador \`${agentContextPack.politicaCodigoGovernado.marcador}\` em código gerado ou governado.
2013
+ - Ao encontrar esse marcador, volte ao contrato .sema aplicável e chame Sema antes de editar.
2014
+ - Comentário de código é lembrete curto; não substitui drift, docs-impacto nem finalizar-mudanca.
2015
+
2016
+ Idioma:
2017
+ - Responda no idioma do usuário.
2018
+ - Em PT-BR, use acentos, cedilha, pontuação e símbolos normais.
2019
+ - A DSL \`.sema\` pode ser ASCII; texto humano não precisa ser.
2020
+ - Não traduza comandos, rotas, arquivos, símbolos de código nem palavras-chave da DSL.
2021
+ `;
2022
+ }
2023
+ async function sincronizarEntryPointsAgentes(baseProjeto, agentContextPack) {
2024
+ const resultados = [];
2025
+ const registrar = async (relativo, conteudo, substituirLegadoSema = false) => {
2026
+ const destino = path.join(baseProjeto, relativo);
2027
+ const status = await escreverArquivoGerenciadoSema(destino, conteudo, substituirLegadoSema);
2028
+ resultados.push({ caminho: relativo, status });
2029
+ };
2030
+ await registrar(".github/copilot-instructions.md", renderizarInstrucaoClienteSema("copilot", "media", agentContextPack), true);
2031
+ const clinePath = path.join(baseProjeto, ".clinerules");
2032
+ const clineStat = await statSeguro(clinePath);
2033
+ if (clineStat?.isFile()) {
2034
+ await registrar(".clinerules", renderizarInstrucaoClienteSema("cline", "fraca", agentContextPack), true);
2035
+ }
2036
+ else {
2037
+ await registrar(".clinerules/00-sema.md", renderizarInstrucaoClienteSema("cline", "fraca", agentContextPack), true);
2038
+ }
2039
+ await registrar(".roo/rules/00-sema.md", renderizarInstrucaoClienteSema("roo", "fraca", agentContextPack), true);
2040
+ const opencodeDir = path.join(baseProjeto, ".opencode");
2041
+ const opencodeStat = await statSeguro(opencodeDir);
2042
+ if (opencodeStat?.isDirectory()) {
2043
+ await registrar(".opencode/instructions.md", renderizarInstrucaoClienteSema("opencode", "media", agentContextPack), true);
2044
+ }
2045
+ const criados = resultados.filter((item) => item.status === "criado").map((item) => item.caminho);
2046
+ const atualizados = resultados.filter((item) => item.status === "atualizado").map((item) => item.caminho);
2047
+ const preservados = resultados.filter((item) => item.status === "preservado").map((item) => item.caminho);
2048
+ return { arquivos: resultados, criados, atualizados, preservados };
2049
+ }
1632
2050
  function coletarResumoSemanticoModulo(contexto) {
1633
2051
  const { arquivo, modulo, geradoEm, ir, briefing, drift } = contexto;
1634
2052
  const modoVerificacaoCodigo = contexto.modoVerificacaoCodigo ?? "codigo_completo";
@@ -1871,7 +2289,7 @@ function renderizarResumoModuloMarkdown(resumo, modo, guiaPorCapacidade) {
1871
2289
  "## Guia por capacidade de IA",
1872
2290
  "",
1873
2291
  ];
1874
- for (const capacidade of ["pequena", "media", "grande"]) {
2292
+ for (const capacidade of CAPACIDADES_IA_OPERACIONAIS) {
1875
2293
  const guia = guiaPorCapacidade[capacidade];
1876
2294
  linhas.push(`### ${capacidade}`);
1877
2295
  linhas.push("");
@@ -1924,20 +2342,21 @@ function criarBriefingMinimo(resumo, modo, tamanho) {
1924
2342
  }
1925
2343
  function criarPromptCurtoModulo(resumo, modo, tamanho, capacidade) {
1926
2344
  const resumoTexto = renderizarResumoModuloTexto(resumo, tamanho, modo).trim();
1927
- return `Voce esta operando Sema em modo IA-first.
1928
-
1929
- Esta linguagem existe para traduzir intencao operacional em contrato consumivel por IA. Humanos aprovam; agentes operam.
2345
+ return `Você está operando Sema em modo IA-first.
2346
+
2347
+ Esta linguagem existe para traduzir intenção operacional em contrato consumível por IA. Humanos aprovam; agentes operam.
1930
2348
 
1931
2349
  Capacidade alvo: ${capacidade}
1932
2350
  Modo da tarefa: ${modo}
1933
2351
 
1934
2352
  Regras:
1935
- - nao invente sintaxe nem bloco fora da gramatica oficial
1936
- - preserve a intencao do contrato
1937
- - use este resumo como fonte compacta inicial
1938
- - se a tarefa pedir mais contexto, suba para \`briefing.min.json\`, \`drift.json\` e depois \`ir.json\`
1939
- - nao saia editando software vivo sem olhar risco, lacuna e checks sugeridos
1940
- ${resumo.consumerFramework ? "- se for tarefa visual consumer, priorize `appRoutes`, `consumerSurfaces` e `consumerBridges` antes de abrir arquivos aleatorios" : ""}
2353
+ - não invente sintaxe nem bloco fora da gramática oficial
2354
+ - preserve a intenção do contrato
2355
+ - use este resumo como fonte compacta inicial
2356
+ - se a tarefa pedir mais contexto, suba para \`briefing.min.json\`, \`drift.json\` e depois \`ir.json\`
2357
+ - não saia editando software vivo sem olhar risco, lacuna e checks sugeridos
2358
+ - se abrir código com \`SEMA-GOVERNED\`, volte ao contrato e chame Sema antes de editar
2359
+ ${resumo.consumerFramework ? "- se for tarefa visual consumer, priorize `appRoutes`, `consumerSurfaces` e `consumerBridges` antes de abrir arquivos aleatórios" : ""}
1941
2360
 
1942
2361
  Contexto compacto:
1943
2362
  ${resumoTexto}
@@ -1957,9 +2376,10 @@ function renderizarResumoProjetoMarkdown(geradoEm, modulos, guiaPorCapacidade) {
1957
2376
  "## Entrada canonica para IA",
1958
2377
  "",
1959
2378
  `- Ordem minima: ${entradaCanonica.ordemLeitura.join(" -> ")}`,
1960
- `- IA pequena: ${entradaCanonica.porCapacidade.pequena.join(" -> ")}`,
1961
- `- IA media: ${entradaCanonica.porCapacidade.media.join(" -> ")}`,
1962
- `- IA grande: ${entradaCanonica.porCapacidade.grande.join(" -> ")}`,
2379
+ `- IA fraca: ${entradaCanonica.porCapacidade.fraca.join(" -> ")}`,
2380
+ `- IA média: ${entradaCanonica.porCapacidade.media.join(" -> ")}`,
2381
+ `- IA forte: ${entradaCanonica.porCapacidade.forte.join(" -> ")}`,
2382
+ `- Aliases: pequena -> fraca; grande -> forte`,
1963
2383
  "",
1964
2384
  "## Agent Context Pack",
1965
2385
  "",
@@ -1968,10 +2388,25 @@ function renderizarResumoProjetoMarkdown(geradoEm, modulos, guiaPorCapacidade) {
1968
2388
  `- Regras: ${agentContextPack.regrasObrigatorias.slice(0, 4).join(" | ")}`,
1969
2389
  `- Fontes brutas sob demanda: ${agentContextPack.fontes.map((fonte) => fonte.caminho).slice(0, 7).join(", ")}`,
1970
2390
  "",
2391
+ "## Código governado",
2392
+ "",
2393
+ `- Marcador: \`${agentContextPack.politicaCodigoGovernado.marcador}\``,
2394
+ `- Regra: ${agentContextPack.politicaCodigoGovernado.regra}`,
2395
+ `- IA fraca: ${agentContextPack.politicaCodigoGovernado.porCapacidade.fraca}`,
2396
+ `- IA média: ${agentContextPack.politicaCodigoGovernado.porCapacidade.media}`,
2397
+ `- IA forte: ${agentContextPack.politicaCodigoGovernado.porCapacidade.forte}`,
2398
+ "",
2399
+ "## Timeout e retry",
2400
+ "",
2401
+ `- Regra: ${agentContextPack.politicaTimeoutResumo.regra}`,
2402
+ `- Timeout inicial para projeto inteiro: ${agentContextPack.politicaTimeoutResumo.timeoutInicialSegundos}s`,
2403
+ `- Escalonamento: ${agentContextPack.politicaTimeoutResumo.escalonamentoSegundos.map((segundos) => `${segundos}s`).join(" -> ")}`,
2404
+ `- Bloqueio: ${agentContextPack.politicaTimeoutResumo.ateQuandoTentar}`,
2405
+ "",
1971
2406
  "## Guia por capacidade",
1972
2407
  "",
1973
2408
  ];
1974
- for (const capacidade of ["pequena", "media", "grande"]) {
2409
+ for (const capacidade of CAPACIDADES_IA_OPERACIONAIS) {
1975
2410
  const guia = guiaPorCapacidade[capacidade];
1976
2411
  linhas.push(`- ${capacidade}: ${guia.descricao} Artefatos: ${guia.artefatos.join(", ")}.`);
1977
2412
  }
@@ -1991,14 +2426,20 @@ function renderizarResumoProjetoMarkdown(geradoEm, modulos, guiaPorCapacidade) {
1991
2426
  }
1992
2427
  function criarEntradaCanonicaProjeto(guiaPorCapacidade) {
1993
2428
  const agentContextPack = criarAgentContextPack(guiaPorCapacidade);
2429
+ const fraca = [ARQUIVO_SEMA_BOOT, ARQUIVO_SEMA_SMALL_MODEL, "llms.txt", ARQUIVO_AGENT_CONTEXT_PACK, "SEMA_BRIEF.micro.txt", "SEMA_INDEX.json", "AGENTS.md"];
2430
+ const media = [ARQUIVO_SEMA_BOOT, "llms.txt", ARQUIVO_AGENT_CONTEXT_PACK, "SEMA_BRIEF.curto.txt", "SEMA_INDEX.json", "AGENTS.md", "README.md"];
2431
+ const forte = [ARQUIVO_SEMA_BOOT, "llms-full.txt", ARQUIVO_AGENT_CONTEXT_PACK, "SEMA_BRIEF.md", "SEMA_INDEX.json", "AGENTS.md", "README.md"];
1994
2432
  return {
1995
- descricao: "Entrada canonica do repositorio para IA. O repo nao e human-first; a IA deve comecar por esses artefatos antes de abrir codigo cru.",
2433
+ descricao: "Entrada canônica do repositório para IA. O repo não é human-first; a IA deve começar por esses artefatos antes de abrir código cru.",
1996
2434
  ordemLeitura: [...ARQUIVOS_CANONICOS_IA_RAIZ],
1997
2435
  porCapacidade: {
1998
- pequena: ["llms.txt", ARQUIVO_AGENT_CONTEXT_PACK, "SEMA_BRIEF.micro.txt", "SEMA_INDEX.json", "AGENTS.md"],
1999
- media: ["llms.txt", ARQUIVO_AGENT_CONTEXT_PACK, "SEMA_BRIEF.curto.txt", "SEMA_INDEX.json", "AGENTS.md", "README.md"],
2000
- grande: ["llms-full.txt", ARQUIVO_AGENT_CONTEXT_PACK, "SEMA_BRIEF.md", "SEMA_INDEX.json", "AGENTS.md", "README.md"],
2436
+ fraca,
2437
+ pequena: fraca,
2438
+ media,
2439
+ forte,
2440
+ grande: forte,
2001
2441
  },
2442
+ aliasesCapacidade: { ...ALIASES_CAPACIDADE_IA },
2002
2443
  docsSuporte: [...DOCUMENTOS_SUPORTE_IA],
2003
2444
  agentContextPack,
2004
2445
  guiaPorCapacidade,
@@ -2246,8 +2687,12 @@ async function gerarArquivosResumoModuloIa(contexto, pastaBase) {
2246
2687
  const resumoCurto = renderizarResumoModuloTexto(resumoSemantico, "curto", "resumo");
2247
2688
  const resumoMarkdown = renderizarResumoModuloMarkdown(resumoSemantico, "resumo", guiaPorCapacidade);
2248
2689
  const briefingMinimo = criarBriefingMinimo(resumoSemantico, "resumo", "curto");
2249
- const promptCurto = criarPromptCurtoModulo(resumoSemantico, "mudanca", "curto", "pequena");
2690
+ const promptCurto = criarPromptCurtoModulo(resumoSemantico, "mudanca", "curto", "fraca");
2250
2691
  const agentContextPack = criarAgentContextPack(guiaPorCapacidade);
2692
+ const semaBoot = renderizarSemaBoot(agentContextPack);
2693
+ const semaSmallModel = renderizarSemaSmallModel(agentContextPack);
2694
+ await writeFile(path.join(pastaBase, ARQUIVO_SEMA_BOOT), semaBoot, "utf8");
2695
+ await writeFile(path.join(pastaBase, ARQUIVO_SEMA_SMALL_MODEL), semaSmallModel, "utf8");
2251
2696
  await writeFile(path.join(pastaBase, "agent-context-pack.json"), `${JSON.stringify(agentContextPack, null, 2)}\n`, "utf8");
2252
2697
  await writeFile(path.join(pastaBase, "resumo.micro.txt"), resumoMicro, "utf8");
2253
2698
  await writeFile(path.join(pastaBase, "resumo.curto.txt"), resumoCurto, "utf8");
@@ -2255,7 +2700,7 @@ async function gerarArquivosResumoModuloIa(contexto, pastaBase) {
2255
2700
  await writeFile(path.join(pastaBase, "briefing.min.json"), `${JSON.stringify(briefingMinimo, null, 2)}\n`, "utf8");
2256
2701
  await writeFile(path.join(pastaBase, "prompt-curto.txt"), promptCurto, "utf8");
2257
2702
  return {
2258
- artefatosCompactos: ["agent-context-pack.json", "resumo.micro.txt", "resumo.curto.txt", "resumo.md", "briefing.min.json", "prompt-curto.txt"],
2703
+ artefatosCompactos: [ARQUIVO_SEMA_BOOT, ARQUIVO_SEMA_SMALL_MODEL, "agent-context-pack.json", "resumo.micro.txt", "resumo.curto.txt", "resumo.md", "briefing.min.json", "prompt-curto.txt"],
2259
2704
  guiaPorCapacidade,
2260
2705
  };
2261
2706
  }
@@ -2298,6 +2743,9 @@ async function gerarResumoProjetoIa(entrada, pastaSaidaOpcional, escreverNaRaiz
2298
2743
  : path.resolve(baseProjeto, ".tmp", "sema-resumo");
2299
2744
  await mkdir(pastaSaida, { recursive: true });
2300
2745
  const semaBrief = renderizarResumoProjetoMarkdown(geradoEm, modulos, guiaPorCapacidade);
2746
+ const semaBoot = renderizarSemaBoot(agentContextPack);
2747
+ const semaSmallModel = renderizarSemaSmallModel(agentContextPack);
2748
+ const docAgentesCapacidade = renderizarDocumentoAgentesPorCapacidade(agentContextPack);
2301
2749
  const indexJson = {
2302
2750
  comando: "resumo-projeto",
2303
2751
  geradoEm,
@@ -2317,7 +2765,9 @@ async function gerarResumoProjetoIa(entrada, pastaSaidaOpcional, escreverNaRaiz
2317
2765
  `MODULOS: ${modulos.length}`,
2318
2766
  `MODO_CODIGO: ${modoVerificacaoCodigo}`,
2319
2767
  `FONTES_CONCLUSAO: ${resumirListaTexto(fontesConclusao, 4)}`,
2320
- `ENTRADA_IA: ${entradaCanonica.porCapacidade.pequena.join(" -> ")}`,
2768
+ `ENTRADA_IA: ${entradaCanonica.porCapacidade.fraca.join(" -> ")}`,
2769
+ `TIMEOUT_SEMA: timeout local nao e falha; retry progressivo ${agentContextPack.politicaTimeoutResumo.escalonamentoSegundos.map((segundos) => `${segundos}s`).join(" -> ")}; escopar arquivo se projeto inteiro for lento`,
2770
+ `CODIGO_GOVERNADO: ${agentContextPack.politicaCodigoGovernado.marcador} -> chamar Sema antes de editar codigo gerado`,
2321
2771
  `TOP_MODULOS: ${resumirListaTexto(modulos.map((modulo) => modulo.modulo), 3)}`,
2322
2772
  `TOP_RISCOS: ${resumirListaTexto(unicosOrdenados(modulos.flatMap((modulo) => modulo.riscosPrincipais)), 3)}`,
2323
2773
  `TOP_LACUNAS: ${resumirListaTexto(unicosOrdenados(modulos.flatMap((modulo) => modulo.lacunas)), 3)}`,
@@ -2336,6 +2786,8 @@ async function gerarResumoProjetoIa(entrada, pastaSaidaOpcional, escreverNaRaiz
2336
2786
  : []),
2337
2787
  `FONTES_CONCLUSAO: ${resumirListaTexto(fontesConclusao, 6)}`,
2338
2788
  `ENTRADA_IA: ${entradaCanonica.porCapacidade.media.join(" -> ")}`,
2789
+ `TIMEOUT_SEMA: ${agentContextPack.politicaTimeoutResumo.regra} Escale ${agentContextPack.politicaTimeoutResumo.escalonamentoSegundos.map((segundos) => `${segundos}s`).join(" -> ")} antes de declarar bloqueio.`,
2790
+ `CODIGO_GOVERNADO: ${agentContextPack.politicaCodigoGovernado.marcador} -> docs-impacto e drift antes de alterar comportamento`,
2339
2791
  `TOP_MODULOS: ${resumirListaTexto(modulos.map((modulo) => modulo.modulo), 6)}`,
2340
2792
  `TOP_RISCOS: ${resumirListaTexto(unicosOrdenados(modulos.flatMap((modulo) => modulo.riscosPrincipais)), 6)}`,
2341
2793
  `TOP_LACUNAS: ${resumirListaTexto(unicosOrdenados(modulos.flatMap((modulo) => modulo.lacunas)), 6)}`,
@@ -2344,16 +2796,20 @@ async function gerarResumoProjetoIa(entrada, pastaSaidaOpcional, escreverNaRaiz
2344
2796
  "",
2345
2797
  ].join("\n");
2346
2798
  await writeFile(path.join(pastaSaida, "SEMA_BRIEF.md"), semaBrief, "utf8");
2799
+ await writeFile(path.join(pastaSaida, ARQUIVO_SEMA_BOOT), semaBoot, "utf8");
2800
+ await writeFile(path.join(pastaSaida, ARQUIVO_SEMA_SMALL_MODEL), semaSmallModel, "utf8");
2347
2801
  await writeFile(path.join(pastaSaida, "SEMA_BRIEF.micro.txt"), micro, "utf8");
2348
2802
  await writeFile(path.join(pastaSaida, "SEMA_BRIEF.curto.txt"), curto, "utf8");
2349
2803
  await writeFile(path.join(pastaSaida, "SEMA_INDEX.json"), `${JSON.stringify(indexJson, null, 2)}\n`, "utf8");
2350
2804
  await writeFile(path.join(pastaSaida, ARQUIVO_AGENT_CONTEXT_PACK), `${JSON.stringify(agentContextPack, null, 2)}\n`, "utf8");
2805
+ await mkdir(path.dirname(path.join(pastaSaida, ARQUIVO_DOC_AGENTES_CAPACIDADE)), { recursive: true });
2806
+ await writeFile(path.join(pastaSaida, ARQUIVO_DOC_AGENTES_CAPACIDADE), docAgentesCapacidade, "utf8");
2351
2807
  return {
2352
2808
  geradoEm,
2353
2809
  baseProjeto,
2354
2810
  pastaSaida,
2355
2811
  modoVerificacaoCodigo,
2356
- artefatos: ["SEMA_BRIEF.md", "SEMA_BRIEF.micro.txt", "SEMA_BRIEF.curto.txt", "SEMA_INDEX.json", ARQUIVO_AGENT_CONTEXT_PACK],
2812
+ artefatos: [ARQUIVO_SEMA_BOOT, ARQUIVO_SEMA_SMALL_MODEL, "SEMA_BRIEF.md", "SEMA_BRIEF.micro.txt", "SEMA_BRIEF.curto.txt", "SEMA_INDEX.json", ARQUIVO_AGENT_CONTEXT_PACK, ARQUIVO_DOC_AGENTES_CAPACIDADE],
2357
2813
  modulos,
2358
2814
  guiaPorCapacidade,
2359
2815
  };
@@ -2381,8 +2837,10 @@ async function gerarContextoIa(arquivoEntrada, pastaSaidaOpcional) {
2381
2837
 
2382
2838
  ## Arquivos gerados neste pacote
2383
2839
 
2384
- - \`agent-context-pack.json\`
2385
- - \`resumo.micro.txt\`
2840
+ - \`agent-context-pack.json\`
2841
+ - \`${ARQUIVO_SEMA_BOOT}\`
2842
+ - \`${ARQUIVO_SEMA_SMALL_MODEL}\`
2843
+ - \`resumo.micro.txt\`
2386
2844
  - \`resumo.curto.txt\`
2387
2845
  - \`resumo.md\`
2388
2846
  - \`briefing.min.json\`
@@ -2396,42 +2854,59 @@ async function gerarContextoIa(arquivoEntrada, pastaSaidaOpcional) {
2396
2854
 
2397
2855
  ## Fluxo recomendado para o agente
2398
2856
 
2399
- Antes de escolher arquivo de codigo, leia \`agent-context-pack.json\`. Ele declara regras obrigatorias, proibicoes, prioridades e quando abrir texto bruto como \`AGENTS.md\`, \`exemplos/\`, docs e contratos.
2400
-
2401
- ### IA pequena ou gratuita
2402
-
2403
- 1. Ler \`agent-context-pack.json\`.
2404
- 2. Ler \`resumo.micro.txt\`.
2405
- 3. Ler \`briefing.min.json\`.
2406
- 4. Se ainda couber contexto, ler \`resumo.curto.txt\`.
2407
-
2408
- ### IA media
2409
-
2410
- 1. Ler \`agent-context-pack.json\`.
2411
- 2. Ler \`resumo.curto.txt\`.
2412
- 3. Ler \`briefing.min.json\`.
2413
- 4. Ler \`drift.json\`.
2414
- 5. Se precisar, subir para \`resumo.md\`.
2415
-
2416
- ### IA grande ou com tool use
2417
-
2418
- 1. Ler \`agent-context-pack.json\`.
2419
- 2. Ler \`README.md\`.
2420
- 3. Ler \`resumo.md\`.
2421
- 4. Ler \`briefing.json\`.
2422
- 5. Ler \`drift.json\`.
2423
- 6. So depois abrir \`ir.json\` e \`ast.json\`.
2424
-
2425
- ## Texto bruto sob demanda
2426
-
2427
- - Abra \`AGENTS.md\` antes de editar codigo, contrato, docs operacionais, release ou deploy.
2428
- - Abra \`exemplos/\` antes de criar ou corrigir sintaxe \`.sema\`.
2429
- - Abra \`docs/sintaxe.md\` quando exemplos nao bastarem para resolver a gramatica.
2430
- - Abra \`contratos/\` antes de qualquer implementacao ou mudanca de comportamento.
2431
-
2432
- ## Fechamento
2433
-
2434
- 1. Editar o arquivo \`.sema\`.
2857
+ Antes de escolher arquivo de código, leia \`${ARQUIVO_SEMA_BOOT}\` e \`agent-context-pack.json\`. Eles declaram regras obrigatórias, proibições, prioridades, idioma humano e quando abrir texto bruto como \`AGENTS.md\`, \`exemplos/\`, docs e contratos.
2858
+
2859
+ ### IA fraca, gratuita ou com pouca disciplina
2860
+
2861
+ 1. Ler \`${ARQUIVO_SEMA_BOOT}\`.
2862
+ 2. Ler \`${ARQUIVO_SEMA_SMALL_MODEL}\`.
2863
+ 3. Ler \`agent-context-pack.json\`.
2864
+ 4. Ler \`resumo.micro.txt\`.
2865
+ 5. Ler \`briefing.min.json\`.
2866
+ 6. Se ainda couber contexto, ler \`resumo.curto.txt\`.
2867
+
2868
+ ### IA média
2869
+
2870
+ 1. Ler \`${ARQUIVO_SEMA_BOOT}\`.
2871
+ 2. Ler \`agent-context-pack.json\`.
2872
+ 3. Ler \`resumo.curto.txt\`.
2873
+ 4. Ler \`briefing.min.json\`.
2874
+ 5. Ler \`drift.json\`.
2875
+ 6. Se precisar, subir para \`resumo.md\`.
2876
+
2877
+ ### IA forte ou com tool use
2878
+
2879
+ 1. Ler \`${ARQUIVO_SEMA_BOOT}\`.
2880
+ 2. Ler \`agent-context-pack.json\`.
2881
+ 3. Ler \`README.md\`.
2882
+ 4. Ler \`resumo.md\`.
2883
+ 5. Ler \`briefing.json\`.
2884
+ 6. Ler \`drift.json\`.
2885
+ 7. depois abrir \`ir.json\` e \`ast.json\`.
2886
+
2887
+ ## Idioma humano
2888
+
2889
+ - Responda no idioma do usuário.
2890
+ - Em PT-BR, use acentos, cedilha, pontuação e símbolos normais.
2891
+ - A DSL \`.sema\` pode ser ASCII; texto humano não precisa ser.
2892
+
2893
+ ## Texto bruto sob demanda
2894
+
2895
+ - Abra \`AGENTS.md\` antes de editar código, contrato, docs operacionais, release ou deploy.
2896
+ - Abra \`exemplos/\` antes de criar ou corrigir sintaxe \`.sema\`.
2897
+ - Abra \`docs/sintaxe.md\` quando exemplos não bastarem para resolver a gramática.
2898
+ - Abra \`contratos/\` antes de qualquer implementação ou mudança de comportamento.
2899
+
2900
+ ## Timeout e retry
2901
+
2902
+ - Timeout local do agente não é falha do Sema.
2903
+ - Se uma chamada Sema estourar, aumente o timeout e tente de novo.
2904
+ - Se o projeto inteiro for lento, escopar para \`sema resumo "${contexto.arquivo}" --micro --para mudanca\`.
2905
+ - Se o ambiente impedir continuar, pare bloqueado e não avance com código sem Sema.
2906
+
2907
+ ## Fechamento
2908
+
2909
+ 1. Editar o arquivo \`.sema\`.
2435
2910
  2. Rodar \`sema formatar "${contexto.arquivo}"\`.
2436
2911
  3. Rodar \`sema validar "${contexto.arquivo}" --json\`.
2437
2912
  4. Rodar \`sema drift "${contexto.arquivo}" --json\`.
@@ -6703,9 +7178,11 @@ async function comandoSyncAiEntrypoints(emJson) {
6703
7178
  return 1;
6704
7179
  }
6705
7180
  const indexJson = JSON.parse(await readFile(path.join(resumoProjeto.pastaSaida, "SEMA_INDEX.json"), "utf8"));
7181
+ const entrypointsClientes = await sincronizarEntryPointsAgentes(resumoProjeto.baseProjeto, indexJson.agentContextPack);
6706
7182
  const artefatos = [...new Set([
6707
7183
  ...ARQUIVOS_CANONICOS_IA_RAIZ,
6708
7184
  ...resumoProjeto.artefatos,
7185
+ ...entrypointsClientes.arquivos.map((item) => item.caminho),
6709
7186
  "exemplos",
6710
7187
  ])];
6711
7188
  if (emJson) {
@@ -6716,6 +7193,7 @@ async function comandoSyncAiEntrypoints(emJson) {
6716
7193
  pastaSaida: resumoProjeto.pastaSaida,
6717
7194
  artefatos,
6718
7195
  entradaCanonica: indexJson.entradaCanonica,
7196
+ entrypointsClientes,
6719
7197
  exemplos,
6720
7198
  }, null, 2));
6721
7199
  return 0;
@@ -6723,10 +7201,11 @@ async function comandoSyncAiEntrypoints(emJson) {
6723
7201
  console.log("Entrypoints IA-first sincronizados");
6724
7202
  console.log("");
6725
7203
  console.log(`Base do projeto: ${resumoProjeto.baseProjeto}`);
6726
- console.log(`Ordem canonica: ${indexJson.entradaCanonica.ordemLeitura.join(" -> ")}`);
6727
- console.log(`IA pequena: ${indexJson.entradaCanonica.porCapacidade.pequena.join(" -> ")}`);
6728
- console.log(`IA media: ${indexJson.entradaCanonica.porCapacidade.media.join(" -> ")}`);
6729
- console.log(`IA grande: ${indexJson.entradaCanonica.porCapacidade.grande.join(" -> ")}`);
7204
+ console.log(`Ordem canônica: ${indexJson.entradaCanonica.ordemLeitura.join(" -> ")}`);
7205
+ console.log(`IA fraca: ${indexJson.entradaCanonica.porCapacidade.fraca.join(" -> ")}`);
7206
+ console.log(`IA média: ${indexJson.entradaCanonica.porCapacidade.media.join(" -> ")}`);
7207
+ console.log(`IA forte: ${indexJson.entradaCanonica.porCapacidade.forte.join(" -> ")}`);
7208
+ console.log(`Clientes: ${entrypointsClientes.criados.length} criados, ${entrypointsClientes.atualizados.length} atualizados, ${entrypointsClientes.preservados.length} preservados`);
6730
7209
  console.log(`Exemplos oficiais: ${exemplos.criados.length} criados, ${exemplos.preservados.length} preservados em ${exemplos.destino}`);
6731
7210
  return 0;
6732
7211
  }
@@ -6748,16 +7227,17 @@ async function comandoAjudaIa() {
6748
7227
  ]));
6749
7228
  console.log("");
6750
7229
  console.log(renderizarSecaoAscii("Capacidade de IA", [
6751
- "pequena: `sema resumo --micro`, `briefing.min.json`, `prompt-curto.txt`",
6752
- "media: `sema resumo --curto`, `drift.json`, `briefing.min.json`",
6753
- "grande: `sema contexto-ia`, `briefing.json`, `ir.json`, `ast.json`",
7230
+ "fraca: `sema resumo --micro`, `briefing.min.json`, `prompt-curto.txt`",
7231
+ "média: `sema resumo --curto`, `drift.json`, `briefing.min.json`",
7232
+ "forte: `sema contexto-ia`, `briefing.json`, `ir.json`, `ast.json`",
6754
7233
  ]));
6755
7234
  console.log("");
6756
7235
  console.log(renderizarSecaoAscii("Fluxo recomendado", [
6757
7236
  "Use `sema starter-ia` para um texto curto de onboarding.",
6758
7237
  "Use `sema sync-ai-entrypoints` para regenerar `AGENT_CONTEXT_PACK.json`, `SEMA_BRIEF.*` e `SEMA_INDEX.json` na raiz.",
6759
7238
  "Use `sema instalar-exemplos` para materializar `exemplos/` oficiais sem sobrescrever arquivos locais.",
6760
- "Use `sema resumo <arquivo> --micro --para onboarding` para IA pequena.",
7239
+ "Use `sema resumo <arquivo> --micro --para onboarding` para IA fraca.",
7240
+ "Se `sema resumo` ou outro gate estourar timeout local, aumente o timeout e tente de novo; timeout do agente nao e falha do Sema.",
6761
7241
  "Use `sema prompt-curto <arquivo> --curto --para mudanca` para colar contexto em modelo gratuito.",
6762
7242
  "Use `sema prompt-ia`, `sema prompt-ia-ui`, `sema prompt-ia-react` e `sema prompt-ia-sema-primeiro` conforme a tarefa.",
6763
7243
  "Use `sema exemplos-prompt-ia` para pegar modelos prontos de prompt.",
@@ -6776,7 +7256,8 @@ async function comandoAjudaIa() {
6776
7256
  "Se voce quer testar a Sema de verdade, nao peca so HTML solto.",
6777
7257
  "Peca `.sema` + arquitetura + React + TypeScript, ou use o modo `Sema primeiro`.",
6778
7258
  "Se o projeto ja existe, trate `importar` como rascunho e `drift` como juiz.",
6779
- "IA pequena comeca no menor artefato que resolve a tarefa; nao enfie `ast.json` inteiro nela de bobeira.",
7259
+ "IA fraca comeca no menor artefato que resolve a tarefa; nao enfie `ast.json` inteiro nela de bobeira.",
7260
+ "Timeout local e so limite do agente: escale e tente de novo antes de chamar Sema de inativo.",
6780
7261
  "Antes de editar software vivo, leia `briefing.min.json` ou `briefing.json` em vez de sair cavando arquivo na fe.",
6781
7262
  "Trate `route`, `worker`, `evento`, `fila`, `cron`, `webhook`, `cache`, `storage` e `policy` como superficies de primeira classe.",
6782
7263
  ]));
@@ -6905,7 +7386,7 @@ async function comandoPromptCurto(entrada, args, emJson) {
6905
7386
  if (entrada && entrada.toLowerCase().endsWith(".sema")) {
6906
7387
  const contexto = await carregarContextoModuloIa(alvo);
6907
7388
  const resumoSemantico = coletarResumoSemanticoModulo(contexto);
6908
- const capacidade = tamanho === "micro" ? "pequena" : tamanho === "curto" ? "media" : "grande";
7389
+ const capacidade = tamanho === "micro" ? "fraca" : tamanho === "curto" ? "media" : "forte";
6909
7390
  const prompt = criarPromptCurtoModulo(resumoSemantico, modo, tamanho, capacidade);
6910
7391
  if (emJson) {
6911
7392
  console.log(JSON.stringify({
@@ -6930,7 +7411,7 @@ async function comandoPromptCurto(entrada, args, emJson) {
6930
7411
  ? "SEMA_BRIEF.curto.txt"
6931
7412
  : "SEMA_BRIEF.md";
6932
7413
  const contextoProjeto = await readFile(path.join(resumoProjeto.pastaSaida, arquivoResumo), "utf8");
6933
- const capacidade = tamanho === "micro" ? "pequena" : tamanho === "curto" ? "media" : "grande";
7414
+ const capacidade = tamanho === "micro" ? "fraca" : tamanho === "curto" ? "media" : "forte";
6934
7415
  const prompt = `⚠️ REGRA OBRIGATÓRIA DE GOVERNANÇA:
6935
7416
 
6936
7417
  ANTES DE QUALQUER AÇÃO (editar, criar, deletar, executar, consultar, modificar):