Linear

プロジェクト管理チケット管理課題追跡開発チーム高速モダン

プロジェクト管理ツール

Linear

概要

Linearは開発チーム向けに特化した高速なイシュー追跡ツールです。スプリント管理、プロダクトロードマップ、バグ追跡を統合し、シンプルなUXと高いパフォーマンスを特徴としています。従来のプロジェクト管理ツールの複雑さを排除し、開発者が本当に必要とする機能に焦点を当てた設計となっています。

詳細

Linearは現代的なソフトウェア開発チームのニーズに応えるために設計されており、高速な動作とクリーンなインターフェースを重視しています。GitHubやSlackなどの開発ツールとの深い統合により、開発ワークフローを中断することなく課題管理を行えます。

主な特徴

  • 高速なパフォーマンス: 瞬時のページロードと反応の良いインターフェース
  • モダンなUX: 直感的で美しいデザインと優れたユーザビリティ
  • 強力な統合: GitHub、GitLab、Slack、Figma、Zapierなどとの統合
  • AI機能: 自動的な課題分類とスマートな提案機能
  • トライアージ機能: 効率的な課題の優先度付けと分類
  • ロードマップ管理: 視覚的なプロダクトロードマップ作成
  • API-first設計: GraphQL APIによる柔軟な自動化とカスタマイズ

対象チーム

  • ソフトウェア開発チーム
  • プロダクトチーム
  • スタートアップから大企業まで
  • アジャイル・スクラム開発チーム

メリット・デメリット

メリット

  • 驚異的な動作速度と応答性
  • 開発者フレンドリーなインターフェース設計
  • 強力なGitHubとの双方向同期機能
  • キーボードショートカットによる高効率操作
  • シンプルで直感的なワークフロー設定
  • 優れたモバイルアプリとオフライン対応

デメリット

  • 機能がシンプルで複雑なプロジェクト管理には不向き
  • カスタマイズオプションが限定的
  • 非技術チームには機能が不足する場合がある
  • 他の企業ツールとの統合が限定的
  • 大規模な組織向けの管理機能が不足
  • 日本語対応が不完全

参考ページ

書き方の例

基本セットアップ

# Linear CLIのインストール
npm install -g @linear/cli

# 認証の設定
linear auth

# プロジェクトの初期化
linear init

# 設定の確認
linear config

プロジェクト作成

// Linear GraphQL API - チーム作成
import { LinearClient } from '@linear/sdk';

const linear = new LinearClient({
  apiKey: process.env.LINEAR_API_KEY
});

// 新しいチーム作成
const teamCreateResponse = await linear.createTeam({
  name: "Product Team",
  key: "PROD",
  description: "プロダクト開発チーム",
  private: false,
  autoArchivePeriod: 3,
  autoCloseStateId: "completed-state-id"
});

// プロジェクト作成
const projectCreateResponse = await linear.createProject({
  name: "Mobile App v2.0",
  description: "モバイルアプリの次期バージョン開発",
  teamIds: [teamCreateResponse.team?.id],
  targetDate: new Date('2024-12-31'),
  state: "planned"
});

課題管理

// 課題の作成
const issueCreateResponse = await linear.createIssue({
  title: "ユーザー認証機能の実装",
  description: `
    ## 要件
    - OAuth 2.0による認証
    - JWT トークンでのセッション管理
    - 多要素認証サポート
    
    ## 受け入れ条件
    - [ ] ログイン/ログアウト機能
    - [ ] パスワードリセット機能
    - [ ] プロフィール管理画面
  `,
  teamId: "team-id",
  assigneeId: "user-id",
  priorityLevel: 1, // 0: No priority, 1: Urgent, 2: High, 3: Medium, 4: Low
  labelIds: ["backend-label-id", "security-label-id"],
  projectId: "project-id",
  estimate: 5 // ストーリーポイント
});

// 課題の更新
const issueUpdateResponse = await linear.updateIssue(issueId, {
  stateId: "in-progress-state-id",
  assigneeId: "new-assignee-id",
  priorityLevel: 2,
  estimate: 8
});

// サブ課題の作成
const subIssueResponse = await linear.createIssue({
  title: "OAuthプロバイダーの実装",
  teamId: "team-id",
  parentId: issueCreateResponse.issue?.id
});

ワークフロー設定

// カスタムワークフロー状態の作成
const workflowStateResponse = await linear.createWorkflowState({
  name: "Design Review",
  description: "デザインレビューが必要な状態",
  color: "#f59e0b",
  teamId: "team-id",
  type: "started", // backlog, unstarted, started, completed, canceled
  position: 2
});

// ラベルの作成
const labelResponse = await linear.createIssueLabel({
  name: "Bug",
  description: "バグレポート",
  color: "#ef4444",
  teamId: "team-id"
});

// カスタムビューの作成
const customViewResponse = await linear.createCustomView({
  name: "今週のタスク",
  description: "今週に予定されているタスク一覧",
  filters: {
    and: [
      { assignee: { id: { eq: "user-id" } } },
      { dueDate: { gte: new Date() } },
      { state: { type: { neq: "completed" } } }
    ]
  },
  teamId: "team-id"
});

レポート機能

// チームの課題統計取得
const teamStats = await linear.team("team-id").issues({
  filter: {
    completedAt: {
      gte: new Date(Date.now() - 30 * 24 * 60 * 60 * 1000) // 過去30日
    }
  }
});

// 進行中の課題を取得
const activeIssues = await linear.issues({
  filter: {
    and: [
      { team: { key: { eq: "PROD" } } },
      { state: { type: { eq: "started" } } }
    ]
  },
  orderBy: [{ priority: "ASC" }, { updatedAt: "DESC" }]
});

// サイクル(スプリント)の進捗取得
const cycle = await linear.cycle("cycle-id");
const cycleIssues = await cycle.issues();
const completedCount = cycleIssues.nodes.filter(issue => 
  issue.state.type === "completed"
).length;

console.log(`サイクル進捗: ${completedCount}/${cycleIssues.nodes.length}`);

チーム連携

// Slackとの統合
const slackIntegrationResponse = await linear.createIntegration({
  service: "slack",
  organizationId: "org-id",
  settings: {
    webhookUrl: "https://hooks.slack.com/services/...",
    channel: "#development",
    events: ["issueCreate", "issueUpdate", "issueComplete"]
  }
});

// GitHubとの同期設定
const githubSyncResponse = await linear.createGithubIntegration({
  repositoryUrl: "https://github.com/company/repo",
  settings: {
    autoCloseIssues: true,
    branchNaming: "linear-{issueNumber}-{title-kebab}",
    prTemplate: `
      Closes Linear Issue: {issueUrl}
      
      ## Changes
      {description}
      
      ## Testing
      - [ ] Unit tests pass
      - [ ] Integration tests pass
    `
  }
});

// Webhookの設定
const webhookResponse = await linear.createWebhook({
  url: "https://api.company.com/webhooks/linear",
  resourceTypes: ["Issue", "Project", "Comment"],
  enabled: true,
  secret: "webhook-secret"
});