linear について
linearは、開発・テスト向けのステートフルなLinear GraphQL APIエミュレーターです。組織やイシューのシード、OAuth、Webhookに対応し、ローカルのインスペクターも備えますが、本番APIの全機能は実装していません。
主な機能
- 01Linear GraphQLのクエリと更新をエミュレート
- 02組織、チーム、イシューなどをシード
- 03OAuth認可とトークンフローに対応
- 04Linear形式のWebhookを送信
- 05ローカルUIでエミュレーターのデータを確認
活用シーン
- 01Linear APIに依存するアプリのテスト
- 02OAuthフローのローカル検証
- 03イシュー更新で発生するWebhookのテスト
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ vercel-labs/ emulate --skill linearインストール後、Claude Code で/linearを入力して読み込まれたか確認します。
詳細
Linear API エミュレーター
組織、ユーザー、チーム、ワークフローの状態、課題、コメント、ラベル、プロジェクト、サイクル、OAuth アプリ、トークン、Webhook、および基本的なエージェントセッションを備えた、ステートフルな Linear GraphQL API のエミュレーションです。
開始方法
ローカルリスナーは、デフォルトで 127.0.0.1 にバインドされます。コンテナーやほかのマシンからアクセスするには、CLI に --host 0.0.0.0 を渡すか、createEmulator に hostname: '0.0.0.0' を渡してください。クライアントからアクセス可能な URL を公開するには、--base-url または baseUrl を設定してください。
# Linear only
npx emulate --service linear
デフォルト URL:すべてのサービスを起動した場合は http://localhost:4012、Linear のみを起動した場合は http://localhost:4000 です。
URL マッピング
| 実際の Linear URL | エミュレーター URL |
|---|---|
https://api.linear.app/graphql | $LINEAR_EMULATOR_URL/graphql |
https://linear.app/oauth/authorize | $LINEAR_EMULATOR_URL/oauth/authorize |
https://api.linear.app/oauth/token | $LINEAR_EMULATOR_URL/oauth/token |
https://api.linear.app/oauth/revoke | $LINEAR_EMULATOR_URL/oauth/revoke |
認証
GraphQL は、ベアラートークンまたは個人用 API キーをそのまま受け付けます。
curl "$LINEAR_EMULATOR_URL/graphql" \
-H "Authorization: Bearer lin_test_admin" \
-H "Content-Type: application/json" \
-d '{"query":"{ viewer { id email } }"}'
デフォルトでは、スコープチェックは緩和されています。サポートされている操作スコープ(read、write、issues:create、comments:create、admin など)を必須にするには、シード設定で linear.strict_scopes: true を設定してください。
シード設定
linear:
organization:
name: Acme
url_key: acme
users:
- email: [email protected]
name: Admin User
admin: true
- email: [email protected]
name: Developer
teams:
- key: ENG
name: Engineering
issues:
- team: ENG
title: Fix local checkout test
state: Todo
assignee: [email protected]
oauth_apps:
- client_id: lin_example_client_id
client_secret: example_client_secret
name: My Linear App
redirect_uris:
- http://localhost:3000/api/auth/callback/linear
scopes: [read, write, issues:create, comments:create]
tokens:
- token: lin_test_admin
user: [email protected]
scopes: [read, write, issues:create, comments:create, admin]
strict_scopes: false
GraphQL の対応範囲
対応しているクエリ:
viewerorganizationusers、userteams、teamworkflowStates、workflowStateissues、issuecomments、commentissueLabels、issueLabelprojects、projectcycles、cyclewebhooks、webhookagentSessions、agentSession
対応しているミューテーション:
issueCreate、issueUpdate、issueDelete、issueArchive、issueUnarchivecommentCreate、commentUpdate、commentDeleteissueLabelCreate、issueLabelUpdate、issueLabelDeleteissueAddLabel、issueRemoveLabelwebhookCreate、webhookDeleteagentSessionCreateOnIssue、agentSessionCreateOnComment、agentSessionUpdateagentActivityCreate
コネクションでは、nodes、edges、pageInfo を含む Relay 形式のカーソルを使用します。
課題の選択項目では、数値の priority と、Linear が導出する priorityLabel の値(No priority、Urgent、High、Medium、Low)の両方が公開されます。
OAuth
GET /oauth/authorize— ローカルユーザー選択画面を備えた認可エンドポイントPOST /oauth/authorize/callback— ローカルユーザー選択画面のコールバックPOST /oauth/token— 認可コード、リフレッシュトークン、クライアントクレデンシャルの各グラントPOST /oauth/revoke— アクセストークンまたはリフレッシュトークンを失効
OAuth アプリでは、actor: user または actor: app を使用できます。設定されたアクターが常に優先されます。ユーザーアクターのアプリでは、認可コードフローを使用します。アプリアクターのアプリでは、アプリのインストールフローを使用し、クライアントクレデンシャルトークンを要求できます。アプリアクターのサポートは、ローカルのエージェントやサービスアカウントのテストには十分ですが、本番環境における Linear のエージェント動作を完全に再現するものではありません。
Webhook
webhookCreate またはシード設定を通じて、ローカルの Webhook サブスクリプションを作成できます。書き込みが行われると、シークレットが設定されている場合、Linear-Delivery、Linear-Event、Linear-Signature ヘッダーを含む Linear 形式のペイロードがディスパッチされます。
インスペクター
Linear エミュレーターで GET / を開くと、課題、チーム、ユーザー、プロジェクト、エージェントセッション、OAuth アプリ、トークン、Webhook サブスクリプション、Webhook 配信を確認できます。
現在の制限事項
Linear スキーマ全体の対応、本番環境と同等の厳密なレート制限、通知受信トレイの動作、リッチドキュメント API、顧客 API、イニシアチブ API、厳密な検索関連度、本番環境と同等の完全なエージェント動作は実装されていません。
組み込みエミュレーターと併用するカスタムエミュレーター
npx emulate init --custom inventory を実行して、サードパーティ API エミュレーターとテストのひな形を作成します。emulate の defineConfig を使って emulate.config.ts に登録します。{ emulator: "linear" } などの組み込みエントリーと併記できます。npx emulate start --watch を実行すると、インポートが再読み込みされ、表示された /_emulate URL でカスタム状態を確認できます。再読み込みが成功すると、実行状態はシードにリセットされます。既存のフラットなシード設定も引き続き使用できます。--config で明示的なファイルを指定します。サードパーティ API エミュレーターの作成とテストについては、https://emulate.dev/docs/custom-emulators をご覧ください。