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, ologoe ofavicondo 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.
indexesarray de stringsobrigatórioUm 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-indexcercado, 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.domainobjectOnde vive o conteúdo de domain: a linguagem do negócio e a semântica do produto.
systemobjectOnde vive o conteúdo de system: a arquitetura e os invariantes que toda mudança respeita.
practiceobjectOnde vive o conteúdo de practice: as convenções e os padrões já comprovados.
governanceobjectOnde vive o conteúdo de governance: as travas de proteção dos agentes e as regras de operação.
decisionsobjectOnde 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.
indexPathstringO caminho até o índice de contexto gerado.
changelogPathstringO caminho até o changelog de contexto legível por máquina.
agentProfilesPathstringO diretório que guarda os documentos de perfil de agente.
decisionRecordsPathstringO 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).
namestringobrigatórioO nome da pessoa.
contactstringComo falar com ela, por exemplo um endereço de e-mail.
primaryobjectobrigatórioA pessoa que responde pela atualidade da camada de contexto. Camadas de contexto sem dono apodrecem.
continuityobjectOpcional. 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.
claimedAtstringA 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 objetosCada 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órioO nome da camada irmã; precisa coincidir com o
nameno manifesto da própria irmã.sourcestringobrigatórioO 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órioO 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.
trackingRefstringUma 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órioO dono da camada irmã. A propriedade continua com a equipe da irmã; a hospedeira nunca absorve o conteúdo dela.
rolestringO 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 stringsRó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 stringsAs 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 viewerlê. É configuração de conveniência, não normativa; a apresentação em si está fora do escopo normativo.portintegerA 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).logostringA 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.
titlestringO 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.
agentsLabelstringO 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.
faviconstringO favicon do visualizador, como um caminho sob a raiz do contexto (por exemplo "assets/icon.svg"). O padrão é o símbolo do Leji.
homepagestringA 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 itensAs 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 stringsA 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.
themeobjectAjustes de tema do visualizador.
primarystringA 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.
linkstringA 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 exportavisam.mermaidbooleanRenderiza os blocos de código ```mermaid cercados como diagramas no visualizador. O padrão é true.
poweredBybooleanMostra o pequeno selo "Powered by Leji" no canto do visualizador. O padrão é true; use false para removê-lo.
categoryEmojisobjectSubstitui 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.