Skip to content
Back to skills

Ops Linear

ASecurity

OPS on-demand: This skill should be used when the user asks to \"linear sprint\", \"create a ticket\", or…

  • 538 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added May 27, 2026
data-aibashnodeapi

Works with

  • cli
  • api
  • mcp

Security analysis

A100/100

Scanned September 24, 2026

npx -y skills add Lifecycle-Innovations-Limited/claude-ops --skill ops-linear --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Ops Linear?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Ops Linear
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/lifecycle-innovations-limited-ops-linear/badge)](https://www.skillsdirectory.com/skills/lifecycle-innovations-limited-ops-linear)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: ops-linear
description: "OPS on-demand: This skill should be used when the user asks to \"linear sprint\", \"create a ticket\", or…"
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

Load `ops-rules` before acting. Public repo (no personal data). Outbound: one draft → one approval → one send. If `AskUserQuestion` / `Workflow` are missing, follow Rule 10 in `ops-rules` (Hermes: numbered options / two-turn Telegram card; `delegate_task`).

## 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 } } } }"}')
```

---

## Ledger Integration

**CLAIM_KEY:** `linear:issue:<identifier>` (e.g. `linear:issue:<TEAM>-123`)

### Pre-flight skip-check

```bash
CLAIM_KEY="linear:issue:<identifier>"
ledger query --claim-key "$CLAIM_KEY" --since=-PT24H
```

If `in_progress` or `done` exists, skip — another session or Perplexity already
acted on this issue. Surface `awaiting_user` entries as "update already staged."

### Claim + resolve

```bash
# Claim when creating, updating, or triaging a Linear issue
ledger write \
  --claim-key "$CLAIM_KEY" \
  --kind "file" \
  --status "in_progress" \
  --title "Linear: <identifier> — <title>" \
  --ttl-sec 3600

# Resolve after Linear state is updated
ledger write \
  --claim-key "$CLAIM_KEY" \
  --kind "file" \
  --status "done" \
  --title "Linear: <identifier> — <title>" \
  --context "status→<new_state> | assignee→<assignee>"
```

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.