Draft Pull Request Creator
wordpress-mobile/WordPress-Android
Commits and pushes current changes, writes a pull request title and body from the branch history and template, and opens a draft PR on GitHub after you approve it.
Turn a work-items.md file (produced by /plan-work-items) into Linear issues, one per slice, in a single target Linear team.
$ npx skills add testdouble/han --skill work-items-to-linear -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install testdouble/han work-items-to-linear --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/testdouble/han.git skills-src && mkdir -p .claude/skills && cp -r skills-src/han-linear/skills/work-items-to-linear .claude/skills/work-items-to-linear && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "work-items-to-linear" agent skill from https://github.com/testdouble/han/tree/main/han-linear/skills/work-items-to-linear into .claude/skills/work-items-to-linear/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "work-items-to-linear", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/testdouble/han/tree/main/han-linear/skills/work-items-to-linearType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add testdouble/han --skill work-items-to-linear -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install testdouble/han work-items-to-linear --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/testdouble/han.git skills-src && mkdir -p .agents/skills && cp -r skills-src/han-linear/skills/work-items-to-linear .agents/skills/work-items-to-linear && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "work-items-to-linear" agent skill from https://github.com/testdouble/han/tree/main/han-linear/skills/work-items-to-linear into .agents/skills/work-items-to-linear/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "work-items-to-linear", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add testdouble/han --skill work-items-to-linear -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install testdouble/han work-items-to-linear --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/testdouble/han.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/han-linear/skills/work-items-to-linear .cursor/skills/work-items-to-linear && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "work-items-to-linear" agent skill from https://github.com/testdouble/han/tree/main/han-linear/skills/work-items-to-linear into .cursor/skills/work-items-to-linear/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "work-items-to-linear", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/testdouble/han.git --path han-linear/skills/work-items-to-linear--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add testdouble/han --skill work-items-to-linear -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install testdouble/han work-items-to-linear --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/testdouble/han.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/han-linear/skills/work-items-to-linear .gemini/skills/work-items-to-linear && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "work-items-to-linear" agent skill from https://github.com/testdouble/han/tree/main/han-linear/skills/work-items-to-linear into .gemini/skills/work-items-to-linear/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "work-items-to-linear", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install testdouble/han work-items-to-linearInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add testdouble/han --skill work-items-to-linear -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/testdouble/han.git skills-src && mkdir -p .github/skills && cp -r skills-src/han-linear/skills/work-items-to-linear .github/skills/work-items-to-linear && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "work-items-to-linear" agent skill from https://github.com/testdouble/han/tree/main/han-linear/skills/work-items-to-linear into .github/skills/work-items-to-linear/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "work-items-to-linear", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add testdouble/han --skill work-items-to-linear -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install testdouble/han work-items-to-linear --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/testdouble/han.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/han-linear/skills/work-items-to-linear .opencode/skills/work-items-to-linear && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "work-items-to-linear" agent skill from https://github.com/testdouble/han/tree/main/han-linear/skills/work-items-to-linear into .opencode/skills/work-items-to-linear/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "work-items-to-linear", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
work-items-to-linearTurn a work-items.md file (produced by /plan-work-items) into Linear issues, one per slice, in a single target Linear team.
Work Items To Linear is an agent skill from testdouble/han. Turn a work-items.md file (produced by /plan-work-items) into Linear issues, one per slice, in a single target Linear team. Use when you want to publish work items as Linear issues, create implementation tickets to track in Linear, or push a broken-down plan into a Linear team. Requires a configured Linear MCP server and a target team. Reads the team's real workflow states, labels, Projects, and members and resolves every option against them before creating anything; defaults each issue to the team's initial…
Its SKILL.md is about 3.8k tokens, which your agent loads only when the skill is triggered. The skill folder holds 4 other files, including reference files (for example `references/linear-issue-template.md`, `references/reference-artifact-inventory.md` and `references/work-items-file-format.md`).
It works with Linear, Jira and GitHub. The repository describes itself as: Han: AI skills and agents for "Solo" product engineers and small teams. The licence is MIT.
9 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit abba73a. It shows what the files ask for, not the result of running them.
Pre-approves these tools, so the agent can use them without asking each time:
ReadWriteEditGlobGrepBash(find *)mcp__plugin_linear_linear__save_issuemcp__plugin_linear_linear__get_issuemcp__plugin_linear_linear__list_teamsmcp__plugin_linear_linear__list_issue_statuses…and 5 more on the same allowed-tools line.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
bashFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Work Items To Linear loads about 3.8k tokens when it runs, and up to ~7.2k if it reads all its reference files. Until then it costs about 231 tokens; SKILL.md has 1,876 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from testdouble/han at commit abba73a, republished under its MIT licence (© testdouble). 1,876 words, ~3,786 tokens.
.claude/skills/work-items-to-linear/SKILL.md (or your agent's skills folder). This skill also uses 3 other files; get the full folder from GitHub.bash "${CLAUDE_PLUGIN_ROOT}/scripts/han-config-dir.sh" 2>/dev/null || echo "$HOME/.claude"cat .han/config.md 2>/dev/null || echo ""As your first action, use the Read tool on .han/config.md inside the personal config directory path above. A read
that returns no file is no personal configuration: continue silently. When that file or the project .han/config.md
probe supplies content, apply it per config-rule.md, which governs precedence
between the two files, relative-path resolution, and what to do with a file that reads but cannot be used.
Take an already-broken-down work-items.md file (produced by /plan-work-items) and publish each slice as a Linear
issue in a single target team.
The breakdown work — drafting slices, assigning symbolic IDs, specifying dependencies, inventorying references — has already been done upstream. This skill validates the format, confirms the target against the live team, creates one issue per slice through the Linear MCP server, links the within-file dependencies as native "blocked by" relations, and reports.
work-items.md
that names multiple code repos still produces issues in the single team you name; the repo prose is informational
only.Depends on line must resolve to another slice in the
same file. A Depends on that names an unknown SYM, names the slice itself, or forms a cycle is a format error to
surface for repair, never published.W-N, V2-N, EV-N,
...); the prefix has no effect on team placement.artifacts/ subfolder of the
plan that is not a contract or design reference.This skill cannot run without a configured and connected Linear MCP server. Confirm it is reachable by calling
mcp__plugin_linear_linear__list_teams. If the tool is unavailable, the call errors, or no workspace is accessible,
stop immediately and tell the user the skill requires the Linear MCP server to be installed, configured, and
authenticated. Do not fall back to any other publishing target.
If the integration exposes more than one Linear workspace, note which are available and confirm which one to use before resolving the team.
If the path is not provided, ask for it. The input is a single work-items.md produced by /plan-work-items. Read it.
Its format is described in references/work-items-file-format.md.
Read these from the arguments and conversation; do not guess defaults the user did not ask for:
--team <name or key>. Required. If absent, ask for it in Step 3.--project <name or ID>. Optional. Groups every created issue under a Linear Project.--parent <issue id>. Optional. Nests every created issue as a sub-issue under the named parent.--state <name>. Optional; defaults to the team's initial/default workflow state.--label <name>, repeatable. Optional; resolved against the team's real labels.--assignee <name/email/me>. Optional; defaults to unassigned.Resolve everything concretely now so failures surface before any issue is created. This is a strict, fail-before-write sequence:
mcp__plugin_linear_linear__list_teams. If none is named, ask. If
the name matches more than one team, present the matches and ask which one. Do not proceed without exactly one team.mcp__plugin_linear_linear__list_issue_statuses,
mcp__plugin_linear_linear__list_issue_labels, and mcp__plugin_linear_linear__list_users. These reads are
independent and may run together.--state was given, match it against the team's real states. The default is the team's initial/default
state. If a named state does not exist, present the team's real states and ask.--labels were given, match each against the team's labels. When categorization was not specified,
present the team's real labels and let the user choose one, several, or none. If the team defines no labels, say so
and proceed without categorization.mcp__plugin_linear_linear__get_user: the literal token me resolves to the
authenticated Linear identity, and a name or email resolves to that member. If unset, leave issues unassigned. The
creator is recorded automatically by Linear as the authenticated user; never set it.mcp__plugin_linear_linear__list_projects
(Projects are not strictly team-scoped), and confirm the target team participates in it.mcp__plugin_linear_linear__get_issue and confirm it belongs
to the target team.For any option that cannot be resolved, do not silently drop or invent it. Distinguish "no such option exists in the team" (present the team's real options for that field) from "it exists but belongs to a different team" (name that team). Ask the user to pick or correct before continuing.
Check the work-items file against the invariants in references/work-items-file-format.md and references/linear-issue-template.md:
## <SYM-N> — <title> with an em-dash separator (already-published
headings annotated as ## <SYM-N> (<LINEAR-ID>) — <title> are valid too).Depends on line. Literal bold marker **Depends on.**, trailing period, None. or comma-separated SYMs.Depends on line resolves to another slice in this file. A SYM that
names the slice itself (self-block) or that forms a dependency cycle with other slices is a format error.artifacts/ subfolder that is not a contract or design reference.When a check fails, attempt evidence-based repair. Pull evidence from the source work-items.md, the parent plan
referenced in its intro, the feature spec in the same folder, sibling files in the plan folder, and the relevant repo's
ADRs / coding standards / docs:
Depends on line — propose None. if no blockers are evident. Cite the absence.None., or
breaking the cycle. Cite the SYM list this file defines.After validation, report findings in plain language. For each: (1) what is wrong — slice SYM, line reference, failing invariant; (2) the proposed fill — corrected line, new bullet, removed link; (3) the evidence — file path with line number, document section, or named source.
Then give the user three actions: Continue with fills (apply the repairs to the source work-items.md and proceed),
Correct the fills (user provides the right values; apply those and proceed), or Stop (exit without creating
issues). If validation passes with no findings, proceed to Step 5.
Creating Linear issues writes to a shared system, so confirm before doing it. Present a summary and wait for an explicit yes:
(<LINEAR-ID>)
annotation.| SYM | Title | Depends on |
|---|---|---|
| W-1 | ... | None |
| W-2 | ... | W-1 |
State the total count of issues to create and how many slices are being skipped because they already carry an identifier. Do not create anything until the user confirms.
Walk the slices in file order. Skip any slice whose heading already carries a (<LINEAR-ID>) annotation so a re-run
resumes cleanly. Creation order does not affect correctness, because dependency relations are made in Step 7 once every
issue exists. For each remaining slice, call mcp__plugin_linear_linear__save_issue with:
— in the heading),blockedBy here — relations are made in Step 7.After each successful create, capture the returned Linear identifier and rewrite that slice's heading in place from
## <SYM-N> — <title> to ## <SYM-N> (<LINEAR-ID>) — <title> using Edit, so dependencies resolve and re-runs skip it.
Report each creation as created: <SYM-N> -> <LINEAR-ID>.
If a create succeeds but the heading annotation fails, stop. Report the orphaned Linear identifier so the user can annotate the heading by hand or delete the issue. Do not continue creating, and do not run the link pass — the file state is inconsistent until the user resolves it.
Once every slice has a Linear identifier, build the SYM-to-identifier map from the annotated headings. This pass runs over the whole annotated file on every run (including identifiers carried over from a prior run), not only over newly created issues, so a link step interrupted earlier completes on the next run.
Relations are made after all issues exist because a blocked by relation needs both endpoints to exist, and file order
is not guaranteed to be blocker-first.
mcp__plugin_linear_linear__get_issue. Surface any that do not resolve to the user before making any
relation; never link to a missing or wrong issue.**Depends on.** line (skip None.), call
mcp__plugin_linear_linear__save_issue on the dependent issue with blockedBy set to each blocker's identifier.
Relations are append-only and de-duplicated, so a re-run does not duplicate them; no per-relation pre-read is needed.Report each as linked: <SYM-A>(<LINEAR-A>) blocked_by <SYM-B>(<LINEAR-B>).
Summarize: the team, the Project and parent (if any), the workflow state, the labels and assignee (or "none" /
"unassigned"). List every created issue as <SYM-N> — <LINEAR-ID> with its URL, the count of native "blocked by"
relations created, and any slices skipped because they already carried an identifier. If any step failed, report the
error and confirm the source work-items.md annotations reflect exactly which issues were created, so the user can
re-run safely.
© testdouble, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 3 other files (references) in han-linear/skills/work-items-to-linear of testdouble/han.
Open the folder on GitHubat commit abba73a
Work Items To Linear next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Work Items To Linear this skilltestdouble/han | 279 | — | ~3.8k | Automated safety check: Pass | MIT | |
| Draft Pull Request Creatorwordpress-mobile/WordPress-Android | 3.2k | — | ~881 | Automated safety check: Notes | GPL-2.0 | |
| YugabyteDB Issue Creatoryugabyte/yugabyte-db | 11k | — | ~2k | Automated safety check: Pass | Custom licence | |
| Connect Apps with ComposioComposioHQ/awesome-claude-skills | 77k | 3 repos | ~557 | Automated safety check: Pass | None | |
| Link Ticket To SessionJayantDevkar/claude-code-karma | 329 | — | ~1.8k | Automated safety check: Notes | Apache-2.0 | |
| Octo LoopMininglamp-OSS/octo-cli | 918 | — | ~2.3k | Automated safety check: Pass | Apache-2.0 |
wordpress-mobile/WordPress-Android
Commits and pushes current changes, writes a pull request title and body from the branch history and template, and opens a draft PR on GitHub after you approve it.
yugabyte/yugabyte-db
Creates a GitHub issue or JIRA ticket for a YugabyteDB change or bug, after scrubbing customer data, secrets and unreleased details from anything public.
ComposioHQ/awesome-claude-skills
Connects an agent to 1000+ external apps through the Composio Tool Router plugin, so it can actually send emails, create issues and post messages instead of only drafting them.
JayantDevkar/claude-code-karma
Link the current Claude Code session to a ticket (Linear, Jira, GitHub Issues, or GitHub Pull Requests) and cache its title/status in karma.
Mininglamp-OSS/octo-cli
A skill your agent uses when operating the Octo Loop control plane through the octo-cli loop commands: reading or writing Fleet tasks, comments, metadata, projects, and labels; dispatching work to…
ioteverythin/OpenDocs
Generates multi-format documentation (Word, PDF, PPTX, Markdown blog post, JIRA ticket, FAQ, changelog, LaTeX, social snippet, architecture diagram) from a GitHub README, npm package, local Markdown…
testdouble/han
Convert a stakeholder summary markdown file into a single self-contained HTML executive report — bottom line and decision asks up front, supporting detail later — styled with a Test Double-derived…
testdouble/han
Update Han plugin documentation so every skill, agent, guidance doc, index, and cross-reference is current and accurate.
testdouble/han
Authoritative guidance for building Claude Code skills, agents, and plugins, plus init and update steps that install and refresh the plugin-building skills in the current repository.
testdouble/han
Cut a Han release: update CHANGELOG.md with the changes since the last release, bump and tag every plugin that changed as {plugin-name}--v{version} so a version-constrained dependency can resolve…
testdouble/han
Builds a feature implementation plan from an existing feature specification (or equivalent context) through a facilitated team conversation.
testdouble/han
Restructure existing code without changing its behavior, through a test-gated refactoring loop: a named target, a green suite over that target before any edit, a planned sequence of small named…
Turn a work-items.md file (produced by /plan-work-items) into Linear issues, one per slice, in a single target Linear team. Work Items To Linear is an agent skill from testdouble/han.md file (produced by /plan-work-items) into Linear issues, one per slice, in a single target Linear team.
Work Items To Linear fits situations like: you want to publish work items as Linear issues; create implementation tickets to track in Linear; push a broken-down plan into a Linear team.
Run `npx skills add testdouble/han --skill work-items-to-linear -a claude-code`. Or copy the skill folder (han-linear/skills/work-items-to-linear in testdouble/han) into .claude/skills/work-items-to-linear in your project. Claude Code loads it when a task matches its description.
Run `npx skills add testdouble/han --skill work-items-to-linear -a codex`. Or copy the skill folder (han-linear/skills/work-items-to-linear in testdouble/han) into .agents/skills/work-items-to-linear in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add testdouble/han --skill work-items-to-linear -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/work-items-to-linear, .gemini/skills/work-items-to-linear, .github/skills/work-items-to-linear and .opencode/skills/work-items-to-linear in your project.
Going by SKILL.md and its folder, Work Items To Linear needs the command-line tools its instructions call (bash). Its frontmatter pre-approves these tools: Read, Write, Edit, Glob, Grep, Bash(find *), mcp__plugin_linear_linear__save_issue, mcp__plugin_linear_linear__get_issue, mcp__plugin_linear_linear__list_teams, mcp__plugin_linear_linear__list_issue_statuses, mcp__plugin_linear_linear__list_issue_labels, mcp__plugin_linear_linear__list_users, mcp__plugin_linear_linear__get_user, mcp__plugin_linear_linear__list_projects, Bash(bash "${CLAUDE_PLUGIN_ROOT}/scripts/han-config-dir.sh").
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Work Items To Linear is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 3.8k tokens (SKILL.md is roughly 15k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 3.5k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Work Items To Linear: Draft Pull Request Creator (wordpress-mobile/WordPress-Android, 3.2k stars), YugabyteDB Issue Creator (yugabyte/yugabyte-db, 11k stars), Connect Apps with Composio (ComposioHQ/awesome-claude-skills, 77k stars) and Link Ticket To Session (JayantDevkar/claude-code-karma, 329 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
testdouble (a GitHub organization) maintains it in testdouble/han, which has 279 GitHub stars. The repository holds 54 skills in this directory. The repository was last updated on October 1, 2026.
Source: testdouble/han on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.