{
  "schema": "https://ai-atoms.com/schemas/skill-v1.json",
  "type": "skill",
  "id": "skill/gitlab-automation",
  "version": "1.0.0",
  "name": "Gitlab Automation",
  "description": "Automate GitLab project management, issues, merge requests, pipelines, branches, and user operations via Rube MCP (Composio). Always search tools first for current schemas.",
  "system_prompt_fragment": "# GitLab Automation via Rube MCP\n\nAutomate GitLab operations including project management, issue tracking, merge request workflows, CI/CD pipeline monitoring, branch management, and user administration through Composio's GitLab toolkit.\n\n## Prerequisites\n\n- Rube MCP must be connected (RUBE_SEARCH_TOOLS available)\n- Active GitLab connection via `RUBE_MANAGE_CONNECTIONS` with toolkit `gitlab`\n- Always call `RUBE_SEARCH_TOOLS` first to get current tool schemas\n\n## Setup\n\n**Get Rube MCP**: Add `https://rube.app/mcp` as an MCP server in your client configuration. No API keys needed — just add the endpoint and it works.\n\n\n1. Verify Rube MCP is available by confirming `RUBE_SEARCH_TOOLS` responds\n2. Call `RUBE_MANAGE_CONNECTIONS` with toolkit `gitlab`\n3. If connection is not ACTIVE, follow the returned auth link to complete GitLab OAuth\n4. Confirm connection status shows ACTIVE before running any workflows\n\n## Core Workflows\n\n### 1. Manage Issues\n\n**When to use**: User wants to create, update, list, or search issues in a GitLab project\n\n**Tool sequence**:\n1. `GITLAB_GET_PROJECTS` - Find the target project and get its ID [Prerequisite]\n2. `GITLAB_LIST_PROJECT_ISSUES` - List and filter issues for a project [Required]\n3. `GITLAB_CREATE_PROJECT_ISSUE` - Create a new issue [Required for create]\n4. `GITLAB_UPDATE_PROJECT_ISSUE` - Update an existing issue (title, labels, state, assignees) [Required for update]\n5. `GITLAB_LIST_PROJECT_USERS` - Find user IDs for assignment [Optional]\n\n**Key parameters**:\n- `id`: Project ID (integer) or URL-encoded path (e.g., `\"my-group/my-project\"`)\n- `title`: Issue title (required for creation)\n- `description`: Issue body text (max 1,048,576 characters)\n- `labels`: Comma-separated label names (e.g., `\"bug,critical\"`)\n- `add_labels` / `remove_labels`: Add or remove labels without replacing all\n- `state`: Filter by `\"all\"`, `\"opened\"`, or `\"closed\"`\n- `state_event`: `\"close\"` or `\"reopen\"` to change issue state\n- `assignee_ids`: Array of user IDs; use `[0]` to unassign all\n- `issue_iid`: Internal issue ID within the project (required for updates)\n- `milestone`: Filter by milestone title\n- `search`: Search in title and description\n- `scope`: `\"created_by_me\"`, `\"assigned_to_me\"`, or `\"all\"`\n- `page` / `per_page`: Pagination (default per_page: 20)\n\n**Pitfalls**:\n- `id` accepts either integer project ID or URL-encoded path; wrong IDs yield 4xx errors\n- `issue_iid` is the project-internal ID (shown as #42), different from the global issue ID\n- Labels in `labels` field replace ALL existing labels; use `add_labels`/`remove_labels` for incremental changes\n- Setting `assignee_ids` to empty array does NOT unassign; use `[0]` instead\n- `updated_at` field requires administrator or project/group owner rights\n\n### 2. Manage Merge Requests\n\n**When to use**: User wants to list, filter, or review merge requests in a project\n\n**Tool sequence**:\n1. `GITLAB_GET_PROJECT` - Get project details and verify access [Prerequisite]\n2. `GITLAB_GET_PROJECT_MERGE_REQUESTS` - List and filter merge requests [Required]\n3. `GITLAB_GET_REPOSITORY_BRANCHES` - Verify source/target branches [Optional]\n4. `GITLAB_LIST_ALL_PROJECT_MEMBERS` - Find reviewers/assignees [Optional]\n\n**Key parameters**:\n- `id`: Project ID or URL-encoded path\n- `state`: `\"opened\"`, `\"closed\"`, `\"locked\"`, `\"merged\"`, or `\"all\"`\n- `scope`: `\"created_by_me\"` (default), `\"assigned_to_me\"`, or `\"all\"`\n- `source_branch` / `target_branch`: Filter by branch names\n- `author_id` / `author_username`: Filter by MR author\n- `assignee_id`: Filter by assignee (use `None` for unassigned, `Any` for assigned)\n- `reviewer_id` / `reviewer_username`: Filter by reviewer\n- `labels`: Comma-separated label filter\n- `search`: Search in title and description\n- `wip`: `\"yes\"` for draft MRs, `\"no\"` for non-draft\n- `order_by`: `\"created_at\"` (default), `\"title\"`, `\"merged_at\"`, `\"updated_at\"`\n- `view`: `\"simple\"` for minimal fields\n- `iids[]`: Filter by specific MR internal IDs\n\n**Pitfalls**:\n- Default `scope` is `\"created_by_me\"` which limits results; use `\"all\"` for complete listings\n- `author_id` and `author_username` are mutually exclusive\n- `reviewer_id` and `reviewer_username` are mutually exclusive\n- `approved` filter requires the `mr_approved_filter` feature flag (disabled by default)\n- Large MR histories can be noisy; use filters and moderate `per_page` values\n\n### 3. Manage Projects and Repositories\n\n**When to use**: User wants to list projects, create new projects, or manage branches\n\n**Tool sequence**:\n1. `GITLAB_GET_PROJECTS` - List all accessible projects with filters [Required]\n2. `GITLAB_GET_PROJECT` - Get detailed info for a specific project [Optional]\n3. `GITLAB_LIST_USER_PROJECTS` - List projects owned by a specific user [Optional]\n4. `GITLAB_CREATE_PROJECT` - Create a new project [Required for create]\n5. `GITLAB_GET_REPOSITORY_BRANCHES` - List branches in a project [Required for branch ops]\n6. `GITLAB_CREATE_REPOSITORY_BRANCH` - Create a new branch [Optional]\n7. `GITLAB_GET_REPOSITORY_BRANCH` - Get details of a specific branch [Optional]\n8. `GITLAB_LIST_REPOSITORY_COMMITS` - View commit history [Optional]\n9. `GITLAB_GET_PROJECT_LANGUAGES` - Get language breakdown [Optional]\n\n**Key parameters**:\n- `name` / `path`: Project name and URL-friendly path (both required for creation)\n- `visibility`: `\"private\"`, `\"internal\"`, or `\"public\"`\n- `namespace_id`: Group or user ID for project placement\n- `search`: Case-insensitive substring search for projects\n- `membership`: `true` to limit to projects user is a member of\n- `owned`: `true` to limit to user-owned projects\n- `project_id`: Project ID for branch operations\n- `branch_name`: Name for new branch\n- `ref`: Source branch or commit SHA for new branch creation\n- `order_by`: `\"id\"`, `\"name\"`, `\"path\"`, `\"created_at\"`, `\"updated_at\"`, `\"star_count\"`, `\"last_activity_at\"`\n\n**Pitfalls**:\n- `GITLAB_GET_PROJECTS` pagination is required for complete coverage; stopping at first page misses projects\n- Some responses place items under `data.details`; parse the actual returned list structure\n- Most follow-up calls depend on correct `project_id`; verify with `GITLAB_GET_PROJECT` first\n- Invalid `branch_name`/`ref`/`sha` causes client errors; verify branch existence via `GITLAB_GET_REPOSITORY_BRANCHES` first\n- Both `name` and `path` are required for `GITLAB_CREATE_PROJECT`\n\n### 4. Monitor CI/CD Pipelines\n\n**When to use**: User wants to check pipeline status, list jobs, or monitor CI/CD runs\n\n**Tool sequence**:\n1. `GITLAB_GET_PROJECT` - Verify project access [Prerequisite]\n2. `GITLAB_LIST_PROJECT_PIPELINES` - List pipelines with filters [Required]\n3. `GITLAB_GET_SINGLE_PIPELINE` - Get detailed info for a specific pipeline [Optional]\n4. `GITLAB_LIST_PIPELINE_JOBS` - List jobs within a pipeline [Optional]\n\n**Key parameters**:\n- `id`: Project ID or URL-encoded path\n- `status`: Filter by `\"created\"`, `\"waiting_for_resource\"`, `\"preparing\"`, `\"pending\"`, `\"running\"`, `\"success\"`, `\"failed\"`, `\"canceled\"`, `\"skipped\"`, `\"manual\"`, `\"scheduled\"`\n- `scope`: `\"running\"`, `\"pending\"`, `\"finished\"`, `\"branches\"`, `\"tags\"`\n- `ref`: Branch or tag name\n- `sha`: Specific commit SHA\n- `source`: Pipeline source (use `\"parent_pipeline\"` for child pipelines)\n- `order_by`: `\"id\"` (default), `\"status\"`, `\"ref\"`, `\"updated_at\"`, `\"user_id\"`\n- `created_after` / `created_before`: ISO 8601 date filters\n- `pipeline_id`: Specific pipeline ID for job listing\n- `include_retried`: `true` to include retried jobs (default `false`)\n\n**Pitfalls**:\n- Large pipeline histories can be noisy; use `status`, `ref`, and date filters to narrow results\n- Use moderate `per_page` values to keep output manageable\n- Pipeline job `scope` accepts single status string or array of statuses\n- `yaml_errors: true` returns only pipelines with invalid configurations\n\n### 5. Manage Users and Members\n\n**When to use**: User wants to find users, list project members, or check user status\n\n**Tool sequence**:\n1. `GITLAB_GET_USERS` - Search and list GitLab users [Required]\n2. `GITLAB_GET_USER` - Get details for a specific user by ID [Optional]\n3. `GITLAB_GET_USERS_ID_STATUS` - Get user status message and availability [Optional]\n4. `GITLAB_LIST_ALL_PROJECT_MEMBERS` - List all project members (direct + inherited) [Required for member listing]\n5. `GITLAB_LIST_PROJECT_USERS` - List project users with search filter [Optional]\n\n**Key parameters**:\n- `search`: Search by name, username, or public email\n- `username`: Get specific user by username\n- `active` / `blocked`: Filter by user state\n- `id`: Project ID for member listing\n- `query`: Filter members by name, email, or username\n- `state`: Filter members by `\"awaiting\"` or `\"active\"` (Premium/Ultimate)\n- `user_ids`: Filter by specific user IDs\n\n**Pitfalls**:\n- Many user filters (admins, auditors, extern_uid, two_factor) are admin-only\n- `GITLAB_LIST_ALL_PROJECT_MEMBERS` includes direct, inherited, and invited members\n- User search is case-insensitive but may not match partial email domains\n- Premium/Ultimate features (state filter, seat info) are not available on free plans\n\n## Common Patterns\n\n### ID Resolution\nGitLab uses two identifier formats for projects:\n- **Numeric ID**: Integer project ID (e.g., `123`)\n- **URL-encoded path**: Namespace/project format (e.g., `\"my-group%2Fmy-project\"` or `\"my-group/my-project\"`)\n- **Issue IID vs ID**: `issue_iid` is the project-internal number (#42); the global `id` is different\n- **User ID**: Numeric; resolve via `GITLAB_GET_USERS` with `search` or `username`\n\n### Pagination\nGitLab uses offset-based pagination:\n- Set `page` (starting at 1) and `per_page` (1-100, default 20)\n- Continue incrementing `page` until response returns fewer items than `per_page` or is empty\n- Total count may be available in response headers (`X-Total`, `X-Total-Pages`)\n- Always paginate to completion for accurate results\n\n### URL-Encoded Paths\nWhen using project paths as identifiers:\n- Forward slashes must be URL-encoded: `my-group/my-project` becomes `my-group%2Fmy-project`\n- Some tools accept unencoded paths; check schema for each tool\n- Prefer numeric IDs when available for reliability\n\n## Known Pitfalls\n\n### ID Formats\n- Project `id` field accepts both integer and string (URL-encoded path)\n- Issue `issue_iid` is project-scoped; do not confuse with global issue ID\n- Pipeline IDs are project-scoped integers\n- User IDs are global integers across the GitLab instance\n\n### Rate Limits\n- GitLab has per-user rate limits (typically 300-2000 requests/minute depending on plan)\n- Large pipeline/issue histories should use date and status filters to reduce result sets\n- Paginate responsibly with moderate `per_page` values\n\n### Parameter Quirks\n- `labels` field replaces ALL labels; use `add_labels`/`remove_labels` for incremental changes\n- `assignee_ids: [0]` unassigns all; empty array does nothing\n- `scope` defaults vary: `\"created_by_me\"` for MRs, `\"all\"` for issues\n- `author_id` and `author_username` are mutually exclusive in MR filters\n- Date parameters use ISO 8601 format: `\"2024-01-15T10:30:00Z\"`\n\n### Plan Restrictions\n- Some features require Premium/Ultimate: `epic_id`, `weight`, `iteration_id`, `approved_by_ids`, member `state` filter\n- Admin-only features: user management filters, `updated_at` override, custom attributes\n- The `mr_approved_filter` feature flag is disabled by default\n\n## Quick Reference\n\n| Task | Tool Slug | Key Params |\n|------|-----------|------------|\n| List projects | `GITLAB_GET_PROJECTS` | `search`, `membership`, `visibility` |\n| Get project details | `GITLAB_GET_PROJECT` | `id` |\n| User's projects | `GITLAB_LIST_USER_PROJECTS` | `id`, `search`, `owned` |\n| Create project | `GITLAB_CREATE_PROJECT` | `name`, `path`, `visibility` |\n| List issues | `GITLAB_LIST_PROJECT_ISSUES` | `id`, `state`, `labels`, `search` |\n| Create issue | `GITLAB_CREATE_PROJECT_ISSUE` | `id`, `title`, `description`, `labels` |\n| Update issue | `GITLAB_UPDATE_PROJECT_ISSUE` | `id`, `issue_iid`, `state_event` |\n| List merge requests | `GITLAB_GET_PROJECT_MERGE_REQUESTS` | `id`, `state`, `scope`, `labels` |\n| List branches | `GITLAB_GET_REPOSITORY_BRANCHES` | `project_id`, `search` |\n| Get branch | `GITLAB_GET_REPOSITORY_BRANCH` | `project_id`, `branch_name` |\n| Create branch | `GITLAB_CREATE_REPOSITORY_BRANCH` | `project_id`, `branch_name`, `ref` |\n| List commits | `GITLAB_LIST_REPOSITORY_COMMITS` | project ID, branch ref |\n| Project languages | `GITLAB_GET_PROJECT_LANGUAGES` | project ID |\n| List pipelines | `GITLAB_LIST_PROJECT_PIPELINES` | `id`, `status`, `ref` |\n| Get pipeline | `GITLAB_GET_SINGLE_PIPELINE` | `project_id`, `pipeline_id` |\n| List pipeline jobs | `GITLAB_LIST_PIPELINE_JOBS` | `id`, `pipeline_id`, `scope` |\n| Search users | `GITLAB_GET_USERS` | `search`, `username`, `active` |\n| Get user | `GITLAB_GET_USER` | user ID |\n| User status | `GITLAB_GET_USERS_ID_STATUS` | user ID |\n| List project members | `GITLAB_LIST_ALL_PROJECT_MEMBERS` | `id`, `query`, `state` |\n| List project users | `GITLAB_LIST_PROJECT_USERS` | `id`, `search` |\n\n## When to Use\nThis skill is applicable to execute the workflow or actions described in the overview.",
  "applicable_domains": [
    "devops"
  ],
  "category": "devops",
  "invocation": [
    "/gitlab-automation"
  ],
  "authored_by": "claudeskills.in community",
  "source_url": "https://claudeskills.in/skill/gitlab-automation",
  "provenance": {
    "source": "claudeskills.in",
    "source_url": "https://claudeskills.in/skill/gitlab-automation",
    "license": "unknown",
    "imported_at": "2026-09-03",
    "notes": "Aggregated by claudeskills.in from community GitHub lists."
  },
  "tags": [
    "claudeskills",
    "devops"
  ],
  "lifecycle": "draft"
}