Agent skill

GitLab Issue To Mr

by OpenHands in OpenHands/extensions

Create an automation that implements GitLab issues when a configurable trigger label is applied.

MITAuto-check passed

Install GitLab Issue To Mr

skills CLI
$ npx skills add OpenHands/extensions --skill gitlab-issue-to-mr -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install OpenHands/extensions gitlab-issue-to-mr --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/OpenHands/extensions.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/gitlab-issue-to-mr .claude/skills/gitlab-issue-to-mr && rm -rf skills-src

Use ~/.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/

Facts

Skill name
gitlab-issue-to-mr
GitHub stars
157
Token cost
~4.9k tokens
SKILL.md length
2,490 words
Files
8 (incl. scripts, references)
Skills in repo
78
Repo updated
First seen
Licence
MIT

At a glance

Create an automation that implements GitLab issues when a configurable trigger label is applied.

  • Works in 12 steps: Verify GITLAB_TOKEN → Collect the GitLab API URL → Collect projects → …
  • Label is applied
  • SKILL.md covers Prerequisites, Setup Workflow, Runtime Behaviour (per poll) and Additional Resources, plus 1 more section
  • Runs Python scripts from its folder; calls python3, curl and git; reaches gitlab.com; needs GITLAB_TOKEN and OPENHANDS_API_KEY

What it does

GitLab Issue To Mr is an agent skill from OpenHands/extensions. Create an automation that implements GitLab issues when a configurable trigger label is applied. Polls one or more projects deterministically, clones the default branch, starts one OpenHands conversation per label event, then commits, pushes, and opens the merge request itself.

Its SKILL.md is about 4.9k tokens, which your agent loads only when the skill is triggered. The skill folder holds 11 other files, including scripts and reference files (for example `.plugin/plugin.json`, `README.md` and `commands/issue-to-mr-setup.md`).

It works with GitLab. The repository describes itself as: Public registry for OpenHands extensions. The licence is MIT.

When your agent uses it

  • Label is applied

Example prompts

  • “/gitlab-issue-to-mr”

Requirements

  • Python 3
  • A credential in GITLAB_TOKEN
  • A credential in OPENHANDS_API_KEY

Workflow steps

12 steps, taken from the step headings in SKILL.md.

  1. Verify GITLAB_TOKEN
  2. Collect the GitLab API URL
  3. Collect projects
  4. Collect trigger label
  5. Collect the merge request mode
  6. Collect the branch prefix
  7. Collect cron schedule
  8. Confirm the secret scope
  9. Generate the automation script
  10. Package and upload
  11. Register the automation
  12. Confirm

What it can do on your machine

Read from SKILL.md and the folder at commit d008b81. It shows what the files ask for, not the result of running them.

  • Tool permissions

    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.

  • Runs code

    Ships 1 file in scripts/ (Python), which the agent can run.

    Shell commands in SKILL.md call:

    • python3
    • curl
    • git

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    Hosts in commands or code, which the agent is likely to contact:

    • gitlab.com

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names these keys or tokens, usually read from environment variables:

    • GITLAB_TOKEN
    • OPENHANDS_API_KEY
    • OPENHANDS_AUTOMATION_API_KEY

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

GitLab Issue To Mr loads about 4.9k tokens when it runs, and up to ~6.3k if it reads all its reference files. Until then it costs about 74 tokens; SKILL.md has 2,490 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~74
When it runs · the whole SKILL.md, loaded when a task matches
~4.9k
With references · SKILL.md plus every file in references/, read only if the agent opens them
~6.3k

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.

Safety

Auto-check passed

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.

SKILL.md

The full file from OpenHands/extensions at commit d008b81, republished under its MIT licence (© OpenHands). 2,490 words, ~4,852 tokens.

Download SKILL.mdSave it as .claude/skills/gitlab-issue-to-mr/SKILL.md (or your agent's skills folder). This skill also uses 7 other files; get the full folder from GitHub.
name
gitlab-issue-to-mr
description
Create an automation that implements GitLab issues when a configurable trigger label is applied. Polls one or more projects deterministically, clones the default branch, starts one OpenHands conversation per label event, then commits, pushes, and opens the merge request itself.
triggers
/issue-to-mr:setup

GitLab Issue to MR Automation

Create a cron automation that watches one or more GitLab projects for issues with a trigger label, starts an OpenHands conversation once per label event with the project's default branch already checked out, and opens a merge request with whatever the agent produced.

The automation script is deterministic: issue discovery, label-event tracking, state persistence, the clone, the branch, the commit, the push, the merge request, the issue comments, and the clone's removal are all handled in Python. The LLM is invoked only to write the code.

The agent is told which issue to implement, not what it says. It fetches the description, the discussion, and whatever they link to itself, so nothing in the prompt goes stale between dispatch and the moment the agent reads it.

That needs read access, so the conversation is handed one secret, GITLAB_TOKEN. AGENT_SECRET_NAMES stays an allow-list: the rest of the deployment's secret store is not reachable from a conversation whose instructions came from an issue.

The deployment's MCP servers are forwarded whole, matching github-pr-reviewer, so a connected GitLab server gives the agent typed tools rather than curl. What those servers reach is reachable from an issue-authored prompt, so connect only servers that may be driven by untrusted text.

The agent also finishes the job: it commits, pushes its branch, and opens the merge request, so the merge request appears when the agent stops rather than on the next poll. The script does not trust that it happened - when the conversation ends it asks GitLab whether the merge request exists, and opens it itself when it does not. origin still carries no credential, so every GitLab command the agent runs has to name GITLAB_TOKEN; the SDK only puts a secret in the environment of a command that mentions it, and masks it in the output.


Prerequisites

Required secret

Verify that the following secret is set in OpenHands Settings -> Secrets:

Secret nameToken typeMinimum requirements
GITLAB_TOKENPersonal access tokenapi scope, and at least the Developer role on every watched project
GITLAB_TOKENProject or group access tokenapi scope, role Developer or above

The api scope is what GitLab grants read and write on issues, notes, branches, and merge requests through one scope; read_api polls happily and then fails at the point of pushing. Developer is the lowest role that can push a branch and open a merge request.

Two things the role does not cover, and which fail the push rather than the poll:

  • Protected branches. The default branch is usually protected, but the automation never pushes to it. Protect the branch prefix as well and the push is rejected; leave openhands/issue-* unprotected.
  • CI/CD files. An issue asking for a pipeline change makes the agent touch .gitlab-ci.yml. That needs no extra scope, but a project with a protected CI/CD configuration path rejects the push.

When several projects are monitored, the token must cover all of them.

Check with:

bash
curl -s "https://gitlab.com/api/v4/user" \
  -H "PRIVATE-TOKEN: $GITLAB_TOKEN" \
  | python3 -c "import json,sys; d=json.load(sys.stdin); print(d.get('username') or d.get('message'))"

If the token is missing or invalid, inform the user and stop.


Setup Workflow

Follow these steps in order.

Step 1 - Verify GITLAB_TOKEN

Run the curl check above, against the user's instance if it is not gitlab.com.

  • If absent: "GITLAB_TOKEN is not set. Please add it in OpenHands Settings -> Secrets." Stop.
  • If the API returns {"message": "401 Unauthorized"}: tell the user the token is invalid and ask them to update it. Stop.
Step 2 - Collect the GitLab API URL

Ask: "Which GitLab instance? (Press Enter for gitlab.com. For a self-managed instance give its API root, e.g. https://gitlab.example.com/api/v4.)"

Record as GITLAB_API_URL. Default: https://gitlab.com/api/v4. Use this URL in every check below.

Step 3 - Collect projects

Ask: "Which GitLab projects should be watched? (Format: group/project, e.g. myorg/backend. Subgroups are fine - myorg/team/service. List several separated by commas to serve them all from one automation.)"

Validate access to each project, and confirm the token's role:

bash
PROJECT_ID=$(python3 -c "import urllib.parse,sys; print(urllib.parse.quote(sys.argv[1], safe=''))" "{group}/{project}")
curl -s "${GITLAB_API_URL}/projects/${PROJECT_ID}" \
  -H "PRIVATE-TOKEN: $GITLAB_TOKEN" \
  | python3 -c "
import json, sys
d = json.load(sys.stdin)
if 'message' in d or 'error' in d:
    print('ERROR:', d.get('message') or d.get('error'))
else:
    perms = d.get('permissions') or {}
    levels = [(perms.get(k) or {}).get('access_level') for k in ('project_access', 'group_access')]
    levels = [n for n in levels if isinstance(n, int)]
    role = max(levels) if levels else 'unknown'
    print(f\"Accessible. Default branch: {d.get('default_branch')}. Access level: {role}\")
"

Record every accepted project into PROJECTS = ["{group}/{project}", ...]. If one project fails the check, say which and ask whether to continue without it. An access level below 30 (Developer) means the automation cannot open merge requests there; ask for a token with a higher role.

Each project is polled independently and keeps its own state, so issue numbers never collide between them. The trigger label, branch prefix, and schedule are shared; a project needing different settings wants its own automation.

Step 4 - Collect trigger label

Ask: "Which issue label should trigger an implementation? (Press Enter for the default: openhands.)"

Record the answer as TRIGGER_LABEL. If the label does not exist yet, tell the user that GitLab will still record the event once the label is created and applied to an issue.

The automation works an issue when it sees the latest matching label event for that label. To ask for another attempt later, remove and re-apply the label - that opens a second branch and a second merge request rather than overwriting the first.

Step 5 - Collect the merge request mode

Ask: *"Should the merge requests be opened as drafts?

  1. Draft (default) - title prefixed Draft:, ready for a human to mark ready
  2. Ready for review - opened as a normal merge request (Press Enter for Draft)"*

Map the choice to DRAFT_MERGE_REQUEST (True or False). GitLab has no draft flag on the merge request API; a draft is a title carrying the Draft: prefix, which the script adds.

Step 6 - Collect the branch prefix

Ask: "What branch prefix should the automation use? (Press Enter for the default: openhands/issue, which produces openhands/issue-42.)"

Record as BRANCH_PREFIX. Keep it free of spaces and of characters git rejects in a ref name, and make sure the prefix is not covered by a protected-branch rule.

Step 7 - Collect cron schedule

Ask: "How often should the automation poll for labelled issues? (Press Enter for the default: every 5 minutes. Use a cron expression for a different interval, e.g. 0 * * * * = hourly)"

Default: */5 * * * *.

Record as CRON_SCHEDULE.

Step 8 - Confirm the secret scope

The agent is handed GITLAB_TOKEN, because it reads the issue and its discussion itself. Ask: "Beyond the GitLab token, does the project's build need a secret of its own - a package registry token, for example? (Press Enter for none.)"

Record the answers appended to the default, as AGENT_SECRET_NAMES = ["GITLAB_TOKEN", "NAME", ...].

Keep it an allow-list. Forwarding the whole secret store would put every credential in the deployment behind a prompt written by whoever opened the issue. If the projects are public and you would rather the conversation held no credential at all, set the list to [] - the agent can still read a public issue unauthenticated, and private projects then stop working.

The deployment's MCP servers are a separate matter: they are forwarded whole, so the conversation can reach everything they expose. Say so, and check the user is willing to have those servers driven by text written by whoever opened an issue. Removing a server from the deployment's MCP settings is the only way to keep it out of these conversations.

Step 9 - Generate the automation script

Read scripts/main.py from this skill's directory. Apply exactly six constant substitutions near the top of the file:

The script also reads a config.json shipped beside it, if there is one, over these constants. That is how the catalog entry (automations/catalog/gitlab-issue-to-mr/) configures an unmodified copy, since a declarative host cannot rewrite Python. This setup path substitutes the constants and ships no config.json, so the two never collide.

PlaceholderReplace with
PROJECTS = ["group/project"]PROJECTS = ["{group_project}", ...] - one entry per project collected in Step 3
TRIGGER_LABEL = "openhands"TRIGGER_LABEL = "{trigger_label}"
BRANCH_PREFIX = "openhands/issue"BRANCH_PREFIX = "{branch_prefix}"
DRAFT_MERGE_REQUEST = TrueDRAFT_MERGE_REQUEST = {True or False}
GITLAB_API_URL = "https://gitlab.com/api/v4"GITLAB_API_URL = "{gitlab_api_url}"
AGENT_SECRET_NAMES: list[str] = ["GITLAB_TOKEN"]AGENT_SECRET_NAMES: list[str] = ["{name}", ...]

Leave MAX_NEW_PER_RUN and DEFAULT_OPENHANDS_URL alone unless the user asks for a different cap or a non-default OpenHands URL.

A project may be given as group/project, as a clone URL, or as an SSH remote; the script normalizes each one at startup and names the value it could not read rather than blaming the token. Subgroups are preserved.

Use a safe string writer such as json.dumps(value) when inserting user-provided project paths, labels, or prefixes into Python string literals. json.dumps(list_of_projects) produces the whole PROJECTS list safely in one step.

Write the customized script to a temporary build directory:

bash
mkdir -p /tmp/issue-to-mr-build
# write the customized main.py to /tmp/issue-to-mr-build/main.py

Validate syntax before packaging:

bash
python3 -m py_compile /tmp/issue-to-mr-build/main.py && echo "Syntax OK"

Fix any syntax errors before proceeding.

Step 10 - Package and upload

Set OPENHANDS_HOST and AUTH_HEADER for the commands below:

  • OpenHands Cloud or Enterprise - a <HOST> value is in your system prompt: use it as OPENHANDS_HOST, with AUTH_HEADER="Authorization: Bearer $OPENHANDS_API_KEY"
  • Local Agent Canvas - an Automation backend is listed in the <RUNTIME_SERVICES> block of your system context: use its url_from_agent as OPENHANDS_HOST, with AUTH_HEADER="X-Session-API-Key: $OPENHANDS_AUTOMATION_API_KEY"

On OpenHands Cloud or Enterprise each run starts in a fresh sandbox, so the automation keeps its state in the KV store: check that kvStore is listed under features in GET ${OPENHANDS_HOST}/api/automation/v1/capabilities before deploying.

bash
tar -czf /tmp/issue-to-mr.tar.gz -C /tmp/issue-to-mr-build .

TARBALL_PATH=$(curl -s -X POST \
  "${OPENHANDS_HOST}/api/automation/v1/uploads?name=gitlab-issue-to-mr" \
  -H "$AUTH_HEADER" \
  -H "Content-Type: application/gzip" \
  --data-binary @/tmp/issue-to-mr.tar.gz \
  | python3 -c "import json,sys; print(json.load(sys.stdin)['tarball_path'])")

echo "Uploaded: $TARBALL_PATH"
Step 11 - Register the automation
bash
curl -s -X POST "${OPENHANDS_HOST}/api/automation/v1" \
  -H "$AUTH_HEADER" \
  -H "Content-Type: application/json" \
  -d "{
    \"name\": \"GitLab Issue to MR: {project_summary} label {trigger_label}\",
    \"trigger\": {\"type\": \"cron\", \"schedule\": \"{cron_schedule}\"},
    \"tarball_path\": \"$TARBALL_PATH\",
    \"entrypoint\": \"python3 main.py\",
    \"timeout\": 900
  }" | python3 -m json.tool

Use the single project as {project_summary} when there is one, and something like 3 projects when there are several. A poll clones a project per queued issue and pushes finished branches, so the timeout allows for that; a run never waits for an agent to finish, only for it to be started.

Record the returned id.

Show full SKILL.md (969 more words)Show less
Step 12 - Confirm

Tell the user:

✅ GitLab Issue to MR is running!

  • Automation ID: {id}
  • Projects: {group}/{project}, ... (one line each)
  • GitLab API: {gitlab_api_url}
  • Trigger label: {trigger_label}
  • Branch prefix: {branch_prefix}
  • Merge requests: {draft or ready for review}
  • Polling schedule: {cron_schedule}
  • State file per project: ~/.openhands/workspaces/automation-state/gitlab_issue_to_mr_{id}_{group}__{project}.json

Apply the {trigger_label} label to an issue to queue an implementation. Each label event is processed once. To ask for another attempt, remove and re-apply the label - that opens a second branch and merge request.

The agent runs without a checkout credential; the automation pushes the branch and opens the merge request once the agent has stopped.


Runtime Behaviour (per poll)

Each cron run executes main.py, which loads config.json if the catalog shipped one, checks that git is available, resolves and validates GITLAB_TOKEN once, then processes every project in PROJECTS independently. One project failing does not stop the others; the run fails only if every project fails.

For each project:

  1. Loads that project's state (see references/state-schema.md) and reads its default branch and clone URL.
  2. Lists open issues carrying TRIGGER_LABEL, newest-updated first. GitLab keeps merge requests on their own endpoint, so labelling a merge request never queues an implementation.
  3. For each labelled issue, up to MAX_NEW_PER_RUN new ones per run:
    • Refetches the issue so a label removed since the listing does not start work.
    • Finds the latest matching resource label event with action: "add", and skips it if that event has already been tracked.
    • Picks the first free branch name, {BRANCH_PREFIX}-{iid} or a numbered variant of it.
    • Clones the default branch, shallow and single-branch, into {WORKSPACE_BASE}/issue-to-mr/{group}__{project}/issue-{iid}-{event_id}, sets the commit identity, and creates the branch. origin keeps its plain HTTPS URL, so the workspace holds no credential.
    • Starts an OpenHands conversation whose working directory is that clone, told which issue to read, with the secrets named in AGENT_SECRET_NAMES and the deployment's MCP servers attached.
    • Comments on the issue with the branch, the label event, and the conversation link.
    • Records the task with status: "active".
    • If the clone or the conversation cannot be created, the clone is removed and nothing is recorded, so the next poll retries the label event.
  4. For each active task:
    • Abandons a conversation that has not reached a terminal status within two hours, comments on the issue, and reclaims its clone.
    • When the conversation reaches idle, finished, error, or stuck:
      • Adopts the merge request the agent opened, if GitLab says one exists for the branch, and comments its link on the issue. Everything below is the path taken when it does not.
      • Skips the merge request if the issue was closed meanwhile.
      • Reports the problem on the issue if the conversation ended in error or stuck.
      • Commits whatever the agent left uncommitted, on top of any commits it made itself.
      • Posts the agent's answer on the issue, and opens no merge request, when there are no commits at all - that is how an agent reports an issue too ambiguous to implement.
      • Otherwise pushes the branch, opens the merge request (draft by default, titled Draft: [#42] <issue title>, with the agent's summary and Closes #42 in the description), and comments the link on the issue.
      • A push or merge request that fails is retried on the next two polls before the task is reported as failed, so a transient GitLab error does not throw the work away.
  5. Removes the clone of every finished task, but only after confirming the conversation has stopped - deleting it under a running agent would remove its working directory. When that cannot be confirmed the directory is left alone and the next poll tries again.
  6. Saves that project's state atomically.

The completion callback fires once for the whole run.


Additional Resources

  • references/state-schema.md - State JSON schema, field definitions, and the task lifecycle.
  • scripts/main.py - The complete automation script. Customize the six constants at the top before packaging.

Troubleshooting

SymptomLikely causeFix
Nothing is ever queuedTrigger label not present, or applied to a merge request rather than an issueApply the configured label to an issue
"401 Unauthorized" in run logsToken expiredRotate and update GITLAB_TOKEN
"The token's role on ... is below Developer"The token has Reporter or Guest on that projectGrant Developer or above, or drop the project from PROJECTS
Push rejected: "You are not allowed to push code to protected branches"The branch prefix is covered by a protected-branch ruleLeave {BRANCH_PREFIX}-* unprotected
Push rejected on .gitlab-ci.ymlThe project protects its CI/CD configuration pathAllow the token's role to update it, or exclude such issues
404 on project accessProject path wrong, or no accessRe-check the entry in PROJECTS and the token's role. Subgroups must be included in full
git is not available in the automation runtimeThe runtime image has no gitUse a runtime image that ships git; the script clones, commits, and pushes with it
Issue commented "did not change any code"The agent judged the issue too ambiguous, or made no editsRead its answer in the comment, add the missing detail to the issue, then re-apply the label
Same issue not picked up again after new commentsIts label event was already processedRemove and re-apply the trigger label
Agent reports it cannot push or open an MRBy design - it has no push credentials in originNo action; the automation pushes and opens the merge request after the agent stops
Warning: could not fetch MCP config in run logsThe settings endpoint was unreachableNon-fatal; the agent falls back to the REST calls in the prompt
A backlog of labelled issues starts slowlyMAX_NEW_PER_RUN caps how many conversations one poll startsWait for the next polls, or raise the cap in the script
Clones remain under issue-to-mr/Their conversations had not stopped yetThey are removed by a later poll once the conversation is terminal

© OpenHands, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 7 other files (scripts, references) in skills/gitlab-issue-to-mr of OpenHands/extensions.

  • SKILL.md
  • .claude-plugin
  • .codex-plugin
  • .plugin/plugin.json
  • README.md
  • commands/issue-to-mr-setup.md
  • references/state-schema.md
  • scripts/main.py

Open the folder on GitHubat commit d008b81

Compare with similar skills

GitLab Issue To Mr 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.

GitLab Issue To Mr compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
GitLab Issue To Mr this skillOpenHands/extensions157—~4.9kAutomated safety check: PassMIT
Greplooponyx-dot-app/onyx32k4 repos~3.3kAutomated safety check: PassMIT
Check PRonyx-dot-app/onyx32k2 repos~2.3kAutomated safety check: PassMIT
Visual Reviewai-dynamo/dynamo8.2k—~4.5kAutomated safety check: PassApache-2.0
Debate ReviewamElnagdy/review-skills1322 repos~986Automated safety check: PassMIT
degit Project ScaffoldingRich-Harris/degit7.9k—~534Automated safety check: PassMIT

Similar skills

  • Greploop

    onyx-dot-app/onyx

    Iteratively improves a PR (GitHub), MR (GitLab), or shelved changelist (Perforce) until Greptile gives it a 5/5 confidence score with zero unresolved comments.

    32k GitHub starsUsed in 4 repos~3.3k tokens
    DevelopmentAuto-check passed
  • Check PR

    onyx-dot-app/onyx

    Checks a GitHub, GitLab, or Perforce (p4) pull request (or merge request, or shelved changelist) for unresolved review comments, failing status checks, and incomplete PR descriptions.

    32k GitHub starsUsed in 2 repos~2.3k tokens
    DevelopmentAuto-check passed
  • Visual Review

    ai-dynamo/dynamo

    Create self-contained interactive HTML code-review dashboards from GitHub or GitLab pull requests, checked-out branch diffs, or supplied unified diffs, with correctness and safe-to-merge scores…

    8.2k GitHub stars~4.5k tokensUpdated today
    DevelopmentAuto-check passed
  • Debate Review

    amElnagdy/review-skills

    Two-model debate review of a GitHub PR, GitLab MR, Azure DevOps PR, or local working tree, posted as inline comments or printed.

    132 GitHub starsUsed in 2 repos~986 tokens
    DevelopmentAuto-check passed
  • degit Project Scaffolding

    Rich-Harris/degit

    Downloads a repository snapshot or template with degit into an empty folder, from GitHub, GitLab, Bitbucket, Sourcehut or a Gist, optionally at a branch, tag or commit.

    7.9k GitHub stars~534 tokensUpdated 24 days ago
    DevelopmentAuto-check passed
  • Greploop Apps

    michaelshimeles/skills

    Loops on a large pull request, merge request or Perforce changelist, fixing Greptile findings until it scores 5/5 with no unresolved comments.

    1.3k GitHub starsUsed in 1 repo~3.6k tokens
    DevelopmentAuto-check passed

More from OpenHands/extensions

All 78 skills in this repo
  • Agent Readiness Report

    OpenHands/extensions

    Evaluate how well a codebase supports autonomous AI-assisted development.

    157 GitHub stars~1.1k tokensUpdated yesterday
    Auto-check passed
  • Discord

    OpenHands/extensions

    Build and automate Discord integrations (bots, webhooks, slash commands, and REST API workflows).

    157 GitHub stars~1.1k tokensUpdated yesterday
    Auto-check passed
  • GitHub

    OpenHands/extensions

    Interact with GitHub repositories, pull requests, issues, and workflows using the GITHUBTOKEN environment variable and GitHub CLI.

    157 GitHub stars~1.7k tokensUpdated yesterday
    Auto-check passed
  • GitHub Issue To PR

    OpenHands/extensions

    Create an automation that implements GitHub issues when a configurable trigger label is applied.

    157 GitHub stars~4.4k tokensUpdated yesterday
    Auto-check passed
  • GitHub Repo Monitor

    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"…

    157 GitHub stars~3.1k tokensUpdated yesterday
    Auto-check passed
  • Jira Issue To PR

    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…

    157 GitHub stars~4.1k tokensUpdated yesterday
    Auto-check passed

Works with

Questions about GitLab Issue To Mr

What does GitLab Issue To Mr do?

Create an automation that implements GitLab issues when a configurable trigger label is applied. GitLab Issue To Mr is an agent skill from OpenHands/extensions. Create an automation that implements GitLab issues when a configurable trigger label is applied.

When should I use GitLab Issue To Mr?

GitLab Issue To Mr fits situations like: label is applied.

How do I install GitLab Issue To Mr in Claude Code?

Run `npx skills add OpenHands/extensions --skill gitlab-issue-to-mr -a claude-code`. Or copy the skill folder (skills/gitlab-issue-to-mr in OpenHands/extensions) into .claude/skills/gitlab-issue-to-mr in your project. Claude Code loads it when a task matches its description.

How do I install GitLab Issue To Mr in Codex?

Run `npx skills add OpenHands/extensions --skill gitlab-issue-to-mr -a codex`. Or copy the skill folder (skills/gitlab-issue-to-mr in OpenHands/extensions) into .agents/skills/gitlab-issue-to-mr in your project. Codex loads it when a task matches its description.

Can I use GitLab Issue To Mr in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add OpenHands/extensions --skill gitlab-issue-to-mr -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/gitlab-issue-to-mr, .gemini/skills/gitlab-issue-to-mr, .github/skills/gitlab-issue-to-mr and .opencode/skills/gitlab-issue-to-mr in your project.

What does GitLab Issue To Mr need to run?

Going by SKILL.md and its folder, GitLab Issue To Mr needs Python for the scripts in its folder, the command-line tools its instructions call (python3, curl and git) and credentials named GITLAB_TOKEN, OPENHANDS_API_KEY and OPENHANDS_AUTOMATION_API_KEY. Our summary lists: Python 3; A credential in GITLAB_TOKEN; A credential in OPENHANDS_API_KEY.

Does GitLab Issue To Mr access the network?

SKILL.md names 1 domain. In commands or code: gitlab.com; the agent is likely to contact it when it follows the instructions. This is read from the text; nothing was executed.

Is GitLab Issue To Mr safe to install?

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.

What licence does GitLab Issue To Mr use?

GitLab Issue To Mr is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does GitLab Issue To Mr use?

About 4.9k tokens (SKILL.md is roughly 19k 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.4k tokens, read only when the agent opens those files.

What are the alternatives to GitLab Issue To Mr?

Skills that share tags, products or a category with GitLab Issue To Mr: Greploop (onyx-dot-app/onyx, 32k stars), Check PR (onyx-dot-app/onyx, 32k stars), Visual Review (ai-dynamo/dynamo, 8.2k stars) and Debate Review (amElnagdy/review-skills, 132 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains GitLab Issue To Mr?

OpenHands (a GitHub organization) maintains it in OpenHands/extensions, which has 157 GitHub stars. The repository holds 78 skills in this directory. The repository was last updated on October 6, 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.