バックログの先へ:CData ドライバーで Linear ロードマップの実際の成果を測定する
多くのソフトウェアチームにとって、Linear は開発の計画からリリースまでを管理する中心的なシステムになっています。Issue、プロジェクト、サイクル、イニシアチブ、顧客からの要望がすべて Linear に集約されており、チームが何を、どのようなペースで、誰のために開発しているのかを把握できます。ただし、その計画が実際に成果を上げたかどうかを示すデータは Linear にはありません。また、レポート用にデータを取り出すには Linear の GraphQL API(アプリケーションプログラミングインターフェース)に対してコードを書く必要があり、カーソルベースのページネーションやクエリごとの複雑度制限への対応、ネストされたオブジェクトのフラット化といった手間がかかります。
新しい CData Driver for Linear を使えば、Linear ワークスペースをリレーショナルテーブル(Issue、プロジェクト、イニシアチブ、サイクル、顧客、コメント、履歴)として扱えます。JDBC(Java Database Connectivity)、ODBC(Open Database Connectivity)、ADO.NET、Python に対応したあらゆるツールから、SQL(Structured Query Language)でクエリを実行できます。ドライバーはワークスペースの GraphQL スキーマからデータモデルを読み取り、フィルターや結合を Linear 側にプッシュダウンします。さらに、INSERT、UPDATE、DELETE は Linear のミューテーションに変換されます。この記事では、まずドライバーの概要をご紹介し、続いて Linear と Salesforce、Google BigQuery を結合した「Requests to Roadmap」ダッシュボードを構築します。なお、このダッシュボードは Claude Code が CData JDBC ドライバーと CData CLI(コマンドラインインターフェース)を使って構築したものです。
ロードマップにはビジネス全体のコンテキストが必要
ロードマップ上の作業が単独で完結することはほとんどありません。Issue の発端となった顧客の要望は CRM(顧客関係管理)システムにあることが多く、修正が効果を上げたことを示すデータは製品のテレメトリにあります。ロードマップに関する意思決定には、次の 3 種類のコンテキストが欠かせません。
- 需要は CRM にあります。どの顧客が、何社から要望があり、どれくらい待っているのか、といった情報です。
- 効果はデータウェアハウスにあります。変更をリリースした後も利用状況が維持されているか、顧客が報告したエラーが解消されたか、といった情報です。
- デリバリーは Linear にあります。チームが何を開発しているのか、各項目がワークフローのどの段階にあるのか、いつリリースされたのか、といった情報です。
Linear は高機能な GraphQL API を提供していますが、Linear のデータでレポートを作成するには、CRM やデータウェアハウスのデータと結合する前に、カーソルベースのページネーションやネストされたオブジェクト、リレーションシップを処理しなければなりません。一度きりのスクリプトであれば対応できますが、BI(ビジネスインテリジェンス)ツールで週次レポートを作成したいプロダクトオペレーションのアナリストや、同じ結合をダッシュボード、ノートブック、パイプラインで使い回したいチームには不向きです。
このギャップを埋めるのが CData Driver for Linear です。すでにお使いの BI ツールやノートブック、パイプラインでそのまま使える、標準的な SQL インターフェースを提供します。
Linear に接続して SQL でクエリを実行する
認証方法を選択する
ドライバーは、個人用 API キーと OAuth(Open Authorization)の両方に対応しています。最もシンプルなのは API キーを使った接続です。
jdbc:linear:AuthScheme=APIKey;APIKey=<your key>;
API キーは、Linear で Settings > Security & access > Personal API keys を開き、New API key を選択して作成します。
注意:キーはすぐにコピーしておきましょう。Linear でキーが表示されるのは一度だけです。
ドライバーは、次の 3 つの認証スキームに対応しています。
| 認証スキーム | 用途 | プロパティ |
|---|---|---|
| APIKey | 自分自身として接続する場合(最もシンプルな方法) | APIKey |
| OAuth | アプリケーションが Linear ユーザーに代わって操作する場合(認可コードグラント) | OAuthClientId, OAuthClientSecret, CallbackURL, InitiateOAuth |
| OAuthClient | ユーザーのサインインを伴わない、アプリ所有のマシン間アクセスの場合(クライアントクレデンシャルグラント) | OAuthClientId, OAuthClientSecret |
どちらの OAuth フローでも、Linear にカスタム OAuth アプリケーションを登録しておく必要があります。InitiateOAuth=GETANDREFRESH を指定すると、ドライバーは初回のみブラウザでのサインインを開き、トークンを保存して自動的にリフレッシュします。クライアントクレデンシャルフローではブラウザを一切使わず、トークンのリフレッシュも自動で行われます。オプションの Scope プロパティのデフォルト値は read,write です。
自分のワークスペースから構築されたデータモデルにクエリを実行する
ドライバーは、接続時に Linear の GraphQL スキーマからデータモデルを検出します。「要望 → ロードマップ → 利用状況」をつなぐユースケースでは、テーブルは次の 4 つのグループに分類できます。
| 領域 | テーブル |
|---|---|
| 作業管理 | Issue, WorkflowState, Team, User, Cycle, IssueLabel, IssueLabels, IssueRelation, Comment, Attachment |
| ロードマップ | Initiative, InitiativeToProject, Project, ProjectMilestone, ProjectUpdate, Release |
| 顧客 | Customer, CustomerNeed, CustomerStatus, CustomerTier |
| 履歴 | IssueHistory(ステータス、優先度、担当者、見積もりなどの経時的な変更) |
実例:あいまいなエラーから、追跡可能なロードマップ項目へ
このダッシュボードでは、顧客の要望に紐づくロードマップ項目を 1 つずつ追跡します。各項目をその発端となった Salesforce のケースと結合し、項目のリリース後には BigQuery の製品テレメトリを確認します。
例として取り上げるのは、インストールに失敗し、あいまいなエラーメッセージが表示されたと報告した顧客のケースです。
Verifying startup... Error: verification failed. Check Java installation and package contents.
原因は古い Java ランタイムで、Java 21 にアップグレードすることで解決しました。顧客のケースはクローズされましたが、根本的な問題は残っていました。エラーメッセージが、失敗の理由をユーザーに伝えていなかったのです。そこで、これを Linear の Issue GRA-5「インストールされている Java のバージョンが古すぎる場合に、わかりやすいエラーを表示する」として登録しました。受け入れ条件は、古いバージョンが検出された場合に、インストーラーが必要な最小 Java バージョン(17)を明示することです。
ダッシュボードではこうした項目をさらに追跡できますが、今回のサンプルワークスペースには 1 件だけ含まれています。
事前に準備するもの
- Linear ワークスペースと個人用 API キー
- Salesforce のケースと BigQuery の製品テレメトリへのアクセス権
- CData JDBC Driver for Linear、CData JDBC Driver for Salesforce、CData JDBC Driver for Google BigQuery
- CData CLI(スキルを含めてインストール済みであること)
- Java 17
- Claude Code(オプション)
コーディングエージェントに任せる
このアプリは、CData チームが手書きしたものではありません。Claude Code と CData CLI のスキルを使って構築しました。CData CLI のスキルは、コマンドラインから CData ドライバーをインストールし、接続し、クエリを実行する方法をコーディングエージェントに教えるものです。CData CLI とスキルのダウンロード手順は、CData の Web サイトで確認できます。今回の構築では、各ドライバーの JDBC 版(CData JDBC Driver for Linear、CData JDBC Driver for Salesforce、CData JDBC Driver for Google BigQuery)を使用しました。CData のほかのエディションにも同じドライバーが含まれています。
プロンプトは、目的を普通の言葉で伝えただけのシンプルなものです。
「Salesforce の顧客の要望と、それに対応する Linear のロードマップ項目を紐づけ、リリース後の修正効果を BigQuery の製品利用テレメトリで検証するダッシュボードを構築してください。/cdata-cli を使用してください。」
そこからエージェントは、次の 4 つのステージで作業を進めました。
- 検出:インストール済みのドライバーを検出し、Linear の接続プロパティを読み取って、テーブルとカラムを一覧表示しました。
- モデルの読み取り:ドライバーのメタデータとドキュメントからデータモデルを読み取り、サンプルクエリを実行して内容を確認しました。
- 全クエリの検証:Issue・ステータス・チームの結合、IssueLabels を介したラベルの参照、IssueHistory からの履歴取得、Salesforce のケース参照、BigQuery の利用状況の集計を、すべてコマンドラインで検証しました。
- 構築とテスト:CData チームがダッシュボードの言語に Java を選ぶと、エージェントは公式のコンパニオンスキル cdata-cli-java に切り替え、CLI がすでに使用していた JDBC の JAR ファイルを再利用しました。その後、アプリを作成して起動し、すべてのエンドポイントを呼び出して、結果のスクリーンショットを確認しました。
CData チームの役割は舵取りです。題材の選定、ダッシュボードに表示してよい顧客フィールドの判断、Linear API キーの提供を担当しました。CLI とアプリは同じ JDBC ドライバーで動作するため、エージェントがコマンドラインで検証したクエリは、完成したアプリでもそのまま動作しました。
ステップ 1:CData CLI で接続してスキーマを探索する
CData CLI(cdatacli)は、JDBC ドライバーをターミナルから実行するツールです。アプリケーションのコードを書く前に、接続を確認したりスキーマを確認したりできます。
注意:API キーを他者に見られないよう、接続コマンドはご自身のターミナルで実行してください。CLI は各接続を暗号化して保存します。
# Confirm the drivers are installed
cdatacli drivers list
# Save encrypted connections
cdatacli connection create --driver Linear --name linear \
--connectionstring "AuthScheme=APIKey;APIKey='<your key>'"
cdatacli connection create --driver Salesforce --name salesforce \
--connectionstring "AuthScheme=OAuth;InitiateOAuth=GETANDREFRESH"
cdatacli connection create --driver "Google BigQuery" --name bigquery \
--connectionstring "AuthScheme=OAuth;InitiateOAuth=GETANDREFRESH;ProjectId=<project>;ReadOnly=true"
# Explore the Linear schema
cdatacli metadata tables --connection linear
cdatacli metadata columns --connection linear --table Issue
次のクエリ 1 本で、ロードマップ項目とそのワークフローステータス、担当チームを取得できます。number によるフィルターで API 側のリクエストを絞り込み、identifier で対象の Issue を正確に特定しています。
SELECT i.[identifier], i.[title], i.[priorityLabel], s.[name] AS stateName, t.[name] AS teamName
FROM [Issue] i
INNER JOIN [WorkflowState] s ON i.[stateId] = s.[id]
INNER JOIN [Team] t ON i.[teamId] = t.[id]
WHERE i.[number] IN (5) AND i.[identifier] IN ('GRA-5')
identifier title priorityLabel stateName teamName
GRA-5 CData CLI: Show a clear error when the installed Java version Medium In Progress Graphql-test
ラベルは中間テーブルから、変更履歴は子テーブルから取得します。
SELECT l.[name]
FROM [IssueLabels] il
INNER JOIN [IssueLabel] l ON il.[issueLabelId] = l.[id]
WHERE il.[issueId] = '<issue id>'
SELECT h.[createdAt], fs.[name] AS fromState, ts.[name] AS toState
FROM [IssueHistory] h
LEFT JOIN [WorkflowState] fs ON h.[fromStateId] = fs.[id]
LEFT JOIN [WorkflowState] ts ON h.[toStateId] = ts.[id]
WHERE h.[issueId] = '<issue id>' AND h.[toStateId] IS NOT NULL
結合の相手側となる Salesforce のケースや BigQuery の利用状況の集計も、通常の SQL で取得できます。
-- Salesforce: the customer request
SELECT [Status], [Priority], [Type], [Origin], [IsClosed], [CreatedDate], [ClosedDate]
FROM [Case] WHERE [Id] = '<case id>'
-- BigQuery: daily product activity
SELECT CAST([Time] AS DATE) AS usageDate, SUM([QueryCount]) AS queries, COUNT(DISTINCT [NodeID]) AS installs
FROM [Telemetry].[Usage]
WHERE [Process] = 'com.cdata.product' AND [Time] >= '2026-08-06'
GROUP BY CAST([Time] AS DATE)
ステップ 2:ダッシュボードを構築する
クエリの検証が済んだら、エージェントは同じ JDBC ドライバーを使って Java のダッシュボードを構築しました。ダッシュボードは 5 つのビューで構成されています。
ダッシュボードでは、マッピングファイル links.csv を介して、各 Salesforce ケースを対応する Linear の Issue と結合しています。
注意:本番環境では、この紐づけを Salesforce または Linear に保存しておくと、すべてのレポートで活用できます。
ポートフォリオ KPI(重要業績評価指標)には、追跡中のロードマップ項目数(リリース済み・未リリース)、紐づいた顧客の要望数とそのうち未解決の件数、顧客が最初に要望を出してから Linear の Issue が作成されるまでの日数の中央値、リリース済み項目のうち利用状況を検証できた件数、そして未リリースの項目の中で最も長く待たされている項目が表示されます。
追跡中のロードマップ項目は、Linear の Issue ごとに 1 行で表示される、並べ替えやフィルタリングが可能なテーブルです。ワークフローステータス、優先度、要望数、未解決の要望数、最も古い未解決の要望の経過日数、要望からロードマップ登録までの日数、直近 7 日間の 1 日あたりの平均利用状況、検証ステータスが表示されます。行を選択すると、その項目の詳細ビューが開きます。

ロードマップ項目(Linear)には、Issue の担当チーム、優先度、ラベルが表示されます。また、チームの WorkflowState の行をボード上の順序で並べたパイプラインを描画し、現在のステータスをハイライト表示します。さらに、IssueHistory のステータス変更と Comment の行を統合したタイムラインも表示されます。
顧客の要望(Salesforce)には、紐づいた各ケースが、ステータス、優先度、種別、発生元、オープン日時とクローズ日時とともに一覧表示されます。今回の例のケースは、顧客が Java をアップグレードしたことで、オープンから 9 日後にクローズされました。

利用状況の検証(BigQuery)では、製品テレメトリから 1 日あたりのアクティブインストール数をグラフ化します。修正のリリース後も、利用状況が維持されているかどうかを引き続きモニタリングできます。

技術スタックの概要
| 構成要素 | 役割 |
|---|---|
| CData JDBC Driver for Linear | Linear の GraphQL API を SQL テーブルに変換し、ロードマップ項目、ワークフロー、履歴、コメントを読み取るほか、コメントの書き戻しも行う |
| CData JDBC Driver for Salesforce | 各項目に紐づく顧客のケースを読み取る |
| CData JDBC Driver for Google BigQuery | 製品テレメトリを読み取り、リリース済み項目を検証する |
| CData CLI | 事前に接続のテスト、スキーマの参照、クエリの試行を行う |
| Java 17 | JDK(Java Development Kit)に組み込まれた HTTP(Hypertext Transfer Protocol)サーバーを使い、ビルドツールやフレームワークなしで単一のソースファイルとしてアプリを実行する |
| Chart.js | ブラウザ上で利用状況のグラフを描画する |
バックエンドは数百行程度の Java コードです。認証、ページネーション、クエリのプッシュダウン、SQL による書き込みの API 呼び出しへの変換は、ドライバーが処理します。アプリは 3 つのデータソースへのクエリを並列で実行し、最新の結果をローカルの JSON(JavaScript Object Notation)ファイルにキャッシュします。そのため、ページはキャッシュから読み込まれ、1 つのデータソースで障害が発生しても、ほかのデータソースの表示が消えることはありません。
CData で Linear のロードマップレポートをもっとシンプルに
CData Driver for Linear を使えば、API キーまたは OAuth で接続し、Issue、プロジェクト、イニシアチブ、サイクル、顧客、履歴に対して標準 SQL を実行できます。ドライバーはフィルター、LIMIT、中間テーブルとの結合を Linear 側にプッシュダウンし、ページネーションや複雑度制限にも対応します。さらに、INSERT、UPDATE、DELETE を Linear 独自のミューテーションにマッピングするため、ロードマップを読み取る接続を使ってそのまま書き込みも行えます。ほかの CData ドライバーと同じように動作するため、Linear のデータを数百種類のデータソースと結合でき、チームがすでに使っている言語や BI ツールから利用できます。今回の例では、Linear、Salesforce、BigQuery の各ドライバーを使って、顧客の要望、それに対応するロードマップ項目、製品の利用状況を 1 つのダッシュボードにまとめました。
CData Driver for Linear の無料トライアルを開始して、Linear API キーで接続し、Issue テーブルに最初のクエリを実行してみてください。