build-integration について
GitBook内で動作するTypeScriptインテグレーションの構築を支援するスキルです。雛形作成から開発、公開までを扱い、ContentKit UI、マニフェスト、イベント処理、OAuth、サーバー側の実行モデルを説明します。
主な機能
- 01GitBook CLIで雛形を作成
- 02カスタムContentKitブロックの構築
- 03スコープと設定の定義
- 04イベントとHTTPリクエストの処理
- 05OAuthフローの実装
- 06インテグレーションの開発と公開
活用シーン
- 01GitBookエディターへのカスタムブロック追加
- 02GitBookのコンテンツ更新や同期イベントへの対応
- 03外部サービスとのインテグレーション接続
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ gitbookio/ gitbook-skills --skill build-integrationインストール後、Claude Code で/build-integrationを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/contentkit.mdmanifest.mdruntime.md詳細
GitBook インテグレーションを構築する
GitBook の開発者プラットフォーム上でインテグレーションを構築するためのスキルです。GitBook 内で動作するアプリを作成できます。インテグレーションでは、エディターにカスタムブロックを表示したり、設定 UI を表示したり、イベント(コンテンツの更新、Git 同期の完了、スペースの表示)をリッスンしたり、OAuth で外部サービスに対して認証したり、HTTP 経由であらゆるものと通信したりできます。
このスキルでは、インテグレーションのライフサイクル(スキャフォールド、コーディング、開発、公開)を扱います。インテグレーションをインストールする サイト の作成や再構成については configure-site を、ページコンテンツの作成については write-docs を参照してください。
インテグレーションとは(基本的な考え方)
インテグレーションは、GitBook のランタイムで実行される小さな TypeScript アプリです。ページに挿入されるスクリプトでも、ユーザーのサーバーで実行されるコードでもありません。ここから、あらゆる要素を形作る3つの重要な点が導かれます。
- レンダリングは GitBook のバックエンドで行われます。 コンポーネントの
render関数は、インタラクションのたびにサーバーサイドで実行され、ContentKit マークアップ(JSX に似た UI の記述)を返します。自分で制御できるクライアントサイドの React ツリーや DOM アクセスはなく、UI の更新はアクション → 新しい状態 → 再レンダリングのループを通じて行われます。 - サイトに JavaScript を挿入することはできません。 GitBook が所有するインテグレーションで見かける
site:script:injectとsite:script:cookiesのスコープは、内部専用です。ユーザーの計画が「ドキュメントに script タグを追加する」ことであれば、その時点で作業を止め、早めにその旨を伝えてください。サポートされている方法は、カスタムブロック、ウェブフレーム、イベントです。 - ローカル開発では、アクセスするサーバーではなくプロキシを使います。
gitbook devは、インストール済みの インテグレーションのトラフィックを開発マシンにルーティングします。開発サーバーのポートをブラウザーで開くことはありません。app.gitbook.com 内でインテグレーションを操作します。
プロジェクト
gitbook new は、次の構成をスキャフォールドします。
my-integration/
├── gitbook-manifest.yaml # identity, scopes, blocks, configuration schema
├── .gitbook-dev.yaml # local dev config (generated by `gitbook dev`)
├── package.json
└── src/
└── index.tsx # entry file — default-exports createIntegration()
エントリーファイル(マニフェストの script: が指すファイル)は、createIntegration({ fetch, components, events }) をデフォルトエクスポートします。
import { createIntegration, createComponent } from '@gitbook/runtime';
const helloBlock = createComponent({
componentId: 'hello-world', // must match a block id in the manifest
initialState: { message: 'Say hello!' },
action: async (element, action, context) => {
switch (action.action) {
case 'say':
return { state: { message: 'Hello world' } };
default:
return {};
}
},
render: async (element, context) => (
<block>
<button label={element.state.message} onPress={{ action: 'say' }} />
</block>
),
});
export default createIntegration({
components: [helloBlock],
events: {
space_content_updated: async (event, context) => {
// react to content changes
},
},
});
カスタムブロックがエディターの挿入パレット(⌘ + /)に表示されるのは、両方 の場所で宣言されている場合のみです。つまり、コード内の createComponent と、id が componentId に一致するマニフェスト内の blocks: エントリーの両方が必要です。片方を忘れることが、「ブロックが表示されない」という最もよくある原因です。
マニフェストの概要
gitbook-manifest.yaml は、インテグレーションの識別情報と権限の付与を定義します。必須項目は、name(GitBook 全体で一意。test ではなく、acme-changelog のように名前空間を含めてください)、title、description、organization(組織 ID またはサブドメイン)、visibility、scopes、script です。コードで実際に使用するスコープだけを要求してください。インストールするユーザーに表示されます。
マニフェストでは、blocks、インストールするユーザー向けの configurations(設定フォームとして表示される、アカウントレベルおよびサイトレベルのプロパティスキーマ)、secrets(例:CLIENT_ID: ${{ env.CLIENT_ID }}。公開時に読み込まれます。gitbook publish から .env が参照されるよう、dotenv-cli を使用してください)も宣言します。
全フィールドのスキーマ、スコープ一覧、設定プロパティの型については、references/manifest.md を参照してください。基本事項を超えてマニフェストを編集する際は、必ず確認してください。
開発ループ
このループには分かりにくい順序があります。ローカル開発より先に公開します。
- 前提条件。 Node 18 以降、https://app.gitbook.com/account/developer で取得した個人アクセストークン、そして CLI が必要です。
npm install @gitbook/cli -gを実行し、その後gitbook auth(またはgitbook auth --token=<token>)を実行してください。トークンを会話に貼り付ける必要がある場合は、環境変数に設定し、エコーバックしたりコミットしたりしないでください。 - スキャフォールド。
gitbook new <dir>を実行します。名前、タイトル、組織、スコープの入力を求められます。 - 一度公開します。 プロジェクトのルートで
gitbook publishを実行します。これによりインテグレーションが登録され(デフォルトでは非公開)、インストールリンクが表示されます。 - そのリンクを使って、少なくとも1つのスペースまたはサイトにインストールします。どこかにインストールするまではローカル開発できません。
- 開発します。
gitbook devを実行するとプロキシが起動します。インストール済みインテグレーションへのすべてのトラフィックは、公開済みのバージョンではなく、ローカルコードから提供されます。サーバー URL ではなく、GitBook エディターで操作してください。UI の変更を反映するにはブラウザーを更新する必要があります。スムーズに開発するには、ブラウザーのキャッシュを無効にしてください。コードの実行場所に応じて、ログはブラウザーのコンソールまたはターミナルに表示されます。ログが機能していないと判断する前に、両方を確認してください。 - ホスト版を更新するときは、
gitbook publishで再公開します。gitbook unpublish <name>で削除できます。
CLI コマンドのリファレンス(gitbook whoami や gitbook openapi publish を含む):references/manifest.md。
ランタイム:fetch、イベント、環境、OAuth
詳細とすべての表は references/runtime.md にあります。イベントハンドラー、OAuth フロー、または context.environment に関わる処理を書く場合は、こちらをお読みください。要点は次のとおりです。
fetchは、標準の Fetch API のRequest/Responseオブジェクトを使って、インテグレーションの公開エンドポイントへの受信 HTTP リクエストを処理します。送信 HTTP も通常のfetchを使います。eventsはイベント名(installation_setup、space_installation_setup、space_view、ui_render、space_content_updated、space_visibility_updated、space_gitsync_started、space_gitsync_completed)をハンドラーに対応付けます。一部のイベントには、対応するスコープが必要です。context.environmentでは、apiEndpoint、apiTokens、インストール情報(スペース、ステータス、インストーラーが入力したインストールごとのconfiguration値)、secrets、および公開 URL(environment.integration.urls.publicEndpoint)を参照できます。- OAuth を外部プロバイダーに対して行う場合は、決められたパターンを使います。
button型の設定プロパティのcallback_urlから、fetch ハンドラー内のcreateOAuthHandler({...})にルーティングし、クライアント ID/シークレットはsecretsから取得します。リダイレクトやトークン交換を独自に実装しないでください。 - インテグレーション内から GitBook API を呼び出す場合:生のトークンから独自のクライアントを構築するのではなく、
context.api(認証済みの@gitbook/apiクライアント)を使ってください。
ContentKit:UI の構築
ContentKit は、render が返すことのできるコンポーネントの語彙です。レイアウト(block、vstack、hstack、divider)、表示(box、card、text、image、markdown)、インタラクティブ要素(button、textinput、select、switch、checkbox、radio、codeblock、webframe、modal)があります。インタラクションモデルを一文で説明すると、入力は値を state キーにバインドし、ボタンはアクションをディスパッチし、action リデューサーは新しい状態を返し、GitBook が再レンダリングします。
単純なボタンを超えるコンポーネントを書く前に、references/contentkit.md をお読みください。すべてのプロパティの表に加えて、推測しにくいパターンも説明しています。ライブプレビューのための動的な状態のバインド、webframe の postMessage 通信、returnValue を使ったモーダル、@editor.node.updateProps によるプロパティの永続化、@link.unfurl と urlUnfurl マニフェストパターンによるリンクの展開、ブロックの Markdown コードブロックへのシリアライズなどです。
公開と共有
マニフェストの公開範囲によって、利用できる範囲が決まります。
private(デフォルト)— 所有する組織のメンバーのみインストールできます。内部ツールに適しており、開発中はこの設定にします。unlisted— どの組織でもインストールできますが、共有されたインストールリンクからのみ利用できます。特定の顧客やベータテスターとの共有に適しています。public— 誰でもインストールできます。インテグレーションマーケットプレイスへの申請前に必要です(審査プロセスは別途行われます。GitBook の「アプリを審査に申請する」ドキュメントを参照してください)。
公開範囲を変更した後は、gitbook publish を再実行してください。public を提案する前に、マニフェストが公開に適した状態か確認してください。icon、summary(Markdown、2048 文字以下)、previewImages(1600×800)、categories、externalLinks が必要です。
作業スタイル
- 新しく始めるときは、手作業ではなく CLI でひな形を作成してください。
gitbook newを実行すると、マニフェスト、TypeScript 設定、@gitbook/runtimeのバージョンが適切に設定されます。 - コンポーネントが正しく動作しない場合は、ブロックの ID の連鎖をたどってください(マニフェストの
blocks[].id↔componentId)。 - マニフェストファイル自体にシークレットを含めないでください。必ず
${{ env.X }}を介して参照し、値を直接記述しないでください。 - ユーザーの目的が GitBook の外部からのコンテンツ操作やサイト自動化(REST API を呼び出すスクリプト、CI パイプラインなど)の場合、インテグレーションは適切なツールではない可能性があります。個人用トークンを使う通常の API のほうが簡単です。コードを GitBook 内で実行する必要がある場合、つまりブロック、設定 UI、イベントへの反応、インストーラーに代わる OAuth には、インテグレーションが役立ちます。
参考資料
references/manifest.md—gitbook-manifest.yamlの全フィールド、すべてのスコープ、設定プロパティの型、シークレット、CLI コマンドのリファレンス、インストール/設定フロー。references/runtime.md—createIntegration/createComponent/createOAuthHandlerのシグネチャ、イベントカタログ、context.environmentの構造、HTTP の送受信。references/contentkit.md— プロパティ、組み込みアクション、インタラクティブ機能のレシピ(動的バインディング、ウェブフレーム、モーダル、アンファール、Markdown のシリアライズ)を含む、コンポーネントの完全なリファレンス。