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, el logo y el favicon del 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.

Todas las claves siguientes tienen la misma forma:

indexesarray de cadenasobligatorio

Uno 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-index delimitado 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.

domainobject

Dónde vive el contenido de domain: el lenguaje del negocio y la semántica del producto.

systemobject

Dónde vive el contenido de system: la arquitectura y los invariantes que todo cambio respeta.

practiceobject

Dónde vive el contenido de practice: las convenciones y los patrones probados.

governanceobject

Dónde vive el contenido de governance: las salvaguardas de agentes y las reglas operativas.

decisionsobject

Dó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.

indexPathstring

Ruta al índice del contexto generado.

changelogPathstring

Ruta al registro de cambios del contexto legible por máquinas.

agentProfilesPathstring

Directorio que contiene los documentos de perfil de agente.

decisionRecordsPathstring

Directorio 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).

Todas las claves siguientes tienen la misma forma:

namestringobligatorio

El nombre de la persona.

contactstring

Cómo ponerse en contacto con ella, por ejemplo una dirección de correo electrónico.

primaryobjectobligatorio

La persona que responde de la actualidad de la capa de contexto. Las capas de contexto sin responsable se pudren.

continuityobject

Opcional. 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.

claimedAtstring

Fecha 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 objetos

Cada 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í.

namestringobligatorio

El nombre de la capa hermana; debe coincidir con el name de su propio manifiesto.

sourcestringobligatorio

Localizador 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í.

pinstringobligatorio

Id 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.

trackingRefstring

Referencia 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.

ownerobjectobligatorio

El responsable de la capa hermana. La responsabilidad se queda en el equipo de la hermana; la anfitriona nunca absorbe su contenido.

rolestring

Qué 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 cadenas

Etiquetas 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 cadenas

Condiciones 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.

portinteger

Puerto 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).

logostring

Imagen 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.

titlestring

Tí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.

agentsLabelstring

Etiqueta 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.

faviconstring

Favicon para el visor, como una ruta bajo la raíz del contexto (por ejemplo "assets/icon.svg"). Por defecto, la marca de Leji.

homepagestring

La 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 elementos

Pá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 cadenas

Secuencia 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.

themeobject

Sobrescrituras del tema del visor.

primarystring

Color 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.

linkstring

Color 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 export avisan.

mermaidboolean

Renderiza como diagramas en el visor los bloques de código ```mermaid delimitados. Por defecto, true.

poweredByboolean

Muestra la pequeña marca "Powered by Leji" en una esquina del visor. Por defecto, true; póngalo en false para quitarla.

categoryEmojisobject

Sobrescribe 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.