plugins/src/base/skills/linear-read-issue/SKILL.md
Fetches the full scope of a Linear work item — Issue or Project — including metadata, description, acceptance criteria, all comments, attachments, native relations (blocks/blocked_by/relates_to/duplicates), Project parent (if any) with siblings, and sub-Issues. Produces a consolidated context bundle that downstream agents consume so they never act on a single item in isolation.
npx skillsauth add codyswanngt/lisa linear-read-issueInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
Security scan pending...
This skill is queued for security scanning. Results will appear when the scan completes.
Fetch the full scope of the item AND its related graph. Downstream agents must never act on an item in isolation — always call this skill first so they see blockers, project siblings, linked PRs, and historical comments.
This skill is the destination of the lisa:tracker-read shim when tracker = "linear". Read-only.
Repository name for scoped comments and logs: basename $(git rev-parse --show-toplevel).
Reads linear.workspace, linear.teamKey from .lisa.config.json (with .local override).
$ARGUMENTS matches <TEAM>-<n> → Issue mode.$ARGUMENTS is a URL containing /project/<slug>-<short-id> → Project mode (extract <short-id>).lisa:linear-access operation: list-teams({query: <teamKey>}).Call lisa:linear-access operation: get-issue. Extract and preserve:
Metadata
status:*, component:*, priority:*, prd-*)Body
Comments
Fetch ALL comments via lisa:linear-access operation: list-comments({issueId: <id>}) in chronological order. Walk thread parents/children — Linear comments are threaded via parentId. Do not truncate. For each comment:
Call lisa:linear-access operation: get-project with includeMilestones: true, includeResources: true. Extract:
Metadata
Body
lisa:linear-access operation: list-documents({projectId}) then lisa:linear-access operation: get-document per result. Treat each as additional spec content.Member Issues
lisa:linear-access operation: list-issues({project: <id>}) to enumerate the Project's Issues. Capture identifier, title, state, parent Issue (for sub-Issue tree).Linear stores remote URLs as attachments on the Issue. For each:
gh pr view <url> --json title,state,body,mergedAt,reviewDecision,comments,reviews (PRs) or gh api repos/<owner>/<repo>/commits/<sha> (commits). Capture title, state, unresolved review comments, merge status.If gh is not authenticated, note "gh auth required" and continue — do not abort.
Linear native Issue relations are returned in the get_issue response under relations. Group by type:
blocks / blocked_byrelates_toduplicates / duplicated_byFor each related Issue, call lisa:linear-access operation: get-issue and capture:
blocks or blocked_by)Special handling for blocked_by: fetch full PR details via gh for each blocker's GitHub attachments so the agent knows whether the blocker is actually shipped.
For Project-level relationships (Project ↔ Project), Linear doesn't model native relations — check the Project description and resources for cross-references and capture them as plain links.
If the primary Item is an Issue with a Project parent:
lisa:linear-access operation: get-project — full description, milestones, labels, lead.lisa:linear-access operation: list-issues({project: <projectId>}) excluding the primary identifier.Started or In Review with a different assignee, flag it prominently.If the primary Item IS a Project, Phase 5 is the same as fetching all member Issues (already done in Phase 2 Project mode).
If the primary Issue has children (sub-Issues), fetch each via lisa:linear-access operation: get-issue: identifier, title, state, assignee, description (first paragraph), Acceptance Criteria.
Produce a single structured output the caller can pass verbatim to downstream agents.
# Linear Work Item Context: <IDENTIFIER>
## Primary Item
- Identifier: <ID>
- Type: <Issue | Project>
- State: <state>
- Priority: <0–4 or named>
- Assignee: <name or none>
- Project (parent): <project-slug — name> or none
- Parent Issue: <ID — title> or none (Sub-task only)
- Cycle: <name or none>
- Milestone: <project-milestone or none>
- Labels: <comma-separated>
- Estimate: <points>
### Description
<full description>
### Acceptance Criteria
<criteria>
### Validation Journey
<section or "None">
### Comments (<count>)
<chronological comments, flagged items called out>
### Attachments
<list of URLs with titles>
## Remote Links
### Pull Requests (<count>)
- <url> — <title> — <state> — <reviewDecision>
<body summary + unresolved review comments>
### Confluence
- <title> — <url>
### Other
- <title> — <url>
## Relations
### Blocks (<count>)
<per-issue block>
### Blocked By (<count>)
<per-issue block with PR state>
### Relates To (<count>)
<per-issue block>
### Duplicates / Duplicated By
<per-issue block>
## Project Context (when primary is an Issue under a Project)
### Project <slug> — <name>
- State: <state>
- Description: <full markdown>
- Milestones: <list>
- Documents: <list of doc titles + identifiers>
### Siblings In-Flight (<count>)
- <ID> — <state> — <assignee> — <title> **[FLAG: in progress by other assignee]**
### Other Siblings (<count>)
- <ID> — <state> — <title>
## Sub-Issues (<count>)
- <ID> — <state> — <assignee> — <title>
## Summary for Downstream
- Full item count pulled: <N>
- Blockers still open: <list>
- Related in-flight work: <list>
- Relevant PRs: <list with state>
tools
Configure the official SonarQube plugin + MCP as Lisa's single Sonar substrate across every supported coding agent. Installs/updates the SonarQube CLI, authenticates (browser login on a dev machine, or SONARQUBE_CLI_TOKEN headless), selects the Test Manager target, runs `sonar integrate <agent>` for each supported agent (Claude, Codex, Cursor, Copilot, Antigravity) and wires the MCP for OpenCode, then writes only non-secret policy to .lisa.config.json. Separate from the CI SonarCloud scan gate, which is unchanged.
tools
Configure the official SonarQube plugin + MCP as Lisa's single Sonar substrate across every supported coding agent. Installs/updates the SonarQube CLI, authenticates (browser login on a dev machine, or SONARQUBE_CLI_TOKEN headless), selects the Test Manager target, runs `sonar integrate <agent>` for each supported agent (Claude, Codex, Cursor, Copilot, Antigravity) and wires the MCP for OpenCode, then writes only non-secret policy to .lisa.config.json. Separate from the CI SonarCloud scan gate, which is unchanged.
tools
Configure the official SonarQube plugin + MCP as Lisa's single Sonar substrate across every supported coding agent. Installs/updates the SonarQube CLI, authenticates (browser login on a dev machine, or SONARQUBE_CLI_TOKEN headless), selects the Test Manager target, runs `sonar integrate <agent>` for each supported agent (Claude, Codex, Cursor, Copilot, Antigravity) and wires the MCP for OpenCode, then writes only non-secret policy to .lisa.config.json. Separate from the CI SonarCloud scan gate, which is unchanged.
tools
Configure the official SonarQube plugin + MCP as Lisa's single Sonar substrate across every supported coding agent. Installs/updates the SonarQube CLI, authenticates (browser login on a dev machine, or SONARQUBE_CLI_TOKEN headless), selects the Test Manager target, runs `sonar integrate <agent>` for each supported agent (Claude, Codex, Cursor, Copilot, Antigravity) and wires the MCP for OpenCode, then writes only non-secret policy to .lisa.config.json. Separate from the CI SonarCloud scan gate, which is unchanged.