@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.
- package/AGENTS.md +18 -2
- package/AGENT_CONTEXT_PACK.json +213 -46
- package/SEMA_BRIEF.curto.txt +8 -6
- package/SEMA_BRIEF.md +42 -19
- package/SEMA_BRIEF.micro.txt +7 -5
- package/SEMA_INDEX.json +848 -234
- package/dist/docs.js +72 -5
- package/dist/docs.js.map +1 -1
- package/dist/index.js +634 -153
- package/dist/index.js.map +1 -1
- package/docs/AGENT_STARTER.md +10 -8
- package/docs/agentes-por-capacidade.md +61 -0
- package/docs/env.md +3 -3
- package/docs/fluxo-pratico-ia-sema.md +17 -5
- package/docs/integracao-com-ia.md +14 -0
- package/docs/mcp.md +6 -0
- package/node_modules/@sema/gerador-css/dist/index.js +15 -7
- package/node_modules/@sema/gerador-css/dist/index.js.map +1 -1
- package/node_modules/@sema/gerador-dart/dist/index.js +11 -1
- package/node_modules/@sema/gerador-dart/dist/index.js.map +1 -1
- package/node_modules/@sema/gerador-html/dist/index.js +19 -7
- package/node_modules/@sema/gerador-html/dist/index.js.map +1 -1
- package/node_modules/@sema/gerador-javascript/dist/index.js +16 -2
- package/node_modules/@sema/gerador-javascript/dist/index.js.map +1 -1
- package/node_modules/@sema/gerador-lua/dist/index.js +19 -6
- package/node_modules/@sema/gerador-lua/dist/index.js.map +1 -1
- package/node_modules/@sema/gerador-python/dist/index.js +25 -8
- package/node_modules/@sema/gerador-python/dist/index.js.map +1 -1
- package/node_modules/@sema/gerador-typescript/dist/index.js +32 -14
- package/node_modules/@sema/gerador-typescript/dist/index.js.map +1 -1
- 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
|
|
40
|
-
- a Sema usa \`contexto-ia\` para gerar \`ast.json\`, \`ir.json\`, \`drift.json\`, \`briefing.json\` e artefatos compactos antes da edicao
|
|
41
|
-
-
|
|
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
|
|
51
|
-
- use \`sema resumo\` e \`briefing.min.json\` antes de subir para o pacote completo
|
|
52
|
-
-
|
|
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
|
|
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
|
|
80
|
-
|
|
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
|
|
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,
|
|
469
|
-
"novo projeto,
|
|
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
|
|
473
|
-
"[1] Projeto novo /
|
|
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
|
|
495
|
+
"[2] Editar projeto que já 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
|
|
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
|
|
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
|
-
"
|
|
512
|
-
"
|
|
513
|
-
"
|
|
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
|
-
"
|
|
521
|
-
"
|
|
522
|
-
"
|
|
523
|
-
"
|
|
524
|
-
"
|
|
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
|
-
"
|
|
527
|
-
"
|
|
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
|
-
|
|
1486
|
-
|
|
1487
|
-
|
|
1488
|
-
|
|
1489
|
-
|
|
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
|
-
|
|
1492
|
-
|
|
1493
|
-
|
|
1494
|
-
|
|
1495
|
-
|
|
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
|
-
|
|
1498
|
-
|
|
1499
|
-
|
|
1500
|
-
|
|
1501
|
-
|
|
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:
|
|
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
|
|
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:
|
|
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,
|
|
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:
|
|
1698
|
+
prioridade: 5,
|
|
1527
1699
|
obrigatorio: true,
|
|
1528
|
-
quandoUsar: "IA
|
|
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:
|
|
1706
|
+
prioridade: 6,
|
|
1535
1707
|
obrigatorio: true,
|
|
1536
|
-
quandoUsar: "IA
|
|
1537
|
-
incluirTextoBrutoQuando: "o
|
|
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:
|
|
1714
|
+
prioridade: 7,
|
|
1543
1715
|
obrigatorio: true,
|
|
1544
|
-
quandoUsar: "antes de abrir
|
|
1545
|
-
incluirTextoBrutoQuando: "a IA precisa mapear
|
|
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:
|
|
1722
|
+
prioridade: 8,
|
|
1551
1723
|
obrigatorio: true,
|
|
1552
|
-
quandoUsar: "antes de editar
|
|
1553
|
-
incluirTextoBrutoQuando: "a IA precisa confirmar regras locais
|
|
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:
|
|
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:
|
|
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: "
|
|
1569
|
-
incluirTextoBrutoQuando: "
|
|
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:
|
|
1754
|
+
prioridade: 12,
|
|
1575
1755
|
obrigatorio: false,
|
|
1576
|
-
quandoUsar: "
|
|
1577
|
-
incluirTextoBrutoQuando: "a IA vai editar contrato e os exemplos
|
|
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:
|
|
1762
|
+
prioridade: 13,
|
|
1583
1763
|
obrigatorio: true,
|
|
1584
|
-
quandoUsar: "antes de qualquer
|
|
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:
|
|
1591
|
-
objetivo: "Dar a agentes IA uma entrada curta, estruturada e
|
|
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
|
|
1602
|
-
"Leia
|
|
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,
|
|
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
|
|
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
|
-
"
|
|
1610
|
-
"
|
|
1611
|
-
"
|
|
1612
|
-
"
|
|
1613
|
-
"
|
|
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,
|
|
1807
|
+
"Contrato, índice e AGENTS antes de código cru.",
|
|
1618
1808
|
"Exemplos oficiais antes de nova sintaxe.",
|
|
1619
|
-
"
|
|
1620
|
-
"
|
|
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
|
|
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 `
|
|
1928
|
-
|
|
1929
|
-
Esta linguagem existe para traduzir
|
|
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
|
-
-
|
|
1936
|
-
- preserve a
|
|
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
|
-
-
|
|
1940
|
-
|
|
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
|
|
1961
|
-
`- IA
|
|
1962
|
-
`- IA
|
|
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
|
|
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
|
|
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
|
-
|
|
1999
|
-
|
|
2000
|
-
|
|
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", "
|
|
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.
|
|
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
|
-
- \`
|
|
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
|
|
2400
|
-
|
|
2401
|
-
### IA
|
|
2402
|
-
|
|
2403
|
-
1. Ler
|
|
2404
|
-
2. Ler
|
|
2405
|
-
3. Ler \`
|
|
2406
|
-
4.
|
|
2407
|
-
|
|
2408
|
-
|
|
2409
|
-
|
|
2410
|
-
|
|
2411
|
-
|
|
2412
|
-
|
|
2413
|
-
|
|
2414
|
-
|
|
2415
|
-
|
|
2416
|
-
|
|
2417
|
-
|
|
2418
|
-
|
|
2419
|
-
|
|
2420
|
-
|
|
2421
|
-
|
|
2422
|
-
|
|
2423
|
-
|
|
2424
|
-
|
|
2425
|
-
|
|
2426
|
-
|
|
2427
|
-
|
|
2428
|
-
|
|
2429
|
-
|
|
2430
|
-
|
|
2431
|
-
|
|
2432
|
-
|
|
2433
|
-
|
|
2434
|
-
|
|
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. Só 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
|
|
6727
|
-
console.log(`IA
|
|
6728
|
-
console.log(`IA
|
|
6729
|
-
console.log(`IA
|
|
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
|
-
"
|
|
6752
|
-
"
|
|
6753
|
-
"
|
|
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
|
|
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
|
|
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" ? "
|
|
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" ? "
|
|
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):
|