@semacode/cli 1.5.30 → 1.5.32
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 +294 -0
- package/AGENT_CONTEXT_PACK.json +164 -0
- package/LICENSE +22 -0
- package/README.md +85 -144
- package/SEMA_BRIEF.curto.txt +11 -0
- package/SEMA_BRIEF.md +616 -0
- package/SEMA_BRIEF.micro.txt +9 -0
- package/SEMA_INDEX.json +9393 -0
- package/dist/billing/index.d.ts +46 -0
- package/dist/billing/index.js +143 -0
- package/dist/billing/index.js.map +1 -0
- package/dist/comandos.js +33 -0
- package/dist/comandos.js.map +1 -1
- package/dist/controleComercialSupabase.d.ts +7 -0
- package/dist/controleComercialSupabase.js +6 -0
- package/dist/controleComercialSupabase.js.map +1 -0
- package/dist/controleComercialSupabaseAdmin.d.ts +7 -0
- package/dist/controleComercialSupabaseAdmin.js +138 -0
- package/dist/controleComercialSupabaseAdmin.js.map +1 -0
- package/dist/controleComercialSupabaseCadastro.d.ts +4 -0
- package/dist/controleComercialSupabaseCadastro.js +85 -0
- package/dist/controleComercialSupabaseCadastro.js.map +1 -0
- package/dist/controleComercialSupabaseConstantes.d.ts +28 -0
- package/dist/controleComercialSupabaseConstantes.js +44 -0
- package/dist/controleComercialSupabaseConstantes.js.map +1 -0
- package/dist/controleComercialSupabaseConsumo.d.ts +2 -0
- package/dist/controleComercialSupabaseConsumo.js +77 -0
- package/dist/controleComercialSupabaseConsumo.js.map +1 -0
- package/dist/controleComercialSupabaseConta.d.ts +11 -0
- package/dist/controleComercialSupabaseConta.js +157 -0
- package/dist/controleComercialSupabaseConta.js.map +1 -0
- package/dist/controleComercialSupabaseProfiles.d.ts +4 -0
- package/dist/controleComercialSupabaseProfiles.js +55 -0
- package/dist/controleComercialSupabaseProfiles.js.map +1 -0
- package/dist/controleComercialSupabaseTipos.d.ts +3 -0
- package/dist/controleComercialSupabaseTipos.js +2 -0
- package/dist/controleComercialSupabaseTipos.js.map +1 -0
- package/dist/controleComercialSupabaseTiposAdmin.d.ts +152 -0
- package/dist/controleComercialSupabaseTiposAdmin.js +2 -0
- package/dist/controleComercialSupabaseTiposAdmin.js.map +1 -0
- package/dist/controleComercialSupabaseTiposBase.d.ts +169 -0
- package/dist/controleComercialSupabaseTiposBase.js +2 -0
- package/dist/controleComercialSupabaseTiposBase.js.map +1 -0
- package/dist/controleComercialSupabaseTiposConta.d.ts +220 -0
- package/dist/controleComercialSupabaseTiposConta.js +2 -0
- package/dist/controleComercialSupabaseTiposConta.js.map +1 -0
- package/dist/dev/index.d.ts +18 -0
- package/dist/dev/index.js +143 -0
- package/dist/dev/index.js.map +1 -0
- package/dist/index.js +222 -46
- package/dist/index.js.map +1 -1
- package/dist/init/index.d.ts +23 -0
- package/dist/init/index.js +112 -0
- package/dist/init/index.js.map +1 -0
- package/dist/init/templates.d.ts +11 -0
- package/dist/init/templates.js +660 -0
- package/dist/init/templates.js.map +1 -0
- package/dist/runnerValidacaoRemota.d.ts +9 -0
- package/dist/runnerValidacaoRemota.js +9 -0
- package/dist/runnerValidacaoRemota.js.map +1 -0
- package/dist/runnerValidacaoRemotaBateria.d.ts +10 -0
- package/dist/runnerValidacaoRemotaBateria.js +115 -0
- package/dist/runnerValidacaoRemotaBateria.js.map +1 -0
- package/dist/runnerValidacaoRemotaCli.d.ts +4 -0
- package/dist/runnerValidacaoRemotaCli.js +86 -0
- package/dist/runnerValidacaoRemotaCli.js.map +1 -0
- package/dist/runnerValidacaoRemotaComandos.d.ts +7 -0
- package/dist/runnerValidacaoRemotaComandos.js +123 -0
- package/dist/runnerValidacaoRemotaComandos.js.map +1 -0
- package/dist/runnerValidacaoRemotaEscopo.d.ts +4 -0
- package/dist/runnerValidacaoRemotaEscopo.js +79 -0
- package/dist/runnerValidacaoRemotaEscopo.js.map +1 -0
- package/dist/runnerValidacaoRemotaExecucao.d.ts +2 -0
- package/dist/runnerValidacaoRemotaExecucao.js +102 -0
- package/dist/runnerValidacaoRemotaExecucao.js.map +1 -0
- package/dist/runnerValidacaoRemotaRelatorio.d.ts +3 -0
- package/dist/runnerValidacaoRemotaRelatorio.js +93 -0
- package/dist/runnerValidacaoRemotaRelatorio.js.map +1 -0
- package/dist/runnerValidacaoRemotaServidor.d.ts +3 -0
- package/dist/runnerValidacaoRemotaServidor.js +157 -0
- package/dist/runnerValidacaoRemotaServidor.js.map +1 -0
- package/dist/runnerValidacaoRemotaSnapshot.d.ts +10 -0
- package/dist/runnerValidacaoRemotaSnapshot.js +217 -0
- package/dist/runnerValidacaoRemotaSnapshot.js.map +1 -0
- package/dist/runnerValidacaoRemotaTipos.d.ts +158 -0
- package/dist/runnerValidacaoRemotaTipos.js +35 -0
- package/dist/runnerValidacaoRemotaTipos.js.map +1 -0
- package/dist/runnerValidacaoRemotaUtil.d.ts +3 -0
- package/dist/runnerValidacaoRemotaUtil.js +18 -0
- package/dist/runnerValidacaoRemotaUtil.js.map +1 -0
- package/dist/runnerValidacaoRemotaWorkspace.d.ts +2 -0
- package/dist/runnerValidacaoRemotaWorkspace.js +110 -0
- package/dist/runnerValidacaoRemotaWorkspace.js.map +1 -0
- package/dist/sync/index.d.ts +24 -0
- package/dist/sync/index.js +174 -0
- package/dist/sync/index.js.map +1 -0
- package/docs/AGENT_STARTER.md +109 -0
- package/docs/api.md +82 -0
- package/docs/cli.md +93 -0
- package/docs/como-ensinar-a-sema-para-ia.md +30 -0
- package/docs/deploy.md +45 -0
- package/docs/documentacao.md +88 -0
- package/docs/env.md +115 -0
- package/docs/extensao-vscode.md +42 -0
- package/docs/fluxo-pratico-ia-sema.md +187 -0
- package/docs/instalacao-e-primeiro-uso.md +48 -0
- package/docs/integracao-com-ia.md +24 -0
- package/docs/mcp.md +48 -0
- package/docs/pagamento-ponta-a-ponta.md +171 -0
- package/docs/persistencia-vendor-first.md +151 -0
- package/docs/prompt-base-ia-sema.md +111 -0
- package/docs/repositories.md +69 -0
- package/docs/rollback.md +24 -0
- package/docs/seguranca.md +126 -0
- package/docs/sintaxe.md +218 -0
- package/exemplos/profile_conversas.sema +165 -0
- package/llms-full.txt +35 -0
- package/llms.txt +18 -0
- package/node_modules/@sema/gerador-css/package.json +7 -14
- package/node_modules/@sema/gerador-dart/package.json +7 -14
- package/node_modules/@sema/gerador-html/package.json +7 -14
- package/node_modules/@sema/gerador-javascript/package.json +7 -14
- package/node_modules/@sema/gerador-lua/package.json +7 -14
- package/node_modules/@sema/gerador-python/package.json +7 -14
- package/node_modules/@sema/gerador-typescript/package.json +7 -14
- package/node_modules/@sema/nucleo/dist/diagnosticos/melhorador.d.ts +22 -0
- package/node_modules/@sema/nucleo/dist/diagnosticos/melhorador.js +97 -0
- package/node_modules/@sema/nucleo/dist/diagnosticos/melhorador.js.map +1 -0
- package/node_modules/@sema/nucleo/dist/index.d.ts +1 -0
- package/node_modules/@sema/nucleo/dist/index.js +1 -0
- package/node_modules/@sema/nucleo/dist/index.js.map +1 -1
- package/node_modules/@sema/nucleo/package.json +7 -10
- package/node_modules/@sema/padroes/package.json +7 -10
- package/package.json +75 -74
- package/exemplos/.prepack-generated +0 -1
- package/node_modules/@sema/gerador-css/src/index.ts +0 -605
- package/node_modules/@sema/gerador-css/tsconfig.json +0 -13
- package/node_modules/@sema/gerador-css/tsconfig.tsbuildinfo +0 -1
- package/node_modules/@sema/gerador-dart/src/index.ts +0 -52
- package/node_modules/@sema/gerador-dart/tsconfig.json +0 -13
- package/node_modules/@sema/gerador-dart/tsconfig.tsbuildinfo +0 -1
- package/node_modules/@sema/gerador-html/src/index.ts +0 -185
- package/node_modules/@sema/gerador-html/tsconfig.json +0 -13
- package/node_modules/@sema/gerador-html/tsconfig.tsbuildinfo +0 -1
- package/node_modules/@sema/gerador-javascript/src/index.ts +0 -461
- package/node_modules/@sema/gerador-javascript/tsconfig.json +0 -13
- package/node_modules/@sema/gerador-javascript/tsconfig.tsbuildinfo +0 -1
- package/node_modules/@sema/gerador-lua/src/index.ts +0 -359
- package/node_modules/@sema/gerador-lua/tsconfig.json +0 -13
- package/node_modules/@sema/gerador-lua/tsconfig.tsbuildinfo +0 -1
- package/node_modules/@sema/gerador-python/src/index.ts +0 -850
- package/node_modules/@sema/gerador-python/tsconfig.json +0 -13
- package/node_modules/@sema/gerador-python/tsconfig.tsbuildinfo +0 -1
- package/node_modules/@sema/gerador-typescript/src/index.ts +0 -876
- package/node_modules/@sema/gerador-typescript/tsconfig.json +0 -13
- package/node_modules/@sema/gerador-typescript/tsconfig.tsbuildinfo +0 -1
- package/node_modules/@sema/nucleo/src/ast/tipos.ts +0 -207
- package/node_modules/@sema/nucleo/src/diagnosticos/index.ts +0 -43
- package/node_modules/@sema/nucleo/src/formatador/index.ts +0 -530
- package/node_modules/@sema/nucleo/src/index.ts +0 -183
- package/node_modules/@sema/nucleo/src/ir/conversor.ts +0 -1037
- package/node_modules/@sema/nucleo/src/ir/modelos.ts +0 -403
- package/node_modules/@sema/nucleo/src/lexer/lexer.ts +0 -166
- package/node_modules/@sema/nucleo/src/lexer/tokens.ts +0 -79
- package/node_modules/@sema/nucleo/src/parser/gramatica.ebnf +0 -41
- package/node_modules/@sema/nucleo/src/parser/parser.ts +0 -936
- package/node_modules/@sema/nucleo/src/persistencia/contratos.ts +0 -379
- package/node_modules/@sema/nucleo/src/semantico/analisador.ts +0 -3126
- package/node_modules/@sema/nucleo/src/semantico/estruturas.ts +0 -665
- package/node_modules/@sema/nucleo/src/semantico/seguranca.ts +0 -362
- package/node_modules/@sema/nucleo/src/util/arquivos.ts +0 -28
- package/node_modules/@sema/nucleo/tsconfig.json +0 -9
- package/node_modules/@sema/nucleo/tsconfig.tsbuildinfo +0 -1
- package/node_modules/@sema/padroes/src/index.ts +0 -382
- package/node_modules/@sema/padroes/tsconfig.json +0 -9
- package/node_modules/@sema/padroes/tsconfig.tsbuildinfo +0 -1
package/dist/index.js
CHANGED
|
@@ -19,6 +19,8 @@ import { importarProjetoLegado, resumoImportacao } from "./importador.js";
|
|
|
19
19
|
import { analisarDriftLegado, assistirRenomeacaoSemantica, gerarMapaImpactoSemantico, } from "./drift.js";
|
|
20
20
|
import { resolverDocumentacaoObrigatoria, verificarDocumentacaoMudanca, } from "./docs.js";
|
|
21
21
|
import { REGISTRO_COMANDOS } from "./comandos.js";
|
|
22
|
+
import { ajudaRunnerValidacaoRemota, comandoRunnerValidacaoRemota, } from "./runnerValidacaoRemotaCli.js";
|
|
23
|
+
import { comandoServidorRunnerValidacaoRemota } from "./runnerValidacaoRemotaServidor.js";
|
|
22
24
|
const STARTER_IA = `Voce esta trabalhando com Sema, um contrato semantico IA-first para agentes operarem software vivo em backend e front consumer.
|
|
23
25
|
|
|
24
26
|
Importante:
|
|
@@ -494,6 +496,7 @@ function ajuda() {
|
|
|
494
496
|
"sema profile validar workflow contratos/sema/workflow_ops.sema --maturidade production --preset webhook --artefato-arquivo workflow.md --json",
|
|
495
497
|
"sema profile validar ops contratos/sema/workflow_ops.sema --maturidade critical --preset deploy --artefato-arquivo runbook.md --json",
|
|
496
498
|
"sema profile validar game contratos/sema/game.sema --maturidade prototype --preset playtest --artefato-arquivo playtest.md --json",
|
|
499
|
+
"sema profile validar conversas contratos/sema/conversas.sema --maturidade production --preset vendas --artefato-arquivo conversa.md --json",
|
|
497
500
|
"sema profile capabilities --json",
|
|
498
501
|
"sema rule-packs --profile legal --json",
|
|
499
502
|
"",
|
|
@@ -523,9 +526,9 @@ function ajuda() {
|
|
|
523
526
|
"verificacao final: sema verificar <arquivo-ou-pasta> [--saida <diretorio-base>] [--json]",
|
|
524
527
|
"formatacao: sema formatar <arquivo-ou-pasta> [--check] [--json]",
|
|
525
528
|
"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]",
|
|
526
|
-
"profile: sema profile validar <software|workflow|ops|game|legal|research> <arquivo-ou-pasta> [--maturidade draft|prototype|production|critical] [--preset <preset>] [--artefato <texto>|--artefato-arquivo <arquivo>] [--json]",
|
|
529
|
+
"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]",
|
|
527
530
|
"capabilities: sema profile capabilities [--json]",
|
|
528
|
-
"rule packs: sema rule-packs [--profile <author|software|workflow|ops|game|legal|research>] [--json]",
|
|
531
|
+
"rule packs: sema rule-packs [--profile <author|software|workflow|ops|game|legal|research|conversas>] [--json]",
|
|
529
532
|
]),
|
|
530
533
|
"",
|
|
531
534
|
renderizarSecaoAscii("Ajuda IA-first", [
|
|
@@ -4335,6 +4338,13 @@ const REQUISITOS_PROFILE = {
|
|
|
4335
4338
|
{ id: "incerteza_e_limite", descricao: "declara incerteza, lacunas e limites da conclusao", termos: [/incerteza|lacuna|limite/i, /conclusao|afirmacao/i], obrigatorio: true },
|
|
4336
4339
|
{ id: "reprodutibilidade", descricao: "preserva protocolo, dados e reproducibilidade", termos: [/protocolo|dataset|dados/i, /reprodut|replic/i], obrigatorio: false },
|
|
4337
4340
|
],
|
|
4341
|
+
conversas: [
|
|
4342
|
+
{ id: "tom_e_persona", descricao: "declara tom, formalidade, persona e intensidade persuasiva", termos: [/tom|persona|voz/i, /formalidade|persuasiv|comercial|serio/i], obrigatorio: true },
|
|
4343
|
+
{ id: "estado_cliente", descricao: "modela etapa, intencao, sentimento, objecoes e memoria curta", termos: [/etapa|estado|intencao/i, /sentimento|objec|historico|memoria/i], obrigatorio: true },
|
|
4344
|
+
{ id: "limites_comerciais", descricao: "bloqueia promessas, preco, prazo, garantia e insistencia sem base", termos: [/promessa|preco|prazo|garantia|desconto/i, /forbidden|proibid|bloque|sem_base|nao autorizado/i], obrigatorio: true },
|
|
4345
|
+
{ id: "escalacao_humana", descricao: "declara quando transferir para humano", termos: [/escalar_humano|escalacao|humano|atendente/i, /irritado|juridico|cancelamento|reclamacao/i], obrigatorio: true },
|
|
4346
|
+
{ id: "resposta_validada", descricao: "valida resposta, proxima acao e aderencia ao tom antes de enviar", termos: [/validar_resposta|validar resposta|resposta/i, /proxima_acao|proxima acao|cta|aderente_ao_tom/i], obrigatorio: true },
|
|
4347
|
+
],
|
|
4338
4348
|
};
|
|
4339
4349
|
const REQUISITOS_PROFILE_COMUNS = [
|
|
4340
4350
|
{
|
|
@@ -4365,6 +4375,13 @@ const ALIASES_PROFILE = {
|
|
|
4365
4375
|
juridico: "legal",
|
|
4366
4376
|
research: "research",
|
|
4367
4377
|
pesquisa: "research",
|
|
4378
|
+
conversas: "conversas",
|
|
4379
|
+
conversa: "conversas",
|
|
4380
|
+
atendimento: "conversas",
|
|
4381
|
+
atendimento_conversacional: "conversas",
|
|
4382
|
+
bot: "conversas",
|
|
4383
|
+
chatbot: "conversas",
|
|
4384
|
+
chat: "conversas",
|
|
4368
4385
|
};
|
|
4369
4386
|
function normalizarProfileSemantico(valor) {
|
|
4370
4387
|
if (!valor) {
|
|
@@ -4390,6 +4407,7 @@ const PRESETS_PROFILE = {
|
|
|
4390
4407
|
legal: ["lgpd", "contrato", "dpa", "termos_uso", "privacidade", "due_diligence", "compliance"],
|
|
4391
4408
|
research: ["rapida", "tecnica", "decisoria", "critica"],
|
|
4392
4409
|
game: ["casual", "arcade", "rpg", "economia", "playtest"],
|
|
4410
|
+
conversas: ["atendimento", "vendas", "suporte", "qualificacao", "retencao", "cobranca"],
|
|
4393
4411
|
};
|
|
4394
4412
|
const CAPABILITY_MATRIX_GOVERNANCA = {
|
|
4395
4413
|
author: {
|
|
@@ -4497,6 +4515,21 @@ const CAPABILITY_MATRIX_GOVERNANCA = {
|
|
|
4497
4515
|
],
|
|
4498
4516
|
rulePacksSugeridos: ["playtest", "economy-balance", "progression"],
|
|
4499
4517
|
},
|
|
4518
|
+
conversas: {
|
|
4519
|
+
profile: "conversas",
|
|
4520
|
+
detectaLiteral: true,
|
|
4521
|
+
detectaSemantico: "parcial",
|
|
4522
|
+
detectaOrdemExecucao: "parcial",
|
|
4523
|
+
detectaDriftReal: "parcial",
|
|
4524
|
+
validaArtefatoReal: true,
|
|
4525
|
+
interpretaNegacao: true,
|
|
4526
|
+
confianca: "media",
|
|
4527
|
+
limites: [
|
|
4528
|
+
"validacao de resposta depende do historico e politicas comerciais enviados",
|
|
4529
|
+
"handoff humano precisa de integracao do runtime de atendimento para ser executado",
|
|
4530
|
+
],
|
|
4531
|
+
rulePacksSugeridos: ["conversation-safety", "sales-conversation", "support-handoff"],
|
|
4532
|
+
},
|
|
4500
4533
|
};
|
|
4501
4534
|
const RULE_PACKS_SEMA = [
|
|
4502
4535
|
{
|
|
@@ -4609,6 +4642,36 @@ const RULE_PACKS_SEMA = [
|
|
|
4609
4642
|
monetizacao: "cloud",
|
|
4610
4643
|
status: "planejado",
|
|
4611
4644
|
},
|
|
4645
|
+
{
|
|
4646
|
+
id: "conversation-safety",
|
|
4647
|
+
nome: "Customer Conversation Safety",
|
|
4648
|
+
categoria: "oss",
|
|
4649
|
+
profiles: ["conversas"],
|
|
4650
|
+
maturidadeMinima: "prototype",
|
|
4651
|
+
controles: ["forbidden_claims", "tone_policy", "customer_state", "human_handoff", "audit_trace"],
|
|
4652
|
+
monetizacao: "aberto",
|
|
4653
|
+
status: "base",
|
|
4654
|
+
},
|
|
4655
|
+
{
|
|
4656
|
+
id: "sales-conversation",
|
|
4657
|
+
nome: "Sales Conversation Guardrails",
|
|
4658
|
+
categoria: "premium",
|
|
4659
|
+
profiles: ["conversas"],
|
|
4660
|
+
maturidadeMinima: "production",
|
|
4661
|
+
controles: ["objection_handling", "authorized_offer", "honest_cta", "no_fake_discount", "promise_limits"],
|
|
4662
|
+
monetizacao: "cloud",
|
|
4663
|
+
status: "planejado",
|
|
4664
|
+
},
|
|
4665
|
+
{
|
|
4666
|
+
id: "support-handoff",
|
|
4667
|
+
nome: "Support Handoff",
|
|
4668
|
+
categoria: "premium",
|
|
4669
|
+
profiles: ["conversas", "ops"],
|
|
4670
|
+
maturidadeMinima: "production",
|
|
4671
|
+
controles: ["escalation_trigger", "ticket_context", "angry_customer", "legal_risk", "handoff_reason"],
|
|
4672
|
+
monetizacao: "cloud",
|
|
4673
|
+
status: "planejado",
|
|
4674
|
+
},
|
|
4612
4675
|
{
|
|
4613
4676
|
id: "event-driven",
|
|
4614
4677
|
nome: "Event Driven Workflow",
|
|
@@ -4746,38 +4809,56 @@ const REQUISITOS_PRESET_PROFILE = {
|
|
|
4746
4809
|
{ id: "rollback_criterio_recuperacao", descricao: "rollback declara criterio objetivo de recuperacao", termos: [/rollback/i, /criterio|gatilho/i, /recuper/i], obrigatorio: true, severidade: "blocking" },
|
|
4747
4810
|
],
|
|
4748
4811
|
lgpd: [
|
|
4749
|
-
{ id: "lgpd_matriz_dados", descricao: "LGPD declara dado, finalidade, base legal e retencao", termos: [/dado|titular/i, /finalidade/i, /base legal/i, /retencao|
|
|
4812
|
+
{ id: "lgpd_matriz_dados", descricao: "LGPD declara dado, finalidade, base legal e retencao", termos: [/dado|titular/i, /finalidade/i, /base legal/i, /retencao|retenção/i], obrigatorio: true, severidade: "critical" },
|
|
4750
4813
|
],
|
|
4751
4814
|
contrato: [
|
|
4752
|
-
{ id: "contrato_clausulas_nucleo", descricao: "contrato declara partes, objeto, obrigacoes e rescisao", termos: [/partes/i, /objeto/i, /obrigac|obriga
|
|
4815
|
+
{ id: "contrato_clausulas_nucleo", descricao: "contrato declara partes, objeto, obrigacoes e rescisao", termos: [/partes/i, /objeto/i, /obrigac|obrigaç/i, /rescis/i], obrigatorio: true, severidade: "blocking" },
|
|
4753
4816
|
],
|
|
4754
4817
|
dpa: [
|
|
4755
4818
|
{ id: "dpa_operador_controlador", descricao: "DPA declara controlador, operador, dados e subprocessadores", termos: [/controlador/i, /operador/i, /subprocess/i, /dados/i], obrigatorio: true, severidade: "critical" },
|
|
4756
4819
|
],
|
|
4757
4820
|
termos_uso: [
|
|
4758
|
-
{ id: "termos_uso_limites", descricao: "termos de uso declaram uso permitido, proibicoes e limitacao", termos: [/uso permitido/i, /proibid|vedad/i, /limitacao|
|
|
4821
|
+
{ id: "termos_uso_limites", descricao: "termos de uso declaram uso permitido, proibicoes e limitacao", termos: [/uso permitido/i, /proibid|vedad/i, /limitacao|limitação/i], obrigatorio: true, severidade: "blocking" },
|
|
4759
4822
|
],
|
|
4760
4823
|
privacidade: [
|
|
4761
4824
|
{ id: "privacidade_dados_direitos", descricao: "privacidade declara dados, finalidade, direitos e contato", termos: [/dados/i, /finalidade/i, /direitos/i, /contato/i], obrigatorio: true, severidade: "blocking" },
|
|
4762
4825
|
],
|
|
4763
4826
|
due_diligence: [
|
|
4764
|
-
{ id: "due_diligence_risco_evidencia", descricao: "due diligence declara risco, evidencia e pendencias", termos: [/risco/i, /evidencia|
|
|
4827
|
+
{ id: "due_diligence_risco_evidencia", descricao: "due diligence declara risco, evidencia e pendencias", termos: [/risco/i, /evidencia|evidência/i, /pendenc|pendênc/i], obrigatorio: true, severidade: "blocking" },
|
|
4765
4828
|
],
|
|
4766
4829
|
compliance: [
|
|
4767
|
-
{ id: "compliance_controle_auditoria", descricao: "compliance declara controles, auditoria e responsavel", termos: [/controle/i, /auditoria/i, /responsavel|
|
|
4830
|
+
{ id: "compliance_controle_auditoria", descricao: "compliance declara controles, auditoria e responsavel", termos: [/controle/i, /auditoria/i, /responsavel|responsável/i], obrigatorio: true, severidade: "blocking" },
|
|
4768
4831
|
],
|
|
4769
4832
|
decisoria: [
|
|
4770
|
-
{ id: "research_matriz_decisao", descricao: "pesquisa decisoria declara criterio, peso e alternativa", termos: [/criterio|
|
|
4833
|
+
{ id: "research_matriz_decisao", descricao: "pesquisa decisoria declara criterio, peso e alternativa", termos: [/criterio|critério/i, /peso/i, /alternativa/i], obrigatorio: true, severidade: "blocking" },
|
|
4771
4834
|
],
|
|
4772
4835
|
critica: [
|
|
4773
|
-
{ id: "research_contraditorio", descricao: "pesquisa critica tenta derrubar a propria conclusao", termos: [/contradit|contra.?evidencia|contra.?
|
|
4836
|
+
{ id: "research_contraditorio", descricao: "pesquisa critica tenta derrubar a propria conclusao", termos: [/contradit|contra.?evidencia|contra.?evidência/i, /hipotese|hipótese|conclusao|conclusão/i], obrigatorio: true, severidade: "blocking" },
|
|
4774
4837
|
],
|
|
4775
4838
|
playtest: [
|
|
4776
|
-
{ id: "game_playtest_temporal", descricao: "playtest declara primeiros segundos, primeiro minuto e tensao", termos: [/primeiros? 10 segundos|10s/i, /1 minuto|um minuto/i, /tensao|
|
|
4839
|
+
{ id: "game_playtest_temporal", descricao: "playtest declara primeiros segundos, primeiro minuto e tensao", termos: [/primeiros? 10 segundos|10s/i, /1 minuto|um minuto/i, /tensao|tensão/i], obrigatorio: true, severidade: "blocking" },
|
|
4777
4840
|
],
|
|
4778
4841
|
economia: [
|
|
4779
4842
|
{ id: "game_economia_balanceada", descricao: "economia declara moeda, fonte, gasto e exploit", termos: [/moeda|economia/i, /fonte/i, /gasto|sink/i, /exploit/i], obrigatorio: true, severidade: "blocking" },
|
|
4780
4843
|
],
|
|
4844
|
+
atendimento: [
|
|
4845
|
+
{ id: "conversas_atendimento_estado", descricao: "atendimento declara estado do cliente e proxima acao", termos: [/estado|etapa|sentimento/i, /proxima_acao|proxima acao|encaminhar|resolver/i], obrigatorio: true, severidade: "blocking" },
|
|
4846
|
+
],
|
|
4847
|
+
vendas: [
|
|
4848
|
+
{ id: "conversas_vendas_objecao_cta", descricao: "vendas trata objecao e CTA sem promessa falsa", termos: [/objec|duvida|interesse|dor/i, /cta|proxima_acao|proxima acao|agendar|diagnostico|proposta/i], obrigatorio: true, severidade: "blocking" },
|
|
4849
|
+
],
|
|
4850
|
+
suporte: [
|
|
4851
|
+
{ id: "conversas_suporte_escalacao", descricao: "suporte declara problema, solucao e escalacao humana", termos: [/problema|erro|suporte|chamado/i, /escalar|humano|atendente|ticket/i], obrigatorio: true, severidade: "blocking" },
|
|
4852
|
+
],
|
|
4853
|
+
qualificacao: [
|
|
4854
|
+
{ id: "conversas_qualificacao_criterios", descricao: "qualificacao declara criterios e dados minimos do lead", termos: [/qualifica|lead|perfil/i, /criterio|orcamento|prazo|necessidade/i], obrigatorio: true, severidade: "blocking" },
|
|
4855
|
+
],
|
|
4856
|
+
retencao: [
|
|
4857
|
+
{ id: "conversas_retencao_limites", descricao: "retencao declara motivo, proposta autorizada e limites", termos: [/retencao|cancelamento|motivo/i, /autorizad|limite|oferta|proposta/i], obrigatorio: true, severidade: "blocking" },
|
|
4858
|
+
],
|
|
4859
|
+
cobranca: [
|
|
4860
|
+
{ id: "conversas_cobranca_cuidado", descricao: "cobranca declara valor, vencimento, tom e escalacao", termos: [/cobranca|valor|vencimento/i, /tom|respeitoso|humano|escalar/i], obrigatorio: true, severidade: "critical" },
|
|
4861
|
+
],
|
|
4781
4862
|
};
|
|
4782
4863
|
function normalizarPresetProfile(profile, valor) {
|
|
4783
4864
|
if (!valor)
|
|
@@ -4799,6 +4880,16 @@ function normalizarPresetProfile(profile, valor) {
|
|
|
4799
4880
|
modulo_codigo: "modulo",
|
|
4800
4881
|
seguranca: "security",
|
|
4801
4882
|
seguranca_codigo: "security",
|
|
4883
|
+
atendimento_cliente: "atendimento",
|
|
4884
|
+
conversa_atendimento: "atendimento",
|
|
4885
|
+
comercial: "vendas",
|
|
4886
|
+
venda: "vendas",
|
|
4887
|
+
conversa_vendas: "vendas",
|
|
4888
|
+
suporte_cliente: "suporte",
|
|
4889
|
+
qualificar: "qualificacao",
|
|
4890
|
+
qualificacao_lead: "qualificacao",
|
|
4891
|
+
retencao_cliente: "retencao",
|
|
4892
|
+
cobrar: "cobranca",
|
|
4802
4893
|
};
|
|
4803
4894
|
const preset = alias[chave] ?? chave;
|
|
4804
4895
|
return PRESETS_PROFILE[profile].includes(preset) ? preset : null;
|
|
@@ -4808,6 +4899,9 @@ function moduloCombinaComProfile(modulo, caminho, profile) {
|
|
|
4808
4899
|
if (profile === "workflow") {
|
|
4809
4900
|
return /workflow|n8n|orquestracao/.test(alvo);
|
|
4810
4901
|
}
|
|
4902
|
+
if (profile === "conversas") {
|
|
4903
|
+
return /conversas|conversa|atendimento|chatbot|bot/.test(alvo);
|
|
4904
|
+
}
|
|
4811
4905
|
return alvo.includes(profile);
|
|
4812
4906
|
}
|
|
4813
4907
|
function severidadeRequisitoProfile(requisito, profile, maturidade) {
|
|
@@ -4941,8 +5035,8 @@ function selecionarRulePacksProfile(profile) {
|
|
|
4941
5035
|
function contratoProibeTermoProfile(contrato, termo) {
|
|
4942
5036
|
const escaped = termo.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
4943
5037
|
const padroes = [
|
|
4944
|
-
new RegExp(`(forbidden|proibid|vedad|nao usar|
|
|
4945
|
-
new RegExp(`${escaped}[^\\n]{0,80}(forbidden|proibid|vedad|nao permitido|
|
|
5038
|
+
new RegExp(`(forbidden|proibid|vedad|nao usar|não usar|sem)\\s+[^\\n]{0,80}${escaped}`, "i"),
|
|
5039
|
+
new RegExp(`${escaped}[^\\n]{0,80}(forbidden|proibid|vedad|nao permitido|não permitido|nao usar|não usar)`, "i"),
|
|
4946
5040
|
];
|
|
4947
5041
|
return padroes.some((padrao) => padrao.test(contrato));
|
|
4948
5042
|
}
|
|
@@ -5009,8 +5103,8 @@ function localizarRegexProfile(texto, regex) {
|
|
|
5009
5103
|
function termoNegadoNoArtefato(texto, indice, tamanho) {
|
|
5010
5104
|
const antes = texto.slice(Math.max(0, indice - 90), indice);
|
|
5011
5105
|
const depois = texto.slice(indice + tamanho, Math.min(texto.length, indice + tamanho + 90));
|
|
5012
|
-
const negacaoAntes = /\b(?:sem|ausente|ausencia|
|
|
5013
|
-
const negacaoDepois = /^[\s\S]{0,80}\b(?:ausente|ausentes|ausencia|
|
|
5106
|
+
const negacaoAntes = /\b(?:sem|ausente|ausencia|ausência|faltando|falta|faltam|inexistente|indefinid[ao]s?|pendente|nao\s+(?:ha|há|define|declara|especifica|possui|tem|existe|inclui|contem|contém|configura|implementa|mapeia|separa|informa|descreve|testa|valida)|não\s+(?:ha|há|define|declara|especifica|possui|tem|existe|inclui|contem|contém|configura|implementa|mapeia|separa|informa|descreve|testa|valida))\b[\s\S]{0,80}$/i;
|
|
5107
|
+
const negacaoDepois = /^[\s\S]{0,80}\b(?:ausente|ausentes|ausencia|ausência|inexistente|indefinid[ao]s?|faltando|pendente|nao\s+(?:definid[ao]|declarad[ao]|especificad[ao]|testad[ao]|valid[ao]|implementad[ao]|configurad[ao]|mapead[ao])|não\s+(?:definid[ao]|declarad[ao]|especificad[ao]|testad[ao]|valid[ao]|implementad[ao]|configurad[ao]|mapead[ao]))\b/i;
|
|
5014
5108
|
return negacaoAntes.test(antes) || negacaoDepois.test(depois);
|
|
5015
5109
|
}
|
|
5016
5110
|
function avaliarPresencaPositivaArtefato(texto, regex) {
|
|
@@ -5236,39 +5330,39 @@ function avaliarArtefatoOpsProfile(artefato, preset) {
|
|
|
5236
5330
|
const checks = [
|
|
5237
5331
|
{ id: "ops_runbook_artefato", descricao: "plano operacional contem runbook", regex: /runbook|passo a passo|procedimento/i, sugestao: "adicione runbook executavel com passos, dono e criterio de parada." },
|
|
5238
5332
|
{ id: "ops_rollback_artefato", descricao: "plano operacional contem rollback", regex: /rollback|reverter|revers/i, sugestao: "adicione comando/criterio de rollback." },
|
|
5239
|
-
{ id: "ops_healthcheck_artefato", descricao: "plano operacional contem healthcheck", regex: /healthcheck|healthz|smoke|verificacao live|
|
|
5240
|
-
{ id: "ops_responsavel_artefato", descricao: "plano operacional declara responsavel/oncall", regex: /responsavel|
|
|
5333
|
+
{ id: "ops_healthcheck_artefato", descricao: "plano operacional contem healthcheck", regex: /healthcheck|healthz|smoke|verificacao live|verificação live/i, sugestao: "declare endpoint, comando ou metrica que prova recuperacao." },
|
|
5334
|
+
{ id: "ops_responsavel_artefato", descricao: "plano operacional declara responsavel/oncall", regex: /responsavel|responsável|owner|oncall|dono/i, sugestao: "declare responsavel operacional, oncall ou dono da mudanca." },
|
|
5241
5335
|
{ id: "ops_comunicacao_artefato", descricao: "plano operacional contem comunicacao", regex: /comunic|avisar|status page|cliente/i, severidade: "warning", sugestao: "adicione quando e quem comunicar." },
|
|
5242
5336
|
];
|
|
5243
5337
|
const achados = validarTermosObrigatoriosArtefato(artefato, checks);
|
|
5244
5338
|
if ((preset === "migration" || preset === "critical") && !avaliarPresencaPositivaArtefato(artefato, /backup|snapshot|revers/i).atendido) {
|
|
5245
5339
|
achados.push(criarAchadoArtefatoProfile("ops_migration_sem_reversibilidade", "migration/critical exige reversibilidade comprovada", false, "critical", undefined, "declare backup, snapshot, down migration ou estrategia manual testada."));
|
|
5246
5340
|
}
|
|
5247
|
-
if (preset === "rollback" && !avaliarPresencaPositivaArtefato(artefato, /criterio|
|
|
5341
|
+
if (preset === "rollback" && !avaliarPresencaPositivaArtefato(artefato, /criterio|critério|gatilho|recuper/i).atendido) {
|
|
5248
5342
|
achados.push(criarAchadoArtefatoProfile("ops_rollback_sem_criterio_recuperacao", "rollback exige criterio objetivo de recuperacao", false, "blocking", undefined, "declare gatilho de rollback e criterio verificavel de recuperacao."));
|
|
5249
5343
|
}
|
|
5250
5344
|
return achados;
|
|
5251
5345
|
}
|
|
5252
5346
|
function avaliarArtefatoLegalProfile(artefato, preset) {
|
|
5253
5347
|
const achados = [];
|
|
5254
|
-
const pareceFinal = /parecer final|opiniao definitiva|
|
|
5255
|
-
const temRevisaoHumana = avaliarPresencaPositivaArtefato(artefato, /revisao humana|
|
|
5256
|
-
const temAvisoNaoParecer = /nao e parecer|
|
|
5348
|
+
const pareceFinal = /parecer final|opiniao definitiva|opinião definitiva|conclusao juridica definitiva|conclusão jurÃdica definitiva/i.test(artefato);
|
|
5349
|
+
const temRevisaoHumana = avaliarPresencaPositivaArtefato(artefato, /revisao humana|revisão humana|advogado|minuta|rascunho|preliminar/i).atendido;
|
|
5350
|
+
const temAvisoNaoParecer = /nao e parecer|não é parecer/i.test(artefato);
|
|
5257
5351
|
const temFreioHumano = temRevisaoHumana || temAvisoNaoParecer;
|
|
5258
5352
|
if (pareceFinal && !temFreioHumano) {
|
|
5259
|
-
achados.push(criarAchadoArtefatoProfile("legal_parecer_final_sem_revisao", "documento legal parece parecer final sem revisao humana obrigatoria", false, "critical", trechoRegexProfile(artefato, /parecer final|opiniao definitiva|
|
|
5353
|
+
achados.push(criarAchadoArtefatoProfile("legal_parecer_final_sem_revisao", "documento legal parece parecer final sem revisao humana obrigatoria", false, "critical", trechoRegexProfile(artefato, /parecer final|opiniao definitiva|opinião definitiva/i), "marque como minuta/preliminar e exija revisao humana por profissional habilitado."));
|
|
5260
5354
|
}
|
|
5261
5355
|
if (preset === "lgpd") {
|
|
5262
5356
|
achados.push(...validarTermosObrigatoriosArtefato(artefato, [
|
|
5263
5357
|
{ id: "legal_lgpd_base_finalidade", descricao: "artefato LGPD declara base legal e finalidade", regex: /base legal[\s\S]{0,160}finalidade|finalidade[\s\S]{0,160}base legal/i, severidade: "critical", sugestao: "inclua matriz dado -> finalidade -> base legal." },
|
|
5264
|
-
{ id: "legal_lgpd_retencao_direitos", descricao: "artefato LGPD declara retencao e direitos do titular", regex: /retencao|
|
|
5358
|
+
{ id: "legal_lgpd_retencao_direitos", descricao: "artefato LGPD declara retencao e direitos do titular", regex: /retencao|retenção/i, severidade: "blocking", sugestao: "inclua retencao, descarte e direitos do titular." },
|
|
5265
5359
|
]));
|
|
5266
5360
|
}
|
|
5267
5361
|
if (preset === "privacidade") {
|
|
5268
5362
|
achados.push(...validarTermosObrigatoriosArtefato(artefato, [
|
|
5269
5363
|
{ id: "legal_privacidade_dados_finalidade", descricao: "politica de privacidade declara dados tratados e finalidade", regex: /dados?[\s\S]{0,120}finalidade|finalidade[\s\S]{0,120}dados?/i, severidade: "critical", sugestao: "inclua dados coletados/tratados e finalidade de cada uso." },
|
|
5270
|
-
{ id: "legal_privacidade_base_legal", descricao: "politica de privacidade declara base legal", regex: /base legal|consentimento|legitimo interesse|
|
|
5271
|
-
{ id: "legal_privacidade_retencao", descricao: "politica de privacidade declara retencao/descarte", regex: /retencao|
|
|
5364
|
+
{ id: "legal_privacidade_base_legal", descricao: "politica de privacidade declara base legal", regex: /base legal|consentimento|legitimo interesse|legÃtimo interesse|execucao de contrato|execução de contrato/i, severidade: "critical", sugestao: "declare base legal por finalidade." },
|
|
5365
|
+
{ id: "legal_privacidade_retencao", descricao: "politica de privacidade declara retencao/descarte", regex: /retencao|retenção|descarte|prazo de guarda/i, severidade: "blocking", sugestao: "declare prazo de retencao e descarte." },
|
|
5272
5366
|
{ id: "legal_privacidade_direitos_contato", descricao: "politica de privacidade declara direitos do titular e contato/DPO", regex: /direitos? do titular[\s\S]{0,160}(contato|dpo|encarregado)|(?:contato|dpo|encarregado)[\s\S]{0,160}direitos? do titular/i, severidade: "blocking", sugestao: "declare direitos do titular e canal de contato/encarregado." },
|
|
5273
5367
|
]));
|
|
5274
5368
|
}
|
|
@@ -5276,11 +5370,11 @@ function avaliarArtefatoLegalProfile(artefato, preset) {
|
|
|
5276
5370
|
}
|
|
5277
5371
|
function avaliarArtefatoResearchProfile(artefato, preset) {
|
|
5278
5372
|
const achados = validarTermosObrigatoriosArtefato(artefato, [
|
|
5279
|
-
{ id: "research_fontes_artefato", descricao: "resposta final cita fontes ou referencias", regex: /https?:\/\/|\[[0-9]+\]|fonte|referencia|
|
|
5280
|
-
{ id: "research_incerteza_artefato", descricao: "resposta final declara incerteza ou limite", regex: /incerteza|limite|baixa confianca|baixa
|
|
5281
|
-
{ id: "research_fato_inferencia_artefato", descricao: "resposta separa fato de inferencia", regex: /fato|inferencia|
|
|
5373
|
+
{ id: "research_fontes_artefato", descricao: "resposta final cita fontes ou referencias", regex: /https?:\/\/|\[[0-9]+\]|fonte|referencia|referência/i, sugestao: "inclua fontes citaveis e separe evidencia de opiniao." },
|
|
5374
|
+
{ id: "research_incerteza_artefato", descricao: "resposta final declara incerteza ou limite", regex: /incerteza|limite|baixa confianca|baixa confiança|lacuna/i, sugestao: "declare limites, incertezas e o que nao foi verificado." },
|
|
5375
|
+
{ id: "research_fato_inferencia_artefato", descricao: "resposta separa fato de inferencia", regex: /fato|inferencia|inferência/i, sugestao: "rotule conclusoes como fato, inferencia ou recomendacao." },
|
|
5282
5376
|
]);
|
|
5283
|
-
if (preset === "critica" && !avaliarPresencaPositivaArtefato(artefato, /contra.?evidencia|contra.?
|
|
5377
|
+
if (preset === "critica" && !avaliarPresencaPositivaArtefato(artefato, /contra.?evidencia|contra.?evidência|evidencia contra|evidência contra|refut/i).atendido) {
|
|
5284
5378
|
achados.push(criarAchadoArtefatoProfile("research_sem_contraditorio", "pesquisa critica nao tentou derrubar a conclusao", false, "blocking", undefined, "adicione secao de evidencias contra a recomendacao principal."));
|
|
5285
5379
|
}
|
|
5286
5380
|
return achados;
|
|
@@ -5288,14 +5382,79 @@ function avaliarArtefatoResearchProfile(artefato, preset) {
|
|
|
5288
5382
|
function avaliarArtefatoGameProfile(artefato, preset) {
|
|
5289
5383
|
const achados = validarTermosObrigatoriosArtefato(artefato, [
|
|
5290
5384
|
{ id: "game_loop_artefato", descricao: "artefato de jogo declara core loop", regex: /core loop|loop|ciclo/i, sugestao: "declare acao principal, feedback, recompensa e reinicio." },
|
|
5291
|
-
{ id: "game_estado_artefato", descricao: "artefato de jogo declara estado e transicoes", regex: /estado|state|playing|game_over|transic|transi
|
|
5292
|
-
{ id: "game_pacing_artefato", descricao: "artefato de jogo declara pacing/curva", regex: /pacing|curva|dificuldade|sessao|
|
|
5385
|
+
{ id: "game_estado_artefato", descricao: "artefato de jogo declara estado e transicoes", regex: /estado|state|playing|game_over|transic|transiç/i, sugestao: "declare estados e transicoes permitidas." },
|
|
5386
|
+
{ id: "game_pacing_artefato", descricao: "artefato de jogo declara pacing/curva", regex: /pacing|curva|dificuldade|sessao|sessão/i, severidade: "warning", sugestao: "adicione ritmo esperado e variacao de dificuldade." },
|
|
5293
5387
|
]);
|
|
5294
5388
|
if (preset === "playtest" && !avaliarPresencaPositivaArtefato(artefato, /10 segundos|1 minuto|um minuto|primeiro minuto/i).atendido) {
|
|
5295
5389
|
achados.push(criarAchadoArtefatoProfile("game_playtest_sem_tempo", "playtest nao descreve primeiros segundos e primeiro minuto", false, "blocking", undefined, "adicione simulacao dos primeiros 10s e do primeiro minuto."));
|
|
5296
5390
|
}
|
|
5297
5391
|
return achados;
|
|
5298
5392
|
}
|
|
5393
|
+
function avaliarArtefatoConversasProfile(artefato, preset) {
|
|
5394
|
+
const achados = validarTermosObrigatoriosArtefato(artefato, [
|
|
5395
|
+
{ id: "conversas_tom_artefato", descricao: "artefato declara tom/persona da conversa", regex: /tom|persona|voz|formalidade|comercial|persuasiv|serio|consultiv/i, sugestao: "declare o tom, persona e nivel de formalidade usados na resposta." },
|
|
5396
|
+
{ id: "conversas_estado_cliente_artefato", descricao: "artefato declara estado, intencao ou objecao do cliente", regex: /estado|etapa|intencao|sentimento|objec|lead|cliente/i, sugestao: "registre etapa, intencao detectada, sentimento e objecoes antes da resposta." },
|
|
5397
|
+
{ id: "conversas_proxima_acao_artefato", descricao: "artefato declara proxima acao ou CTA honesto", regex: /proxima_acao|proxima acao|cta|agendar|encaminhar|diagnostico|abrir chamado|escalar/i, sugestao: "adicione proxima acao clara sem promessa indevida." },
|
|
5398
|
+
{ id: "conversas_estado_visivel_artefato", descricao: "artefato declara ultima mensagem e ultima resposta visivel", regex: /ultima mensagem|ultima resposta visivel|mensagem_cliente_visivel|resposta_anterior_visivel|historico visivel|conversa visivel/i, sugestao: "baseie o turno na conversa visivel ao cliente, nao em pensamento interno ou resposta bruta." },
|
|
5399
|
+
{ id: "conversas_saida_cliente_artefato", descricao: "artefato separa saida interna da resposta enviada", regex: /customer_reply|resposta final ao cliente|unica saida visivel|apenas resposta_cliente|somente resposta_cliente/i, sugestao: "declare que apenas customer_reply/resposta_cliente pode sair para o canal." },
|
|
5400
|
+
{ id: "conversas_dedupe_artefato", descricao: "artefato declara deduplicacao por evento", regex: /dedupe|deduplic|evento_id|message_id|inbound|uma entrada[\s\S]{0,40}uma saida|uma mensagem[\s\S]{0,40}uma resposta/i, sugestao: "declare chave de deduplicacao por evento/mensagem recebida." },
|
|
5401
|
+
]);
|
|
5402
|
+
const promessaSemBase = /garanto|garantia total|100%|sem risco|resultado garantido|vender mais em \d+\s*dias|prometo/i.test(artefato);
|
|
5403
|
+
if (promessaSemBase) {
|
|
5404
|
+
achados.push(criarAchadoArtefatoProfile("conversas_promessa_sem_base", "resposta de bot parece prometer resultado, prazo ou garantia sem base", false, "critical", trechoRegexProfile(artefato, /garanto|garantia total|100%|sem risco|resultado garantido|vender mais em \d+\s*dias|prometo/i), "troque promessa absoluta por condicao verificavel, limite claro ou proposta de diagnostico.", undefined, { risco: "promessa_comercial_indevida" }));
|
|
5405
|
+
}
|
|
5406
|
+
const temContextoAnterior = /ultima resposta visivel|resposta_anterior_visivel|pergunta anterior|escopo faz sentido|proposta faz sentido|etapa atual|etapa escopo/i.test(artefato);
|
|
5407
|
+
const confirmacaoCurta = /\b(sim claro|sim|fechado|pode ser|beleza|ok|certo|manda|bora|ta bom|isso mesmo|gostei)\b/i.test(artefato);
|
|
5408
|
+
const reiniciouAtendimento = /sou [A-Za-z]|me chamo|como posso ajudar|em que posso ajudar|quer organizar|apresentacao|apresenta[cç][aã]o|inicio de conversa/i.test(artefato);
|
|
5409
|
+
if (temContextoAnterior && confirmacaoCurta && reiniciouAtendimento) {
|
|
5410
|
+
achados.push(criarAchadoArtefatoProfile("conversas_confirmacao_reiniciada", "confirmacao curta foi tratada como novo inicio em vez de avancar a etapa anterior", false, "critical", trechoRegexProfile(artefato, /(?:sim claro|sim|fechado|pode ser|beleza|ok|certo|manda|bora)[\s\S]{0,220}(?:sou [A-Za-z]|me chamo|como posso ajudar|quer organizar|apresenta[cç][aã]o)|(?:escopo faz sentido|proposta faz sentido|pergunta anterior)[\s\S]{0,220}(?:sou [A-Za-z]|me chamo|como posso ajudar|quer organizar|apresenta[cç][aã]o)/i), "interprete confirmacoes contra a ultima pergunta visivel e avance a conversa sem repetir saudacao.", undefined, { risco: "estado_conversa_perdido" }));
|
|
5411
|
+
}
|
|
5412
|
+
const vazouInterno = /(?:enviar|mandar|resposta visivel|customer_reply|resposta ao cliente)[\s\S]{0,120}(?:intent|stage|facts|missing_critical_info|internal_trace|raciocinio|pensamento interno|analise interna|JSON interno)|(?:raciocinio|pensamento interno|analise interna|JSON interno)[\s\S]{0,120}(?:cliente|canal|enviado|visivel)/i.test(artefato);
|
|
5413
|
+
if (vazouInterno) {
|
|
5414
|
+
achados.push(criarAchadoArtefatoProfile("conversas_vazamento_interno", "resposta parece expor raciocinio, JSON ou campos internos ao cliente", false, "critical", trechoRegexProfile(artefato, /(?:intent|stage|facts|missing_critical_info|internal_trace|raciocinio|pensamento interno|analise interna|JSON interno)[\s\S]{0,160}(?:cliente|canal|enviado|visivel)|(?:enviar|mandar|resposta visivel)[\s\S]{0,160}(?:intent|stage|facts|missing_critical_info|internal_trace|JSON interno)/i), "mande ao canal apenas customer_reply/resposta_cliente, mantendo interpretacao e auditoria fora da mensagem visivel.", undefined, { risco: "vazamento_de_estado_interno" }));
|
|
5415
|
+
}
|
|
5416
|
+
const whatsapp = /canal\s*:?\s*whatsapp|\bWHATSAPP\b/i.test(artefato);
|
|
5417
|
+
const canalAlternativo = /\b(email|e-mail|inbox|caixa de entrada)\b/i.test(artefato);
|
|
5418
|
+
const clientePediuCanal = /cliente pediu|cliente solicitou|pedido do cliente|solicitou email|pediu email/i.test(artefato);
|
|
5419
|
+
if (whatsapp && canalAlternativo && !clientePediuCanal) {
|
|
5420
|
+
achados.push(criarAchadoArtefatoProfile("conversas_canal_inventado", "conversa em WhatsApp tenta deslocar para email ou inbox sem pedido do cliente", false, "blocking", trechoRegexProfile(artefato, /WHATSAPP[\s\S]{0,180}(?:email|e-mail|inbox|caixa de entrada)|(?:email|e-mail|inbox|caixa de entrada)[\s\S]{0,180}WHATSAPP/i), "resolva no canal atual, a menos que o cliente tenha pedido outro canal.", undefined, { risco: "friccao_de_canal" }));
|
|
5421
|
+
}
|
|
5422
|
+
const respostaDuplicada = /duas respostas|duas mensagens visiveis|respondeu duas vezes|duplicou resposta|mesmo inbound|mesmo evento/i.test(artefato);
|
|
5423
|
+
const temDedupe = /dedupe|deduplic|evento_id|message_id|inbound_id|uma entrada[\s\S]{0,40}uma saida/i.test(artefato);
|
|
5424
|
+
if (respostaDuplicada && !temDedupe) {
|
|
5425
|
+
achados.push(criarAchadoArtefatoProfile("conversas_sem_dedupe_evento", "artefato indica risco de resposta duplicada sem deduplicacao por evento", false, "blocking", trechoRegexProfile(artefato, /duas respostas|duas mensagens visiveis|respondeu duas vezes|duplicou resposta|mesmo inbound|mesmo evento/i), "registre evento_id/message_id e envie no maximo uma resposta visivel por inbound.", undefined, { risco: "resposta_duplicada" }));
|
|
5426
|
+
}
|
|
5427
|
+
const precisaEscalar = /irritad|reclamac|juridic|cancelamento|processo|procon|advogado|ameaca/i.test(artefato);
|
|
5428
|
+
const escalou = avaliarPresencaPositivaArtefato(artefato, /escalar|humano|atendente|supervisor|ticket|chamado/i);
|
|
5429
|
+
if (precisaEscalar && !escalou.atendido) {
|
|
5430
|
+
achados.push(criarAchadoArtefatoProfile("conversas_sem_escalacao_humana", "conversa sensivel exige escalacao humana explicita", false, "critical", escalou.trecho ?? trechoRegexProfile(artefato, /irritad|reclamac|juridic|cancelamento|processo|procon|advogado/i), "declare handoff para humano com motivo e prioridade antes de continuar no bot.", escalou.motivo, {
|
|
5431
|
+
linha: escalou.linha,
|
|
5432
|
+
coluna: escalou.coluna,
|
|
5433
|
+
inicio: escalou.inicio,
|
|
5434
|
+
fim: escalou.fim,
|
|
5435
|
+
risco: "handoff_humano_ausente",
|
|
5436
|
+
}));
|
|
5437
|
+
}
|
|
5438
|
+
if (preset === "vendas") {
|
|
5439
|
+
achados.push(...validarTermosObrigatoriosArtefato(artefato, [
|
|
5440
|
+
{ id: "conversas_vendas_objecao_artefato", descricao: "conversa de vendas trata objecao ou dor do cliente", regex: /objec|duvida|dor|interesse|comparando|orcamento/i, sugestao: "trate a objecao antes do CTA." },
|
|
5441
|
+
{ id: "conversas_vendas_cta_artefato", descricao: "conversa de vendas contem CTA honesto", regex: /agendar|diagnostico|proposta|proxima acao|cta|posso te enviar/i, sugestao: "inclua convite claro e nao agressivo para a proxima etapa." },
|
|
5442
|
+
]));
|
|
5443
|
+
}
|
|
5444
|
+
if (preset === "suporte") {
|
|
5445
|
+
achados.push(...validarTermosObrigatoriosArtefato(artefato, [
|
|
5446
|
+
{ id: "conversas_suporte_problema_artefato", descricao: "suporte identifica problema ou chamado", regex: /problema|erro|chamado|ticket|suporte/i, sugestao: "identifique problema, contexto e o que sera feito." },
|
|
5447
|
+
{ id: "conversas_suporte_handoff_artefato", descricao: "suporte declara escalacao quando necessario", regex: /escalar|humano|atendente|ticket|chamado/i, sugestao: "declare quando o atendimento sai do bot." },
|
|
5448
|
+
]));
|
|
5449
|
+
}
|
|
5450
|
+
if (preset === "cobranca") {
|
|
5451
|
+
achados.push(...validarTermosObrigatoriosArtefato(artefato, [
|
|
5452
|
+
{ id: "conversas_cobranca_tom_artefato", descricao: "cobranca usa tom respeitoso e objetivo", regex: /respeitoso|cordial|tom|sem constrangimento|regularizar/i, severidade: "critical", sugestao: "declare tom respeitoso e evite constrangimento ou ameaca." },
|
|
5453
|
+
{ id: "conversas_cobranca_dado_artefato", descricao: "cobranca menciona valor, vencimento ou referencia autorizada", regex: /valor|vencimento|fatura|boleto|referencia autorizada/i, severidade: "blocking", sugestao: "referencie apenas dados autorizados da cobranca." },
|
|
5454
|
+
]));
|
|
5455
|
+
}
|
|
5456
|
+
return achados;
|
|
5457
|
+
}
|
|
5299
5458
|
function avaliarArtefatoProfile(profile, contrato, artefato, maturidade, preset) {
|
|
5300
5459
|
if (!artefato || !artefato.trim())
|
|
5301
5460
|
return [];
|
|
@@ -5312,6 +5471,8 @@ function avaliarArtefatoProfile(profile, contrato, artefato, maturidade, preset)
|
|
|
5312
5471
|
return avaliarArtefatoResearchProfile(artefato, preset);
|
|
5313
5472
|
case "game":
|
|
5314
5473
|
return avaliarArtefatoGameProfile(artefato, preset);
|
|
5474
|
+
case "conversas":
|
|
5475
|
+
return avaliarArtefatoConversasProfile(artefato, preset);
|
|
5315
5476
|
}
|
|
5316
5477
|
}
|
|
5317
5478
|
async function carregarArtefatoProfile(args) {
|
|
@@ -5325,7 +5486,7 @@ async function carregarArtefatoProfile(args) {
|
|
|
5325
5486
|
}
|
|
5326
5487
|
async function validarProfileSemantico(entrada, profile, opcoes) {
|
|
5327
5488
|
if (!entrada) {
|
|
5328
|
-
throw new Error("Uso: sema profile validar <software|workflow|ops|game|legal|research> <arquivo-ou-pasta> [--maturidade draft|prototype|production|critical] [--preset <preset>] [--artefato <texto>|--artefato-arquivo <arquivo>] [--json]");
|
|
5489
|
+
throw new Error("Uso: 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]");
|
|
5329
5490
|
}
|
|
5330
5491
|
const modulos = await carregarModulos(entrada);
|
|
5331
5492
|
const escolhido = modulos.find((item) => moduloCombinaComProfile(item.resultado.modulo?.nome, item.caminho, profile)) ?? modulos[0];
|
|
@@ -5505,9 +5666,9 @@ async function comandoProfile(posicionais, args, emJson) {
|
|
|
5505
5666
|
"Uso: sema profile <validar|capabilities|rule-packs>",
|
|
5506
5667
|
"",
|
|
5507
5668
|
"Comandos:",
|
|
5508
|
-
" sema profile validar <software|workflow|ops|game|legal|research> <arquivo-ou-pasta> [--maturidade draft|prototype|production|critical] [--preset <preset>] [--artefato <texto>|--artefato-arquivo <arquivo>] [--json]",
|
|
5669
|
+
" 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]",
|
|
5509
5670
|
" sema profile capabilities [--json]",
|
|
5510
|
-
" sema profile rule-packs [--profile <author|software|workflow|ops|game|legal|research>] [--json]",
|
|
5671
|
+
" sema profile rule-packs [--profile <author|software|workflow|ops|game|legal|research|conversas>] [--json]",
|
|
5511
5672
|
"",
|
|
5512
5673
|
"O profile e um gate semantico: se requisito obrigatorio faltar, a saida bloqueia.",
|
|
5513
5674
|
].join("\n"));
|
|
@@ -5531,7 +5692,7 @@ async function comandoProfile(posicionais, args, emJson) {
|
|
|
5531
5692
|
const profile = normalizarProfileSemantico(posicionais[1] ?? obterOpcao(args, "--profile"));
|
|
5532
5693
|
const entrada = posicionais[2] ?? obterOpcao(args, "--arquivo");
|
|
5533
5694
|
if (!profile) {
|
|
5534
|
-
console.error("Profile invalido. Use software, workflow, ops, game, legal ou
|
|
5695
|
+
console.error("Profile invalido. Use software, workflow, ops, game, legal, research ou conversas.");
|
|
5535
5696
|
return 1;
|
|
5536
5697
|
}
|
|
5537
5698
|
const preset = normalizarPresetProfile(profile, obterOpcao(args, "--preset"));
|
|
@@ -5892,19 +6053,19 @@ function avaliarPresetAuthor(preset, textoFonte) {
|
|
|
5892
6053
|
const checks = {
|
|
5893
6054
|
conto: [
|
|
5894
6055
|
{ id: "author_conto_sem_conflito", regex: /conflito|quer|precisa|perde|arrisca|custo/i, sugestao: "conto precisa de desejo, custo e conflito visiveis." },
|
|
5895
|
-
{ id: "author_conto_sem_fechamento", regex: /fim|final|consequencia|
|
|
6056
|
+
{ id: "author_conto_sem_fechamento", regex: /fim|final|consequencia|consequência|mudou|perdeu|ganhou/i, sugestao: "feche o conto com mudanca ou consequencia, nao so atmosfera." },
|
|
5896
6057
|
],
|
|
5897
6058
|
romance: [
|
|
5898
|
-
{ id: "author_romance_sem_arco", regex: /arco|capitulo|
|
|
6059
|
+
{ id: "author_romance_sem_arco", regex: /arco|capitulo|capÃtulo|continuidade|promessa|personagem/i, sugestao: "romance precisa preservar arco, promessa e continuidade entre capitulos." },
|
|
5899
6060
|
],
|
|
5900
6061
|
roteiro: [
|
|
5901
|
-
{ id: "author_roteiro_sem_cena", regex: /cena|ato|dialogo|
|
|
6062
|
+
{ id: "author_roteiro_sem_cena", regex: /cena|ato|dialogo|diálogo|acao visual|ação visual|int\.|ext\./i, sugestao: "roteiro precisa de cena, acao visual e/ou dialogo estruturado." },
|
|
5902
6063
|
],
|
|
5903
6064
|
lore: [
|
|
5904
|
-
{ id: "author_lore_sem_canon", regex: /canon|linha do tempo|mundo|
|
|
6065
|
+
{ id: "author_lore_sem_canon", regex: /canon|linha do tempo|mundo|facção|faccao|regra do mundo|continuidade/i, sugestao: "lore precisa de canon, mundo e restricoes de continuidade." },
|
|
5905
6066
|
],
|
|
5906
6067
|
campanha: [
|
|
5907
|
-
{ id: "author_campanha_sem_estado", regex: /estado|memoria|
|
|
6068
|
+
{ id: "author_campanha_sem_estado", regex: /estado|memoria|memória|sessao|sessão|evento irreversivel|evento irreversÃvel|personagem/i, sugestao: "campanha precisa guardar estado, memoria e eventos irreversiveis." },
|
|
5908
6069
|
],
|
|
5909
6070
|
};
|
|
5910
6071
|
return checks[preset].flatMap((check) => {
|
|
@@ -6238,7 +6399,7 @@ async function comandoDrift(entrada, args, emJson, cwd = process.cwd()) {
|
|
|
6238
6399
|
async function comandoImpacto(entrada, args, emJson, cwd = process.cwd()) {
|
|
6239
6400
|
const alvoSemantico = obterOpcao(args, "--alvo");
|
|
6240
6401
|
if (!alvoSemantico) {
|
|
6241
|
-
console.error("Uso: sema impacto <arquivo-ou-pasta> --alvo <token-
|
|
6402
|
+
console.error("Uso: sema impacto <arquivo-ou-pasta> --alvo <token-semântico> [--mudanca <descricao>] [--escopo <arquivo|modulo|projeto>] [--incluir-worktrees] [--incluir-consumidores-laterais] [--json]");
|
|
6242
6403
|
return 1;
|
|
6243
6404
|
}
|
|
6244
6405
|
const contextoProjeto = await carregarProjeto(entrada, cwd);
|
|
@@ -6770,15 +6931,15 @@ async function comandoPromptCurto(entrada, args, emJson) {
|
|
|
6770
6931
|
: "SEMA_BRIEF.md";
|
|
6771
6932
|
const contextoProjeto = await readFile(path.join(resumoProjeto.pastaSaida, arquivoResumo), "utf8");
|
|
6772
6933
|
const capacidade = tamanho === "micro" ? "pequena" : tamanho === "curto" ? "media" : "grande";
|
|
6773
|
-
const prompt =
|
|
6934
|
+
const prompt = `âš ï¸ REGRA OBRIGATÓRIA DE GOVERNANÇA:
|
|
6774
6935
|
|
|
6775
|
-
ANTES DE QUALQUER
|
|
6776
|
-
1. Chame sema_docs_impacto com sua
|
|
6777
|
-
2. Aguarde a resposta com as docs
|
|
6936
|
+
ANTES DE QUALQUER AÇÃO (editar, criar, deletar, executar, consultar, modificar):
|
|
6937
|
+
1. Chame sema_docs_impacto com sua intenção declarada
|
|
6938
|
+
2. Aguarde a resposta com as docs obrigatórias
|
|
6778
6939
|
3. Leia as docs antes de agir
|
|
6779
6940
|
4. Use sema_finalizar_mudanca para comprovar que leu as docs
|
|
6780
6941
|
|
|
6781
|
-
|
|
6942
|
+
Você está operando Sema em modo IA-first.
|
|
6782
6943
|
|
|
6783
6944
|
Isto e contexto comprimido para IA operar contrato semantico antes de tocar codigo vivo.
|
|
6784
6945
|
|
|
@@ -6786,7 +6947,7 @@ Capacidade alvo: ${capacidade}
|
|
|
6786
6947
|
Modo da tarefa: ${modo}
|
|
6787
6948
|
|
|
6788
6949
|
Regras:
|
|
6789
|
-
- ANTES DE TUDO: chame sema_docs_impacto com sua
|
|
6950
|
+
- ANTES DE TUDO: chame sema_docs_impacto com sua intenção declarada
|
|
6790
6951
|
- comece pelo resumo compacto abaixo
|
|
6791
6952
|
- se a tarefa pedir mais contexto, abra \`AGENT_CONTEXT_PACK.json\` e depois \`SEMA_INDEX.json\`
|
|
6792
6953
|
- nao tente ler o repo inteiro se o resumo ja disser onde tocar
|
|
@@ -7047,6 +7208,21 @@ async function principal() {
|
|
|
7047
7208
|
codigoSaida = 0;
|
|
7048
7209
|
}
|
|
7049
7210
|
break;
|
|
7211
|
+
case "runner":
|
|
7212
|
+
{
|
|
7213
|
+
const subcomando = posicionais[0];
|
|
7214
|
+
if (subcomando === "validar-remoto") {
|
|
7215
|
+
codigoSaida = await comandoRunnerValidacaoRemota(resto, cwd);
|
|
7216
|
+
}
|
|
7217
|
+
else if (subcomando === "servidor") {
|
|
7218
|
+
codigoSaida = await comandoServidorRunnerValidacaoRemota(resto, cwd);
|
|
7219
|
+
}
|
|
7220
|
+
else {
|
|
7221
|
+
console.log(ajudaRunnerValidacaoRemota());
|
|
7222
|
+
codigoSaida = subcomando ? 1 : 0;
|
|
7223
|
+
}
|
|
7224
|
+
}
|
|
7225
|
+
break;
|
|
7050
7226
|
case "validar":
|
|
7051
7227
|
codigoSaida = possuiFlag(resto, "--json")
|
|
7052
7228
|
? await comandoValidarJson(posicionais[0])
|