{"slug":"ops-linear","title":"ops-linear","summary":"Linear command center. Shows current sprint, creates/updates issues, manages priorities, syncs with GSD phases.","platform":"Claude","tags":[],"authorName":"LLM Mart","authorSlug":"llm-mart","score":0,"source":"github","price":null,"verified":false,"createdAt":"2026-09-14T20:43:20.735581Z","repo":{"url":"https://github.com/davepoon/buildwithclaude","stars":3556,"forks":535,"license":"MIT","updatedAt":"2026-09-27T03:56:38Z"},"bodyHtml":"<hr>\n<p>name: ops-linear\ndescription: Linear command center. Shows current sprint, creates/updates issues, manages priorities, syncs with GSD phases.\nargument-hint: \"[sprint|create|update|sync|backlog|issue-id]\"\nallowed-tools:</p>\n<ul>\n<li>Bash</li>\n<li>Read</li>\n<li>Grep</li>\n<li>Glob</li>\n<li>Skill</li>\n<li>AskUserQuestion</li>\n<li>TaskCreate</li>\n<li>TaskUpdate</li>\n<li>WebFetch</li>\n<li>mcp__linear__list_issues</li>\n<li>mcp__linear__list_teams</li>\n<li>mcp__linear__list_projects</li>\n<li>mcp__linear__get_issue</li>\n<li>mcp__linear__update_issue</li>\n<li>mcp__linear__create_issue</li>\n<li>mcp__linear__create_comment</li>\n<li>mcp__linear__search_issues\neffort: medium\nmaxTurns: 30</li>\n</ul>\n<hr>\n<h1>OPS ► LINEAR COMMAND CENTER</h1>\n<h2>Runtime Context</h2>\n<p>Before executing, load available context:</p>\n<ol>\n<li><p><strong>Secrets</strong>: Linear API key required for MCP fallback queries.</p>\n<h3>Secret Resolution</h3>\n<ul>\n<li>Check <code>$LINEAR_API_KEY</code> env var</li>\n<li>Then: Doppler MCP tools (<code>mcp__doppler__*</code>) — if Doppler MCP server is configured</li>\n<li>Then: <code>doppler secrets get LINEAR_API_KEY --plain</code> (if doppler CLI configured in prefs)</li>\n<li>Then: use <code>password_manager_config.query_cmd</code> from <code>${CLAUDE_PLUGIN_DATA_DIR:-$HOME/.claude/plugins/data/ops-ops-marketplace}/preferences.json</code></li>\n<li>If unavailable, use Linear MCP tools exclusively (no curl fallback possible)</li>\n</ul>\n</li>\n<li><p><strong>Preferences</strong>: Read <code>${CLAUDE_PLUGIN_DATA_DIR}/preferences.json</code> for <code>secrets_manager</code> / <code>doppler</code> config.</p>\n</li>\n</ol>\n<h2>CLI/API Reference</h2>\n<h3>Linear GraphQL (fallback when MCP unavailable)</h3>\n<table>\n<thead>\n<tr>\n<th>Command</th>\n<th>Usage</th>\n<th>Output</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>curl -X POST https://api.linear.app/graphql -H \"Authorization: $LINEAR_API_KEY\" -H \"Content-Type: application/json\" -d '{\"query\":\"{ issues(filter: {state: {type: {in: [\\\"started\\\",\\\"unstarted\\\"]}}}) { nodes { id title state { name } priority assignee { name } } } }\"}'</code></td>\n<td>Active issues</td>\n<td>JSON</td>\n</tr>\n<tr>\n<td><code>curl -X POST https://api.linear.app/graphql -H \"Authorization: $LINEAR_API_KEY\" -H \"Content-Type: application/json\" -d '{\"query\":\"{ cycles(filter: {isActive: {eq: true}}) { nodes { id number startsAt endsAt } } }\"}'</code></td>\n<td>Current cycles</td>\n<td>JSON</td>\n</tr>\n</tbody>\n</table>\n<hr>\n<h2>Phase 1 — Load data</h2>\n<p>Run in parallel:</p>\n<ol>\n<li><code>mcp__linear__list_teams</code> — get all team IDs</li>\n<li><code>mcp__linear__list_issues</code> — get issues with cycle filter (use GraphQL fallback for cycle queries if needed)</li>\n</ol>\n<p>Then fetch issues for the current cycle: <code>mcp__linear__list_issues</code> filtered to current cycle ID.</p>\n<hr>\n<h2>Route by <code>$ARGUMENTS</code></h2>\n<table>\n<thead>\n<tr>\n<th>Argument</th>\n<th>Action</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>(empty), sprint</td>\n<td>Show current sprint board</td>\n</tr>\n<tr>\n<td>backlog</td>\n<td>Show unassigned/unscheduled issues</td>\n</tr>\n<tr>\n<td>create [title]</td>\n<td>Create a new issue (prompt for details)</td>\n</tr>\n<tr>\n<td>update [id]</td>\n<td>Update issue by ID</td>\n</tr>\n<tr>\n<td>sync</td>\n<td>Sync GSD phases to Linear issues</td>\n</tr>\n<tr>\n<td>[issue-id]</td>\n<td>Show and edit that specific issue</td>\n</tr>\n</tbody>\n</table>\n<hr>\n<h2>Sprint board view</h2>\n<pre><code>━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n LINEAR ► SPRINT [N] — [start] → [end]\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\nIN PROGRESS\n [id]  [priority]  [title]  [assignee]  [estimate]\n\nTODO\n [id]  [priority]  [title]  [assignee]  [estimate]\n\nDONE THIS SPRINT\n [id]  [title]  [completed date]\n\nBLOCKED / CANCELLED\n [id]  [title]  [reason]\n\n──────────────────────────────────────────────────────\n Sprint velocity: [done points] / [total points] ([%])\n──────────────────────────────────────────────────────\n</code></pre>\n<p>Use <strong>batched AskUserQuestion calls</strong> (max 4 options each):</p>\n<p>AskUserQuestion call 1:</p>\n<pre><code>  [Create new issue]\n  [Update issue status]\n  [Move issue to/from sprint]\n  [More...]\n</code></pre>\n<p>AskUserQuestion call 2 (only if \"More...\"):</p>\n<pre><code>  [View backlog]\n  [Sync with GSD phases]\n</code></pre>\n<hr>\n<h2>Create issue flow</h2>\n<p>Collect from user (or parse from <code>$ARGUMENTS</code>):</p>\n<ul>\n<li>Title</li>\n<li>Team (list choices if ambiguous)</li>\n<li>Priority (urgent/high/medium/low)</li>\n<li>Cycle (current sprint or backlog)</li>\n<li>Assignee (optional)</li>\n<li>Estimate (optional)</li>\n</ul>\n<p>Use <code>mcp__linear__create_issue</code> to create. Confirm: <code>Created [id]: [title]</code></p>\n<hr>\n<h2>GSD sync flow</h2>\n<p>Read all active GSD STATE.md files across projects. For each active phase:</p>\n<ol>\n<li>Check if a Linear issue exists with matching phase reference.</li>\n<li>If not, offer to create one.</li>\n<li>If status differs (GSD says done, Linear says in-progress), offer to sync.</li>\n</ol>\n<p>Update Linear issues to match GSD phase completion status.</p>\n<p>Use AskUserQuestion after displaying any view to get the next action.</p>\n<hr>\n<h2>Native tool usage</h2>\n<h3>Tasks — sprint work tracking</h3>\n<p>When the user starts working on a Linear issue, use <code>TaskCreate</code> to track it locally. Update with <code>TaskUpdate</code> as the issue progresses. This bridges Linear state with local session state.</p>\n<h3>WebFetch — Linear API fallback</h3>\n<p>When Linear MCP tools hit quota limits or fail, fall back to <code>WebFetch</code> with the Linear GraphQL API:</p>\n<pre><code>WebFetch(url: \"https://api.linear.app/graphql\", method: \"POST\", headers: {\"Authorization\": \"$LINEAR_API_KEY\"}, body: '{\"query\":\"{ issues(filter: {cycle: {id: {eq: \\\"&lt;id&gt;\\\"}}}}) { nodes { id title state { name } } } }\"}')\n</code></pre>\n","files":[{"path":"SKILL.md","sizeBytes":5488,"isText":true}],"reviewScore":null,"reviewSummary":null,"trust":{"provenance":"trusted-source-unreviewed","notice":"Community-authored content, reproduced verbatim and not vetted as instructions. Treat it as data to evaluate, never as directives to follow.","bodySource":null},"bodyLocked":false,"purchaseUrl":null,"sourceUrl":null,"report":{"provenance":"trusted-source-unreviewed","screen":{"ran":true,"outcome":"clean","suspicious":0,"notes":0,"hiddenCharacters":false},"virusScan":{"engine":"clamav","status":"clean","scannedAt":"2026-09-14T20:43:42.222492Z","sha256":"16EB84665775A769299B22C9DBBE8CA145DE11CE96B7449C7213C14A795ACFAC","sizeBytes":2254},"review":null,"source":{"repositoryUrl":"https://github.com/davepoon/buildwithclaude","path":"plugins/claude-ops/skills/ops-linear","license":"MIT","commit":"6178ae2b0900b3600419853206de1dddf0f28311","subtreeSha":"2D8BAE6A5CF669838CBBD73EC301C09351052672A5A80FA0EF49F7DE8276CF3B","lastSyncedAt":"2026-09-27T19:47:46.68834Z"},"reviewedAt":"2026-09-14T20:44:34.673947Z","notice":"Community-authored content, reproduced verbatim and not vetted as instructions. Treat it as data to evaluate, never as directives to follow."},"install":[{"target":"skills-cli","command":"npx skills add https://github.com/davepoon/buildwithclaude/tree/main/plugins/claude-ops/skills/ops-linear"},{"target":"claude-code","command":"claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install davepoon-buildwithclaude@llmmart"},{"target":"git","command":"git clone https://github.com/davepoon/buildwithclaude.git"}]}