spec 1.0 · referência

O manifesto: leji.json

Tradução assistida por agentes de IA. Em caso de divergência, prevalece a página em inglês. Se você encontrar algum problema no texto, abra uma issue ou envie um pull request.

O ponto de entrada de máquina de uma camada de contexto Leji. Fica na raiz do repositório, com o nome leji.json.

O manifesto é o único nome de arquivo fixo do Leji, portanto é o único arquivo que as ferramentas sempre podem esperar encontrar na raiz do repositório.

As linhas dos campos são geradas a partir do schema, portanto o conteúdo daqui não diverge do contrato. Esta página apresenta os campos de nível superior e alguns campos aninhados; para estruturas mais profundas, como os papéis e comandos de um ator, leia o próprio schema. Os campos obrigatórios estão marcados.

Campos

#lejistringobrigatório

A linha da especificação Leji que esta camada de contexto tem como alvo, por exemplo "1.0". A chave que dá nome a si mesma segue a convenção do OpenAPI e identifica o arquivo como um manifesto Leji.

Padrão ^\d+\.\d+$

#namestringobrigatório

Um identificador curto e estável para esta camada de contexto, por exemplo "acme-billing-context".

#descriptionstring

Resumo em uma linha do que esta camada de contexto cobre.

#rootPathstringobrigatório

A raiz do contexto, um caminho POSIX relativo à raiz do repositório. Ela declara onde a camada de contexto vive; ela não recalcula os caminhos que governa: as entradas do índice, as páginas fixadas, os caminhos dos perfis e todo outro caminho dos artefatos Leji são resolvidos a partir da raiz do repositório. O homepage, o logo e o favicon do visualizador são a exceção: eles são escritos relativos à raiz do contexto, e um caminho relativo à raiz do repositório que fique sob ela também é aceito.

Padrão ^(?!/)(?!\./)(?!.*(^|/)\.\.(/|$))(?!.*\\).*$

#bootProfilePathstringobrigatório

O caminho até o perfil de boot, o ponto de entrada independente de agente por onde toda pessoa e todo host começam.

Padrão ^(?!/)(?!\./)(?!.*(^|/)\.\.(/|$))(?!.*\\).+\.md$

#categoriesobjectobrigatório

O mapeamento de cada categoria lógica para os arquivos de índice dela. As chaves são os cinco identificadores de categoria; cada uma aponta para um ou mais arquivos de índice curados que listam o conteúdo daquela categoria.

Cada chave abaixo tem o mesmo formato:

indexesarray de stringsobrigatório

Um ou mais arquivos de índice desta categoria, com caminhos relativos à raiz do repositório. Cada arquivo de índice é markdown curado que carrega um bloco leji-index cercado, cujas linhas - path: <diretório-ou-arquivo> selecionam o conteúdo que pertence a esta categoria. O conteúdo permanece onde vive; o arquivo de índice apenas declara a inclusão.

domainobject

Onde vive o conteúdo de domain: a linguagem do negócio e a semântica do produto.

systemobject

Onde vive o conteúdo de system: a arquitetura e os invariantes que toda mudança respeita.

practiceobject

Onde vive o conteúdo de practice: as convenções e os padrões já comprovados.

governanceobject

Onde vive o conteúdo de governance: as travas de proteção dos agentes e as regras de operação.

decisionsobject

Onde vivem os registros de decisão: os registros datados de por que as coisas são como são.

#machineobject

Onde ficam os artefatos legíveis por máquina: o índice, o changelog, os perfis e os registros de decisão.

indexPathstring

O caminho até o índice de contexto gerado.

changelogPathstring

O caminho até o changelog de contexto legível por máquina.

agentProfilesPathstring

O diretório que guarda os documentos de perfil de agente.

decisionRecordsPathstring

O diretório que guarda os registros de decisão.

#agentsmapa

A associação entre papel e perfil de agente. As chaves são identificadores de papel (por exemplo "thought-partner", "reviewer"); os valores são caminhos até documentos de perfil de agente. Os protocolos acionam papéis; este mapa decide quem os ocupa.

#actorsmapa

Um registro dos atores que podem ocupar papéis; opcional. As chaves são identificadores de ator estáveis. Um ator declara os papéis para os quais está habilitado e um modelo de comando por papel. Use quando um papel tiver mais de um ator habilitado, ou quando um mesmo ator precisar de uma invocação diferente conforme o papel que estiver ocupando; qualquer um dos dois já é razão suficiente. Um papel cujo único ator precisa de um único comando já é atendido pelo host e pelo invocation do próprio perfil de agente.

#ownersobjectobrigatório

Quem responde pela saúde da camada de contexto. Os donos respondem por mantê-la atual e podada; eles não a escrevem nem fazem a curadoria dela sozinhos (governance.md).

Cada chave abaixo tem o mesmo formato:

namestringobrigatório

O nome da pessoa.

contactstring

Como falar com ela, por exemplo um endereço de e-mail.

primaryobjectobrigatório

A pessoa que responde pela atualidade da camada de contexto. Camadas de contexto sem dono apodrecem.

continuityobject

Opcional. Uma outra pessoa que assume a mesma responsabilidade quando a principal está indisponível ou vai embora; adoções acompanhadas devem nomear alguém antes que a ajuda externa se retire. Nomear a pessoa principal de novo não cria continuidade nenhuma, e um agente não pode ocupar esse lugar: donos são pessoas que respondem.

#conformanceobject

O nível de conformidade que esta camada de contexto declara, verificável por ferramentas.

claimedLevel"core" · "indexed" · "governed" · "federated"

O nível de conformidade declarado: core, indexed, governed ou federated.

claimedAtstring

A data em ISO 8601 em que a declaração foi feita pela última vez.

#federationobject

As camadas irmãs montadas neste repositório (especificação: distribution.md, padrão 3). O círculo compõe a propriedade; não a centraliza.

mountsarray de objetos

Cada mount é uma camada de contexto irmã lida em uma versão fixada, através de uma projeção de camada hidratada pelo resolvedor, e que preserva o próprio repositório, a própria propriedade e o próprio processo de revisão e aprovação. O conteúdo materializado vive no cache do resolvedor, ignorado pelo git, e nunca é commitado aqui.

namestringobrigatório

O nome da camada irmã; precisa coincidir com o name no manifesto da própria irmã.

sourcestringobrigatório

O localizador de repositório normalizado da camada irmã: uma URL remota https://, ssh:// ou no estilo SCP. É a raiz da resolução e o espaço de nomes do pin. Caminhos locais do sistema de arquivos só valem em dicas locais à máquina, nunca aqui.

pinstringobrigatório

O id de commit completo e imutável (SHA-1 ou SHA-256) da revisão da irmã que esta hospedeira lê. É o estado desejado, guardado no manifesto: atualizar um pin é curadoria deliberada e revisada.

trackingRefstring

Uma ref testemunha totalmente qualificada na origem (refs/heads/* ou refs/tags/*) contra a qual o relato de pin desatualizado e a alcançabilidade federada são comparados; opcional. Na ausência dela, o branch padrão anunciado pela origem é usado e registrado na saída do comando.

ownerobjectobrigatório

O dono da camada irmã. A propriedade continua com a equipe da irmã; a hospedeira nunca absorve o conteúdo dela.

rolestring

O que esta camada irmã carrega, em prosa, por exemplo "contexto do lado do produto". É para pessoas; o roteamento usa os campos estruturados abaixo.

categoriesarray de "domain" · "system" · "practice" · "governance" · "decisions"

Os escopos de categoria de conteúdo que esta irmã pode atender. São apenas metadados de roteamento; o conteúdo da irmã continua na irmã. Obrigatório para a conformidade federated.

topicsarray de strings

Rótulos curtos de tópico, visíveis para a hospedeira, usados para rotear uma tarefa até esta irmã, por exemplo "billing", "checkout". São apenas metadados de roteamento.

requiredWhenarray de strings

As condições de tarefa em que quem lê precisa resolver este mount, ou então parar e relatar contexto incompleto se não conseguir (falhar fechado). É visível para a hospedeira; não pode revelar nada que o público da hospedeira não possa ver.

#vendorAdaptersarray de strings

Os arquivos de ponto de entrada de fornecedores presentes neste repositório; cada um precisa redirecionar para o perfil de boot.

#viewerobject

As preferências de apresentação que o leji viewer lê. É configuração de conveniência, não normativa; a apresentação em si está fora do escopo normativo.

portinteger

A porta preferida da pré-visualização local do leji viewer serve. A flag --port tem precedência; o padrão é 5354 (LEJI no teclado do telefone).

logostring

A imagem de logo do visualizador, como um caminho sob a raiz do contexto (por exemplo "assets/logo.svg"). O padrão é o símbolo do Leji.

titlestring

O título exibido pelo visualizador (cabeçalho da barra lateral e título da página). O padrão é o nome da camada de contexto.

agentsLabelstring

O rótulo do grupo de perfis de agente na barra lateral (emoji é bem-vindo). O padrão é "🤖 Agents". O grupo lista os perfis de agente da camada e é ordenado por viewer.groupOrder como qualquer outro grupo.

faviconstring

O favicon do visualizador, como um caminho sob a raiz do contexto (por exemplo "assets/icon.svg"). O padrão é o símbolo do Leji.

homepagestring

A página de entrada do visualizador, como um caminho relativo à raiz do contexto (por exemplo "README.md"). O padrão é o overview.md semeado.

pinsarray de itens

As páginas fixadas no topo da barra lateral: caminhos de markdown relativos à raiz do repositório, ou {path, label} para um rótulo curado. Fixar o perfil de boot substitui a linha padrão dele.

groupOrderarray de strings

A sequência curada dos grupos da barra lateral, pelo rótulo exato de cada grupo (o H1 do arquivo de índice). Os grupos listados vêm primeiro, nesta ordem; os não listados seguem na ordem derivada.

themeobject

Ajustes de tema do visualizador.

primarystring

A cor principal, de destaque, como uma cor CSS em hexadecimal (por exemplo "#009F71"). Ela comanda a moldura do visualizador, os estados ativos e os destaques dos diagramas; os links no corpo do texto e o código em linha usam o tom acessível fixo, a menos que viewer.theme.link ofereça um que passe na verificação de contraste.

linkstring

A cor dos links, como uma cor CSS em hexadecimal (por exemplo "#5A50F9"). Só é aplicada aos links no corpo do texto e ao código em linha quando alcança 4,5:1 sobre o fundo do código em linha, o mais estreito dos dois fundos em que eles pousam; caso contrário o tom acessível fixo permanece e o leji view / leji export avisam.

mermaidboolean

Renderiza os blocos de código ```mermaid cercados como diagramas no visualizador. O padrão é true.

poweredByboolean

Mostra o pequeno selo "Powered by Leji" no canto do visualizador. O padrão é true; use false para removê-lo.

categoryEmojisobject

Substitui os emojis padrão exibidos ao lado de cada categoria no mapa da camada gerado. (Os grupos da barra lateral são rotulados pelo próprio H1 de cada arquivo de índice.)

Um exemplo completo

Este é o exemplo de uma camada de contexto federada, com alcance organizacional, que monta uma irmã e usa muito mais campos do manifesto do que uma camada real precisa. A maioria das camadas de contexto declara apenas o subconjunto que usa: leji init gera um punhado desses campos, e um manifesto core é bem mais curto.

Há dois detalhes do formato que podem gerar confusão: cada categoria aponta para arquivos de índice escritos à mão, não para diretórios de conteúdo; e agents associa identificadores de papel a documentos de perfil. Trata-se de um diretório de papéis, não de uma ordem de carregamento, portanto criar uma associação nunca faz com que o perfil seja lido.

Um dos campos é condicional, não declarativo: viewer.theme.link colore os links do corpo e o código em linha somente quando alcança 4,5:1 contra o fundo do código em linha do visualizador, e um valor que fica abaixo desse limite gera um aviso, enquanto o tom acessível padrão é mantido.

{
  "$schema": "https://leji.org/schemas/v1.0/context-manifest.schema.json",
  "leji": "1.0",
  "name": "acme-context",
  "description": "Organization-wide context layer for Acme: consumed by product repos and composing one sibling layer.",
  "rootPath": "docs/",
  "bootProfilePath": "docs/boot-profile.md",
  "categories": {
    "domain": {
      "indexes": [
        "docs/context/domain.md"
      ]
    },
    "system": {
      "indexes": [
        "docs/context/system.md"
      ]
    },
    "practice": {
      "indexes": [
        "docs/context/practice.md"
      ]
    },
    "governance": {
      "indexes": [
        "docs/context/governance.md"
      ]
    },
    "decisions": {
      "indexes": [
        "docs/context/decisions.md"
      ]
    }
  },
  "machine": {
    "indexPath": "docs/context-index.json",
    "changelogPath": "docs/context-changelog.json",
    "agentProfilesPath": "docs/agents/",
    "decisionRecordsPath": "docs/decisions/"
  },
  "agents": {
    "core": "docs/agents/core.md",
    "reviewer": "docs/agents/reviewer.md"
  },
  "owners": {
    "primary": {
      "name": "Sam Park",
      "contact": "sam@acme.example"
    },
    "continuity": {
      "name": "Ada Okafor",
      "contact": "ada@acme.example"
    }
  },
  "conformance": {
    "claimedLevel": "federated",
    "claimedAt": "2026-06-12"
  },
  "federation": {
    "mounts": [
      {
        "name": "acme-product-context",
        "source": "https://github.com/acme/product-context",
        "pin": "7d3f2a19c4e8b6a0d5f1c2e9b8a7f6d5c4b3a2e1",
        "trackingRef": "refs/heads/main",
        "owner": {
          "name": "Product team",
          "contact": "product@acme.example"
        },
        "role": "product-side context, owned and curated by the product team",
        "categories": [
          "domain",
          "decisions"
        ],
        "topics": [
          "pricing",
          "entitlements",
          "billing plans"
        ],
        "requiredWhen": [
          "a task changes how a plan, price, or entitlement is represented"
        ]
      }
    ]
  },
  "vendorAdapters": [
    "CLAUDE.md",
    "AGENTS.md"
  ],
  "viewer": {
    "port": 5354,
    "title": "Acme Billing",
    "logo": "assets/brand.svg",
    "favicon": "assets/icon.svg",
    "pins": [
      "docs/dashboard.md",
      "docs/TODO.md"
    ],
    "theme": {
      "primary": "#009F71",
      "link": "#007D59"
    }
  }
}

Veja a superfície legível por máquina para saber como o manifesto se relaciona com o índice, o changelog e os perfis, e versionamento para a chave leji da linha da especificação.