Linear Ops
Overview
Use this skill as the operating layer between messy conversation and structured
Linear work. Linear is the task source of truth; project documentation remains
the durable memory and decision layer.
Prefer the host's native Linear connector or Linear MCP tools when they are
available. If no live connection exists, produce a safe ticket draft or a
pre-filled linear.new URL and tell the user what authentication is needed.
The bundled helper is an optional local/read-only fallback; it never performs
Linear writes.
Authentication priority:
- Primary: use the host's authenticated Linear connector or MCP connection for
live reads and writes supported by the available tools.
- Secondary: use the bundled helper's read-only GraphQL commands only when
LINEAR_API_KEY is already present in the environment. Never ask the user to
paste a key into chat, read .env files, or persist the key.
- If neither path is available, stay in draft/specification mode and explain
what connection is needed.
Capability modes:
dry-run: no auth; render dashboard spec and ticket drafts.
prefilled URL: no auth; generate a linear.new URL the user can open/save.
live connector: an authenticated Linear connector or MCP connection is
available; search, dashboard, and writes follow the approval gates below.
live helper: LINEAR_API_KEY is available; the bundled helper can only
search, discover, and render dashboards. It cannot write.
Required Context
- If the project has a
.glue/linear-routing.yaml, read the nearest one before
creating, routing, or updating work. If no routing file exists, use explicit
team/project information and do not invent workspace-specific labels or
statuses. To start a new project configuration, copy
assets/linear-routing.example.yaml and replace every example value.
- If present, read
.glue/linear-seed-tickets.yaml when bootstrapping the
first backlog or rendering the local seed dashboard. Use
assets/linear-seed-tickets.example.yaml as a starting shape.
- Read
references/ticketing-policy.md when mapping conversational work into
ticket type, priority, queue, labels, or dashboard views.
- Read
references/linear-docs.md before configuring Linear, using API/MCP
fields, or answering questions about Linear capabilities.
Workflow
- Classify the request.
feature: new user/system capability.
bug: broken or regressed behavior.
chore: maintenance, cleanup, dependency, docs hygiene.
research: information gathering with an output.
spike: bounded technical uncertainty reduction.
decision: A designated decision-maker must choose among options.
ops: business/process/infrastructure coordination.
- Gather enough context.
- Use the current conversation first.
- Inspect relevant repo files when ticket scope, acceptance criteria, or labels
depend on actual code/state.
- Keep tickets outcome-oriented; do not turn every implementation detail into a
separate issue unless it can be worked independently.
- Route through
.glue/linear-routing.yaml when it exists.
- Match by repo path, domain keywords, and existing project names.
- Prefer the configured default team when no domain is clear.
- Put ambiguous items in the workspace's configured triage status; put
actionable items in its configured ready status; use the workspace's
equivalent of
Waiting for decision only when a decision is required.
- Search before create.
- Search Linear for similar open issues by title keywords, repo label, project,
and domain labels.
- If a likely duplicate exists, propose updating/commenting/linking it instead
of creating a new issue.
- If live access is unavailable, state that duplicate checking is pending.
- Draft the ticket.
- Include: title, type, project/team, status, priority, labels, summary,
context, scope, acceptance criteria, tasks/checklist, links, and open
questions.
- Use Markdown; Linear's editor supports Markdown-style content.
- Keep titles specific and imperative or outcome-based.
- Apply write policy.
- Normal issue creation from an explicit user request may be live once Linear is
connected and duplicate check is complete.
- Show a dry-run draft first when the request says "discussed", "the thing",
"all tasks", or otherwise depends heavily on implicit context.
- Ask before destructive or externally meaningful writes: archive/delete,
close work as done, mark urgent, commit public/customer promises, create many
issues/projects, or alter global workflow/labels.
- Update memory.
- Link Linear issue/project IDs from the project's configured durable state file
only when they affect active priorities or durable decisions.
- Do not mirror the backlog into Markdown.
Dashboard Workflow
When the user asks to view the dashboard:
- If Linear access exists, query issues/projects using the configured dashboard
views in
.glue/linear-routing.yaml. Filters within one view are combined
with AND; multiple views are combined with OR. The helper supports the
documented filter keys in the example routing file.
- Return a concise operating dashboard: active work, blocked/waiting items,
decisions needed from the user, stale work, and recently completed items.
- If Linear access is not connected, show the intended dashboard views from the
routing file and say live data requires Linear authentication.
Use the bundled scripts/linear_ops.py dashboard-spec --config .glue/linear-routing.yaml to render the configured dashboard plan locally when
a routing file exists. Use dashboard-live when LINEAR_API_KEY is exported;
this is read-only. Use the host's Linear connector or MCP for live writes.
Use dashboard-html when the user wants a local browser-viewable dashboard
artifact. Add --seed .glue/linear-seed-tickets.yaml to render the local seed
backlog before Linear is authenticated.
Helper Script
Use scripts/linear_ops.py for deterministic local work:
The helper requires Python 3.10+ and PyYAML. If PyYAML is not already
available, install the bundled dependency with
python3 -m pip install -r <skill-root>/scripts/requirements.txt.
- Invoke the bundled script from its installed skill directory, for example
python3 <skill-root>/scripts/linear_ops.py ....
- If the host provides a
linear-ops wrapper, that wrapper may be used instead.
Examples below use <skill-root> as the installed skill directory.
python3 <skill-root>/scripts/linear_ops.py validate-config --config .glue/linear-routing.yaml
python3 <skill-root>/scripts/linear_ops.py api-check
python3 <skill-root>/scripts/linear_ops.py discover
python3 <skill-root>/scripts/linear_ops.py dashboard-spec --config .glue/linear-routing.yaml
python3 <skill-root>/scripts/linear_ops.py dashboard-live --config .glue/linear-routing.yaml
python3 <skill-root>/scripts/linear_ops.py dashboard-html --config .glue/linear-routing.yaml --seed .glue/linear-seed-tickets.yaml --output docs/linear-ops-dashboard.html
python3 <skill-root>/scripts/linear_ops.py draft-ticket --config .glue/linear-routing.yaml --domain product --type feature --title "Add a dashboard" --summary "Expose useful work status for review"
python3 <skill-root>/scripts/linear_ops.py ticket-url --config .glue/linear-routing.yaml --domain product --type feature --title "Add a dashboard" --summary "Expose useful work status for review"
python3 <skill-root>/scripts/linear_ops.py seed-urls --config .glue/linear-routing.yaml --seed .glue/linear-seed-tickets.yaml
The helper does not perform live Linear writes. It can perform live read-only
Linear API queries when LINEAR_API_KEY is already present in the shell. Use the
host's Linear connector or MCP for live writes after authentication is connected.
Portability
The core workflow is written for the open Agent Skills format and should be
usable by any compatible agent. agents/openai.yaml is optional Codex-facing UI
metadata; other hosts may ignore it. A host must provide its own way to run
Python scripts and its own Linear connector/MCP integration for live operations.
If those capabilities are unavailable, stay in draft or pre-filled-URL mode.
1---2name: linear-ops3description: Manage Linear issues and projects by finding, drafting, creating, triaging, routing, prioritizing, updating, and summarizing work. Use when a request involves managing work in a Linear workspace.4---56# Linear Ops78## Overview910Use this skill as the operating layer between messy conversation and structured11Linear work. Linear is the task source of truth; project documentation remains12the durable memory and decision layer.1314Prefer the host's native Linear connector or Linear MCP tools when they are15available. If no live connection exists, produce a safe ticket draft or a16pre-filled `linear.new` URL and tell the user what authentication is needed.17The bundled helper is an optional local/read-only fallback; it never performs18Linear writes.1920Authentication priority:21221. Primary: use the host's authenticated Linear connector or MCP connection for23 live reads and writes supported by the available tools.242. Secondary: use the bundled helper's read-only GraphQL commands only when25 `LINEAR_API_KEY` is already present in the environment. Never ask the user to26 paste a key into chat, read `.env` files, or persist the key.273. If neither path is available, stay in draft/specification mode and explain28 what connection is needed.2930Capability modes:3132- `dry-run`: no auth; render dashboard spec and ticket drafts.33- `prefilled URL`: no auth; generate a `linear.new` URL the user can open/save.34- `live connector`: an authenticated Linear connector or MCP connection is35 available; search, dashboard, and writes follow the approval gates below.36- `live helper`: `LINEAR_API_KEY` is available; the bundled helper can only37 search, discover, and render dashboards. It cannot write.3839## Required Context40411. If the project has a `.glue/linear-routing.yaml`, read the nearest one before42 creating, routing, or updating work. If no routing file exists, use explicit43 team/project information and do not invent workspace-specific labels or44 statuses. To start a new project configuration, copy45 `assets/linear-routing.example.yaml` and replace every example value.462. If present, read `.glue/linear-seed-tickets.yaml` when bootstrapping the47 first backlog or rendering the local seed dashboard. Use48 `assets/linear-seed-tickets.example.yaml` as a starting shape.493. Read `references/ticketing-policy.md` when mapping conversational work into50 ticket type, priority, queue, labels, or dashboard views.514. Read `references/linear-docs.md` before configuring Linear, using API/MCP52 fields, or answering questions about Linear capabilities.5354## Workflow55561. Classify the request.57- `feature`: new user/system capability.58- `bug`: broken or regressed behavior.59- `chore`: maintenance, cleanup, dependency, docs hygiene.60- `research`: information gathering with an output.61- `spike`: bounded technical uncertainty reduction.62- `decision`: A designated decision-maker must choose among options.63- `ops`: business/process/infrastructure coordination.64652. Gather enough context.66- Use the current conversation first.67- Inspect relevant repo files when ticket scope, acceptance criteria, or labels68 depend on actual code/state.69- Keep tickets outcome-oriented; do not turn every implementation detail into a70 separate issue unless it can be worked independently.71723. Route through `.glue/linear-routing.yaml` when it exists.73- Match by repo path, domain keywords, and existing project names.74- Prefer the configured default team when no domain is clear.75- Put ambiguous items in the workspace's configured triage status; put76 actionable items in its configured ready status; use the workspace's77 equivalent of `Waiting for decision` only when a decision is required.78794. Search before create.80- Search Linear for similar open issues by title keywords, repo label, project,81 and domain labels.82- If a likely duplicate exists, propose updating/commenting/linking it instead83 of creating a new issue.84- If live access is unavailable, state that duplicate checking is pending.85865. Draft the ticket.87- Include: title, type, project/team, status, priority, labels, summary,88 context, scope, acceptance criteria, tasks/checklist, links, and open89 questions.90- Use Markdown; Linear's editor supports Markdown-style content.91- Keep titles specific and imperative or outcome-based.92936. Apply write policy.94- Normal issue creation from an explicit user request may be live once Linear is95 connected and duplicate check is complete.96- Show a dry-run draft first when the request says "discussed", "the thing",97 "all tasks", or otherwise depends heavily on implicit context.98- Ask before destructive or externally meaningful writes: archive/delete,99 close work as done, mark urgent, commit public/customer promises, create many100 issues/projects, or alter global workflow/labels.1011027. Update memory.103- Link Linear issue/project IDs from the project's configured durable state file104 only when they affect active priorities or durable decisions.105- Do not mirror the backlog into Markdown.106107## Dashboard Workflow108109When the user asks to view the dashboard:1101111. If Linear access exists, query issues/projects using the configured dashboard112 views in `.glue/linear-routing.yaml`. Filters within one view are combined113 with AND; multiple views are combined with OR. The helper supports the114 documented filter keys in the example routing file.1152. Return a concise operating dashboard: active work, blocked/waiting items,116 decisions needed from the user, stale work, and recently completed items.1173. If Linear access is not connected, show the intended dashboard views from the118 routing file and say live data requires Linear authentication.119120Use the bundled `scripts/linear_ops.py dashboard-spec --config121.glue/linear-routing.yaml` to render the configured dashboard plan locally when122a routing file exists. Use `dashboard-live` when `LINEAR_API_KEY` is exported;123this is read-only. Use the host's Linear connector or MCP for live writes.124Use `dashboard-html` when the user wants a local browser-viewable dashboard125artifact. Add `--seed .glue/linear-seed-tickets.yaml` to render the local seed126backlog before Linear is authenticated.127128## Helper Script129130Use `scripts/linear_ops.py` for deterministic local work:131132The helper requires Python 3.10+ and PyYAML. If PyYAML is not already133available, install the bundled dependency with134`python3 -m pip install -r <skill-root>/scripts/requirements.txt`.135136- Invoke the bundled script from its installed skill directory, for example137 `python3 <skill-root>/scripts/linear_ops.py ...`.138- If the host provides a `linear-ops` wrapper, that wrapper may be used instead.139140Examples below use `<skill-root>` as the installed skill directory.141142```bash143python3 <skill-root>/scripts/linear_ops.py validate-config --config .glue/linear-routing.yaml144python3 <skill-root>/scripts/linear_ops.py api-check145python3 <skill-root>/scripts/linear_ops.py discover146python3 <skill-root>/scripts/linear_ops.py dashboard-spec --config .glue/linear-routing.yaml147python3 <skill-root>/scripts/linear_ops.py dashboard-live --config .glue/linear-routing.yaml148python3 <skill-root>/scripts/linear_ops.py dashboard-html --config .glue/linear-routing.yaml --seed .glue/linear-seed-tickets.yaml --output docs/linear-ops-dashboard.html149python3 <skill-root>/scripts/linear_ops.py draft-ticket --config .glue/linear-routing.yaml --domain product --type feature --title "Add a dashboard" --summary "Expose useful work status for review"150python3 <skill-root>/scripts/linear_ops.py ticket-url --config .glue/linear-routing.yaml --domain product --type feature --title "Add a dashboard" --summary "Expose useful work status for review"151python3 <skill-root>/scripts/linear_ops.py seed-urls --config .glue/linear-routing.yaml --seed .glue/linear-seed-tickets.yaml152```153154The helper does not perform live Linear writes. It can perform live read-only155Linear API queries when `LINEAR_API_KEY` is already present in the shell. Use the156host's Linear connector or MCP for live writes after authentication is connected.157158## Portability159160The core workflow is written for the open Agent Skills format and should be161usable by any compatible agent. `agents/openai.yaml` is optional Codex-facing UI162metadata; other hosts may ignore it. A host must provide its own way to run163Python scripts and its own Linear connector/MCP integration for live operations.164If those capabilities are unavailable, stay in draft or pre-filled-URL mode.