@semacode/cli 3.9.4 → 3.11.0

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 CHANGED
@@ -29,9 +29,15 @@ install or update because existing tasks do not reload their skill catalog.
29
29
 
30
30
  ```bash
31
31
  sema --version
32
+ sema sessao "describe the change" --json
32
33
  sema resumo . --curto --drift none
33
34
  ```
34
35
 
36
+ `sema sessao` opens a governed session with one compact envelope: workspace
37
+ identity and contract hash, artifact freshness with the exact recovery command
38
+ when stale, the blocking and recommended docs for the declared intent, the four
39
+ gate commands, and concrete next steps.
40
+
35
41
  Public Sema is local-only. The CLI runs directly without a Sema login, user
36
42
  authorization, product-license check, activation key, token, credits, billing
37
43
  service, control panel, or external service credentials. The license governs
@@ -123,6 +129,7 @@ On Windows, PowerShell resolves `sema.ps1` from `PATH`, `cmd.exe` resolves
123
129
  ## Local Workflow
124
130
 
125
131
  ```bash
132
+ sema sessao "describe the change" --json
126
133
  sema docs-impacto --intencao "describe the change" --arquivo contratos/app.sema --json
127
134
  sema inspecionar contratos/app.sema --drift none --json
128
135
  sema drift contratos/app.sema --escopo modulo --cache fresh --json
@@ -147,7 +147,7 @@ Você está em um projeto governado por Sema. O contrato semântico vem antes de
147
147
  ## Primeira ação
148
148
 
149
149
  1. Confirme \`AGENTS.md\` na raiz e rode \`sema --version\`. Se o shell não localizar o comando, use \`$HOME/.sema/bin/sema\` no macOS/Linux; no Windows, PowerShell usa \`sema.ps1\` no PATH, cmd.exe usa \`sema.cmd\`, e o fallback absoluto é \`& "$env:SystemRoot\\System32\\WindowsPowerShell\\v1.0\\powershell.exe" -NoLogo -NoProfile -NonInteractive -ExecutionPolicy Bypass -File "$HOME\\.sema\\bin\\sema-managed.ps1" --version\`. Só então declare a CLI indisponível.
150
- 2. Use a CLI local diretamente para ler o workspace: \`sema resumo --drift none\`, \`sema docs-impacto\`, \`sema inspecionar --drift none\`, \`sema drift --cache fresh\` e \`sema impacto\`. Na 3.0.0, \`sema --version\` continua texto SemVer exato; com \`--json\`, help e falhas de controle usam \`sema.cli.control/v1\`, enquanto comandos sintaticamente válidos usam o envelope exato de oito campos \`sema.cli.result/v1\`, com o resultado aninhado em \`payload\` e \`ok\` separado do veredito de domínio desse payload.
150
+ 2. Use a CLI local diretamente para ler o workspace: \`sema sessao "<intencao>" --json\` na abertura (identidade, frescor, docs bloqueantes e gates em um envelope), depois \`sema resumo --drift none\`, \`sema docs-impacto\`, \`sema inspecionar --drift none\`, \`sema drift --cache fresh\` e \`sema impacto\`. Na 3.0.0, \`sema --version\` continua texto SemVer exato; com \`--json\`, help e falhas de controle usam \`sema.cli.control/v1\`, enquanto comandos sintaticamente válidos usam o envelope exato de oito campos \`sema.cli.result/v1\`, com o resultado aninhado em \`payload\` e \`ok\` separado do veredito de domínio desse payload.
151
151
  3. Se não estiver claro qual profile, workflow, pipeline, gerador ou adapter usar, rode \`sema descobrir recomendar --intencao "<objetivo>" --json\`; não execute automaticamente uma recomendação ambígua.
152
152
  4. Não use fonte externa de workspace para substituir a CLI local quando ela estiver operacional.
153
153
  5. Este boot é para workspace local em disco; se não houver workspace local, pare bloqueado em vez de inventar caminho.
@@ -442,16 +442,17 @@ Este workspace é governado por Sema. Antes de qualquer ação em código, contr
442
442
 
443
443
  1. Leia \`${ARQUIVO_SEMA_BOOT}\`.
444
444
  2. Rode \`sema --version\`; se o shell falhar, use \`$HOME/.sema/bin/sema\` no macOS/Linux. No Windows, PowerShell usa \`sema.ps1\` no PATH e cmd.exe usa \`sema.cmd\`; use \`& "$env:SystemRoot\\System32\\WindowsPowerShell\\v1.0\\powershell.exe" -NoLogo -NoProfile -NonInteractive -ExecutionPolicy Bypass -File "$HOME\\.sema\\bin\\sema-managed.ps1" --version\` como fallback absoluto. Só então pare e peça instalação ou reparo.
445
- 3. Use diretamente a CLI local: \`sema resumo --drift none\`, \`sema docs-impacto\`, \`sema inspecionar --drift none\`, \`sema drift --cache fresh\` e \`sema impacto\`. Na 3.0.0, \`sema --version\` continua texto SemVer exato; com \`--json\`, help e falhas de controle usam \`sema.cli.control/v1\`, enquanto comandos sintaticamente válidos usam o envelope exato de oito campos \`sema.cli.result/v1\`, com resultado em \`payload\` e \`ok\` distinto do veredito de domínio do payload.
446
- 4. Quando a capacidade correta não estiver clara, use \`sema descobrir recomendar --intencao "<objetivo>" --json\`; não autoexecute resultado ambíguo.
447
- 5. Não use fonte externa de workspace para substituir a CLI local quando ela estiver operacional.
448
- 6. Chame docs-impacto com a intenção declarada antes de agir.
449
- 7. Chame inspecionar no contrato \`.sema\` aplicável.
450
- 8. Para módulo novo com contrato validado, gere o andaime com \`sema compilar <contrato> --alvo <alvoPadrao>\`, preencha a implementação real mantendo \`impl\`/\`vinculos\` e feche com \`sema verificar\`.
451
- 9. Antes de editar código existente, rode \`sema drift --cache fresh\` e impacto.
452
- 10. Antes de criar ou editar \`.sema\`, use exemplos oficiais.
453
- 11. Ao concluir mudança de contrato, rode validar.
454
- 12. Antes de finalizar, use finalizar-mudanca com as docs lidas.
445
+ 3. Abra a sessão com \`sema sessao "<intencao>" --json\`: devolve identidade do workspace, hash dos contratos, frescor dos artefatos gerados, docs bloqueantes da intenção e os gates do ciclo. Se \`frescor.fresco\` for falso, rode o \`sync-codex\` sugerido antes de agir.
446
+ 4. Use diretamente a CLI local: \`sema resumo --drift none\`, \`sema docs-impacto\`, \`sema inspecionar --drift none\`, \`sema drift --cache fresh\` e \`sema impacto\`. Na 3.0.0, \`sema --version\` continua texto SemVer exato; com \`--json\`, help e falhas de controle usam \`sema.cli.control/v1\`, enquanto comandos sintaticamente válidos usam o envelope exato de oito campos \`sema.cli.result/v1\`, com resultado em \`payload\` e \`ok\` distinto do veredito de domínio do payload.
447
+ 5. Quando a capacidade correta não estiver clara, use \`sema descobrir recomendar --intencao "<objetivo>" --json\`; não autoexecute resultado ambíguo.
448
+ 6. Não use fonte externa de workspace para substituir a CLI local quando ela estiver operacional.
449
+ 7. Chame docs-impacto com a intenção declarada antes de agir.
450
+ 8. Chame inspecionar no contrato \`.sema\` aplicável.
451
+ 9. Para módulo novo com contrato validado, gere o andaime com \`sema compilar <contrato> --alvo <alvoPadrao>\`, preencha a implementação real mantendo \`impl\`/\`vinculos\` e feche com \`sema verificar\`.
452
+ 10. Antes de editar código existente, rode \`sema drift --cache fresh\` e impacto.
453
+ 11. Antes de criar ou editar \`.sema\`, use exemplos oficiais.
454
+ 12. Ao concluir mudança de contrato, rode validar.
455
+ 13. Antes de finalizar, use finalizar-mudanca com as docs lidas.
455
456
 
456
457
  É proibido substituir esse fluxo por leitura manual de \`AGENTS.md\`, \`README.md\`, busca local por arquivos, inferência pelo nome do projeto, bom senso ou ferramenta não citada nesta lista.
457
458
 
@@ -10,7 +10,7 @@ const COMANDOS_PUBLICOS = new Set([
10
10
  "impacto", "importar", "iniciar", "init", "inspecionar", "instalar-exemplos",
11
11
  "interativo", "ir", "pipeline", "profile", "prompt-curto", "prompt-ia",
12
12
  "prompt-ia-react", "prompt-ia-sema-primeiro", "prompt-ia-ui", "renomear-semantico",
13
- "resumo", "rule-packs", "skill", "starter-ia", "sync", "sync-codex", "testar",
13
+ "resumo", "rule-packs", "sessao", "skill", "starter-ia", "sync", "sync-codex", "testar",
14
14
  "validar", "verificar", "ast",
15
15
  ]);
16
16
  const TEMPLATES_INICIAR = new Set([
@@ -451,6 +451,7 @@ function validarComandoBasico(comando, args) {
451
451
  return Boolean(alvo && ALVOS_GERACAO.has(alvo)) && (!estrutura || ESTRUTURAS.has(estrutura)) && (!framework || FRAMEWORKS.has(framework));
452
452
  }
453
453
  case "verificar": return parsearArgumentos(args, { opcoes: ["--saida", "--alvo"], flags: ["--sem-cache"], maxPosicionais: 1 }) !== null;
454
+ case "sessao": return parsearArgumentos(args, { flags: ["--json"], maxPosicionais: 2 }) !== null;
454
455
  case "formatar": return parsearArgumentos(args, { flags: ["--check"], maxPosicionais: 1 }) !== null;
455
456
  case "inspecionar": {
456
457
  const parsed = parsearArgumentos(args, { opcoes: ["--drift", "--cache"], flags: ["--com-drift"], maxPosicionais: 1 });
@@ -143,6 +143,7 @@ export function criarAjudaRaiz(versao) {
143
143
  "sema contexto-ia <arquivo.sema> [--saida <diretorio>] [--json]",
144
144
  "sema sync-codex [--json]",
145
145
  "sema instalar-exemplos [--json]",
146
+ "sema sessao [intencao] [entrada] [--json]",
146
147
  "sema docs-impacto --intencao <acao> [--arquivo <caminho>] [--criar-ausentes] [--completo] [--json]",
147
148
  "sema finalizar-mudanca --intencao <acao> [--arquivo <caminho>] [--doc-lida <caminho>] [--json]",
148
149
  "sema author briefing <arquivo.sema> [--json]",
@@ -0,0 +1,34 @@
1
+ export interface SessaoEnvelope {
2
+ comando: "sessao";
3
+ sucesso: boolean;
4
+ workspace: {
5
+ baseProjeto: string;
6
+ nomePasta: string;
7
+ hashContratos: string;
8
+ cliVersao: string;
9
+ };
10
+ frescor: {
11
+ fresco: boolean;
12
+ hashArtefato: string | null;
13
+ hashAtual: string;
14
+ sugestao: string;
15
+ };
16
+ contratos: {
17
+ total: number;
18
+ modulos: string[];
19
+ };
20
+ intencoes: {
21
+ intencao: string;
22
+ categorias: string[];
23
+ docsBloqueantes: string[];
24
+ docsRecomendadas: string[];
25
+ };
26
+ gates: {
27
+ drift: string;
28
+ validar: string;
29
+ verificar: string;
30
+ finalizar: string;
31
+ };
32
+ proximosPassos: string[];
33
+ }
34
+ export declare function comandoSessao(posicionais: string[], args: string[], emJson: boolean, cwd?: string): Promise<number>;
@@ -0,0 +1,86 @@
1
+ // SEMA-GOVERNED: sema.produto.cli_sessao
2
+ // Descricao: comando sessao devolve envelope compacto de abertura governada.
3
+ import path from "node:path";
4
+ import { verificarFrescorArtefatos } from "./index.part04.js";
5
+ import { carregarProjeto } from "./projetoCarregar.js";
6
+ import { resolverDocumentacaoObrigatoria } from "./docs.js";
7
+ export async function comandoSessao(posicionais, args, emJson, cwd = process.cwd()) {
8
+ const intencao = posicionais[0] ?? args.find((arg) => arg.startsWith("--intencao="))?.split("=")[1] ?? "";
9
+ const entrada = posicionais[1];
10
+ const baseProjeto = entrada ? path.resolve(cwd, entrada) : cwd;
11
+ const contextoProjeto = await carregarProjeto(entrada, cwd, {
12
+ escopo: "projeto",
13
+ adiarDescobertaCodigo: true,
14
+ });
15
+ const pacoteCli = (await import("../package.json", { with: { type: "json" } })).default;
16
+ const frescor = await verificarFrescorArtefatos(contextoProjeto.baseProjeto);
17
+ const modulosNomes = contextoProjeto.modulosSelecionados.map((item) => item.resultado.modulo?.nome ?? path.basename(item.caminho, ".sema"));
18
+ let categorias = [];
19
+ let docsBloqueantes = [];
20
+ let docsRecomendadas = [];
21
+ if (intencao.trim()) {
22
+ const impacto = await resolverDocumentacaoObrigatoria({
23
+ baseProjeto: contextoProjeto.baseProjeto,
24
+ intencao,
25
+ arquivosAlvo: [],
26
+ criarAusentes: false,
27
+ });
28
+ categorias = impacto.categorias;
29
+ docsBloqueantes = impacto.leituraObrigatoria
30
+ .filter((doc) => doc.obrigatoriedade !== "recomendada" && doc.existe)
31
+ .map((doc) => doc.relativo);
32
+ docsRecomendadas = impacto.leituraRecomendada.map((doc) => doc.relativo);
33
+ }
34
+ const envelope = {
35
+ comando: "sessao",
36
+ sucesso: true,
37
+ workspace: {
38
+ baseProjeto: contextoProjeto.baseProjeto,
39
+ nomePasta: path.basename(contextoProjeto.baseProjeto),
40
+ hashContratos: frescor.hashAtual,
41
+ cliVersao: pacoteCli.version,
42
+ },
43
+ frescor,
44
+ contratos: {
45
+ total: contextoProjeto.modulosSelecionados.length,
46
+ modulos: modulosNomes.slice(0, 10),
47
+ },
48
+ intencoes: {
49
+ intencao,
50
+ categorias,
51
+ docsBloqueantes,
52
+ docsRecomendadas,
53
+ },
54
+ gates: {
55
+ drift: "sema drift . --escopo projeto --cache fresh --json",
56
+ validar: "sema validar contratos --json",
57
+ verificar: "sema verificar contratos --alvo typescript --json",
58
+ finalizar: 'sema finalizar-mudanca --intencao "<intencao>" --doc-lida <doc> --json',
59
+ },
60
+ proximosPassos: [
61
+ ...(!frescor.fresco ? ["Artefatos stale detectados — rode sema sync-codex --json antes de agir"] : []),
62
+ ...(docsBloqueantes.length > 0 ? [`Leia antes de agir: ${docsBloqueantes.slice(0, 5).join(", ")}`] : []),
63
+ ...(intencao.trim() ? ["Siga o protocolo AGENTS.md passo a passo"] : ["Declare --intencao para receber gates especificos"]),
64
+ ],
65
+ };
66
+ if (emJson) {
67
+ console.log(JSON.stringify(envelope, null, 2));
68
+ return 0;
69
+ }
70
+ console.log(`Sessao Sema — ${envelope.workspace.nomePasta}`);
71
+ console.log(` Hash contratos: ${envelope.workspace.hashContratos}`);
72
+ console.log(` CLI: ${envelope.workspace.cliVersao}`);
73
+ console.log(` Frescor: ${frescor.fresco ? "fresco" : "STALE"} ${!frescor.fresco ? `(${frescor.sugestao})` : ""}`);
74
+ console.log(` Contratos: ${envelope.contratos.total}`);
75
+ if (intencao) {
76
+ console.log(` Intencao: ${intencao}`);
77
+ console.log(` Categorias: ${categorias.join(", ")}`);
78
+ console.log(` Docs bloqueantes: ${docsBloqueantes.length}`);
79
+ console.log(` Docs recomendadas: ${docsRecomendadas.length}`);
80
+ }
81
+ for (const passo of envelope.proximosPassos) {
82
+ console.log(` → ${passo}`);
83
+ }
84
+ return 0;
85
+ }
86
+ //# sourceMappingURL=comandoSessao.js.map
@@ -4,7 +4,7 @@ import { type GuiaCapacidadeIaMap } from './agentContextTipos.js';
4
4
  import { renderizarCaixaAscii, renderizarSecaoAscii } from './cliHelpTexto.js';
5
5
  import { criarBriefingAgente, criarBriefingAgenteContratos, resumirDriftPorModulo } from "./index.part03.js";
6
6
  import { type ComandoConsultaDrift, type ModoCacheDrift, type ResolucaoModoCacheDrift } from "./driftCacheModes.js";
7
- export type Comando = "iniciar" | "init" | "dev" | "sync" | "author" | "profile" | "conteudo" | "interativo" | "descobrir" | "pipeline" | "capabilities" | "validar" | "ast" | "ir" | "compilar" | "gerar" | "testar" | "diagnosticos" | "verificar" | "inspecionar" | "drift" | "impacto" | "renomear-semantico" | "importar" | "doctor" | "formatar" | "ajuda-ia" | "starter-ia" | "sync-codex" | "skill" | "instalar-exemplos" | "rule-packs" | "docs-impacto" | "finalizar-mudanca" | "resumo" | "prompt-curto" | "prompt-ia" | "prompt-ia-ui" | "prompt-ia-react" | "prompt-ia-sema-primeiro" | "exemplos-prompt-ia" | "contexto-ia";
7
+ export type Comando = "iniciar" | "init" | "dev" | "sync" | "author" | "profile" | "conteudo" | "interativo" | "descobrir" | "pipeline" | "capabilities" | "validar" | "ast" | "ir" | "compilar" | "gerar" | "testar" | "diagnosticos" | "verificar" | "inspecionar" | "drift" | "impacto" | "renomear-semantico" | "importar" | "doctor" | "formatar" | "ajuda-ia" | "starter-ia" | "sync-codex" | "skill" | "instalar-exemplos" | "rule-packs" | "docs-impacto" | "finalizar-mudanca" | "resumo" | "sessao" | "prompt-curto" | "prompt-ia" | "prompt-ia-ui" | "prompt-ia-react" | "prompt-ia-sema-primeiro" | "exemplos-prompt-ia" | "contexto-ia";
8
8
  export interface ResultadoFormatacaoArquivo {
9
9
  caminho: string;
10
10
  alterado: boolean;
@@ -2,6 +2,13 @@ import { type GuiaCapacidadeIaMap } from './agentContextTipos.js';
2
2
  import { ContextoIaGerado, ResumoSemanticoModuloIa, type ResultadoDriftIa } from "./index.part01.js";
3
3
  import type { ResolucaoModoCacheDrift } from "./driftCacheModes.js";
4
4
  export declare const ARQUIVOS_RESUMO_PROJETO_IA: readonly ["SEMA_BOOT.md", "SEMA_SMALL_MODEL.md", "SEMA_BRIEF.md", "SEMA_BRIEF.micro.txt", "SEMA_BRIEF.curto.txt", "SEMA_INDEX.json", "AGENT_CONTEXT_PACK.json", "docs/ai-integration.md"];
5
+ export declare function verificarFrescorArtefatos(baseProjeto: string): Promise<{
6
+ fresco: boolean;
7
+ hashArtefato: string | null;
8
+ hashAtual: string;
9
+ contratosMudaram: boolean;
10
+ sugestao: string;
11
+ }>;
5
12
  export declare function gerarResumoProjetoIa(entrada: string | undefined, pastaSaidaOpcional?: string, escreverNaRaiz?: boolean, analiseDrift?: ResolucaoModoCacheDrift): Promise<{
6
13
  geradoEm: string;
7
14
  baseProjeto: string;
@@ -1,6 +1,7 @@
1
1
  // SEMA-GOVERNED: sema.governanca_ia_contexto, sema.produto.escrita_segura_workspace, sema.produto.governanca_ia.drift.cache.modos
2
2
  // Descrição: gera contexto local e grava artefatos somente dentro da base validada.
3
- import { mkdir } from "node:fs/promises";
3
+ import { mkdir, readFile } from "node:fs/promises";
4
+ import { createHash } from "node:crypto";
4
5
  import path from "node:path";
5
6
  import { formatarDiagnosticos, gerarRespostaValidacao, temErros, } from "@sema/nucleo";
6
7
  import { carregarProjeto, } from "./projeto.js";
@@ -53,6 +54,43 @@ function escolherTopArquivosResumo(modulos, arquivosCodigoDetectados) {
53
54
  }
54
55
  return { arquivos: [], fonte: "nenhum" };
55
56
  }
57
+ async function calcularHashContratos(caminhosContratos, baseProjeto) {
58
+ const hash = createHash("sha256");
59
+ const base = baseProjeto ?? (caminhosContratos[0] ? path.dirname(caminhosContratos[0]) : process.cwd());
60
+ const ordenados = [...caminhosContratos].sort();
61
+ for (const caminho of ordenados) {
62
+ const conteudo = await readFile(caminho, "utf8").catch(() => "");
63
+ const relativo = path.relative(base, caminho).replace(/[\\/]/g, "/");
64
+ hash.update(relativo);
65
+ hash.update(":");
66
+ hash.update(conteudo);
67
+ hash.update(String.fromCharCode(0));
68
+ }
69
+ return hash.digest("hex").slice(0, 16);
70
+ }
71
+ export async function verificarFrescorArtefatos(baseProjeto) {
72
+ const caminhoIndex = path.join(baseProjeto, "SEMA_INDEX.json");
73
+ let hashArtefato = null;
74
+ try {
75
+ const index = JSON.parse(await readFile(caminhoIndex, "utf8"));
76
+ hashArtefato = index.hashContratos ?? null;
77
+ }
78
+ catch {
79
+ hashArtefato = null;
80
+ }
81
+ const origens = await (await import("./projetoOrigens.js")).resolverOrigensProjeto(baseProjeto, baseProjeto, undefined);
82
+ const { listarArquivosDeOrigens } = await import("./projetoOrigens.js");
83
+ const contratos = await listarArquivosDeOrigens(origens);
84
+ const hashAtual = await calcularHashContratos(contratos, baseProjeto);
85
+ const fresco = hashArtefato === hashAtual;
86
+ return {
87
+ fresco,
88
+ hashArtefato,
89
+ hashAtual,
90
+ contratosMudaram: !fresco,
91
+ sugestao: fresco ? "" : "Artefatos de contexto estao desatualizados; rode sema sync-codex --json para regenerar.",
92
+ };
93
+ }
56
94
  export async function gerarResumoProjetoIa(entrada, pastaSaidaOpcional, escreverNaRaiz = false, analiseDrift = { modo: "none", executar: false, avisos: [] }) {
57
95
  const contextoProjeto = await carregarProjeto(entrada, process.cwd(), {
58
96
  escopo: "projeto",
@@ -121,10 +159,13 @@ export async function gerarResumoProjetoIa(entrada, pastaSaidaOpcional, escrever
121
159
  const semaBoot = renderizarSemaBoot(agentContextPack);
122
160
  const semaSmallModel = renderizarSemaSmallModel(agentContextPack);
123
161
  const docAgentesCapacidade = renderizarDocumentoAgentesPorCapacidade(agentContextPack);
162
+ const caminhosContratos = contextoProjeto.modulosSelecionados.map((item) => item.caminho);
163
+ const hashContratos = await calcularHashContratos(caminhosContratos, contextoProjeto.baseProjeto);
124
164
  const indexJson = {
125
165
  comando: "resumo-projeto",
126
166
  geradoEm,
127
167
  cliVersao: VERSAO_CLI,
168
+ hashContratos,
128
169
  baseProjeto,
129
170
  modoVerificacaoCodigo,
130
171
  analiseDrift: {
@@ -36,6 +36,11 @@ export async function principal() {
36
36
  case "iniciar":
37
37
  codigoSaida = await comandoIniciar(cwd, normalizarTemplateIniciar(obterOpcao(resto, "--template")), { force: possuiFlag(resto, "--force"), exemplosCompletos: possuiFlag(resto, "--com-exemplos") });
38
38
  break;
39
+ case "sessao": {
40
+ const { comandoSessao } = await import("./comandoSessao.js");
41
+ codigoSaida = await comandoSessao(posicionais, resto, possuiFlag(resto, "--json"), cwd);
42
+ break;
43
+ }
39
44
  case "author":
40
45
  codigoSaida = await comandoAuthor(posicionais, resto, possuiFlag(resto, "--json"));
41
46
  break;
package/docs/cli.md CHANGED
@@ -148,6 +148,7 @@ code, contracts, workflows, release scripts, or operational docs:
148
148
 
149
149
  ```bash
150
150
  sema --version
151
+ sema sessao "describe the change" --json
151
152
  sema resumo --drift none
152
153
  sema docs-impacto --intencao "describe the change" --json
153
154
  sema inspecionar contratos/example.sema --drift none --json
@@ -162,6 +163,7 @@ gate.
162
163
 
163
164
  ## Core Commands
164
165
 
166
+ - `sema sessao`: open a governed session; one envelope with workspace identity, artifact freshness, intent-specific blocking docs, gates, and next steps.
165
167
  - `sema iniciar`: create a governed starting point.
166
168
  - `sema validar`: validate `.sema` contracts.
167
169
  - `sema inspecionar`: inspect the applicable contract surface; add `--drift cache|fresh` to request code evidence.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@semacode/cli",
3
- "version": "3.9.4",
3
+ "version": "3.11.0",
4
4
  "description": "Local-first semantic governance CLI for AI agents, proven with Claude, Codex, zCode (GLM) and Kimi: contracts, drift, impact, docs gates, and code generation.",
5
5
  "type": "module",
6
6
  "icon": "logo.png",