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.
Create a PR from a committed and pushed branch after task-defined checks pass.
$ npx skills add kdlbs/kandev --skill pr -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install kdlbs/kandev 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/kdlbs/kandev.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/pr .claude/skills/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 "pr" agent skill from https://github.com/kdlbs/kandev/tree/main/.agents/skills/pr into .claude/skills/pr/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "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/kdlbs/kandev/tree/main/.agents/skills/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 kdlbs/kandev --skill pr -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install kdlbs/kandev pr --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/kdlbs/kandev.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/pr .agents/skills/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 "pr" agent skill from https://github.com/kdlbs/kandev/tree/main/.agents/skills/pr into .agents/skills/pr/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "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 kdlbs/kandev --skill pr -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install kdlbs/kandev pr --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/kdlbs/kandev.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/pr .cursor/skills/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 "pr" agent skill from https://github.com/kdlbs/kandev/tree/main/.agents/skills/pr into .cursor/skills/pr/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "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/kdlbs/kandev.git --path .agents/skills/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 kdlbs/kandev --skill pr -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install kdlbs/kandev pr --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/kdlbs/kandev.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/pr .gemini/skills/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 "pr" agent skill from https://github.com/kdlbs/kandev/tree/main/.agents/skills/pr into .gemini/skills/pr/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "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 kdlbs/kandev 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 kdlbs/kandev --skill pr -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/kdlbs/kandev.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/pr .github/skills/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 "pr" agent skill from https://github.com/kdlbs/kandev/tree/main/.agents/skills/pr into .github/skills/pr/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "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 kdlbs/kandev --skill 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 kdlbs/kandev pr --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/kdlbs/kandev.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/pr .opencode/skills/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 "pr" agent skill from https://github.com/kdlbs/kandev/tree/main/.agents/skills/pr into .opencode/skills/pr/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "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.
prCreate a PR from a committed and pushed branch after task-defined checks pass.
PR is an agent skill from kdlbs/kandev. Create a PR from a committed and pushed branch after task-defined checks pass. Ready PRs continue to fixup in the primary conversation.
Its SKILL.md is about 6.3k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Productivity & Automation. It works with Azure DevOps, GitLab, GitHub and Microsoft Azure. The repository describes itself as: AI Kanban & Development Environment. Orchestrate multiple agents, review changes, open PRs. Multi-provider, self-hostable, no telemetry. The licence is AGPL-3.0.
6 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit b734113. 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.
Shell commands in SKILL.md call:
gitghjqazglabpnpmcurlFrom 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:
raw.githubusercontent.comFrom URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
GITLAB_TOKENFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
PR loads about 6.3k tokens when it runs. Until then it costs about 35 tokens; SKILL.md has 1,777 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 kdlbs/kandev at commit b734113, republished under its AGPL-3.0 licence (© kdlbs). 1,777 words, ~6,316 tokens.
.claude/skills/pr/SKILL.md (or your agent's skills folder).Create the PR directly in the primary conversation after commit, task-defined
checks, and push. Ready PR monitoring and remediation continue through
/pr-fixup in the same conversation.
Host detection: This skill works on GitHub, GitLab, and Azure Repos. Detect the host before publication by inspecting
git remote get-url origin:
- URL contains
dev.azure.com,visualstudio.com, orssh.dev.azure.com→ use the Azure Repos flow below.- URL contains
github.com(or any host you have configured for GitHub) → use the GitHub flow below.- URL contains
gitlab(e.g.gitlab.com,gitlab.acme.corp) → use the GitLab flow at the bottom of this file.- For self-managed hosts, the user's repository configuration determines the host.
GitHub tool selection: The GitHub flow uses
ghCLI by default. Ifghis unavailable or fails, including a 401 authentication error, use structured GitHub connector/API tools for PR, check, and review data; authentication failure is unknown state, never clean state. GitLab tool selection: The GitLab flow prefersglabCLI when available; otherwise it shellscurlagainst the REST v4 API using$GITLAB_TOKEN(which the agent runtime injects from the user's secrets store). Azure Repos tool selection: The Azure flow prefersaz repos pr createwith the Azure DevOps extension. Auth can come from an existingaz loginsession orAZURE_DEVOPS_EXT_PAT.
/commit — Creates the artifact after task-defined checks pass./pr-fixup — Wait for CI checks and CodeRabbit, Greptile, Claude, OpenCode, and cubic review feedback, fix any failures or valid comments, and push.--draft — create the PR as draft and skip the fixup step. Use when the work is not ready for review./pr-fixup in the same conversation.Publishing-state precedence: explicit user state (--draft or an explicit
ready-for-review request) wins. If the github:yeet plugin is explicitly
selected, follow its draft default only when the user did not request either
state; otherwise /pr defaults to ready-for-review. Always report the result.
Track these steps with an internal todo/checklist and mark them complete as you go. Do not create, update, or delete Kandev subtasks for this workflow unless the user explicitly requests task tracking.
Uncommitted changes: If there are dirty or staged changes, stop: commit and the affected task checks are required first.
Branch: If on main or master, stop and ask the user for a feature
branch. Otherwise use the current feature branch as-is.
Remote state: Confirm the branch has an upstream and the remote contains
the local HEAD. If not, run /push before creating the PR.
CI artifact bootstrap: If the diff introduces a CI-consumed registry tag
or artifact that a workflow on this branch must publish first, follow that
publisher's documented bootstrap path before rerunning consumer checks.
Request explicit user approval before a workflow_dispatch or other action
writes a shared registry, and verify the target tag/digest exists.
Screenshots — capture and validate before publication. For a UI-visible
change, capture fresh screenshots for every affected viewport before creating
the PR. For repository UI, use /playwright-cli with an isolated headless
session or the managed apps/web E2E runner. See step 7 for capture routing
and blocker classification. When the changed surface is structurally absent
on another viewport, record that rationale instead of capturing an unrelated
screen.
Use synthetic or redacted data, validate the assets, and compress PNGs using
the recipe in step 7. If capture is impossible, report the concrete blocker
and stop before PR publication. For non-UI changes, record that screenshots
are not required and continue.
Create the PR. Before creating, check open PRs for the current branch and
inspect task-linked PR metadata. Reuse an existing PR; create a duplicate only
when the user explicitly requests separate PRs. Use --draft if requested,
otherwise create as ready-for-review.
Architecture and scope gate: Before running any PR creation command, verify
the authenticated actor's repository permission. Do not treat a user statement
as proof of maintainer status. On GitHub, query
gh api repos/{owner}/{repo}/collaborators/{login}/permission; push,
maintain, and admin permissions are write-authorized, so those actors may
open large or architectural PRs directly. On other hosts, use the equivalent
repository permission check. When the host confirms write access, the
permission itself satisfies this gate and no linked issue is required solely
for this purpose. If permission cannot be verified, or the actor has no write
access, require a linked issue with maintainer discussion before opening a
large or architectural PR. If that issue or discussion is missing, stop and
report the blocker. Do not create an issue or open a PR solely to start the
discussion. Prefer one logical change and the smallest practical diff; split
unrelated cleanup, refactoring, and feature work into separate PRs.
PR title must follow Conventional Commits format (see /commit for full rules). CI validates via pr-title.yml — the PR title becomes the squash-merge commit used for release notes.
PR body must be built from .github/pull_request_template.md; fail fast if it is missing. Read the whole template before writing the body. Treat HTML comments as authoring instructions for the agent, not as output:
<!--, no empty required sections, and no placeholder text.## Screenshots section after the PR is created (step 7) — don't add a placeholder for it here.test -f .github/pull_request_template.md
# Build /tmp/pr-body.md from the template, using comments as instructions
# and removing them from the final file.
gh pr create [--draft] --title "type: description" --body-file /tmp/pr-body.mdDo not fall back to hand-composed --body prose. If creation fails, surface the exact stderr, fix the template/body-file problem, and retry with --body-file.
If gh pr create fails after the branch is pushed with a credential-lease
or repository-scope error, use the REST fallback with the same template body.
Build the payload with jq --rawfile and submit it with
gh api --method POST repos/<owner>/<repo>/pulls --input <payload-file>;
preserve the validated title, head, base, and body, and never hand-escape
Markdown or JSON.
After creating the PR through gh pr create or the REST fallback, fetch it
with gh pr view <number> --json url,state,headRefName,baseRefName,headRefOid.
Verify it is open and its head/base match the intended branch and target
before reporting the URL.
If ready (not draft): For GitHub, do not begin /pr-fixup until any
required screenshot embedding in step 7 is complete.
Screenshots — publish already captured assets. If the diff touches user-visible UI (typically under apps/web/, excluding e2e-only or backend-only edits), publish the affected-viewport assets captured and validated in step 4 through the host-specific flow before treating the PR as complete — do not wait to be asked. Preserve any structural-absence rationale recorded in step 4.
Capture prerequisite:
/playwright-cli or the managed E2E
runner, rather than a connected personal browser or in-app browser tool.
The CLI's default profile is isolated; do not use --extension or a user's
persistent browser profile for disposable repository captures.pnpm --dir apps exec playwright-cli list has no local browser, use the
managed apps/web E2E runner with a disposable capture spec instead of
treating capture as blocked. Name mobile specs mobile-*.spec.ts, write
assets to ignored apps/web/.pr-assets, inspect/compress them, then remove
the temporary spec and confirm git status is clean.element.getAnimations().finished)
before capture; do not publish a mid-transition asset.prCapture fixture from
apps/web/e2e/fixtures/test-base.ts; it writes the expected filenames and
manifest for PR assets.apps/web/e2e/scripts/run-e2e.sh clears .pr-assets at the start of each
managed-runner invocation. Capture desktop and mobile assets in one
invocation when possible; if separate runs are necessary, preserve/merge
the prior assets and revalidate the complete manifest afterward.apps/web/.pr-assets/manifest.json. After
every capture, require a non-empty manifest with the intended fresh asset
entries: test -s apps/web/.pr-assets/manifest.json. If it is absent or
lacks the capture, do not treat the run as successful; rerun with --host
and report the managed-runner gap.apps/web/.pr-assets. If any
entry is missing, treat the capture as incomplete and restore or recapture
the asset; revalidate the complete mapping immediately before publication.pnpm e2e:run, select the runner project
before the Playwright separator and use a mobile-*.spec.ts filename:
pnpm e2e:run --project mobile-chrome e2e/tests/<area>/mobile-<capture>.spec.ts.
--project after -- is only a Playwright argument and leaves the
runner on its default Chromium project./work/apps/web/.pr-assets/<name>.png, not
testInfo.outputPath(...), which is container-local. After the run,
confirm the host has the files before inspecting or compressing them.pngquant; when it is
unavailable, use the supported ephemeral fallback rather than skipping
compression:if command -v pngquant >/dev/null 2>&1; then
pngquant --quality 65-90 --ext .png --force apps/web/.pr-assets/*.png
else
(
cd apps
pnpm dlx pngquant-bin@9.0.0 --quality 65-90 --ext .png --force web/.pr-assets/*.png
)
fiEmbed (GitHub only — image binaries must never merge into main): GitHub has no public API to upload images into a PR body (drag-and-drop is web-UI only), so publish the images on an orphan commit that can never be merged and reference them with SHA-pinned raw URLs:
blob=$(git hash-object -w apps/web/.pr-assets/shot.png)
printf '100644 blob %s\tshot.png\n' "$blob" > /tmp/tree
# repeat the hash-object + printf lines, appending one line per file to /tmp/tree
tree=$(git mktree < /tmp/tree)
commit=$(git commit-tree "$tree" -m "media: screenshots for PR #<N>")
git push origin "$commit:refs/heads/media/pr-<N>-screenshots"(A quoting glitch can make the first push report failure — retry with the literal commit SHA.) Reference each image in the PR body under a ## Screenshots section using GitHub-Flavored Markdown image syntax and dash-named files (no spaces):

Bare image URLs render as clickable links instead of previews, so never add a screenshot URL without the surrounding  wrapper.
Append the section to the PR body:
gh pr edit <PR_NUMBER> --body-file <file>gh pr edit can fail on this repo (GraphQL touches the deprecated Projects-classic API), or exit successfully after only printing a Projects-classic deprecation warning without changing the body. Treat the read-back as authoritative; if the intended section is absent, fall back to REST — build the payload with jq --rawfile, never by hand-escaping shell strings:
set -euo pipefail
PAYLOAD="/tmp/pr-body-<PR_NUMBER>-payload.json"
jq -n --rawfile body "<body-file>" '{body: $body}' > "$PAYLOAD"
jq empty "$PAYLOAD"
gh api --method PATCH repos/:owner/:repo/pulls/<PR_NUMBER> --input "$PAYLOAD" --silentFor a write-only PATCH, --silent prevents gh from decoding a response
body that the caller does not consume. Redirecting stdout to /dev/null
does not prevent a truncated or empty JSON response from making gh report
an error after the mutation succeeds. Read the resource back with a
separate GET and verify the intended change.
JSON payloads: Use jq (or an equivalent JSON tool) to build and
validate payloads without interpolating untrusted Markdown into shell
syntax. When command output is redirected, piped, or consumed by jq or
another parser, run the command through rtk proxy so stdout is
byte-preserving; normal RTK filtering can truncate or annotate machine-readable
output. Keep the REST fallback byte-preserving for command substitutions,
xargs, and any other consumer that expects unmodified Git or JSON output.
Preserve the existing PR description: The PR body is a shared, mutable
document. Preview automation and other bots may add sections after the PR
is created, so never PATCH a body reconstructed from the creation-time
template or a stale /tmp/pr-body.md. Before every post-creation update:
This live-body procedure applies to every post-creation body edit, not only screenshots. For each generated block, use operation-owned markers and verify that its start and end markers occur exactly once before and after the update.
gh pr view <PR_NUMBER> --json body --jq .body > /tmp/pr-body-latest.md.<!-- kandev-screenshots-start --> and
<!-- kandev-screenshots-end --> markers (or replace the existing
## Screenshots block if those markers are not present). Preserve every
byte outside that range, including
<!-- kandev-preview-start --> ... <!-- kandev-preview-end -->.cmp, and discard any payload on failure; never reuse a prior
/tmp payload. Extract JSON bodies byte-for-byte with jq -j .body before
cmp; jq -r .body appends a newline and can report a false mismatch.
Verify the payload contains this PR's current body and required sentinels
before PATCH. If it changed, re-fetch and merge again; do not overwrite
the newer body.pr-state and
pr-resolve and rerun the appropriate pr-await wait before treating
the PR as complete.The REST PATCH endpoint replaces the complete body and does not provide a convenient description-level compare-and-swap, so this fetch/merge/check sequence is required even when the edit appears small.
Before treating screenshot publication as complete, inspect the submitted body and verify every screenshot entry is a Markdown image embed () rather than a bare URL. Use gh pr view <PR_NUMBER> --json body --jq .body for this check.
Never commit the screenshot binaries to the PR branch itself — only to the throwaway media/pr-<N>-screenshots ref (git rm them from the PR branch tip if they were committed there earlier; with squash-merge, deleting at tip is enough). The docs/screenshots/ directory is for product/docs imagery that is meant to merge — don't confuse the two. The media branch must survive branch-cleanup sweeps; deleting it 404s the images in the PR body, so don't treat "unmerged branch" as automatically safe to delete.
Report the PR URL after all applicable steps are complete. For a ready
GitHub PR, continue with /pr-fixup in the same conversation when requested.
When git remote get-url origin points at Azure Repos, use the same preflight
(steps 1-4). For step 5, create an Azure Repos pull request instead of a GitHub
PR. Skip the GitHub fixup handoff and the GitHub-only embedding portion of step
7, but do not skip screenshot capture. For a UI-visible change, capture and
validate the required assets as described in step 4. Attach them to the Azure
PR when supported; otherwise return the fresh asset paths to the planner as an
explicit attachment handoff. If capture is impossible or no viable attachment
handoff exists, return that blocker instead of treating the PR as complete.
Prefer the Azure CLI when it is on PATH:
# If needed once per machine / shell:
# az extension add --name azure-devops
# export AZURE_DEVOPS_EXT_PAT=... # optional when az login is not already configured
SOURCE_BRANCH="$(git branch --show-current)"
TARGET_BRANCH="${TARGET_BRANCH:-}" # leave empty to let Azure use the repo default branch
DRAFT_FLAG=""
[ "${DRAFT:-false}" = "true" ] && DRAFT_FLAG="--draft"
az repos pr create \
${TARGET_BRANCH:+--target-branch "$TARGET_BRANCH"} \
--source-branch "$SOURCE_BRANCH" \
--title "type: description" \
--description "$(cat <<'EOF'
<filled PR template>
EOF
)" \
${DRAFT_FLAG:+$DRAFT_FLAG}Notes:
--organization, --project, or --repository explicitly.When git remote get-url origin points at a GitLab host, use the same preflight
(steps 1-4) and create a Merge Request for step 5. Skip the GitHub fixup
handoff and the GitHub-only orphan-ref embedding portion of step 7, but do not
skip screenshot capture. For a UI-visible change, capture and validate the
required assets, including the synthetic/redaction gate, then attach them to
the MR when supported or return fresh asset paths as an explicit attachment
handoff. If capture is impossible or no viable attachment handoff exists,
return that blocker instead of treating the MR as complete.
MR title still follows Conventional Commits — the squash-merge commit message is built from it the same way.
MR description uses the same template as the PR body above (Summary, Validation, etc.).
Prefer the glab CLI when it is on the agent's PATH:
Don't hardcode --target-branch: many projects ship from master, develop, or a custom default. Omit the flag so glab resolves the project's default branch via the API, or pass an explicit value only if the user / spec already specified one.
glab mr create [--draft] \
--title "type: description" \
--description "$(cat <<'EOF'
<filled template>
EOF
)" \
--remove-source-branch \
--yesIf glab is unavailable but $GITLAB_TOKEN is set, fall back to the REST API. Derive the host from the git remote — $CI_SERVER_URL is only set inside GitLab runners and silently falling back to gitlab.com from a developer's machine would target the wrong instance. Construct the JSON body with jq so multi-line descriptions and embedded quotes can't break the payload.
REMOTE_URL="$(git remote get-url origin)" # any of: git@host:path.git | ssh://git@host[:port]/path.git | https://host[:port]/path.git
# Classify by scheme so we can keep an https:// port (real API endpoint)
# while dropping any ssh:// port (irrelevant to the HTTPS API).
case "$REMOTE_URL" in
ssh://*) URL="${REMOTE_URL#ssh://}"; FORM=ssh ;;
http://*|https://*) URL="${REMOTE_URL#*://}"; FORM=http ;;
*) URL="$REMOTE_URL"; FORM=scp ;;
esac
URL="${URL#*@}" # strip optional user@
case "$FORM" in
scp)
# scp-style "git@host:path" — no port possible.
HOST_ONLY="${URL%%:*}"
HOST="https://${HOST_ONLY}"
PROJECT_PATH="${URL#*:}"
;;
ssh)
# ssh:// — port (if any) is the SSH port, not the HTTPS API port.
HOST_PORT="${URL%%/*}"
HOST="https://${HOST_PORT%%:*}"
PROJECT_PATH="${URL#*/}"
;;
http)
# https://host[:port]/path — preserve the port; it IS the API endpoint.
HOST_PORT="${URL%%/*}"
HOST="https://${HOST_PORT}"
PROJECT_PATH="${URL#*/}"
;;
esac
PROJECT="${PROJECT_PATH%.git}" # team/repo
SOURCE_BRANCH="$(git branch --show-current)"
PROJECT_ENC="$(printf '%s' "$PROJECT" | jq -sRr @uri)"
# Default branch via the GitLab API itself, not glab (avoids version drift
# on glab's flag surface). Fall back to "main" only if the lookup fails.
TARGET_BRANCH="$(curl --fail -s -H "PRIVATE-TOKEN: $GITLAB_TOKEN" \
"$HOST/api/v4/projects/$PROJECT_ENC" | jq -r '.default_branch // "main"')"
PAYLOAD="$(jq -n \
--arg source "$SOURCE_BRANCH" \
--arg target "$TARGET_BRANCH" \
--arg title "type: description" \
--arg description "$(cat <<'EOF'
<filled template>
EOF
)" \
'{source_branch: $source, target_branch: $target, title: $title, description: $description, remove_source_branch: true}')"
curl --fail -X POST \
-H "PRIVATE-TOKEN: $GITLAB_TOKEN" \
-H "Content-Type: application/json" \
--data "$PAYLOAD" \
"$HOST/api/v4/projects/$PROJECT_ENC/merge_requests"To address review comments on a GitLab MR, use the discussions API rather than individual review comments — discussions are GitLab's threading primitive. List with GET /projects/:id/merge_requests/:iid/discussions, reply with POST /projects/:id/merge_requests/:iid/discussions/:discussion_id/notes, and resolve a thread with PUT /projects/:id/merge_requests/:iid/discussions/:discussion_id?resolved=true. The glab equivalent for replies is glab mr note create --reply <discussion_id> — bare glab mr note opens a new thread instead of replying to an existing one.
© kdlbs, AGPL-3.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .agents/skills/pr of kdlbs/kandev.
Open the folder on GitHubat commit b734113
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 |
|---|---|---|---|---|---|---|
| PR this skillkdlbs/kandev | 909 | — | ~6.3k | Automated safety check: Pass | AGPL-3.0 | |
| Debate ReviewamElnagdy/review-skills | 132 | 2 repos | ~986 | Automated safety check: Pass | MIT | |
| Migrate To TeamcityJetBrains/teamcity-cli | 125 | — | ~1.3k | Automated safety check: Pass | Apache-2.0 | |
| Promotion Branches E2E Testhardisgroupcom/sfdx-hardis | 401 | — | ~5.5k | Automated safety check: Notes | AGPL-3.0 | |
| Sdaf Orientation And SurfaceAzure/sap-automation | 145 | — | ~1.6k | Automated safety check: Pass | MIT | |
| Authoring GitHub Workflowsdotnet/skills | 5.6k | 1 repos | ~2.3k | Automated safety check: Pass | MIT |
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.
JetBrains/teamcity-cli
Migrating CI/CD pipelines to TeamCity. An agent skill from JetBrains/teamcity-cli.
hardisgroupcom/sfdx-hardis
Runs a full end-to-end test of sfdx-hardis promotion branches and backpromote against real Salesforce orgs and a throwaway repository, then writes a report.
Azure/sap-automation
Orient a newcomer to the SAP Deployment Automation Framework (SDAF): explain the spine (control plane → workload zone → SAP system → software → install → operate/remove), summarise the three…
dotnet/skills
Author and review GitHub Actions workflow YAML safely so syntactically-valid YAML can't ship a workflow that GitHub Actions refuses to run.
sbusso/claudeclaw
Review and resolve PR issues with Qodo - get AI-powered code review issues and fix them interactively (GitHub, GitLab, Bitbucket, Azure DevOps)
kdlbs/kandev
Generate a single-file HTML walkthrough that explains a PR's purpose, user impact, interface changes, compatibility risks, and implementation.
kdlbs/kandev
Diagnose Kandev bugs, running-instance issues, UI/browser failures, and runtime behavior.
kdlbs/kandev
Improve Kandev's AI harness from session learnings or explicit requests.
kdlbs/kandev
Create branded architecture, IT current-state, flowchart, sequence, state machine, ER/data model, timeline, swimlane, quadrant, radar/spider, polar chart (polar/radial lollipop), loop/flywheel…
kdlbs/kandev
Implement changes using Test-Driven Development (Red-Green-Refactor).
kdlbs/kandev
Run a broad local verification audit only when the user explicitly requests it or PR/CI remediation requires it.
Works with
Categories
Create a PR from a committed and pushed branch after task-defined checks pass. PR is an agent skill from kdlbs/kandev. Create a PR from a committed and pushed branch after task-defined checks pass.
PR fits situations like: productivity & Automation work in your project.
Run `npx skills add kdlbs/kandev --skill pr -a claude-code`. Or copy the skill folder (.agents/skills/pr in kdlbs/kandev) into .claude/skills/pr in your project. Claude Code loads it when a task matches its description.
Run `npx skills add kdlbs/kandev --skill pr -a codex`. Or copy the skill folder (.agents/skills/pr in kdlbs/kandev) into .agents/skills/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 kdlbs/kandev --skill 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/pr, .gemini/skills/pr, .github/skills/pr and .opencode/skills/pr in your project.
Going by SKILL.md and its folder, PR needs the command-line tools its instructions call (git, gh, jq, az, glab and pnpm) and credentials named GITLAB_TOKEN. Our summary lists: A credential in GITLAB_TOKEN.
SKILL.md names 1 domain. In commands or code: raw.githubusercontent.com; 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. Review the folder before installing.
PR is published under the AGPL-3.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 6.3k tokens (SKILL.md is roughly 25k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with PR: Debate Review (amElnagdy/review-skills, 132 stars), Migrate To Teamcity (JetBrains/teamcity-cli, 125 stars), Promotion Branches E2E Test (hardisgroupcom/sfdx-hardis, 401 stars) and Sdaf Orientation And Surface (Azure/sap-automation, 145 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
kdlbs (a GitHub organization) maintains it in kdlbs/kandev, which has 909 GitHub stars. The repository holds 45 skills in this directory. The repository was last updated on October 8, 2026.
Source: kdlbs/kandev on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.