cyrus-setup-linear について
cyrus-setup-linearは、Cyrus向けにLinear連携を設定するスキルです。マニフェストからOAuthアプリを作成し、シークレットを読み取らずに認証情報の入力を案内して、Cyrusのコマンドラインでワークスペースを認証します。
主な機能
- 01既存のLinear設定を確認
- 02マニフェストベースのOAuthアプリ作成
- 03認証情報の手動入力を案内
- 04Cyrusのコマンドラインでワークスペースを認証
活用シーン
- 01CyrusにLinearを追加
- 02未完了のLinear接続を再設定
- 03Cyrus用にLinearワークスペースを認証
MCP 対応
利用可能な場合、OAuthアプリ作成時のLinear操作にclaude-in-chrome MCPツールを使用できます。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ cyrusagents/ cyrus --skill cyrus-setup-linearインストール後、Claude Code で/cyrus-setup-linearを入力して読み込まれたか確認します。
詳細
重要:~/.cyrus/.env または ~/.cyrus/ 内のファイルに対して、Read、Edit、Write ツールを絶対に使用しないでください。環境ファイルを操作する場合は、Bash コマンド(grep、printf >> など)のみを使用してください。シークレットを会話のコンテキストに読み込んではいけません。Web ページからシークレットの値をスクレイピング、抽出、読み取りしないでください。ユーザー自身でコピーするよう案内してください。
Linear をセットアップする
Linear OAuth アプリを作成し、Cyrus が Webhook を受信して課題に応答できるよう認証情報を設定します。
ステップ 1:既存の設定を確認する
grep -E '^LINEAR_CLIENT_ID=' ~/.cyrus/.env 2>/dev/null
LINEAR_CLIENT_ID がすでに設定されている場合は、OAuth の設定も完了しているか確認します。
grep -q '"workspaces"' ~/.cyrus/config.json 2>/dev/null && echo "configured" || echo "not configured"
両方が設定されている場合は、ユーザーに次のように伝えます。
Linear はすでに設定されています。このステップをスキップします。 再設定するには、
~/.cyrus/.envからLINEAR_CLIENT_ID、LINEAR_CLIENT_SECRET、LINEAR_WEBHOOK_SECRETを削除して、再実行してください。
完了までスキップします。
ステップ 2:CYRUS_BASE_URL を取得する
環境ファイルからベース URL を読み取ります(setup-endpoint によって設定されています)。
grep '^CYRUS_BASE_URL=' ~/.cyrus/.env | cut -d= -f2-
これはコールバック URL と Webhook URL に必要です。
ステップ 3:マニフェストから Linear OAuth アプリを作成する
Linear OAuth アプリは、マニフェストを利用するセットアップ URL から作成する必要があります。アプリを一から作成したり、各フィールドを手動で入力したりしないでください。マニフェストを使うことでアプリ設定を再現可能な状態に保ち、コールバック、Webhook、イベントタイプの設定にずれが生じるのを防げます。
3a. マニフェスト URL を作成する
JSON の OAuth アプリマニフェストを生成し、Linear の manifest クエリパラメーターにエンコードします。
CYRUS_BASE_URL="<CYRUS_BASE_URL>" \
AGENT_NAME="<AGENT_NAME>" \
AGENT_DESCRIPTION="<AGENT_DESCRIPTION>" \
node <<'NODE'
const fs = require("node:fs");
const baseUrl = process.env.CYRUS_BASE_URL.replace(/\/+$/, "");
const agentName = process.env.AGENT_NAME || "Cyrus";
const agentDescription =
process.env.AGENT_DESCRIPTION || "AI coding agent for automated development";
const manifest = {
$schema: "https://linear.app/.well-known/oauth-app-manifest.schema.json",
schemaVersion: "1.0.0",
distribution: "private",
display: {
description: agentDescription,
},
developer: {
name: "Self-hosted",
},
oauth: {
client_name: agentName,
client_uri: "https://github.com/ceedaragents/cyrus",
redirect_uris: [`${baseUrl}/callback`],
grant_types: ["authorization_code"],
},
webhook: {
enabled: true,
url: `${baseUrl}/linear-webhook`,
resourceTypes: [
"AgentSessionEvent",
"AppUserNotification",
"PermissionChange",
"Issue",
],
},
};
const manifestJson = JSON.stringify(manifest, null, 2);
const manifestUrl = `https://linear.app/settings/api/applications/new?manifest=${encodeURIComponent(JSON.stringify(manifest))}`;
fs.writeFileSync("/tmp/cyrus-linear-oauth-app-manifest.json", `${manifestJson}\n`);
fs.writeFileSync("/tmp/cyrus-linear-oauth-app-url.txt", `${manifestUrl}\n`);
console.log(manifestJson);
console.log(`\n${manifestUrl}`);
NODE
LINEAR_MANIFEST_URL="$(cat /tmp/cyrus-linear-oauth-app-url.txt)"
同じ URL が、自動化コマンド用の LINEAR_MANIFEST_URL と、手動でコピー&ペーストするための /tmp/cyrus-linear-oauth-app-url.txt に保存されます。JSON は確認やデバッグ専用として /tmp/cyrus-linear-oauth-app-manifest.json に保存されます。ユーザーに OAuth アプリのフォームを手動で入力するよう求めないでください。
<AGENT_NAME> に「Linear」という単語または URL が含まれている場合は、マニフェストを作成する前に別の OAuth アプリ名を選んでください。Linear はこれらの値を含む OAuth クライアント名を拒否します。
オーケストレーターのルールを参照し、使用するブラウザー自動化モードを判断します。
claude-in-chromeMCP ツールが利用可能な場合 → Path A-1(claude-in-chrome)を使用agent-browserがインストールされており(which agent-browser)、Chrome デバッグセッションが接続されている場合 → Path A-2(agent-browser)を使用- それ以外の場合 → Path B(手動)を使用
Path A-1:claude-in-chrome による自動化
mcp__claude-in-chrome__* ツールを使用して、ユーザーが現在使用している Chrome ブラウザーに移動し、操作します。ユーザーはすでに Linear にサインインしている可能性があります。
LINEAR_MANIFEST_URL に移動します。マニフェストが適用された OAuth アプリ設定がすでに入力された状態でページが開きます。
シークレットではないフィールドのみ確認します。
- アプリケーション名が
<AGENT_NAME>と一致している - 開発者名が
Self-hostedになっている - 開発者 URL が
https://github.com/ceedaragents/cyrusになっている - リダイレクトコールバック URL に
<CYRUS_BASE_URL>/callbackが含まれている - Webhook が有効で、URL が
<CYRUS_BASE_URL>/linear-webhookになっている - イベントタイプに Agent session events、Inbox notifications、Permission changes、Issues が含まれている
- 公開/配布設定が非公開または無効になっている
ユーザーがサインインしていない場合は、いったん停止してサインインを依頼してください。確認後、Create をクリックします。認証情報のページをスクリーンショットに撮ったり、シークレットをスクレイピングしたりしないでください。 ステップ 4 に進みます。
Path A-2:agent-browser による自動化
agent-browser が Chrome デバッグセッションに接続されている場合は、Linear アプリの作成を自動化します。
3b. マニフェスト URL に移動する
agent-browser navigate "$LINEAR_MANIFEST_URL"
ページの読み込みを待ちます。正しいページが表示され、ログイン済みであることを確認するため、スクリーンショットを撮影します。
3c. 確認して作成する
Path A-1 に記載された、マニフェストが適用されたフィールドのうち、同じシークレットではない項目を確認します。ページでユーザーにサインインを求められた場合は、いったん停止し、ユーザー自身でサインインを完了してもらいます。Create をクリックします。
作成後、Linear によってアプリ設定ページにリダイレクトされます。認証情報のページをスクリーンショットに撮ったり、シークレットをスクレイピングしたりしないでください。 ステップ 4 に進みます。
パス B:手動セットアップガイド
手動での作成手順をユーザーに案内します。
Linear OAuth アプリケーションを作成する
マニフェストが適用された Linear アプリ作成 URL を開きます。
<LINEAR_MANIFEST_URL>求められた場合は Linear にサインインし、入力済みの設定を確認します。
- アプリケーション名:
<AGENT_NAME>- 開発者名:
Self-hosted- 開発者 URL:
https://github.com/ceedaragents/cyrus- リダイレクトコールバック URL:
<CYRUS_BASE_URL>/callback- Webhook URL:
<CYRUS_BASE_URL>/linear-webhook- Webhook: ✓ 有効
- イベントタイプ: ✓ エージェントセッションイベント、✓ 受信トレイの通知、✓ 権限の変更、✓ イシュー
- 公開: ✗ 無効のままにします(これはプライベートなセルフホストアプリです)
Create をクリックします。
ステップ 4 に進みます。
ステップ 4:認証情報を取得する
エージェントはページからシークレットをスクレイピング、読み取り、抽出してはなりません。 ユーザーが手動でコピーし、env ファイルに貼り付けます。
4a. 認証情報のプレースホルダーを追加する
grep -q '^LINEAR_CLIENT_ID=' ~/.cyrus/.env || echo 'LINEAR_CLIENT_ID=' >> ~/.cyrus/.env
grep -q '^LINEAR_CLIENT_SECRET=' ~/.cyrus/.env || echo 'LINEAR_CLIENT_SECRET=' >> ~/.cyrus/.env
grep -q '^LINEAR_WEBHOOK_SECRET=' ~/.cyrus/.env || echo 'LINEAR_WEBHOOK_SECRET=' >> ~/.cyrus/.env
4b. 編集する env ファイルを開く
# macOS
code --new-window ~/.cyrus/.env 2>/dev/null || open -a TextEdit ~/.cyrus/.env
# Linux
code --new-window ~/.cyrus/.env 2>/dev/null || xdg-open ~/.cyrus/.env
4c. ユーザーに案内する
ユーザーに次のように伝えます。
~/.cyrus/.envを開きました。Linear アプリ設定ページから 3 つの値を貼り付けてください。
- Client ID — コピーして
LINEAR_CLIENT_ID=の後に貼り付けます- Client Secret — 横にあるコピー ボタンをクリックし(ドットでマスクされています)、
LINEAR_CLIENT_SECRET=の後に貼り付けます- Webhook Signing Secret — 横にあるコピー ボタンをクリックし、
LINEAR_WEBHOOK_SECRET=の後に貼り付けます完了したら、ファイルを保存して閉じてください。
4d. 検証する
ユーザーが保存したことを確認したら、次を実行します。
grep -c '^LINEAR_CLIENT_ID=.' ~/.cyrus/.env
grep -c '^LINEAR_CLIENT_SECRET=.' ~/.cyrus/.env
grep -c '^LINEAR_WEBHOOK_SECRET=.' ~/.cyrus/.env
3 つすべてが 1 を返す必要があります(= の後の . により、値が空でないことを確認します)。いずれかが 0 の場合は、ファイルを確認するようユーザーに伝えます。
ステップ 5:Linear で認証する
OAuth 認証フローを実行します。
cyrus self-auth-linear
これにより、次の処理が行われます。
- 一時的な OAuth コールバックサーバーを起動します
- ブラウザーで Linear の認証ページを開きます
- ユーザーが Authorize をクリックすると、トークンを
~/.cyrus/config.jsonに保存します
認証が成功したことを確認します。
cat ~/.cyrus/config.json | grep -c '"workspaces"'
カウントが 0 の場合、認証に失敗しています。認証情報を確認して再試行するようユーザーに伝えます。
完了
✓ Linear OAuth アプリケーションを作成しました ✓ 認証情報を
~/.cyrus/.envに保存しました ✓cyrus self-auth-linearでワークスペースを認証しました