Claude Cursor Skill

ops-linear

Linear command center. Shows current sprint, creates/updates issues, manages priorities, syncs with GSD phases.

LLM Mart · 0 points · 3 views 0 listing impressions 0 install-command copies
Virus-scanned Reviewed automatically before listing.

Full trust report

Download davepoon-buildwithclaude-plugins_claude-ops_skills_ops-linear-a6c484b.zip · 2 KB
Part of davepoon/buildwithclaude — 187 skills

Install

skills CLI npx skills add https://github.com/davepoon/buildwithclaude/tree/main/plugins/claude-ops/skills/ops-linear
Claude Code claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install davepoon-buildwithclaude@llmmart
Git git clone https://github.com/davepoon/buildwithclaude.git

The skills CLI installs just this skill, for any of its supported agents. Claude Code installs the whole davepoon/buildwithclaude collection as a plugin from our marketplace. Git is the plain clone.

Skill manifest

OPS ► LINEAR COMMAND CENTER

Runtime Context

Before executing, load available context:

  1. Secrets: Linear API key required for MCP fallback queries.

    Secret Resolution

    • Check $LINEAR_API_KEY env 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_cmd from ${CLAUDE_PLUGIN_DATA_DIR:-$HOME/.claude/plugins/data/ops-ops-marketplace}/preferences.json
    • If unavailable, use Linear MCP tools exclusively (no curl fallback possible)
  2. Preferences: Read ${CLAUDE_PLUGIN_DATA_DIR}/preferences.json for secrets_manager / doppler config.

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:

  1. mcp__linear__list_teams — get all team IDs
  2. mcp__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:

  1. Check if a Linear issue exists with matching phase reference.
  2. If not, offer to create one.
  3. 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 } } } }"}')
Files (buildwithclaude)
  • SKILL.md 5.4 KB
    ---
    name: ops-linear
    description: Linear command center. Shows current sprint, creates/updates issues, manages priorities, syncs with GSD phases.
    argument-hint: "[sprint|create|update|sync|backlog|issue-id]"
    allowed-tools:
      - Bash
      - Read
      - Grep
      - Glob
      - Skill
      - AskUserQuestion
      - TaskCreate
      - TaskUpdate
      - WebFetch
      - mcp__linear__list_issues
      - mcp__linear__list_teams
      - mcp__linear__list_projects
      - mcp__linear__get_issue
      - mcp__linear__update_issue
      - mcp__linear__create_issue
      - mcp__linear__create_comment
      - mcp__linear__search_issues
    effort: medium
    maxTurns: 30
    ---
    
    # OPS ► LINEAR COMMAND CENTER
    
    ## Runtime Context
    
    Before executing, load available context:
    
    1. **Secrets**: Linear API key required for MCP fallback queries.
       ### Secret Resolution
       - Check `$LINEAR_API_KEY` env 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_cmd` from `${CLAUDE_PLUGIN_DATA_DIR:-$HOME/.claude/plugins/data/ops-ops-marketplace}/preferences.json`
       - If unavailable, use Linear MCP tools exclusively (no curl fallback possible)
    
    2. **Preferences**: Read `${CLAUDE_PLUGIN_DATA_DIR}/preferences.json` for `secrets_manager` / `doppler` config.
    
    ## 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:
    
    1. `mcp__linear__list_teams` — get all team IDs
    2. `mcp__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:
    
    1. Check if a Linear issue exists with matching phase reference.
    2. If not, offer to create one.
    3. 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 } } } }"}')
    ```
    

Comments (0)

Sign in to join the conversation.

No comments yet.

Reviews (0)

No reviews yet.

Related