spec 1.0 · referencia
El manifiesto: leji.json
Traducción asistida por agentes de IA. Ante cualquier diferencia, prevalece la página en inglés. Si encuentra algún problema en el texto, abra un issue o envíe un pull request.
El punto de entrada para máquinas de una capa de contexto Leji. Vive en la raíz del repositorio con el nombre leji.json.
El manifiesto es el único nombre de archivo fijo de Leji: el único archivo que el utillaje siempre puede esperar en la raíz del repositorio.
Las filas de campos se generan a partir del esquema, por lo que el contenido siempre coincide con el contrato. Esta página cubre los campos de primer nivel y algunos anidados; para formas más profundas, como los roles y los comandos de un actor, lea el esquema mismo. Los campos obligatorios están marcados.
Campos
- #
lejistringobligatorio La línea de especificación de Leji a la que apunta esta capa de contexto, por ejemplo "1.0". La clave autonombrada sigue la convención de OpenAPI e identifica el archivo como un manifiesto Leji.
Patrón
^\d+\.\d+$- #
namestringobligatorio Un identificador corto y estable para esta capa de contexto, por ejemplo "acme-billing-context".
- #
descriptionstring Resumen en una línea de lo que abarca esta capa de contexto.
- #
rootPathstringobligatorio La raíz del contexto, como ruta POSIX relativa a la raíz del repositorio. Declara dónde vive la capa de contexto; no recalcula las rutas que gobierna: las entradas del índice, las páginas fijadas, las rutas de los perfiles y toda otra ruta de los artefactos Leji se resuelven desde la raíz del repositorio. El
homepage, ellogoy elfavicondel visor son la excepción: se escriben relativos a la raíz del contexto, y también se acepta una ruta relativa a la raíz del repositorio que quede bajo ella.Patrón
^(?!/)(?!\./)(?!.*(^|/)\.\.(/|$))(?!.*\\).*$- #
bootProfilePathstringobligatorio Ruta al perfil de arranque, el punto de entrada independiente del agente por el que empiezan todos los hosts y todas las personas.
Patrón
^(?!/)(?!\./)(?!.*(^|/)\.\.(/|$))(?!.*\\).+\.md$- #
categoriesobjectobligatorio Correspondencia entre categoría lógica y archivo de índice. Las claves son los cinco identificadores de categoría, y cada una apunta a uno o más archivos de índice curados que enumeran el contenido de esa categoría.
indexesarray de cadenasobligatorioUno o más archivos de índice para esta categoría, con rutas relativas a la raíz del repositorio. Cada archivo de índice es markdown curado que lleva un bloque
leji-indexdelimitado cuyas líneas- path: <directorio-o-archivo>seleccionan el contenido que pertenece a esta categoría. El contenido se queda donde vive; el archivo de índice solo declara su inclusión.domainobjectDónde vive el contenido de domain: el lenguaje del negocio y la semántica del producto.
systemobjectDónde vive el contenido de system: la arquitectura y los invariantes que todo cambio respeta.
practiceobjectDónde vive el contenido de practice: las convenciones y los patrones probados.
governanceobjectDónde vive el contenido de governance: las salvaguardas de agentes y las reglas operativas.
decisionsobjectDónde viven los registros de decisión: registros fechados de por qué las cosas son como son.
- #
machineobject Ubicación de los artefactos legibles por máquinas: el índice, el registro de cambios, los perfiles y los registros de decisión.
indexPathstringRuta al índice del contexto generado.
changelogPathstringRuta al registro de cambios del contexto legible por máquinas.
agentProfilesPathstringDirectorio que contiene los documentos de perfil de agente.
decisionRecordsPathstringDirectorio que contiene los registros de decisión.
- #
agentsmapa Vinculación entre rol y perfil de agente. Las claves son identificadores de rol (por ejemplo "thought-partner" o "reviewer") y los valores son rutas a documentos de perfil de agente. Los protocolos convocan roles; este mapa decide quién los ocupa.
- #
actorsmapa Registro opcional de los actores que pueden ocupar roles. Las claves son identificadores de actor estables. Cada actor declara los roles para los que es elegible y una plantilla de comando por rol. Úselo cuando un rol tenga más de un actor elegible, o cuando un mismo actor necesite una invocación distinta según el rol que ocupe; cualquiera de las dos razones basta por sí sola. Un rol con un único actor que solo necesita un comando ya queda servido por el host y la invocation del propio perfil de agente.
- #
ownersobjectobligatorio Quién responde por la salud de la capa de contexto. Los responsables responden de que la capa de contexto siga vigente y podada; no la escriben ni la curan en solitario (governance.md).
namestringobligatorioEl nombre de la persona.
contactstringCómo ponerse en contacto con ella, por ejemplo una dirección de correo electrónico.
primaryobjectobligatorioLa persona que responde de la actualidad de la capa de contexto. Las capas de contexto sin responsable se pudren.
continuityobjectOpcional. Otra persona que asume esa misma responsabilidad cuando la principal no está disponible o se aparta; las adopciones asistidas deberían nombrar a alguien antes de que la ayuda externa se retire. Volver a nombrar a la persona principal no aporta continuidad alguna, y un agente no puede ocupar el puesto: los responsables son personas que responden.
- #
conformanceobject El nivel de conformidad que declara esta capa de contexto, comprobable por el utillaje.
claimedLevel"core" · "indexed" · "governed" · "federated"El nivel de conformidad declarado: core, indexed, governed o federated.
claimedAtstringFecha ISO 8601 en que se afirmó la declaración por última vez.
- #
federationobject Las capas hermanas montadas en este repositorio (especificación: distribution.md, patrón 3). El círculo compone las responsabilidades; no las centraliza.
mountsarray de objetosCada montaje es una capa de contexto hermana que se lee en una versión fijada a través de una proyección de la capa hidratada por el resolutor, y que conserva su propio repositorio, sus responsables y su proceso de revisión y aprobación. El contenido materializado vive en la caché del resolutor, ignorada por git, y nunca se confirma aquí.
namestringobligatorioEl nombre de la capa hermana; debe coincidir con el
namede su propio manifiesto.sourcestringobligatorioLocalizador de repositorio normalizado de la capa hermana: una URL remota https://, ssh:// o de estilo SCP. Es la raíz de resolución y el espacio de nombres de la fijación. Las rutas del sistema de archivos local solo son válidas en las indicaciones locales de la máquina, nunca aquí.
pinstringobligatorioId de commit completo e inmutable (SHA-1 o SHA-256) de la revisión de la hermana que lee esta anfitriona. Es el estado deseado que guarda el manifiesto: actualizar una fijación es una curación deliberada y revisada.
trackingRefstringReferencia testigo completamente cualificada en el origen (refs/heads/* o refs/tags/*) contra la que se comparan el informe de fijaciones desactualizadas y la alcanzabilidad en la federación; opcional. Si falta, se usa la rama por defecto que anuncia el origen y queda recogida en la salida del comando.
ownerobjectobligatorioEl responsable de la capa hermana. La responsabilidad se queda en el equipo de la hermana; la anfitriona nunca absorbe su contenido.
rolestringQué lleva esta capa hermana, en prosa, por ejemplo "contexto del lado del producto". Es para personas; el enrutamiento usa los campos estructurados de más abajo.
categoriesarray de "domain" · "system" · "practice" · "governance" · "decisions"Los ámbitos de categoría de contenido sobre los que esta hermana puede responder. Son únicamente metadatos de enrutamiento; el contenido de la hermana se queda en la hermana. Obligatorio para la conformidad federated.
topicsarray de cadenasEtiquetas de tema breves, visibles para la anfitriona, que sirven para enrutar una tarea hacia esta hermana, por ejemplo "billing" o "checkout". Son únicamente metadatos de enrutamiento.
requiredWhenarray de cadenasCondiciones de tarea en las que un lector debe resolver este montaje o, si no puede, detenerse e informar de contexto incompleto (fallo en cerrado). Es visible para la anfitriona; no debe revelar nada que la audiencia de la anfitriona no pueda ver.
- #
vendorAdaptersarray de cadenas Los archivos de punto de entrada de proveedor presentes en este repositorio; cada uno debe redirigir al perfil de arranque.
- #
viewerobject Preferencias de presentación que lee
leji viewer. Es configuración de conveniencia, no normativa; la presentación misma queda fuera del alcance normativo.portintegerPuerto preferido para la vista previa local de
leji viewer serve. La opción --port lo sobrescribe; el valor por defecto es 5354 (LEJI en el teclado de un teléfono).logostringImagen de logotipo para el visor, como una ruta bajo la raíz del contexto (por ejemplo "assets/logo.svg"). Por defecto, la marca de Leji.
titlestringTítulo que muestra el visor (encabezado de la barra lateral y título de la página). Por defecto, el nombre de la capa de contexto.
agentsLabelstringEtiqueta de la barra lateral para el grupo de perfiles de agente (los emojis son bienvenidos). Por defecto, "🤖 Agents". El grupo enumera los perfiles de agente de la capa y se ordena mediante viewer.groupOrder como cualquier otro grupo.
faviconstringFavicon para el visor, como una ruta bajo la raíz del contexto (por ejemplo "assets/icon.svg"). Por defecto, la marca de Leji.
homepagestringLa página de inicio del visor, como una ruta relativa a la raíz del contexto (por ejemplo "README.md"). Por defecto, el overview.md sembrado.
pinsarray de elementosPáginas fijadas en lo alto de la barra lateral: rutas markdown relativas a la raíz del repositorio, o {path, label} si quiere una etiqueta propia. Fijar el perfil de arranque sustituye su línea por defecto.
groupOrderarray de cadenasSecuencia curada de los grupos de la barra lateral, por su etiqueta exacta (el H1 del archivo de índice). Los grupos enumerados van primero en este orden; los que no se enumeran siguen en el orden derivado.
themeobjectSobrescrituras del tema del visor.
primarystringColor principal o de acento, como color CSS hexadecimal (por ejemplo "#009F71"). Gobierna el marco del visor, los estados activos y los acentos de los diagramas; los enlaces del cuerpo y el código en línea usan el tono accesible fijo, salvo que viewer.theme.link aporte uno que supere la comprobación de contraste.
linkstringColor de los enlaces, como color CSS hexadecimal (por ejemplo "#5A50F9"). Se aplica a los enlaces del cuerpo y al código en línea solo cuando alcanza un 4,5:1 frente al fondo del código en línea, el más estrecho de los dos fondos sobre los que se apoyan; si no, se mantiene el tono accesible fijo y
leji view/leji exportavisan.mermaidbooleanRenderiza como diagramas en el visor los bloques de código ```mermaid delimitados. Por defecto, true.
poweredBybooleanMuestra la pequeña marca "Powered by Leji" en una esquina del visor. Por defecto, true; póngalo en false para quitarla.
categoryEmojisobjectSobrescribe el emoji que aparece por defecto junto a cada categoría en el mapa de la capa generado. (Los grupos de la barra lateral se etiquetan con el H1 de cada archivo de índice.)
Un ejemplo completo
Una capa de contexto federada, de ámbito organizativo, que monta una hermana y usa mucho más manifiesto de lo que necesitaría una capa real. La mayoría de las capas de contexto declaran solo el subconjunto que usan: leji init genera el andamiaje de un puñado de estos campos, y un manifiesto core es mucho más corto.
Hay dos aspectos de esta estructura que suelen prestarse a confusión: cada categoría apunta a archivos de índice escritos a mano, no a directorios de contenido, y agents vincula identificadores de rol con documentos de perfil, un directorio de roles y no un orden de carga, de modo que vincular uno nunca provoca su lectura.
Un campo es condicional en lugar de declarativo: viewer.theme.link colorea los enlaces del cuerpo y el código en línea solo cuando alcanza un contraste de 4,5:1 frente al fondo del código en línea del visor, y un valor que no llega al mínimo se informa como aviso mientras se mantiene el tono accesible fijo.
{
"$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"
}
}
}Véase la superficie legible por máquinas para saber cómo se relaciona el manifiesto con el índice, el registro de cambios y los perfiles, y versionado para la clave de línea de especificación leji.