@semacode/cli 1.5.32 → 1.5.34

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
@@ -36,7 +36,7 @@ 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
39
+ - a Sema usa \`resumo\` e \`prompt-curto\` para IA fraca, gratuita ou com pouco contexto
40
40
  - a Sema usa \`contexto-ia\` para gerar \`ast.json\`, \`ir.json\`, \`drift.json\`, \`briefing.json\` e artefatos compactos antes da edicao
41
41
  - a Sema pode servir de base para interfaces graficas elegantes e coerentes
42
42
  - a Sema nao gera uma interface completa sozinha no estado atual
@@ -47,7 +47,7 @@ Importante:
47
47
  Regras:
48
48
  - nao invente sintaxe fora da gramatica e dos exemplos oficiais
49
49
  - 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
50
+ - se a IA for fraca, nao tente abrir tudo de uma vez
51
51
  - use \`sema resumo\` e \`briefing.min.json\` antes de subir para o pacote completo
52
52
  - trate \`ir --json\` como fonte de verdade semantica
53
53
  - trate \`briefing.json\` como plano de intervencao antes de editar projeto vivo
@@ -58,7 +58,7 @@ Regras:
58
58
 
59
59
  Comandos essenciais:
60
60
  - 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>]\`
61
+ - prompt curto para IA fraca: \`sema prompt-curto <arquivo-ou-pasta> [--micro|--curto|--medio] [--para <resumo|onboarding|review|mudanca|bug|arquitetura>]\`
62
62
  - descoberta do projeto: \`sema inspecionar [arquivo-ou-pasta] --json\`
63
63
  - auditoria do contrato vivo: \`sema drift <arquivo-ou-pasta> [--escopo <arquivo|modulo|projeto>] [--json]\`
64
64
  - mapa de impacto: \`sema impacto <arquivo-ou-pasta> --alvo <token> [--mudanca <descricao>] [--json]\`
@@ -76,7 +76,7 @@ Comandos essenciais:
76
76
 
77
77
  Antes de editar:
78
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\`
79
+ 2. se a IA for fraca, rode \`sema resumo <arquivo> --micro\` e leia \`briefing.min.json\`
80
80
  3. se a IA aguentar mais, rode \`sema drift\` para medir impls, vinculos, rotas, score e lacunas
81
81
  4. se a tarefa for pesada, rode \`sema contexto-ia\` e leia \`briefing.json\`
82
82
  5. consulte AST e IR do modulo alvo so quando a capacidade realmente aguentar
@@ -123,7 +123,7 @@ Fontes de verdade, em ordem:
123
123
  6. README do projeto
124
124
  7. gramatica e documentacao de sintaxe da Sema
125
125
  8. exemplos oficiais, com prioridade para o vertical de pagamento
126
- 9. \`sema resumo\` e \`briefing.min.json\` quando a IA for pequena
126
+ 9. \`sema resumo\` e \`briefing.min.json\` quando a IA for fraca
127
127
  10. AST, IR e diagnosticos exportados pela CLI em JSON quando a capacidade aguentar
128
128
 
129
129
  Regras de operacao:
@@ -334,17 +334,30 @@ Comandos uteis da CLI para esse fluxo:
334
334
  const DIRETORIO_CLI_ATUAL = path.dirname(fileURLToPath(import.meta.url));
335
335
  const VERSAO_CLI = pacoteCli.version;
336
336
  const requireRuntimeCli = createRequire(import.meta.url);
337
+ const ARQUIVO_SEMA_BOOT = "SEMA_BOOT.md";
338
+ const ARQUIVO_SEMA_SMALL_MODEL = "SEMA_SMALL_MODEL.md";
337
339
  const ARQUIVO_AGENT_CONTEXT_PACK = "AGENT_CONTEXT_PACK.json";
340
+ const ARQUIVO_DOC_AGENTES_CAPACIDADE = "docs/agentes-por-capacidade.md";
338
341
  const ARQUIVOS_CANONICOS_IA_RAIZ = [
342
+ ARQUIVO_SEMA_BOOT,
339
343
  "llms.txt",
340
344
  ARQUIVO_AGENT_CONTEXT_PACK,
345
+ ARQUIVO_SEMA_SMALL_MODEL,
341
346
  "SEMA_BRIEF.md",
342
347
  "SEMA_INDEX.json",
343
348
  "AGENTS.md",
344
349
  "README.md",
345
350
  "llms-full.txt",
346
351
  ];
352
+ const CAPACIDADES_IA_OPERACIONAIS = ["fraca", "media", "forte"];
353
+ const ALIASES_CAPACIDADE_IA = {
354
+ pequena: "fraca",
355
+ grande: "forte",
356
+ };
357
+ const MARCADOR_SEMA_AGENT_ENTRYPOINT_INICIO = "<!-- sema:agent-entrypoint:start -->";
358
+ const MARCADOR_SEMA_AGENT_ENTRYPOINT_FIM = "<!-- sema:agent-entrypoint:end -->";
347
359
  const DOCUMENTOS_SUPORTE_IA = [
360
+ ARQUIVO_DOC_AGENTES_CAPACIDADE,
348
361
  "docs/AGENT_STARTER.md",
349
362
  "docs/integracao-com-ia.md",
350
363
  "docs/fluxo-pratico-ia-sema.md",
@@ -465,18 +478,18 @@ function ajuda() {
465
478
  return [
466
479
  renderizarCaixaAscii([
467
480
  `Sema CLI v${VERSAO_CLI}`,
468
- "IA-first para contrato, geracao e adocao incremental",
469
- "novo projeto, edicao guiada e legado sem contrato inicial",
481
+ "IA-first para contrato, geração e adoção incremental",
482
+ "novo projeto, edição guiada e legado sem contrato inicial",
470
483
  ]),
471
484
  "",
472
- renderizarSecaoAscii("Fluxos rapidos", [
473
- "[1] Projeto novo / producao inicial",
485
+ renderizarSecaoAscii("Fluxos rápidos", [
486
+ "[1] Projeto novo / produção inicial",
474
487
  "sema iniciar --template <base|nestjs|fastapi|nextjs-api|nextjs-consumer|react-vite-consumer|angular-consumer|flutter-consumer>",
475
488
  "sema validar contratos/<modulo>.sema --json",
476
489
  "sema compilar <arquivo-ou-pasta> --alvo <typescript|python|dart|lua> --saida <diretorio>",
477
490
  "sema verificar <arquivo-ou-pasta> --json",
478
491
  "",
479
- "[2] Editar projeto que ja usa Sema",
492
+ "[2] Editar projeto que usa Sema",
480
493
  "sema inspecionar . --json",
481
494
  "sema resumo <arquivo-ou-pasta> --micro --para mudanca",
482
495
  "sema drift <arquivo-ou-pasta> --escopo modulo --json",
@@ -492,7 +505,7 @@ function ajuda() {
492
505
  "sema author validar-narrativa contratos/author.sema --texto <texto> --texto-anterior <texto> --json",
493
506
  "sema author validar-proibicoes contratos/author.sema --texto <texto> --json",
494
507
  "",
495
- "[4] Validar profiles semanticos",
508
+ "[4] Validar profiles semânticos",
496
509
  "sema profile validar workflow contratos/sema/workflow_ops.sema --maturidade production --preset webhook --artefato-arquivo workflow.md --json",
497
510
  "sema profile validar ops contratos/sema/workflow_ops.sema --maturidade critical --preset deploy --artefato-arquivo runbook.md --json",
498
511
  "sema profile validar game contratos/sema/game.sema --maturidade prototype --preset playtest --artefato-arquivo playtest.md --json",
@@ -500,7 +513,7 @@ function ajuda() {
500
513
  "sema profile capabilities --json",
501
514
  "sema rule-packs --profile legal --json",
502
515
  "",
503
- "[5] Adotar Sema em projeto que ainda nao usa",
516
+ "[5] Adotar Sema em projeto que ainda não usa",
504
517
  "sema importar <fonte> <diretorio> --saida <diretorio> --json",
505
518
  "sema formatar <arquivo-ou-pasta>",
506
519
  "sema validar <arquivo-ou-pasta> --json",
@@ -508,23 +521,23 @@ function ajuda() {
508
521
  ]),
509
522
  "",
510
523
  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",
524
+ "fraca: sema resumo --micro + briefing.min.json + prompt-curto.txt",
525
+ "média: sema resumo --curto + drift.json + briefing.min.json",
526
+ "forte: sema contexto-ia + briefing.json + ir.json + ast.json",
514
527
  ]),
515
528
  "",
516
529
  renderizarSecaoAscii("Comandos principais", [
517
530
  "descoberta: sema inspecionar [arquivo-ou-pasta] [--json]",
518
531
  "auditoria: sema drift <arquivo-ou-pasta> [--escopo <arquivo|modulo|projeto>] [--incluir-worktrees] [--incluir-consumidores-laterais] [--json]",
519
532
  "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>]",
533
+ "renomeação: sema renomear-semantico <arquivo-ou-pasta> --de <nome-atual> --para <nome-novo> [--escopo <arquivo|modulo|projeto>] [--json]",
534
+ "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]",
535
+ "validação: sema validar <arquivo-ou-pasta> [--json]",
536
+ "diagnóstico: sema diagnosticos <arquivo.sema> [--json]",
537
+ "geração: sema compilar <arquivo-ou-pasta> --alvo <python|typescript|dart|lua> --saida <diretorio> [--estrutura <flat|modulos|backend>] [--framework <base|nestjs|fastapi>]",
525
538
  "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]",
539
+ "verificação final: sema verificar <arquivo-ou-pasta> [--saida <diretorio-base>] [--json]",
540
+ "formatação: sema formatar <arquivo-ou-pasta> [--check] [--json]",
528
541
  "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
542
  "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
543
  "capabilities: sema profile capabilities [--json]",
@@ -573,6 +586,52 @@ async function escreverArquivos(base, arquivos) {
573
586
  await writeFile(destino, arquivo.conteudo, "utf8");
574
587
  }
575
588
  }
589
+ async function statSeguro(caminho) {
590
+ try {
591
+ return await stat(caminho);
592
+ }
593
+ catch {
594
+ return null;
595
+ }
596
+ }
597
+ function pareceEntradaSemaLegada(conteudo) {
598
+ return /Sema.*Regras obrigat[oó]rias para IA/is.test(conteudo) ||
599
+ /Sema.*Regras obrigatorias para IA/is.test(conteudo) ||
600
+ /Sema.*Regras obrigatórias para IA/is.test(conteudo);
601
+ }
602
+ function montarBlocoGerenciadoSema(conteudo) {
603
+ return `${MARCADOR_SEMA_AGENT_ENTRYPOINT_INICIO}\n${conteudo.trim()}\n${MARCADOR_SEMA_AGENT_ENTRYPOINT_FIM}\n`;
604
+ }
605
+ async function escreverArquivoGerenciadoSema(caminho, conteudo, substituirLegadoSema = false) {
606
+ const bloco = montarBlocoGerenciadoSema(conteudo);
607
+ const atual = await statSeguro(caminho);
608
+ if (!atual) {
609
+ await mkdir(path.dirname(caminho), { recursive: true });
610
+ await writeFile(caminho, bloco, "utf8");
611
+ return "criado";
612
+ }
613
+ if (!atual.isFile()) {
614
+ return "preservado";
615
+ }
616
+ const textoAtual = await readFile(caminho, "utf8");
617
+ let proximo;
618
+ if (textoAtual.includes(MARCADOR_SEMA_AGENT_ENTRYPOINT_INICIO) && textoAtual.includes(MARCADOR_SEMA_AGENT_ENTRYPOINT_FIM)) {
619
+ const inicio = textoAtual.indexOf(MARCADOR_SEMA_AGENT_ENTRYPOINT_INICIO);
620
+ const fim = textoAtual.indexOf(MARCADOR_SEMA_AGENT_ENTRYPOINT_FIM, inicio) + MARCADOR_SEMA_AGENT_ENTRYPOINT_FIM.length;
621
+ proximo = `${textoAtual.slice(0, inicio)}${bloco.trimEnd()}${textoAtual.slice(fim)}`;
622
+ }
623
+ else if (substituirLegadoSema && pareceEntradaSemaLegada(textoAtual)) {
624
+ proximo = bloco;
625
+ }
626
+ else {
627
+ proximo = `${bloco}\n${textoAtual.trimStart()}`;
628
+ }
629
+ if (proximo === textoAtual) {
630
+ return "preservado";
631
+ }
632
+ await writeFile(caminho, proximo.endsWith("\n") ? proximo : `${proximo}\n`, "utf8");
633
+ return "atualizado";
634
+ }
576
635
  function obterOpcao(args, nome, padrao) {
577
636
  const nomes = [nome, ...Object.entries(ALIAS_OPCOES).filter(([, v]) => v === nome).map(([k]) => k)];
578
637
  for (const n of nomes) {
@@ -1481,81 +1540,154 @@ function descreverFazModulo(ir, modulo) {
1481
1540
  : `governa o modulo ${normalizarIdentificadorResumo(modulo)}`;
1482
1541
  }
1483
1542
  function criarGuiaCapacidadeIa() {
1543
+ const fraca = {
1544
+ descricao: "IA fraca, gratuita, local pequena ou com disciplina baixa. Leia o boot card, pare cedo e chame Sema antes de agir.",
1545
+ artefatos: [ARQUIVO_SEMA_BOOT, ARQUIVO_SEMA_SMALL_MODEL, "agent-context-pack.json", "resumo.micro.txt", "briefing.min.json", "prompt-curto.txt"],
1546
+ ordemLeitura: [ARQUIVO_SEMA_BOOT, ARQUIVO_SEMA_SMALL_MODEL, "agent-context-pack.json", "resumo.micro.txt", "briefing.min.json", "resumo.curto.txt"],
1547
+ evitar: ["ast.json", "ir.json", "diagnosticos.json"],
1548
+ };
1549
+ const media = {
1550
+ descricao: "IA média. Aguenta boot, resumo expandido, briefing mínimo, drift e documentação curta.",
1551
+ artefatos: [ARQUIVO_SEMA_BOOT, "agent-context-pack.json", "resumo.curto.txt", "briefing.min.json", "drift.json", "prompt-curto.txt"],
1552
+ ordemLeitura: [ARQUIVO_SEMA_BOOT, "agent-context-pack.json", "resumo.curto.txt", "briefing.min.json", "drift.json", "resumo.md"],
1553
+ evitar: ["ast.json"],
1554
+ };
1555
+ const forte = {
1556
+ 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.",
1557
+ artefatos: [ARQUIVO_SEMA_BOOT, "agent-context-pack.json", "README.md", "resumo.md", "briefing.json", "drift.json", "ir.json", "ast.json"],
1558
+ ordemLeitura: [ARQUIVO_SEMA_BOOT, "agent-context-pack.json", "README.md", "resumo.md", "briefing.json", "drift.json", "ir.json", "ast.json"],
1559
+ evitar: [],
1560
+ };
1561
+ return {
1562
+ fraca,
1563
+ pequena: fraca,
1564
+ media,
1565
+ forte,
1566
+ grande: forte,
1567
+ };
1568
+ }
1569
+ function criarPoliticaIdiomaAgentContext() {
1484
1570
  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"],
1571
+ 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.",
1572
+ idiomaHumanoPadrao: "pt-BR quando a conversa ou o projeto estiverem em português; caso contrário, use o idioma falado pelo usuário.",
1573
+ preservarAcentos: true,
1574
+ separarDslDeTextoHumano: true,
1575
+ comandosESimbolos: "Não traduza comandos, nomes de arquivos, rotas, símbolos de código ou palavras-chave da DSL.",
1576
+ };
1577
+ }
1578
+ function criarEntrypointsClientesIa() {
1579
+ return [
1580
+ {
1581
+ cliente: "copilot",
1582
+ arquivos: [".github/copilot-instructions.md", "AGENTS.md", ARQUIVO_SEMA_BOOT],
1583
+ capacidadePadrao: "media",
1584
+ observacao: "VS Code/Copilot deve receber uma instrução curta e repetida no arquivo próprio, sem depender só do AGENTS.md.",
1490
1585
  },
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"],
1586
+ {
1587
+ cliente: "cline",
1588
+ arquivos: [".clinerules/00-sema.md", ".clinerules", ARQUIVO_SEMA_BOOT],
1589
+ capacidadePadrao: "fraca",
1590
+ observacao: "Cline costuma obedecer melhor quando o gate Sema vem em arquivo curto; se .clinerules for arquivo legado, o Sema atualiza esse fallback.",
1496
1591
  },
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: [],
1592
+ {
1593
+ cliente: "roo",
1594
+ arquivos: [".roo/rules/00-sema.md", "AGENTS.md", ARQUIVO_SEMA_BOOT],
1595
+ capacidadePadrao: "fraca",
1596
+ observacao: "Roo Code deve começar por uma regra dedicada em .roo/rules antes de abrir arquivos longos.",
1502
1597
  },
1503
- };
1598
+ {
1599
+ cliente: "opencode",
1600
+ arquivos: [".opencode/instructions.md", "AGENTS.md", ARQUIVO_SEMA_BOOT],
1601
+ capacidadePadrao: "media",
1602
+ observacao: "OpenCode deve receber a mesma regra curta em instructions.md quando a pasta .opencode já existir.",
1603
+ },
1604
+ {
1605
+ cliente: "generico",
1606
+ arquivos: [ARQUIVO_SEMA_BOOT, ARQUIVO_SEMA_SMALL_MODEL, ARQUIVO_AGENT_CONTEXT_PACK],
1607
+ capacidadePadrao: "fraca",
1608
+ observacao: "Qualquer agente sem integração específica começa pelo boot card e só sobe contexto se passar pelos gates.",
1609
+ },
1610
+ ];
1611
+ }
1612
+ function criarFailClosedAgentContext() {
1613
+ return [
1614
+ "Se não conseguir chamar Sema, pare e declare bloqueio em vez de editar código ou contrato.",
1615
+ "Se não houver contrato aplicável, crie ou edite o .sema antes do código.",
1616
+ "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.",
1617
+ "Se for criar ou corrigir .sema, use sema_exemplos antes de escrever sintaxe.",
1618
+ "Se a resposta humana estiver em PT-BR, preserve acentos e símbolos mesmo que a DSL use ASCII.",
1619
+ ];
1504
1620
  }
1505
1621
  function criarAgentContextPack(guiaPorCapacidade) {
1506
1622
  const fontes = [
1507
1623
  {
1508
- caminho: "llms.txt",
1624
+ caminho: ARQUIVO_SEMA_BOOT,
1509
1625
  tipo: "entrypoint",
1510
1626
  prioridade: 1,
1511
1627
  obrigatorio: true,
1628
+ quandoUsar: "sempre no primeiro contato de qualquer agente com o projeto",
1629
+ incluirTextoBrutoQuando: "a IA precisa de um boot curto, fail-closed e independente do tamanho de contexto",
1630
+ },
1631
+ {
1632
+ caminho: ARQUIVO_SEMA_SMALL_MODEL,
1633
+ tipo: "entrypoint",
1634
+ prioridade: 2,
1635
+ obrigatorio: true,
1636
+ quandoUsar: "IA fraca, Copilot, modelo local pequeno, Cline/Roo com pouco contexto ou tarefa curta",
1637
+ incluirTextoBrutoQuando: "a IA tende a ignorar instruções longas ou copiar a estética ASCII da DSL",
1638
+ },
1639
+ {
1640
+ caminho: "llms.txt",
1641
+ tipo: "entrypoint",
1642
+ prioridade: 3,
1643
+ obrigatorio: true,
1512
1644
  quandoUsar: "sempre no primeiro contato com o projeto",
1513
- incluirTextoBrutoQuando: "a IA precisa de orientacao compacta para operar o repositorio",
1645
+ incluirTextoBrutoQuando: "a IA precisa de orientação compacta para operar o repositório",
1514
1646
  },
1515
1647
  {
1516
1648
  caminho: ARQUIVO_AGENT_CONTEXT_PACK,
1517
1649
  tipo: "entrypoint",
1518
- prioridade: 2,
1650
+ prioridade: 4,
1519
1651
  obrigatorio: true,
1520
1652
  quandoUsar: "sempre antes de decidir quais documentos ou exemplos abrir",
1521
- incluirTextoBrutoQuando: "a IA precisa auditar regras, proibicoes, prioridades e fontes de verdade",
1653
+ incluirTextoBrutoQuando: "a IA precisa auditar regras, proibições, prioridades e fontes de verdade",
1522
1654
  },
1523
1655
  {
1524
1656
  caminho: "SEMA_BRIEF.micro.txt",
1525
1657
  tipo: "resumo",
1526
- prioridade: 3,
1658
+ prioridade: 5,
1527
1659
  obrigatorio: true,
1528
- quandoUsar: "IA pequena, onboarding, chat remoto ou primeiro triage",
1660
+ quandoUsar: "IA fraca, onboarding, chat remoto ou primeiro triage",
1529
1661
  incluirTextoBrutoQuando: "a tarefa cabe em contexto curto",
1530
1662
  },
1531
1663
  {
1532
1664
  caminho: "SEMA_BRIEF.curto.txt",
1533
1665
  tipo: "resumo",
1534
- prioridade: 4,
1666
+ prioridade: 6,
1535
1667
  obrigatorio: true,
1536
- quandoUsar: "IA media, mudanca pequena ou review rapido",
1537
- incluirTextoBrutoQuando: "o modulo alvo ainda nao esta claro pelo micro",
1668
+ quandoUsar: "IA média, mudança pequena ou review rápido",
1669
+ incluirTextoBrutoQuando: "o módulo alvo ainda não está claro pelo micro",
1538
1670
  },
1539
1671
  {
1540
1672
  caminho: "SEMA_INDEX.json",
1541
1673
  tipo: "indice",
1542
- prioridade: 5,
1674
+ prioridade: 7,
1543
1675
  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",
1676
+ quandoUsar: "antes de abrir código cru ou escolher contrato alvo",
1677
+ incluirTextoBrutoQuando: "a IA precisa mapear módulos, lacunas, riscos ou arquivos prováveis",
1546
1678
  },
1547
1679
  {
1548
1680
  caminho: "AGENTS.md",
1549
1681
  tipo: "operacional",
1550
- prioridade: 6,
1682
+ prioridade: 8,
1551
1683
  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",
1684
+ quandoUsar: "antes de editar código, contrato, docs operacionais, release ou deploy",
1685
+ incluirTextoBrutoQuando: "a IA precisa confirmar regras locais obrigatórias e prioridades do projeto",
1554
1686
  },
1555
1687
  {
1556
1688
  caminho: "exemplos/",
1557
1689
  tipo: "exemplos",
1558
- prioridade: 7,
1690
+ prioridade: 9,
1559
1691
  obrigatorio: true,
1560
1692
  quandoUsar: "antes de criar ou corrigir arquivo .sema, profile, Author, workflow, ops, game, legal ou research",
1561
1693
  incluirTextoBrutoQuando: "a IA vai escrever sintaxe Sema ou comparar um contrato com formato oficial",
@@ -1563,72 +1695,246 @@ function criarAgentContextPack(guiaPorCapacidade) {
1563
1695
  {
1564
1696
  caminho: "docs/AGENT_STARTER.md",
1565
1697
  tipo: "docs",
1566
- prioridade: 8,
1698
+ prioridade: 10,
1567
1699
  obrigatorio: false,
1568
- quandoUsar: "onboarding de agente novo ou explicacao curta do fluxo",
1569
- incluirTextoBrutoQuando: "o agente remoto nao conhece Sema ainda",
1700
+ quandoUsar: "onboarding de agente novo ou explicação curta do fluxo",
1701
+ incluirTextoBrutoQuando: "o agente remoto não conhece Sema ainda",
1702
+ },
1703
+ {
1704
+ caminho: ARQUIVO_DOC_AGENTES_CAPACIDADE,
1705
+ tipo: "docs",
1706
+ prioridade: 11,
1707
+ obrigatorio: false,
1708
+ quandoUsar: "configurar Copilot, Cline, Roo Code, OpenCode ou outro agente com disciplina variável",
1709
+ incluirTextoBrutoQuando: "a IA precisa entender tiers fraca/média/forte e política de idioma",
1570
1710
  },
1571
1711
  {
1572
1712
  caminho: "docs/sintaxe.md",
1573
1713
  tipo: "docs",
1574
- prioridade: 9,
1714
+ prioridade: 12,
1575
1715
  obrigatorio: false,
1576
- quandoUsar: "duvida de gramatica, blocos ou formato do DSL",
1577
- incluirTextoBrutoQuando: "a IA vai editar contrato e os exemplos nao bastam",
1716
+ quandoUsar: "dúvida de gramática, blocos ou formato do DSL",
1717
+ incluirTextoBrutoQuando: "a IA vai editar contrato e os exemplos não bastam",
1578
1718
  },
1579
1719
  {
1580
1720
  caminho: "contratos/",
1581
1721
  tipo: "contrato",
1582
- prioridade: 10,
1722
+ prioridade: 13,
1583
1723
  obrigatorio: true,
1584
- quandoUsar: "antes de qualquer implementacao ou alteracao de comportamento",
1724
+ quandoUsar: "antes de qualquer implementação ou alteração de comportamento",
1585
1725
  incluirTextoBrutoQuando: "a tarefa toca uma capacidade governada por contrato",
1586
1726
  },
1587
1727
  ];
1588
1728
  return {
1589
1729
  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.",
1730
+ versao: 2,
1731
+ objetivo: "Dar a agentes IA uma entrada curta, estruturada e auditável antes de abrir código cru ou inventar contexto.",
1592
1732
  ordemLeitura: [
1733
+ ARQUIVO_SEMA_BOOT,
1593
1734
  "llms.txt",
1594
1735
  ARQUIVO_AGENT_CONTEXT_PACK,
1736
+ ARQUIVO_SEMA_SMALL_MODEL,
1595
1737
  "SEMA_BRIEF.micro.txt",
1596
1738
  "SEMA_INDEX.json",
1597
1739
  "AGENTS.md",
1598
1740
  "exemplos/",
1599
1741
  ],
1600
1742
  regrasObrigatorias: [
1601
- "Contrato vem antes da acao.",
1602
- "Leia AGENTS.md antes de editar codigo, contrato, docs operacionais, release ou deploy.",
1743
+ "Contrato vem antes da ação.",
1744
+ "Leia SEMA_BOOT.md antes de qualquer outro artefato de IA.",
1745
+ "Leia AGENTS.md antes de editar código, contrato, docs operacionais, release ou deploy.",
1603
1746
  "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.",
1747
+ "Use SEMA_INDEX.json para escolher contrato, módulo e arquivos prováveis antes de abrir código cru.",
1605
1748
  "Valide .sema alterado e rode drift antes de concluir.",
1606
- "Quando faltar contrato aplicavel, crie ou edite o contrato antes do codigo.",
1749
+ "Quando faltar contrato aplicável, crie ou edite o contrato antes do código.",
1750
+ "Responda no idioma do usuário e preserve acentos, cedilha, pontuação e símbolos humanos.",
1607
1751
  ],
1608
1752
  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.",
1753
+ "Não inventar sintaxe Sema fora da gramática e dos exemplos oficiais.",
1754
+ "Não tratar README, texto livre ou código como fonte superior ao contrato.",
1755
+ "Não sincronizar segredos, .env, node_modules, builds, caches, uploads ou artefatos privados fora do escopo.",
1756
+ "Não publicar, deployar ou remover capacidade sem contrato, drift e verificação.",
1757
+ "Não misturar repositório público e privado sem conferir docs de repositórios e AGENTS.md.",
1758
+ "Não usar a estética ASCII da DSL como desculpa para escrever PT-BR sem acentos.",
1614
1759
  ],
1615
1760
  prioridades: [
1616
1761
  "Menor artefato suficiente primeiro.",
1617
- "Contrato, indice e AGENTS antes de codigo cru.",
1762
+ "Contrato, índice e AGENTS antes de código cru.",
1618
1763
  "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.",
1764
+ "Diagnóstico estruturado antes de opinião livre.",
1765
+ "Se risco ou escopo estiver ambíguo, parar e pedir contrato/contexto.",
1621
1766
  ],
1622
1767
  fontes,
1623
1768
  exemplosOficiais: [...EXEMPLOS_OFICIAIS_AGENT_CONTEXT],
1624
1769
  textoBrutoSobDemanda: Object.fromEntries(fontes.map((fonte) => [fonte.caminho, fonte.incluirTextoBrutoQuando])),
1625
1770
  guiaPorCapacidade: {
1771
+ fraca: guiaPorCapacidade.fraca.ordemLeitura,
1626
1772
  pequena: guiaPorCapacidade.pequena.ordemLeitura,
1627
1773
  media: guiaPorCapacidade.media.ordemLeitura,
1774
+ forte: guiaPorCapacidade.forte.ordemLeitura,
1628
1775
  grande: guiaPorCapacidade.grande.ordemLeitura,
1629
1776
  },
1777
+ aliasesCapacidade: { ...ALIASES_CAPACIDADE_IA },
1778
+ entrypointsClientes: criarEntrypointsClientesIa(),
1779
+ politicaIdioma: criarPoliticaIdiomaAgentContext(),
1780
+ failClosed: criarFailClosedAgentContext(),
1630
1781
  };
1631
1782
  }
1783
+ function renderizarSemaBoot(agentContextPack) {
1784
+ const politica = agentContextPack.politicaIdioma;
1785
+ return `# SEMA_BOOT
1786
+
1787
+ Você está em um projeto governado por Sema. O contrato semântico vem antes de qualquer ação.
1788
+
1789
+ ## Primeira ação
1790
+
1791
+ 1. Se houver MCP Sema, chame Sema antes de editar.
1792
+ 2. Em IDE local, confirme que \`AGENTS.md\` existe e chame \`sema_resumo\`.
1793
+ 3. Em chat ou MCP remoto sem workspace sincronizado, comece por \`sema_chat_contexto\` e use \`sema_sync\` ou conteúdo inline.
1794
+ 4. Antes de criar ou corrigir \`.sema\`, use \`sema_exemplos\`.
1795
+ 5. Se não conseguir chamar Sema, pare e diga que está bloqueado.
1796
+
1797
+ ## Capacidade do agente
1798
+
1799
+ - Fraca: leia \`${ARQUIVO_SEMA_SMALL_MODEL}\`, \`SEMA_BRIEF.micro.txt\`, \`${ARQUIVO_AGENT_CONTEXT_PACK}\` e só suba contexto se necessário.
1800
+ - Média: leia este boot, \`${ARQUIVO_AGENT_CONTEXT_PACK}\`, \`SEMA_BRIEF.curto.txt\`, \`SEMA_INDEX.json\` e a doc indicada pelo Sema.
1801
+ - Forte: leia este boot, \`${ARQUIVO_AGENT_CONTEXT_PACK}\`, \`SEMA_BRIEF.md\`, \`SEMA_INDEX.json\`, \`AGENTS.md\` e rode os gates completos.
1802
+
1803
+ ## Idioma humano
1804
+
1805
+ ${politica.regra}
1806
+
1807
+ - Use o idioma falado pelo usuário.
1808
+ - Em PT-BR, escreva com acentos, cedilha e pontuação normal.
1809
+ - Não copie a estética ASCII da DSL para propostas, respostas, docs humanas, mensagens de erro ou textos Author.
1810
+ - Não traduza comandos, rotas, nomes de arquivos, símbolos de código nem palavras-chave da DSL.
1811
+
1812
+ ## Falha fechada
1813
+
1814
+ ${agentContextPack.failClosed.map((regra) => `- ${regra}`).join("\n")}
1815
+ `;
1816
+ }
1817
+ function renderizarSemaSmallModel(agentContextPack) {
1818
+ return `# SEMA_SMALL_MODEL
1819
+
1820
+ Leia isto primeiro se você tem pouco contexto, pouca memória, pouco tool use ou tendência a ignorar instruções longas.
1821
+
1822
+ 1. Não edite nada antes de chamar Sema.
1823
+ 2. Se houver MCP: use \`sema_resumo\`, \`sema_docs_impacto\`, \`sema_drift\`, \`sema_validar\` e \`sema_finalizar_mudanca\`.
1824
+ 3. Se for remoto sem workspace: não peça para ler pasta local. Use \`sema_chat_contexto\`, \`sema_sync\` ou conteúdo inline.
1825
+ 4. Se for escrever \`.sema\`: use \`sema_exemplos\` antes.
1826
+ 5. Se não houver contrato: crie ou edite o contrato antes do código.
1827
+ 6. Se não conseguir chamar Sema: pare e declare bloqueio.
1828
+ 7. Responda no idioma do usuário. Em PT-BR, use acentos e símbolos normais.
1829
+
1830
+ Ordem curta:
1831
+
1832
+ - \`${ARQUIVO_SEMA_BOOT}\`
1833
+ - \`SEMA_BRIEF.micro.txt\`
1834
+ - \`${ARQUIVO_AGENT_CONTEXT_PACK}\`
1835
+ - \`SEMA_INDEX.json\`
1836
+ - \`AGENTS.md\`
1837
+
1838
+ Fail-closed:
1839
+
1840
+ ${agentContextPack.failClosed.map((regra) => `- ${regra}`).join("\n")}
1841
+ `;
1842
+ }
1843
+ function renderizarDocumentoAgentesPorCapacidade(agentContextPack) {
1844
+ return `# Agentes por capacidade
1845
+
1846
+ Sema deve funcionar em agentes fortes, médios e fracos. A diferença não é só tamanho de contexto; é disciplina operacional.
1847
+
1848
+ ## Fraca
1849
+
1850
+ Use para Copilot em modo simples, Cline/Roo com pouco contexto, modelos locais pequenos e agentes que ignoram instrução longa.
1851
+
1852
+ - Entrada: \`${ARQUIVO_SEMA_BOOT}\` -> \`${ARQUIVO_SEMA_SMALL_MODEL}\` -> \`SEMA_BRIEF.micro.txt\`.
1853
+ - Não abrir AST/IR completos no começo.
1854
+ - Não editar se Sema não respondeu.
1855
+ - Não pedir para MCP remoto ler pasta local.
1856
+
1857
+ ## Média
1858
+
1859
+ Use para agentes com bom contexto, mas sem garantia de seguir todos os gates.
1860
+
1861
+ - Entrada: \`${ARQUIVO_SEMA_BOOT}\` -> \`${ARQUIVO_AGENT_CONTEXT_PACK}\` -> \`SEMA_BRIEF.curto.txt\` -> \`SEMA_INDEX.json\`.
1862
+ - Rodar docs-impacto antes de agir.
1863
+ - Validar drift e contrato no fechamento.
1864
+
1865
+ ## Forte
1866
+
1867
+ Use para Codex, Claude e agentes com tool use confiável.
1868
+
1869
+ - Entrada: \`${ARQUIVO_SEMA_BOOT}\` -> \`${ARQUIVO_AGENT_CONTEXT_PACK}\` -> \`SEMA_BRIEF.md\` -> \`SEMA_INDEX.json\`.
1870
+ - Pode consumir AST/IR/drift completos.
1871
+ - Ainda deve respeitar contrato primeiro e falha fechada.
1872
+
1873
+ ## Idioma
1874
+
1875
+ ${agentContextPack.politicaIdioma.regra}
1876
+
1877
+ A gramática Sema pode ter palavras-chave ASCII. Isso não autoriza resposta humana sem acentos.
1878
+
1879
+ ## Clientes
1880
+
1881
+ ${agentContextPack.entrypointsClientes.map((cliente) => `- ${cliente.cliente}: ${cliente.arquivos.join(", ")}. Capacidade padrão: ${cliente.capacidadePadrao}. ${cliente.observacao}`).join("\n")}
1882
+ `;
1883
+ }
1884
+ function renderizarInstrucaoClienteSema(cliente, capacidade, agentContextPack) {
1885
+ const guia = agentContextPack.guiaPorCapacidade[capacidade];
1886
+ const tituloCliente = cliente === "generico" ? "agente" : cliente;
1887
+ return `# Sema para ${tituloCliente}
1888
+
1889
+ Este workspace é governado por Sema. Antes de qualquer ação em código, contrato, documentação operacional, workflow, profile ou deploy:
1890
+
1891
+ 1. Leia \`${ARQUIVO_SEMA_BOOT}\`.
1892
+ 2. Chame Sema. Se MCP estiver disponível, use \`sema_resumo\` e depois \`sema_docs_impacto\` com a intenção declarada.
1893
+ 3. Antes de editar código existente, rode \`sema_drift\`.
1894
+ 4. Antes de criar ou editar \`.sema\`, use \`sema_exemplos\` e \`sema_inspecionar\`.
1895
+ 5. Ao concluir mudança de contrato, rode \`sema_validar\`.
1896
+ 6. Antes de finalizar, use \`sema_finalizar_mudanca\` com as docs lidas.
1897
+
1898
+ Capacidade padrão deste cliente: ${capacidade}.
1899
+ Ordem de leitura: ${guia.join(" -> ")}.
1900
+
1901
+ Falha fechada:
1902
+ ${agentContextPack.failClosed.map((regra) => `- ${regra}`).join("\n")}
1903
+
1904
+ Idioma:
1905
+ - Responda no idioma do usuário.
1906
+ - Em PT-BR, use acentos, cedilha, pontuação e símbolos normais.
1907
+ - A DSL \`.sema\` pode ser ASCII; texto humano não precisa ser.
1908
+ - Não traduza comandos, rotas, arquivos, símbolos de código nem palavras-chave da DSL.
1909
+ `;
1910
+ }
1911
+ async function sincronizarEntryPointsAgentes(baseProjeto, agentContextPack) {
1912
+ const resultados = [];
1913
+ const registrar = async (relativo, conteudo, substituirLegadoSema = false) => {
1914
+ const destino = path.join(baseProjeto, relativo);
1915
+ const status = await escreverArquivoGerenciadoSema(destino, conteudo, substituirLegadoSema);
1916
+ resultados.push({ caminho: relativo, status });
1917
+ };
1918
+ await registrar(".github/copilot-instructions.md", renderizarInstrucaoClienteSema("copilot", "media", agentContextPack), true);
1919
+ const clinePath = path.join(baseProjeto, ".clinerules");
1920
+ const clineStat = await statSeguro(clinePath);
1921
+ if (clineStat?.isFile()) {
1922
+ await registrar(".clinerules", renderizarInstrucaoClienteSema("cline", "fraca", agentContextPack), true);
1923
+ }
1924
+ else {
1925
+ await registrar(".clinerules/00-sema.md", renderizarInstrucaoClienteSema("cline", "fraca", agentContextPack), true);
1926
+ }
1927
+ await registrar(".roo/rules/00-sema.md", renderizarInstrucaoClienteSema("roo", "fraca", agentContextPack), true);
1928
+ const opencodeDir = path.join(baseProjeto, ".opencode");
1929
+ const opencodeStat = await statSeguro(opencodeDir);
1930
+ if (opencodeStat?.isDirectory()) {
1931
+ await registrar(".opencode/instructions.md", renderizarInstrucaoClienteSema("opencode", "media", agentContextPack), true);
1932
+ }
1933
+ const criados = resultados.filter((item) => item.status === "criado").map((item) => item.caminho);
1934
+ const atualizados = resultados.filter((item) => item.status === "atualizado").map((item) => item.caminho);
1935
+ const preservados = resultados.filter((item) => item.status === "preservado").map((item) => item.caminho);
1936
+ return { arquivos: resultados, criados, atualizados, preservados };
1937
+ }
1632
1938
  function coletarResumoSemanticoModulo(contexto) {
1633
1939
  const { arquivo, modulo, geradoEm, ir, briefing, drift } = contexto;
1634
1940
  const modoVerificacaoCodigo = contexto.modoVerificacaoCodigo ?? "codigo_completo";
@@ -1871,7 +2177,7 @@ function renderizarResumoModuloMarkdown(resumo, modo, guiaPorCapacidade) {
1871
2177
  "## Guia por capacidade de IA",
1872
2178
  "",
1873
2179
  ];
1874
- for (const capacidade of ["pequena", "media", "grande"]) {
2180
+ for (const capacidade of CAPACIDADES_IA_OPERACIONAIS) {
1875
2181
  const guia = guiaPorCapacidade[capacidade];
1876
2182
  linhas.push(`### ${capacidade}`);
1877
2183
  linhas.push("");
@@ -1924,20 +2230,20 @@ function criarBriefingMinimo(resumo, modo, tamanho) {
1924
2230
  }
1925
2231
  function criarPromptCurtoModulo(resumo, modo, tamanho, capacidade) {
1926
2232
  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.
2233
+ return `Você está operando Sema em modo IA-first.
2234
+
2235
+ Esta linguagem existe para traduzir intenção operacional em contrato consumível por IA. Humanos aprovam; agentes operam.
1930
2236
 
1931
2237
  Capacidade alvo: ${capacidade}
1932
2238
  Modo da tarefa: ${modo}
1933
2239
 
1934
2240
  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" : ""}
2241
+ - não invente sintaxe nem bloco fora da gramática oficial
2242
+ - preserve a intenção do contrato
2243
+ - use este resumo como fonte compacta inicial
2244
+ - se a tarefa pedir mais contexto, suba para \`briefing.min.json\`, \`drift.json\` e depois \`ir.json\`
2245
+ - não saia editando software vivo sem olhar risco, lacuna e checks sugeridos
2246
+ ${resumo.consumerFramework ? "- se for tarefa visual consumer, priorize `appRoutes`, `consumerSurfaces` e `consumerBridges` antes de abrir arquivos aleatórios" : ""}
1941
2247
 
1942
2248
  Contexto compacto:
1943
2249
  ${resumoTexto}
@@ -1957,9 +2263,10 @@ function renderizarResumoProjetoMarkdown(geradoEm, modulos, guiaPorCapacidade) {
1957
2263
  "## Entrada canonica para IA",
1958
2264
  "",
1959
2265
  `- 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(" -> ")}`,
2266
+ `- IA fraca: ${entradaCanonica.porCapacidade.fraca.join(" -> ")}`,
2267
+ `- IA média: ${entradaCanonica.porCapacidade.media.join(" -> ")}`,
2268
+ `- IA forte: ${entradaCanonica.porCapacidade.forte.join(" -> ")}`,
2269
+ `- Aliases: pequena -> fraca; grande -> forte`,
1963
2270
  "",
1964
2271
  "## Agent Context Pack",
1965
2272
  "",
@@ -1971,7 +2278,7 @@ function renderizarResumoProjetoMarkdown(geradoEm, modulos, guiaPorCapacidade) {
1971
2278
  "## Guia por capacidade",
1972
2279
  "",
1973
2280
  ];
1974
- for (const capacidade of ["pequena", "media", "grande"]) {
2281
+ for (const capacidade of CAPACIDADES_IA_OPERACIONAIS) {
1975
2282
  const guia = guiaPorCapacidade[capacidade];
1976
2283
  linhas.push(`- ${capacidade}: ${guia.descricao} Artefatos: ${guia.artefatos.join(", ")}.`);
1977
2284
  }
@@ -1991,14 +2298,20 @@ function renderizarResumoProjetoMarkdown(geradoEm, modulos, guiaPorCapacidade) {
1991
2298
  }
1992
2299
  function criarEntradaCanonicaProjeto(guiaPorCapacidade) {
1993
2300
  const agentContextPack = criarAgentContextPack(guiaPorCapacidade);
2301
+ const fraca = [ARQUIVO_SEMA_BOOT, ARQUIVO_SEMA_SMALL_MODEL, "llms.txt", ARQUIVO_AGENT_CONTEXT_PACK, "SEMA_BRIEF.micro.txt", "SEMA_INDEX.json", "AGENTS.md"];
2302
+ const media = [ARQUIVO_SEMA_BOOT, "llms.txt", ARQUIVO_AGENT_CONTEXT_PACK, "SEMA_BRIEF.curto.txt", "SEMA_INDEX.json", "AGENTS.md", "README.md"];
2303
+ const forte = [ARQUIVO_SEMA_BOOT, "llms-full.txt", ARQUIVO_AGENT_CONTEXT_PACK, "SEMA_BRIEF.md", "SEMA_INDEX.json", "AGENTS.md", "README.md"];
1994
2304
  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.",
2305
+ 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
2306
  ordemLeitura: [...ARQUIVOS_CANONICOS_IA_RAIZ],
1997
2307
  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"],
2308
+ fraca,
2309
+ pequena: fraca,
2310
+ media,
2311
+ forte,
2312
+ grande: forte,
2001
2313
  },
2314
+ aliasesCapacidade: { ...ALIASES_CAPACIDADE_IA },
2002
2315
  docsSuporte: [...DOCUMENTOS_SUPORTE_IA],
2003
2316
  agentContextPack,
2004
2317
  guiaPorCapacidade,
@@ -2246,8 +2559,12 @@ async function gerarArquivosResumoModuloIa(contexto, pastaBase) {
2246
2559
  const resumoCurto = renderizarResumoModuloTexto(resumoSemantico, "curto", "resumo");
2247
2560
  const resumoMarkdown = renderizarResumoModuloMarkdown(resumoSemantico, "resumo", guiaPorCapacidade);
2248
2561
  const briefingMinimo = criarBriefingMinimo(resumoSemantico, "resumo", "curto");
2249
- const promptCurto = criarPromptCurtoModulo(resumoSemantico, "mudanca", "curto", "pequena");
2562
+ const promptCurto = criarPromptCurtoModulo(resumoSemantico, "mudanca", "curto", "fraca");
2250
2563
  const agentContextPack = criarAgentContextPack(guiaPorCapacidade);
2564
+ const semaBoot = renderizarSemaBoot(agentContextPack);
2565
+ const semaSmallModel = renderizarSemaSmallModel(agentContextPack);
2566
+ await writeFile(path.join(pastaBase, ARQUIVO_SEMA_BOOT), semaBoot, "utf8");
2567
+ await writeFile(path.join(pastaBase, ARQUIVO_SEMA_SMALL_MODEL), semaSmallModel, "utf8");
2251
2568
  await writeFile(path.join(pastaBase, "agent-context-pack.json"), `${JSON.stringify(agentContextPack, null, 2)}\n`, "utf8");
2252
2569
  await writeFile(path.join(pastaBase, "resumo.micro.txt"), resumoMicro, "utf8");
2253
2570
  await writeFile(path.join(pastaBase, "resumo.curto.txt"), resumoCurto, "utf8");
@@ -2255,7 +2572,7 @@ async function gerarArquivosResumoModuloIa(contexto, pastaBase) {
2255
2572
  await writeFile(path.join(pastaBase, "briefing.min.json"), `${JSON.stringify(briefingMinimo, null, 2)}\n`, "utf8");
2256
2573
  await writeFile(path.join(pastaBase, "prompt-curto.txt"), promptCurto, "utf8");
2257
2574
  return {
2258
- artefatosCompactos: ["agent-context-pack.json", "resumo.micro.txt", "resumo.curto.txt", "resumo.md", "briefing.min.json", "prompt-curto.txt"],
2575
+ 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
2576
  guiaPorCapacidade,
2260
2577
  };
2261
2578
  }
@@ -2298,6 +2615,9 @@ async function gerarResumoProjetoIa(entrada, pastaSaidaOpcional, escreverNaRaiz
2298
2615
  : path.resolve(baseProjeto, ".tmp", "sema-resumo");
2299
2616
  await mkdir(pastaSaida, { recursive: true });
2300
2617
  const semaBrief = renderizarResumoProjetoMarkdown(geradoEm, modulos, guiaPorCapacidade);
2618
+ const semaBoot = renderizarSemaBoot(agentContextPack);
2619
+ const semaSmallModel = renderizarSemaSmallModel(agentContextPack);
2620
+ const docAgentesCapacidade = renderizarDocumentoAgentesPorCapacidade(agentContextPack);
2301
2621
  const indexJson = {
2302
2622
  comando: "resumo-projeto",
2303
2623
  geradoEm,
@@ -2317,7 +2637,7 @@ async function gerarResumoProjetoIa(entrada, pastaSaidaOpcional, escreverNaRaiz
2317
2637
  `MODULOS: ${modulos.length}`,
2318
2638
  `MODO_CODIGO: ${modoVerificacaoCodigo}`,
2319
2639
  `FONTES_CONCLUSAO: ${resumirListaTexto(fontesConclusao, 4)}`,
2320
- `ENTRADA_IA: ${entradaCanonica.porCapacidade.pequena.join(" -> ")}`,
2640
+ `ENTRADA_IA: ${entradaCanonica.porCapacidade.fraca.join(" -> ")}`,
2321
2641
  `TOP_MODULOS: ${resumirListaTexto(modulos.map((modulo) => modulo.modulo), 3)}`,
2322
2642
  `TOP_RISCOS: ${resumirListaTexto(unicosOrdenados(modulos.flatMap((modulo) => modulo.riscosPrincipais)), 3)}`,
2323
2643
  `TOP_LACUNAS: ${resumirListaTexto(unicosOrdenados(modulos.flatMap((modulo) => modulo.lacunas)), 3)}`,
@@ -2344,16 +2664,20 @@ async function gerarResumoProjetoIa(entrada, pastaSaidaOpcional, escreverNaRaiz
2344
2664
  "",
2345
2665
  ].join("\n");
2346
2666
  await writeFile(path.join(pastaSaida, "SEMA_BRIEF.md"), semaBrief, "utf8");
2667
+ await writeFile(path.join(pastaSaida, ARQUIVO_SEMA_BOOT), semaBoot, "utf8");
2668
+ await writeFile(path.join(pastaSaida, ARQUIVO_SEMA_SMALL_MODEL), semaSmallModel, "utf8");
2347
2669
  await writeFile(path.join(pastaSaida, "SEMA_BRIEF.micro.txt"), micro, "utf8");
2348
2670
  await writeFile(path.join(pastaSaida, "SEMA_BRIEF.curto.txt"), curto, "utf8");
2349
2671
  await writeFile(path.join(pastaSaida, "SEMA_INDEX.json"), `${JSON.stringify(indexJson, null, 2)}\n`, "utf8");
2350
2672
  await writeFile(path.join(pastaSaida, ARQUIVO_AGENT_CONTEXT_PACK), `${JSON.stringify(agentContextPack, null, 2)}\n`, "utf8");
2673
+ await mkdir(path.dirname(path.join(pastaSaida, ARQUIVO_DOC_AGENTES_CAPACIDADE)), { recursive: true });
2674
+ await writeFile(path.join(pastaSaida, ARQUIVO_DOC_AGENTES_CAPACIDADE), docAgentesCapacidade, "utf8");
2351
2675
  return {
2352
2676
  geradoEm,
2353
2677
  baseProjeto,
2354
2678
  pastaSaida,
2355
2679
  modoVerificacaoCodigo,
2356
- artefatos: ["SEMA_BRIEF.md", "SEMA_BRIEF.micro.txt", "SEMA_BRIEF.curto.txt", "SEMA_INDEX.json", ARQUIVO_AGENT_CONTEXT_PACK],
2680
+ 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
2681
  modulos,
2358
2682
  guiaPorCapacidade,
2359
2683
  };
@@ -2381,8 +2705,10 @@ async function gerarContextoIa(arquivoEntrada, pastaSaidaOpcional) {
2381
2705
 
2382
2706
  ## Arquivos gerados neste pacote
2383
2707
 
2384
- - \`agent-context-pack.json\`
2385
- - \`resumo.micro.txt\`
2708
+ - \`agent-context-pack.json\`
2709
+ - \`${ARQUIVO_SEMA_BOOT}\`
2710
+ - \`${ARQUIVO_SEMA_SMALL_MODEL}\`
2711
+ - \`resumo.micro.txt\`
2386
2712
  - \`resumo.curto.txt\`
2387
2713
  - \`resumo.md\`
2388
2714
  - \`briefing.min.json\`
@@ -2396,38 +2722,48 @@ async function gerarContextoIa(arquivoEntrada, pastaSaidaOpcional) {
2396
2722
 
2397
2723
  ## Fluxo recomendado para o agente
2398
2724
 
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\`.
2725
+ 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.
2726
+
2727
+ ### IA fraca, gratuita ou com pouca disciplina
2728
+
2729
+ 1. Ler \`${ARQUIVO_SEMA_BOOT}\`.
2730
+ 2. Ler \`${ARQUIVO_SEMA_SMALL_MODEL}\`.
2731
+ 3. Ler \`agent-context-pack.json\`.
2732
+ 4. Ler \`resumo.micro.txt\`.
2733
+ 5. Ler \`briefing.min.json\`.
2734
+ 6. Se ainda couber contexto, ler \`resumo.curto.txt\`.
2735
+
2736
+ ### IA média
2737
+
2738
+ 1. Ler \`${ARQUIVO_SEMA_BOOT}\`.
2739
+ 2. Ler \`agent-context-pack.json\`.
2740
+ 3. Ler \`resumo.curto.txt\`.
2741
+ 4. Ler \`briefing.min.json\`.
2742
+ 5. Ler \`drift.json\`.
2743
+ 6. Se precisar, subir para \`resumo.md\`.
2744
+
2745
+ ### IA forte ou com tool use
2746
+
2747
+ 1. Ler \`${ARQUIVO_SEMA_BOOT}\`.
2748
+ 2. Ler \`agent-context-pack.json\`.
2749
+ 3. Ler \`README.md\`.
2750
+ 4. Ler \`resumo.md\`.
2751
+ 5. Ler \`briefing.json\`.
2752
+ 6. Ler \`drift.json\`.
2753
+ 7. Só depois abrir \`ir.json\` e \`ast.json\`.
2754
+
2755
+ ## Idioma humano
2756
+
2757
+ - Responda no idioma do usuário.
2758
+ - Em PT-BR, use acentos, cedilha, pontuação e símbolos normais.
2759
+ - A DSL \`.sema\` pode ser ASCII; texto humano não precisa ser.
2424
2760
 
2425
2761
  ## Texto bruto sob demanda
2426
2762
 
2427
- - Abra \`AGENTS.md\` antes de editar codigo, contrato, docs operacionais, release ou deploy.
2763
+ - Abra \`AGENTS.md\` antes de editar código, contrato, docs operacionais, release ou deploy.
2428
2764
  - 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.
2765
+ - Abra \`docs/sintaxe.md\` quando exemplos não bastarem para resolver a gramática.
2766
+ - Abra \`contratos/\` antes de qualquer implementação ou mudança de comportamento.
2431
2767
 
2432
2768
  ## Fechamento
2433
2769
 
@@ -6703,9 +7039,11 @@ async function comandoSyncAiEntrypoints(emJson) {
6703
7039
  return 1;
6704
7040
  }
6705
7041
  const indexJson = JSON.parse(await readFile(path.join(resumoProjeto.pastaSaida, "SEMA_INDEX.json"), "utf8"));
7042
+ const entrypointsClientes = await sincronizarEntryPointsAgentes(resumoProjeto.baseProjeto, indexJson.agentContextPack);
6706
7043
  const artefatos = [...new Set([
6707
7044
  ...ARQUIVOS_CANONICOS_IA_RAIZ,
6708
7045
  ...resumoProjeto.artefatos,
7046
+ ...entrypointsClientes.arquivos.map((item) => item.caminho),
6709
7047
  "exemplos",
6710
7048
  ])];
6711
7049
  if (emJson) {
@@ -6716,6 +7054,7 @@ async function comandoSyncAiEntrypoints(emJson) {
6716
7054
  pastaSaida: resumoProjeto.pastaSaida,
6717
7055
  artefatos,
6718
7056
  entradaCanonica: indexJson.entradaCanonica,
7057
+ entrypointsClientes,
6719
7058
  exemplos,
6720
7059
  }, null, 2));
6721
7060
  return 0;
@@ -6723,10 +7062,11 @@ async function comandoSyncAiEntrypoints(emJson) {
6723
7062
  console.log("Entrypoints IA-first sincronizados");
6724
7063
  console.log("");
6725
7064
  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(" -> ")}`);
7065
+ console.log(`Ordem canônica: ${indexJson.entradaCanonica.ordemLeitura.join(" -> ")}`);
7066
+ console.log(`IA fraca: ${indexJson.entradaCanonica.porCapacidade.fraca.join(" -> ")}`);
7067
+ console.log(`IA média: ${indexJson.entradaCanonica.porCapacidade.media.join(" -> ")}`);
7068
+ console.log(`IA forte: ${indexJson.entradaCanonica.porCapacidade.forte.join(" -> ")}`);
7069
+ console.log(`Clientes: ${entrypointsClientes.criados.length} criados, ${entrypointsClientes.atualizados.length} atualizados, ${entrypointsClientes.preservados.length} preservados`);
6730
7070
  console.log(`Exemplos oficiais: ${exemplos.criados.length} criados, ${exemplos.preservados.length} preservados em ${exemplos.destino}`);
6731
7071
  return 0;
6732
7072
  }
@@ -6748,16 +7088,16 @@ async function comandoAjudaIa() {
6748
7088
  ]));
6749
7089
  console.log("");
6750
7090
  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`",
7091
+ "fraca: `sema resumo --micro`, `briefing.min.json`, `prompt-curto.txt`",
7092
+ "média: `sema resumo --curto`, `drift.json`, `briefing.min.json`",
7093
+ "forte: `sema contexto-ia`, `briefing.json`, `ir.json`, `ast.json`",
6754
7094
  ]));
6755
7095
  console.log("");
6756
7096
  console.log(renderizarSecaoAscii("Fluxo recomendado", [
6757
7097
  "Use `sema starter-ia` para um texto curto de onboarding.",
6758
7098
  "Use `sema sync-ai-entrypoints` para regenerar `AGENT_CONTEXT_PACK.json`, `SEMA_BRIEF.*` e `SEMA_INDEX.json` na raiz.",
6759
7099
  "Use `sema instalar-exemplos` para materializar `exemplos/` oficiais sem sobrescrever arquivos locais.",
6760
- "Use `sema resumo <arquivo> --micro --para onboarding` para IA pequena.",
7100
+ "Use `sema resumo <arquivo> --micro --para onboarding` para IA fraca.",
6761
7101
  "Use `sema prompt-curto <arquivo> --curto --para mudanca` para colar contexto em modelo gratuito.",
6762
7102
  "Use `sema prompt-ia`, `sema prompt-ia-ui`, `sema prompt-ia-react` e `sema prompt-ia-sema-primeiro` conforme a tarefa.",
6763
7103
  "Use `sema exemplos-prompt-ia` para pegar modelos prontos de prompt.",
@@ -6776,7 +7116,7 @@ async function comandoAjudaIa() {
6776
7116
  "Se voce quer testar a Sema de verdade, nao peca so HTML solto.",
6777
7117
  "Peca `.sema` + arquitetura + React + TypeScript, ou use o modo `Sema primeiro`.",
6778
7118
  "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.",
7119
+ "IA fraca comeca no menor artefato que resolve a tarefa; nao enfie `ast.json` inteiro nela de bobeira.",
6780
7120
  "Antes de editar software vivo, leia `briefing.min.json` ou `briefing.json` em vez de sair cavando arquivo na fe.",
6781
7121
  "Trate `route`, `worker`, `evento`, `fila`, `cron`, `webhook`, `cache`, `storage` e `policy` como superficies de primeira classe.",
6782
7122
  ]));
@@ -6905,7 +7245,7 @@ async function comandoPromptCurto(entrada, args, emJson) {
6905
7245
  if (entrada && entrada.toLowerCase().endsWith(".sema")) {
6906
7246
  const contexto = await carregarContextoModuloIa(alvo);
6907
7247
  const resumoSemantico = coletarResumoSemanticoModulo(contexto);
6908
- const capacidade = tamanho === "micro" ? "pequena" : tamanho === "curto" ? "media" : "grande";
7248
+ const capacidade = tamanho === "micro" ? "fraca" : tamanho === "curto" ? "media" : "forte";
6909
7249
  const prompt = criarPromptCurtoModulo(resumoSemantico, modo, tamanho, capacidade);
6910
7250
  if (emJson) {
6911
7251
  console.log(JSON.stringify({
@@ -6930,7 +7270,7 @@ async function comandoPromptCurto(entrada, args, emJson) {
6930
7270
  ? "SEMA_BRIEF.curto.txt"
6931
7271
  : "SEMA_BRIEF.md";
6932
7272
  const contextoProjeto = await readFile(path.join(resumoProjeto.pastaSaida, arquivoResumo), "utf8");
6933
- const capacidade = tamanho === "micro" ? "pequena" : tamanho === "curto" ? "media" : "grande";
7273
+ const capacidade = tamanho === "micro" ? "fraca" : tamanho === "curto" ? "media" : "forte";
6934
7274
  const prompt = `⚠️ REGRA OBRIGATÓRIA DE GOVERNANÇA:
6935
7275
 
6936
7276
  ANTES DE QUALQUER AÇÃO (editar, criar, deletar, executar, consultar, modificar):