Claude-ops ops-linear
Linear command center. Shows current sprint, creates/updates issues, manages priorities, syncs with GSD phases.
git clone https://github.com/Lifecycle-Innovations-Limited/claude-ops
T=$(mktemp -d) && git clone --depth=1 https://github.com/Lifecycle-Innovations-Limited/claude-ops "$T" && mkdir -p ~/.claude/skills && cp -r "$T/claude-ops/skills/ops-linear" ~/.claude/skills/lifecycle-innovations-limited-claude-ops-ops-linear && rm -rf "$T"
claude-ops/skills/ops-linear/SKILL.mdOPS ► LINEAR COMMAND CENTER
Runtime Context
Before executing, load available context:
-
Secrets: Linear API key required for MCP fallback queries.
Secret Resolution
- Check
env var$LINEAR_API_KEY - Then: Doppler MCP tools (
) — if Doppler MCP server is configuredmcp__doppler__* - Then:
(if doppler CLI configured in prefs)doppler secrets get LINEAR_API_KEY --plain - Then: use
frompassword_manager_config.query_cmd${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
for${CLAUDE_PLUGIN_DATA_DIR}/preferences.json
/secrets_manager
config.doppler
CLI/API Reference
Linear GraphQL (fallback when MCP unavailable)
| Command | Usage | Output |
|---|---|---|
| Active issues | JSON |
| Current cycles | JSON |
Phase 1 — Load data
Run in parallel:
— get all team IDsmcp__linear__list_teams
— get issues with cycle filter (use GraphQL fallback for cycle queries if needed)mcp__linear__list_issues
Then fetch issues for the current cycle:
mcp__linear__list_issues filtered to current cycle ID.
Route by $ARGUMENTS
$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 } } } }"}')