Link Ticket To Session
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.
This skill should be used when the user asks to "set up a Jira automation to create pull requests", "poll Jira for create-pr issues", "automatically create GitHub PRs from Jira tickets", "deploy a…
$ npx skills add OpenHands/extensions --skill jira-issue-to-pr -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install OpenHands/extensions jira-issue-to-pr --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/OpenHands/extensions.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/jira-issue-to-pr .claude/skills/jira-issue-to-pr && 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 "jira-issue-to-pr" agent skill from https://github.com/OpenHands/extensions/tree/main/skills/jira-issue-to-pr into .claude/skills/jira-issue-to-pr/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "jira-issue-to-pr", 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/OpenHands/extensions/tree/main/skills/jira-issue-to-prType 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 OpenHands/extensions --skill jira-issue-to-pr -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install OpenHands/extensions jira-issue-to-pr --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/OpenHands/extensions.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/jira-issue-to-pr .agents/skills/jira-issue-to-pr && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "jira-issue-to-pr" agent skill from https://github.com/OpenHands/extensions/tree/main/skills/jira-issue-to-pr into .agents/skills/jira-issue-to-pr/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "jira-issue-to-pr", 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 OpenHands/extensions --skill jira-issue-to-pr -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install OpenHands/extensions jira-issue-to-pr --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/OpenHands/extensions.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/jira-issue-to-pr .cursor/skills/jira-issue-to-pr && 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 "jira-issue-to-pr" agent skill from https://github.com/OpenHands/extensions/tree/main/skills/jira-issue-to-pr into .cursor/skills/jira-issue-to-pr/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "jira-issue-to-pr", 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/OpenHands/extensions.git --path skills/jira-issue-to-pr--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 OpenHands/extensions --skill jira-issue-to-pr -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install OpenHands/extensions jira-issue-to-pr --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/OpenHands/extensions.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/jira-issue-to-pr .gemini/skills/jira-issue-to-pr && 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 "jira-issue-to-pr" agent skill from https://github.com/OpenHands/extensions/tree/main/skills/jira-issue-to-pr into .gemini/skills/jira-issue-to-pr/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "jira-issue-to-pr", 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 OpenHands/extensions jira-issue-to-prInstalls 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 OpenHands/extensions --skill jira-issue-to-pr -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/OpenHands/extensions.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/jira-issue-to-pr .github/skills/jira-issue-to-pr && 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 "jira-issue-to-pr" agent skill from https://github.com/OpenHands/extensions/tree/main/skills/jira-issue-to-pr into .github/skills/jira-issue-to-pr/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "jira-issue-to-pr", 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 OpenHands/extensions --skill jira-issue-to-pr -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install OpenHands/extensions jira-issue-to-pr --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/OpenHands/extensions.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/jira-issue-to-pr .opencode/skills/jira-issue-to-pr && 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 "jira-issue-to-pr" agent skill from https://github.com/OpenHands/extensions/tree/main/skills/jira-issue-to-pr into .opencode/skills/jira-issue-to-pr/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "jira-issue-to-pr", 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.
jira-issue-to-prThis skill should be used when the user asks to "set up a Jira automation to create pull requests", "poll Jira for create-pr issues", "automatically create GitHub PRs from Jira tickets", "deploy a…
Jira Issue To PR is an agent skill from OpenHands/extensions. This skill should be used when the user asks to "set up a Jira automation to create pull requests", "poll Jira for create-pr issues", "automatically create GitHub PRs from Jira tickets", "deploy a Jira issue-to-PR automation", "create a Jira to GitHub PR workflow", or mentions automating GitHub PR creation from a Jira label. Deploys a cron-based OpenHands automation that watches a Jira Cloud project for issues labeled with a configurable label (default: "create-pr") and spawns an agent conversation to create a…
Its SKILL.md is about 4.1k tokens, which your agent loads only when the skill is triggered. The skill folder holds 10 other files, including scripts and reference files (for example `.plugin/plugin.json`, `README.md` and `references/setup.md`).
It sits in Development, covering Pull requests and Scheduled and recurring tasks. It works with Jira and GitHub. The repository describes itself as: Public registry for OpenHands extensions. The licence is MIT.
6 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit d008b81. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Ships 2 files in scripts/ (Python), which the agent can run.
Shell commands in SKILL.md call:
curlpython3opensslFrom the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
acme.atlassian.netFrom URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
JIRA_ADMIN_TOKENOPENHANDS_API_KEYJIRA_CLOUD_KEYAUTOMATION_KV_TOKENOPENHANDS_AUTOMATION_API_KEYWEBHOOK_SECRETFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Jira Issue To PR loads about 4.1k tokens when it runs, and up to ~5.8k if it reads all its reference files. Until then it costs about 174 tokens; SKILL.md has 1,834 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); the scripts in this folder are not scanned.
The full file from OpenHands/extensions at commit d008b81, republished under its MIT licence (© OpenHands). 1,834 words, ~4,126 tokens.
.claude/skills/jira-issue-to-pr/SKILL.md (or your agent's skills folder). This skill also uses 7 other files; get the full folder from GitHub.Deploys a cron automation that polls a Jira Cloud instance for open issues carrying a configurable label and, for each new issue, starts an OpenHands agent conversation that clones the GitHub repository specified in the ticket body, creates a branch, implements or placeholders the requested change, and opens a pull request. Once the conversation starts, it also posts a comment on the Jira ticket: "I'm on it: <conversation URL>".
POST /rest/api/3/search/jql on the Jira Cloud instance
to find open issues with the configured label.first_run_at baseline
timestamp in the KV store; any issue whose updated timestamp predates that baseline
is skipped (no backfill blast on first deploy). Using updated rather than created
means an old issue that has its label added after the automation is deployed will still
be picked up. Subsequent runs filter by both first_run_at and a KV-backed set of
already-processed issue keys. A max_new_per_run cap (default 5) limits conversations
started per cron firing as additional defense-in-depth.POST /api/conversations on the agent server when running locally,
or POST /api/v1/app-conversations on OpenHands Cloud. The prompt instructs the agent
to extract the target GitHub repository (owner/repo) from the ticket body.I'm on it: <conversation URL>.The polling run is lightweight (stdlib only, no SDK install); LLM costs are incurred only when new issues are actually found.
Before deploying, ensure the following are in place:
| Requirement | Details |
|---|---|
| Jira API token | Stored as an OpenHands secret (see Jira API token setup) |
| GitHub access | Local: a GitHub token stored as an OpenHands secret with repo + workflow scope so the spawned conversation can push branches and open PRs. OpenHands Cloud: the spawned conversation uses the user's connected GitHub integration (native integration recommended, or the GitHub MCP server) |
| KV store (OpenHands Cloud only) | The automation service must have its KV store enabled (kvStore in GET /api/automation/v1/capabilities); each cloud run starts in a fresh sandbox, so processed issues are remembered there |
| Jira label | The label to watch for (default: create-pr) must exist in the Jira project |
| GitHub repo | The target repository must exist and the GitHub token must have write access |
Set OPENHANDS_HOST and AUTH_HEADER for the curl commands below:
<HOST> value is present in the system prompt:OPENHANDS_HOST="<HOST value>"
AUTH_HEADER="Authorization: Bearer $OPENHANDS_API_KEY"<HOST> value:OPENHANDS_HOST="http://localhost:8000"
AUTH_HEADER="X-Session-API-Key: $OPENHANDS_AUTOMATION_API_KEY"Gather the following from the user before proceeding:
| Parameter | Example | Notes |
|---|---|---|
jira_base_url | https://acme.atlassian.net | No trailing slash |
jira_email | alice@acme.com | Atlassian account email for Basic auth |
jira_token_secret | JIRA_CLOUD_KEY | Name of the OpenHands secret holding the API token |
jira_label | create-pr | Label to watch for (optional, defaults to create-pr) |
max_new_per_run | 5 | Max conversations dispatched per cron firing (optional, defaults to 5) |
cron_schedule | */5 * * * * | Polling frequency in cron syntax |
Note: The GitHub repository is not configured here. Each Jira ticket body must include a reference to the target GitHub repo in
owner/repoformat (e.g.acme-org/backend). The spawned agent extracts it from the ticket text.
Create config.json next to scripts/main.py when packaging:
{
"jira_base_url": "https://acme.atlassian.net",
"jira_email": "alice@acme.com",
"jira_token_secret": "JIRA_CLOUD_KEY",
"jira_label": "create-pr",
"max_new_per_run": 5
}Copy scripts/main.py from this skill and package it with the config.json:
WORK=$(mktemp -d)
cp <skill-dir>/scripts/main.py "$WORK/main.py"
# write config.json into $WORK/config.json (see Step 2)
tar -czf /tmp/jira-issue-to-pr.tar.gz -C "$WORK" .
python3 -m py_compile "$WORK/main.py" # validate syntax before uploadingTARBALL_PATH=$(curl -s -X POST \
"${OPENHANDS_HOST}/api/automation/v1/uploads?name=jira-issue-to-pr" \
-H "$AUTH_HEADER" \
-H "Content-Type: application/gzip" \
--data-binary @/tmp/jira-issue-to-pr.tar.gz \
| python3 -c "import sys,json; print(json.load(sys.stdin)['tarball_path'])")curl -s -X POST "${OPENHANDS_HOST}/api/automation/v1" \
-H "$AUTH_HEADER" \
-H "Content-Type: application/json" \
-d "{
\"name\": \"Jira issue-to-PR Poller\",
\"trigger\": {
\"type\": \"cron\",
\"schedule\": \"*/5 * * * *\",
\"timezone\": \"UTC\"
},
\"tarball_path\": \"$TARBALL_PATH\",
\"entrypoint\": \"python3 main.py\",
\"timeout\": 540
}" | python3 -m json.toolSave the returned id - use it for updates and monitoring.
curl -s -X POST \
"${OPENHANDS_HOST}/api/automation/v1/<AUTOMATION_ID>/dispatch" \
-H "$AUTH_HEADER" | python3 -m json.tool
# After ~30 seconds, check the run status:
curl -s "${OPENHANDS_HOST}/api/automation/v1/<AUTOMATION_ID>/runs?limit=1" \
-H "$AUTH_HEADER" \
| python3 -c "import sys,json; r=json.load(sys.stdin)['runs'][0]; print(r['status'], r.get('error_detail'))"Where Jira can reach the deployment over the internet (OpenHands Cloud and Enterprise),
Jira can push label events instead of being polled. That is a different automation from
the poller above: a prompt automation triggered by a Jira webhook, created with the
openhands-automation skill (see its "Custom Webhook Example: Jira Cloud").
scripts/main.py is not used, so its KV-backed deduplication and its "I'm on it"
comment do not apply; the prompt has to ask for whatever of that is wanted.
The webhook is a pair: a custom webhook source in OpenHands and an admin webhook in
Jira, sharing a signing secret. scripts/setup_webhook.py creates both, so the user
does not have to open Jira or copy a URL and secret by hand. It needs the API token of
an account with the Administer Jira permission, stored as an OpenHands secret.
Collect the Jira site URL, the account email, the name of the secret holding that
account's API token, and the label. A token used only for this step (for example
JIRA_ADMIN_TOKEN) can be deleted from the user's secrets afterwards.
Dry run, then ask. Registering a webhook changes the user's Jira site, so show what will be created and wait for the user to confirm:
OPENHANDS_API_KEY="$OPENHANDS_API_KEY" python3 <skill-dir>/scripts/setup_webhook.py apply --dry-run \
--jira-base-url "https://acme.atlassian.net" --jira-email "alice@acme.com" \
--jira-token-env JIRA_ADMIN_TOKEN --openhands-host "$OPENHANDS_HOST" --label create-prThe command has to name the secret (--jira-token-env JIRA_ADMIN_TOKEN): naming it is
what makes its value available to the command.
Apply - the same command without --dry-run. It registers the OpenHands webhook
(source jira, webhookEvent, X-Hub-Signature), creates the Jira webhook for
Issue created and Issue updated limited to labels = "create-pr", and sends one
signed test request. "signed_delivery_check": "ok" in its output means the pair works.
Running it again updates the Jira webhook in place and keeps the secret, so a
failure half way cannot break a working pair. Add --rotate-secret when the two
sides have drifted apart, for instance after the deployment was reinstalled.
The secret is generated inside the script and is never printed. Do not ask the user for it, and do not try to read or echo it.
If it exits with code 3, the account is not a Jira administrator. Fall back to Manual webhook setup.
To stop Jira sending events, for example when the automation is deleted, run the same
command with delete in place of apply.
Create the automation with this trigger:
{
"type": "event",
"source": "jira",
"on": ["jira:issue_created", "jira:issue_updated"],
"filter": "contains(issue.fields.labels, 'create-pr') && (webhookEvent == 'jira:issue_created' || length(changelog.items[?field == 'labels'] || `[]`) > `0`)"
}Jira sends labels as plain strings, so the filter reads issue.fields.labels, not
issue.fields.labels[].name. The changelog check limits updates to those that
change the labels; without it every later edit of a labelled issue starts another run.
It still fires when another label is added to or removed from an issue that
carries the label, so have the prompt skip an issue that already has a pull request.
To verify, add the label to an issue and check the automation's runs.
Use this when the Jira account is not an administrator: the user, or their Jira administrator, does both steps by hand.
"source": "jira", "event_key_expr": "webhookEvent"
and "signature_header": "X-Hub-Signature" (see the openhands-automation skill for
the request). The defaults (type, X-Signature-256) do not fit Jira: deliveries are
refused with 401, or accepted and never matched.webhook_url and secret, the Issue created and
Issue updated events, and a JQL filter such as labels = create-pr. A Jira
Automation rule cannot be used instead: its "Send web request" action is not signed.To test a manually configured webhook without Jira, sign a request the way Jira does:
BODY='{"webhookEvent":"jira:issue_created","issue":{"key":"TEST-1","fields":{"labels":["create-pr"]}}}'
SIG=$(printf '%s' "$BODY" | openssl dgst -sha256 -hmac "$WEBHOOK_SECRET" | awk '{print $NF}')
curl -s -X POST "<webhook_url>" -H "Content-Type: application/json" \
-H "X-Hub-Signature: sha256=$SIG" -d "$BODY""matched": 1 in the response means the trigger fired and a run was started.
To change configuration or update the script:
config.json with new values.tarball_path:curl -s -X PATCH \
"${OPENHANDS_HOST}/api/automation/v1/<AUTOMATION_ID>" \
-H "$AUTH_HEADER" \
-H "Content-Type: application/json" \
-d "{\"tarball_path\": \"<NEW_TARBALL_PATH>\"}"To reprocess issues that were already handled (e.g., after testing), clear the KV store:
curl -s -X DELETE \
"${OPENHANDS_HOST}/api/automation/v1/<KV_BASE>/v1/kv/state" \
-H "Authorization: Bearer $AUTOMATION_KV_TOKEN"Or delete and recreate the automation to start with a clean state.
The automation script lives at scripts/main.py. Key behaviors:
setup.sh or uv install needed.config.json co-located with the script.first_run_at (UTC timestamp) into the KV store and exits without dispatching; issues whose updated timestamp predates that baseline are skipped on all subsequent runs. Using updated (not created) means an old issue that has its label applied after deployment is correctly treated as new.max_new_per_run (default 5) limits how many conversations are started per cron firing; any remaining new issues are dispatched on the next run.{"processed_keys": [...], "first_run_at": "..."} between runs; falls back to a local file in local dev environments where AUTOMATION_KV_TOKEN is absent (on OpenHands Cloud the run fails instead, since its sandbox does not persist).POST /rest/api/3/search/jql (the current non-deprecated endpoint).POST /api/conversations on the agent server with the current user's LLM/agent settings forwarded to the new conversation; on OpenHands Cloud, calls POST /api/v1/app-conversations, which runs each conversation in its own sandbox with the user's settings, secrets and connected git provider.scripts/setup_webhook.py belongs to the event-based alternative and is not part of the poller's tarball. It is stdlib-only, reads OPENHANDS_API_KEY and the Jira API token from the environment, and prints a JSON summary that never contains the signing secret.
The deduplication filter compares each issue's fields.updated timestamp against
first_run_at. updated is Jira's last-modified timestamp for the issue as a whole —
it advances whenever any field changes (comments, priority, description, status, etc.),
not only when the create-pr label is applied.
This means a pre-existing issue that already carried the label at deployment time can
slip through the filter if it is later updated for an unrelated reason (e.g. someone adds
a comment), because its updated timestamp will have advanced past first_run_at while
its key is not yet in processed_keys.
Workaround: The only fully reliable way to detect exactly when a label was applied
is the Jira changelog API (GET /rest/api/3/issue/{key}/changelog), which requires an
extra HTTP call per issue. To avoid that overhead, keep the automation's scope narrow:
use a label that is exclusively added as a PR-creation signal and is not already present
on issues at the time of deployment.
Once an issue is successfully dispatched its key is written to processed_keys in the
KV store and is permanently skipped on every future run — regardless of subsequent
label changes, comments, or any other updates to the issue. The only way to re-trigger a
previously processed issue is to manually clear the KV store or delete and recreate the
automation. This means the risk window described above is finite: as soon as the
automation processes a pre-existing issue (even accidentally), it will never dispatch
that issue again.
references/setup.md - Jira API token creation, GitHub token scopes, cron schedule reference, and troubleshooting guide.© OpenHands, 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 7 other files (scripts, references) in skills/jira-issue-to-pr of OpenHands/extensions.
Open the folder on GitHubat commit d008b81
Jira Issue To PR 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 |
|---|---|---|---|---|---|---|
| Jira Issue To PR this skillOpenHands/extensions | 158 | — | ~4.1k | Automated safety check: Pass | MIT | |
| Link Ticket To SessionJayantDevkar/claude-code-karma | 329 | — | ~1.8k | Automated safety check: Notes | Apache-2.0 | |
| Dynamo PR DescriptionDynamoDS/Dynamo | 2k | — | ~880 | Automated safety check: Pass | Apache-2.0 | |
| Adhoc PRshopsys/shopsys | 350 | — | ~2.3k | Automated safety check: Pass | Custom licence | |
| Code Reviewsortie-ai/sortie | 196 | — | ~2.9k | Automated safety check: Pass | MIT | |
| Review Release Noteschef/chef-web-docs | 143 | — | ~5.2k | Automated safety check: Pass | Custom licence |
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.
DynamoDS/Dynamo
Generate PR descriptions for Dynamo that align with the team template section names and order.
shopsys/shopsys
Ad-hoc Pull Request Publisher — commits the current changes, pushes the branch, opens a GitHub pull request against the repository's default branch, and creates a matching SSP Jira issue in the…
sortie-ai/sortie
Reviews pull requests in this repository for the defect classes a mechanical checklist misses: documentation that outlived the code it describes, reaction and retry state that leaks or clobbers a…
chef/chef-web-docs
Read a release notes file and edit it using Jira release data and GitHub pull requests as co-equal, optional sources.
wanteddev/montage-web
Create a GitHub pull request from the current branch. An agent skill from wanteddev/montage-web.
OpenHands/extensions
Interact with GitHub repositories, pull requests, issues, and workflows using the GITHUBTOKEN environment variable and GitHub CLI.
OpenHands/extensions
Evaluate how well a codebase supports autonomous AI-assisted development.
OpenHands/extensions
Build and automate Discord integrations (bots, webhooks, slash commands, and REST API workflows).
OpenHands/extensions
Create an automation that implements GitHub issues when a configurable trigger label is applied.
OpenHands/extensions
This skill should be used when the user asks to "monitor a GitHub repository", "watch GitHub for issues or PRs", "respond to @OpenHands mentions on GitHub", "set up an OpenHands GitHub integration"…
OpenHands/extensions
Create an automation that implements GitLab issues when a configurable trigger label is applied.
Categories
This skill should be used when the user asks to "set up a Jira automation to create pull requests", "poll Jira for create-pr issues", "automatically create GitHub PRs from Jira tickets", "deploy a…. Jira Issue To PR is an agent skill from OpenHands/extensions. This skill should be used when the user asks to "set up a Jira automation to create pull requests", "poll Jira for create-pr issues", "automatically create GitHub PRs from Jira tickets", "deploy a Jira issue-to-PR automation", "create a Jira to GitHub PR workflow", or mentions automating GitHub PR creation from a Jira label.
Jira Issue To PR fits situations like: asks to set up a Jira automation to create pull requests; poll Jira for create-pr issues; automatically create GitHub PRs from Jira tickets; deploy a Jira issue-to-PR automation.
Run `npx skills add OpenHands/extensions --skill jira-issue-to-pr -a claude-code`. Or copy the skill folder (skills/jira-issue-to-pr in OpenHands/extensions) into .claude/skills/jira-issue-to-pr in your project. Claude Code loads it when a task matches its description.
Run `npx skills add OpenHands/extensions --skill jira-issue-to-pr -a codex`. Or copy the skill folder (skills/jira-issue-to-pr in OpenHands/extensions) into .agents/skills/jira-issue-to-pr 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 OpenHands/extensions --skill jira-issue-to-pr -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/jira-issue-to-pr, .gemini/skills/jira-issue-to-pr, .github/skills/jira-issue-to-pr and .opencode/skills/jira-issue-to-pr in your project.
Going by SKILL.md and its folder, Jira Issue To PR needs Python for the scripts in its folder, the command-line tools its instructions call (curl, python3 and openssl) and credentials named JIRA_ADMIN_TOKEN, OPENHANDS_API_KEY, JIRA_CLOUD_KEY and AUTOMATION_KV_TOKEN. Our summary lists: Python 3; A credential in OPENHANDS_API_KEY; A credential in OPENHANDS_AUTOMATION_API_KEY.
SKILL.md names 1 domain. In commands or code: acme.atlassian.net; the agent is likely to contact it when it follows the instructions. 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. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.
Jira Issue To PR is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 4.1k tokens (SKILL.md is roughly 17k 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 1.7k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Jira Issue To PR: Link Ticket To Session (JayantDevkar/claude-code-karma, 329 stars), Dynamo PR Description (DynamoDS/Dynamo, 2k stars), Adhoc PR (shopsys/shopsys, 350 stars) and Code Review (sortie-ai/sortie, 196 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
OpenHands (a GitHub organization) maintains it in OpenHands/extensions, which has 158 GitHub stars. The repository holds 78 skills in this directory. The repository was last updated on October 7, 2026.
Source: OpenHands/extensions on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.