helpers/skills/pr-jira-linker/SKILL.md
Find and link Jira issues to PRs/MRs that are missing Jira references. Supports single PR/MR linking and batch audit of configured repos. Use when the user mentions "link PR to Jira", "scan PRs", "PR audit", "MR missing Jira", "link merge request", or wants to connect code changes to Jira for traceability.
npx skillsauth add opendatahub-io/ai-helpers pr-jira-linkerInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Detects PRs/MRs missing Jira references, finds or creates the matching Jira issue, and links them bidirectionally.
list_pull_requests, pull_request_read, update_pull_requestget_merge_request, get_merge_request_commits, search, create_workitem_notejira_search, jira_add_comment, jira_create_issuecurl for GitLab API fallback (constrained; see safety rules below)The skill reads repository lists and project defaults from a user-provided config.yaml file. A minimal example:
defaults:
project_key: "MYPROJECT"
issue_type: "Task"
security_level: "Red Hat Employee"
priority: "Normal"
component: "Engineering"
team: "My Team"
team_id: "your-team-id-here"
repos:
gitlab:
- project: "my-org/my-repo"
host: "gitlab.example.com"
github:
- owner: "my-org"
repo: "my-repo"
Scan for pattern [A-Z][A-Z0-9]+-[0-9]+ in: (1) PR/MR title, (2) description, (3) branch name, (4) commit messages.
If found, mark as candidate key detected and verify bidirectional linkage (PR/MR references Jira key and Jira issue has PR/MR URL comment) before classifying as linked.
Trigger: User provides a PR/MR URL or says "link this PR to Jira".
Use pull_request_read (GitHub) or get_merge_request (GitLab). If GitLab MCP is down, fall back to curl --negotiate -u: against the GitLab REST API under the following mandatory safety constraints:
config.yaml under repos.gitlab[].host. Reject any target not in the allowlist.https://, and reconstruct from validated components. Do not pass user-supplied URLs directly to shell commands.GITLAB_TOKEN), not interpolated into command strings.--max-time 30 --max-redirs 3 to enforce timeouts and limit redirects.--proto '=https' to prevent protocol downgrade or scheme switching.Extract title, description, branch name, author.
Scan title, description, branch, and commits for Jira key.
Search Jira with escaped/sanitized keywords from the PR/MR title (treat user text as data, not query syntax). Strip or escape JQL/Lucene operators (+ - && || ! ( ) { } [ ] ^ " ~ * ? : \ /) before constructing the query. If sanitized tokens are empty, fall back to prompting the user for manual input. Show matches and let user pick, or offer to create new / enter key manually / skip.
After user selects or creates a Jira issue:
4a. Add Jira ref to PR/MR: Use update_pull_request (GitHub) to append to description. For GitLab, use create_workitem_note to add a comment with the Jira link.
4b. Add PR/MR link to Jira: Use jira_add_comment with MR/PR URL, repo, branch, and author.
4c. Report success: Show both URLs and confirm what was linked.
Never modify a PR/MR or Jira issue without showing a preview and getting user confirmation.
Trigger: "scan PRs for missing Jira links", "PR audit", "check repos for unlinked PRs".
When no matching Jira exists, the skill can create one:
jira_create_issueIMPORTANT: Every issue MUST include "security": {"name": "Red Hat Employee"} and "customfield_10001": "[TEAM_ID]" in additional_fields. Never omit these fields.
| Error | Action |
|-------|--------|
| GitLab MCP down | Fall back to curl --negotiate -u: only for hosts allowlisted in config.yaml; reject non-allowlisted targets and raw IPs; enforce --max-time 30 --max-redirs 3 --proto '=https'; pass credentials via env vars |
| GitHub MCP not available | Skip GitHub repos, process GitLab only |
| PR/MR already linked | Verify bidirectional linkage, report and skip if confirmed |
| Jira search returns nothing | Offer to create new or enter key manually |
| PR/MR description update fails | Fall back to adding a comment |
| Permission denied | Inform user, suggest checking repo access |
User: Link this PR to Jira https://github.com/my-org/my-repo/pull/42
Assistant: [Reads PR, scans for Jira key, searches Jira, links bidirectionally]
User: Link this MR to Jira https://gitlab.example.com/my-org/my-repo/-/merge_requests/15
Assistant: [Reads MR via API, scans for Jira key, creates or finds Jira issue, links both]
User: Scan my repos for PRs missing Jira links
Assistant: [Loads repos from config, scans all open PRs/MRs, reports linked vs missing]
development
Run hexora static analysis on a Python package repository to detect suspicious code patterns, then triage findings with deterministic rules and AI reasoning to produce a structured risk report section.
development
Inspect recent git history of a Python package repository for suspicious commits touching supply-chain-sensitive files, then triage findings with AI reasoning to produce a structured risk report section.
development
Scan a Python package repository for compiled/binary files using Fromager-style detection and malcontent YARA analysis, then triage findings with deterministic rules and AI reasoning to produce a structured risk report section.
testing
Use this skill to identify non-Red Hat RPM packages installed in container images or on the local machine. For containers, pulls images across multiple architectures and release tags; for local scans, inspects the host directly. Extracts RPM signing metadata and reports packages not signed with the Red Hat GPG key as CSV output. Use when auditing compliance, checking supply-chain provenance, or scanning for third-party RPMs in RHOAI component images.