linear
Skill1 starsChanged 3 months agoMITView on GitHub
Create, update, delete, and comment on Linear tickets. Use when creating or deleting issues, adding or editing comments, changing status, assigning work, or referencing issue IDs like ABC-123. Examples: "create a ticket", "add a comment", "mark done", "my issues".
- Reads credentials
83 other projects use a version of this.
Adopted by
Most recently taken up by
- ashleysbrain/skillstheir own version, first seen Nov 8, 2026
- withpiper/pipekittheir own version, first seen Nov 8, 2026
- lox/agent-skillstheir own version, first seen Nov 7, 2026
- lobehub/lobehubtheir own version, first seen Nov 5, 2026
- DROOdotFOO/agent-skillstheir own version, first seen Nov 1, 2026
- AgnesAI-Labs/agnet-skills-cntheir own version, first seen Nov 1, 2026
Used with
Projects with it also use agent-deep-links, helium-mcp and 10 more.
Other files people use alongside this one.
Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
ComposioHQSkillagent-deep-links
Build, validate, and troubleshoot deep links for Codex, Cursor, VS Code, Visual Studio, and similar tools. Use when users ask for clickable links (especially in Slack) that open threads, files, folders, or app settings.
Also in 3 projects that use this
ComposioHQSkillhelium-mcp
Search real-time news with bias scoring, get live stock/ETF/crypto data with AI analysis, ML options pricing, balanced news synthesis, and meme search via the Helium MCP server.
Also in 3 projects that use this
petestewartSkilldatadog-logs
Query Datadog logs via the Logs Search API v2. Use when the user asks to "check the logs", "search logs", "find errors in Datadog", "look up logs for", "show me production logs", "check for errors", "search Datadog", or any request involving log search, error investigation, or production debugging that requires Datadog log data.
Also in 3 projects that use this
OpenAISkillpull
Also in 5 projects that use this
SentrySkilldatadog
Query live Datadog telemetry (logs, metrics, traces, spans, monitors, incidents, dashboards, services, hosts) through Datadog's Pup CLI. Use when users ask to investigate production behavior in Datadog, including searching logs, checking monitor status, inspecting traces or spans, looking up incidents, finding services, or correlating metrics. Do not use it for Sentry issues, repository/source-code work, or ticketing.
Also in 4 projects that use this
- +7 more from ComposioHQ
Other versions83 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 83
- lobehub/lobe-chat★ 84ksame name
- lobehub/lobehub★ 84ksame name
- openai/skills★ 27ksame name
- openai/symphony★ 27ksame name
- anthropics/claude-quickstarts★ 19ksame name
- ComposioHQ/awesome-codex-skills★ 17ksame name
- composio-community/awesome-codex-skills★ 16ksame name
- anyproto/anytype-ts★ 9.1ksame name
- vercel-labs/emulate★ 2ksame name
- Lilac-Labs/gini-agent★ 1.9ksame name
73 more not listed
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository29 other files it gives its agents.
- AGENTS.mdAGENTS.md
- docxSkill
- pdfSkill
- app-icon-studioSkill
- audit-promptSkill
- bootstrap-goal-projectSkill
- boy-scoutSkill
- brand-namingSkill
- create-engineering-skillSkill
- create-prSkill
- elevenlabsSkill
- firebase-adminSkill
- firebase-hosting-basicsSkill
- gmailSkill
- nano-banana-app-iconSkill
- new-projectSkill
- plainSkill
- product-researchSkill
- pr-qa-browserSkill
- publish-researchSkill
- readme-best-practicesSkill
- researchSkill
- ripple-checkSkill
- roadmap-pageSkill
- scopeSkill
- searchexaSkill
- slackSkill
- triage-pr-commentsSkill
- write-loopSkill
The file
Show its rules and text
We split this skill into the rules it gives an agent
24 rules. 0 are common, 15 are distinctive, and 9 are very specific to this project.
0
Common
Most of the 79 edited versions we read keep these.
15
Distinctive
This author's own choices. Worth a look.
9
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 25
Use -V only when the user:
- Very specific: line 99
If neither specified, uses projectId from .linear.json if present
- Very specific: line 125
Team resolution: When create or update needs a team for creation or for resolving team-scoped names (--label, --project, --cycle), it …
- Very specific: line 221
When ambiguous between comment and document, prefer comment.
- Distinctive: line 234
After writing a comment or updating a description that changes scope, check the current priority and estimate
- Very specific: line 235
If the new content meaningfully expands or narrows the work, adjust priority and/or estimate in the same update call
- Distinctive: line 237
If scope changed but priority/estimate still fit, no action needed — don't adjust for the sake of it </step>
- Very specific: line 248
If exactly one match, pass --assignee <email> (the email, not the name).
- Distinctive: line 249
If multiple matches, use AskUserQuestion to disambiguate with the matching names as options, then pass the chosen user's email.
- Distinctive: line 250
If no match, show available members and ask the user to clarify.
- Very specific: line 262
Long Markdown: Use create/update --description-file path or comment/update-comment --body-file path instead of shell interpolation.
- Very specific: line 287
Run projects and labels to fetch available options (cache across the session — don't re-fetch if already retrieved this conversation).
- Distinctive: line 290
If user explicitly named a project in their message → use it
- Distinctive: line 292
If exactly one project is a clear match → pre-select it (confirm in step 4)
- Distinctive: line 293
If multiple plausible matches or no match → include project selection in step 4's AskUserQuestion
- Distinctive: line 294
If no projects match and the ticket represents a new area of work → include a "Create new project: [suggested name]" option in step 4
- Distinctive: line 297
If user explicitly named labels → use them
- Distinctive: line 300
If the ticket's domain suggests a label that doesn't exist → include a "Create label: [suggested name]" option in step 4
- Distinctive: line 347
If the user only provided implementation details (e.g., "add a retry flag to the API call") without a user-facing problem, ask: "What's the …
- Distinctive: line 358
If project is ambiguous or unmatched → list matching projects as options, include "Create new project: [name]" if appropriate
- Distinctive: line 359
If labels need confirmation or a new label is suggested → list as multi-select options, include "Create label: [name]" for new ones
- Distinctive: line 360
If project and labels were confidently inferred → just show them in the confirmation question, no separate question needed
- Very specific: line 372
If user approved creating a new project or label, create it first via create-project or create-label, then use the result in the create …
- Distinctive: line 445
Always parse JSON error response and present human-friendly message with suggestions.
“Common” is measured: kept by at least 6 in 10 of the 79 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
<objective>
Conversational interface to Linear for fast issue management. Primary use case: user describes work → ask high-impact questions → create ticket immediately.Speed over polish. Get tickets into Linear quickly.
Do NOT explore the codebase (launch agents, read files, analyze code) unless the user explicitly asks. Work from user's description only.
</objective>
<cli_reference>
CLI script: ~/.agents/skills/linear/scripts/linear.py
Run with: uv run ~/.agents/skills/linear/scripts/linear.py <command> [options]
Verbose flag (-V): Available on get and list subcommands. Always use concise (no -V) unless the user explicitly needs data only verbose provides. Verbose adds URL, internal UUIDs, relations, commit SHAs, and linked documents — data that inflates context without helping most operations.
Use -V only when the user:
- Asks for the URL or link to the issue
- Needs internal IDs (team, state, project UUIDs) for API calls
- Asks about relations (blocks, blocked-by) or linked commits
- Wants to see linked documents (titles and URLs)
- Explicitly says "verbose", "full details", or "all fields"
Document awareness: Both concise and verbose modes include documentCount. When documentCount > 0, use -V to see document titles and URLs. Documents are native Linear markdown docs attached to issues via the document command.
Commands:
| Command | Usage | Purpose |
create | create "<title>" [-d desc / --description-file path] [-p priority] [-e estimate] [--parent ID] [--project name] [--no-project] [--label name] [--assignee <email-or-@me>] [--cycle <number-or-"active">] [--team <key-or-uuid>] | Create issue |
update | update <ID> [-t title] [-d desc / --description-file path] [-p priority] [-e estimate] [--parent ID] [--label name] [--no-labels] [--assignee <email-or-@me>] [--no-assignee] [--project name] [--no-project] [--cycle <number-or-"active">] [--no-cycle] [--team <key-or-uuid>] | Update fields |
delete | delete <ID> | Move one issue to trash by identifier or UUID (recoverable for 30 days) |
done | done <ID> | Mark completed |
state | state <ID> "<name>" | Change state |
break | break <ID> --issues '[{...}]' [--project name] [--no-project] [--label name] [--no-labels] | Create sub-issues |
relate | relate <ID> <type> <target> | Create relation (blocks, blocked-by, relates-to, duplicates) |
unrelate | unrelate <ID> <target> | Remove relation between two issues |
comment | comment <ID> ["<body>" / --body-file path] | Post a comment on an issue |
update-comment | update-comment <comment-uuid> ["<body>" / --body-file path] | Replace the full Markdown body in place, preserving the comment UUID (from get --comments) |
delete-comment | delete-comment <comment-uuid> | Delete a comment by UUID (from get --comments) |
attach | attach <ID> <file_path> [-t title] [-s subtitle] | Upload binary file (image, PDF) as download link |
attach-commit | attach-commit <ID> [commit-sha] | Link git commit to issue (defaults to HEAD) |
document | document <ID> "<title>" [-c content] [-f file] [--project name] | Create native markdown document viewable inline |
get | get <ID> [-c/--comments] | Fetch details (add -c for comments) |
list | list [--mine] [--assignee X] [--creator X] [--priority X] [--project X] [--state X] [--estimate X] [--label name] [--cycle <number-or-"active">] [--limit N] [--after cursor] | List/filter issues |
states | states | List workflow states |
projects | projects | List available projects |
create-project | create-project "<name>" [-d desc] [--color hex] [--icon id] [--state state] [--start-date date] [--target-date date] | Create project |
delete-project | delete-project "<name>" | Delete project by name |
update-project | update-project "<name>" [--name new] [-d desc] [--color hex] [--icon id] [--state state] [--start-date date] [--target-date date] | Update project |
milestones | milestones "<project-name>" [--team ID] | List milestones for a project |
create-milestone | create-milestone "<name>" --project "<project-name>" [-d desc] [--target-date YYYY-MM-DD] | Create project milestone |
delete-milestone | delete-milestone "<name>" --project "<project-name>" | Delete project milestone by name |
cycles | cycles [--active] [--past] [--future] [--all] | List cycles (default: active + next) |
cycle | cycle [number] | Cycle details + issues (default: active) |
create-cycle | create-cycle --starts YYYY-MM-DD --ends YYYY-MM-DD [--name "..."] [-d "..."] | Create cycle |
update-cycle | update-cycle <number> [--name "..."] [--ends YYYY-MM-DD] [-d "..."] | Update cycle (start date is immutable) |
members | members | List active workspace members |
labels | labels [--team ID] | List labels |
create-label | create-label "<name>" [--color hex] [-d desc] | Create label |
delete-label | delete-label "<name>" | Delete label by name |
update-label | update-label "<name>" [--name new] [--color hex] [-d desc] | Update label (preserves issue associations) |
views | views [--team ID] [-V] | List custom views (-V adds filterData, icon, color, timestamps) |
create-view | create-view "<name>" [--filter-json '{...}'] [--shared] [--team ID] [--color hex] [--icon name] [-d desc] | Create custom view |
update-view | update-view "<name-or-id>" [--name new] [-d desc] [--filter-json '{...}'] [--shared/--private] [--team ID] [--color hex] [--icon name] | Update supplied fields in place |
view-issues | view-issues "<name-or-id>" [--limit N] [--after cursor] | Preview saved issue-view membership |
delete-view | delete-view "<name-or-id>" | Delete custom view by name or UUID |
Priority values: 0=None, 1=Urgent, 2=High, 3=Normal, 4=Low
List filters:
--mine/-m: Issues assigned to current user--assignee/-a: By exact assignee email, or@mefor self--creator/-c: By exact creator email, or@mefor self--priority/-p: By priority (0-4 or none/urgent/high/normal/low)--project: By project name--state/-s: By state name or type (backlog/todo/started/done/canceled)--estimate/-e: By estimate (number or 'none' for unestimated)--label: By label name (repeatable for AND logic)--cycle: By cycle number or "active" for current cycle--limit/-l: Max results per page (default 25)--after: Continue from the previous page'spageInfo.endCursor
Filters combine with AND logic. list and view-issues always return result.pageInfo. When hasNextPage is true, pass endCursor as --after with the same filters/view. Counts describe the returned page, not the total; pages are live reads, not a frozen snapshot.
T-shirt to estimate mapping:
- XS → 1, S → 2, M → 3, L → 5, XL → 8
Project handling:
--project "Name"— Assign to project by name (overrides config default)--no-project— Don't assign to any project- If neither specified, uses
projectIdfrom.linear.jsonif present
Label handling:
--label "name"— Apply label by name (repeatable for multiple labels)--no-labels— Remove all labels (update) or skip parent inheritance (break)- On
create: if no--labeland no parent labels are inherited, appliesdefaultLabelsfrom.linear.json - On
update:--labelreplaces all existing labels - On
break: sub-issues inherit parent labels by default </cli_reference>
<config>
**Project config:** `.linear.json` in project root (searched upward from pwd). **Optional** — see team resolution below.{
"teamId": "uuid-of-linear-team",
"projectId": "uuid-of-linear-project (optional)",
"defaultPriority": 3,
"defaultLabels": ["mobile"]
}teamId— Your Linear team UUID. Only needed in the file if you rely on.linear.jsonto pick the team (see below).projectId— Optional. Default project for new issues. Can be overridden with--projector--no-project.defaultLabels— Optional. Label names auto-applied oncreatewhen--labelis not specified.
Team resolution. When create or update needs a team for creation or for resolving team-scoped names (--label, --project, --cycle), it resolves in this order and stops at the first hit:
--team <key-or-uuid>flag — accepts a team key likeENGor a raw UUIDLINEAR_TEAMenv var (key or UUID)- the issue's / parent's own team —
updateandcreate --parentderive this from the target/parent issue, so they need no config and no--teamfor those flows .linear.jsonteamId- single-team auto-detect — if the workspace has exactly one team, it is used automatically
break always creates sub-issues in the parent issue's team because Linear ties sub-issues to their parent team. It needs no config and ignores unrelated team defaults; use the parent's own project/labels or explicit --project/--label overrides that resolve within the parent team.
A single-team workspace needs no config at all for commands that use this resolver (create, update name resolution, and list filters that require a team such as named states/cycles). Standalone list can remain workspace-wide without a team. In a multi-team workspace, standalone create needs one of --team / LINEAR_TEAM / .linear.json (or it errors listing the available team keys).
When .linear.json is present but the team is overridden to a different team (via --team/LINEAR_TEAM/parent issue), the file's defaultPriority/defaultLabels still apply but its projectId is dropped (it is scoped to the file's team). A defaults-only .linear.json without teamId is allowed when a higher-precedence team source selects the team.
API key: Set LINEAR_API_KEY in project's .claude/settings.local.json (git-ignored by default):
{
"env": {
"LINEAR_API_KEY": "lin_api_..."
}
}</config><process><step name="parse_intent">
**Parse the command to determine intent:**| Pattern | Intent | Action |
delete <ID>, "delete ticket <ID>", "delete issue <ID>" | Delete issue | Execute delete <ID> only when explicitly requested |
done <ID> | Mark complete | Execute done directly |
state <ID> "<name>" | Change state | Execute state directly |
get <ID> | Fetch details | Execute get (returns comment count) |
get <ID> with comments, show comments on <ID>, read comments on <ID> | Fetch with comments | Execute get <ID> --comments |
states | List states | Execute states directly |
projects | List projects | Execute projects directly |
"create a project", "new project" | Create project | Execute create-project directly |
"delete project", "remove project" | Delete project | Execute delete-project directly |
"update project", "rename project", "change project state" | Update project | Execute update-project directly |
"milestones for <project>", "list milestones", "show milestones" | List milestones | Execute milestones "<project>" |
"create milestone", "new milestone", "add milestone" | Create milestone | Execute create-milestone with project |
"delete milestone", "remove milestone" | Delete milestone | Execute delete-milestone with project |
cycles, "list cycles", "show sprints", "current sprint" | List cycles | Execute cycles (default: active + next) |
cycle, "cycle details", "what's in the current cycle", "sprint N" | Cycle details | Execute cycle (default: active, or by number) |
"create cycle", "new sprint", "start a cycle" | Create cycle | Execute create-cycle with dates |
"update cycle", "extend sprint", "rename cycle" | Update cycle | Execute update-cycle with number |
"add <ID> to cycle", "move <ID> to sprint" | Assign to cycle | Execute update <ID> --cycle <ref> |
"remove <ID> from cycle", "unassign from sprint" | Remove from cycle | Execute update <ID> --no-cycle |
"move <ID> to project", "set project on <ID>" | Assign project | Execute update <ID> --project <name> |
"remove <ID> from project", "unset project on <ID>" | Remove project | Execute update <ID> --no-project |
labels, "list labels", "show labels" | List labels | Execute labels directly |
"create a label", "new label" | Create label | Execute create-label directly |
"delete label", "remove label" | Delete label | Execute delete-label directly |
"update label", "rename label", "change label color" | Update label | Execute update-label directly |
views, "list views", "show views", "my views", "custom views" | List views | Execute views directly |
"create a view", "new view", "set up views", "help me organize my Linear", "I want to see [X] issues", "surface [X]", "help me stay on top of", "I need visibility into" | Create view | Read references/views.md, then follow the view creation process |
"update view", "edit view", "rename view" | Update view | Use update-view; read references/views.md when changing filters |
"preview view", "issues in view" | Preview view | Execute view-issues with the view's exact name or UUID |
"delete view", "remove view" | Delete view | Execute delete-view directly |
list [filters], my issues, show issues | List/filter issues | Execute list with filters |
assign <ID> to <name>, reassign <ID> to <name> | Assign/reassign | Resolve per resolve_assignee, then update <ID> --assignee <email-or-@me> |
unassign <ID>, remove assignee from <ID> | Remove assignee | Execute update <ID> --no-assignee |
members, team members, who's on the team | List members | Execute members directly |
update <ID> <text> | Update issue | Execute update with parsed fields |
break <ID> + user provides sub-issues | Break into sub-issues | Execute break with user's list |
relate <ID> blocks/blocked-by/relates-to/duplicates <ID> | Create relation | Execute relate directly |
<ID> blocks/depends on <ID>, link <ID> to <ID> | Create relation | Parse relation type and execute relate |
comment on <ID>, leave a comment on <ID>, add a note to <ID>, post comment | Post comment | Execute comment with body text |
"edit comment", "update comment" + comment UUID | Edit comment in place | Execute update-comment with UUID and full replacement body; use get <ID> --comments to find the UUID if needed |
"delete comment", "remove comment" + comment UUID | Delete comment | Execute delete-comment with UUID |
attach <ID> <file_path> | Attach file | Execute attach directly |
attach-commit <ID> [sha], "add commit reference to <ID>", "link commit to <ID>" | Link git commit | Execute attach-commit directly (pass SHA for non-HEAD commits) |
document <ID> "<title>", add document to <ID>, create doc on <ID> | Create document | Execute document with title and content |
| User provides text/markdown content to add to an issue | Comment vs document | See comment vs document decision below |
<ID> <description> | Create sub-issue | Go to create flow with parent |
<description> | Create issue | Go to create flow |
| (empty) | No input | Ask what they want to do |
Issue ID pattern: 2-4 uppercase letters followed by hyphen and numbers (e.g., ABC-123, PROJ-42).
Issue deletion: Only delete an explicitly requested ticket; never infer deletion from cancellation, completion, or duplicate status. delete is non-interactive and moves the issue to Linear's trash, recoverable from the team's Recently deleted issues for 30 days before permanent removal. It does not offer immediate permanent deletion. It needs no project config or team selection. Do not retry an uncertain deletion automatically; check Linear first.
Comment vs document vs attach vs attach-commit decision:
| Command | Use for | Key signal |
attach-commit | Git commit references — linking implementation work to a ticket | Any mention of "commit", "commit hash", "link the commit". Always prefer over a comment containing a commit hash. |
comment | Conversational updates — status notes, decisions, questions | "leave a comment", "add a note", "post an update" |
document | Structured editable content — specs, design docs, research notes | "add a doc", .md file references, long-form specs (use -f for files, -c for inline) |
attach | Binary files — images, PDFs, design files | File path to .png, .pdf, .fig, .zip; "attach this file", "upload this" |
Combined actions: "mark as done and add the commit" → done + attach-commit. "mark as done and leave a comment" → done + comment.
When ambiguous between comment and document, prefer comment.
Comment quality — what to write:
Focus on decisions, blockers, surprises, and state changes — not mechanical change inventories ("updated file X, changed Y to Z") visible in diffs. Extract the insight, not the inventory.
Good: "Switched from polling to SSE — polling hit rate limits under load. Estimate unchanged since the SSE client is already in the codebase." Bad: "Updated api.py to use SSE instead of polling. Changed the import on line 12. Added error handler on line 45."
Scope-change awareness — re-evaluate priority and estimate:
When adding a comment or updating a ticket's description that changes the scope of work (new ideas, expanded requirements, refined approach), always consider whether the priority and estimate still fit. Users often brainstorm on existing tickets — capturing new ideas via comments or rewriting descriptions — without explicitly thinking about how this affects sizing.
- After writing a comment or updating a description that changes scope, check the current priority and estimate
- If the new content meaningfully expands or narrows the work, adjust priority and/or estimate in the same
updatecall - Mention the adjustment in the output (e.g., "Bumped estimate S→M to reflect expanded scope")
- If scope changed but priority/estimate still fit, no action needed — don't adjust for the sake of it
</step>
<step name="resolve_assignee">
**When the user mentions an assignee casually (e.g., "assign to me", "assign to Roland", "give this to Sarah", "create a ticket for Alex"):**The CLI's --assignee accepts only an exact email or the @me sentinel. Fuzzy intent resolution happens here, at the skill layer — never rely on the CLI to guess.
- Self-assignment — if the user means themselves ("assign to me", "for me", "my ticket"), pass
--assignee @medirectly. Do not runmembers. - Otherwise, run
membersto fetch the active member list. - Fuzzy match the requested name in-context against
name,displayName, andemail. - If exactly one match, pass
--assignee <email>(the email, not the name). - If multiple matches, use AskUserQuestion to disambiguate with the matching names as options, then pass the chosen user's email.
- If no match, show available members and ask the user to clarify.
</step>
<step name="direct_commands">
**For direct commands (delete, done, state, get, states, projects, create-project, delete-project, update-project, milestones, create-milestone, delete-milestone, cycles, cycle, create-cycle, update-cycle, labels, create-label, delete-label, update-label, views, create-view, update-view, view-issues, delete-view, update, comment, update-comment, delete-comment, attach-commit, members):**Execute CLI and format output.
uv run ~/.agents/skills/linear/scripts/linear.py [command] [args]Long Markdown: Use create/update --description-file path or comment/update-comment --body-file path instead of shell interpolation. Files are UTF-8 and sent unchanged; file and inline inputs are mutually exclusive. An empty description file clears the description on update.
Partial edits: Fetch the current text before replacing it; preserve unchanged sections. For multi-issue work, keep successful receipts and retry only failed operations, not the whole batch. After an uncertain create/comment outcome, check Linear before retrying to avoid duplicates.
Round trips: Linear may normalize bullets, blank lines, and email links; these alone do not indicate lost content. If an angle-bracket link is rejected, convert [text](<URL>) to [text](URL), encoding spaces and parentheses in the destination. Preserve the URL—do not strip the link.
Parse JSON response and present result:
- Success: Show identifier, title, new state, and URL
- For
delete: Show identifier and title, and report moved to trash (recoverable for 30 days), not a workflow-state change. - For
projects/labels: List grouped by team - Error: Show error message and suggestions
</step>
<step name="create_flow">
**For create/sub-issue — FAST PATH:**- Parse input for hints:
- Title from first sentence or quoted text
- Priority hints: "urgent", "high priority", "low priority", "blocker"
- Estimate hints: "XS", "S", "M", "L", "XL", "small", "medium", "large"
- Parent ID if pattern
<ID> <description> - Project hints: "in [Project]", "for [Project]", "(project: [Name])", "[Project] project"
Infer project and labels from the description:
Run
projectsandlabelsto fetch available options (cache across the session — don't re-fetch if already retrieved this conversation).Project inference:
- If user explicitly named a project in their message → use it
- Otherwise, match the ticket's domain/area against available project names and descriptions
- If exactly one project is a clear match → pre-select it (confirm in step 4)
- If multiple plausible matches or no match → include project selection in step 4's AskUserQuestion
- If no projects match and the ticket represents a new area of work → include a "Create new project: [suggested name]" option in step 4
Label inference:
- If user explicitly named labels → use them
- Otherwise, match against available labels by category (e.g., platform, area, type)
- Pre-select labels that clearly apply (confirm in step 4)
- If the ticket's domain suggests a label that doesn't exist → include a "Create label: [suggested name]" option in step 4
defaultLabelsfrom.linear.jsonapply when no explicit or inherited labels are used; if you pass--label, include every desired label
Infer priority and estimate from the description:
Priority inference — based on user impact:
Priority reflects how many users are affected and how central the affected flow is to the product. Not how hard the fix is (that's what estimate captures).
Score by asking: how many users benefit, how central is this to what makes the product valuable, and does it move a success metric (engagement, growth, retention, monetization)?
Priority Bugs / Issues New Features / Improvements Urgent (1) Broken core flow. Most users hit this. Blocked, losing data, cannot work around it. Rare for features. Only if a critical gap is actively causing churn or blocking a launch. High (2) Degraded core flow OR broken secondary flow. Core flow works but with significant friction or incorrect behavior. OR a regularly-used secondary flow is broken. Strengthens the core USP. Directly tied to the product's unique value proposition or the core problem it solves. Benefits most users. Likely to drive engagement, retention, or growth. Normal (3) Non-critical bug. Affects a moderate number of users or a less common flow. Workaround exists. Meaningful improvement. Elevates an existing flow or adds a useful capability. Benefits a decent user segment. Improves satisfaction but not directly tied to the core differentiator. Low (4) Edge case or cosmetic. Small subset of users, rare trigger, visual-only. Peripheral or niche. Benefits few users, adds to a rarely-used flow, or is a nice-to-have that doesn't move a success metric. Quick signals (disambiguation beyond the table):
- "Users can't ___" → Urgent or High
- "Users have to work around ___" → High
- "This would make ___ much better" → Normal
- "Sometimes when ___ happens" (edge case) → Low
- "It would be nice if ___" → Low
- Feature that drives engagement/retention/monetization → bump up one level
Estimate inference — calibrated for Claude Code development:
Estimates reflect effort when Claude Code does the implementation. Repetitive refactoring across files may be easy for AI; work needing context discovery may be harder.
Estimate Criteria Effort signals XS (1) 1 file, clear fix, no ambiguity. Config change, typo fix, remove dead code. Isolated, no downstream consumers, additive only S (2) 1-2 files, known approach. Single-file rewrite, pure research/audit with no code changes. Known approach, clear root cause M (3) 2-5 files, known approach but coordination needed. Template + references update, new agent mirroring existing pattern. Some coordination, one obvious approach L (5) 5+ files, OR requires investigation, OR replaces existing functionality. New command with workflow, multi-file migration. Investigation required, multiple valid approaches, breaking changes XL (8) Architectural change, OR 8+ files, OR fundamentally changes a major system part. New subsystem, cross-cutting refactor, deprecating multiple commands. Core path with many dependents, fundamentally changes major system Quick signals:
- Pure research/audit (no code changes) → cap at S (2)
- Root cause already known (in comments/description) → reduce by one size
- "Evaluate whether" / "investigate" → at least M (3) for the decision overhead
- Replacing N existing commands/workflows → at least L (5)
- Parent ticket with sub-issues → remove estimate from parent (sub-issues carry their own)
Check for "problem to solve":
If the user only provided implementation details (e.g., "add a retry flag to the API call") without a user-facing problem, ask: "What's the problem you're solving from a user perspective?" before proceeding. The answer becomes the ticket's core framing.
Skip this check if the user already stated a problem (e.g., "users lose data when the connection drops").
Ask UP TO 4 questions in ONE AskUserQuestion call:
Combine these into a single batch:
Confirmation question: Show inferred priority/estimate and inferred project/labels, ask to confirm or adjust
Project/label question (if needed):
- If project is ambiguous or unmatched → list matching projects as options, include "Create new project: [name]" if appropriate
- If labels need confirmation or a new label is suggested → list as multi-select options, include "Create label: [name]" for new ones
- If project and labels were confidently inferred → just show them in the confirmation question, no separate question needed
High-impact domain questions (pick 1-2 most relevant):
- Scope clarification: "Should this [specific behavior] or [alternative]?"
- Edge cases: "What should happen when [edge case]?"
- Acceptance criteria: "What's the minimum for this to be done?"
- Context: "Is this related to [existing feature/area]?"
Skip questions with obvious answers from description. If description is very clear, may only need confirmation.
Create immediately after answers:
If user approved creating a new project or label, create it first via
create-projectorcreate-label, then use the result in thecreatecommand.Structure the description as:
## Problem [1-2 sentences: the user-facing problem or need] ## Solution [1-3 sentences: what this ticket delivers] ## Details - [Key requirements or constraints from user's answers]Omit
## Detailsif there's nothing beyond what Problem/Solution already covers. Keep it concise — a few lines beats a wall of text.A description states the observed problem, the agreed outcome as an invariant, and pointers to evidence. It does not prescribe mechanisms, list scenarios per role, environment, platform or call site, or enumerate what not to build; one boundary sentence is enough. Name platform or device checks only when the code branches on platform.
uv run ~/.agents/skills/linear/scripts/linear.py create "[title]" \ -d "[structured description]" -p [priority] -e [estimate] \ [--parent ID] [--project "Name"] [--label "name"] [--no-project] \ [--cycle <number-or-"active">]Format result:
Created: **[identifier]** — [title] Project: [project name] | Labels: [label1, label2] [url]
</step><step name="break_flow">
**For breaking down issues:**User provides the sub-issues in conversation. Do NOT propose or generate sub-issues.
- Get sub-issue list from user (they specify titles/estimates in their message)
Build JSON and execute:
uv run ~/.agents/skills/linear/scripts/linear.py break [ID] \ --issues '[{"title":"...","estimate":3},{"title":"...","estimate":2}]'Format result:
Created N sub-issues under [parent-identifier]: - **[ID-1]** — [title 1] - **[ID-2]** — [title 2]
</step><step name="error_handling">
**Handle errors gracefully:**- MISSING_API_KEY: Explain how to set LINEAR_API_KEY in project
.claude/settings.local.json - MISSING_CONFIG: For resolver-backed flows, this means a multi-team workspace has no team selected. Tell the user to pass
--team KEY, setLINEAR_TEAM, or create.linear.json; the error lists the available team keys. Some management commands still require.linear.jsondirectly and will say so. - TEAM_NOT_FOUND: The
--team/LINEAR_TEAMref matched no team. List the available team keys from the error suggestions. - ISSUE_NOT_FOUND: Suggest checking the identifier
- STATE_NOT_FOUND: List available states from
statescommand - PROJECT_NOT_FOUND: List available projects from
projectscommand - LABEL_NOT_FOUND: List available labels from
labelscommand - CYCLE_NOT_FOUND: Suggest using
cyclesto see available cycles - VIEW_NOT_FOUND: List available views from
viewscommand - FILE_NOT_FOUND: Suggest checking the file path
- UPLOAD_FAILED: Suggest retrying or checking connectivity
Always parse JSON error response and present human-friendly message with suggestions.
</step>
</process><success_criteria>
- No codebase exploration unless user explicitly requests it
- Create flow infers project and labels from available options before asking questions
- Create flow asks max 4 questions in ONE AskUserQuestion call
- Issue created immediately after user answers questions
- Errors handled with helpful suggestions
- Direct commands execute immediately without questions
- CLI output parsed and formatted for readability </success_criteria>
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

