linear について
linearは、Symphonyのapp-serverセッションでLinear GraphQLを直接操作するスキルです。Linearデータを扱う人向けに、セッション設定済みの認証を使い、Issueやコメント、添付ファイルの管理とスキーマ確認を行えます。
主な機能
- 01範囲を絞ったGraphQLクエリとミューテーション
- 02キーや識別子によるIssue検索
- 03Issueの状態とコメントの更新
- 04GitHub PRとURLのリンク
- 05GraphQLスキーマ操作の確認
活用シーン
- 01Symphonyセッション中のIssue詳細の検索
- 02チームの状態を確認してからIssueを移動
- 03コメントや添付ファイルの追加・編集
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ openai/ symphony --skill linearインストール後、Claude Code で/linearを入力して読み込まれたか確認します。
詳細
Linear GraphQL
Symphony の app-server セッション中に、Linear GraphQL を直接操作する場合にこのスキルを使用します。
主なツール
Symphony の app-server セッションで提供される linear_graphql クライアントツールを使用します。
このツールは、セッション用に Symphony で設定された Linear 認証を再利用します。
ツールの入力:
{
"query": "query or mutation document",
"variables": {
"optional": "graphql variables object"
}
}
ツールの動作:
- 1 回のツール呼び出しにつき、GraphQL オペレーションを 1 つ送信します。
- トップレベルの
errors配列がある場合は、ツール呼び出し自体が完了していても、GraphQL オペレーションは失敗したものとして扱います。 - クエリとミューテーションの対象を絞り、必要なフィールドのみを指定します。
不慣れなオペレーションの確認
不慣れなミューテーション、入力型、オブジェクトのフィールドが必要な場合は、linear_graphql を使って対象を絞ったイントロスペクションを行います。
ミューテーション名の一覧:
query ListMutations {
__type(name: "Mutation") {
fields {
name
}
}
}
特定の入力オブジェクトの確認:
query CommentCreateInputShape {
__type(name: "CommentCreateInput") {
inputFields {
name
type {
kind
name
ofType {
kind
name
}
}
}
}
}
一般的なワークフロー
キー、識別子、または ID でイシューをクエリする
次の順に試します。
MT-686のようなチケットキーがある場合は、issue(id: $key)から始めます。- 識別子による検索が必要な場合は、
issues(filter: ...)に切り替えます。 - 内部イシュー ID を取得したら、対象を絞って読み取るため、
issue(id: $id)を優先します。
イシューキーで検索:
query IssueByKey($key: String!) {
issue(id: $key) {
id
identifier
title
state {
id
name
type
}
project {
id
name
}
branchName
url
description
updatedAt
links {
nodes {
id
url
title
}
}
}
}
識別子フィルターで検索:
query IssueByIdentifier($identifier: String!) {
issues(filter: { identifier: { eq: $identifier } }, first: 1) {
nodes {
id
identifier
title
state {
id
name
type
}
project {
id
name
}
branchName
url
description
updatedAt
}
}
}
キーを内部 ID に解決:
query IssueByIdOrKey($id: String!) {
issue(id: $id) {
id
identifier
title
}
}
内部 ID が分かった後にイシューを読み取る:
query IssueDetails($id: String!) {
issue(id: $id) {
id
identifier
title
url
description
state {
id
name
type
}
project {
id
name
}
attachments {
nodes {
id
title
url
sourceType
}
}
}
}
イシューのチームワークフロー状態をクエリする
イシューの状態を変更する際に正確な stateId が必要な場合は、変更前にこれを使用します。
query IssueTeamStates($id: String!) {
issue(id: $id) {
id
team {
id
key
name
states {
nodes {
id
name
type
}
}
}
}
}
既存のコメントを編集する
linear_graphql を通じて commentUpdate を使用します。
mutation UpdateComment($id: String!, $body: String!) {
commentUpdate(id: $id, input: { body: $body }) {
success
comment {
id
body
}
}
}
コメントを作成する
linear_graphql を通じて commentCreate を使用します。
mutation CreateComment($issueId: String!, $body: String!) {
commentCreate(input: { issueId: $issueId, body: $body }) {
success
comment {
id
url
}
}
}
イシューを別の状態に移動する
移動先の stateId を指定して issueUpdate を使用します。
mutation MoveIssueToState($id: String!, $stateId: String!) {
issueUpdate(id: $id, input: { stateId: $stateId }) {
success
issue {
id
identifier
state {
id
name
}
}
}
}
GitHub PR をイシューに添付する
PR をリンクする場合は、GitHub 固有の添付ミューテーションを使用します。
mutation AttachGitHubPR($issueId: String!, $url: String!, $title: String) {
attachmentLinkGitHubPR(
issueId: $issueId
url: $url
title: $title
linkKind: links
) {
success
attachment {
id
title
url
}
}
}
通常の URL 添付でよく、GitHub 固有のリンクメタデータが不要な場合は、次を使用します。
mutation AttachURL($issueId: String!, $url: String!, $title: String) {
attachmentLinkURL(issueId: $issueId, url: $url, title: $title) {
success
attachment {
id
title
url
}
}
}
スキーマの確認で使用するイントロスペクションのパターン
正確なフィールドやミューテーションの形式が不明な場合は、次を使用します。
query QueryFields {
__type(name: "Query") {
fields {
name
}
}
}
query IssueFieldArgs {
__type(name: "Query") {
fields {
name
args {
name
type {
kind
name
ofType {
kind
name
ofType {
kind
name
}
}
}
}
}
}
}
コメントに動画をアップロードする
次の 3 つの手順で行います。
fileUploadを使ってlinear_graphqlを呼び出し、uploadUrl、assetUrl、必要なアップロードヘッダーを取得します。fileUploadから返されたヘッダーをそのまま指定し、curl -X PUTでローカルファイルのバイトデータをuploadUrlにアップロードします。commentCreate(またはcommentUpdate)を使ってlinear_graphqlを再度呼び出し、コメント本文に取得したassetUrlを含めます。
使用するミューテーション:
mutation FileUpload(
$filename: String!
$contentType: String!
$size: Int!
$makePublic: Boolean
) {
fileUpload(
filename: $filename
contentType: $contentType
size: $size
makePublic: $makePublic
) {
success
uploadFile {
uploadUrl
assetUrl
headers {
key
value
}
}
}
}
使用ルール
- コメントの編集、アップロード、アドホックな Linear API クエリには
linear_graphqlを使用します。 - すでに把握している情報に合致するものの中で、最も対象を絞ったイシュー検索方法を優先します。 キー -> 識別子検索 -> 内部 ID の順に試します。
- 状態を遷移させる場合は、まずチームの状態を取得し、ミューテーション内で状態名をハードコードせず、正確な
stateIdを使用します。 - GitHub PR を Linear イシューにリンクする場合は、汎用 URL 添付より
attachmentLinkGitHubPRを優先します。 - GraphQL アクセス用に、新たな生トークンを使うシェルヘルパーを追加しないでください。
- アップロードでシェルを使う必要がある場合は、
fileUploadから返された署名付きアップロード URL に限って使用してください。これらの URL には、必要な認証情報がすでに含まれています。