From dh-skills
Turn raw client feedback, bug reports, chat snippets, screenshots, or any loose request into a well-structured Linear ticket, attach any supplied images, and publish it in the Triage state. Use when the user asks to "create a Linear ticket", "log this request", "file a bug", or hands over client messages/screenshots to be documented.
How this skill is triggered — by the user, by Claude, or both
Slash command
/dh-skills:linear-ticket-createThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Take any incoming material — a WhatsApp/Slack snippet, an emailed client request, a bug
Take any incoming material — a WhatsApp/Slack snippet, an emailed client request, a bug description, a screenshot, a voice-note transcript, a half-formed idea — and turn it into a clear, actionable Linear ticket that lands in Triage for the team to prioritise.
The goal is a ticket a developer can pick up cold: the what, the why, where in the code it likely lives, and how to know it's done.
Each ticket is implemented by a single pull request, usually as one branch in a Graphite stack. Size tickets accordingly — a reviewer should be able to digest the resulting PR in one sitting, and the ticket should be shippable on its own (or as one clean layer of a stack).
Decide how to carve the input into tickets:
When the input yields several stacked tickets, order them by dependency (the order the PRs
will stack in Graphite) and link them with blocks / blockedBy on save_issue so the stack
order is explicit. Give each ticket enough shared context to be picked up cold.
Run step 1 once, decide the ticket breakdown, then run steps 3–8 per ticket.
grep/Glob for the literal wording, label, function, or symptom described.file_path:line references.mcp__linear__list_teams to resolve the team. This workspace has a single team,
Developer Hut (issue prefix DEV-). Pass team: "Developer Hut" when creating.mcp__linear__list_issue_labels with team: "Developer Hut" before creating
the issue. Labels change over time — never hardcode the list; read the current set each time.Bug, Feature, Improvement, Chore, Tests, Content changes,
UI, Investigation, Proof Of Concept, Foundational.Small, Medium, Large, Quick Win, High Complexity.Showstopper (prod-breaking), Support, Need client feedback
(use when scope is unconfirmed and you've flagged an open question).Jackpots, Spin Wheel (apply only if clearly relevant).Content changes; visual/layout → UI;
defect → Bug; new capability → Feature; small/contained → Small/Quick Win;
unconfirmed scope with an open question in the ticket → Need client feedback.Call mcp__linear__save_issue (no id → creates new). Provide:
team: "Developer Hut"
title: concise, action-oriented (what changes, where). Not a restatement of the symptom.
priority: 1=Urgent, 2=High, 3=Medium, 4=Low. Default to 3 (Medium) unless the input
signals urgency (client blocked, production bug → higher).
labels: array of label names chosen in step 4 (e.g. ["Content changes", "Small"]).
description: Markdown using literal newlines, not \n. Scope it to this ticket's single
PR. Recommended structure:
Source (channel + date, e.g. "Client request, WhatsApp, 29 May 2026").
## What
The change this PR makes, quoting the client's exact wording in a blockquote when wording
matters. (If this ticket bundles a couple of tightly-coupled sub-changes, list them here.)
## Implementation notes
Where it lives in the code: `path/to/file.ts` (function, line refs) and any facts gathered.
Flag related variants / open scope questions.
## Acceptance criteria
- [ ] Verifiable outcome 1
- [ ] Verifiable outcome 2
For a stack, set blocks / blockedBy to encode the PR order, and reference the sibling
ticket(s) by identifier in the description so the stack is navigable.
Capture the returned identifier (e.g. DEV-541) and url for the next steps and the summary.
Linear image upload is a 3-step signed-upload flow. Get the exact byte size first:
stat -c '%s' <file> and the MIME via file --mime-type -b <file>.
mcp__linear__prepare_attachment_upload with issue, filename, contentType, size
(exact bytes), and a descriptive title. Returns assetUrl + uploadRequest.
PUT the raw bytes to uploadRequest.url within 60 seconds. Send every header from
uploadRequest.headers verbatim (casing included) or you get HTTP 403:
curl -s -o /dev/null -w "%{http_code}" -X PUT --data-binary @<file> \
-H "content-type: <mime>" \
-H "cache-control: public, max-age=31536000" \
-H "x-goog-content-length-range: <size>,<size>" \
-H 'Content-Disposition: attachment; filename="<filename>"' \
"<uploadRequest.url>"
Expect 200. Do not transform or base64-encode the file.
mcp__linear__create_attachment_from_upload with issue, the assetUrl, and title.
mcp__linear__save_issue with id: <identifier> and state: "Triage".url.blocks/blockedBy in PR order.file_path:line references and gathered facts; never guess.list_issue_labels and apply
what genuinely fits; never hardcode labels or invent new ones.Provides a checklist for code reviews covering functionality, security, performance, maintainability, tests, and quality. Use for pull requests, audits, team standards, and developer training.
npx claudepluginhub developer-hut/marketplace --plugin dh-skills