plugins/linear-orchestrator/skills/linear-pagination-filtering/SKILL.md
This skill should be used when fetching large result sets from Linear — cursor pagination, filter DSL, sorting, and complexity budgeting. Activates on "linear pagination", "linear filter", "linear cursor", "linear filtering".
npx skillsauth add markus41/claude Linear Pagination + FilteringInstall 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.
References:
Linear uses opaque forward cursors. Pattern:
query Page($cursor: String, $filter: IssueFilter) {
issues(first: 50, after: $cursor, filter: $filter, orderBy: updatedAt) {
pageInfo { hasNextPage endCursor }
nodes { id }
}
}
first ranges 1-250. No last/before — Linear is forward-only. To paginate descending, use orderBy with the appropriate direction (e.g. createdAt).
Helper in lib/pagination.ts:
async function* paginateAll<T>(
fetch: (cursor: string | null) => Promise<{ nodes: T[]; pageInfo: { hasNextPage: boolean; endCursor: string } }>
): AsyncGenerator<T> {
let cursor: string | null = null;
while (true) {
const page = await fetch(cursor);
yield* page.nodes;
if (!page.pageInfo.hasNextPage) return;
cursor = page.pageInfo.endCursor;
}
}
Filters are nested JSON trees:
filter: {
and: [
{ state: { type: { eq: "started" } } },
{ priority: { lte: 2 } },
{ or: [
{ assignee: { isMe: { eq: true } } },
{ team: { key: { eq: "ENG" } } }
] },
{ labels: { some: { name: { in: ["bug", "regression"] } } } }
]
}
| Op | Strings | Numbers | Booleans | Dates |
|----|---------|---------|----------|-------|
| eq | ✓ | ✓ | ✓ | ✓ |
| neq | ✓ | ✓ | ✓ | ✓ |
| in / nin | ✓ | ✓ | — | — |
| contains / startsWith | ✓ | — | — | — |
| lt / lte / gt / gte | — | ✓ | — | ✓ |
| null | ✓ | ✓ | ✓ | ✓ |
some: { ... } — at least one related entity matchesevery: { ... } — all related entities matchnone: { ... } — no related entity matchesOpen issues in current cycle assigned to me:
filter: {
and: [
{ state: { type: { neq: "completed" } } },
{ cycle: { isActive: { eq: true } } },
{ assignee: { isMe: { eq: true } } }
]
}
Issues blocked by something:
filter: { hasRelatedRelations: { eq: true } }
Triage queue for ENG team older than 24h:
filter: {
and: [
{ team: { key: { eq: "ENG" } } },
{ state: { type: { eq: "triage" } } },
{ createdAt: { lt: "2026-04-29T00:00:00Z" } }
]
}
orderBy: updatedAt | createdAt | priority | manual. For complex sorts, fetch unsorted and sort client-side (only feasible for small result sets).
Each filter clause adds to query complexity. Reduce by:
first: <smaller> on connections within nodesdevelopment
Enhanced plan-authoring skill with Pre-Writing context gathering, task metadata, non-TDD templates, Red Flags, telemetry, and an automated plan linter. Use when you have a spec or requirements for a multi-step task, before touching code.
tools
Documentation intelligence engine with graph-based API docs, algorithm library, and drift detection
tools
Ultraplan cloud planning — kick off a plan in the cloud from your terminal, review and revise in the browser, then execute remotely or send back to CLI
tools
--- name: mcp description: Configure MCP servers for Claude Code — stdio vs HTTP, authentication, Tools/Resources/Prompts distinction, channels (CI webhook, mobile relay, Discord bridge, fakechat), and cost of always-loaded tools. Use this skill whenever adding an MCP server, debugging connection issues, choosing between MCP Tools vs Prompts vs Resources, installing channel servers, or managing .mcp.json. Triggers on: "MCP server", "mcp config", "add Obsidian MCP", "install context7", "channels"