spec 1.0 · リファレンス

マニフェスト:leji.json

AI エージェントの支援による翻訳です。内容に相違がある場合は、英語版ページが優先されます。文章に問題を見つけた際は、Issueまたはプルリクエストをお願いします。

Leji コンテキストレイヤーの、機械向けエントリポイントです。リポジトリルートに leji.json として置かれます。

マニフェストは、Leji で唯一ファイル名が固定されています。ツールがリポジトリルートに必ず存在すると見込める、ただひとつのファイルです。

フィールドの行はスキーマから生成されるため、ここに記載された内容が契約からずれることはありません。このページでは、トップレベルのフィールドと、一部のネストしたフィールドを取り上げます。アクターのロールやコマンドなど、さらに深い形についてはスキーマそのものを参照してください。必須フィールドには印が付いています。

フィールド

#lejistring必須

このコンテキストレイヤーが対象とする Leji の仕様系列です。たとえば "1.0"。自らを名乗るこのキーは OpenAPI の慣習に倣ったもので、このファイルが Leji のマニフェストであることを示します。

パターン ^\d+\.\d+$

#namestring必須

このコンテキストレイヤーの、短く安定した識別子です。たとえば "acme-billing-context"。

#descriptionstring

このコンテキストレイヤーが何を扱うのかの、一行の要約です。

#rootPathstring必須

コンテキストルートです。リポジトリルートからの相対の POSIX パスで指定します。コンテキストレイヤーがどこにあるかを宣言するもので、自らが管轄するパスの基準を取り直すことはありません。インデックスのエントリ、ピン留めしたページ、プロファイルのパスをはじめ、Leji の成果物のその他すべてのパスは、リポジトリルートから解決されます。ビューアーの homepagelogofavicon は例外です。これらはコンテキストルートからの相対で書かれ、その下に収まるリポジトリルートからの相対パスも受け付けられます。

パターン ^(?!/)(?!\./)(?!.*(^|/)\.\.(/|$))(?!.*\\).*$

#bootProfilePathstring必須

ブートプロファイルへのパスです。ブートプロファイルは、あらゆるホストとあらゆる人が起点とする、エージェントに依存しないエントリポイントです。

パターン ^(?!/)(?!\./)(?!.*(^|/)\.\.(/|$))(?!.*\\).+\.md$

#categoriesobject必須

論理的なカテゴリから、インデックスファイルへの対応づけです。キーは 5 つのカテゴリ識別子で、それぞれが、そのカテゴリの内容を列挙する、人が記述した 1 つ以上のインデックスファイルに対応します。

以下の各キーは、いずれも同じ形をとります。

indexes文字列の配列必須

このカテゴリのための、リポジトリルートからの相対のインデックスファイルです。1 つ以上を指定します。各インデックスファイルは人が記述した markdown で、フェンス付きの leji-index ブロックを持ちます。そのブロックの - path: <ディレクトリまたはファイル> の行が、このカテゴリに属する内容を選びます。内容はいまある場所に置かれたままで、インデックスファイルはそれを含めることを宣言するだけです。

domainobject

domain の内容が置かれる場所です。ビジネスの言葉と、製品の意味づけ。

systemobject

system の内容が置かれる場所です。アーキテクチャと、すべての変更が尊重する不変条件。

practiceobject

practice の内容が置かれる場所です。規約と、効果が確かめられたパターン。

governanceobject

governance の内容が置かれる場所です。エージェントのガードレールと、運用の規則。

decisionsobject

決定記録が置かれる場所です。物事がいまの形である理由の、日付のある記録。

#machineobject

機械可読な成果物の場所です。インデックス、変更履歴、プロファイル、決定記録。

indexPathstring

生成されるコンテキストインデックスへのパスです。

changelogPathstring

機械可読なコンテキスト変更履歴へのパスです。

agentProfilesPathstring

エージェントプロファイル文書を置くディレクトリです。

decisionRecordsPathstring

決定記録を置くディレクトリです。

#agentsマップ

ロールとエージェントプロファイルの結び付けです。キーはロール識別子(たとえば "thought-partner"、"reviewer")、値はエージェントプロファイル文書へのパスです。プロトコルがロールを関与させ、そのロールを誰が担うかはこのマップが決めます。

#actorsマップ

ロールを担えるアクターの登録簿です。任意です。キーは安定したアクター識別子です。各アクターは、自分が担えるロールと、ロールごとのコマンドテンプレートを宣言します。ひとつのロールに担えるアクターが複数いるとき、あるいはひとつのアクターが、担うロールによって異なる呼び出し方を必要とするときに使います。どちらか一方だけでも十分な理由になります。アクターがひとりしかおらず、必要なコマンドもひとつだけのロールは、エージェントプロファイル自身の host と invocation で足ります。

#ownersobject必須

コンテキストレイヤーの健全さについて、説明責任を負うのは誰かです。所有者は、コンテキストレイヤーが現状に即した状態に保たれ、適切に刈り込まれることに責任を負います。ひとりで書いたり整えたりするわけではありません(governance.md)。

以下の各キーは、いずれも同じ形をとります。

namestring必須

その人の名前です。

contactstring

連絡の取り方です。たとえばメールアドレス。

primaryobject必須

コンテキストレイヤーを現状に即した状態に保つことに、説明責任を負う人です。所有者のいないコンテキストレイヤーは朽ちていきます。

continuityobject

任意です。主たる所有者が不在のとき、あるいは離れたときに、同じ説明責任を引き受ける別の人です。支援を受けた導入では、外部の助けが去る前にこの人を名指しすべきです。主たる所有者を再び挙げても継続性にはならず、エージェントがこれを担うこともできません。所有者は説明責任を負う人だからです。

#conformanceobject

このコンテキストレイヤーが宣言する適合レベルです。ツールで確認できます。

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

宣言する適合レベルです。core、indexed、governed、federated のいずれか。

claimedAtstring

その宣言を最後に主張した日付(ISO 8601)です。

#federationobject

このリポジトリにマウントされた兄弟レイヤーです(仕様: distribution.md のパターン 3)。輪は所有を組み合わせるものであり、中央に集めるものではありません。

mountsオブジェクトの配列

各マウントは、リゾルバがハイドレートしたレイヤーの投影を通じて、ピン留めされたバージョンで読まれる兄弟コンテキストレイヤーです。自分のリポジトリ、所有、レビューのゲートはそのまま保ちます。実体化された内容は gitignore されたリゾルバのキャッシュに置かれ、ここにコミットされることはありません。

namestring必須

兄弟レイヤーの名前です。兄弟自身のマニフェストにある name と一致しなければなりません。

sourcestring必須

兄弟レイヤーの、正規化されたリポジトリの所在です。https://、ssh://、または SCP 形式のリモート URL を指定します。これが解決の起点であり、ピンの名前空間になります。ローカルファイルシステムのパスが妥当なのは、そのマシンに閉じたヒントの中だけで、ここでは使えません。

pinstring必須

このホストが読む兄弟のリビジョンの、不変なコミット id(SHA-1 または SHA-256)を完全な形で示したものです。マニフェストが保持する望ましい状態であり、ピンの更新は意図的で、レビューを経た手入れです。

trackingRefstring

ソース上の、証跡となる完全修飾の参照(refs/heads/* または refs/tags/*)です。任意で、古くなったピンの報告と、フェデレーションでの到達可能性がこれを照合の相手にします。指定がない場合は、ソースが提示する既定ブランチが使われ、コマンドの出力に記録されます。

ownerobject必須

兄弟レイヤーの所有者です。所有は兄弟のチームに残り、ホストがその内容を取り込むことはありません。

rolestring

この兄弟レイヤーが何を担っているかを、散文で述べます。たとえば "製品側のコンテキスト"。人のためのもので、経路の決定には下の構造化されたフィールドを使います。

categories"domain" · "system" · "practice" · "governance" · "decisions" の配列

この兄弟が答えを返せる、コンテンツカテゴリの範囲です。経路のメタデータに限られ、兄弟の内容は兄弟に置かれたままです。federated の適合性では必須です。

topics文字列の配列

ホストから見える短いトピックのラベルで、作業をこの兄弟へ振り分けるために使います。たとえば "billing"、"checkout"。経路のメタデータに限られます。

requiredWhen文字列の配列

読み手がこのマウントを解決しなければならない作業の条件です。解決できないときは、手を止めてコンテキストが不完全であることを報告します(フェイルクローズ)。ホストから見えるので、ホストの読み手が見てはならないものを何も明かしてはなりません。

#vendorAdapters文字列の配列

このリポジトリに置かれた、ベンダーのエントリポイントファイルです。それぞれがブートプロファイルへ誘導しなければなりません。

#viewerobject

leji viewer が読む、表示の設定です。規範ではない、利便のための設定であり、表示のしかたそのものは規範の対象外です。

portinteger

leji viewer serve でローカルのプレビューに使いたいポートです。--port フラグが優先されます。既定は 5354(電話のキーパッドで LEJI)です。

logostring

ビューアーのロゴ画像です。コンテキストルート以下のパスで指定します(たとえば "assets/logo.svg")。既定は Leji のマークです。

titlestring

ビューアーの表示タイトルです(サイドバーの見出しとページタイトル)。既定はコンテキストレイヤーの名前です。

agentsLabelstring

エージェントプロファイルのグループに付ける、サイドバーのラベルです(絵文字も歓迎です)。既定は "🤖 Agents"。このグループはレイヤーのエージェントプロファイルを列挙し、他のグループと同じく viewer.groupOrder で並び順が決まります。

faviconstring

ビューアーのファビコンです。コンテキストルート以下のパスで指定します(たとえば "assets/icon.svg")。既定は Leji のマークです。

homepagestring

ビューアーの入口となるページです。コンテキストルートからの相対パスで指定します(たとえば "README.md")。既定は、最初に用意される overview.md です。

pins要素の配列

サイドバーの先頭にピン留めするページです。リポジトリルートからの相対の markdown パスか、ラベルを自分で決めたい場合は {path, label} を指定します。ブートプロファイルをピン留めすると、その既定の行が置き換わります。

groupOrder文字列の配列

サイドバーのグループの並び順を、自分で決めるための設定です。グループのラベル(インデックスファイルの H1)と正確に一致させて指定します。挙げたグループがこの順で先に並び、挙げなかったグループは導出された順で続きます。

themeobject

ビューアーのテーマの上書きです。

primarystring

基調色・アクセント色を、16 進の CSS カラーで指定します(たとえば "#009F71")。ビューアーの外枠、選択中の状態、図のアクセントに効きます。本文のリンクとインラインコードは、viewer.theme.link がコントラストの基準を満たす色を与えないかぎり、アクセシビリティに配慮した固定の色調を使います。

linkstring

リンクの色を、16 進の CSS カラーで指定します(たとえば "#5A50F9")。本文のリンクとインラインコードに適用されるのは、それらが載る 2 つの背景のうち条件の厳しいインラインコードの背景に対して、4.5:1 に達したときだけです。届かない場合は、アクセシビリティに配慮した固定の色調がそのまま使われ、leji viewleji export が警告します。

mermaidboolean

フェンス付きの ```mermaid コードブロックを、ビューアーで図として描画します。既定は true です。

poweredByboolean

ビューアーの隅に、小さな "Powered by Leji" の表示を出します。既定は true で、false にすると消えます。

categoryEmojisobject

生成されるレイヤーマップで、各カテゴリの横に表示される既定の絵文字を上書きします。(サイドバーのグループのラベルは、各インデックスファイル自身の H1 です。)

実例

兄弟レイヤーをマウントする、組織全体のフェデレーションされたコンテキストレイヤーの例です。実際のマニフェストで必要になるより、はるかに多くのフィールドを使っています。たいていのコンテキストレイヤーが宣言するのは、使用するフィールドだけです。leji init がスキャフォールドするのはこのうちのごく一部で、core のマニフェストはもっと短くなります。

この形には、誤解しやすい点が 2 つあります。ひとつは、各カテゴリが指す先が、コンテンツのディレクトリではなく、人が記述したインデックスファイルであることです。もうひとつは、agents がロール識別子をプロファイル文書に結び付ける、読み込み順ではなくロールの一覧であり、結び付けただけではその文書が読み込まれないことです。

1 つだけ、宣言ではなく条件に応じて機能するフィールドがあります。viewer.theme.linkの色が本文リンクとインラインコードに適用されるのは、ビューアーのインラインコード背景とのコントラスト比が 4.5:1 以上の場合だけです。この基準に満たない値は警告として報告され、アクセシビリティに配慮した既定色がそのまま使われます。

{
  "$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"
    }
  }
}

マニフェストとインデックス、変更履歴、プロファイルの関係については機械可読サーフェスを、leji という仕様系列のキーについてはバージョニングを参照してください。