About ops-linear
ops-linear is a Claude skill for viewing and managing Linear issues, sprint boards, and backlog items. It also supports syncing active GSD phases with Linear issue status.
Key features
- 01View current sprint and backlog
- 02Create and update Linear issues
- 03Move issues between cycles
- 04Sync GSD phases with Linear
- 05Use Linear MCP or GraphQL fallback
Use cases
- 01Review work planned for the current sprint
- 02Create or edit a Linear issue
- 03Align Linear issues with GSD phases
MCP support
Uses Linear MCP tools to list teams and issues and create issues. It can fall back to the Linear GraphQL API when MCP tools are unavailable or fail.
Install
Copy the command and run it in a terminal.
npx skills add https:/ / github.com/ davepoon/ buildwithclaude --skill ops-linearAfter installing, type/ops-linearin Claude Code to confirm it loaded.
Details
From the project READMEOPS ► LINEAR COMMAND CENTER
Runtime Context
Before executing, load available context:
-
Secrets: Linear API key required for MCP fallback queries.
Secret Resolution
- Check
$LINEAR_API_KEYenv var - Then: Doppler MCP tools (
mcp__doppler__*) — if Doppler MCP server is configured - Then:
doppler secrets get LINEAR_API_KEY --plain(if doppler CLI configured in prefs) - Then: use
password_manager_config.query_cmdfrom${CLAUDE_PLUGIN_DATA_DIR:-$HOME/.claude/plugins/data/ops-ops-marketplace}/preferences.json - If unavailable, use Linear MCP tools exclusively (no curl fallback possible)
- Check
-
Preferences: Read
${CLAUDE_PLUGIN_DATA_DIR}/preferences.jsonforsecrets_manager/dopplerconfig.
CLI/API Reference
Linear GraphQL (fallback when MCP unavailable)
| Command | Usage | Output |
|---|---|---|
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 } } } }"}' | Active issues | JSON |
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 } } }"}' | Current cycles | JSON |
Phase 1 — Load data
Run in parallel:
mcp__linear__list_teams— get all team IDsmcp__linear__list_issues— get issues with cycle filter (use GraphQL fallback for cycle queries if needed)
Then fetch issues for the current cycle: mcp__linear__list_issues filtered to current cycle ID.
Route by $ARGUMENTS
| Argument | Action |
|---|---|
| (empty), sprint | Show current sprint board |
| backlog | Show unassigned/unscheduled issues |
| create [title] | Create a new issue (prompt for details) |
| update [id] | Update issue by ID |
| sync | Sync GSD phases to Linear issues |
| [issue-id] | Show and edit that specific issue |
Sprint board view
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
LINEAR ► SPRINT [N] — [start] → [end]
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
IN PROGRESS
[id] [priority] [title] [assignee] [estimate]
TODO
[id] [priority] [title] [assignee] [estimate]
DONE THIS SPRINT
[id] [title] [completed date]
BLOCKED / CANCELLED
[id] [title] [reason]
──────────────────────────────────────────────────────
Sprint velocity: [done points] / [total points] ([%])
──────────────────────────────────────────────────────
Use batched AskUserQuestion calls (max 4 options each):
AskUserQuestion call 1:
[Create new issue]
[Update issue status]
[Move issue to/from sprint]
[More...]
AskUserQuestion call 2 (only if "More..."):
[View backlog]
[Sync with GSD phases]
Create issue flow
Collect from user (or parse from $ARGUMENTS):
- Title
- Team (list choices if ambiguous)
- Priority (urgent/high/medium/low)
- Cycle (current sprint or backlog)
- Assignee (optional)
- Estimate (optional)
Use mcp__linear__create_issue to create. Confirm: Created [id]: [title]
GSD sync flow
Read all active GSD STATE.md files across projects. For each active phase:
- Check if a Linear issue exists with matching phase reference.
- If not, offer to create one.
- If status differs (GSD says done, Linear says in-progress), offer to sync.
Update Linear issues to match GSD phase completion status.
Use AskUserQuestion after displaying any view to get the next action.
Native tool usage
Tasks — sprint work tracking
When the user starts working on a Linear issue, use TaskCreate to track it locally. Update with TaskUpdate as the issue progresses. This bridges Linear state with local session state.
WebFetch — Linear API fallback
When Linear MCP tools hit quota limits or fail, fall back to WebFetch with the Linear GraphQL API:
WebFetch(url: "https://api.linear.app/graphql", method: "POST", headers: {"Authorization": "$LINEAR_API_KEY"}, body: '{"query":"{ issues(filter: {cycle: {id: {eq: \"<id>\"}}}}) { nodes { id title state { name } } } }"}')