@semacode/cli 1.5.17 → 1.5.18
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/README.md +104 -112
- package/SEMA_BRIEF.curto.txt +6 -6
- package/SEMA_BRIEF.md +17 -24
- package/SEMA_BRIEF.micro.txt +5 -5
- package/SEMA_INDEX.json +86 -224
- package/dist/drift.d.ts +3 -3
- package/dist/drift.js +5 -111
- package/dist/drift.js.map +1 -1
- package/dist/importador.d.ts +1 -1
- package/dist/importador.js +1 -200
- package/dist/importador.js.map +1 -1
- package/dist/index.js +59 -479
- package/dist/index.js.map +1 -1
- package/dist/projeto.js +0 -20
- package/dist/projeto.js.map +1 -1
- package/dist/tipos.d.ts +1 -1
- package/docs/AGENT_STARTER.md +9 -8
- package/docs/cli.md +106 -119
- package/docs/como-ensinar-a-sema-para-ia.md +4 -4
- package/docs/env.md +56 -56
- package/docs/fluxo-pratico-ia-sema.md +171 -167
- package/docs/integracao-com-ia.md +98 -96
- package/docs/mcp.md +51 -53
- package/docs/pagamento-ponta-a-ponta.md +11 -1
- package/docs/persistencia-vendor-first.md +1 -1
- package/docs/prompt-base-ia-sema.md +6 -5
- package/docs/rollback.md +1 -1
- package/docs/sintaxe.md +196 -394
- package/exemplos/agendamento.sema +0 -1
- package/exemplos/assinatura.sema +0 -3
- package/exemplos/auditoria.sema +2 -1
- package/exemplos/estoque.sema +2 -1
- package/exemplos/fila.sema +2 -3
- package/exemplos/multi_tenant.sema +2 -2
- package/exemplos/notificacao.sema +53 -2
- package/exemplos/operacao_estrategia.sema +231 -0
- package/exemplos/pagamento.sema +214 -2
- package/exemplos/pedido.sema +156 -20
- package/exemplos/replica_analitica_erp.sema +160 -0
- package/exemplos/webhook.sema +2 -4
- package/node_modules/@sema/gerador-css/package.json +1 -1
- package/node_modules/@sema/gerador-dart/package.json +1 -1
- package/node_modules/@sema/gerador-html/package.json +1 -1
- package/node_modules/@sema/gerador-javascript/package.json +1 -1
- package/node_modules/@sema/gerador-lua/package.json +1 -1
- package/node_modules/@sema/gerador-python/package.json +1 -1
- package/node_modules/@sema/gerador-typescript/package.json +1 -1
- package/node_modules/@sema/nucleo/dist/ast/tipos.d.ts +2 -4
- package/node_modules/@sema/nucleo/dist/formatador/index.js +14 -42
- package/node_modules/@sema/nucleo/dist/formatador/index.js.map +1 -1
- package/node_modules/@sema/nucleo/dist/ir/conversor.js +9 -204
- package/node_modules/@sema/nucleo/dist/ir/conversor.js.map +1 -1
- package/node_modules/@sema/nucleo/dist/ir/modelos.d.ts +3 -35
- package/node_modules/@sema/nucleo/dist/lexer/tokens.js +0 -21
- package/node_modules/@sema/nucleo/dist/lexer/tokens.js.map +1 -1
- package/node_modules/@sema/nucleo/dist/parser/parser.js +0 -40
- package/node_modules/@sema/nucleo/dist/parser/parser.js.map +1 -1
- package/node_modules/@sema/nucleo/dist/semantico/analisador.d.ts +6 -5
- package/node_modules/@sema/nucleo/dist/semantico/analisador.js +76 -307
- package/node_modules/@sema/nucleo/dist/semantico/analisador.js.map +1 -1
- package/node_modules/@sema/nucleo/dist/semantico/estruturas.d.ts +2 -0
- package/node_modules/@sema/nucleo/dist/semantico/estruturas.js +32 -2
- package/node_modules/@sema/nucleo/dist/semantico/estruturas.js.map +1 -1
- package/node_modules/@sema/nucleo/package.json +1 -1
- package/node_modules/@sema/padroes/package.json +1 -1
- package/package.json +14 -14
package/dist/index.js
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { mkdirSync, rmSync, writeFileSync } from "node:fs";
|
|
3
2
|
import { mkdir, readFile, readdir, stat, writeFile } from "node:fs/promises";
|
|
4
3
|
import path from "node:path";
|
|
5
4
|
import { spawnSync } from "node:child_process";
|
|
5
|
+
import { createRequire } from "node:module";
|
|
6
6
|
import { fileURLToPath } from "node:url";
|
|
7
|
-
import ts from "typescript";
|
|
8
7
|
import pacoteCli from "../package.json" with { type: "json" };
|
|
9
8
|
import { compilarCodigo, formatarCodigo, formatarDiagnosticos, lerArquivoTexto, temErros, } from "@sema/nucleo";
|
|
10
9
|
import { descreverEstruturaModulo } from "@sema/padroes";
|
|
@@ -19,15 +18,16 @@ import { carregarConfiguracaoProjeto, carregarProjeto, resolverAlvoPadrao, resol
|
|
|
19
18
|
import { importarProjetoLegado, resumoImportacao } from "./importador.js";
|
|
20
19
|
import { analisarDriftLegado, assistirRenomeacaoSemantica, gerarMapaImpactoSemantico, } from "./drift.js";
|
|
21
20
|
import { resolverDocumentacaoObrigatoria, verificarDocumentacaoMudanca, } from "./docs.js";
|
|
22
|
-
const STARTER_IA = `Voce esta trabalhando com Sema, um
|
|
21
|
+
const STARTER_IA = `Voce esta trabalhando com Sema, um contrato semantico IA-first para agentes operarem software vivo em backend e front consumer.
|
|
23
22
|
|
|
24
23
|
Importante:
|
|
25
|
-
- a Sema se apresenta publicamente como protocolo e funciona tecnicamente como linguagem de intencao
|
|
26
|
-
- a Sema e protocolo de governanca semantica desenhado para IA, nao para ergonomia humana
|
|
27
|
-
-
|
|
24
|
+
- a Sema se apresenta publicamente como protocolo e funciona tecnicamente como linguagem de intencao
|
|
25
|
+
- a Sema e protocolo de governanca semantica desenhado para IA, nao para ergonomia humana
|
|
26
|
+
- humanos sao autores/aprovadores; agentes sao os consumidores primarios do contrato
|
|
27
|
+
- leitura humana e bonus toleravel, nao objetivo de produto
|
|
28
28
|
- a Sema nao e gerador magico que deveria fazer tudo
|
|
29
29
|
- a Sema modela contratos, estados, fluxos, erros, efeitos, garantias, vinculos e execucao
|
|
30
|
-
- a Sema gera codigo e scaffolding real para TypeScript, Python
|
|
30
|
+
- a Sema gera codigo e scaffolding real para TypeScript, Python e Dart
|
|
31
31
|
- a Sema usa \`importar\` para bootstrap revisavel, nao para contrato final automatico
|
|
32
32
|
- a Sema usa \`impl\` para ligar task a simbolo real do runtime
|
|
33
33
|
- a Sema usa \`vinculos\` para ligar contrato a arquivo, simbolo, recurso e superficie real
|
|
@@ -55,19 +55,19 @@ Regras:
|
|
|
55
55
|
Comandos essenciais:
|
|
56
56
|
- resumo compacto por capacidade: \`sema resumo <arquivo-ou-pasta> [--micro|--curto|--medio] [--para <resumo|onboarding|review|mudanca|bug|arquitetura>]\`
|
|
57
57
|
- prompt curto para IA pequena: \`sema prompt-curto <arquivo-ou-pasta> [--micro|--curto|--medio] [--para <resumo|onboarding|review|mudanca|bug|arquitetura>]\`
|
|
58
|
-
- descoberta do projeto: \`sema inspecionar [arquivo-ou-pasta] --json\`
|
|
59
|
-
- auditoria do contrato vivo: \`sema drift <arquivo-ou-pasta> [--escopo <arquivo|modulo|projeto>] [--json]\`
|
|
60
|
-
- mapa de impacto: \`sema impacto <arquivo-ou-pasta> --alvo <token> [--mudanca <descricao>] [--json]\`
|
|
61
|
-
- renomeacao assistida: \`sema renomear-semantico <arquivo-ou-pasta> --de <nome-atual> --para <nome-novo> [--json]\`
|
|
58
|
+
- descoberta do projeto: \`sema inspecionar [arquivo-ou-pasta] --json\`
|
|
59
|
+
- auditoria do contrato vivo: \`sema drift <arquivo-ou-pasta> [--escopo <arquivo|modulo|projeto>] [--json]\`
|
|
60
|
+
- mapa de impacto: \`sema impacto <arquivo-ou-pasta> --alvo <token> [--mudanca <descricao>] [--json]\`
|
|
61
|
+
- renomeacao assistida: \`sema renomear-semantico <arquivo-ou-pasta> --de <nome-atual> --para <nome-novo> [--json]\`
|
|
62
62
|
- contexto completo do modulo: \`sema contexto-ia <arquivo.sema>\`
|
|
63
63
|
- estrutura sintatica: \`sema ast <arquivo.sema> --json\`
|
|
64
64
|
- estrutura semantica: \`sema ir <arquivo.sema> --json\`
|
|
65
65
|
- validacao: \`sema validar <arquivo.sema> --json\`
|
|
66
66
|
- diagnosticos: \`sema diagnosticos <arquivo.sema> --json\`
|
|
67
67
|
- formatacao: \`sema formatar <arquivo.sema>\`
|
|
68
|
-
- importacao assistida de legado: \`sema importar <nestjs|fastapi|flask|nextjs|nextjs-consumer|react-vite-consumer|angular-consumer|flutter-consumer|firebase|
|
|
69
|
-
- exemplos oficiais no projeto: \`sema instalar-exemplos\`
|
|
70
|
-
- geracao de codigo: \`sema compilar <arquivo-ou-pasta> --alvo <typescript|python|dart|lua> --saida <diretorio>\`
|
|
68
|
+
- importacao assistida de legado: \`sema importar <nestjs|fastapi|flask|nextjs|nextjs-consumer|react-vite-consumer|angular-consumer|flutter-consumer|firebase|dotnet|java|go|rust|cpp|typescript|python|dart> <diretorio> --saida <diretorio>\`
|
|
69
|
+
- exemplos oficiais no projeto: \`sema instalar-exemplos\`
|
|
70
|
+
- geracao de codigo: \`sema compilar <arquivo-ou-pasta> --alvo <typescript|python|dart|lua> --saida <diretorio>\`
|
|
71
71
|
- verificacao final: \`sema verificar <arquivo-ou-pasta> [--json]\`
|
|
72
72
|
|
|
73
73
|
Antes de editar:
|
|
@@ -106,9 +106,9 @@ Superficies que a IA deve enxergar como first-class:
|
|
|
106
106
|
|
|
107
107
|
Nao improvise quando faltar contexto.
|
|
108
108
|
`;
|
|
109
|
-
const PROMPT_BASE_IA = `Voce esta trabalhando com Sema, um
|
|
110
|
-
|
|
111
|
-
Trate a Sema como
|
|
109
|
+
const PROMPT_BASE_IA = `Voce esta trabalhando com Sema, um contrato semantico IA-first para agentes operarem software vivo.
|
|
110
|
+
|
|
111
|
+
Trate a Sema como protocolo de governanca semantica e linguagem de intencao feita para IA, nao para leitura humana confortavel. Humanos escrevem e aprovam; agentes consomem. Nao invente sintaxe, palavras-chave ou blocos fora da gramatica e dos exemplos oficiais.
|
|
112
112
|
|
|
113
113
|
Fontes de verdade, em ordem:
|
|
114
114
|
1. se o projeto expuser \`SEMA_CONTEXT.md\`, comece por ele
|
|
@@ -124,9 +124,10 @@ Fontes de verdade, em ordem:
|
|
|
124
124
|
Regras de operacao:
|
|
125
125
|
- preserve o significado semantico
|
|
126
126
|
- use o formatador oficial da Sema como fonte unica de estilo
|
|
127
|
-
- use diagnosticos estruturados como contrato de correcao
|
|
128
|
-
- use a IR como fonte de verdade semantica quando houver duvida
|
|
129
|
-
-
|
|
127
|
+
- use diagnosticos estruturados como contrato de correcao
|
|
128
|
+
- use a IR como fonte de verdade semantica quando houver duvida
|
|
129
|
+
- use predicados canonicos como normalizacao opcional, preservando a forma original
|
|
130
|
+
- nao conclua uma alteracao sem validar e verificar o modulo
|
|
130
131
|
- comece pelo menor artefato semantico que resolva a tarefa
|
|
131
132
|
|
|
132
133
|
Antes de editar \`.sema\`, entenda:
|
|
@@ -325,6 +326,7 @@ Comandos uteis da CLI para esse fluxo:
|
|
|
325
326
|
`;
|
|
326
327
|
const DIRETORIO_CLI_ATUAL = path.dirname(fileURLToPath(import.meta.url));
|
|
327
328
|
const VERSAO_CLI = pacoteCli.version;
|
|
329
|
+
const requireRuntimeCli = createRequire(import.meta.url);
|
|
328
330
|
const ARQUIVOS_CANONICOS_IA_RAIZ = [
|
|
329
331
|
"llms.txt",
|
|
330
332
|
"SEMA_BRIEF.md",
|
|
@@ -348,6 +350,16 @@ const DOCUMENTOS_SUPORTE_IA = [
|
|
|
348
350
|
"docs/rollback.md",
|
|
349
351
|
"docs/extensao-vscode.md",
|
|
350
352
|
];
|
|
353
|
+
function resolverImportadorNodeOpcional(especificador) {
|
|
354
|
+
try {
|
|
355
|
+
return requireRuntimeCli.resolve(especificador);
|
|
356
|
+
}
|
|
357
|
+
catch {
|
|
358
|
+
return undefined;
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
const TSX_IMPORTADOR_CLI = resolverImportadorNodeOpcional("tsx");
|
|
362
|
+
const TSX_EXECUTOR_CLI = resolverImportadorNodeOpcional("tsx/cli");
|
|
351
363
|
async function caminhoEhDiretorio(caminhoAlvo) {
|
|
352
364
|
try {
|
|
353
365
|
return (await stat(caminhoAlvo)).isDirectory();
|
|
@@ -467,7 +479,7 @@ function ajuda() {
|
|
|
467
479
|
"auditoria: sema drift <arquivo-ou-pasta> [--escopo <arquivo|modulo|projeto>] [--incluir-worktrees] [--incluir-consumidores-laterais] [--json]",
|
|
468
480
|
"impacto: sema impacto <arquivo-ou-pasta> --alvo <token> [--mudanca <descricao>] [--escopo <arquivo|modulo|projeto>] [--json]",
|
|
469
481
|
"renomeacao: sema renomear-semantico <arquivo-ou-pasta> --de <nome-atual> --para <nome-novo> [--escopo <arquivo|modulo|projeto>] [--json]",
|
|
470
|
-
"importacao: sema importar <nestjs|fastapi|flask|nextjs|nextjs-consumer|react-vite-consumer|angular-consumer|flutter-consumer|firebase|
|
|
482
|
+
"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]",
|
|
471
483
|
"validacao: sema validar <arquivo-ou-pasta> [--json]",
|
|
472
484
|
"diagnostico: sema diagnosticos <arquivo.sema> [--json]",
|
|
473
485
|
"geracao: sema compilar <arquivo-ou-pasta> --alvo <python|typescript|dart|lua> --saida <diretorio> [--estrutura <flat|modulos|backend>] [--framework <base|nestjs|fastapi>]",
|
|
@@ -486,8 +498,6 @@ function ajuda() {
|
|
|
486
498
|
"sema prompt-ia-react",
|
|
487
499
|
"sema prompt-ia-sema-primeiro",
|
|
488
500
|
"sema exemplos-prompt-ia",
|
|
489
|
-
"sema author [--help]",
|
|
490
|
-
"sema author exemplo [--sensivel] [--json]",
|
|
491
501
|
"sema contexto-ia <arquivo.sema> [--saida <diretorio>] [--json]",
|
|
492
502
|
"sema sync-ai-entrypoints [--json]",
|
|
493
503
|
"sema instalar-exemplos [--json]",
|
|
@@ -648,7 +658,11 @@ function coletarDependenciasDoctor() {
|
|
|
648
658
|
comando: "verificar/typescript",
|
|
649
659
|
itens: [
|
|
650
660
|
criarItemDependencia("node", comandoDisponivel("node"), "execucao do runner TypeScript"),
|
|
651
|
-
criarItemDependencia("
|
|
661
|
+
criarItemDependencia("tsx", Boolean(TSX_EXECUTOR_CLI ?? TSX_IMPORTADOR_CLI), TSX_EXECUTOR_CLI
|
|
662
|
+
? `runner resolvido em ${TSX_EXECUTOR_CLI}`
|
|
663
|
+
: TSX_IMPORTADOR_CLI
|
|
664
|
+
? `importador resolvido em ${TSX_IMPORTADOR_CLI}`
|
|
665
|
+
: "tsx nao foi encontrado junto da CLI"),
|
|
652
666
|
],
|
|
653
667
|
},
|
|
654
668
|
{
|
|
@@ -698,7 +712,11 @@ function avaliarPreflightVerificacao(configuracoesAlvo) {
|
|
|
698
712
|
if (configuracao.alvo === "typescript") {
|
|
699
713
|
registrar("verificar/typescript", [
|
|
700
714
|
criarItemDependencia("node", comandoDisponivel("node"), "execucao do runner TypeScript"),
|
|
701
|
-
criarItemDependencia("
|
|
715
|
+
criarItemDependencia("tsx", Boolean(TSX_EXECUTOR_CLI ?? TSX_IMPORTADOR_CLI), TSX_EXECUTOR_CLI
|
|
716
|
+
? `runner resolvido em ${TSX_EXECUTOR_CLI}`
|
|
717
|
+
: TSX_IMPORTADOR_CLI
|
|
718
|
+
? `importador resolvido em ${TSX_IMPORTADOR_CLI}`
|
|
719
|
+
: "tsx nao foi encontrado junto da CLI"),
|
|
702
720
|
]);
|
|
703
721
|
continue;
|
|
704
722
|
}
|
|
@@ -825,12 +843,6 @@ function normalizarFonteImportacao(valor) {
|
|
|
825
843
|
if (valor === "cpp" || valor === "cxx" || valor === "cc" || valor === "c++") {
|
|
826
844
|
return "cpp";
|
|
827
845
|
}
|
|
828
|
-
if (valor === "lua") {
|
|
829
|
-
return "lua";
|
|
830
|
-
}
|
|
831
|
-
if (valor === "php" || valor === "laravel" || valor === "symfony") {
|
|
832
|
-
return "php";
|
|
833
|
-
}
|
|
834
846
|
if (valor === "nestjs"
|
|
835
847
|
|| valor === "fastapi"
|
|
836
848
|
|| valor === "flask"
|
|
@@ -845,11 +857,9 @@ function normalizarFonteImportacao(valor) {
|
|
|
845
857
|
|| valor === "go"
|
|
846
858
|
|| valor === "rust"
|
|
847
859
|
|| valor === "cpp"
|
|
848
|
-
|| valor === "php"
|
|
849
860
|
|| valor === "typescript"
|
|
850
861
|
|| valor === "python"
|
|
851
|
-
|| valor === "dart"
|
|
852
|
-
|| valor === "lua") {
|
|
862
|
+
|| valor === "dart") {
|
|
853
863
|
return valor;
|
|
854
864
|
}
|
|
855
865
|
return undefined;
|
|
@@ -985,35 +995,6 @@ function contarCasosDeTesteGerados(alvo, arquivos) {
|
|
|
985
995
|
}
|
|
986
996
|
return (arquivoTeste.conteudo.match(/\bdef test_/g) ?? []).length;
|
|
987
997
|
}
|
|
988
|
-
function reescreverImportsTypeScriptGerados(codigo) {
|
|
989
|
-
return codigo
|
|
990
|
-
.replace(/(from\s+["']\.{1,2}\/[^"']+)\.ts(["'])/g, "$1.cjs$2")
|
|
991
|
-
.replace(/(require\(\s*["']\.{1,2}\/[^"']+)\.ts(["']\s*\))/g, "$1.cjs$2");
|
|
992
|
-
}
|
|
993
|
-
function compilarTypeScriptGeradoParaNodeTest(baseSaida, arquivos, arquivoTeste) {
|
|
994
|
-
const pastaRuntime = path.join(baseSaida, ".sema-js-tests");
|
|
995
|
-
rmSync(pastaRuntime, { recursive: true, force: true });
|
|
996
|
-
for (const arquivo of arquivos) {
|
|
997
|
-
if (!arquivo.caminhoRelativo.endsWith(".ts")) {
|
|
998
|
-
continue;
|
|
999
|
-
}
|
|
1000
|
-
const caminhoRelativoJs = arquivo.caminhoRelativo.replace(/\.ts$/i, ".cjs");
|
|
1001
|
-
const destino = path.join(pastaRuntime, caminhoRelativoJs);
|
|
1002
|
-
mkdirSync(path.dirname(destino), { recursive: true });
|
|
1003
|
-
const transpilado = ts.transpileModule(arquivo.conteudo, {
|
|
1004
|
-
fileName: arquivo.caminhoRelativo,
|
|
1005
|
-
compilerOptions: {
|
|
1006
|
-
module: ts.ModuleKind.CommonJS,
|
|
1007
|
-
target: ts.ScriptTarget.ES2022,
|
|
1008
|
-
esModuleInterop: true,
|
|
1009
|
-
sourceMap: false,
|
|
1010
|
-
inlineSourceMap: false,
|
|
1011
|
-
},
|
|
1012
|
-
}).outputText;
|
|
1013
|
-
writeFileSync(destino, reescreverImportsTypeScriptGerados(transpilado), "utf8");
|
|
1014
|
-
}
|
|
1015
|
-
return path.join(pastaRuntime, arquivoTeste.replace(/\.ts$/i, ".cjs"));
|
|
1016
|
-
}
|
|
1017
998
|
function executarTestesGerados(alvo, baseSaida, arquivos, silencioso = false) {
|
|
1018
999
|
const quantidadeTestes = contarCasosDeTesteGerados(alvo, arquivos);
|
|
1019
1000
|
if (quantidadeTestes === 0) {
|
|
@@ -1034,8 +1015,15 @@ function executarTestesGerados(alvo, baseSaida, arquivos, silencioso = false) {
|
|
|
1034
1015
|
}
|
|
1035
1016
|
return { codigoSaida: 0, quantidadeTestes, saidaPadrao: "", saidaErro: "" };
|
|
1036
1017
|
}
|
|
1037
|
-
|
|
1038
|
-
|
|
1018
|
+
if (!TSX_EXECUTOR_CLI) {
|
|
1019
|
+
return {
|
|
1020
|
+
codigoSaida: 1,
|
|
1021
|
+
quantidadeTestes,
|
|
1022
|
+
saidaPadrao: "",
|
|
1023
|
+
saidaErro: "Nao foi possivel localizar o runner tsx junto da CLI para executar testes TypeScript.",
|
|
1024
|
+
};
|
|
1025
|
+
}
|
|
1026
|
+
const execucao = spawnSync("node", [TSX_EXECUTOR_CLI, arquivoTeste], {
|
|
1039
1027
|
stdio: silencioso ? "pipe" : "inherit",
|
|
1040
1028
|
cwd: baseSaida,
|
|
1041
1029
|
encoding: silencioso ? "utf8" : undefined,
|
|
@@ -1357,7 +1345,6 @@ function coletarResumoSemanticoModulo(contexto) {
|
|
|
1357
1345
|
...rotas.map((route) => `${route.metodo ?? "?"} ${route.caminho ?? route.nome}`),
|
|
1358
1346
|
]), 8),
|
|
1359
1347
|
regrasCriticas: limitarLista(regrasCriticas, 8),
|
|
1360
|
-
regrasAuthorAutomaticas: extrairRegrasAuthorAutomaticas(ir),
|
|
1361
1348
|
efeitos: limitarLista(efeitos, 8),
|
|
1362
1349
|
erros: limitarLista(erros, 8),
|
|
1363
1350
|
entidadesAfetadas: limitarLista(entidadesAfetadas, 8),
|
|
@@ -1376,19 +1363,6 @@ function coletarResumoSemanticoModulo(contexto) {
|
|
|
1376
1363
|
arquivosProvaveisEditar: limitarLista(unicosOrdenados(briefing.arquivosProvaveisEditar ?? briefing.oQueTocar), 8),
|
|
1377
1364
|
};
|
|
1378
1365
|
}
|
|
1379
|
-
const NOME_REGRAS_AUTHOR_AUTOMATICAS = "regras_gerais_author";
|
|
1380
|
-
const LINHA_REGRAS_AUTHOR_AUTOMATICAS_COMPACTA = "AUTHOR_RULES_AUTO: regras_gerais_author ativa; aplicar evidencia concreta, causa/consequencia, cena com dupla funcao, exposicao com atrito, subtexto, acao com geografia/dano, final sem slogan, morte com peso estrutural e anti-cliche adaptativa.";
|
|
1381
|
-
function extrairRegrasAuthorAutomaticas(ir) {
|
|
1382
|
-
const regraAutomatica = ir?.author.find((item) => item.tipo === "style_rule" && item.nome === NOME_REGRAS_AUTHOR_AUTOMATICAS);
|
|
1383
|
-
return limitarLista(unicosOrdenados(regraAutomatica?.requisitos ?? []), 20);
|
|
1384
|
-
}
|
|
1385
|
-
function renderizarLinhaRegrasAuthorAutomaticas(ids) {
|
|
1386
|
-
return ids.length > 0 ? LINHA_REGRAS_AUTHOR_AUTOMATICAS_COMPACTA : null;
|
|
1387
|
-
}
|
|
1388
|
-
function renderizarLinhasRegrasAuthorAutomaticas(ids) {
|
|
1389
|
-
const linha = renderizarLinhaRegrasAuthorAutomaticas(ids);
|
|
1390
|
-
return linha ? [linha] : [];
|
|
1391
|
-
}
|
|
1392
1366
|
function renderizarResumoModuloTexto(resumo, tamanho, modo) {
|
|
1393
1367
|
const limite = tamanho === "micro" ? 2 : tamanho === "curto" ? 4 : 6;
|
|
1394
1368
|
const linhas = [
|
|
@@ -1396,7 +1370,6 @@ function renderizarResumoModuloTexto(resumo, tamanho, modo) {
|
|
|
1396
1370
|
`MODULO: ${resumo.modulo}`,
|
|
1397
1371
|
`FAZ: ${resumo.faz}`,
|
|
1398
1372
|
`PERFIL: ${resumo.perfilCompatibilidade}`,
|
|
1399
|
-
...renderizarLinhasRegrasAuthorAutomaticas(resumo.regrasAuthorAutomaticas),
|
|
1400
1373
|
`CONSUMER_FRAMEWORK: ${resumo.consumerFramework ?? "nenhum"}`,
|
|
1401
1374
|
`APP_ROUTES: ${resumirListaTexto(resumo.appRoutes, limite)}`,
|
|
1402
1375
|
`CONSUMER_SURFACES: ${resumirListaTexto(resumo.consumerSurfaces, limite)}`,
|
|
@@ -1421,8 +1394,7 @@ function renderizarResumoModuloTexto(resumo, tamanho, modo) {
|
|
|
1421
1394
|
`GERADO_EM: ${resumo.geradoEm}`,
|
|
1422
1395
|
];
|
|
1423
1396
|
if (tamanho === "micro") {
|
|
1424
|
-
|
|
1425
|
-
return `${linhas.slice(0, limiteMicro).join("\n")}\n`;
|
|
1397
|
+
return `${linhas.slice(0, 12).join("\n")}\n`;
|
|
1426
1398
|
}
|
|
1427
1399
|
return `${linhas.join("\n")}\n`;
|
|
1428
1400
|
}
|
|
@@ -1449,9 +1421,6 @@ function renderizarResumoModuloMarkdown(resumo, modo, guiaPorCapacidade) {
|
|
|
1449
1421
|
`- Entradas chave: ${resumirListaTexto(resumo.entradasChave, 6)}`,
|
|
1450
1422
|
`- Saidas chave: ${resumirListaTexto(resumo.saidasChave, 6)}`,
|
|
1451
1423
|
`- Regras criticas: ${resumirListaTexto(resumo.regrasCriticas, 6)}`,
|
|
1452
|
-
...(resumo.regrasAuthorAutomaticas.length > 0
|
|
1453
|
-
? [`- Regras Author automaticas: ${resumirListaTexto(resumo.regrasAuthorAutomaticas, 20)}`]
|
|
1454
|
-
: []),
|
|
1455
1424
|
`- Efeitos: ${resumirListaTexto(resumo.efeitos, 6)}`,
|
|
1456
1425
|
`- Erros: ${resumirListaTexto(resumo.erros, 6)}`,
|
|
1457
1426
|
`- Entidades afetadas: ${resumirListaTexto(resumo.entidadesAfetadas, 6)}`,
|
|
@@ -1511,7 +1480,6 @@ function criarBriefingMinimo(resumo, modo, tamanho) {
|
|
|
1511
1480
|
entradasChave: resumo.entradasChave,
|
|
1512
1481
|
saidasChave: resumo.saidasChave,
|
|
1513
1482
|
regrasCriticas: resumo.regrasCriticas,
|
|
1514
|
-
regrasAuthorAutomaticas: resumo.regrasAuthorAutomaticas,
|
|
1515
1483
|
efeitos: resumo.efeitos,
|
|
1516
1484
|
erros: resumo.erros,
|
|
1517
1485
|
arquivosProvaveis: resumo.arquivosProvaveis,
|
|
@@ -1533,7 +1501,7 @@ function criarPromptCurtoModulo(resumo, modo, tamanho, capacidade) {
|
|
|
1533
1501
|
const resumoTexto = renderizarResumoModuloTexto(resumo, tamanho, modo).trim();
|
|
1534
1502
|
return `Voce esta operando Sema em modo IA-first.
|
|
1535
1503
|
|
|
1536
|
-
Esta linguagem
|
|
1504
|
+
Esta linguagem existe para traduzir intencao operacional em contrato consumivel por IA. Humanos aprovam; agentes operam.
|
|
1537
1505
|
|
|
1538
1506
|
Capacidade alvo: ${capacidade}
|
|
1539
1507
|
Modo da tarefa: ${modo}
|
|
@@ -1552,11 +1520,10 @@ ${resumoTexto}
|
|
|
1552
1520
|
}
|
|
1553
1521
|
function renderizarResumoProjetoMarkdown(geradoEm, modulos, guiaPorCapacidade) {
|
|
1554
1522
|
const entradaCanonica = criarEntradaCanonicaProjeto(guiaPorCapacidade);
|
|
1555
|
-
const regrasAuthorAutomaticas = unicosOrdenados(modulos.flatMap((modulo) => modulo.regrasAuthorAutomaticas));
|
|
1556
1523
|
const linhas = [
|
|
1557
1524
|
"# SEMA_BRIEF",
|
|
1558
1525
|
"",
|
|
1559
|
-
"Sema e IA-first. Este arquivo existe para IA achar o ponto de entrada do projeto sem
|
|
1526
|
+
"Sema e IA-first. Este arquivo existe para IA achar o ponto de entrada do projeto sem varrer o repo inteiro no escuro.",
|
|
1560
1527
|
"",
|
|
1561
1528
|
`- Gerado em: \`${geradoEm}\``,
|
|
1562
1529
|
`- Modulos: \`${modulos.length}\``,
|
|
@@ -1567,9 +1534,6 @@ function renderizarResumoProjetoMarkdown(geradoEm, modulos, guiaPorCapacidade) {
|
|
|
1567
1534
|
`- IA pequena: ${entradaCanonica.porCapacidade.pequena.join(" -> ")}`,
|
|
1568
1535
|
`- IA media: ${entradaCanonica.porCapacidade.media.join(" -> ")}`,
|
|
1569
1536
|
`- IA grande: ${entradaCanonica.porCapacidade.grande.join(" -> ")}`,
|
|
1570
|
-
...(regrasAuthorAutomaticas.length > 0
|
|
1571
|
-
? [`- Regras Author automaticas: ${resumirListaTexto(regrasAuthorAutomaticas, 20)}`]
|
|
1572
|
-
: []),
|
|
1573
1537
|
"",
|
|
1574
1538
|
"## Guia por capacidade",
|
|
1575
1539
|
"",
|
|
@@ -1594,7 +1558,7 @@ function renderizarResumoProjetoMarkdown(geradoEm, modulos, guiaPorCapacidade) {
|
|
|
1594
1558
|
}
|
|
1595
1559
|
function criarEntradaCanonicaProjeto(guiaPorCapacidade) {
|
|
1596
1560
|
return {
|
|
1597
|
-
descricao: "Entrada canonica do repositorio para IA. O repo nao e human-first; a IA deve
|
|
1561
|
+
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.",
|
|
1598
1562
|
ordemLeitura: [...ARQUIVOS_CANONICOS_IA_RAIZ],
|
|
1599
1563
|
porCapacidade: {
|
|
1600
1564
|
pequena: ["llms.txt", "SEMA_BRIEF.micro.txt", "SEMA_INDEX.json", "AGENTS.md"],
|
|
@@ -1892,8 +1856,6 @@ async function gerarResumoProjetoIa(entrada, pastaSaidaOpcional, escreverNaRaiz
|
|
|
1892
1856
|
: path.resolve(baseProjeto, ".tmp", "sema-resumo");
|
|
1893
1857
|
await mkdir(pastaSaida, { recursive: true });
|
|
1894
1858
|
const semaBrief = renderizarResumoProjetoMarkdown(geradoEm, modulos, guiaPorCapacidade);
|
|
1895
|
-
const regrasAuthorAutomaticas = unicosOrdenados(modulos.flatMap((modulo) => modulo.regrasAuthorAutomaticas));
|
|
1896
|
-
const linhasRegrasAuthorAutomaticas = renderizarLinhasRegrasAuthorAutomaticas(regrasAuthorAutomaticas);
|
|
1897
1859
|
const indexJson = {
|
|
1898
1860
|
comando: "resumo-projeto",
|
|
1899
1861
|
geradoEm,
|
|
@@ -1902,14 +1864,12 @@ async function gerarResumoProjetoIa(entrada, pastaSaidaOpcional, escreverNaRaiz
|
|
|
1902
1864
|
totalModulos: modulos.length,
|
|
1903
1865
|
entradaCanonica,
|
|
1904
1866
|
guiaPorCapacidade,
|
|
1905
|
-
regrasAuthorAutomaticas,
|
|
1906
1867
|
modulos,
|
|
1907
1868
|
};
|
|
1908
1869
|
const micro = [
|
|
1909
1870
|
`PROJETO: ${path.basename(baseProjeto)}`,
|
|
1910
1871
|
`MODULOS: ${modulos.length}`,
|
|
1911
1872
|
`ENTRADA_IA: ${entradaCanonica.porCapacidade.pequena.join(" -> ")}`,
|
|
1912
|
-
...linhasRegrasAuthorAutomaticas,
|
|
1913
1873
|
`TOP_MODULOS: ${resumirListaTexto(modulos.map((modulo) => modulo.modulo), 3)}`,
|
|
1914
1874
|
`TOP_RISCOS: ${resumirListaTexto(unicosOrdenados(modulos.flatMap((modulo) => modulo.riscosPrincipais)), 3)}`,
|
|
1915
1875
|
`TOP_LACUNAS: ${resumirListaTexto(unicosOrdenados(modulos.flatMap((modulo) => modulo.lacunas)), 3)}`,
|
|
@@ -1921,7 +1881,6 @@ async function gerarResumoProjetoIa(entrada, pastaSaidaOpcional, escreverNaRaiz
|
|
|
1921
1881
|
`BASE: ${baseProjeto}`,
|
|
1922
1882
|
`MODULOS: ${modulos.length}`,
|
|
1923
1883
|
`ENTRADA_IA: ${entradaCanonica.porCapacidade.media.join(" -> ")}`,
|
|
1924
|
-
...linhasRegrasAuthorAutomaticas,
|
|
1925
1884
|
`TOP_MODULOS: ${resumirListaTexto(modulos.map((modulo) => modulo.modulo), 6)}`,
|
|
1926
1885
|
`TOP_RISCOS: ${resumirListaTexto(unicosOrdenados(modulos.flatMap((modulo) => modulo.riscosPrincipais)), 6)}`,
|
|
1927
1886
|
`TOP_LACUNAS: ${resumirListaTexto(unicosOrdenados(modulos.flatMap((modulo) => modulo.lacunas)), 6)}`,
|
|
@@ -3411,381 +3370,6 @@ async function comandoFinalizarMudanca(posicionais, args, emJson) {
|
|
|
3411
3370
|
}
|
|
3412
3371
|
return 1;
|
|
3413
3372
|
}
|
|
3414
|
-
const BLOCOS_AUTHOR_CLI = [
|
|
3415
|
-
"work/book",
|
|
3416
|
-
"part/chapter/section",
|
|
3417
|
-
"scene/character/arc",
|
|
3418
|
-
"audience",
|
|
3419
|
-
"claim/source",
|
|
3420
|
-
"voice/style_rule/lexicon/motif/canon",
|
|
3421
|
-
"agent",
|
|
3422
|
-
"flow",
|
|
3423
|
-
];
|
|
3424
|
-
const FLUXO_EDITORIAL_AUTHOR_CLI = [
|
|
3425
|
-
"modele a obra e seus limites em work/book",
|
|
3426
|
-
"declare publico, canon, personagens, linha do tempo e regras de mundo quando existirem",
|
|
3427
|
-
"declare style_rule para cortar cliches, ecos, muletas e repeticoes",
|
|
3428
|
-
"declare claim/source para material factual ou sensivel",
|
|
3429
|
-
"governe revisores como agents com tools, memory e policy",
|
|
3430
|
-
"orquestre revisao, checagem de fontes e continuidade em flow",
|
|
3431
|
-
"rode docs-impacto antes de mexer em capitulo importante",
|
|
3432
|
-
"gere contexto-ia para compactar canon, arcos e continuidade",
|
|
3433
|
-
"feche com finalizar-mudanca informando docs lidas",
|
|
3434
|
-
];
|
|
3435
|
-
const REGRAS_AUTHOR_AUTOMATICAS_CLI = [
|
|
3436
|
-
{
|
|
3437
|
-
id: "mostrar_por_evidencia",
|
|
3438
|
-
nome: "Mostrar Por Evidência",
|
|
3439
|
-
aplica: "emocao, trauma, revolta e mudanca social precisam aparecer por evidencia concreta em cena",
|
|
3440
|
-
evitar: ["moral explicada", "emocao declarada", "simbolo sem uso concreto"],
|
|
3441
|
-
preferir: ["objeto alterado", "rotina quebrada", "gesto observavel", "decisao visivel"],
|
|
3442
|
-
},
|
|
3443
|
-
{
|
|
3444
|
-
id: "causa_e_consequencia",
|
|
3445
|
-
nome: "Causa E Consequência",
|
|
3446
|
-
aplica: "acao relevante precisa gerar consequencia proporcional",
|
|
3447
|
-
evitar: ["vitoria sem custo", "erro sem punicao", "revelacao sem efeito"],
|
|
3448
|
-
preferir: ["custo emocional", "custo fisico", "custo politico", "custo relacional"],
|
|
3449
|
-
},
|
|
3450
|
-
{
|
|
3451
|
-
id: "cena_com_dupla_funcao",
|
|
3452
|
-
nome: "Cena Com Dupla Função",
|
|
3453
|
-
aplica: "toda cena deve cumprir pelo menos duas funcoes narrativas sem exigir personagem novo",
|
|
3454
|
-
evitar: ["cena morta", "deslocamento vazio", "clima sem funcao"],
|
|
3455
|
-
preferir: ["avancar trama", "revelar personagem", "plantar pista", "mostrar consequencia"],
|
|
3456
|
-
},
|
|
3457
|
-
{
|
|
3458
|
-
id: "exposicao_com_atrito",
|
|
3459
|
-
nome: "Exposição Com Atrito",
|
|
3460
|
-
aplica: "informacao de mundo ou passado deve aparecer em situacao com tensao",
|
|
3461
|
-
evitar: ["palestra", "lore sem conflito", "dialogo em que todos ja sabem"],
|
|
3462
|
-
preferir: ["discussao", "ameaca", "documento incompleto", "erro operacional"],
|
|
3463
|
-
},
|
|
3464
|
-
{
|
|
3465
|
-
id: "antagonista_com_logica_interna",
|
|
3466
|
-
nome: "Antagonista Com Lógica Interna",
|
|
3467
|
-
aplica: "antagonistas precisam ter objetivo compreensivel e poder real de afetar a trama",
|
|
3468
|
-
evitar: ["malvadeza decorativa", "plano explicado inteiro", "incompetencia conveniente"],
|
|
3469
|
-
preferir: ["argumento parcialmente convincente", "vantagem estrutural", "contradicao humana"],
|
|
3470
|
-
},
|
|
3471
|
-
{
|
|
3472
|
-
id: "conflito_sem_solucao_limpa",
|
|
3473
|
-
nome: "Conflito Sem Solução Limpa",
|
|
3474
|
-
aplica: "problemas importantes nao devem ser resolvidos de forma perfeita ou gratuita",
|
|
3475
|
-
evitar: ["solucao magica", "perdao instantaneo", "plano sem imprevisto"],
|
|
3476
|
-
preferir: ["vitoria parcial", "dilema moral", "perda permanente", "novo problema"],
|
|
3477
|
-
},
|
|
3478
|
-
{
|
|
3479
|
-
id: "continuidade_de_personagens",
|
|
3480
|
-
nome: "Continuidade De Personagens",
|
|
3481
|
-
aplica: "personagem relevante precisa manter estado narrativo rastreavel",
|
|
3482
|
-
evitar: ["personagem sumir sem explicacao", "arco abandonado", "mudanca sem transicao"],
|
|
3483
|
-
preferir: ["onde esta", "o que quer", "o que sabe", "o que perdeu", "relacao alterada"],
|
|
3484
|
-
},
|
|
3485
|
-
{
|
|
3486
|
-
id: "misterio_em_escada",
|
|
3487
|
-
nome: "Mistério Em Escada",
|
|
3488
|
-
aplica: "revelacoes devem ser construidas por etapas",
|
|
3489
|
-
evitar: ["revelacao sem pista", "segredo tardio", "misterio mantido por falta de conversa"],
|
|
3490
|
-
preferir: ["pista", "contradicao", "interpretacao errada", "verdade parcial"],
|
|
3491
|
-
},
|
|
3492
|
-
{
|
|
3493
|
-
id: "dialogo_com_subtexto",
|
|
3494
|
-
nome: "Diálogo Com Subtexto",
|
|
3495
|
-
aplica: "dialogo deve carregar intencao, defesa, disputa ou tensao",
|
|
3496
|
-
evitar: ["fala explicativa", "todos com a mesma voz", "frase de efeito no lugar de conflito"],
|
|
3497
|
-
preferir: ["resposta indireta", "mentira util", "silencio significativo", "pergunta como ataque"],
|
|
3498
|
-
},
|
|
3499
|
-
{
|
|
3500
|
-
id: "acao_com_geografia_e_dano",
|
|
3501
|
-
nome: "Ação Com Geografia E Dano",
|
|
3502
|
-
aplica: "acao precisa ter espaco claro, objetivo concreto e consequencia depois",
|
|
3503
|
-
evitar: ["correria generica", "tiro para fingir ritmo", "sair ileso sem motivo"],
|
|
3504
|
-
preferir: ["mapa mental da cena", "obstaculo crescente", "uso do ambiente", "dano posterior"],
|
|
3505
|
-
},
|
|
3506
|
-
{
|
|
3507
|
-
id: "final_de_capitulo_sem_slogan",
|
|
3508
|
-
nome: "Final De Capítulo Sem Slogan",
|
|
3509
|
-
aplica: "capitulo termina com decisao, imagem, perda, ameaca ou descoberta, nao com moral de trailer",
|
|
3510
|
-
evitar: ["frase filosofica", "slogan sobre destino", "resumo da moral da cena"],
|
|
3511
|
-
preferir: ["decisao irreversivel", "imagem forte", "perda concreta", "ameaca especifica"],
|
|
3512
|
-
},
|
|
3513
|
-
{
|
|
3514
|
-
id: "morte_com_peso_estrutural",
|
|
3515
|
-
nome: "Morte Com Peso Estrutural",
|
|
3516
|
-
aplica: "morte importante precisa alterar relacoes, objetivo, poder, estado emocional ou rumo da obra",
|
|
3517
|
-
evitar: ["morte so para chocar", "luto pulado", "morte revertida sem custo"],
|
|
3518
|
-
preferir: ["mudanca em tres dimensoes", "custo narrativo", "consequencia no proximo capitulo"],
|
|
3519
|
-
},
|
|
3520
|
-
{
|
|
3521
|
-
id: "especificidade_sensorial",
|
|
3522
|
-
nome: "Especificidade Sensorial",
|
|
3523
|
-
aplica: "descricao deve trocar abstracao generica por detalhe observavel",
|
|
3524
|
-
evitar: ["ambiente sombrio", "dor insuportavel", "cidade caotica", "olhar triste"],
|
|
3525
|
-
preferir: ["som especifico", "cheiro especifico", "textura", "temperatura", "objeto fora do lugar"],
|
|
3526
|
-
},
|
|
3527
|
-
{
|
|
3528
|
-
id: "voz_distinta_por_personagem",
|
|
3529
|
-
nome: "Voz Distinta Por Personagem",
|
|
3530
|
-
aplica: "personagens recorrentes precisam ter forma propria de pensar, decidir e falar",
|
|
3531
|
-
evitar: ["todos falando como o narrador", "mesmo humor", "mesma reacao ao medo"],
|
|
3532
|
-
preferir: ["vocabulario proprio", "ritmo de fala", "tipo de silencio", "forma unica de mentir"],
|
|
3533
|
-
},
|
|
3534
|
-
{
|
|
3535
|
-
id: "anti_cliche_adaptativa",
|
|
3536
|
-
nome: "Anti-Clichê Adaptativa",
|
|
3537
|
-
aplica: "estrutura reconhecivel demais deve ser substituida por alternativa especifica",
|
|
3538
|
-
evitar: ["nao era sobre X, era sobre Y", "a esperanca renasceu", "o destino cobraria seu preco"],
|
|
3539
|
-
preferir: ["acao concreta", "consequencia", "gesto observavel", "pista plantada"],
|
|
3540
|
-
},
|
|
3541
|
-
];
|
|
3542
|
-
function resumirRegrasAuthorAutomaticas() {
|
|
3543
|
-
return REGRAS_AUTHOR_AUTOMATICAS_CLI.map((regra) => `${regra.nome}: ${regra.aplica}`);
|
|
3544
|
-
}
|
|
3545
|
-
function criarContratoAuthorExemplo(sensivel) {
|
|
3546
|
-
if (sensivel) {
|
|
3547
|
-
return `module author.starter.sensivel {
|
|
3548
|
-
work obra_sensivel {
|
|
3549
|
-
titulo: "Guia responsavel"
|
|
3550
|
-
proposito: "explicar um tema sensivel sem prometer verdade clinica"
|
|
3551
|
-
tipo: nao_ficcao
|
|
3552
|
-
tema: autismo
|
|
3553
|
-
sensivel: verdadeiro
|
|
3554
|
-
}
|
|
3555
|
-
|
|
3556
|
-
audience publico_principal {
|
|
3557
|
-
publico: familias_educadores_pessoas_autistas
|
|
3558
|
-
limites: "nao substitui avaliacao clinica ou orientacao profissional"
|
|
3559
|
-
}
|
|
3560
|
-
|
|
3561
|
-
claim autismo_e_espectro {
|
|
3562
|
-
texto: "autismo e um espectro com manifestacoes variadas"
|
|
3563
|
-
source: fonte_principal
|
|
3564
|
-
confidence: alta
|
|
3565
|
-
}
|
|
3566
|
-
|
|
3567
|
-
source fonte_principal {
|
|
3568
|
-
tipo: revisao_bibliografica
|
|
3569
|
-
confianca: alta
|
|
3570
|
-
}
|
|
3571
|
-
|
|
3572
|
-
style_rule linguagem_respeitosa {
|
|
3573
|
-
require {
|
|
3574
|
-
mostrar_por_evidencia
|
|
3575
|
-
causa_e_consequencia
|
|
3576
|
-
exposicao_com_atrito
|
|
3577
|
-
final_de_capitulo_sem_slogan
|
|
3578
|
-
anti_cliche_adaptativa
|
|
3579
|
-
}
|
|
3580
|
-
proibido {
|
|
3581
|
-
frase: "superar o autismo"
|
|
3582
|
-
generalizacao: "todo autista"
|
|
3583
|
-
promessa: "diagnostico garantido"
|
|
3584
|
-
slogan: "a esperanca renasceu"
|
|
3585
|
-
}
|
|
3586
|
-
evitar {
|
|
3587
|
-
tom: infantilizacao
|
|
3588
|
-
abordagem: sensacionalismo
|
|
3589
|
-
estrutura: "nao era sobre X, era sobre Y"
|
|
3590
|
-
}
|
|
3591
|
-
preferir {
|
|
3592
|
-
evidencia: gesto_observavel
|
|
3593
|
-
consequencia: custo_visivel
|
|
3594
|
-
linguagem: detalhe_especifico
|
|
3595
|
-
}
|
|
3596
|
-
tolerancia {
|
|
3597
|
-
max_repeticao_palavra_por_trecho: 2
|
|
3598
|
-
cena_funcoes_minimas: 2
|
|
3599
|
-
}
|
|
3600
|
-
}
|
|
3601
|
-
|
|
3602
|
-
agent checador_fontes {
|
|
3603
|
-
role: revisor_fontes
|
|
3604
|
-
goal: bloquear_afirmacao_sensivel_sem_fonte
|
|
3605
|
-
tools {
|
|
3606
|
-
ler_contrato
|
|
3607
|
-
verificar_fontes
|
|
3608
|
-
analisar_trecho
|
|
3609
|
-
}
|
|
3610
|
-
memory {
|
|
3611
|
-
claim
|
|
3612
|
-
source
|
|
3613
|
-
style_rule
|
|
3614
|
-
}
|
|
3615
|
-
policy {
|
|
3616
|
-
nao_afirmar_sem_fonte
|
|
3617
|
-
sinalizar_incerteza
|
|
3618
|
-
citar_trechos_afetados
|
|
3619
|
-
}
|
|
3620
|
-
}
|
|
3621
|
-
|
|
3622
|
-
flow revisar_secao_sensivel {
|
|
3623
|
-
trecho: Texto
|
|
3624
|
-
etapa fontes usa checador_fontes com trecho = trecho
|
|
3625
|
-
}
|
|
3626
|
-
}
|
|
3627
|
-
`;
|
|
3628
|
-
}
|
|
3629
|
-
return `module author.starter.obra {
|
|
3630
|
-
work obra {
|
|
3631
|
-
titulo: "Projeto autoral"
|
|
3632
|
-
proposito: "governar continuidade, arcos, personagens e tom editorial"
|
|
3633
|
-
tipo: ficcao
|
|
3634
|
-
}
|
|
3635
|
-
|
|
3636
|
-
audience leitores {
|
|
3637
|
-
publico: leitores_ficcao_especulativa
|
|
3638
|
-
promessa: "continuidade consistente e cenas com causa e consequencia"
|
|
3639
|
-
}
|
|
3640
|
-
|
|
3641
|
-
character protagonista {
|
|
3642
|
-
funcao: protagonista
|
|
3643
|
-
arco: queda_e_reconstrucao
|
|
3644
|
-
}
|
|
3645
|
-
|
|
3646
|
-
arc arco_principal {
|
|
3647
|
-
inicio: "desejo claro"
|
|
3648
|
-
virada: "custo moral visivel"
|
|
3649
|
-
fim: "mudanca irreversivel"
|
|
3650
|
-
}
|
|
3651
|
-
|
|
3652
|
-
canon universo {
|
|
3653
|
-
regra: "nada muda no mundo sem custo emocional, logistico ou relacional"
|
|
3654
|
-
}
|
|
3655
|
-
|
|
3656
|
-
style_rule anti_texto_raso {
|
|
3657
|
-
require {
|
|
3658
|
-
mostrar_por_evidencia
|
|
3659
|
-
causa_e_consequencia
|
|
3660
|
-
cena_com_dupla_funcao
|
|
3661
|
-
exposicao_com_atrito
|
|
3662
|
-
dialogo_com_subtexto
|
|
3663
|
-
final_de_capitulo_sem_slogan
|
|
3664
|
-
anti_cliche_adaptativa
|
|
3665
|
-
}
|
|
3666
|
-
proibido {
|
|
3667
|
-
frase: "de alguma forma"
|
|
3668
|
-
cliche: "o tempo parecia parar"
|
|
3669
|
-
estrutura: "nao era sobre X, era sobre Y"
|
|
3670
|
-
slogan: "a esperanca renasceu"
|
|
3671
|
-
moral: "todos finalmente entenderam a verdade"
|
|
3672
|
-
}
|
|
3673
|
-
ecos {
|
|
3674
|
-
palavra: "silencio"
|
|
3675
|
-
}
|
|
3676
|
-
preferir {
|
|
3677
|
-
evidencia: gesto_concreto
|
|
3678
|
-
consequencia: custo_visivel
|
|
3679
|
-
misterio: pista_contradicao_verdade_parcial
|
|
3680
|
-
final: decisao_ou_imagem_concreta
|
|
3681
|
-
}
|
|
3682
|
-
tolerancia {
|
|
3683
|
-
max_repeticao_palavra_por_trecho: 2
|
|
3684
|
-
cena_funcoes_minimas: 2
|
|
3685
|
-
}
|
|
3686
|
-
}
|
|
3687
|
-
|
|
3688
|
-
agent revisor_continuidade {
|
|
3689
|
-
role: editor_author
|
|
3690
|
-
goal: preservar_canon_arcos_e_continuidade
|
|
3691
|
-
tools {
|
|
3692
|
-
ler_contrato
|
|
3693
|
-
analisar_trecho
|
|
3694
|
-
comparar_canon
|
|
3695
|
-
}
|
|
3696
|
-
memory {
|
|
3697
|
-
canon
|
|
3698
|
-
character
|
|
3699
|
-
arc
|
|
3700
|
-
style_rule
|
|
3701
|
-
}
|
|
3702
|
-
policy {
|
|
3703
|
-
nao_reescrever_sem_aprovacao
|
|
3704
|
-
citar_trechos_afetados
|
|
3705
|
-
registrar_decisoes_editoriais
|
|
3706
|
-
}
|
|
3707
|
-
}
|
|
3708
|
-
|
|
3709
|
-
flow revisar_capitulo {
|
|
3710
|
-
trecho: Texto
|
|
3711
|
-
etapa continuidade usa revisor_continuidade com trecho = trecho
|
|
3712
|
-
}
|
|
3713
|
-
}
|
|
3714
|
-
`;
|
|
3715
|
-
}
|
|
3716
|
-
function criarPayloadAuthorCli(modo, sensivel) {
|
|
3717
|
-
return {
|
|
3718
|
-
comando: "author",
|
|
3719
|
-
profile: "Author",
|
|
3720
|
-
modo,
|
|
3721
|
-
sensivel,
|
|
3722
|
-
blocos: [...BLOCOS_AUTHOR_CLI],
|
|
3723
|
-
fluxoEditorial: [...FLUXO_EDITORIAL_AUTHOR_CLI],
|
|
3724
|
-
regrasAutomaticas: REGRAS_AUTHOR_AUTOMATICAS_CLI.map((regra) => ({
|
|
3725
|
-
...regra,
|
|
3726
|
-
evitar: [...regra.evitar],
|
|
3727
|
-
preferir: [...regra.preferir],
|
|
3728
|
-
})),
|
|
3729
|
-
comandos: [
|
|
3730
|
-
"sema author --help",
|
|
3731
|
-
"sema author exemplo",
|
|
3732
|
-
"sema author exemplo --sensivel --json",
|
|
3733
|
-
"sema validar contratos/<obra>.sema --json",
|
|
3734
|
-
"sema docs-impacto --intencao \"editar capitulo\" --arquivo contratos/<obra>.sema --criar-ausentes --json",
|
|
3735
|
-
"sema contexto-ia contratos/<obra>.sema --saida ./.tmp/contexto-author --json",
|
|
3736
|
-
"sema finalizar-mudanca --intencao \"editar capitulo\" --arquivo contratos/<obra>.sema --doc-lida docs/<doc>.md --json",
|
|
3737
|
-
],
|
|
3738
|
-
contratoExemplo: criarContratoAuthorExemplo(sensivel),
|
|
3739
|
-
};
|
|
3740
|
-
}
|
|
3741
|
-
function renderizarAjudaAuthor() {
|
|
3742
|
-
return [
|
|
3743
|
-
"Sema Author",
|
|
3744
|
-
"",
|
|
3745
|
-
renderizarSecaoAscii("Uso", [
|
|
3746
|
-
"sema author --help",
|
|
3747
|
-
"sema author exemplo",
|
|
3748
|
-
"sema author exemplo --sensivel",
|
|
3749
|
-
"sema author exemplo --sensivel --json",
|
|
3750
|
-
]),
|
|
3751
|
-
"",
|
|
3752
|
-
renderizarSecaoAscii("Serve para", [
|
|
3753
|
-
"obra, livro, capitulo, cena, personagem, arco, canon, tese, claim, fonte e continuidade",
|
|
3754
|
-
"ficcao, nao ficcao, livro tecnico, ensaio, biografia, pesquisa aplicada, manual e curso em livro",
|
|
3755
|
-
"evitar cliche, eco, muleta, generalizacao, infantilizacao e reescrita sem politica",
|
|
3756
|
-
]),
|
|
3757
|
-
"",
|
|
3758
|
-
renderizarSecaoAscii("Fluxo recomendado", [...FLUXO_EDITORIAL_AUTHOR_CLI]),
|
|
3759
|
-
"",
|
|
3760
|
-
renderizarSecaoAscii("Regras automaticas", resumirRegrasAuthorAutomaticas()),
|
|
3761
|
-
"",
|
|
3762
|
-
renderizarSecaoAscii("Blocos principais", [...BLOCOS_AUTHOR_CLI]),
|
|
3763
|
-
"",
|
|
3764
|
-
renderizarSecaoAscii("Comandos que encaixam", [
|
|
3765
|
-
"sema docs-impacto --intencao \"editar capitulo\" --arquivo contratos/<obra>.sema --criar-ausentes --json",
|
|
3766
|
-
"sema contexto-ia contratos/<obra>.sema --saida ./.tmp/contexto-author --json",
|
|
3767
|
-
"sema finalizar-mudanca --intencao \"editar capitulo\" --arquivo contratos/<obra>.sema --doc-lida docs/<doc>.md --json",
|
|
3768
|
-
]),
|
|
3769
|
-
].join("\n");
|
|
3770
|
-
}
|
|
3771
|
-
async function comandoAuthor(posicionais, args, emJson) {
|
|
3772
|
-
const subcomando = posicionais[0];
|
|
3773
|
-
const sensivel = possuiFlag(args, "--sensivel") || possuiFlag(args, "--sensitive");
|
|
3774
|
-
const modo = subcomando === "exemplo" || subcomando === "template" || subcomando === "starter"
|
|
3775
|
-
? "exemplo"
|
|
3776
|
-
: "ajuda";
|
|
3777
|
-
const payload = criarPayloadAuthorCli(modo, sensivel);
|
|
3778
|
-
if (emJson) {
|
|
3779
|
-
console.log(JSON.stringify(payload, null, 2));
|
|
3780
|
-
return 0;
|
|
3781
|
-
}
|
|
3782
|
-
if (modo === "exemplo") {
|
|
3783
|
-
console.log(payload.contratoExemplo);
|
|
3784
|
-
return 0;
|
|
3785
|
-
}
|
|
3786
|
-
console.log(renderizarAjudaAuthor());
|
|
3787
|
-
return 0;
|
|
3788
|
-
}
|
|
3789
3373
|
async function comandoValidar(entrada) {
|
|
3790
3374
|
const modulos = await carregarModulos(entrada);
|
|
3791
3375
|
const diagnosticos = modulos.flatMap((item) => item.resultado.diagnosticos);
|
|
@@ -4319,7 +3903,6 @@ async function comandoAjudaIa() {
|
|
|
4319
3903
|
"Use `sema prompt-curto <arquivo> --curto --para mudanca` para colar contexto em modelo gratuito.",
|
|
4320
3904
|
"Use `sema prompt-ia`, `sema prompt-ia-ui`, `sema prompt-ia-react` e `sema prompt-ia-sema-primeiro` conforme a tarefa.",
|
|
4321
3905
|
"Use `sema exemplos-prompt-ia` para pegar modelos prontos de prompt.",
|
|
4322
|
-
"Use `sema author` para obra, capitulos, cenas, personagens, continuidade, fontes, estilo, agents e flow editorial.",
|
|
4323
3906
|
"Use `sema inspecionar` para descobrir base, codigo vivo e fontes legado.",
|
|
4324
3907
|
"Use `sema drift` para medir impls, vinculos, rotas, score e lacunas.",
|
|
4325
3908
|
"Use `sema docs-impacto --intencao <acao>` para ler ou criar docs obrigatorias antes de agir.",
|
|
@@ -4492,7 +4075,7 @@ async function comandoPromptCurto(entrada, args, emJson) {
|
|
|
4492
4075
|
const capacidade = tamanho === "micro" ? "pequena" : tamanho === "curto" ? "media" : "grande";
|
|
4493
4076
|
const prompt = `Voce esta operando Sema em modo IA-first.
|
|
4494
4077
|
|
|
4495
|
-
Isto
|
|
4078
|
+
Isto e contexto comprimido para IA operar contrato semantico antes de tocar codigo vivo.
|
|
4496
4079
|
|
|
4497
4080
|
Capacidade alvo: ${capacidade}
|
|
4498
4081
|
Modo da tarefa: ${modo}
|
|
@@ -4807,7 +4390,7 @@ async function principal() {
|
|
|
4807
4390
|
{
|
|
4808
4391
|
const fonte = normalizarFonteImportacao(posicionais[0]);
|
|
4809
4392
|
if (!fonte || !posicionais[1]) {
|
|
4810
|
-
console.error("Uso: sema importar <nestjs|fastapi|flask|nextjs|nextjs-consumer|react-vite-consumer|angular-consumer|flutter-consumer|firebase|
|
|
4393
|
+
console.error("Uso: 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]");
|
|
4811
4394
|
codigoSaida = 1;
|
|
4812
4395
|
break;
|
|
4813
4396
|
}
|
|
@@ -4838,9 +4421,6 @@ async function principal() {
|
|
|
4838
4421
|
case "finalizar-mudanca":
|
|
4839
4422
|
codigoSaida = await comandoFinalizarMudanca(posicionais, resto, possuiFlag(resto, "--json"));
|
|
4840
4423
|
break;
|
|
4841
|
-
case "author":
|
|
4842
|
-
codigoSaida = await comandoAuthor(posicionais, resto, possuiFlag(resto, "--json"));
|
|
4843
|
-
break;
|
|
4844
4424
|
case "resumo":
|
|
4845
4425
|
codigoSaida = await comandoResumo(posicionais[0], resto, possuiFlag(resto, "--json"));
|
|
4846
4426
|
break;
|