plugins/dev/skills/linearis/SKILL.md
Reference for Linearis CLI commands to interact with Linear project management. Use when working with Linear tickets, cycles, projects, milestones, or when the user mentions ticket IDs like TEAM-123, ENG-456, PROJ-789.
npx skillsauth add coalesce-labs/catalyst linearis-cliInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Verified against Linearis v2026.4.4 on 2026-04-12.
CRITICAL: Always use these exact patterns. Do NOT guess or improvise syntax.
For full flag details, run linearis usage (all domains) or linearis <domain> usage (one domain).
The usage output is authoritative and always current — prefer it over memorizing flags.
linearis usage # Full overview of every domain and flag
linearis issues usage # Just issue operations
linearis milestones usage # Just milestone operations
linearis cycles usage # Just cycle operations
linearis issues read ENG-123
linearis issues search "keyword"
linearis issues search "auth bug" --team ENG --status "Todo"
linearis issues create "Title" --team ENG
linearis issues create "Title" --team ENG --description "Details" --priority 2 --project "Project"
linearis issues update ENG-123 --status "In Progress"
linearis issues update ENG-123 --priority 1
linearis issues update ENG-123 --labels "bug" --label-mode add
linearis issues update ENG-123 --project "Project Name"
linearis issues update ENG-123 --project-milestone "Milestone Name"
linearis comments create ENG-123 --body "Starting work on this"
Common mistakes:
linearis issues get ENG-123 # ❌ no 'get' — use 'read'
linearis issue view ENG-123 # ❌ no 'view' — use 'read'
linearis issues comment ENG-123 "text" # ❌ use 'comments create', not 'issues comment'
linearis issues update ENG-123 --state # ❌ use --status, not --state
linearis project-milestones list # ❌ renamed to 'milestones' in v2026.4
# Discover teams and projects
linearis teams list | jq '.nodes[] | {key, name}'
linearis projects list | jq '.nodes[] | {name, status: .status.name, id}'
# All tickets in a specific project
linearis issues list --project "Auth System" --limit 100
# Tickets in a project, grouped by status (requires --team for --status filter)
linearis issues list --team ENG --project "Auth System" --status "Backlog,Todo" --limit 100
linearis issues list --team ENG --limit 200 | jq '[.nodes[] | select(.project == null)] | length'
linearis issues list --team ENG --limit 200 | jq '.nodes[] | select(.project == null) | {identifier, title, state: .state.name}'
# Urgent/high priority tickets
linearis issues list --team ENG --priority 1 --limit 50
linearis issues list --team ENG --priority 2 --limit 50
# Unestimated tickets in a project
linearis issues list --project "Auth System" --limit 100 | jq '.nodes[] | select(.estimate == null) | {identifier, title}'
# Not updated in 30+ days
linearis issues list --team ENG --updated-before 2026-03-13 --status "In Progress" --limit 50
linearis issues update ENG-123 --project "Auth System"
linearis milestones list --project "Auth System"
linearis milestones read "Beta Launch" --project "Auth System"
linearis milestones read "Beta Launch" --project "Auth System" --limit 100
linearis milestones create "Beta Launch" --project "Auth System" --target-date 2026-06-15
linearis milestones create "GA Release" --project "Auth System" --description "General availability" --target-date 2026-09-01
linearis milestones update "Beta Launch" --project "Auth System" --name "Beta 2.0"
linearis milestones update "Beta Launch" --project "Auth System" --target-date 2026-07-01
linearis issues update ENG-123 --project-milestone "Beta Launch"
# Clear a milestone assignment
linearis issues update ENG-123 --clear-project-milestone
# Tickets in a project with no milestone
linearis issues list --project "Auth System" --limit 100 | jq '.nodes[] | select(.projectMilestone == null) | {identifier, title}'
linearis labels list --team ENG
linearis labels list --team ENG | jq '.nodes[] | {name, color}'
linearis issues list --team ENG --label "bug" --limit 100
linearis issues list --team ENG --label "tech-debt" --limit 100
# Add a label (keeps existing labels)
linearis issues update ENG-123 --labels "needs-triage" --label-mode add
# Replace all labels
linearis issues update ENG-123 --labels "bug,P1" --label-mode overwrite
# Remove all labels
linearis issues update ENG-123 --clear-labels
linearis cycles list --team ENG --active
CYCLE=$(linearis cycles list --team ENG --active | jq -r '.nodes[0].name')
linearis cycles read "$CYCLE" --team ENG --limit 100
CYCLE=$(linearis cycles list --team ENG --active | jq -r '.nodes[0].name')
linearis cycles read "$CYCLE" --team ENG --limit 100 | jq '
.issues
| group_by(.state.name)
| map({status: .[0].state.name, count: length, tickets: [.[].identifier]})
'
# Active cycle plus 2 before and after
linearis cycles list --team ENG --window 2
Status names come from the team's workflow configuration. Use the stateMap in .catalyst/config.json
when available, otherwise read a ticket to discover valid status names.
# Common flow
linearis issues update ENG-123 --status "In Progress"
linearis issues update ENG-123 --status "In Review"
linearis issues update ENG-123 --status "Done"
# With comment
linearis issues update ENG-123 --status "Done"
linearis comments create ENG-123 --body "Merged: PR #456"
When .catalyst/config.json contains catalyst.linear.stateIds, prefer passing the UUID directly
to --status instead of the display name. Every linearis resolver short-circuits on UUIDs — zero
resolution API calls. The linear-transition.sh helper does this automatically.
# Resolve and cache UUIDs once (single GraphQL query)
plugins/dev/scripts/resolve-linear-ids.sh
# Then transitions use UUIDs from config — 1 fewer API call per update
plugins/dev/scripts/linear-transition.sh --ticket ENG-123 --transition done
--status for issue updates (--state was removed in v2025.12.2)linearis comments create, not issues commentissues list and issues search, --status only works when --team is also provided--team ENG), but issues create and issues search require a UUID — keys/names silently fall back to the workspace default team (upstream bug: czottmann/linearis#56)--status "In Progress" not --status In Progresslinearis <domain> usage: When unsure about flags, check usage instead of guessingtesting
Phase-agent that fixes a failing verify verdict so the pipeline self-heals instead of stalling to needs-human (CTL-653). Reads `${ORCH_DIR}/workers/<ticket>/verify.json`, fixes the `findings[]` (every severity:"high" plus the regression_risk drivers) directly via Edit/Write, commits the remediation, and emits `phase.remediate.complete.<ticket>`. The scheduler's router then re-dispatches `verify` to re-check (the verify⇄remediate cycle, cap 3). Dispatched as a `claude --bg` job by `phase-agent-dispatch`, which invokes it via slash command — hence `user-invocable: true`.
development
Phase agent for the verify step of the 9-phase orchestrator pipeline (CTL-450). NEW skill — has no canonical wrapper. Runs read-only adversarial verification against the implement-phase diff: tsc, tests, lint, security scan, reward-hacking scan, code review, test coverage, silent-failure hunt. Writes ${ORCH_DIR}/workers/<TICKET>/verify.json then emits phase.verify.complete.<ticket>. Reads phase-implement.json as its prior-phase artifact. NEVER writes application code — only test files allowed. Spawned via phase-agent-dispatch via slash command — hence `user-invocable: true`.
tools
--- name: phase-triage description: Phase agent that triages a Linear ticket — expands acronyms, classifies (feature/bug/docs/refactor/chore), identifies dependencies, estimates scope, writes triage.json, and posts a triage analysis comment to Linear. Triage completion is signaled by that comment plus the local triage.json — there is no `triaged` label. Emits phase.triage.complete.<TICKET> on success and phase.triage.failed.<TICKET> on error. Dispatched by the phase-agent orchestrator (CTL-452)
testing
Phase agent for the review step of the 9-phase orchestrator pipeline (CTL-450). Wraps the /review skill (gstack) — explicitly skips /ultrareview per user decision. Reads verify.json from the prior phase, runs /review against the diff, writes ${ORCH_DIR}/workers/<TICKET>/review.json, and creates a remediation commit for any HIGH-severity finding that has a deterministic fix. Emits phase.review.complete.<ticket>. Spawned via phase-agent-dispatch via slash command — hence `user-invocable: true`.