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…
Iteratively improves a PR (GitHub), MR (GitLab), or shelved changelist (Perforce) until Greptile gives it a 5/5 confidence score with zero unresolved comments.
$ npx skills add onyx-dot-app/onyx --skill greploop -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install onyx-dot-app/onyx greploop --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/onyx-dot-app/onyx.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/greptile/greploop .claude/skills/greploop && 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 "greploop" agent skill from https://github.com/onyx-dot-app/onyx/tree/main/.agents/skills/greptile/greploop into .claude/skills/greploop/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "greploop", 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/onyx-dot-app/onyx/tree/main/.agents/skills/greptile/greploopType 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 onyx-dot-app/onyx --skill greploop -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install onyx-dot-app/onyx greploop --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/onyx-dot-app/onyx.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/greptile/greploop .agents/skills/greploop && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "greploop" agent skill from https://github.com/onyx-dot-app/onyx/tree/main/.agents/skills/greptile/greploop into .agents/skills/greploop/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "greploop", 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 onyx-dot-app/onyx --skill greploop -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install onyx-dot-app/onyx greploop --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/onyx-dot-app/onyx.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/greptile/greploop .cursor/skills/greploop && 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 "greploop" agent skill from https://github.com/onyx-dot-app/onyx/tree/main/.agents/skills/greptile/greploop into .cursor/skills/greploop/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "greploop", 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/onyx-dot-app/onyx.git --path .agents/skills/greptile/greploop--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 onyx-dot-app/onyx --skill greploop -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install onyx-dot-app/onyx greploop --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/onyx-dot-app/onyx.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/greptile/greploop .gemini/skills/greploop && 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 "greploop" agent skill from https://github.com/onyx-dot-app/onyx/tree/main/.agents/skills/greptile/greploop into .gemini/skills/greploop/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "greploop", 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 onyx-dot-app/onyx greploopInstalls 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 onyx-dot-app/onyx --skill greploop -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/onyx-dot-app/onyx.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/greptile/greploop .github/skills/greploop && 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 "greploop" agent skill from https://github.com/onyx-dot-app/onyx/tree/main/.agents/skills/greptile/greploop into .github/skills/greploop/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "greploop", 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 onyx-dot-app/onyx --skill greploop -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install onyx-dot-app/onyx greploop --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/onyx-dot-app/onyx.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/greptile/greploop .opencode/skills/greploop && 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 "greploop" agent skill from https://github.com/onyx-dot-app/onyx/tree/main/.agents/skills/greptile/greploop into .opencode/skills/greploop/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "greploop", 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.
greploopIteratively improves a PR (GitHub), MR (GitLab), or shelved changelist (Perforce) until Greptile gives it a 5/5 confidence score with zero unresolved comments.
Greploop is an agent skill from 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. Triggers Greptile review, fixes all actionable comments, pushes/re-shelves, re-triggers review, and repeats. Use when the user wants to fully optimize a PR/MR/CL against Greptile's code review standards.
Its SKILL.md is about 3.3k tokens, which your agent loads only when the skill is triggered. The skill folder holds 3 other files, including reference files (for example `references/gitlab-api.md` and `references/graphql-queries.md`). Compatibility notes: Requires git, gh (GitHub CLI) or glab (GitLab CLI) authenticated, and Greptile installed on the repo. For Perforce, requires p4 CLI authenticated.
It sits in Development. It works with GitLab and GitHub. The repository describes itself as: Open Source AI Platform - AI Chat with advanced features that works with every LLM. The licence is MIT.
4 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit fba54a4. It shows what the files ask for, not the result of running them.
Pre-approves these tools, so the agent can use them without asking each time:
Bash(gh:*)Bash(glab:*)Bash(git:*)Bash(p4:*)From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
ghglabjqgitFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use gh, glab and git, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Requires git, gh (GitHub CLI) or glab (GitLab CLI) authenticated, and Greptile installed on the repo. For Perforce, requires p4 CLI authenticated.
From compatibility in the SKILL.md frontmatter.
Greploop loads about 3.3k tokens when it runs, and up to ~4.3k if it reads all its reference files. Until then it costs about 93 tokens; SKILL.md has 880 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 onyx-dot-app/onyx at commit fba54a4, republished under its MIT licence (© onyx-dot-app). 880 words, ~3,270 tokens.
.claude/skills/greploop/SKILL.md (or your agent's skills folder). This skill also uses 2 other files; get the full folder from GitHub.Iteratively fix a PR/MR/CL until Greptile gives a perfect review: 5/5 confidence, zero unresolved comments.
First check for Perforce, then fall back to git remote detection:
# Check for Perforce environment
if p4 info >/dev/null 2>&1; then
VCS="perforce"
else
REMOTE_URL=$(git remote get-url origin)
if echo "$REMOTE_URL" | grep -qi "gitlab"; then
VCS="gitlab"
else
VCS="github"
fi
fiFor self-hosted GitLab instances whose hostname doesn't contain "gitlab", the user can override by passing --vcs gitlab as an input. For Perforce, pass --vcs perforce.
GitHub:
gh pr view --json number,headRefName -q '{number: .number, branch: .headRefName}'GitLab:
glab mr view --output json | jq '{iid: .iid, branch: .source_branch}'Switch to the PR/MR branch if not already on it.
Perforce:
# List pending changelists for current user/client
p4 changes -s pending -u $P4USER -c $P4CLIENT
# Describe a specific CL
p4 describe -s <CL_NUMBER>Ensure the correct workspace (p4 client) is set before proceeding.
Key field differences:
number, headRefName, headRefOidiid, source_branch, shaP4CLIENT, shelved filesRepeat the following cycle. Max 5 iterations to avoid runaway loops.
Push/shelve the latest changes (if any):
GitHub/GitLab:
git pushPerforce:
# Re-shelve to update the shelved files for review
p4 shelve -f -c <CL_NUMBER>Wait for checks to start after push/shelve:
sleep 5GitHub — check if Greptile is already running before posting a new trigger comment:
GREPTILE_STATE=$(gh pr checks <PR_NUMBER> --json name,state | jq -r '.[] | select(.name | test("greptile"; "i")) | .state')If Greptile is not already running (PENDING or IN_PROGRESS), request a fresh review:
if [ "$GREPTILE_STATE" != "PENDING" ] && [ "$GREPTILE_STATE" != "IN_PROGRESS" ]; then
gh pr comment <PR_NUMBER> --body "@greptile review"
fiThen poll for the Greptile check run to complete:
HEAD_SHA=$(gh pr view <PR_NUMBER> --json headRefOid -q .headRefOid)
ATTEMPTS=0
MAX_ATTEMPTS=60
POLL_INTERVAL_SECONDS=10
while true; do
ATTEMPTS=$((ATTEMPTS + 1))
if [ "$ATTEMPTS" -gt "$MAX_ATTEMPTS" ]; then
echo "Timed out waiting for the Greptile check run after approximately 10 minutes." >&2
exit 1
fi
GREPTILE_CHECK=$(gh api "repos/{owner}/{repo}/commits/$HEAD_SHA/check-runs" \
--jq '.check_runs[] | select(.name | test("greptile"; "i"))' 2>/dev/null)
if [ -z "$GREPTILE_CHECK" ]; then
echo "Waiting for Greptile check to appear..."
sleep "$POLL_INTERVAL_SECONDS"
continue
fi
STATUS=$(echo "$GREPTILE_CHECK" | jq -r '.status // "completed"')
CONCLUSION=$(echo "$GREPTILE_CHECK" | jq -r '.conclusion // "pending"')
if [ "$STATUS" = "completed" ]; then
if [ "$CONCLUSION" = "success" ]; then
echo "Greptile check passed!"
else
echo "Greptile check completed with: $CONCLUSION"
fi
break
fi
echo "Waiting for Greptile... (status: $STATUS)"
sleep "$POLL_INTERVAL_SECONDS"
doneIf polling times out, stop the greploop workflow and report the timeout. Do not continue with stale or missing review results.
GitLab — check if Greptile is already running before posting a trigger comment:
PIPELINES=$(glab api "projects/:fullpath/merge_requests/<MR_IID>/pipelines")
GREPTILE_RUNNING=$(echo "$PIPELINES" | jq '[.[] | select(.status == "running" or .status == "pending")] | length')If no pipeline is running, post a trigger comment:
if [ "$GREPTILE_RUNNING" = "0" ]; then
glab mr note <MR_IID> --message "@greptile review"
fiPerforce — Perforce does not have native check runs. If Greptile is integrated via a webhook triggered on p4 shelve, wait for it to process. Check your Greptile installation's webhook endpoint or dashboard for the review status. Poll by re-fetching the Greptile review comment on the CL until a score appears.
Then poll for the Greptile pipeline job to complete (see GitLab API reference):
HEAD_SHA=$(glab mr view <MR_IID> --output json | jq -r '.sha')
ATTEMPTS=0
MAX_ATTEMPTS=60
POLL_INTERVAL_SECONDS=10
while true; do
ATTEMPTS=$((ATTEMPTS + 1))
if [ "$ATTEMPTS" -gt "$MAX_ATTEMPTS" ]; then
echo "Timed out waiting for the Greptile pipeline job after approximately 10 minutes." >&2
exit 1
fi
PIPELINES=$(glab api "projects/:fullpath/merge_requests/<MR_IID>/pipelines")
# Find the most recent pipeline for this SHA
PIPELINE_ID=$(echo "$PIPELINES" | jq -r --arg sha "$HEAD_SHA" \
'[.[] | select(.sha == $sha)] | sort_by(.id) | last | .id // empty')
if [ -z "$PIPELINE_ID" ]; then
echo "Waiting for Greptile pipeline to appear..."
sleep "$POLL_INTERVAL_SECONDS"
continue
fi
JOBS=$(glab api "projects/:fullpath/pipelines/$PIPELINE_ID/jobs")
GREPTILE_JOB=$(echo "$JOBS" | jq '.[] | select(.name | test("greptile"; "i"))')
if [ -z "$GREPTILE_JOB" ]; then
echo "Waiting for Greptile job to appear..."
sleep "$POLL_INTERVAL_SECONDS"
continue
fi
JOB_STATUS=$(echo "$GREPTILE_JOB" | jq -r '.status')
if [ "$JOB_STATUS" = "success" ] || [ "$JOB_STATUS" = "failed" ] || [ "$JOB_STATUS" = "canceled" ]; then
echo "Greptile job completed with: $JOB_STATUS"
break
fi
echo "Waiting for Greptile... (status: $JOB_STATUS)"
sleep "$POLL_INTERVAL_SECONDS"
doneIf polling times out, stop the greploop workflow and report the timeout. Do not continue with stale or missing review results.
Greptile may surface its score in several places — check all of the relevant sources:
GitHub:
1. PR description (body):
gh pr view <PR_NUMBER> --json body -q '.body'2. General PR comments (issue comments):
gh api --paginate "repos/{owner}/{repo}/issues/<PR_NUMBER>/comments?per_page=100"Filter for Greptile-authored comments and use the body from the most recently updated comment (updated_at), not the most recently created comment. Greptile may edit the same general PR comment on each review cycle; parse the current body, including the "Prompt to fix all with AI" section, before deciding there are no remaining issues.
3. PR reviews:
gh api repos/{owner}/{repo}/pulls/<PR_NUMBER>/reviewsLook for the most recent entry from greptile-apps[bot] or greptile-apps-staging[bot].
GitLab:
1. MR description (body):
glab mr view <MR_IID> --output json | jq -r '.description'2. MR notes (comments):
glab api "projects/:fullpath/merge_requests/<MR_IID>/notes"Filter for notes from the Greptile bot user (check the author.username field — the exact username may vary per installation; verify on first run).
Perforce:
1. CL description:
p4 describe -s <CL_NUMBER>Check the description field for a Greptile-appended score block.
2. CL comments / review notes: If your installation uses a review tool such as Helix Swarm, fetch comments via its API.
Example (Swarm API): GET /api/v11/comments?topic=reviews/<REVIEW_ID>
Response fields of interest typically include:
Filter to comments authored by the Greptile bot:
For all platforms, parse the text for:
3/5 or 5/5 (or Confidence: 3/5).Use whichever source has the most recently updated score. For GitHub, prefer updated_at from issue comments when comparing an edited Greptile summary against older review entries.
Also fetch all unresolved inline comments:
GitHub:
gh api repos/{owner}/{repo}/pulls/<PR_NUMBER>/commentsAlso carry forward actionable items from the latest Greptile general PR comment, especially the "Prompt to fix all with AI" section, even if the inline comment endpoint returns zero unresolved comments.
GitLab:
glab api "projects/:fullpath/merge_requests/<MR_IID>/discussions"Filter to DiffNote type discussions (notes[0].type == "DiffNote") from Greptile that are on the latest commit and not yet resolved ("resolved": false).
Perforce: If using Swarm:
GET /api/v11/comments?topic=reviews/<REVIEW_ID>
Filter to comments from the Greptile bot user that have not been marked as resolved/addressed.
Stop the loop if any of these are true:
For each unresolved Greptile comment:
GitHub — fetch unresolved review threads and resolve all that have been addressed (see GraphQL reference):
gh api graphql -f query='
query($cursor: String) {
repository(owner: "OWNER", name: "REPO") {
pullRequest(number: PR_NUMBER) {
reviewThreads(first: 100, after: $cursor) {
pageInfo { hasNextPage endCursor }
nodes {
id
isResolved
comments(first: 1) {
nodes { body path author { login } }
}
}
}
}
}
}'Resolve addressed threads:
gh api graphql -f query='
mutation {
t1: resolveReviewThread(input: {threadId: "ID1"}) { thread { isResolved } }
t2: resolveReviewThread(input: {threadId: "ID2"}) { thread { isResolved } }
}'GitLab — fetch unresolved discussions and resolve each one (see GitLab API reference):
glab api "projects/:fullpath/merge_requests/<MR_IID>/discussions?per_page=100"Filter for "resolved": false discussions. Then resolve each by its id:
glab api --method PUT \
"projects/:fullpath/merge_requests/<MR_IID>/discussions/<DISCUSSION_ID>" \
--field resolved=trueRepeat for each unresolved discussion ID. (GitLab has no batch resolution — loop through each one.)
GitHub/GitLab:
git add -A
git commit -m "address greptile review feedback (greploop iteration N)"
git pushPerforce:
# Stage changes back into the CL and re-shelve for the next review round
p4 shelve -f -c <CL_NUMBER>Wait for checks to start after push/shelve:
sleep 5Then go back to step A.
After exiting the loop, summarize:
| Field | Value |
|---|---|
| Platform | GitHub / GitLab / Perforce |
| Iterations | N |
| Final confidence | X/5 |
| Comments resolved | N |
| Remaining comments | N (if any) |
If the loop exited due to max iterations, list any remaining unresolved comments and suggest next steps.
Greploop complete.
Platform: GitHub
Iterations: 2
Confidence: 5/5
Resolved: 7 comments
Remaining: 0If not fully resolved:
Greploop stopped after 5 iterations.
Platform: GitLab
Confidence: 4/5
Resolved: 12 comments
Remaining: 2
Remaining issues:
- src/auth.ts:45 — "Consider rate limiting this endpoint"
- src/db.ts:112 — "Missing index on user_id column"Perforce example:
Greploop complete.
Platform: Perforce
Changelist: 12345
Iterations: 3
Confidence: 5/5
Resolved: 9 comments
Remaining: 0© onyx-dot-app, 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 2 other files (references) in .agents/skills/greptile/greploop of onyx-dot-app/onyx.
Open the folder on GitHubat commit fba54a4
We found 5 copies of this SKILL.md (exact, near-identical or edited) in other folders, from 4 other GitHub owners. This page covers the copy in onyx-dot-app/onyx, which our catalogue first saw on October 7, 2026.
Greploop 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 |
|---|---|---|---|---|---|---|
| Greploop this skillonyx-dot-app/onyx | 32k | 4 repos | ~3.3k | Automated safety check: Pass | MIT | |
| Visual Reviewai-dynamo/dynamo | 8.2k | — | ~4.5k | Automated safety check: Pass | Apache-2.0 | |
| Debate ReviewamElnagdy/review-skills | 132 | 2 repos | ~986 | Automated safety check: Pass | MIT | |
| degit Project ScaffoldingRich-Harris/degit | 7.9k | — | ~534 | Automated safety check: Pass | MIT | |
| Greploop Appsmichaelshimeles/skills | 1.3k | 1 repos | ~3.6k | Automated safety check: Pass | MIT | |
| Git MacheteVirtusLab/git-machete | 1.1k | — | ~6.1k | Automated safety check: Pass | MIT |
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…
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.
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.
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.
VirtusLab/git-machete
A skill your agent uses whenever invoking the git machete CLI to organize branch chains, compute fork points, run stacked rebases/merges, or manage GitHub/GitLab PR/MR chains - especially in a repo…
yc-software/qm
Work with GitHub and GitLab repositories through resident gh/glab/git auth on the agent computer.
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.
onyx-dot-app/onyx
Triages and lands a batch of open Dependabot PRs in the Onyx repo, where main is gated exclusively by GitHub's merge queue: approves and enqueues green PRs, closes superseded duplicates, fixes…
onyx-dot-app/onyx
Generate or edit raster images (photos, illustrations, textures, sprites, mockups, logos, infographics) using the workspace's configured image-generation provider via onyx-cli image.
onyx-dot-app/onyx
Query the Onyx knowledge base using the onyx-cli command. An agent skill from onyx-dot-app/onyx.
onyx-dot-app/onyx
Write and maintain Playwright end-to-end tests for the Onyx application.
onyx-dot-app/onyx
Core browser usage guide. An agent skill from onyx-dot-app/onyx.
Categories
Iteratively improves a PR (GitHub), MR (GitLab), or shelved changelist (Perforce) until Greptile gives it a 5/5 confidence score with zero unresolved comments. Greploop is an agent skill from 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.
Greploop fits situations like: greptile review; fixes all actionable comments; pushes/re-shelves; re-triggers review.
Run `npx skills add onyx-dot-app/onyx --skill greploop -a claude-code`. Or copy the skill folder (.agents/skills/greptile/greploop in onyx-dot-app/onyx) into .claude/skills/greploop in your project. Claude Code loads it when a task matches its description.
Run `npx skills add onyx-dot-app/onyx --skill greploop -a codex`. Or copy the skill folder (.agents/skills/greptile/greploop in onyx-dot-app/onyx) into .agents/skills/greploop 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 onyx-dot-app/onyx --skill greploop -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/greploop, .gemini/skills/greploop, .github/skills/greploop and .opencode/skills/greploop in your project.
Going by SKILL.md and its folder, Greploop needs the command-line tools its instructions call (gh, glab, jq and git). Its frontmatter pre-approves these tools: Bash(gh:*), Bash(glab:*), Bash(git:*), Bash(p4:*). Compatibility (from SKILL.md): Requires git, gh (GitHub CLI) or glab (GitLab CLI) authenticated, and Greptile installed on the repo. For Perforce, requires p4 CLI authenticated..
SKILL.md contains no URLs. Its commands use gh and git, which can reach the network depending on how they are called. 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.
Greploop is published under the MIT licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
About 3.3k tokens (SKILL.md is roughly 13k 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 987 tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Greploop: Visual Review (ai-dynamo/dynamo, 8.2k stars), Debate Review (amElnagdy/review-skills, 132 stars), degit Project Scaffolding (Rich-Harris/degit, 7.9k stars) and Greploop Apps (michaelshimeles/skills, 1.3k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
onyx-dot-app (a GitHub organization) maintains it in onyx-dot-app/onyx, which has 32,352 GitHub stars. The repository holds 9 skills in this directory. The repository was last updated on October 8, 2026.
Source: onyx-dot-app/onyx on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.